Repository: jashkenas/coffeescript Branch: main Commit: 817c39a13065 Files: 421 Total size: 8.0 MB Directory structure: gitextract_u1pht3mv/ ├── .babelrc ├── .github/ │ └── workflows/ │ └── continuous-integration.yml ├── .gitignore ├── .nojekyll ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cakefile ├── ISSUE_TEMPLATE.md ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── bin/ │ ├── cake │ └── coffee ├── bower.json ├── docs/ │ ├── CNAME │ ├── browserconfig.xml │ ├── manifest.json │ ├── v1/ │ │ ├── annotated-source/ │ │ │ ├── browser.html │ │ │ ├── cake.html │ │ │ ├── coffee-script.html │ │ │ ├── command.html │ │ │ ├── docco.css │ │ │ ├── grammar.html │ │ │ ├── helpers.html │ │ │ ├── index.html │ │ │ ├── lexer.html │ │ │ ├── nodes.html │ │ │ ├── optparse.html │ │ │ ├── public/ │ │ │ │ └── stylesheets/ │ │ │ │ └── normalize.css │ │ │ ├── register.html │ │ │ ├── repl.html │ │ │ ├── rewriter.html │ │ │ ├── scope.html │ │ │ └── sourcemap.html │ │ ├── browser-compiler/ │ │ │ └── coffee-script.js │ │ ├── index.html │ │ └── test.html │ └── v2/ │ ├── annotated-source/ │ │ ├── browser.html │ │ ├── cake.html │ │ ├── coffeescript.html │ │ ├── command.html │ │ ├── docco.css │ │ ├── grammar.html │ │ ├── helpers.html │ │ ├── index.html │ │ ├── lexer.html │ │ ├── nodes.html │ │ ├── optparse.html │ │ ├── public/ │ │ │ └── stylesheets/ │ │ │ └── normalize.css │ │ ├── register.html │ │ ├── repl.html │ │ ├── rewriter.html │ │ ├── scope.html │ │ └── sourcemap.html │ ├── announcing-coffeescript-2/ │ │ └── index.html │ ├── browser-compiler-legacy/ │ │ └── coffeescript.js │ ├── browser-compiler-modern/ │ │ └── coffeescript.js │ ├── index.html │ └── test.html ├── documentation/ │ ├── examples/ │ │ ├── aliases.coffee │ │ ├── array_comprehensions.coffee │ │ ├── array_spread.coffee │ │ ├── async.coffee │ │ ├── breaking_change_bound_generator_function.coffee │ │ ├── breaking_change_destructuring_default_values.coffee │ │ ├── breaking_change_fat_arrow.coffee │ │ ├── breaking_change_function_parameter_default_values.coffee │ │ ├── breaking_change_super_in_non-class_methods_refactor_with_apply.coffee │ │ ├── breaking_change_super_in_non-class_methods_refactor_with_class.coffee │ │ ├── breaking_change_super_this.coffee │ │ ├── breaking_change_super_with_arguments.coffee │ │ ├── breaking_change_super_without_arguments.coffee │ │ ├── cake_tasks.coffee │ │ ├── chaining.coffee │ │ ├── classes.coffee │ │ ├── comment.coffee │ │ ├── comparisons.coffee │ │ ├── conditionals.coffee │ │ ├── constructor_destructuring.coffee │ │ ├── default_args.coffee │ │ ├── do.coffee │ │ ├── dynamic_import.coffee │ │ ├── embedded.coffee │ │ ├── embedded_block.coffee │ │ ├── embedded_escaped.coffee │ │ ├── existence.coffee │ │ ├── existence_declared.coffee │ │ ├── existence_undeclared.coffee │ │ ├── expansion.coffee │ │ ├── expressions.coffee │ │ ├── expressions_assignment.coffee │ │ ├── expressions_comprehension.coffee │ │ ├── expressions_try.coffee │ │ ├── fat_arrow.coffee │ │ ├── functions.coffee │ │ ├── generator_iteration.coffee │ │ ├── generators.coffee │ │ ├── get_set.coffee │ │ ├── heredocs.coffee │ │ ├── heregexes.coffee │ │ ├── interpolation.coffee │ │ ├── jsx.coffee │ │ ├── modules.coffee │ │ ├── modulo.coffee │ │ ├── multiple_return_values.coffee │ │ ├── object_comprehensions.coffee │ │ ├── object_extraction.coffee │ │ ├── object_spread.coffee │ │ ├── objects_and_arrays.coffee │ │ ├── objects_reserved.coffee │ │ ├── objects_shorthand.coffee │ │ ├── overview.coffee │ │ ├── parallel_assignment.coffee │ │ ├── patterns_and_splats.coffee │ │ ├── prototypes.coffee │ │ ├── range_comprehensions.coffee │ │ ├── scope.coffee │ │ ├── slices.coffee │ │ ├── soaks.coffee │ │ ├── splats.coffee │ │ ├── splices.coffee │ │ ├── static.coffee │ │ ├── strings.coffee │ │ ├── switch.coffee │ │ ├── switch_with_no_expression.coffee │ │ ├── tagged_template_literals.coffee │ │ ├── try.coffee │ │ ├── type_annotations.coffee │ │ └── while.coffee │ ├── sections/ │ │ ├── annotated_source.md │ │ ├── announcing_coffeescript_2.md │ │ ├── async_functions.md │ │ ├── books.md │ │ ├── breaking_changes.md │ │ ├── breaking_changes_argument_parsing_and_shebang_lines.md │ │ ├── breaking_changes_bound_generator_functions.md │ │ ├── breaking_changes_classes.md │ │ ├── breaking_changes_default_values.md │ │ ├── breaking_changes_fat_arrow.md │ │ ├── breaking_changes_jsx_and_the_less_than_and_greater_than_operators.md │ │ ├── breaking_changes_literate_coffeescript.md │ │ ├── breaking_changes_super_extends.md │ │ ├── breaking_changes_super_this.md │ │ ├── cake.md │ │ ├── chaining.md │ │ ├── changelog/ │ │ │ ├── 0.1.0.md │ │ │ ├── 0.1.1.md │ │ │ ├── 0.1.2.md │ │ │ ├── 0.1.3.md │ │ │ ├── 0.1.4.md │ │ │ ├── 0.1.5.md │ │ │ ├── 0.1.6.md │ │ │ ├── 0.2.0.md │ │ │ ├── 0.2.1.md │ │ │ ├── 0.2.2.md │ │ │ ├── 0.2.3.md │ │ │ ├── 0.2.4.md │ │ │ ├── 0.2.5.md │ │ │ ├── 0.2.6.md │ │ │ ├── 0.3.0.md │ │ │ ├── 0.3.2.md │ │ │ ├── 0.5.0.md │ │ │ ├── 0.5.1.md │ │ │ ├── 0.5.2.md │ │ │ ├── 0.5.3.md │ │ │ ├── 0.5.4.md │ │ │ ├── 0.5.5.md │ │ │ ├── 0.5.6.md │ │ │ ├── 0.6.0.md │ │ │ ├── 0.6.1.md │ │ │ ├── 0.6.2.md │ │ │ ├── 0.7.0.md │ │ │ ├── 0.7.1.md │ │ │ ├── 0.7.2.md │ │ │ ├── 0.9.0.md │ │ │ ├── 0.9.1.md │ │ │ ├── 0.9.2.md │ │ │ ├── 0.9.3.md │ │ │ ├── 0.9.4.md │ │ │ ├── 0.9.5.md │ │ │ ├── 0.9.6.md │ │ │ ├── 1.0.0.md │ │ │ ├── 1.0.1.md │ │ │ ├── 1.1.0.md │ │ │ ├── 1.1.1.md │ │ │ ├── 1.1.2.md │ │ │ ├── 1.1.3.md │ │ │ ├── 1.10.0.md │ │ │ ├── 1.11.0.md │ │ │ ├── 1.11.1.md │ │ │ ├── 1.12.0.md │ │ │ ├── 1.12.1.md │ │ │ ├── 1.12.2.md │ │ │ ├── 1.12.3.md │ │ │ ├── 1.12.4.md │ │ │ ├── 1.12.5.md │ │ │ ├── 1.12.6.md │ │ │ ├── 1.12.7.md │ │ │ ├── 1.2.0.md │ │ │ ├── 1.3.1.md │ │ │ ├── 1.3.3.md │ │ │ ├── 1.4.0.md │ │ │ ├── 1.5.0.md │ │ │ ├── 1.6.1.md │ │ │ ├── 1.6.2.md │ │ │ ├── 1.6.3.md │ │ │ ├── 1.7.0.md │ │ │ ├── 1.7.1.md │ │ │ ├── 1.8.0.md │ │ │ ├── 1.9.0.md │ │ │ ├── 1.9.1.md │ │ │ ├── 1.9.2.md │ │ │ ├── 1.9.3.md │ │ │ ├── 2.0.0-alpha1.md │ │ │ ├── 2.0.0-beta1.md │ │ │ ├── 2.0.0-beta2.md │ │ │ ├── 2.0.0-beta3.md │ │ │ ├── 2.0.0-beta4.md │ │ │ ├── 2.0.0-beta5.md │ │ │ ├── 2.0.0.md │ │ │ ├── 2.0.1.md │ │ │ ├── 2.0.2.md │ │ │ ├── 2.0.3.md │ │ │ ├── 2.1.0.md │ │ │ ├── 2.1.1.md │ │ │ ├── 2.2.0.md │ │ │ ├── 2.2.1.md │ │ │ ├── 2.2.2.md │ │ │ ├── 2.2.3.md │ │ │ ├── 2.2.4.md │ │ │ ├── 2.3.0.md │ │ │ ├── 2.3.1.md │ │ │ ├── 2.3.2.md │ │ │ ├── 2.4.0.md │ │ │ ├── 2.4.1.md │ │ │ ├── 2.5.0.md │ │ │ ├── 2.5.1.md │ │ │ ├── 2.6.0.md │ │ │ ├── 2.6.1.md │ │ │ └── 2.7.0.md │ │ ├── changelog.md │ │ ├── chat.md │ │ ├── classes.md │ │ ├── coffeescript_2.md │ │ ├── command_line_interface.md │ │ ├── comments.md │ │ ├── comparisons.md │ │ ├── compatibility.md │ │ ├── conditionals.md │ │ ├── contributing.md │ │ ├── destructuring.md │ │ ├── embedded.md │ │ ├── examples.md │ │ ├── existential_operator.md │ │ ├── expressions.md │ │ ├── fat_arrow.md │ │ ├── functions.md │ │ ├── generators.md │ │ ├── heregexes.md │ │ ├── installation.md │ │ ├── integrations.md │ │ ├── integrations_build_tools.md │ │ ├── integrations_code_editors.md │ │ ├── integrations_frameworks.md │ │ ├── integrations_linters_and_formatting.md │ │ ├── integrations_testing.md │ │ ├── introduction.md │ │ ├── jsx.md │ │ ├── language.md │ │ ├── lexical_scope.md │ │ ├── literate.md │ │ ├── loops.md │ │ ├── modules.md │ │ ├── nodejs_usage.md │ │ ├── objects_and_arrays.md │ │ ├── operators.md │ │ ├── overview.md │ │ ├── prototypal_inheritance.md │ │ ├── resources.md │ │ ├── screencasts.md │ │ ├── scripts.md │ │ ├── slices.md │ │ ├── source_maps.md │ │ ├── splats.md │ │ ├── strings.md │ │ ├── switch.md │ │ ├── tagged_template_literals.md │ │ ├── test.md │ │ ├── transpilation.md │ │ ├── try.md │ │ ├── type_annotations.md │ │ ├── unsupported.md │ │ ├── unsupported_get_set.md │ │ ├── unsupported_let_const.md │ │ ├── unsupported_named_functions.md │ │ ├── usage.md │ │ └── whats_new_in_coffeescript_2.md │ └── site/ │ ├── body.html │ ├── code.coffee │ ├── code.css │ ├── code.html │ ├── docs.coffee │ ├── docs.css │ ├── index.html │ ├── navbar.html │ ├── scripts.html │ ├── sidebar.html │ ├── styles.html │ ├── test.html │ └── try.html ├── lib/ │ ├── coffeescript/ │ │ ├── browser.js │ │ ├── cake.js │ │ ├── coffeescript.js │ │ ├── command.js │ │ ├── grammar.js │ │ ├── helpers.js │ │ ├── index.js │ │ ├── lexer.js │ │ ├── nodes.js │ │ ├── optparse.js │ │ ├── parser.js │ │ ├── register.js │ │ ├── repl.js │ │ ├── rewriter.js │ │ ├── scope.js │ │ └── sourcemap.js │ ├── coffeescript-browser-compiler-legacy/ │ │ └── coffeescript.js │ └── coffeescript-browser-compiler-modern/ │ └── coffeescript.js ├── package.json ├── register.js ├── repl.js ├── src/ │ ├── browser.coffee │ ├── cake.coffee │ ├── coffeescript.coffee │ ├── command.coffee │ ├── grammar.coffee │ ├── helpers.coffee │ ├── index.coffee │ ├── lexer.coffee │ ├── nodes.coffee │ ├── optparse.coffee │ ├── register.coffee │ ├── repl.coffee │ ├── rewriter.coffee │ ├── scope.litcoffee │ └── sourcemap.litcoffee └── test/ ├── abstract_syntax_tree.coffee ├── abstract_syntax_tree_location_data.coffee ├── argument_parsing.coffee ├── arrays.coffee ├── assignment.coffee ├── async.coffee ├── async_iterators.coffee ├── booleans.coffee ├── classes.coffee ├── cluster.coffee ├── comments.coffee ├── compilation.coffee ├── comprehensions.coffee ├── control_flow.coffee ├── error_messages.coffee ├── eval.coffee ├── exception_handling.coffee ├── exponentiation.coffee ├── formatting.coffee ├── function_invocation.coffee ├── functions.coffee ├── generators.coffee ├── helpers.coffee ├── import_assertions.coffee ├── importing/ │ ├── .coffee │ ├── .coffee.md │ ├── .import.coffee │ ├── .import.coffee.md │ ├── .import2 │ ├── error.coffee │ ├── import.coffee │ ├── import.coffee.md │ ├── import.extension.coffee │ ├── import.extension.coffee.md │ ├── import.extension.js │ ├── import.js │ ├── import.litcoffee │ ├── import.unknownextension │ ├── import2 │ ├── index.coffee.md │ ├── shebang.coffee │ ├── shebang_extra_args.coffee │ ├── shebang_initial_space.coffee │ ├── shebang_initial_space_extra_args.coffee │ └── transpile_import.coffee ├── importing.coffee ├── interpolation.coffee ├── invocation_argument_parsing.coffee ├── javascript_literals.coffee ├── jsx.coffee ├── literate.litcoffee ├── literate_tabbed.litcoffee ├── location.coffee ├── modules.coffee ├── numbers.coffee ├── numbers_bigint.coffee ├── numeric_literal_separators.coffee ├── object_rest_spread.coffee ├── objects.coffee ├── operators.coffee ├── option_parser.coffee ├── package.coffee ├── parser.coffee ├── ranges.coffee ├── regex.coffee ├── regex_dotall.coffee ├── repl.coffee ├── scope.coffee ├── slicing_and_splicing.coffee ├── soaks.coffee ├── sourcemap.coffee ├── strict.coffee ├── strings.coffee ├── support/ │ └── helpers.coffee └── tagged_template_literals.coffee ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "presets": ["@babel/env"] } ================================================ FILE: .github/workflows/continuous-integration.yml ================================================ # Based on https://github.com/actions/starter-workflows/blob/master/ci/node.js.yml name: Build and Test on: [push, pull_request] jobs: ci: runs-on: ${{ matrix.operating-system }} strategy: matrix: operating-system: [ubuntu-latest, macos-latest, windows-latest] node-version: [12.x, 14.x, 16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci # Ensure that we can still build in the current version of Node - run: node ./bin/cake build:except-parser - run: node ./bin/cake build:parser # Build twice to ensure that the latest build of the compiler can still build itself - run: node ./bin/cake build:except-parser - run: node ./bin/cake build:parser # Build the browser compiler for the headless browser test - run: node ./bin/cake build:browser # Build test.html, so that test:browser uses the latest tests - run: node ./bin/cake doc:test # Check that the git diff is clean, to ensure that the updated build output was committed - run: git diff --exit-code # Test - run: node ./bin/cake test - run: node ./bin/cake test:browser || node ./bin/cake test:browser || node ./bin/cake test:browser - run: node ./bin/cake test:browser:node - run: node ./bin/cake test:integrations ================================================ FILE: .gitignore ================================================ raw presentation test.coffee test*.coffee test.litcoffee test*.litcoffee test/*.js parser.output /node_modules npm-debug.log* yarn.lock .DS_Store ================================================ FILE: .nojekyll ================================================ ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In 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. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project 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. Project 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. ## Scope This 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. ## Enforcement Instances 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. Project 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. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ ================================================ FILE: CONTRIBUTING.md ================================================ ## How to contribute to CoffeeScript * 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. * Before sending a pull request for a feature, be sure to have [tests](https://github.com/jashkenas/coffeescript/tree/master/test). * 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). * 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`. * To get started, read the guides in the wiki: * [Hacking on the CoffeeScript Compiler](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Hacking-on-the-CoffeeScript-Compiler) * [How parsing works](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-How-parsing-works) * [Update the docs](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Update-the-docs) ================================================ FILE: Cakefile ================================================ fs = require 'fs' os = require 'os' path = require 'path' _ = require 'underscore' { spawn, exec, execSync } = require 'child_process' CoffeeScript = require './lib/coffeescript' helpers = require './lib/coffeescript/helpers' # ANSI Terminal Colors. bold = red = green = yellow = reset = '' unless process.env.NODE_DISABLE_COLORS bold = '\x1B[0;1m' red = '\x1B[0;31m' green = '\x1B[0;32m' yellow = '\x1B[0;33m' reset = '\x1B[0m' # Built file header. header = """ /** * CoffeeScript Compiler v#{CoffeeScript.VERSION} * https://coffeescript.org * * Copyright 2011-#{new Date().getFullYear()}, Jeremy Ashkenas * Released under the MIT License */ """ # Used in folder names like `docs/v1`. majorVersion = parseInt CoffeeScript.VERSION.split('.')[0], 10 # Log a message with a color. log = (message, color, explanation) -> console.log color + message + reset + ' ' + (explanation or '') spawnNodeProcess = (args, output = 'stderr', callback) -> relayOutput = (buffer) -> console.log buffer.toString() proc = spawn 'node', args proc.stdout.on 'data', relayOutput if output is 'both' or output is 'stdout' proc.stderr.on 'data', relayOutput if output is 'both' or output is 'stderr' proc.on 'exit', (status) -> callback(status) if typeof callback is 'function' # Run a CoffeeScript through our node/coffee interpreter. run = (args, callback) -> spawnNodeProcess ['bin/coffee'].concat(args), 'stderr', (status) -> process.exit(1) if status isnt 0 callback() if typeof callback is 'function' # Build the CoffeeScript language from source. buildParser = -> helpers.extend global, require 'util' require 'jison' # We don't need `moduleMain`, since the parser is unlikely to be run standalone. parser = require('./lib/coffeescript/grammar').parser.generate(moduleMain: ->) fs.writeFileSync 'lib/coffeescript/parser.js', parser buildExceptParser = (callback) -> files = fs.readdirSync 'src' files = ('src/' + file for file in files when file.match(/\.(lit)?coffee$/)) run ['-c', '-o', 'lib/coffeescript'].concat(files), callback build = (callback) -> buildParser() buildExceptParser callback transpile = (code, options = {}) -> options.minify = process.env.MINIFY isnt 'false' options.transform = process.env.TRANSFORM isnt 'false' options.sourceType ?= 'script' babel = require '@babel/core' presets = [] # Exclude the `modules` plugin in order to not break the `}(this));` # at the end of the `build:browser` code block. presets.push ['@babel/env', {modules: no}] if options.transform presets.push ['minify', {mangle: no, evaluate: no, removeUndefined: no}] if options.minify babelOptions = presets: presets compact: options.minify minified: options.minify comments: not options.minify sourceType: options.sourceType { code } = babel.transformSync code, babelOptions unless presets.length is 0 code testBuiltCode = (watch = no) -> csPath = './lib/coffeescript' csDir = path.dirname require.resolve csPath for mod of require.cache when csDir is mod[0 ... csDir.length] delete require.cache[mod] testResults = runTests require csPath unless watch process.exit 1 unless testResults buildAndTest = (includingParser = yes, harmony = no) -> process.stdout.write '\x1Bc' # Clear terminal screen. execSync 'git checkout lib/*', stdio: 'inherit' # Reset the generated compiler. buildArgs = ['bin/cake'] buildArgs.push if includingParser then 'build' else 'build:except-parser' log "building#{if includingParser then ', including parser' else ''}...", green spawnNodeProcess buildArgs, 'both', -> log 'testing...', green testArgs = if harmony then ['--harmony'] else [] testArgs = testArgs.concat ['bin/cake', 'test'] spawnNodeProcess testArgs, 'both' watchAndBuildAndTest = (harmony = no) -> buildAndTest yes, harmony fs.watch 'src/', interval: 200, (eventType, filename) -> if eventType is 'change' log "src/#{filename} changed, rebuilding..." buildAndTest (filename is 'grammar.coffee'), harmony fs.watch 'test/', {interval: 200, recursive: yes}, (eventType, filename) -> if eventType is 'change' log "test/#{filename} changed, rebuilding..." buildAndTest no, harmony task 'build', 'build the CoffeeScript compiler from source', build task 'build:parser', 'build the Jison parser only', buildParser task 'build:except-parser', 'build the CoffeeScript compiler, except for the Jison parser', buildExceptParser task 'build:full', 'build the CoffeeScript compiler from source twice, and run the tests', -> build -> build testBuiltCode task 'build:browser', 'merge the built scripts into a single file for use in a browser', -> code = """ require['../../package.json'] = (function() { return #{fs.readFileSync "./package.json"}; })(); """ for name in ['helpers', 'rewriter', 'lexer', 'parser', 'scope', 'nodes', 'sourcemap', 'coffeescript', 'browser'] code += """ require['./#{name}'] = (function() { var exports = {}, module = {exports: exports}; #{fs.readFileSync "lib/coffeescript/#{name}.js"} return module.exports; })(); """ # From here, we generate two outputs: a legacy script output for all browsers # and a module output for browsers that support `\n """ output # Task do renderTest = -> render = _.template fs.readFileSync(testFile, 'utf-8') output = render testHelpers: testHelpers tests: testsInScriptBlocks() fs.writeFileSync "#{outputFolder}/test.html", output log 'compiled', green, "#{testFile} → #{outputFolder}/test.html" if watch for target in [testFile, testsSourceFolder] fs.watch target, interval: 200, renderTest log 'watching...', green task 'doc:test', 'build the browser-based tests', -> buildDocTests() task 'doc:test:watch', 'watch and continually rebuild the browser-based tests', -> buildDocTests yes buildAnnotatedSource = (watch = no) -> do generateAnnotatedSource = -> exec "cd src && ../node_modules/docco/bin/docco *.*coffee --output ../docs/v#{majorVersion}/annotated-source", (err) -> throw err if err log 'generated', green, "annotated source in docs/v#{majorVersion}/annotated-source/" if watch fs.watch 'src/', interval: 200, generateAnnotatedSource log 'watching...', green task 'doc:source', 'build the annotated source documentation', -> buildAnnotatedSource() task 'doc:source:watch', 'watch and continually rebuild the annotated source documentation', -> buildAnnotatedSource yes task 'release', 'update dependencies, build and test the CoffeeScript source, and build the documentation', -> execSync ''' npm install --silent cake build:full cake build:browser cake doc:test cake test:browser:node cake test:browser cake test:integrations cake doc:site cake doc:source ''', stdio: 'inherit' task 'bench', 'quick benchmark of compilation time', -> {Rewriter} = require './lib/coffeescript/rewriter' sources = ['coffeescript', 'grammar', 'helpers', 'lexer', 'nodes', 'rewriter'] coffee = sources.map((name) -> fs.readFileSync "src/#{name}.coffee").join '\n' litcoffee = fs.readFileSync("src/scope.litcoffee").toString() fmt = (ms) -> " #{bold}#{ " #{ms}".slice -4 }#{reset} ms" total = 0 now = Date.now() time = -> total += ms = -(now - now = Date.now()); fmt ms tokens = CoffeeScript.tokens coffee, rewrite: no littokens = CoffeeScript.tokens litcoffee, rewrite: no, literate: yes tokens = tokens.concat(littokens) console.log "Lex #{time()} (#{tokens.length} tokens)" tokens = new Rewriter().rewrite tokens console.log "Rewrite#{time()} (#{tokens.length} tokens)" nodes = CoffeeScript.nodes tokens console.log "Parse #{time()}" js = nodes.compile bare: yes console.log "Compile#{time()} (#{js.length} chars)" console.log "total #{ fmt total }" # Run the CoffeeScript test suite. runTests = (CoffeeScript) -> CoffeeScript.register() unless global.testingBrowser # These are attached to `global` so that they’re accessible from within # `test/async.coffee`, which has an async-capable version of # `global.test`. global.currentFile = null global.passedTests = 0 global.failures = [] global[name] = func for name, func of require 'assert' # Convenience aliases. global.CoffeeScript = CoffeeScript global.Repl = require './lib/coffeescript/repl' global.bold = bold global.red = red global.green = green global.yellow = yellow global.reset = reset asyncTests = [] onFail = (description, fn, err) -> failures.push filename: global.currentFile error: err description: description source: fn.toString() if fn.toString? # Our test helper function for delimiting different test cases. global.test = (description, fn) -> try fn.test = {description, currentFile} result = fn.call(fn) if result instanceof Promise # An async test. asyncTests.push result result.then -> passedTests++ .catch (err) -> onFail description, fn, err else passedTests++ catch err onFail description, fn, err helpers.extend global, require './test/support/helpers' # When all the tests have run, collect and print errors. # If a stacktrace is available, output the compiled function source. process.on 'exit', -> time = ((Date.now() - startTime) / 1000).toFixed(2) message = "passed #{passedTests} tests in #{time} seconds#{reset}" return log(message, green) unless failures.length log "failed #{failures.length} and #{message}", red for fail in failures {error, filename, description, source} = fail console.log '' log " #{description}", red if description log " #{error.stack}", red console.log " #{source}" if source return # Run every test in the `test` folder, recording failures, except for files # we’re skipping because the features to be tested are unsupported in the # current Node runtime. testFilesToSkip = [] skipUnless = (featureDetect, filenames) -> unless (try new Function featureDetect) testFilesToSkip = testFilesToSkip.concat filenames skipUnless 'async () => {}', ['async.coffee', 'async_iterators.coffee'] skipUnless 'async function* generator() { yield 42; }', ['async_iterators.coffee'] skipUnless 'var a = 2 ** 2; a **= 3', ['exponentiation.coffee'] skipUnless 'var {...a} = {}', ['object_rest_spread.coffee'] skipUnless '/foo.bar/s.test("foo\tbar")', ['regex_dotall.coffee'] skipUnless '1_2_3', ['numeric_literal_separators.coffee'] skipUnless '1n', ['numbers_bigint.coffee'] skipUnless 'async () => { await import(\'data:application/json,{"foo":"bar"}\', { assert: { type: "json" } }) }', ['import_assertions.coffee'] files = fs.readdirSync('test').filter (filename) -> filename not in testFilesToSkip startTime = Date.now() for file in files when helpers.isCoffee file literate = helpers.isLiterate file currentFile = filename = path.join 'test', file code = fs.readFileSync filename try CoffeeScript.run code.toString(), {filename, literate} catch error failures.push {filename, error} Promise.all(asyncTests).then -> Promise.reject() if failures.length isnt 0 task 'test', 'run the CoffeeScript language test suite', -> runTests(CoffeeScript).catch -> process.exit 1 task 'test:browser', 'run the test suite against the modern browser compiler in a headless browser', -> # Create very simple web server to serve the two files we need. http = require 'http' serveFile = (res, fileToServe, mimeType) -> res.statusCode = 200 res.setHeader 'Content-Type', mimeType fs.createReadStream(fileToServe).pipe res server = http.createServer (req, res) -> if req.url is '/' serveFile res, path.join(__dirname, 'docs', "v#{majorVersion}", 'test.html'), 'text/html' else if req.url is '/browser-compiler-modern/coffeescript.js' # The `text/javascript` MIME type is required for an ES module file to be # loaded in a browser. serveFile res, path.join(__dirname, 'docs', "v#{majorVersion}", 'browser-compiler-modern', 'coffeescript.js'), 'text/javascript' else res.statusCode = 404 res.end() server.listen 8080, -> puppeteer = require 'puppeteer' browser = await puppeteer.launch() page = await browser.newPage() result = "" try await page.goto 'http://localhost:8080/' element = await page.waitForSelector '#result', visible: yes polling: 'mutation' timeout: 60000 result = await page.evaluate ((el) => el.textContent), element catch e log e, red finally try browser.close() server.close() if result and not result.includes('failed') log result, green else log result, red process.exit 1 task 'test:browser:node', 'run the test suite against the legacy browser compiler in Node', -> source = fs.readFileSync "lib/coffeescript-browser-compiler-legacy/coffeescript.js", 'utf-8' result = {} global.testingBrowser = yes (-> eval source).call result runTests(CoffeeScript).catch -> process.exit 1 task 'test:integrations', 'test the module integrated with other libraries and environments', -> # Tools like Webpack and Browserify generate builds intended for a browser # environment where Node modules are not available. We want to ensure that # the CoffeeScript module as presented by the `browser` key in `package.json` # can be built by such tools; if such a build succeeds, it verifies that no # Node modules are required as part of the compiler (as opposed to the tests) # and that therefore the compiler will run in a browser environment. # Webpack 5 requires Node >= 10.13.0. [major, minor] = process.versions.node.split('.').map (n) -> parseInt(n, 10) return if major < 10 or (major is 10 and minor < 13) tmpdir = os.tmpdir() webpack = require 'webpack' webpack { entry: './' optimization: # Webpack’s minification causes the CoffeeScript module to fail some tests. minimize: off output: path: tmpdir filename: 'coffeescript.js' library: 'CoffeeScript' libraryTarget: 'commonjs2' }, (err, stats) -> if err or stats.hasErrors() if err console.error err.stack or err console.error err.details if err.details if stats.hasErrors() console.error error for error in stats.compilation.errors if stats.hasWarnings() console.warn warning for warning in stats.compilation.warnings process.exit 1 builtCompiler = path.join tmpdir, 'coffeescript.js' { CoffeeScript } = require builtCompiler global.testingBrowser = yes testResults = runTests CoffeeScript fs.unlinkSync builtCompiler process.exit 1 unless testResults ================================================ FILE: ISSUE_TEMPLATE.md ================================================ Choose one: is this a bug report or feature request? ### Input Code ```coffee your (code) => here ``` ### Expected Behavior ### Current Behavior ### Possible Solution ### Context ### Environment * CoffeeScript version: * Node.js version: ================================================ FILE: LICENSE ================================================ Copyright (c) 2009-2018 Jeremy Ashkenas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: PULL_REQUEST_TEMPLATE.md ================================================ ================================================ FILE: README.md ================================================ ``` @@@@@@@ @@@@ @@@@@ @@@@@@@@@@ @@@ @@@ { @@@@ @@ @@@ @@@ } } { @@@@ @@@@@@@ @@@ @@@ @@@@@@ @@@@@@ { { } } @@@@ @@@ @@ @@@@@ @@@@@@ @@@ @@ @@@@ @@ } }{ { @@@@ @@@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ { }{ } } @@@@ @@@@ @@ @@@ @@@ @@@@@@@@ @@@@@@@@ { }{ }{ { } @@@@@ @@@@ @@ @@@ @@@ @@@ @@@ { { } { } { } } @@@@@@@@@@ @@@@@@@@ @@@ @@@ @@@@@@@@ @@@@@@@@ { } { } { } @@@@@ @@@ @@@ @@@@@ @@@@@ @@@@@@ { } { } @@@@@@@ @@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@ @@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@ @@@ @@@@ @@ @@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@ @@ @@@@ @@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@ @@ @@ @@@ @@@@@@@ @@@@@ @@@ @@@@@@@@@@@@@@@@@@ @@@@@ @@@ @@@ @@@@@@@@ @@@@ @@@@ @@@@@@@ @@@ @@@@@@@@@@@@@@@@ @@@@@ @@@ @@@@ @@@@ @@@ @@@ @@@ @@@@@@@@@@@@@@ @@@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@ @@@ @@@@ @@@@ @@@ @@@@ @@@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@ @@@@@@@@@ @@@@@@ @@@@ @@@@ @@@@@@@@@ @@@@ @@@ @@@@ @@@ @@@ ``` CoffeeScript is a little language that compiles into JavaScript. ## Installation Once you have Node.js installed: ```shell # Install locally for a project: npm install --save-dev coffeescript # Install globally to execute .coffee files anywhere: npm install --global coffeescript ``` ## Getting Started Execute a script: ```shell coffee /path/to/script.coffee ``` Compile a script: ```shell coffee -c /path/to/script.coffee ``` For documentation, usage, and examples, see: https://coffeescript.org/ To suggest a feature or report a bug: https://github.com/jashkenas/coffeescript/issues If you’d like to chat, drop by #coffeescript on Freenode IRC. The source repository: https://github.com/jashkenas/coffeescript.git Changelog: https://coffeescript.org/#changelog Our lovely and talented contributors are listed here: https://github.com/jashkenas/coffeescript/contributors ================================================ FILE: bin/cake ================================================ #!/usr/bin/env node try { new Function('var {a} = {a: 1}')(); } catch (error) { console.error('Your JavaScript runtime does not support some features used by the cake command. Please use Node 6 or later.'); process.exit(1); } var path = require('path'); var fs = require('fs'); var potentialPaths = [ path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), path.join(__dirname, '../lib/coffeescript') ]; for (var i = 0, len = potentialPaths.length; i < len; i++) { if (fs.existsSync(potentialPaths[i])) { require(potentialPaths[i] + '/cake').run(); break; } } ================================================ FILE: bin/coffee ================================================ #!/usr/bin/env node try { new Function('var {a} = {a: 1}')(); } catch (error) { console.error('Your JavaScript runtime does not support some features used by the coffee command. Please use Node 6 or later.'); process.exit(1); } var path = require('path'); var fs = require('fs'); var potentialPaths = [ path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'), path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'), path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'), path.join(__dirname, '../lib/coffeescript') ]; for (var i = 0, len = potentialPaths.length; i < len; i++) { if (fs.existsSync(potentialPaths[i])) { require(potentialPaths[i] + '/command').run(); break; } } ================================================ FILE: bower.json ================================================ { "name": "coffeescript", "main": [ "lib/coffeescript/browser.js" ], "description": "Unfancy JavaScript", "keywords": [ "javascript", "language", "coffeescript", "compiler" ], "author": { "name": "Jeremy Ashkenas" }, "ignore": [ "test" ] } ================================================ FILE: docs/CNAME ================================================ coffeescript.org ================================================ FILE: docs/browserconfig.xml ================================================ #da532c ================================================ FILE: docs/manifest.json ================================================ { "name": "CoffeeScript", "description": "Unfancy JavaScript", "icons": [ { "src": "\/android-chrome-192x192.png", "sizes": "192x192", "type": "image\/png" }, { "src": "\/android-chrome-512x512.png", "sizes": "512x512", "type": "image\/png" } ], "theme_color": "#ffffff", "display": "standalone" } ================================================ FILE: docs/v1/annotated-source/browser.html ================================================ browser.coffee
================================================ FILE: docs/v1/annotated-source/cake.html ================================================ cake.coffee
================================================ FILE: docs/v1/annotated-source/coffee-script.html ================================================ coffee-script.coffee
================================================ FILE: docs/v1/annotated-source/command.html ================================================ command.coffee
================================================ FILE: docs/v1/annotated-source/docco.css ================================================ /*--------------------- Typography ----------------------------*/ @font-face { font-family: 'aller-light'; src: url('public/fonts/aller-light.eot'); src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'), url('public/fonts/aller-light.woff') format('woff'), url('public/fonts/aller-light.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'aller-bold'; src: url('public/fonts/aller-bold.eot'); src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'), url('public/fonts/aller-bold.woff') format('woff'), url('public/fonts/aller-bold.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'roboto-black'; src: url('public/fonts/roboto-black.eot'); src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'), url('public/fonts/roboto-black.woff') format('woff'), url('public/fonts/roboto-black.ttf') format('truetype'); font-weight: normal; font-style: normal; } /*--------------------- Layout ----------------------------*/ html { height: 100%; } body { font-family: "aller-light"; font-size: 14px; line-height: 18px; color: #30404f; margin: 0; padding: 0; height:100%; } #container { min-height: 100%; } a { color: #000; } b, strong { font-weight: normal; font-family: "aller-bold"; } p { margin: 15px 0 0px; } .annotation ul, .annotation ol { margin: 25px 0; } .annotation ul li, .annotation ol li { font-size: 14px; line-height: 18px; margin: 10px 0; } h1, h2, h3, h4, h5, h6 { color: #112233; line-height: 1em; font-weight: normal; font-family: "roboto-black"; text-transform: uppercase; margin: 30px 0 15px 0; } h1 { margin-top: 40px; } h2 { font-size: 1.26em; } hr { border: 0; background: 1px #ddd; height: 1px; margin: 20px 0; } pre, tt, code { font-size: 12px; line-height: 16px; font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } .annotation pre { display: block; margin: 0; padding: 7px 10px; background: #fcfcfc; -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); box-shadow: inset 0 0 10px rgba(0,0,0,0.1); overflow-x: auto; } .annotation pre code { border: 0; padding: 0; background: transparent; } blockquote { border-left: 5px solid #ccc; margin: 0; padding: 1px 0 1px 1em; } .sections blockquote p { font-family: Menlo, Consolas, Monaco, monospace; font-size: 12px; line-height: 16px; color: #999; margin: 10px 0 0; white-space: pre-wrap; } ul.sections { list-style: none; padding:0 0 5px 0;; margin:0; } /* Force border-box so that % widths fit the parent container without overlap because of margin/padding. More Info : http://www.quirksmode.org/css/box.html */ ul.sections > li > div { -moz-box-sizing: border-box; /* firefox */ -ms-box-sizing: border-box; /* ie */ -webkit-box-sizing: border-box; /* webkit */ -khtml-box-sizing: border-box; /* konqueror */ box-sizing: border-box; /* css3 */ } /*---------------------- Jump Page -----------------------------*/ #jump_to, #jump_page { margin: 0; background: white; -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; font: 16px Arial; cursor: pointer; text-align: right; list-style: none; } #jump_to a { text-decoration: none; } #jump_to a.large { display: none; } #jump_to a.small { font-size: 22px; font-weight: bold; color: #676767; } #jump_to, #jump_wrapper { position: fixed; right: 0; top: 0; padding: 10px 15px; margin:0; } #jump_wrapper { display: none; padding:0; } #jump_to:hover #jump_wrapper { display: block; } #jump_page_wrapper{ position: fixed; right: 0; top: 0; bottom: 0; } #jump_page { padding: 5px 0 3px; margin: 0 0 25px 25px; max-height: 100%; overflow: auto; } #jump_page .source { display: block; padding: 15px; text-decoration: none; border-top: 1px solid #eee; } #jump_page .source:hover { background: #f5f5ff; } #jump_page .source:first-child { } /*---------------------- Low resolutions (> 320px) ---------------------*/ @media only screen and (min-width: 320px) { .pilwrap { display: none; } ul.sections > li > div { display: block; padding:5px 10px 0 10px; } ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { padding-left: 30px; } ul.sections > li > div.content { overflow-x:auto; -webkit-box-shadow: inset 0 0 5px #e5e5ee; box-shadow: inset 0 0 5px #e5e5ee; border: 1px solid #dedede; margin:5px 10px 5px 10px; padding-bottom: 5px; } ul.sections > li > div.annotation pre { margin: 7px 0 7px; padding-left: 15px; } ul.sections > li > div.annotation p tt, .annotation code { background: #f8f8ff; border: 1px solid #dedede; font-size: 12px; padding: 0 0.2em; } } /*---------------------- (> 481px) ---------------------*/ @media only screen and (min-width: 481px) { #container { position: relative; } body { background-color: #F5F5FF; font-size: 15px; line-height: 21px; } pre, tt, code { line-height: 18px; } p, ul, ol { margin: 0 0 15px; } #jump_to { padding: 5px 10px; } #jump_wrapper { padding: 0; } #jump_to, #jump_page { font: 10px Arial; text-transform: uppercase; } #jump_page .source { padding: 5px 10px; } #jump_to a.large { display: inline-block; } #jump_to a.small { display: none; } #background { position: absolute; top: 0; bottom: 0; width: 350px; background: #fff; border-right: 1px solid #e5e5ee; z-index: -1; } ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { padding-left: 40px; } ul.sections > li { white-space: nowrap; } ul.sections > li > div { display: inline-block; } ul.sections > li > div.annotation { max-width: 350px; min-width: 350px; min-height: 5px; padding: 13px; overflow-x: hidden; white-space: normal; vertical-align: top; text-align: left; } ul.sections > li > div.annotation pre { margin: 15px 0 15px; padding-left: 15px; } ul.sections > li > div.content { padding: 13px; vertical-align: top; border: none; -webkit-box-shadow: none; box-shadow: none; } .pilwrap { position: relative; display: inline; } .pilcrow { font: 12px Arial; text-decoration: none; color: #454545; position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; -webkit-transition: opacity 0.2s linear; } .for-h1 .pilcrow { top: 47px; } .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { top: 35px; } ul.sections > li > div.annotation:hover .pilcrow { opacity: 1; } } /*---------------------- (> 1025px) ---------------------*/ @media only screen and (min-width: 1025px) { body { font-size: 16px; line-height: 24px; } #background { width: 525px; } ul.sections > li > div.annotation { max-width: 525px; min-width: 525px; padding: 10px 25px 1px 50px; } ul.sections > li > div.content { padding: 9px 15px 16px 25px; } } /*---------------------- Syntax Highlighting -----------------------------*/ td.linenos { background-color: #f0f0f0; padding-right: 10px; } span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } /* github.com style (c) Vasily Polovnyov */ pre code { display: block; padding: 0.5em; color: #000; background: #f8f8ff } pre .hljs-comment, pre .hljs-template_comment, pre .hljs-diff .hljs-header, pre .hljs-javadoc { color: #408080; font-style: italic } pre .hljs-keyword, pre .hljs-assignment, pre .hljs-literal, pre .hljs-css .hljs-rule .hljs-keyword, pre .hljs-winutils, pre .hljs-javascript .hljs-title, pre .hljs-lisp .hljs-title, pre .hljs-subst { color: #954121; /*font-weight: bold*/ } pre .hljs-number, pre .hljs-hexcolor { color: #40a070 } pre .hljs-string, pre .hljs-tag .hljs-value, pre .hljs-phpdoc, pre .hljs-tex .hljs-formula { color: #219161; } pre .hljs-title, pre .hljs-id { color: #19469D; } pre .hljs-params { color: #00F; } pre .hljs-javascript .hljs-title, pre .hljs-lisp .hljs-title, pre .hljs-subst { font-weight: normal } pre .hljs-class .hljs-title, pre .hljs-haskell .hljs-label, pre .hljs-tex .hljs-command { color: #458; font-weight: bold } pre .hljs-tag, pre .hljs-tag .hljs-title, pre .hljs-rules .hljs-property, pre .hljs-django .hljs-tag .hljs-keyword { color: #000080; font-weight: normal } pre .hljs-attribute, pre .hljs-variable, pre .hljs-instancevar, pre .hljs-lisp .hljs-body { color: #008080 } pre .hljs-regexp { color: #B68 } pre .hljs-class { color: #458; font-weight: bold } pre .hljs-symbol, pre .hljs-ruby .hljs-symbol .hljs-string, pre .hljs-ruby .hljs-symbol .hljs-keyword, pre .hljs-ruby .hljs-symbol .hljs-keymethods, pre .hljs-lisp .hljs-keyword, pre .hljs-tex .hljs-special, pre .hljs-input_number { color: #990073 } pre .hljs-builtin, pre .hljs-constructor, pre .hljs-built_in, pre .hljs-lisp .hljs-title { color: #0086b3 } pre .hljs-preprocessor, pre .hljs-pi, pre .hljs-doctype, pre .hljs-shebang, pre .hljs-cdata { color: #999; font-weight: bold } pre .hljs-deletion { background: #fdd } pre .hljs-addition { background: #dfd } pre .hljs-diff .hljs-change { background: #0086b3 } pre .hljs-chunk { color: #aaa } pre .hljs-tex .hljs-formula { opacity: 0.5; } ================================================ FILE: docs/v1/annotated-source/grammar.html ================================================ grammar.coffee
================================================ FILE: docs/v1/annotated-source/helpers.html ================================================ helpers.coffee
================================================ FILE: docs/v1/annotated-source/index.html ================================================ index.coffee
================================================ FILE: docs/v1/annotated-source/lexer.html ================================================ lexer.coffee
================================================ FILE: docs/v1/annotated-source/nodes.html ================================================ nodes.coffee
================================================ FILE: docs/v1/annotated-source/optparse.html ================================================ optparse.coffee
================================================ FILE: docs/v1/annotated-source/public/stylesheets/normalize.css ================================================ /*! normalize.css v2.0.1 | MIT License | git.io/normalize */ /* ========================================================================== HTML5 display definitions ========================================================================== */ /* * Corrects `block` display not defined in IE 8/9. */ article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary { display: block; } /* * Corrects `inline-block` display not defined in IE 8/9. */ audio, canvas, video { display: inline-block; } /* * Prevents modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /* * Addresses styling for `hidden` attribute not present in IE 8/9. */ [hidden] { display: none; } /* ========================================================================== Base ========================================================================== */ /* * 1. Sets default font family to sans-serif. * 2. Prevents iOS text size adjust after orientation change, without disabling * user zoom. */ html { font-family: sans-serif; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -ms-text-size-adjust: 100%; /* 2 */ } /* * Removes default margin. */ body { margin: 0; } /* ========================================================================== Links ========================================================================== */ /* * Addresses `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: thin dotted; } /* * Improves readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography ========================================================================== */ /* * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, * Safari 5, and Chrome. */ h1 { font-size: 2em; } /* * Addresses styling not present in IE 8/9, Safari 5, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /* * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ b, strong { font-weight: bold; } /* * Addresses styling not present in Safari 5 and Chrome. */ dfn { font-style: italic; } /* * Addresses styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } /* * Corrects font family set oddly in Safari 5 and Chrome. */ code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } /* * Improves readability of pre-formatted text in all browsers. */ pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } /* * Sets consistent quote types. */ q { quotes: "\201C" "\201D" "\2018" "\2019"; } /* * Addresses inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /* * Prevents `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Embedded content ========================================================================== */ /* * Removes border when inside `a` element in IE 8/9. */ img { border: 0; } /* * Corrects overflow displayed oddly in IE 9. */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures ========================================================================== */ /* * Addresses margin not present in IE 8/9 and Safari 5. */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /* * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /* * 1. Corrects color not being inherited in IE 8/9. * 2. Remove padding so people aren't caught out if they zero out fieldsets. */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /* * 1. Corrects font family not being inherited in all browsers. * 2. Corrects font size not being inherited in all browsers. * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome */ button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } /* * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ button, input { line-height: normal; } /* * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Corrects inability to style clickable `input` types in iOS. * 3. Improves usability and consistency of cursor style between image-type * `input` and others. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /* * Re-set default cursor for disabled elements. */ button[disabled], input[disabled] { cursor: default; } /* * 1. Addresses box sizing set to `content-box` in IE 8/9. * 2. Removes excess padding in IE 8/9. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /* * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /* * Removes inner padding and search cancel button in Safari 5 and Chrome * on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /* * Removes inner padding and border in Firefox 4+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /* * 1. Removes default vertical scrollbar in IE 8/9. * 2. Improves readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables ========================================================================== */ /* * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } ================================================ FILE: docs/v1/annotated-source/register.html ================================================ register.coffee
================================================ FILE: docs/v1/annotated-source/repl.html ================================================ repl.coffee
================================================ FILE: docs/v1/annotated-source/rewriter.html ================================================ rewriter.coffee
================================================ FILE: docs/v1/annotated-source/scope.html ================================================ scope.litcoffee
================================================ FILE: docs/v1/annotated-source/sourcemap.html ================================================ sourcemap.litcoffee
================================================ FILE: docs/v1/browser-compiler/coffee-script.js ================================================ /** * CoffeeScript Compiler v1.12.7 * http://coffeescript.org * * Copyright 2011, Jeremy Ashkenas * Released under the MIT License */ var $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; $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); $jscomp.polyfill=function(u,xa,ya,e){if(xa){ya=$jscomp.global;u=u.split(".");for(e=0;eu||1342177279>>=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>>=1,a+=a;return f};e.compact=function(a){var f,b;var p=[];var x=0;for(b=a.length;xc)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;af;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(-1x.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, n))&&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=0x.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= a.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&& this.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, b,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"!== n)||(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"=== t||"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"!== b[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", "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;tthis.indent){if(c)return this.indebt=b-this.indent,this.suppressNewlines(),a.length;if(!this.tokens.length)return this.baseIndent=this.indent= b,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 be&&(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, last_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;0a)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);1114111r.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", !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); return 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*#(?!##[^#]).*)+/; var 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]*$/; var 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; var 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(" "); var 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]]= l);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], pa=[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, 169,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, 165,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, 42,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], jb=[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, 131,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, 73],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, 133,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, While: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, PARAM_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, EXPORT_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, When: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", 48:"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", 128:"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, 1],[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], [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], [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, 3],[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], g[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.$= b[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- 1]);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; case 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.$= d.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- 2])(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]))})); break;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])); break;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])([]); break;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])); break;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.$= d.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; case 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- 1],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- 3],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.$= d.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.$= d.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- 2]),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.$= d.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- 6],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- 2],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], g[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], g[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, null,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- 1],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.$= d.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], g[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- 1]));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]); b[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.$= d.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])); break;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.$= d.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("-", b[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.$= d.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- 2],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, 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},{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, [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, 165,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, 162: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, 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: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, 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: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, 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: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, 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},{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, 146],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, 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(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, 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,$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, 43: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, 42]),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, 149: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, 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,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, 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: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, 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: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, 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: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, 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},{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, 34]),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, 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,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, 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,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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 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: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, 154: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, 160: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]), a(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, [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, 117: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, 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:$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, 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},{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, 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: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, 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,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, 254],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, 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,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, 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([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, 114: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, 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: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, 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},{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, 152: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}, a(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, 140]),{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, 139: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, 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,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, 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: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, 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,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, 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,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, 165: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, 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: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, 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: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, 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(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, 86: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, 71,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, 166: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], {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], {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, 166: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, 149: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, 170: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, 162: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, eb,{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, 139: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, 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: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, 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(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, 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,194],{127:[1,333]}),{30:334,31:ua}, {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, 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(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, 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},{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]), a(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, 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(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, 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([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]}, a([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, 161: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, 141: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, 158: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}, a(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, 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: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, 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: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, 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(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, 81: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], 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: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), a(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, 31: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, [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}), {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, 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(Ga,[2,149]),{131:[1,427]},{120:[1,428],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(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, 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: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, 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,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, [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, 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: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, 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: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, 139: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, 157: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, 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(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, 165: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, 157: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, 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,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, 101: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, 165: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, 173: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, 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},{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]), a(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, 155: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, 161: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, [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= this;"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]&& 2=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=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= y=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|| null!=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")} v(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= oa;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, arguments)}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}; m.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)}; m.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;mthis.properties.length&&!this.base.isComplex()&&(null==l||!l.isComplex()))return[this,this];b=new m(this.base, this.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=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"+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"+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)+ " + 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= Ha?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= Aa(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;fna?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()|| a 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), d.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=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=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< m;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=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; var 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, "")};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)}; b.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=c.length)?c:this.wrapInBraces(c)};return b}(ta); e.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;fh,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= p,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=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); }; }"}, indexOf: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]; var 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}(); u["./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== b&&(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;be?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= "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= t;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= {};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 CoffeeScript

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.

The 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.

The CoffeeScript compiler goes to great lengths to generate output JavaScript that runs in every JavaScript runtime, but there are exceptions. Use generator functions, for…from, or tagged template literals only if you know that your target runtimes can support them. If you use modules, you will need to use an additional tool to resolve them.

Latest 1.x Version: 1.12.7

npm install -g coffeescript

Upgrade to CoffeeScript 2! It adds support for ES2015 classes, async/await, JSX, object rest/spread syntax, and JavaScript generated using modern syntax. Learn more.

Overview

CoffeeScript on the left, compiled JavaScript output on the right.

# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

# Arrays:
list = [1, 2, 3, 4, 5]

# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# Existence:
alert "I knew it!" if elvis?

# Array comprehensions:
cubes = (math.cube num for num in list)
var cubes, list, math, num, number, opposite, race, square,
  slice = [].slice;

number = 42;

opposite = true;

if (opposite) {
  number = -42;
}

square = function(x) {
  return x * x;
};

list = [1, 2, 3, 4, 5];

math = {
  root: Math.sqrt,
  square: square,
  cube: function(x) {
    return x * square(x);
  }
};

race = function() {
  var runners, winner;
  winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];
  return print(winner, runners);
};

if (typeof elvis !== "undefined" && elvis !== null) {
  alert("I knew it!");
}

cubes = (function() {
  var i, len, results;
  results = [];
  for (i = 0, len = list.length; i < len; i++) {
    num = list[i];
    results.push(math.cube(num));
  }
  return results;
})();
run: cubes

Installation

The command-line version of coffee is available as a Node.js utility. The core compiler however, does not depend on Node, and can be run in any JavaScript environment, or in the browser (see Try CoffeeScript).

To install, first make sure you have a working copy of the latest stable version of Node.js. You can then install CoffeeScript globally with npm:

npm install --global coffeescript

This will make the coffee and cake commands available globally.

When you need CoffeeScript as a dependency of a project, within that project’s folder you can install it locally:

npm install --save coffeescript

The 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.

Usage

Once 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:

Option Description
-c, --compile Compile a .coffee script into a .js JavaScript file of the same name.
-m, --map Generate source maps alongside the compiled JavaScript files. Adds sourceMappingURL directives to the JavaScript as well.
-M, --inline-map Just like --map, but include the source map directly in the compiled JavaScript files, rather than in a separate file.
-i, --interactive Launch an interactive CoffeeScript session to try short snippets. Identical to calling coffee with no arguments.
-o, --output [DIR] Write out all compiled JavaScript files into the specified directory. Use in conjunction with --compile or --watch.
-w, --watch Watch files for changes, rerunning the specified command when any file is updated.
-p, --print Instead of writing out the JavaScript as a file, print it directly to stdout.
-s, --stdio Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT. Good for use with processes written in other languages. An example:
cat src/cake.coffee | coffee -sc
-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.
-e, --eval Compile and print a little snippet of CoffeeScript directly from the command line. For example:
coffee -e "console.log num for num in [10..1]"
-r, --require [MODULE] require() the given module before starting the REPL or evaluating the code given with the --eval flag.
-b, --bare Compile the JavaScript without the top-level function safety wrapper.
-t, --tokens Instead of parsing the CoffeeScript, just lex it, and print out the token stream. Used for debugging the compiler.
-n, --nodes Instead of compiling the CoffeeScript, just lex and parse it, and print out the parse tree. Used for debugging the compiler.
--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.
--no-header Suppress the “Generated by CoffeeScript” header.

Examples:

  • Compile a directory tree of .coffee files in src into a parallel tree of .js files in lib:
    coffee --compile --output lib/ src/
  • Watch a file for changes, and recompile it every time the file is saved:
    coffee --watch --compile experimental.coffee
  • Concatenate a list of files into a single script:
    coffee --join project.js --compile src/*.coffee
  • Print out the compiled JS from a one-liner:
    coffee -bpe "alert i for i in [0..10]"
  • All together now, watch and recompile an entire project as you work on it:
    coffee -o lib/ -cw src/
  • Start the CoffeeScript REPL (Ctrl-D to exit, Ctrl-Vfor multi-line):
    coffee

Literate CoffeeScript

Besides 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 code, and ignore the rest as comments.

Just for kicks, a little bit of the compiler is currently implemented in this fashion: See it as a document, raw, and properly highlighted in a text editor.

Language Reference

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.

Many of the examples can be run (where it makes sense) by pressing the run button on the right, and can be loaded into the “Try CoffeeScript” console by pressing the load button on the left.

First, 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, if-statements, switch, and try/catch, use indentation.

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.
console.log sys.inspect objectconsole.log(sys.inspect(object));

Functions

Functions are defined by an optional list of parameters in parentheses, an arrow, and the function body. The empty function looks like this: ->

square = (x) -> x * x
cube   = (x) -> square(x) * x
var cube, square;

square = function(x) {
  return x * x;
};

cube = function(x) {
  return square(x) * x;
};
load
run: cube(5)

Functions may also have default values for arguments, which will be used if the incoming argument is missing (null or undefined).

fill = (container, liquid = "coffee") ->
  "Filling the #{container} with #{liquid}..."
var fill;

fill = function(container, liquid) {
  if (liquid == null) {
    liquid = "coffee";
  }
  return "Filling the " + container + " with " + liquid + "...";
};
load
run: fill("cup")

Objects and Arrays

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 YAML.

song = ["do", "re", "mi", "fa", "so"]

singers = {Jagger: "Rock", Elvis: "Roll"}

bitlist = [
  1, 0, 1
  0, 0, 1
  1, 1, 0
]

kids =
  brother:
    name: "Max"
    age:  11
  sister:
    name: "Ida"
    age:  9
var bitlist, kids, singers, song;

song = ["do", "re", "mi", "fa", "so"];

singers = {
  Jagger: "Rock",
  Elvis: "Roll"
};

bitlist = [1, 0, 1, 0, 0, 1, 1, 1, 0];

kids = {
  brother: {
    name: "Max",
    age: 11
  },
  sister: {
    name: "Ida",
    age: 9
  }
};
load
run: song.join(" … ")

In JavaScript, you can’t use reserved words, like class, 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).

$('.account').attr class: 'active'

log object.class
$('.account').attr({
  "class": 'active'
});

log(object["class"]);
load

CoffeeScript has a shortcut for creating objects when you want the key to be set with a variable of the same name.

name = "Michelangelo"
mask = "orange"
weapon = "nunchuks"
turtle = {name, mask, weapon}
output = "#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!"
var mask, name, output, turtle, weapon;

name = "Michelangelo";

mask = "orange";

weapon = "nunchuks";

turtle = {
  name: name,
  mask: mask,
  weapon: weapon
};

output = turtle.name + " wears an " + turtle.mask + " mask. Watch out for his " + turtle.weapon + "!";
load

Lexical Scoping and Variable Safety

The 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.

outer = 1
changeNumbers = ->
  inner = -1
  outer = 10
inner = changeNumbers()
var changeNumbers, inner, outer;

outer = 1;

changeNumbers = function() {
  var inner;
  inner = -1;
  return outer = 10;
};

inner = changeNumbers();
load
run: inner

Notice 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.

This behavior is effectively identical to Ruby’s scope for local variables. Because 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.

Although suppressed within this documentation for clarity, all CoffeeScript output 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.

If 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. If you’re targeting both CommonJS and the browser, the existential operator (covered below), gives you a reliable way to figure out where to add them: exports ? this

If, Else, Unless, and Conditional Assignment

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.

CoffeeScript 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.

mood = greatlyImproved if singing

if happy and knowsIt
  clapsHands()
  chaChaCha()
else
  showIt()

date = if friday then sue else jill
var date, mood;

if (singing) {
  mood = greatlyImproved;
}

if (happy && knowsIt) {
  clapsHands();
  chaChaCha();
} else {
  showIt();
}

date = friday ? sue : jill;
load

Splats…

The 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.

gold = silver = rest = "unknown"

awardMedals = (first, second, others...) ->
  gold   = first
  silver = second
  rest   = others

contenders = [
  "Michael Phelps"
  "Liu Xiang"
  "Yao Ming"
  "Allyson Felix"
  "Shawn Johnson"
  "Roman Sebrle"
  "Guo Jingjing"
  "Tyson Gay"
  "Asafa Powell"
  "Usain Bolt"
]

awardMedals contenders...

alert "Gold: " + gold
alert "Silver: " + silver
alert "The Field: " + rest
var awardMedals, contenders, gold, rest, silver,
  slice = [].slice;

gold = silver = rest = "unknown";

awardMedals = function() {
  var first, others, second;
  first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? slice.call(arguments, 2) : [];
  gold = first;
  silver = second;
  return rest = others;
};

contenders = ["Michael Phelps", "Liu Xiang", "Yao Ming", "Allyson Felix", "Shawn Johnson", "Roman Sebrle", "Guo Jingjing", "Tyson Gay", "Asafa Powell", "Usain Bolt"];

awardMedals.apply(null, contenders);

alert("Gold: " + gold);

alert("Silver: " + silver);

alert("The Field: " + rest);
load
run

Loops and Comprehensions

Most 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.

# Eat lunch.
eat food for food in ['toast', 'cheese', 'wine']

# Fine five course dining.
courses = ['greens', 'caviar', 'truffles', 'roast', 'cake']
menu i + 1, dish for dish, i in courses

# Health conscious meal.
foods = ['broccoli', 'spinach', 'chocolate']
eat food for food in foods when food isnt 'chocolate'
var courses, dish, food, foods, i, j, k, l, len, len1, len2, ref;

ref = ['toast', 'cheese', 'wine'];
for (j = 0, len = ref.length; j < len; j++) {
  food = ref[j];
  eat(food);
}

courses = ['greens', 'caviar', 'truffles', 'roast', 'cake'];

for (i = k = 0, len1 = courses.length; k < len1; i = ++k) {
  dish = courses[i];
  menu(i + 1, dish);
}

foods = ['broccoli', 'spinach', 'chocolate'];

for (l = 0, len2 = foods.length; l < len2; l++) {
  food = foods[l];
  if (food !== 'chocolate') {
    eat(food);
  }
}
load

Comprehensions should be able to handle most places where you otherwise would use a loop, each/forEach, map, or select/filter, for example:
shortNames = (name for name in list when name.length < 5)
If 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.

countdown = (num for num in [10..1])
var countdown, num;

countdown = (function() {
  var i, results;
  results = [];
  for (num = i = 10; i >= 1; num = --i) {
    results.push(num);
  }
  return results;
})();
load
run: countdown

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 true — or null, to the bottom of your function.

To step through a range comprehension in fixed-size chunks, use by, for example: evens = (x for x in [0..10] by 2)

If you don’t need the current iteration value you may omit it: browser.closeCurrentTab() for [0...count]

Comprehensions 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.

yearsOld = max: 10, ida: 9, tim: 11

ages = for child, age of yearsOld
  "#{child} is #{age}"
var age, ages, child, yearsOld;

yearsOld = {
  max: 10,
  ida: 9,
  tim: 11
};

ages = (function() {
  var results;
  results = [];
  for (child in yearsOld) {
    age = yearsOld[child];
    results.push(child + " is " + age);
  }
  return results;
})();
load
run: ages.join(", ")

If 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.

To iterate a generator function, use from. See Generator Functions.

The 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.

# Econ 101
if this.studyingEconomics
  buy()  while supply > demand
  sell() until supply > demand

# Nursery Rhyme
num = 6
lyrics = while num -= 1
  "#{num} little monkeys, jumping on the bed.
    One fell out and bumped his head."
var lyrics, num;

if (this.studyingEconomics) {
  while (supply > demand) {
    buy();
  }
  while (!(supply > demand)) {
    sell();
  }
}

num = 6;

lyrics = (function() {
  var results;
  results = [];
  while (num -= 1) {
    results.push(num + " little monkeys, jumping on the bed. One fell out and bumped his head.");
  }
  return results;
})();
load
run: lyrics.join("\n")

For readability, the until keyword is equivalent to while not, and the loop keyword is equivalent to while true.

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 do keyword, which immediately invokes a passed function, forwarding any arguments.

for filename in list
  do (filename) ->
    fs.readFile filename, (err, contents) ->
      compile filename, contents.toString()
var filename, fn, i, len;

fn = function(filename) {
  return fs.readFile(filename, function(err, contents) {
    return compile(filename, contents.toString());
  });
};
for (i = 0, len = list.length; i < len; i++) {
  filename = list[i];
  fn(filename);
}
load

Array Slicing and Splicing with Ranges

Ranges 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.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

start   = numbers[0..2]

middle  = numbers[3...-2]

end     = numbers[-2..]

copy    = numbers[..]
var copy, end, middle, numbers, start;

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];

start = numbers.slice(0, 3);

middle = numbers.slice(3, -2);

end = numbers.slice(-2);

copy = numbers.slice(0);
load
run: middle

The same syntax can be used with assignment to replace a segment of an array with new values, splicing it.

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

numbers[3..6] = [-3, -4, -5, -6]
var numbers, ref;

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

[].splice.apply(numbers, [3, 4].concat(ref = [-3, -4, -5, -6])), ref;
load
run: numbers

Note that JavaScript strings are immutable, and can’t be spliced.

Everything is an Expression (at least, as much as possible)

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 return gets pushed down into each possible branch of execution in the function below.

grade = (student) ->
  if student.excellentWork
    "A+"
  else if student.okayStuff
    if student.triedHard then "B" else "B-"
  else
    "C"

eldest = if 24 > 21 then "Liz" else "Ike"
var eldest, grade;

grade = function(student) {
  if (student.excellentWork) {
    return "A+";
  } else if (student.okayStuff) {
    if (student.triedHard) {
      return "B";
    } else {
      return "B-";
    }
  } else {
    return "C";
  }
};

eldest = 24 > 21 ? "Liz" : "Ike";
load
run: eldest

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 (return value), when you know that you’re done.

Because variable declarations occur at the top of scope, assignment can be used within expressions, even for variables that haven’t been seen before:

six = (one = 1) + (two = 2) + (three = 3)
var one, six, three, two;

six = (one = 1) + (two = 2) + (three = 3);
load
run: six

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:

# The first ten global properties.

globals = (name for name of window)[0...10]
var globals, name;

globals = ((function() {
  var results;
  results = [];
  for (name in window) {
    results.push(name);
  }
  return results;
})()).slice(0, 10);
load
run: globals

As well as silly things, like passing a try/catch statement directly into a function call:

alert(
  try
    nonexistent / undefined
  catch error
    "And the error is ... #{error}"
)
var error;

alert((function() {
  try {
    return nonexistent / void 0;
  } catch (error1) {
    error = error1;
    return "And the error is ... " + error;
  }
})());
load
run

There 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.

Operators and Aliases

Because 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 !==.

You can use not as an alias for !.

For logic, and compiles to &&, and or into ||.

Instead of a newline or semicolon, then can be used to separate conditions from expressions, in while, if/else, and switch/when statements.

As in YAML, on and yes are the same as boolean true, while off and no are boolean false.

unless can be used as the inverse of if.

As a shortcut for this.property, you can use @property.

You can use in to test for array presence, and of to test for JavaScript object-key presence.

To simplify math expressions, ** can be used for exponentiation and // performs integer division. % works just like in JavaScript, while %% provides “dividend dependent modulo”:

-7 % 5 == -2 # The remainder of 7 / 5
-7 %% 5 == 3 # n %% 5 is always between 0 and 4

tabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)
var modulo = function(a, b) { return (+a % (b = +b) + b) % b; };

-7 % 5 === -2;

modulo(-7, 5) === 3;

tabs.selectTabAtIndex(modulo(tabs.currentIndex - count, tabs.length));
load

All together now:

CoffeeScript JavaScript
is ===
isnt !==
not !
and &&
or ||
true, yes, on true
false, no, off false
@, this this
of in
in no JS equivalent
a ** b Math.pow(a, b)
a // b Math.floor(a / b)
a %% b (a % b + b) % b
launch() if ignition is on

volume = 10 if band isnt SpinalTap

letTheWildRumpusBegin() unless answer is no

if car.speed < limit then accelerate()

winner = yes if pick in [47, 92, 13]

print inspect "My name is #{@name}"
var volume, winner;

if (ignition === true) {
  launch();
}

if (band !== SpinalTap) {
  volume = 10;
}

if (answer !== false) {
  letTheWildRumpusBegin();
}

if (car.speed < limit) {
  accelerate();
}

if (pick === 47 || pick === 92 || pick === 13) {
  winner = true;
}

print(inspect("My name is " + this.name));
load

The Existential Operator

It’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. CoffeeScript’s existential operator ? returns true unless a variable is null or undefined, which makes it analogous to Ruby’s nil?

It can also be used for safer conditional assignment than ||= provides, for cases where you may be handling numbers or strings.

solipsism = true if mind? and not world?

speed = 0
speed ?= 15

footprints = yeti ? "bear"
var footprints, solipsism, speed;

if ((typeof mind !== "undefined" && mind !== null) && (typeof world === "undefined" || world === null)) {
  solipsism = true;
}

speed = 0;

if (speed == null) {
  speed = 15;
}

footprints = typeof yeti !== "undefined" && yeti !== null ? yeti : "bear";
load
run: footprints

The 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.

zip = lottery.drawWinner?().address?.zipcode
var ref, zip;

zip = typeof lottery.drawWinner === "function" ? (ref = lottery.drawWinner().address) != null ? ref.zipcode : void 0 : void 0;
load

Soaking up nulls is similar to Ruby’s andand gem, and to the safe navigation operator in Groovy.

Classes, Inheritance, and Super

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: Base2, Prototype.js, JS.Class, 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 super (the prototype object’s implementation of the current function), and it’s awkward to correctly set the prototype chain.

Instead of repetitively attaching functions to a prototype, CoffeeScript provides a basic class structure that allows you to name your class, set the superclass, assign prototypal properties, and define the constructor, in a single assignable expression.

Constructor functions are named, to better support helpful stack traces. In the first class in the example below, this.constructor.name is "Animal".

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"

sam.move()
tom.move()
var Animal, Horse, Snake, sam, tom,
  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; },
  hasProp = {}.hasOwnProperty;

Animal = (function() {
  function Animal(name) {
    this.name = name;
  }

  Animal.prototype.move = function(meters) {
    return alert(this.name + (" moved " + meters + "m."));
  };

  return Animal;

})();

Snake = (function(superClass) {
  extend(Snake, superClass);

  function Snake() {
    return Snake.__super__.constructor.apply(this, arguments);
  }

  Snake.prototype.move = function() {
    alert("Slithering...");
    return Snake.__super__.move.call(this, 5);
  };

  return Snake;

})(Animal);

Horse = (function(superClass) {
  extend(Horse, superClass);

  function Horse() {
    return Horse.__super__.constructor.apply(this, arguments);
  }

  Horse.prototype.move = function() {
    alert("Galloping...");
    return Horse.__super__.move.call(this, 45);
  };

  return Horse;

})(Animal);

sam = new Snake("Sammy the Python");

tom = new Horse("Tommy the Palomino");

sam.move();

tom.move();
load
run

If structuring your prototypes classically isn’t your cup of tea, CoffeeScript provides a couple of lower-level conveniences. The extends operator helps with proper prototype setup, and can be used to create an inheritance chain between any pair of constructor functions; :: gives you quick access to an object’s prototype; and super() is converted into a call against the immediate ancestor’s method of the same name.

String::dasherize = ->
  this.replace /_/g, "-"
String.prototype.dasherize = function() {
  return this.replace(/_/g, "-");
};
load
run: "one_two".dasherize()

Finally, class definitions are blocks of executable code, which make for interesting metaprogramming possibilities. Because in the context of a class definition, this is the class object itself (the constructor function), you can assign static properties by using @property: value, and call functions defined in parent classes: @attr 'title', type: 'text'

Destructuring Assignment

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:

theBait   = 1000
theSwitch = 0

[theBait, theSwitch] = [theSwitch, theBait]
var ref, theBait, theSwitch;

theBait = 1000;

theSwitch = 0;

ref = [theSwitch, theBait], theBait = ref[0], theSwitch = ref[1];
load
run: theBait

But it’s also helpful for dealing with functions that return multiple values.

weatherReport = (location) ->
  # Make an Ajax request to fetch the weather...
  [location, 72, "Mostly Sunny"]

[city, temp, forecast] = weatherReport "Berkeley, CA"
var city, forecast, ref, temp, weatherReport;

weatherReport = function(location) {
  return [location, 72, "Mostly Sunny"];
};

ref = weatherReport("Berkeley, CA"), city = ref[0], temp = ref[1], forecast = ref[2];
load
run: forecast

Destructuring assignment can be used with any depth of array and object nesting, to help pull out deeply nested properties.

futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]

{sculptor} = futurists

{poet: {name, address: [street, city]}} = futurists
var city, futurists, name, ref, ref1, sculptor, street;

futurists = {
  sculptor: "Umberto Boccioni",
  painter: "Vladimir Burliuk",
  poet: {
    name: "F.T. Marinetti",
    address: ["Via Roma 42R", "Bellagio, Italy 22021"]
  }
};

sculptor = futurists.sculptor;

ref = futurists.poet, name = ref.name, (ref1 = ref.address, street = ref1[0], city = ref1[1]);
load
run: name + "-" + street

Destructuring assignment can even be combined with splats.

tag = "<impossible>"

[open, contents..., close] = tag.split("")
var close, contents, i, open, ref, tag,
  slice = [].slice;

tag = "<impossible>";

ref = tag.split(""), open = ref[0], contents = 3 <= ref.length ? slice.call(ref, 1, i = ref.length - 1) : (i = 1, []), close = ref[i++];
load
run: contents.join("")

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.

text = "Every literary critic believes he will
        outwit history and have the last word"

[first, ..., last] = text.split " "
var first, last, ref, text;

text = "Every literary critic believes he will outwit history and have the last word";

ref = text.split(" "), first = ref[0], last = ref[ref.length - 1];
load
run: first + " " + last

Destructuring assignment is also useful when combined with class constructors to assign properties to your instance from an options object passed to the constructor.

class Person
  constructor: (options) ->
    {@name, @age, @height = 'average'} = options

tim = new Person name: 'Tim', age: 4
var Person, tim;

Person = (function() {
  function Person(options) {
    var ref;
    this.name = options.name, this.age = options.age, this.height = (ref = options.height) != null ? ref : 'average';
  }

  return Person;

})();

tim = new Person({
  name: 'Tim',
  age: 4
});
load
run: tim.age + " " + tim.height

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.

Bound Functions, Generator Functions

In 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 gives a good overview of the quirks.

The 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.

Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  $('.shopping_cart').on 'click', (event) =>
    @customer.purchase @cart
var Account;

Account = function(customer, cart) {
  this.customer = customer;
  this.cart = cart;
  return $('.shopping_cart').on('click', (function(_this) {
    return function(event) {
      return _this.customer.purchase(_this.cart);
    };
  })(this));
};
load

If 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.

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.

CoffeeScript functions also support ES2015 generator functions through the yield keyword. There’s no function*(){} nonsense — a generator in CoffeeScript is simply a function that yields.

perfectSquares = ->
  num = 0
  loop
    num += 1
    yield num * num
  return

window.ps or= perfectSquares()
var perfectSquares;

perfectSquares = function*() {
  var num;
  num = 0;
  while (true) {
    num += 1;
    yield num * num;
  }
};

window.ps || (window.ps = perfectSquares());
load
run: ps.next().value

yield* is called yield from, and yield return may be used if you need to force a generator that doesn’t yield.

You can iterate over a generator function using for…from.

fibonacci = ->
  [previous, current] = [1, 1]
  loop
    [previous, current] = [current, previous + current]
    yield current
  return

getFibonacciNumbers = (length) ->
  results = [1]
  for n from fibonacci()
    results.push n
    break if results.length is length
  results
var fibonacci, getFibonacciNumbers;

fibonacci = function*() {
  var current, previous, ref, ref1;
  ref = [1, 1], previous = ref[0], current = ref[1];
  while (true) {
    ref1 = [current, previous + current], previous = ref1[0], current = ref1[1];
    yield current;
  }
};

getFibonacciNumbers = function(length) {
  var n, ref, results;
  results = [1];
  ref = fibonacci();
  for (n of ref) {
    results.push(n);
    if (results.length === length) {
      break;
    }
  }
  return results;
};
load
run: getFibonacciNumbers(10)

Embedded JavaScript

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.

hi = `function() {
  return [document.title, "Hello JavaScript"].join(": ");
}`
var hi;

hi = function() {
  return [document.title, "Hello JavaScript"].join(": ");
};
load
run: hi()

Escape backticks with backslashes: \`​ becomes `​.

Escape backslashes before backticks with more backslashes: \\\`​ becomes \`​.

markdown = `function () {
  return \`In Markdown, write code like \\\`this\\\`\`;
}`
var markdown;

markdown = function () {
  return `In Markdown, write code like \`this\``;
};
load
run: markdown()

You can also embed blocks of JavaScript using triple backticks. That’s easier than escaping backticks, if you need them inside your JavaScript block.

```
function time() {
  return `The time is ${new Date().toLocaleTimeString()}`;
}
```

function time() {
  return `The time is ${new Date().toLocaleTimeString()}`;
}
;

load
run: time()

Switch/When/Else

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.

As in Ruby, switch statements in CoffeeScript can take multiple values for each when clause. If any of the values match, the clause runs.

switch day
  when "Mon" then go work
  when "Tue" then go relax
  when "Thu" then go iceFishing
  when "Fri", "Sat"
    if day is bingoDay
      go bingo
      go dancing
  when "Sun" then go church
  else go work
switch (day) {
  case "Mon":
    go(work);
    break;
  case "Tue":
    go(relax);
    break;
  case "Thu":
    go(iceFishing);
    break;
  case "Fri":
  case "Sat":
    if (day === bingoDay) {
      go(bingo);
      go(dancing);
    }
    break;
  case "Sun":
    go(church);
    break;
  default:
    go(work);
}
load

Switch statements can also be used without a control expression, turning them in to a cleaner alternative to if/else chains.

score = 76
grade = switch
  when score < 60 then 'F'
  when score < 70 then 'D'
  when score < 80 then 'C'
  when score < 90 then 'B'
  else 'A'
# grade == 'C'
var grade, score;

score = 76;

grade = (function() {
  switch (false) {
    case !(score < 60):
      return 'F';
    case !(score < 70):
      return 'D';
    case !(score < 80):
      return 'C';
    case !(score < 90):
      return 'B';
    default:
      return 'A';
  }
})();
load

Try/Catch/Finally

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.

try
  allHellBreaksLoose()
  catsAndDogsLivingTogether()
catch error
  print error
finally
  cleanUp()
var error;

try {
  allHellBreaksLoose();
  catsAndDogsLivingTogether();
} catch (error1) {
  error = error1;
  print(error);
} finally {
  cleanUp();
}
load

Chained Comparisons

CoffeeScript borrows chained comparisons from Python — making it easy to test if a value falls within a certain range.

cholesterol = 127

healthy = 200 > cholesterol > 60
var cholesterol, healthy;

cholesterol = 127;

healthy = (200 > cholesterol && cholesterol > 60);
load
run: healthy

String Interpolation, Block Strings, and Block Comments

Ruby-style string interpolation is included in CoffeeScript. Double-quoted strings allow for interpolated values, using #{ … }, and single-quoted strings are literal. You may even use interpolation in object keys.

author = "Wittgenstein"
quote  = "A picture is a fact. -- #{ author }"

sentence = "#{ 22 / 7 } is a decent approximation of π"
var author, quote, sentence;

author = "Wittgenstein";

quote = "A picture is a fact. -- " + author;

sentence = (22 / 7) + " is a decent approximation of π";
load
run: sentence

Multiline strings are allowed in CoffeeScript. Lines are joined by a single space unless they end with a backslash. Indentation is ignored.

mobyDick = "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..."
var mobyDick;

mobyDick = "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...";
load
run: mobyDick

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.

html = """
       <strong>
         cup of coffeescript
       </strong>
       """
var html;

html = "<strong>\n  cup of coffeescript\n</strong>";
load
run: html

Double-quoted block strings, like other double-quoted strings, allow interpolation.

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.

###
SkinnyMochaHalfCaffScript Compiler v1.0
Released under the MIT License
###

/*
SkinnyMochaHalfCaffScript Compiler v1.0
Released under the MIT License
 */

load

Tagged Template Literals

CoffeeScript supports ES2015 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: 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.

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 Babel or Traceur Compiler to convert this ES2015 syntax into compatible JavaScript.

upperCaseExpr = (textParts, expressions...) ->
  textParts.reduce (text, textPart, i) ->
    text + expressions[i - 1].toUpperCase() + textPart

greet = (name, adjective) ->
  upperCaseExpr"""
               Hi #{name}. You look #{adjective}!
               """
var greet, upperCaseExpr,
  slice = [].slice;

upperCaseExpr = function() {
  var expressions, textParts;
  textParts = arguments[0], expressions = 2 <= arguments.length ? slice.call(arguments, 1) : [];
  return textParts.reduce(function(text, textPart, i) {
    return text + expressions[i - 1].toUpperCase() + textPart;
  });
};

greet = function(name, adjective) {
  return upperCaseExpr`Hi ${name}. You look ${adjective}!`;
};
load
run: greet("greg", "awesome")

Block Regular Expressions

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 /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:

OPERATOR = /// ^ (
  ?: [-=]>             # function
   | [-+*/%<>&|^!?=]=  # compound assign / compare
   | >>>=?             # zero-fill right shift
   | ([-+:])\1         # doubles
   | ([&|<>])\2=?      # logic / shift
   | \?\.              # soak access
   | \.{2,3}           # range or splat
) ///
var OPERATOR;

OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/;
load

Modules

ES2015 modules are supported in CoffeeScript, with very similar import and export syntax:

import 'local-file.coffee'
import 'coffeescript'

import _ from 'underscore'
import * as underscore from 'underscore'

import { now } from 'underscore'
import { now as currentTimestamp } from 'underscore'
import { first, last } from 'underscore'
import utilityBelt, { each } from 'underscore'

export default Math
export square = (x) -> x * x
export class Mathematics
  least: (x, y) -> if x < y then x else y

export { sqrt }
export { sqrt as squareRoot }
export { Mathematics as default, sqrt as squareRoot }

export * from 'underscore'
export { max, min } from 'underscore'
import 'local-file.coffee';

import 'coffeescript';

import _ from 'underscore';

import * as underscore from 'underscore';

import {
  now
} from 'underscore';

import {
  now as currentTimestamp
} from 'underscore';

import {
  first,
  last
} from 'underscore';

import utilityBelt, {
  each
} from 'underscore';

export default Math;

export var square = function(x) {
  return x * x;
};

export var Mathematics = (function() {
  function Mathematics() {}

  Mathematics.prototype.least = function(x, y) {
    if (x < y) {
      return x;
    } else {
      return y;
    }
  };

  return Mathematics;

})();

export {
  sqrt
};

export {
  sqrt as squareRoot
};

export {
  Mathematics as default,
  sqrt as squareRoot
};

export * from 'underscore';

export {
  max,
  min
} from 'underscore';
load

Note 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. It is your responsibility attach another transpiler, such as Traceur Compiler, Babel or Rollup, to convert this ES2015 syntax into code that will work in your target runtimes.

Also note that any file with an import or export statement will be output without a top-level function safety wrapper; in other words, importing or exporting modules will automatically trigger bare mode for that file. This is because per the ES2015 spec, import or export statements must occur at the topmost scope.

Cake, and Cakefiles

CoffeeScript includes a (very) simple build system similar to Make and Rake. 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.

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 options object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser:

fs = require 'fs'

option '-o', '--output [DIR]', 'directory for compiled code'

task 'build:parser', 'rebuild the Jison parser', (options) ->
  require 'jison'
  code = require('./lib/grammar').parser.generate()
  dir  = options.output or 'lib'
  fs.writeFile "#{dir}/parser.js", code
var fs;

fs = require('fs');

option('-o', '--output [DIR]', 'directory for compiled code');

task('build:parser', 'rebuild the Jison parser', function(options) {
  var code, dir;
  require('jison');
  code = require('./lib/grammar').parser.generate();
  dir = options.output || 'lib';
  return fs.writeFile(dir + "/parser.js", code);
});
load

If 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. If you need dependencies, or async callbacks, it’s best to put them in your code itself — not the cake task.

Source Maps

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 --map or -m flag to the compiler.

For a full introduction to source maps, how they work, and how to hook them up in your browser, read the HTML5 Tutorial.

“text/coffeescript” Script Tags

While 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, 51k when gzipped) as docs/v1/browser-compiler/coffee-script.js. Include this file on a page with inline CoffeeScript tags, and it will compile and evaluate them in order.

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 CoffeeScript.compile() so you can pop open Firebug and try compiling some strings.

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 window object.

Books

There are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.

Screencasts

  • A Sip of CoffeeScript is a Code School Course which combines 6 screencasts with in-browser coding to make learning fun. The first level is free to try out.
  • Meet CoffeeScript is a 75-minute long screencast by PeepCode, now PluralSight. Highly memorable for its animations which demonstrate transforming CoffeeScript into the equivalent JS.
  • If you’re looking for less of a time commitment, RailsCasts’ CoffeeScript Basics should have you covered, hitting all of the important notes about CoffeeScript in 11 minutes.

Examples

The best list of open-source CoffeeScript examples can be found on GitHub. But just to throw out a few more:

  • GitHub’s Hubot, a friendly IRC robot that can perform any number of useful and useless tasks.
  • sstephenson’s Pow, a zero-configuration Rack server, with comprehensive annotated source.
  • technoweenie’s Coffee-Resque, a port of Resque for Node.js.
  • stephank’s Orona, a remake of the Bolo tank game for modern browsers.
  • GitHub’s Atom, a hackable text editor built on web technologies.
  • Basecamp’s Trix, a rich text editor for web apps.

Resources

  • Source Code
    Use bin/coffee to test your changes,
    bin/cake test to run the test suite,
    bin/cake build to rebuild the full CoffeeScript compiler, and
    bin/cake build:except-parser to recompile much faster if you’re not editing grammar.coffee.

    git checkout lib && bin/cake build:full is a good command to run when you’re working on the core language. It’ll refresh the lib 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.

  • Browser Tests
    Run CoffeeScript’s test suite in your current browser.

  • CoffeeScript Issues
    Bug reports, feature proposals, and ideas for changes to the language belong here.

  • CoffeeScript Google Group
    If you’d like to ask a question, the mailing list is a good place to get help.

  • The CoffeeScript Wiki
    If 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 text editor extensions, web framework plugins, and general CoffeeScript build tools.

  • The FAQ
    Perhaps your CoffeeScript-related question has been asked before. Check the FAQ first.

  • JS2Coffee
    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.

  • High-Rez Logo
    The CoffeeScript logo is available in SVG for use in presentations.

Web Chat (IRC)

Quick help and advice can usually be found in the CoffeeScript IRC room. Join #coffeescript on irc.freenode.net, or click the button below to open a webchat session on this page.

Change Log

1.12.7

  • Fix regressions in 1.12.6 related to chained function calls and indented return and throw arguments.
  • The REPL no longer warns about assigning to _.

1.12.6

  • The return and export keywords can now accept implicit objects (defined by indentation, without needing braces).
  • Support Unicode code point escapes (e.g. \u{1F4A9}).
  • 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.)
  • Bugfixes for chained function calls not closing implicit objects or ternaries.
  • Bugfixes for incorrect code generated by the ? operator within a termary if statement.
  • Fixed some tests, and failing tests now result in a nonzero exit code.

1.12.5

  • 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.
  • Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler.

1.12.4

  • The cake commands have been updated, with new watch options for most tasks. Clone the CoffeeScript repo and run cake at the root of the repo to see the options.
  • Fixed a bug where exporting a referenced variable was preventing the variable from being declared.
  • Fixed a bug where the coffee command wasn’t working for a .litcoffee file.
  • Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.

1.12.3

  • @ 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.
  • 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.
  • The //= operator’s output now wraps parentheses around the right operand, like the other assignment operators.

1.12.2

  • The browser compiler can once again be built unminified via MINIFY=false cake build:browser.
  • The error-prone patched version of Error.prepareStackTrace has been removed.
  • Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+.
  • The browser-based tests now include all the tests as the Node-based version.

1.12.1

  • 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).
  • 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.

1.12.0

  • CoffeeScript now supports ES2015 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.
  • CoffeeScript now provides a for…from syntax for outputting ES2015 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.
  • 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.
  • Within single-backtick embedded JavaScript, backticks can now be escaped via \`​.
  • The browser tests now run in the browser again, and are accessible here if you would like to test your browser.
  • CoffeeScript-only keywords in ES2015 imports and exports are now ignored.
  • The compiler now throws an error on trying to export an anonymous class.
  • Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.

1.11.1

  • Bugfix for shorthand object syntax after interpolated keys.
  • Bugfix for indentation-stripping in """ strings.
  • Bugfix for not being able to use the name “arguments” for a prototype property of class.
  • Correctly compile large hexadecimal numbers literals to 2e308 (just like all other large number literals do).

1.11.0

  • CoffeeScript now supports ES2015 import and export syntax.

  • 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.

  • A bunch of fixes for yield:

    • yield return can no longer mistakenly be used as an expression.

    • 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:

      doubles = ->
        yield for i in [1..3]
          i * 2
      six = ->
        yield
          2 * 3
      
    • The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around yield no longer present.

  • &&=, ||=, and= and or= no longer accidentally allow a space before the equals sign.

  • Improved several error messages.

  • Just like undefined compiles to void 0, NaN now compiles into 0/0 and Infinity into 2e308.

  • Bugfix for renamed destructured parameters with defaults. ({a: b = 1}) -> no longer crashes the compiler.

  • 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.

  • Several minor bug fixes, including:

    • The caught error in catch blocks is no longer declared unnecessarily, and no longer mistakenly named undefined for catch-less try blocks.
    • Unassignable parameter destructuring no longer crashes the compiler.
    • Source maps are now used correctly for errors thrown from .coffee.md files.
    • coffee -e 'throw null' no longer crashes.
    • The REPL no longer crashes when using .exit to exit it.
    • Invalid JavaScript is no longer output when lots of for loops are used in the same scope.
    • A unicode issue when using stdin with the CLI.

1.10.0

  • CoffeeScript now supports ES2015-style destructuring defaults.

  • (offsetHeight: height) -> no longer compiles. That syntax was accidental and partly broken. Use ({offsetHeight: height}) -> instead. Object destructuring always requires braces.

  • Several minor bug fixes, including:

    • A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier.
    • A problem with multiple JS contexts in the jest test framework.
    • An error in io.js where strict mode is set on internal modules.
    • A variable name clash for the caught error in catch blocks.

1.9.3

  • Bugfix for interpolation in the first key of an object literal in an implicit call.
  • Fixed broken error messages in the REPL, as well as a few minor bugs with the REPL.
  • 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.
  • Slight formatting improvement of compiled block comments.
  • Better error messages for on, off, yes and no.

1.9.2

  • Fixed a watch mode error introduced in 1.9.1 when compiling multiple files with the same filename.
  • Bugfix for yield around expressions containing this.
  • Added a Ruby-style -r option to the REPL, which allows requiring a module before execution with --eval or --interactive.
  • 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.
  • Minor bug fixes for IE8, strict ES5 regular expressions and Browserify.

1.9.1

  • Interpolation now works in object literal keys (again). You can use this to dynamically name properties.
  • 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.
  • Fixed a few yield-related edge cases with yield return and yield throw.
  • Minor bug fixes and various improvements to compiler error messages.

1.9.0

  • CoffeeScript now supports ES2015 generators. A generator is simply a function that yields.
  • More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation.
  • 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.
  • Fixed REPL compatibility with latest versions of Node and Io.js.
  • Various minor bug fixes.

1.8.0

  • The --join option of the CLI is now deprecated.
  • Source maps now use .js.map as file extension, instead of just .map.
  • The CLI now exits with the exit code 1 when it fails to write a file to disk.
  • The compiler no longer crashes on unterminated, single-quoted strings.
  • Fixed location data for string interpolations, which made source maps out of sync.
  • The error marker in error messages is now correctly positioned if the code is indented with tabs.
  • Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.
  • The %% operator now coerces its right operand only once.
  • It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.
  • The CoffeeScript REPL is now exported and can be required using require 'coffee-script/repl'.
  • Fixes for the REPL in Node 0.11.

1.7.1

  • Fixed a typo that broke node module lookup when running a script directly with the coffee binary.

1.7.0

  • When requiring CoffeeScript files in Node you must now explicitly register the compiler. This can be done with require 'coffee-script/register' or CoffeeScript.register(). Also for configuration such as Mocha’s, use coffee-script/register.
  • Improved error messages, source maps and stack traces. Source maps now use the updated //# syntax.
  • Leading . now closes all open calls, allowing for simpler chaining syntax.
$ 'body'
.click (e) ->
  $ '.box'
  .fadeIn 'fast'
  .addClass '.active'
.css 'background', 'white'
$('body').click(function(e) {
  return $('.box').fadeIn('fast').addClass('.active');
}).css('background', 'white');
load

  • Added **, // and %% operators and ... expansion in parameter lists and destructuring expressions.
  • 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.
  • Closing brackets can now be indented and therefore no longer cause unexpected error.
  • 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.
  • Formatting of compiled block comments has been improved.
  • No more -p folders on Windows.
  • The options object passed to CoffeeScript is no longer mutated.

1.6.3

  • The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should.
  • You can now use require in Node to load .coffee.md Literate CoffeeScript files. In the browser, text/literate-coffeescript script tags.
  • 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.
  • Bugfixes for Windows path separators, catch without naming the error, and executable-class-bodies-with- prototypal-property-attachment.

1.6.2

  • 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.
  • Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time.
  • Fixes for 1.6.x regressions with overriding inherited bound functions, and for Windows file path management.
  • The coffee command can now correctly fork() both .coffee and .js files. (Requires Node.js 0.9+)

1.6.1

  • First release of source maps. Pass the --map flag to the compiler, and off you go. Direct all your thanks over to Jason Walton.
  • 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.
  • .coffee.md is now also supported as a Literate CoffeeScript file extension, for existing tooling. .litcoffee remains the canonical one.
  • Several minor fixes surrounding member properties, bound methods and super in class declarations.

1.5.0

  • First release of Literate CoffeeScript.
  • The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly.
  • Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor.
  • You can now loop over an array backwards, without having to manually deal with the indexes: for item in list by -1
  • Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted.

1.4.0

  • The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files.
  • Fix Node/compiler deprecation warnings by removing registerExtension, and moving from path.exists to fs.exists.
  • Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals.

1.3.3

  • Due to the new semantics of JavaScript’s strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See #2052 for discussion.
  • Inside of a nested function inside of an instance method, it’s now possible to call super more reliably (walks recursively up).
  • Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643)
  • Fix for splats nested within the LHS of destructuring assignment.
  • Corrections to our compile time strict mode forbidding of octal literals.

1.3.1

  • 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.
  • 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.
  • CoffeeScript now prints a Generated by CoffeeScript VERSION header at the top of each compiled file.
  • Conditional assignment of previously undefined variables a or= b is now considered a syntax error.
  • A tweak to the semantics of do, which can now be used to more easily simulate a namespace: do (x = 1, y = 2) -> …
  • Loop indices are now mutable within a loop iteration, and immutable between them.
  • Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list.
  • 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.

1.2.0

  • 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.
  • The throw statement can now be used as part of an expression.
  • Block comments at the top of the file will now appear outside of the safety closure wrapper.
  • 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.

1.1.3

  • 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.
  • You can now call super in class level methods in class bodies, and bound class methods now preserve their correct context.
  • 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.
  • 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('coffee-script/lexer')
  • There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script.
  • The coffee --watch feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows.
  • Lots of small bug fixes from @michaelficarra, @geraldalewis, @satyr, and @trevorburnham.

1.1.2

Fixes 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.

1.1.1

Bugfix release for classes with external constructor functions, see issue #1182.

1.1.0

When 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.

1.0.1

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 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.

1.0.0

CoffeeScript 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.

0.9.6

The 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.

0.9.5

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 satyr’s 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 used to parse as result = (i for i in list) by default … it now parses as (result = i) for i in list.

0.9.4

CoffeeScript 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.

0.9.3

CoffeeScript 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.

0.9.2

Specifying 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.

0.9.1

Bugfix 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.

0.9.0

The 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.

0.7.2

Quick bugfix (right after 0.7.1) for a problem that prevented coffee command-line options from being parsed in some circumstances.

0.7.1

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.

0.7.0

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 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.

0.6.2

The 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.

0.6.1

Upgraded CoffeeScript for compatibility with the new Node.js v0.1.90 series.

0.6.0

Trailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using @property notation.

0.5.6

Interpolation 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 coffee-script, Node.js can now directly load .coffee files, thanks to registerExtension. Multiple splats can now be used in function calls, arrays, and pattern matching.

0.5.5

String interpolation, contributed by Stan Angeloff. 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.

0.5.4

Bugfix 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.

0.5.3

CoffeeScript 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.

0.5.2

Added a compressed version of the compiler for inclusion in web pages as browser-compiler/coffee-script.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.

0.5.1

Improvements 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.

0.5.0

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.

0.3.2

@property is now a shorthand for this.property. Switched the default JavaScript engine from Narwhal to Node.js. Pass the --narwhal flag if you’d like to continue using it.

0.3.0

CoffeeScript 0.3 includes major syntax changes: The function symbol was changed to ->, and the bound function symbol is now =>. Parameter lists in function definitions must now be wrapped in parentheses. Added property soaking, with the ?. operator. Made parentheses optional, when invoking functions with arguments. Removed the obsolete block literal syntax.

0.2.6

Added 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.

0.2.5

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 ==>, 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.

0.2.4

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.

0.2.3

Axed the unsatisfactory ino keyword, replacing it with of for object comprehensions. They now look like: for prop, value of object.

0.2.2

When performing a comprehension over an object, use ino, instead of in, which helps us generate smaller, more efficient code at compile time. Added :: as a shorthand for saying .prototype. The “splat” symbol has been changed from a prefix asterisk *, to a postfix ellipsis ... Added JavaScript’s in operator, empty return statements, and empty while loops. Constructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned. The extends keyword now functions identically to goog.inherits in Google’s Closure Library.

0.2.1

Arguments objects are now converted into real arrays when referenced.

0.2.0

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 Liam O’Connor-Davis for whitespace and expression help.

0.1.6

Bugfix for running coffee --interactive and --run from outside of the CoffeeScript directory. Bugfix for nested function/if-statements.

0.1.5

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 \ to escape newlines. The coffee-script command is now called coffee.

0.1.4

The official CoffeeScript extension is now .coffee instead of .cs, which properly belongs to C#. 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.

0.1.3

The 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.

0.1.2

Fixed a bug with calling super() through more than one level of inheritance, with the re-addition of the extends keyword. Added experimental Narwhal support (as a Tusk package), contributed by Tom Robinson, including bin/cs as a CoffeeScript REPL and interpreter. New --no-wrap option to suppress the safety function wrapper.

0.1.1

Added instanceof and typeof as operators.

0.1.0

Initial CoffeeScript release.

================================================ FILE: docs/v1/test.html ================================================ CoffeeScript Test Suite

CoffeeScript Test Suite

















































================================================
FILE: docs/v2/annotated-source/browser.html
================================================




  browser.coffee
  
  
  


  
  • browser.coffee

  • §

    This Browser compatibility layer extends core CoffeeScript functions to make things work smoothly when compiling code directly in the browser. We add support for loading remote Coffee scripts via XHR, and text/coffeescript script tags, source maps via data-URLs, and so on.

    CoffeeScript = require './coffeescript'
    { compile } = CoffeeScript
  • §

    Use window.eval to evaluate code, rather than just eval, to run the script in a clean global scope rather than inheriting the scope of the CoffeeScript compiler. (So that cake test:browser also works in Node, use either window.eval or global.eval as appropriate).

    CoffeeScript.eval = (code, options = {}) ->
      options.bare ?= on
      globalRoot = if window? then window else global
      globalRoot['eval'] compile code, options
  • §

    Running code does not provide access to this scope.

    CoffeeScript.run = (code, options = {}) ->
      options.bare      = on
      options.shiftLine = on
      Function(compile code, options)()
  • §

    Export this more limited CoffeeScript than what is exported by index.coffee, which is intended for a Node environment.

    module.exports = CoffeeScript
  • §

    If we’re not in a browser environment, we’re finished with the public API.

    return unless window?
  • §

    Include source maps where possible. If we’ve got a base64 encoder, a JSON serializer, and tools for escaping unicode characters, we’re good to go. Ported from https://developer.mozilla.org/en-US/docs/DOM/window.btoa

    if btoa? and JSON?
      compile = (code, options = {}) ->
        options.inlineMap = true
        CoffeeScript.compile code, options
  • §

    Load a remote script from the current domain via XHR.

    CoffeeScript.load = (url, callback, options = {}, hold = false) ->
      options.sourceFiles = [url]
      xhr = if window.ActiveXObject
        new window.ActiveXObject('Microsoft.XMLHTTP')
      else
        new window.XMLHttpRequest()
      xhr.open 'GET', url, true
      xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr
      xhr.onreadystatechange = ->
        if xhr.readyState is 4
          if xhr.status in [0, 200]
            param = [xhr.responseText, options]
            CoffeeScript.run param... unless hold
          else
            throw new Error "Could not load #{url}"
          callback param if callback
      xhr.send null
  • §

    Activate CoffeeScript in the browser by having it compile and evaluate all script tags with a content-type of text/coffeescript. This happens on page load.

    CoffeeScript.runScripts = ->
      scripts = window.document.getElementsByTagName 'script'
      coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']
      coffees = (s for s in scripts when s.type in coffeetypes)
      index = 0
    
      execute = ->
        param = coffees[index]
        if param instanceof Array
          CoffeeScript.run param...
          index++
          execute()
    
      for script, i in coffees
        do (script, i) ->
          options = literate: script.type is coffeetypes[1]
          source = script.src or script.getAttribute('data-src')
          if source
            options.filename = source
            CoffeeScript.load source,
              (param) ->
                coffees[i] = param
                execute()
              options
              true
          else
  • §

    options.filename defines the filename the source map appears as in Developer Tools. If a script tag has an id, use that as the filename; otherwise use coffeescript, or coffeescript1 etc., leaving the first one unnumbered for the common case that there’s only one CoffeeScript script block to parse.

            options.filename = if script.id and script.id isnt '' then script.id else "coffeescript#{if i isnt 0 then i else ''}"
            options.sourceFiles = ['embedded']
            coffees[i] = [script.innerHTML, options]
    
      execute()
  • §

    Listen for window load, both in decent browsers and in IE. Only attach this event handler on startup for the non-ES module version of the browser compiler, to preserve backward compatibility while letting the ES module version be importable without side effects.

    if this is window
      if window.addEventListener
        window.addEventListener 'DOMContentLoaded', CoffeeScript.runScripts, no
      else
        window.attachEvent 'onload', CoffeeScript.runScripts
================================================ FILE: docs/v2/annotated-source/cake.html ================================================ cake.coffee
  • cake.coffee

  • §

    cake is a simplified version of Make (Rake, Jake) for CoffeeScript. You define tasks with names and descriptions in a Cakefile, and can call them from the command line, or invoke them from other tasks.

    Running cake with no arguments will print out a list of all the tasks in the current directory’s Cakefile.

  • §

    External dependencies.

    fs           = require 'fs'
    path         = require 'path'
    helpers      = require './helpers'
    optparse     = require './optparse'
    CoffeeScript = require './'
  • §

    Register .coffee extension

    CoffeeScript.register()
  • §

    Keep track of the list of defined tasks, the accepted options, and so on.

    tasks     = {}
    options   = {}
    switches  = []
    oparse    = null
  • §

    Mixin the top-level Cake functions for Cakefiles to use directly.

    helpers.extend global,
  • §

    Define a Cake task with a short name, an optional sentence description, and the function to run as the action itself.

      task: (name, description, action) ->
        [action, description] = [description, action] unless action
        tasks[name] = {name, description, action}
  • §

    Define an option that the Cakefile accepts. The parsed options hash, containing all of the command-line options passed, will be made available as the first argument to the action.

      option: (letter, flag, description) ->
        switches.push [letter, flag, description]
  • §

    Invoke another task in the current Cakefile.

      invoke: (name) ->
        missingTask name unless tasks[name]
        tasks[name].action options
  • §

    Run cake. Executes all of the tasks you pass, in order. Note that Node’s asynchrony may cause tasks to execute in a different order than you’d expect. If no tasks are passed, print the help screen. Keep a reference to the original directory name, when running Cake tasks from subdirectories.

    exports.run = ->
      global.__originalDirname = fs.realpathSync '.'
      process.chdir cakefileDirectory __originalDirname
      args = process.argv[2..]
      CoffeeScript.run fs.readFileSync('Cakefile').toString(), filename: 'Cakefile'
      oparse = new optparse.OptionParser switches
      return printTasks() unless args.length
      try
        options = oparse.parse(args)
      catch e
        return fatalError "#{e}"
      invoke arg for arg in options.arguments
  • §

    Display the list of Cake tasks in a format similar to rake -T

    printTasks = ->
      relative = path.relative or path.resolve
      cakefilePath = path.join relative(__originalDirname, process.cwd()), 'Cakefile'
      console.log "#{cakefilePath} defines the following tasks:\n"
      for name, task of tasks
        spaces = 20 - name.length
        spaces = if spaces > 0 then Array(spaces + 1).join(' ') else ''
        desc   = if task.description then "# #{task.description}" else ''
        console.log "cake #{name}#{spaces} #{desc}"
      console.log oparse.help() if switches.length
  • §

    Print an error and exit when attempting to use an invalid task/option.

    fatalError = (message) ->
      console.error message + '\n'
      console.log 'To see a list of all tasks/options, run "cake"'
      process.exit 1
    
    missingTask = (task) -> fatalError "No such task: #{task}"
  • §

    When cake is invoked, search in the current and all parent directories to find the relevant Cakefile.

    cakefileDirectory = (dir) ->
      return dir if fs.existsSync path.join dir, 'Cakefile'
      parent = path.normalize path.join dir, '..'
      return cakefileDirectory parent unless parent is dir
      throw new Error "Cakefile not found in #{process.cwd()}"
================================================ FILE: docs/v2/annotated-source/coffeescript.html ================================================ coffeescript.coffee
  • coffeescript.coffee

  • §

    CoffeeScript can be used both on the server, as a command-line compiler based on Node.js/V8, or to run CoffeeScript directly in the browser. This module contains the main entry functions for tokenizing, parsing, and compiling source CoffeeScript into JavaScript.

    {Lexer}       = require './lexer'
    {parser}      = require './parser'
    helpers       = require './helpers'
    SourceMap     = require './sourcemap'
  • §

    Require package.json, which is two levels above this file, as this file is evaluated from lib/coffeescript.

    packageJson   = require '../../package.json'
  • §

    The current CoffeeScript version number.

    exports.VERSION = packageJson.version
    
    exports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']
  • §

    Expose helpers for testing.

    exports.helpers = helpers
    
    {getSourceMap, registerCompiled} = SourceMap
  • §

    This is exported to enable an external module to implement caching of sourcemaps. This is used only when patchStackTrace has been called to adjust stack traces for files with cached source maps.

    exports.registerCompiled = registerCompiled
  • §

    Function that allows for btoa in both nodejs and the browser.

    base64encode = (src) -> switch
      when typeof Buffer is 'function'
        Buffer.from(src).toString('base64')
      when typeof btoa is 'function'
  • §

    The contents of a <script> block are encoded via UTF-16, so if any extended characters are used in the block, btoa will fail as it maxes out at UTF-8. See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem for the gory details, and for the solution implemented here.

        btoa encodeURIComponent(src).replace /%([0-9A-F]{2})/g, (match, p1) ->
          String.fromCharCode '0x' + p1
      else
        throw new Error('Unable to base64 encode inline sourcemap.')
  • §

    Function wrapper to add source file information to SyntaxErrors thrown by the lexer/parser/compiler.

    withPrettyErrors = (fn) ->
      (code, options = {}) ->
        try
          fn.call @, code, options
        catch err
          throw err if typeof code isnt 'string' # Support `CoffeeScript.nodes(tokens)`.
          throw helpers.updateSyntaxError err, code, options.filename
  • §

    Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.

    If options.sourceMap is specified, then options.filename must also be specified. All options that can be passed to SourceMap#generate may also be passed here.

    This returns a javascript string, unless options.sourceMap is passed, in which case this returns a {js, v3SourceMap, sourceMap} object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for doing programmatic lookups.

    exports.compile = compile = withPrettyErrors (code, options = {}) ->
  • §

    Clone options, to avoid mutating the options object passed in.

      options = Object.assign {}, options
    
      generateSourceMap = options.sourceMap or options.inlineMap or not options.filename?
      filename = options.filename or helpers.anonymousFileName()
    
      checkShebangLine filename, code
    
      map = new SourceMap if generateSourceMap
    
      tokens = lexer.tokenize code, options
  • §

    Pass a list of referenced variables, so that generated variables won’t get the same name.

      options.referencedVars = (
        token[1] for token in tokens when token[0] is 'IDENTIFIER'
      )
  • §

    Check for import or export; if found, force bare mode.

      unless options.bare? and options.bare is yes
        for token in tokens
          if token[0] in ['IMPORT', 'EXPORT']
            options.bare = yes
            break
    
      nodes = parser.parse tokens
  • §

    If all that was requested was a POJO representation of the nodes, e.g. the abstract syntax tree (AST), we can stop now and just return that (after fixing the location data for the root/File»Program node, which might’ve gotten misaligned from the original source due to the clean function in the lexer).

      if options.ast
        nodes.allCommentTokens = helpers.extractAllCommentTokens tokens
        sourceCodeNumberOfLines = (code.match(/\r?\n/g) or '').length + 1
        sourceCodeLastLine = /.*$/.exec(code)[0] # `.*` matches all but line break characters.
        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
        return ast
    
      fragments = nodes.compileToFragments options
    
      currentLine = 0
      currentLine += 1 if options.header
      currentLine += 1 if options.shiftLine
      currentColumn = 0
      js = ""
      for fragment in fragments
  • §

    Update the sourcemap with data from each fragment.

        if generateSourceMap
  • §

    Do not include empty, whitespace, or semicolon-only fragments.

          if fragment.locationData and not /^[;\s]*$/.test fragment.code
            map.add(
              [fragment.locationData.first_line, fragment.locationData.first_column]
              [currentLine, currentColumn]
              {noReplace: true})
          newLines = helpers.count fragment.code, "\n"
          currentLine += newLines
          if newLines
            currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1)
          else
            currentColumn += fragment.code.length
  • §

    Copy the code from each fragment into the final JavaScript.

        js += fragment.code
    
      if options.header
        header = "Generated by CoffeeScript #{@VERSION}"
        js = "// #{header}\n#{js}"
    
      if generateSourceMap
        v3SourceMap = map.generate options, code
    
      if options.transpile
        if typeof options.transpile isnt 'object'
  • §

    This only happens if run via the Node API and transpile is set to something other than an object.

          throw new Error 'The transpile option must be given an object with options to pass to Babel'
  • §

    Get the reference to Babel that we have been passed if this compiler is run via the CLI or Node API.

        transpiler = options.transpile.transpile
        delete options.transpile.transpile
    
        transpilerOptions = Object.assign {}, options.transpile
  • §

    See https://github.com/babel/babel/issues/827#issuecomment-77573107: Babel can take a v3 source map object as input in inputSourceMap and it will return an updated v3 source map object in its output.

        if v3SourceMap and not transpilerOptions.inputSourceMap?
          transpilerOptions.inputSourceMap = v3SourceMap
        transpilerOutput = transpiler js, transpilerOptions
        js = transpilerOutput.code
        if v3SourceMap and transpilerOutput.map
          v3SourceMap = transpilerOutput.map
    
      if options.inlineMap
        encoded = base64encode JSON.stringify v3SourceMap
        sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64,#{encoded}"
        sourceURL = "//# sourceURL=#{filename}"
        js = "#{js}\n#{sourceMapDataURI}\n#{sourceURL}"
    
      registerCompiled filename, code, map
    
      if options.sourceMap
        {
          js
          sourceMap: map
          v3SourceMap: JSON.stringify v3SourceMap, null, 2
        }
      else
        js
  • §

    Tokenize a string of CoffeeScript code, and return the array of tokens.

    exports.tokens = withPrettyErrors (code, options) ->
      lexer.tokenize code, options
  • §

    Parse a string of CoffeeScript code or an array of lexed tokens, and return the AST. You can then compile it by calling .compile() on the root, or traverse it by using .traverseChildren() with a callback.

    exports.nodes = withPrettyErrors (source, options) ->
      source = lexer.tokenize source, options if typeof source is 'string'
      parser.parse source
  • §

    This file used to export these methods; leave stubs that throw warnings instead. These methods have been moved into index.coffee to provide separate entrypoints for Node and non-Node environments, so that static analysis tools don’t choke on Node packages when compiling for a non-Node environment.

    exports.run = exports.eval = exports.register = ->
      throw new Error 'require index.coffee, not this file'
  • §

    Instantiate a Lexer for our use here.

    lexer = new Lexer
  • §

    The real Lexer produces a generic stream of tokens. This object provides a thin wrapper around it, compatible with the Jison API. We can then pass it directly as a “Jison lexer.”

    parser.lexer =
      yylloc:
        range: []
      options:
        ranges: yes
      lex: ->
        token = parser.tokens[@pos++]
        if token
          [tag, @yytext, @yylloc] = token
          parser.errorToken = token.origin or token
          @yylineno = @yylloc.first_line
        else
          tag = ''
        tag
      setInput: (tokens) ->
        parser.tokens = tokens
        @pos = 0
      upcomingInput: -> ''
  • §

    Make all the AST nodes visible to the parser.

    parser.yy = require './nodes'
  • §

    Override Jison’s default error handling function.

    parser.yy.parseError = (message, {token}) ->
  • §

    Disregard Jison’s message, it contains redundant line number information. Disregard the token, we take its value directly from the lexer in case the error is caused by a generated token which might refer to its origin.

      {errorToken, tokens} = parser
      [errorTag, errorText, errorLoc] = errorToken
    
      errorText = switch
        when errorToken is tokens[tokens.length - 1]
          'end of input'
        when errorTag in ['INDENT', 'OUTDENT']
          'indentation'
        when errorTag in ['IDENTIFIER', 'NUMBER', 'INFINITY', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START']
          errorTag.replace(/_START$/, '').toLowerCase()
        else
          helpers.nameWhitespaceCharacter errorText
  • §

    The second argument has a loc property, which should have the location data for this token. Unfortunately, Jison seems to send an outdated loc (from the previous token), so we take the location information directly from the lexer.

      helpers.throwSyntaxError "unexpected #{errorText}", errorLoc
    
    exports.patchStackTrace = ->
  •   formatSourcePosition = (frame, getSourceMapping) ->
        filename = undefined
        fileLocation = ''
    
        if frame.isNative()
          fileLocation = "native"
        else
          if frame.isEval()
            filename = frame.getScriptNameOrSourceURL()
            fileLocation = "#{frame.getEvalOrigin()}, " unless filename
          else
            filename = frame.getFileName()
    
          filename or= "<anonymous>"
    
          line = frame.getLineNumber()
          column = frame.getColumnNumber()
  • §

    Check for a sourceMap position

          source = getSourceMapping filename, line, column
          fileLocation =
            if source
              "#{filename}:#{source[0]}:#{source[1]}"
            else
              "#{filename}:#{line}:#{column}"
    
        functionName = frame.getFunctionName()
        isConstructor = frame.isConstructor()
        isMethodCall = not (frame.isToplevel() or isConstructor)
    
        if isMethodCall
          methodName = frame.getMethodName()
          typeName = frame.getTypeName()
    
          if functionName
            tp = as = ''
            if typeName and functionName.indexOf typeName
              tp = "#{typeName}."
            if methodName and functionName.indexOf(".#{methodName}") isnt functionName.length - methodName.length - 1
              as = " [as #{methodName}]"
    
            "#{tp}#{functionName}#{as} (#{fileLocation})"
          else
            "#{typeName}.#{methodName or '<anonymous>'} (#{fileLocation})"
        else if isConstructor
          "new #{functionName or '<anonymous>'} (#{fileLocation})"
        else if functionName
          "#{functionName} (#{fileLocation})"
        else
          fileLocation
    
      getSourceMapping = (filename, line, column) ->
        sourceMap = getSourceMap filename, line, column
    
        answer = sourceMap.sourceLocation [line - 1, column - 1] if sourceMap?
        if answer? then [answer[0] + 1, answer[1] + 1] else null
  • §

    Based on michaelficarra/CoffeeScriptRedux NodeJS / V8 have no support for transforming positions in stack traces using sourceMap, so we must monkey-patch Error to display CoffeeScript source positions.

      Error.prepareStackTrace = (err, stack) ->
        frames = for frame in stack
  • §

    Don’t display stack frames deeper than CoffeeScript.run.

          break if frame.getFunction() is exports.run
          "    at #{formatSourcePosition frame, getSourceMapping}"
    
        "#{err.toString()}\n#{frames.join '\n'}\n"
    
    checkShebangLine = (file, input) ->
      firstLine = input.split(/$/m, 1)[0]
      rest = firstLine?.match(/^#!\s*([^\s]+\s*)(.*)/)
      args = rest?[2]?.split(/\s/).filter (s) -> s isnt ''
      if args?.length > 1
        console.error '''
          The script to be run begins with a shebang line with more than one
          argument. This script will fail on platforms such as Linux which only
          allow a single argument.
        '''
        console.error "The shebang line was: '#{firstLine}' in file '#{file}'"
        console.error "The arguments were: #{JSON.stringify args}"
================================================ FILE: docs/v2/annotated-source/command.html ================================================ command.coffee
  • command.coffee

  • §

    The coffee utility. Handles command-line compilation of CoffeeScript into various forms: saved into .js files or printed to stdout or recompiled every time the source is saved, printed as a token stream or as the syntax tree, or launch an interactive REPL.

  • §

    External dependencies.

    fs             = require 'fs'
    path           = require 'path'
    helpers        = require './helpers'
    optparse       = require './optparse'
    CoffeeScript   = require './'
    {spawn, exec}  = require 'child_process'
    {EventEmitter} = require 'events'
    
    useWinPathSep  = path.sep is '\\'
  • §

    Allow CoffeeScript to emit Node.js events.

    helpers.extend CoffeeScript, new EventEmitter
    
    printLine = (line) -> process.stdout.write line + '\n'
    printWarn = (line) -> process.stderr.write line + '\n'
    
    hidden = (file) -> /^\.|~$/.test file
  • §

    The help banner that is printed in conjunction with -h/--help.

    BANNER = '''
      Usage: coffee [options] path/to/script.coffee [args]
    
      If called without options, `coffee` will run your script.
    '''
  • §

    The list of all the valid option flags that coffee knows how to handle.

    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']
    ]
  • §

    Top-level objects shared by all the functions.

    opts         = {}
    sources      = []
    sourceCode   = []
    notSources   = {}
    watchedDirs  = {}
    optionParser = null
    
    exports.buildCSOptionParser = buildCSOptionParser = ->
      new optparse.OptionParser SWITCHES, BANNER
  • §

    Run coffee by parsing passed options and determining what action to take. Many flags cause us to divert before compiling anything. Flags passed after -- will be passed verbatim to your script as arguments in process.argv

    exports.run = ->
      optionParser = buildCSOptionParser()
      try parseOptions()
      catch err
        console.error "option parsing error: #{err.message}"
        process.exit 1
    
      if (not opts.doubleDashed) and (opts.arguments[1] is '--')
        printWarn '''
          coffee was invoked with '--' as the second positional argument, which is
          now deprecated. To pass '--' as an argument to a script to run, put an
          additional '--' before the path to your script.
    
          '--' will be removed from the argument list.
        '''
        printWarn "The positional arguments were: #{JSON.stringify opts.arguments}"
        opts.arguments = [opts.arguments[0]].concat opts.arguments[2..]
  • §

    Make the REPL CLI use the global context so as to (a) be consistent with the node REPL CLI and, therefore, (b) make packages that modify native prototypes (such as ‘colors’ and ‘sugar’) work as expected.

      replCliOpts = useGlobal: yes
      opts.prelude = makePrelude opts.require       if opts.require
      replCliOpts.prelude = opts.prelude
      replCliOpts.transpile = opts.transpile
      return forkNode()                             if opts.nodejs
      return usage()                                if opts.help
      return version()                              if opts.version
      return require('./repl').start(replCliOpts)   if opts.interactive
      return compileStdio()                         if opts.stdio
      return compileScript null, opts.arguments[0]  if opts.eval
      return require('./repl').start(replCliOpts)   unless opts.arguments.length
      literals = if opts.run then opts.arguments.splice 1 else []
      process.argv = process.argv[0..1].concat literals
      process.argv[0] = 'coffee'
    
      if opts.output
        outputBasename = path.basename opts.output
        if '.' in outputBasename and
           outputBasename not in ['.', '..'] and
           not helpers.ends(opts.output, path.sep)
  • §

    An output filename was specified, e.g. /dist/scripts.js.

          opts.outputFilename = outputBasename
          opts.outputPath = path.resolve path.dirname opts.output
        else
  • §

    An output path was specified, e.g. /dist.

          opts.outputFilename = null
          opts.outputPath = path.resolve opts.output
    
      if opts.join
        opts.join = path.resolve opts.join
        console.error '''
    
        The --join option is deprecated and will be removed in a future version.
    
        If for some reason it's necessary to share local variables between files,
        replace...
    
            $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee
    
        with...
    
            $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js
    
        '''
      for source in opts.arguments
        source = path.resolve source
        compilePath source, yes, source
    
    makePrelude = (requires) ->
      requires.map (module) ->
        [full, name, module] = match if match = module.match(/^(.*)=(.*)$/)
        name or= helpers.baseFileName module, yes, useWinPathSep
        "global['#{name}'] = require('#{module}')"
      .join ';'
  • §

    Compile a path, which could be a script or a directory. If a directory is passed, recursively compile all ‘.coffee’, ‘.litcoffee’, and ‘.coffee.md’ extension source files in it and all subdirectories.

    compilePath = (source, topLevel, base) ->
      return if source in sources   or
                watchedDirs[source] or
                not topLevel and (notSources[source] or hidden source)
      try
        stats = fs.statSync source
      catch err
        if err.code is 'ENOENT'
          console.error "File not found: #{source}"
          process.exit 1
        throw err
      if stats.isDirectory()
        if path.basename(source) is 'node_modules'
          notSources[source] = yes
          return
        if opts.run
          compilePath findDirectoryIndex(source), topLevel, base
          return
        watchDir source, base if opts.watch
        try
          files = fs.readdirSync source
        catch err
          if err.code is 'ENOENT' then return else throw err
        for file in files
          compilePath (path.join source, file), no, base
      else if topLevel or helpers.isCoffee source
        sources.push source
        sourceCode.push null
        delete notSources[source]
        watch source, base if opts.watch
        try
          code = fs.readFileSync source
        catch err
          if err.code is 'ENOENT' then return else throw err
        compileScript source, code.toString(), base
      else
        notSources[source] = yes
    
    findDirectoryIndex = (source) ->
      for ext in CoffeeScript.FILE_EXTENSIONS
        index = path.join source, "index#{ext}"
        try
          return index if (fs.statSync index).isFile()
        catch err
          throw err unless err.code is 'ENOENT'
      console.error "Missing index.coffee or index.litcoffee in #{source}"
      process.exit 1
  • §

    Compile a single source script, containing the given code, according to the requested options. If evaluating the script directly, set __filename, __dirname and module.filename to be correct relative to the script’s path.

    compileScript = (file, input, base = null) ->
      options = compileOptions file, base
      try
        task = {file, input, options}
        CoffeeScript.emit 'compile', task
        if opts.tokens
          printTokens CoffeeScript.tokens task.input, task.options
        else if opts.nodes
          printLine CoffeeScript.nodes(task.input, task.options).toString().trim()
        else if opts.ast
          compiled = CoffeeScript.compile task.input, task.options
          printLine JSON.stringify(compiled, null, 2)
        else if opts.run
          CoffeeScript.register()
          CoffeeScript.eval opts.prelude, task.options if opts.prelude
          CoffeeScript.run task.input, task.options
        else if opts.join and task.file isnt opts.join
          task.input = helpers.invertLiterate task.input if helpers.isLiterate file
          sourceCode[sources.indexOf(task.file)] = task.input
          compileJoin()
        else
          compiled = CoffeeScript.compile task.input, task.options
          task.output = compiled
          if opts.map
            task.output = compiled.js
            task.sourceMap = compiled.v3SourceMap
    
          CoffeeScript.emit 'success', task
          if opts.print
            printLine task.output.trim()
          else if opts.compile or opts.map
            saveTo = if opts.outputFilename and sources.length is 1
              path.join opts.outputPath, opts.outputFilename
            else
              options.jsPath
            writeJs base, task.file, task.output, saveTo, task.sourceMap
      catch err
        CoffeeScript.emit 'failure', err, task
        return if CoffeeScript.listeners('failure').length
        message = err?.stack or "#{err}"
        if opts.watch
          printLine message + '\x07'
        else
          printWarn message
          process.exit 1
  • §

    Attach the appropriate listeners to compile scripts incoming over stdin, and write them back to stdout.

    compileStdio = ->
      if opts.map
        console.error '--stdio and --map cannot be used together'
        process.exit 1
      buffers = []
      stdin = process.openStdin()
      stdin.on 'data', (buffer) ->
        buffers.push buffer if buffer
      stdin.on 'end', ->
        compileScript null, Buffer.concat(buffers).toString()
  • §

    If all of the source files are done being read, concatenate and compile them together.

    joinTimeout = null
    compileJoin = ->
      return unless opts.join
      unless sourceCode.some((code) -> code is null)
        clearTimeout joinTimeout
        joinTimeout = wait 100, ->
          compileScript opts.join, sourceCode.join('\n'), opts.join
  • §

    Watch a source CoffeeScript file using fs.watch, recompiling it every time the file is updated. May be used in combination with other options, such as --print.

    watch = (source, base) ->
      watcher        = null
      prevStats      = null
      compileTimeout = null
    
      watchErr = (err) ->
        throw err unless err.code is 'ENOENT'
        return unless source in sources
        try
          rewatch()
          compile()
        catch
          removeSource source, base
          compileJoin()
    
      compile = ->
        clearTimeout compileTimeout
        compileTimeout = wait 25, ->
          fs.stat source, (err, stats) ->
            return watchErr err if err
            return rewatch() if prevStats and
                                stats.size is prevStats.size and
                                stats.mtime.getTime() is prevStats.mtime.getTime()
            prevStats = stats
            fs.readFile source, (err, code) ->
              return watchErr err if err
              compileScript(source, code.toString(), base)
              rewatch()
    
      startWatcher = ->
        watcher = fs.watch source
        .on 'change', compile
        .on 'error', (err) ->
          throw err unless err.code is 'EPERM'
          removeSource source, base
    
      rewatch = ->
        watcher?.close()
        startWatcher()
    
      try
        startWatcher()
      catch err
        watchErr err
  • §

    Watch a directory of files for new additions.

    watchDir = (source, base) ->
      watcher        = null
      readdirTimeout = null
    
      startWatcher = ->
        watcher = fs.watch source
        .on 'error', (err) ->
          throw err unless err.code is 'EPERM'
          stopWatcher()
        .on 'change', ->
          clearTimeout readdirTimeout
          readdirTimeout = wait 25, ->
            try
              files = fs.readdirSync source
            catch err
              throw err unless err.code is 'ENOENT'
              return stopWatcher()
            for file in files
              compilePath (path.join source, file), no, base
    
      stopWatcher = ->
        watcher.close()
        removeSourceDir source, base
    
      watchedDirs[source] = yes
      try
        startWatcher()
      catch err
        throw err unless err.code is 'ENOENT'
    
    removeSourceDir = (source, base) ->
      delete watchedDirs[source]
      sourcesChanged = no
      for file in sources when source is path.dirname file
        removeSource file, base
        sourcesChanged = yes
      compileJoin() if sourcesChanged
  • §

    Remove a file from our source list, and source code cache. Optionally remove the compiled JS version as well.

    removeSource = (source, base) ->
      index = sources.indexOf source
      sources.splice index, 1
      sourceCode.splice index, 1
      unless opts.join
        silentUnlink outputPath source, base
        silentUnlink outputPath source, base, '.js.map'
        timeLog "removed #{source}"
    
    silentUnlink = (path) ->
      try
        fs.unlinkSync path
      catch err
        throw err unless err.code in ['ENOENT', 'EPERM']
  • §

    Get the corresponding output JavaScript path for a source file.

    outputPath = (source, base, extension=".js") ->
      basename  = helpers.baseFileName source, yes, useWinPathSep
      srcDir    = path.dirname source
      dir = unless opts.outputPath
        srcDir
      else if source is base
        opts.outputPath
      else
        path.join opts.outputPath, path.relative base, srcDir
      path.join dir, basename + extension
  • §

    Recursively mkdir, like mkdir -p.

    mkdirp = (dir, fn) ->
      mode = 0o777 & ~process.umask()
    
      do mkdirs = (p = dir, fn) ->
        fs.exists p, (exists) ->
          if exists
            fn()
          else
            mkdirs path.dirname(p), ->
              fs.mkdir p, mode, (err) ->
                return fn err if err
                fn()
  • §

    Write out a JavaScript source file with the compiled code. By default, files are written out in cwd as .js files with the same name, but the output directory can be customized with --output.

    If generatedSourceMap is provided, this will write a .js.map file into the same directory as the .js file.

    writeJs = (base, sourcePath, js, jsPath, generatedSourceMap = null) ->
      sourceMapPath = "#{jsPath}.map"
      jsDir  = path.dirname jsPath
      compile = ->
        if opts.compile
          js = ' ' if js.length <= 0
          if generatedSourceMap then js = "#{js}\n//# sourceMappingURL=#{helpers.baseFileName sourceMapPath, no, useWinPathSep}\n"
          fs.writeFile jsPath, js, (err) ->
            if err
              printLine err.message
              process.exit 1
            else if opts.compile and opts.watch
              timeLog "compiled #{sourcePath}"
        if generatedSourceMap
          fs.writeFile sourceMapPath, generatedSourceMap, (err) ->
            if err
              printLine "Could not write source map: #{err.message}"
              process.exit 1
      fs.exists jsDir, (itExists) ->
        if itExists then compile() else mkdirp jsDir, compile
  • §

    Convenience for cleaner setTimeouts.

    wait = (milliseconds, func) -> setTimeout func, milliseconds
  • §

    When watching scripts, it’s useful to log changes with the timestamp.

    timeLog = (message) ->
      console.log "#{(new Date).toLocaleTimeString()} - #{message}"
  • §

    Pretty-print a stream of tokens, sans location data.

    printTokens = (tokens) ->
      strings = for token in tokens
        tag = token[0]
        value = token[1].toString().replace(/\n/, '\\n')
        "[#{tag} #{value}]"
      printLine strings.join(' ')
  • §

    Use the OptionParser module to extract all options from process.argv that are specified in SWITCHES.

    parseOptions = ->
      o = opts      = optionParser.parse process.argv[2..]
      o.compile     or=  !!o.output
      o.run         = not (o.compile or o.print or o.map)
      o.print       = !!  (o.print or (o.eval or o.stdio and o.compile))
  • §

    The compile-time options to pass to the CoffeeScript compiler.

    compileOptions = (filename, base) ->
      if opts.transpile
  • §

    The user has requested that the CoffeeScript compiler also transpile via Babel. We don’t include Babel as a dependency because we want to avoid dependencies in general, and most users probably won’t be relying on us to transpile for them; we assume most users will probably either run CoffeeScript’s output without transpilation (modern Node or evergreen browsers) or use a proper build chain like Gulp or Webpack.

        try
          require '@babel/core'
        catch
          try
            require 'babel-core'
          catch
  • §

    Give appropriate instructions depending on whether coffee was run locally or globally.

            if require.resolve('.').indexOf(process.cwd()) is 0
              console.error '''
                To use --transpile, you must have @babel/core installed:
                  npm install --save-dev @babel/core
                And you must save options to configure Babel in one of the places it looks to find its options.
                See https://coffeescript.org/#transpilation
              '''
            else
              console.error '''
                To use --transpile with globally-installed CoffeeScript, you must have @babel/core installed globally:
                  npm install --global @babel/core
                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.
                See https://coffeescript.org/#transpilation
              '''
            process.exit 1
    
        opts.transpile = {} unless typeof opts.transpile is 'object'
  • §

    Pass a reference to Babel into the compiler, so that the transpile option is available for the CLI. We need to do this so that tools like Webpack can require('coffeescript') and build correctly, without trying to require Babel.

        opts.transpile.transpile = CoffeeScript.transpile
  • §

    Babel searches for its options (a .babelrc file, a .babelrc.js file, a package.json file with a babel key, etc.) relative to the path given to it in its filename option. Make sure we have a path to pass along.

        unless opts.transpile.filename
          opts.transpile.filename = filename or path.resolve(base or process.cwd(), '<anonymous>')
      else
        opts.transpile = no
    
      answer =
        filename: filename
        literate: opts.literate or helpers.isLiterate(filename)
        bare: opts.bare
        header: opts.compile and not opts['no-header']
        transpile: opts.transpile
        sourceMap: opts.map
        inlineMap: opts['inline-map']
        ast: opts.ast
    
      if filename
        if base
          cwd = process.cwd()
          jsPath = outputPath filename, base
          jsDir = path.dirname jsPath
          answer = helpers.merge answer, {
            jsPath
            sourceRoot: path.relative(jsDir, cwd) + path.sep
            sourceFiles: [path.relative cwd, filename]
            generatedFile: helpers.baseFileName(jsPath, no, useWinPathSep)
          }
        else
          answer = helpers.merge answer,
            sourceRoot: ""
            sourceFiles: [helpers.baseFileName filename, no, useWinPathSep]
            generatedFile: helpers.baseFileName(filename, yes, useWinPathSep) + ".js"
      answer
  • §

    Start up a new Node.js instance with the arguments in --nodejs passed to the node binary, preserving the other options.

    forkNode = ->
      nodeArgs = opts.nodejs.split /\s+/
      args     = process.argv[1..]
      args.splice args.indexOf('--nodejs'), 2
      p = spawn process.execPath, nodeArgs.concat(args),
        cwd:        process.cwd()
        env:        process.env
        stdio:      [0, 1, 2]
      for signal in ['SIGINT', 'SIGTERM']
        process.on signal, do (signal) ->
          -> p.kill signal
      p.on 'exit', (code) -> process.exit code
  • §

    Print the --help usage message and exit. Deprecated switches are not shown.

    usage = ->
      printLine optionParser.help()
  • §

    Print the --version message and exit.

    version = ->
      printLine "CoffeeScript version #{CoffeeScript.VERSION}"
================================================ FILE: docs/v2/annotated-source/docco.css ================================================ /*--------------------- Typography ----------------------------*/ @font-face { font-family: 'aller-light'; src: url('public/fonts/aller-light.eot'); src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'), url('public/fonts/aller-light.woff') format('woff'), url('public/fonts/aller-light.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'aller-bold'; src: url('public/fonts/aller-bold.eot'); src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'), url('public/fonts/aller-bold.woff') format('woff'), url('public/fonts/aller-bold.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'roboto-black'; src: url('public/fonts/roboto-black.eot'); src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'), url('public/fonts/roboto-black.woff') format('woff'), url('public/fonts/roboto-black.ttf') format('truetype'); font-weight: normal; font-style: normal; } /*--------------------- Layout ----------------------------*/ html { height: 100%; } body { font-family: "aller-light"; font-size: 14px; line-height: 18px; color: #30404f; margin: 0; padding: 0; height:100%; } #container { min-height: 100%; } a { color: #000; } b, strong { font-weight: normal; font-family: "aller-bold"; } p { margin: 15px 0 0px; } .annotation ul, .annotation ol { margin: 25px 0; } .annotation ul li, .annotation ol li { font-size: 14px; line-height: 18px; margin: 10px 0; } h1, h2, h3, h4, h5, h6 { color: #112233; line-height: 1em; font-weight: normal; font-family: "roboto-black"; text-transform: uppercase; margin: 30px 0 15px 0; } h1 { margin-top: 40px; } h2 { font-size: 1.26em; } hr { border: 0; background: 1px #ddd; height: 1px; margin: 20px 0; } pre, tt, code { font-size: 12px; line-height: 16px; font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; margin: 0; padding: 0; } .annotation pre { display: block; margin: 0; padding: 7px 10px; background: #fcfcfc; -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); box-shadow: inset 0 0 10px rgba(0,0,0,0.1); overflow-x: auto; } .annotation pre code { border: 0; padding: 0; background: transparent; } blockquote { border-left: 5px solid #ccc; margin: 0; padding: 1px 0 1px 1em; } .sections blockquote p { font-family: Menlo, Consolas, Monaco, monospace; font-size: 12px; line-height: 16px; color: #999; margin: 10px 0 0; white-space: pre-wrap; } ul.sections { list-style: none; padding:0 0 5px 0;; margin:0; } /* Force border-box so that % widths fit the parent container without overlap because of margin/padding. More Info : http://www.quirksmode.org/css/box.html */ ul.sections > li > div { -moz-box-sizing: border-box; /* firefox */ -ms-box-sizing: border-box; /* ie */ -webkit-box-sizing: border-box; /* webkit */ -khtml-box-sizing: border-box; /* konqueror */ box-sizing: border-box; /* css3 */ } /*---------------------- Jump Page -----------------------------*/ #jump_to, #jump_page { margin: 0; background: white; -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; font: 16px Arial; cursor: pointer; text-align: right; list-style: none; } #jump_to a { text-decoration: none; } #jump_to a.large { display: none; } #jump_to a.small { font-size: 22px; font-weight: bold; color: #676767; } #jump_to, #jump_wrapper { position: fixed; right: 0; top: 0; padding: 10px 15px; margin:0; } #jump_wrapper { display: none; padding:0; } #jump_to:hover #jump_wrapper { display: block; } #jump_page_wrapper{ position: fixed; right: 0; top: 0; bottom: 0; } #jump_page { padding: 5px 0 3px; margin: 0 0 25px 25px; max-height: 100%; overflow: auto; } #jump_page .source { display: block; padding: 15px; text-decoration: none; border-top: 1px solid #eee; } #jump_page .source:hover { background: #f5f5ff; } #jump_page .source:first-child { } /*---------------------- Low resolutions (> 320px) ---------------------*/ @media only screen and (min-width: 320px) { .sswrap { display: none; } ul.sections > li > div { display: block; padding:5px 10px 0 10px; } ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { padding-left: 30px; } ul.sections > li > div.content { overflow-x:auto; -webkit-box-shadow: inset 0 0 5px #e5e5ee; box-shadow: inset 0 0 5px #e5e5ee; border: 1px solid #dedede; margin:5px 10px 5px 10px; padding-bottom: 5px; } ul.sections > li > div.annotation pre { margin: 7px 0 7px; padding-left: 15px; } ul.sections > li > div.annotation p tt, .annotation code { background: #f8f8ff; border: 1px solid #dedede; font-size: 12px; padding: 0 0.2em; } } /*---------------------- (> 481px) ---------------------*/ @media only screen and (min-width: 481px) { #container { position: relative; } body { background-color: #F5F5FF; font-size: 15px; line-height: 21px; } pre, tt, code { line-height: 18px; } p, ul, ol { margin: 0 0 15px; } #jump_to { padding: 5px 10px; } #jump_wrapper { padding: 0; } #jump_to, #jump_page { font: 10px Arial; text-transform: uppercase; } #jump_page .source { padding: 5px 10px; } #jump_to a.large { display: inline-block; } #jump_to a.small { display: none; } #background { position: absolute; top: 0; bottom: 0; width: 350px; background: #fff; border-right: 1px solid #e5e5ee; z-index: -1; } ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { padding-left: 40px; } ul.sections > li { white-space: nowrap; } ul.sections > li > div { display: inline-block; } ul.sections > li > div.annotation { max-width: 350px; min-width: 350px; min-height: 5px; padding: 13px; overflow-x: hidden; white-space: normal; vertical-align: top; text-align: left; } ul.sections > li > div.annotation pre { margin: 15px 0 15px; padding-left: 15px; } ul.sections > li > div.content { padding: 13px; vertical-align: top; border: none; -webkit-box-shadow: none; box-shadow: none; } .sswrap { position: relative; display: inline; } .ss { font: 12px Arial; text-decoration: none; color: #454545; position: absolute; top: 3px; left: -20px; padding: 1px 2px; opacity: 0; -webkit-transition: opacity 0.2s linear; } .for-h1 .ss { top: 47px; } .for-h2 .ss, .for-h3 .ss, .for-h4 .ss { top: 35px; } ul.sections > li > div.annotation:hover .ss { opacity: 1; } } /*---------------------- (> 1025px) ---------------------*/ @media only screen and (min-width: 1025px) { body { font-size: 16px; line-height: 24px; } #background { width: 525px; } ul.sections > li > div.annotation { max-width: 525px; min-width: 525px; padding: 10px 25px 1px 50px; } ul.sections > li > div.content { padding: 9px 15px 16px 25px; } } /*---------------------- Syntax Highlighting -----------------------------*/ td.linenos { background-color: #f0f0f0; padding-right: 10px; } span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } /* github.com style (c) Vasily Polovnyov */ pre code { display: block; padding: 0.5em; color: #000; background: #f8f8ff } pre .hljs-comment, pre .hljs-template_comment, pre .hljs-diff .hljs-header, pre .hljs-javadoc { color: #408080; font-style: italic } pre .hljs-keyword, pre .hljs-assignment, pre .hljs-literal, pre .hljs-css .hljs-rule .hljs-keyword, pre .hljs-winutils, pre .hljs-javascript .hljs-title, pre .hljs-lisp .hljs-title, pre .hljs-subst { color: #954121; /*font-weight: bold*/ } pre .hljs-number, pre .hljs-hexcolor { color: #40a070 } pre .hljs-string, pre .hljs-tag .hljs-value, pre .hljs-phpdoc, pre .hljs-tex .hljs-formula { color: #219161; } pre .hljs-title, pre .hljs-id { color: #19469D; } pre .hljs-params { color: #00F; } pre .hljs-javascript .hljs-title, pre .hljs-lisp .hljs-title, pre .hljs-subst { font-weight: normal } pre .hljs-class .hljs-title, pre .hljs-haskell .hljs-label, pre .hljs-tex .hljs-command { color: #458; font-weight: bold } pre .hljs-tag, pre .hljs-tag .hljs-title, pre .hljs-rules .hljs-property, pre .hljs-django .hljs-tag .hljs-keyword { color: #000080; font-weight: normal } pre .hljs-attribute, pre .hljs-variable, pre .hljs-instancevar, pre .hljs-lisp .hljs-body { color: #008080 } pre .hljs-regexp { color: #B68 } pre .hljs-class { color: #458; font-weight: bold } pre .hljs-symbol, pre .hljs-ruby .hljs-symbol .hljs-string, pre .hljs-ruby .hljs-symbol .hljs-keyword, pre .hljs-ruby .hljs-symbol .hljs-keymethods, pre .hljs-lisp .hljs-keyword, pre .hljs-tex .hljs-special, pre .hljs-input_number { color: #990073 } pre .hljs-builtin, pre .hljs-constructor, pre .hljs-built_in, pre .hljs-lisp .hljs-title { color: #0086b3 } pre .hljs-preprocessor, pre .hljs-pi, pre .hljs-doctype, pre .hljs-shebang, pre .hljs-cdata { color: #999; font-weight: bold } pre .hljs-deletion { background: #fdd } pre .hljs-addition { background: #dfd } pre .hljs-diff .hljs-change { background: #0086b3 } pre .hljs-chunk { color: #aaa } pre .hljs-tex .hljs-formula { opacity: 0.5; } ================================================ FILE: docs/v2/annotated-source/grammar.html ================================================ grammar.coffee
  • grammar.coffee

  • §

    The CoffeeScript parser is generated by Jison from this grammar file. Jison is a bottom-up parser generator, similar in style to Bison, implemented in JavaScript. It can recognize LALR(1), LR(0), SLR(1), and LR(1) type grammars. To create the Jison parser, we list the pattern to match on the left-hand side, and the action to take (usually the creation of syntax tree nodes) on the right. As the parser runs, it shifts tokens from our token stream, from left to right, and attempts to match the token sequence against the rules below. When a match can be made, it reduces into the nonterminal (the enclosing name at the top), and we proceed from there.

    If you run the cake build:parser command, Jison constructs a parse table from our rules and saves it into lib/parser.js.

  • §

    The only dependency is on the Jison.Parser.

    {Parser} = require 'jison'
  • §

    Jison DSL

  • §
  • §

    Since we’re going to be wrapped in a function by Jison in any case, if our action immediately returns a value, we can optimize by removing the function wrapper and just returning the value directly.

    unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/
  • §

    Our handy DSL for Jison grammar generation, thanks to Tim Caswell. For every rule in the grammar, we pass the pattern-defining string, the action to run, and extra options, optionally. If no action is specified, we simply pass the value of the previous nonterminal.

    o = (patternString, action, options) ->
      patternString = patternString.replace /\s{2,}/g, ' '
      patternCount = patternString.split(' ').length
      if action
  • §

    This code block does string replacements in the generated parser.js file, replacing the calls to the LOC function and other strings as listed below.

        action = if match = unwrap.exec action then match[1] else "(#{action}())"
  • §

    All runtime functions we need are defined on yy

        action = action.replace /\bnew /g, '$&yy.'
        action = action.replace /\b(?:Block\.wrap|extend)\b/g, 'yy.$&'
  • §

    Returns strings of functions to add to parser.js which add extra data that nodes may have, such as comments or location data. Location data is added to the first parameter passed in, and the parameter is returned. If the parameter is not a node, it will just be passed through unaffected.

        getAddDataToNodeFunctionString = (first, last, forceUpdateLocation = yes) ->
          "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'})"
  • §

    This code replaces the calls to LOC with the yy.addDataToNode string defined above. The LOC function, when used below in the grammar rules, is used to make sure that newly created node class objects get correct location data assigned to them. By default, the grammar will assign the location data spanned by all of the tokens on the left (e.g. a string such as 'Body TERMINATOR Line') to the “top-level” node returned by the grammar rule (the function on the right). But for “inner” node class objects created by grammar rules, they won’t get correct location data assigned to them without adding LOC.

  • §

    For example, consider the grammar rule 'NEW_TARGET . Property', which is handled by a function that returns new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3). The 1 in LOC(1) refers to the first token (NEW_TARGET) and the 3 in LOC(3) refers to the third token (Property). In order for the new IdentifierLiteral to get assigned the location data corresponding to new in the source code, we use LOC(1)(new IdentifierLiteral ...) to mean “assign the location data of the first token of this grammar rule (NEW_TARGET) to this new IdentifierLiteral”. The LOC(3) means “assign the location data of the third token of this grammar rule (Property) to this new Access”.

        returnsLoc = /^LOC/.test action
        action = action.replace /LOC\(([0-9]*)\)/g, getAddDataToNodeFunctionString('$1')
  • §

    A call to LOC with two arguments, e.g. LOC(2,4), sets the location data for the generated node on both of the referenced tokens (the second and fourth in this example).

        action = action.replace /LOC\(([0-9]*),\s*([0-9]*)\)/g, getAddDataToNodeFunctionString('$1', '$2')
        performActionFunctionString = "$$ = #{getAddDataToNodeFunctionString(1, patternCount, not returnsLoc)}(#{action});"
      else
        performActionFunctionString = '$$ = $1;'
    
      [patternString, performActionFunctionString, options]
  • §

    Grammatical Rules

  • §
  • §

    In all of the rules that follow, you’ll see the name of the nonterminal as the key to a list of alternative matches. With each match’s action, the dollar-sign variables are provided by Jison as references to the value of their numeric position, so in this rule:

    'Expression UNLESS Expression'
    

    $1 would be the value of the first Expression, $2 would be the token for the UNLESS terminal, and $3 would be the value of the second Expression.

    grammar =
  • §

    The Root is the top-level node in the syntax tree. Since we parse bottom-up, all parsing must end here.

      Root: [
        o '',                                       -> new Root new Block
        o 'Body',                                   -> new Root $1
      ]
  • §

    Any list of statements and expressions, separated by line breaks or semicolons.

      Body: [
        o 'Line',                                   -> Block.wrap [$1]
        o 'Body TERMINATOR Line',                   -> $1.push $3
        o 'Body TERMINATOR'
      ]
  • §

    Block and statements, which make up a line in a body. FuncDirective is a statement, but not included in Statement because that results in an ambiguous grammar.

      Line: [
        o 'Expression'
        o 'ExpressionLine'
        o 'Statement'
        o 'FuncDirective'
      ]
    
      FuncDirective: [
        o 'YieldReturn'
        o 'AwaitReturn'
      ]
  • §

    Pure statements which cannot be expressions.

      Statement: [
        o 'Return'
        o 'STATEMENT',                              -> new StatementLiteral $1
        o 'Import'
        o 'Export'
      ]
  • §

    All the different types of expressions in our language. The basic unit of CoffeeScript is the Expression – everything that can be an expression is one. Blocks serve as the building blocks of many other rules, making them somewhat circular.

      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'
      ]
  • §

    Expressions which are written in single line and would otherwise require being wrapped in braces: E.g a = b if do -> f a is 1, if f (a) -> a*2 then ..., for x in do (obj) -> f obj when x > 8 then f x

      ExpressionLine: [
        o 'CodeLine'
        o 'IfLine'
        o 'OperationLine'
      ]
    
      Yield: [
        o 'YIELD',                                  -> new Op $1, new Value new Literal ''
        o 'YIELD Expression',                       -> new Op $1, $2
        o 'YIELD INDENT Object OUTDENT',            -> new Op $1, $3
        o 'YIELD FROM Expression',                  -> new Op $1.concat($2), $3
      ]
  • §

    An indented block of expressions. Note that the Rewriter will convert some postfix forms into blocks for us, by adjusting the token stream.

      Block: [
        o 'INDENT OUTDENT',                         -> new Block
        o 'INDENT Body OUTDENT',                    -> $2
      ]
    
      Identifier: [
        o 'IDENTIFIER',                             -> new IdentifierLiteral $1
        o 'JSX_TAG',                                -> new JSXTag $1.toString(),
                                                         tagNameLocationData:                  $1.tagNameToken[2]
                                                         closingTagOpeningBracketLocationData: $1.closingTagOpeningBracketToken?[2]
                                                         closingTagSlashLocationData:          $1.closingTagSlashToken?[2]
                                                         closingTagNameLocationData:           $1.closingTagNameToken?[2]
                                                         closingTagClosingBracketLocationData: $1.closingTagClosingBracketToken?[2]
      ]
    
      Property: [
        o 'PROPERTY',                               -> new PropertyName $1.toString()
      ]
  • §

    Alphanumerics are separated from the other Literal matchers because they can also serve as keys in object literals.

      AlphaNumeric: [
        o 'NUMBER',                                 -> new NumberLiteral $1.toString(), parsedValue: $1.parsedValue
        o 'String'
      ]
    
      String: [
        o 'STRING', ->
          new StringLiteral(
            $1.slice 1, -1 # strip artificial quotes and unwrap to primitive string
            quote:        $1.quote
            initialChunk: $1.initialChunk
            finalChunk:   $1.finalChunk
            indent:       $1.indent
            double:       $1.double
            heregex:      $1.heregex
          )
        o 'STRING_START Interpolations STRING_END', -> new StringWithInterpolations Block.wrap($2), quote: $1.quote, startQuote: LOC(1)(new Literal $1.toString())
      ]
    
      Interpolations: [
        o 'InterpolationChunk',                     -> [$1]
        o 'Interpolations InterpolationChunk',      -> $1.concat $2
      ]
    
      InterpolationChunk: [
        o 'INTERPOLATION_START Body INTERPOLATION_END',                -> new Interpolation $2
        o 'INTERPOLATION_START INDENT Body OUTDENT INTERPOLATION_END', -> new Interpolation $3
        o 'INTERPOLATION_START INTERPOLATION_END',                     -> new Interpolation
        o 'String',                                                    -> $1
      ]
  • §

    The .toString() calls here and elsewhere are to convert String objects back to primitive strings now that we’ve retrieved stowaway extra properties

      Regex: [
        o 'REGEX',                                  -> new RegexLiteral $1.toString(), delimiter: $1.delimiter, heregexCommentTokens: $1.heregexCommentTokens
        o 'REGEX_START Invocation REGEX_END',       -> new RegexWithInterpolations $2, heregexCommentTokens: $3.heregexCommentTokens
      ]
  • §

    All of our immediate values. Generally these can be passed straight through and printed to JavaScript.

      Literal: [
        o 'AlphaNumeric'
        o 'JS',                                     -> new PassthroughLiteral $1.toString(), here: $1.here, generated: $1.generated
        o 'Regex'
        o 'UNDEFINED',                              -> new UndefinedLiteral $1
        o 'NULL',                                   -> new NullLiteral $1
        o 'BOOL',                                   -> new BooleanLiteral $1.toString(), originalValue: $1.original
        o 'INFINITY',                               -> new InfinityLiteral $1.toString(), originalValue: $1.original
        o 'NAN',                                    -> new NaNLiteral $1
      ]
  • §

    Assignment of a variable, property, or index to a value.

      Assign: [
        o 'Assignable = Expression',                -> new Assign $1, $3
        o 'Assignable = TERMINATOR Expression',     -> new Assign $1, $4
        o 'Assignable = INDENT Expression OUTDENT', -> new Assign $1, $4
      ]
  • §

    Assignment when it happens within an object literal. The difference from the ordinary Assign is that these allow numbers and strings as keys.

      AssignObj: [
        o 'ObjAssignable',                          -> new Value $1
        o 'ObjRestValue'
        o 'ObjAssignable : Expression',             -> new Assign LOC(1)(new Value $1), $3, 'object',
                                                                  operatorToken: LOC(2)(new Literal $2)
        o 'ObjAssignable :
           INDENT Expression OUTDENT',              -> new Assign LOC(1)(new Value $1), $4, 'object',
                                                                  operatorToken: LOC(2)(new Literal $2)
        o 'SimpleObjAssignable = Expression',       -> new Assign LOC(1)(new Value $1), $3, null,
                                                                  operatorToken: LOC(2)(new Literal $2)
        o 'SimpleObjAssignable =
           INDENT Expression OUTDENT',              -> new Assign LOC(1)(new Value $1), $4, null,
                                                                  operatorToken: LOC(2)(new Literal $2)
      ]
    
      SimpleObjAssignable: [
        o 'Identifier'
        o 'Property'
        o 'ThisProperty'
      ]
    
      ObjAssignable: [
        o 'SimpleObjAssignable'
        o '[ Expression ]',          -> new Value new ComputedPropertyName $2
        o '@ [ Expression ]',        -> new Value LOC(1)(new ThisLiteral $1), [LOC(3)(new ComputedPropertyName($3))], 'this'
        o 'AlphaNumeric'
      ]
  • §

    Object literal spread properties.

      ObjRestValue: [
        o 'SimpleObjAssignable ...', -> new Splat new Value $1
        o '... SimpleObjAssignable', -> new Splat new Value($2), postfix: no
        o 'ObjSpreadExpr ...',       -> new Splat $1
        o '... ObjSpreadExpr',       -> new Splat $2, postfix: no
      ]
    
      ObjSpreadExpr: [
        o 'ObjSpreadIdentifier'
        o 'Object'
        o 'Parenthetical'
        o 'Super'
        o 'This'
        o 'SUPER OptFuncExist Arguments',               -> new SuperCall LOC(1)(new Super), $3, $2.soak, $1
        o 'DYNAMIC_IMPORT Arguments',                   -> new DynamicImportCall LOC(1)(new DynamicImport), $2
        o 'SimpleObjAssignable OptFuncExist Arguments', -> new Call (new Value $1), $3, $2.soak
        o 'ObjSpreadExpr OptFuncExist Arguments',       -> new Call $1, $3, $2.soak
      ]
    
      ObjSpreadIdentifier: [
        o 'SimpleObjAssignable Accessor', -> (new Value $1).add $2
        o 'ObjSpreadExpr Accessor',       -> (new Value $1).add $2
      ]
  • §

    A return statement from a function body.

      Return: [
        o 'RETURN Expression',                      -> new Return $2
        o 'RETURN INDENT Object OUTDENT',           -> new Return new Value $3
        o 'RETURN',                                 -> new Return
      ]
    
      YieldReturn: [
        o 'YIELD RETURN Expression',                -> new YieldReturn $3,   returnKeyword: LOC(2)(new Literal $2)
        o 'YIELD RETURN',                           -> new YieldReturn null, returnKeyword: LOC(2)(new Literal $2)
      ]
    
      AwaitReturn: [
        o 'AWAIT RETURN Expression',                -> new AwaitReturn $3,   returnKeyword: LOC(2)(new Literal $2)
        o 'AWAIT RETURN',                           -> new AwaitReturn null, returnKeyword: LOC(2)(new Literal $2)
      ]
  • §

    The Code node is the function literal. It’s defined by an indented block of Block preceded by a function arrow, with an optional parameter list.

      Code: [
        o 'PARAM_START ParamList PARAM_END FuncGlyph Block', -> new Code $2, $5, $4, LOC(1)(new Literal $1)
        o 'FuncGlyph Block',                                 -> new Code [], $2, $1
      ]
  • §

    The Codeline is the Code node with Line instead of indented Block.

      CodeLine: [
        o 'PARAM_START ParamList PARAM_END FuncGlyph Line', -> new Code $2, LOC(5)(Block.wrap [$5]), $4,
                                                                  LOC(1)(new Literal $1)
        o 'FuncGlyph Line',                                 -> new Code [], LOC(2)(Block.wrap [$2]), $1
      ]
  • §

    CoffeeScript has two different symbols for functions. -> is for ordinary functions, and => is for functions bound to the current value of this.

      FuncGlyph: [
        o '->',                                     -> new FuncGlyph $1
        o '=>',                                     -> new FuncGlyph $1
      ]
  • §

    An optional, trailing comma.

      OptComma: [
        o ''
        o ','
      ]
  • §

    The list of parameters that a function accepts can be of any length.

      ParamList: [
        o '',                                       -> []
        o 'Param',                                  -> [$1]
        o 'ParamList , Param',                      -> $1.concat $3
        o 'ParamList OptComma TERMINATOR Param',    -> $1.concat $4
        o 'ParamList OptComma INDENT ParamList OptComma OUTDENT', -> $1.concat $4
      ]
  • §

    A single parameter in a function definition can be ordinary, or a splat that hoovers up the remaining arguments.

      Param: [
        o 'ParamVar',                               -> new Param $1
        o 'ParamVar ...',                           -> new Param $1, null, on
        o '... ParamVar',                           -> new Param $2, null, postfix: no
        o 'ParamVar = Expression',                  -> new Param $1, $3
        o '...',                                    -> new Expansion
      ]
  • §

    Function Parameters

      ParamVar: [
        o 'Identifier'
        o 'ThisProperty'
        o 'Array'
        o 'Object'
      ]
  • §

    A splat that occurs outside of a parameter list.

      Splat: [
        o 'Expression ...',                         -> new Splat $1
        o '... Expression',                         -> new Splat $2, {postfix: no}
      ]
  • §

    Variables and properties that can be assigned to.

      SimpleAssignable: [
        o 'Identifier',                             -> new Value $1
        o 'Value Accessor',                         -> $1.add $2
        o 'Code Accessor',                          -> new Value($1).add $2
        o 'ThisProperty'
      ]
  • §

    Everything that can be assigned to.

      Assignable: [
        o 'SimpleAssignable'
        o 'Array',                                  -> new Value $1
        o 'Object',                                 -> new Value $1
      ]
  • §

    The types of things that can be treated as values – assigned to, invoked as functions, indexed into, named as a class, etc.

      Value: [
        o 'Assignable'
        o 'Literal',                                -> new Value $1
        o 'Parenthetical',                          -> new Value $1
        o 'Range',                                  -> new Value $1
        o 'Invocation',                             -> new Value $1
        o 'DoIife',                                 -> new Value $1
        o 'This'
        o 'Super',                                  -> new Value $1
        o 'MetaProperty',                           -> new Value $1
      ]
  • §

    A super-based expression that can be used as a value.

      Super: [
        o 'SUPER . Property',                                      -> new Super LOC(3)(new Access $3), LOC(1)(new Literal $1)
        o 'SUPER INDEX_START Expression INDEX_END',                -> new Super LOC(3)(new Index $3),  LOC(1)(new Literal $1)
        o 'SUPER INDEX_START INDENT Expression OUTDENT INDEX_END', -> new Super LOC(4)(new Index $4),  LOC(1)(new Literal $1)
      ]
  • §

    A “meta-property” access e.g. new.target or import.meta, where something that looks like a property is referenced on a keyword.

      MetaProperty: [
        o 'NEW_TARGET . Property',                  -> new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)
        o 'IMPORT_META . Property',                 -> new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)
      ]
  • §

    The general group of accessors into an object, by property, by prototype or by array index or slice.

      Accessor: [
        o '.  Property',                            -> new Access $2
        o '?. Property',                            -> new Access $2, soak: yes
        o ':: Property',                            -> [LOC(1)(new Access new PropertyName('prototype'), shorthand: yes), LOC(2)(new Access $2)]
        o '?:: Property',                           -> [LOC(1)(new Access new PropertyName('prototype'), shorthand: yes, soak: yes), LOC(2)(new Access $2)]
        o '::',                                     -> new Access new PropertyName('prototype'), shorthand: yes
        o '?::',                                    -> new Access new PropertyName('prototype'), shorthand: yes, soak: yes
        o 'Index'
      ]
  • §

    Indexing into an object or array using bracket notation.

      Index: [
        o 'INDEX_START IndexValue INDEX_END',                -> $2
        o 'INDEX_START INDENT IndexValue OUTDENT INDEX_END', -> $3
        o 'INDEX_SOAK  Index',                               -> extend $2, soak: yes
      ]
    
      IndexValue: [
        o 'Expression',                             -> new Index $1
        o 'Slice',                                  -> new Slice $1
      ]
  • §

    In CoffeeScript, an object literal is simply a list of assignments.

      Object: [
        o '{ AssignList OptComma }',                -> new Obj $2, $1.generated
      ]
  • §

    Assignment of properties within an object literal can be separated by comma, as in JavaScript, or simply by newline.

      AssignList: [
        o '',                                                       -> []
        o 'AssignObj',                                              -> [$1]
        o 'AssignList , AssignObj',                                 -> $1.concat $3
        o 'AssignList OptComma TERMINATOR AssignObj',               -> $1.concat $4
        o 'AssignList OptComma INDENT AssignList OptComma OUTDENT', -> $1.concat $4
      ]
  • §

    Class definitions have optional bodies of prototype property assignments, and optional references to the superclass.

      Class: [
        o 'CLASS',                                           -> new Class
        o 'CLASS Block',                                     -> new Class null, null, $2
        o 'CLASS EXTENDS Expression',                        -> new Class null, $3
        o 'CLASS EXTENDS Expression Block',                  -> new Class null, $3, $4
        o 'CLASS SimpleAssignable',                          -> new Class $2
        o 'CLASS SimpleAssignable Block',                    -> new Class $2, null, $3
        o 'CLASS SimpleAssignable EXTENDS Expression',       -> new Class $2, $4
        o 'CLASS SimpleAssignable EXTENDS Expression Block', -> new Class $2, $4, $5
      ]
    
      Import: [
        o 'IMPORT String',                                                                              -> new ImportDeclaration null, $2
        o 'IMPORT String ASSERT Object',                                                                -> new ImportDeclaration null, $2, $4
        o 'IMPORT ImportDefaultSpecifier FROM String',                                                  -> new ImportDeclaration new ImportClause($2, null), $4
        o 'IMPORT ImportDefaultSpecifier FROM String ASSERT Object',                                    -> new ImportDeclaration new ImportClause($2, null), $4, $6
        o 'IMPORT ImportNamespaceSpecifier FROM String',                                                -> new ImportDeclaration new ImportClause(null, $2), $4
        o 'IMPORT ImportNamespaceSpecifier FROM String ASSERT Object',                                  -> new ImportDeclaration new ImportClause(null, $2), $4, $6
        o 'IMPORT { } FROM String',                                                                     -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList []), $5
        o 'IMPORT { } FROM String ASSERT Object',                                                       -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList []), $5, $7
        o 'IMPORT { ImportSpecifierList OptComma } FROM String',                                        -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList $3), $7
        o 'IMPORT { ImportSpecifierList OptComma } FROM String ASSERT Object',                          -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList $3), $7, $9
        o 'IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String',                       -> new ImportDeclaration new ImportClause($2, $4), $6
        o 'IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String ASSERT Object',         -> new ImportDeclaration new ImportClause($2, $4), $6, $8
        o 'IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String',               -> new ImportDeclaration new ImportClause($2, new ImportSpecifierList $5), $9
        o 'IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String ASSERT Object', -> new ImportDeclaration new ImportClause($2, new ImportSpecifierList $5), $9, $11
      ]
    
      ImportSpecifierList: [
        o 'ImportSpecifier',                                                          -> [$1]
        o 'ImportSpecifierList , ImportSpecifier',                                    -> $1.concat $3
        o 'ImportSpecifierList OptComma TERMINATOR ImportSpecifier',                  -> $1.concat $4
        o 'INDENT ImportSpecifierList OptComma OUTDENT',                              -> $2
        o 'ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT', -> $1.concat $4
      ]
    
      ImportSpecifier: [
        o 'Identifier',                             -> new ImportSpecifier $1
        o 'Identifier AS Identifier',               -> new ImportSpecifier $1, $3
        o 'DEFAULT',                                -> new ImportSpecifier LOC(1)(new DefaultLiteral $1)
        o 'DEFAULT AS Identifier',                  -> new ImportSpecifier LOC(1)(new DefaultLiteral($1)), $3
      ]
    
      ImportDefaultSpecifier: [
        o 'Identifier',                             -> new ImportDefaultSpecifier $1
      ]
    
      ImportNamespaceSpecifier: [
        o 'IMPORT_ALL AS Identifier',               -> new ImportNamespaceSpecifier new Literal($1), $3
      ]
    
      Export: [
        o 'EXPORT { }',                                                        -> new ExportNamedDeclaration new ExportSpecifierList []
        o 'EXPORT { ExportSpecifierList OptComma }',                           -> new ExportNamedDeclaration new ExportSpecifierList $3
        o 'EXPORT Class',                                                      -> new ExportNamedDeclaration $2
        o 'EXPORT Identifier = Expression',                                    -> new ExportNamedDeclaration LOC(2,4)(new Assign $2, $4, null,
                                                                                                          moduleDeclaration: 'export')
        o 'EXPORT Identifier = TERMINATOR Expression',                         -> new ExportNamedDeclaration LOC(2,5)(new Assign $2, $5, null,
                                                                                                          moduleDeclaration: 'export')
        o 'EXPORT Identifier = INDENT Expression OUTDENT',                     -> new ExportNamedDeclaration LOC(2,6)(new Assign $2, $5, null,
                                                                                                          moduleDeclaration: 'export')
        o 'EXPORT DEFAULT Expression',                                         -> new ExportDefaultDeclaration $3
        o 'EXPORT DEFAULT INDENT Object OUTDENT',                              -> new ExportDefaultDeclaration new Value $4
        o 'EXPORT EXPORT_ALL FROM String',                                     -> new ExportAllDeclaration new Literal($2), $4
        o 'EXPORT EXPORT_ALL FROM String ASSERT Object',                       -> new ExportAllDeclaration new Literal($2), $4, $6
        o 'EXPORT { } FROM String',                                            -> new ExportNamedDeclaration new ExportSpecifierList([]), $5
        o 'EXPORT { } FROM String ASSERT Object',                              -> new ExportNamedDeclaration new ExportSpecifierList([]), $5, $7
        o 'EXPORT { ExportSpecifierList OptComma } FROM String',               -> new ExportNamedDeclaration new ExportSpecifierList($3), $7
        o 'EXPORT { ExportSpecifierList OptComma } FROM String ASSERT Object', -> new ExportNamedDeclaration new ExportSpecifierList($3), $7, $9
      ]
    
      ExportSpecifierList: [
        o 'ExportSpecifier',                                                          -> [$1]
        o 'ExportSpecifierList , ExportSpecifier',                                    -> $1.concat $3
        o 'ExportSpecifierList OptComma TERMINATOR ExportSpecifier',                  -> $1.concat $4
        o 'INDENT ExportSpecifierList OptComma OUTDENT',                              -> $2
        o 'ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT', -> $1.concat $4
      ]
    
      ExportSpecifier: [
        o 'Identifier',                             -> new ExportSpecifier $1
        o 'Identifier AS Identifier',               -> new ExportSpecifier $1, $3
        o 'Identifier AS DEFAULT',                  -> new ExportSpecifier $1, LOC(3)(new DefaultLiteral $3)
        o 'DEFAULT',                                -> new ExportSpecifier LOC(1)(new DefaultLiteral $1)
        o 'DEFAULT AS Identifier',                  -> new ExportSpecifier LOC(1)(new DefaultLiteral($1)), $3
      ]
  • §

    Ordinary function invocation, or a chained series of calls.

      Invocation: [
        o 'Value OptFuncExist String',              -> new TaggedTemplateCall $1, $3, $2.soak
        o 'Value OptFuncExist Arguments',           -> new Call $1, $3, $2.soak
        o 'SUPER OptFuncExist Arguments',           -> new SuperCall LOC(1)(new Super), $3, $2.soak, $1
        o 'DYNAMIC_IMPORT Arguments',               -> new DynamicImportCall LOC(1)(new DynamicImport), $2
      ]
  • §

    An optional existence check on a function.

      OptFuncExist: [
        o '',                                       -> soak: no
        o 'FUNC_EXIST',                             -> soak: yes
      ]
  • §

    The list of arguments to a function call.

      Arguments: [
        o 'CALL_START CALL_END',                    -> []
        o 'CALL_START ArgList OptComma CALL_END',   -> $2.implicit = $1.generated; $2
      ]
  • §

    A reference to the this current object.

      This: [
        o 'THIS',                                   -> new Value new ThisLiteral $1
        o '@',                                      -> new Value new ThisLiteral $1
      ]
  • §

    A reference to a property on this.

      ThisProperty: [
        o '@ Property',                             -> new Value LOC(1)(new ThisLiteral $1), [LOC(2)(new Access($2))], 'this'
      ]
  • §

    The array literal.

      Array: [
        o '[ ]',                                    -> new Arr []
        o '[ Elisions ]',                           -> new Arr $2
        o '[ ArgElisionList OptElisions ]',         -> new Arr [].concat $2, $3
      ]
  • §

    Inclusive and exclusive range dots.

      RangeDots: [
        o '..',                                     -> exclusive: no
        o '...',                                    -> exclusive: yes
      ]
  • §

    The CoffeeScript range literal.

      Range: [
        o '[ Expression RangeDots Expression ]',      -> new Range $2, $4, if $3.exclusive then 'exclusive' else 'inclusive'
        o '[ ExpressionLine RangeDots Expression ]',  -> new Range $2, $4, if $3.exclusive then 'exclusive' else 'inclusive'
      ]
  • §

    Array slice literals.

      Slice: [
        o 'Expression RangeDots Expression',        -> new Range $1, $3, if $2.exclusive then 'exclusive' else 'inclusive'
        o 'Expression RangeDots',                   -> new Range $1, null, if $2.exclusive then 'exclusive' else 'inclusive'
        o 'ExpressionLine RangeDots Expression',    -> new Range $1, $3, if $2.exclusive then 'exclusive' else 'inclusive'
        o 'ExpressionLine RangeDots',               -> new Range $1, null, if $2.exclusive then 'exclusive' else 'inclusive'
        o 'RangeDots Expression',                   -> new Range null, $2, if $1.exclusive then 'exclusive' else 'inclusive'
        o 'RangeDots',                              -> new Range null, null, if $1.exclusive then 'exclusive' else 'inclusive'
      ]
  • §

    The ArgList is the list of objects passed into a function call (i.e. comma-separated expressions). Newlines work as well.

      ArgList: [
        o 'Arg',                                              -> [$1]
        o 'ArgList , Arg',                                    -> $1.concat $3
        o 'ArgList OptComma TERMINATOR Arg',                  -> $1.concat $4
        o 'INDENT ArgList OptComma OUTDENT',                  -> $2
        o 'ArgList OptComma INDENT ArgList OptComma OUTDENT', -> $1.concat $4
      ]
  • §

    Valid arguments are Blocks or Splats.

      Arg: [
        o 'Expression'
        o 'ExpressionLine'
        o 'Splat'
        o '...',                                     -> new Expansion
      ]
  • §

    The ArgElisionList is the list of objects, contents of an array literal (i.e. comma-separated expressions and elisions). Newlines work as well.

      ArgElisionList: [
        o 'ArgElision'
        o 'ArgElisionList , ArgElision',                                          -> $1.concat $3
        o 'ArgElisionList OptComma TERMINATOR ArgElision',                        -> $1.concat $4
        o 'INDENT ArgElisionList OptElisions OUTDENT',                            -> $2.concat $3
        o 'ArgElisionList OptElisions INDENT ArgElisionList OptElisions OUTDENT', -> $1.concat $2, $4, $5
      ]
    
      ArgElision: [
        o 'Arg',                  -> [$1]
        o 'Elisions Arg',         -> $1.concat $2
      ]
    
      OptElisions: [
        o 'OptComma',             -> []
        o ', Elisions',           -> [].concat $2
      ]
    
      Elisions: [
        o 'Elision',              -> [$1]
        o 'Elisions Elision',     -> $1.concat $2
      ]
    
      Elision: [
        o ',',                    -> new Elision
        o 'Elision TERMINATOR',   -> $1
      ]
  • §

    Just simple, comma-separated, required arguments (no fancy syntax). We need this to be separate from the ArgList for use in Switch blocks, where having the newlines wouldn’t make sense.

      SimpleArgs: [
        o 'Expression'
        o 'ExpressionLine'
        o 'SimpleArgs , Expression',                -> [].concat $1, $3
        o 'SimpleArgs , ExpressionLine',            -> [].concat $1, $3
      ]
  • §

    The variants of try/catch/finally exception handling blocks.

      Try: [
        o 'TRY Block',                              -> new Try $2
        o 'TRY Block Catch',                        -> new Try $2, $3
        o 'TRY Block FINALLY Block',                -> new Try $2, null, $4, LOC(3)(new Literal $3)
        o 'TRY Block Catch FINALLY Block',          -> new Try $2, $3, $5, LOC(4)(new Literal $4)
      ]
  • §

    A catch clause names its error and runs a block of code.

      Catch: [
        o 'CATCH Identifier Block',                 -> new Catch $3, $2
        o 'CATCH Object Block',                     -> new Catch $3, LOC(2)(new Value($2))
        o 'CATCH Block',                            -> new Catch $2
      ]
  • §

    Throw an exception object.

      Throw: [
        o 'THROW Expression',                       -> new Throw $2
        o 'THROW INDENT Object OUTDENT',            -> new Throw new Value $3
      ]
  • §

    Parenthetical expressions. Note that the Parenthetical is a Value, not an Expression, so if you need to use an expression in a place where only values are accepted, wrapping it in parentheses will always do the trick.

      Parenthetical: [
        o '( Body )',                               -> new Parens $2
        o '( INDENT Body OUTDENT )',                -> new Parens $3
      ]
  • §

    The condition portion of a while loop.

      WhileLineSource: [
        o 'WHILE ExpressionLine',                       -> new While $2
        o 'WHILE ExpressionLine WHEN ExpressionLine',   -> new While $2, guard: $4
        o 'UNTIL ExpressionLine',                       -> new While $2, invert: true
        o 'UNTIL ExpressionLine WHEN ExpressionLine',   -> new While $2, invert: true, guard: $4
      ]
    
      WhileSource: [
        o 'WHILE Expression',                       -> new While $2
        o 'WHILE Expression WHEN Expression',       -> new While $2, guard: $4
        o 'WHILE ExpressionLine WHEN Expression',   -> new While $2, guard: $4
        o 'UNTIL Expression',                       -> new While $2, invert: true
        o 'UNTIL Expression WHEN Expression',       -> new While $2, invert: true, guard: $4
        o 'UNTIL ExpressionLine WHEN Expression',   -> new While $2, invert: true, guard: $4
      ]
  • §

    The while loop can either be normal, with a block of expressions to execute, or postfix, with a single expression. There is no do..while.

      While: [
        o 'WhileSource Block',                      -> $1.addBody $2
        o 'WhileLineSource Block',                  -> $1.addBody $2
        o 'Statement  WhileSource',                 -> (Object.assign $2, postfix: yes).addBody LOC(1) Block.wrap([$1])
        o 'Expression WhileSource',                 -> (Object.assign $2, postfix: yes).addBody LOC(1) Block.wrap([$1])
        o 'Loop',                                   -> $1
      ]
    
      Loop: [
        o 'LOOP Block',                             -> new While(LOC(1)(new BooleanLiteral 'true'), isLoop: yes).addBody $2
        o 'LOOP Expression',                        -> new While(LOC(1)(new BooleanLiteral 'true'), isLoop: yes).addBody LOC(2) Block.wrap [$2]
      ]
  • §

    Array, object, and range comprehensions, at the most generic level. Comprehensions can either be normal, with a block of expressions to execute, or postfix, with a single expression.

      For: [
        o 'Statement    ForBody',  -> $2.postfix = yes; $2.addBody $1
        o 'Expression   ForBody',  -> $2.postfix = yes; $2.addBody $1
        o 'ForBody      Block',    -> $1.addBody $2
        o 'ForLineBody  Block',    -> $1.addBody $2
      ]
    
      ForBody: [
        o 'FOR Range',                -> new For [], source: (LOC(2) new Value($2))
        o 'FOR Range BY Expression',  -> new For [], source: (LOC(2) new Value($2)), step: $4
        o 'ForStart ForSource',       -> $1.addSource $2
      ]
    
      ForLineBody: [
        o 'FOR Range BY ExpressionLine',  -> new For [], source: (LOC(2) new Value($2)), step: $4
        o 'ForStart ForLineSource',       -> $1.addSource $2
      ]
    
      ForStart: [
        o 'FOR ForVariables',        -> new For [], name: $2[0], index: $2[1]
        o 'FOR AWAIT ForVariables',  ->
            [name, index] = $3
            new For [], {name, index, await: yes, awaitTag: (LOC(2) new Literal($2))}
        o 'FOR OWN ForVariables',    ->
            [name, index] = $3
            new For [], {name, index, own: yes, ownTag: (LOC(2) new Literal($2))}
      ]
  • §

    An array of all accepted values for a variable inside the loop. This enables support for pattern matching.

      ForValue: [
        o 'Identifier'
        o 'ThisProperty'
        o 'Array',                                  -> new Value $1
        o 'Object',                                 -> new Value $1
      ]
  • §

    An array or range comprehension has variables for the current element and (optional) reference to the current index. Or, key, value, in the case of object comprehensions.

      ForVariables: [
        o 'ForValue',                               -> [$1]
        o 'ForValue , ForValue',                    -> [$1, $3]
      ]
  • §

    The source of a comprehension is an array or object with an optional guard clause. If it’s an array comprehension, you can also choose to step through in fixed-size increments.

      ForSource: [
        o 'FORIN Expression',                                           -> source: $2
        o 'FOROF Expression',                                           -> source: $2, object: yes
        o 'FORIN Expression WHEN Expression',                           -> source: $2, guard: $4
        o 'FORIN ExpressionLine WHEN Expression',                       -> source: $2, guard: $4
        o 'FOROF Expression WHEN Expression',                           -> source: $2, guard: $4, object: yes
        o 'FOROF ExpressionLine WHEN Expression',                       -> source: $2, guard: $4, object: yes
        o 'FORIN Expression BY Expression',                             -> source: $2, step:  $4
        o 'FORIN ExpressionLine BY Expression',                         -> source: $2, step:  $4
        o 'FORIN Expression WHEN Expression BY Expression',             -> source: $2, guard: $4, step: $6
        o 'FORIN ExpressionLine WHEN Expression BY Expression',         -> source: $2, guard: $4, step: $6
        o 'FORIN Expression WHEN ExpressionLine BY Expression',         -> source: $2, guard: $4, step: $6
        o 'FORIN ExpressionLine WHEN ExpressionLine BY Expression',     -> source: $2, guard: $4, step: $6
        o 'FORIN Expression BY Expression WHEN Expression',             -> source: $2, step:  $4, guard: $6
        o 'FORIN ExpressionLine BY Expression WHEN Expression',         -> source: $2, step:  $4, guard: $6
        o 'FORIN Expression BY ExpressionLine WHEN Expression',         -> source: $2, step:  $4, guard: $6
        o 'FORIN ExpressionLine BY ExpressionLine WHEN Expression',     -> source: $2, step:  $4, guard: $6
        o 'FORFROM Expression',                                         -> source: $2, from: yes
        o 'FORFROM Expression WHEN Expression',                         -> source: $2, guard: $4, from: yes
        o 'FORFROM ExpressionLine WHEN Expression',                     -> source: $2, guard: $4, from: yes
      ]
    
      ForLineSource: [
        o 'FORIN ExpressionLine',                                       -> source: $2
        o 'FOROF ExpressionLine',                                       -> source: $2, object: yes
        o 'FORIN Expression WHEN ExpressionLine',                       -> source: $2, guard: $4
        o 'FORIN ExpressionLine WHEN ExpressionLine',                   -> source: $2, guard: $4
        o 'FOROF Expression WHEN ExpressionLine',                       -> source: $2, guard: $4, object: yes
        o 'FOROF ExpressionLine WHEN ExpressionLine',                   -> source: $2, guard: $4, object: yes
        o 'FORIN Expression BY ExpressionLine',                         -> source: $2, step:  $4
        o 'FORIN ExpressionLine BY ExpressionLine',                     -> source: $2, step:  $4
        o 'FORIN Expression WHEN Expression BY ExpressionLine',         -> source: $2, guard: $4, step: $6
        o 'FORIN ExpressionLine WHEN Expression BY ExpressionLine',     -> source: $2, guard: $4, step: $6
        o 'FORIN Expression WHEN ExpressionLine BY ExpressionLine',     -> source: $2, guard: $4, step: $6
        o 'FORIN ExpressionLine WHEN ExpressionLine BY ExpressionLine', -> source: $2, guard: $4, step: $6
        o 'FORIN Expression BY Expression WHEN ExpressionLine',         -> source: $2, step:  $4, guard: $6
        o 'FORIN ExpressionLine BY Expression WHEN ExpressionLine',     -> source: $2, step:  $4, guard: $6
        o 'FORIN Expression BY ExpressionLine WHEN ExpressionLine',     -> source: $2, step:  $4, guard: $6
        o 'FORIN ExpressionLine BY ExpressionLine WHEN ExpressionLine', -> source: $2, step:  $4, guard: $6
        o 'FORFROM ExpressionLine',                                     -> source: $2, from: yes
        o 'FORFROM Expression WHEN ExpressionLine',                     -> source: $2, guard: $4, from: yes
        o 'FORFROM ExpressionLine WHEN ExpressionLine',                 -> source: $2, guard: $4, from: yes
      ]
    
      Switch: [
        o 'SWITCH Expression INDENT Whens OUTDENT',                -> new Switch $2, $4
        o 'SWITCH ExpressionLine INDENT Whens OUTDENT',            -> new Switch $2, $4
        o 'SWITCH Expression INDENT Whens ELSE Block OUTDENT',     -> new Switch $2, $4, LOC(5,6) $6
        o 'SWITCH ExpressionLine INDENT Whens ELSE Block OUTDENT', -> new Switch $2, $4, LOC(5,6) $6
        o 'SWITCH INDENT Whens OUTDENT',                           -> new Switch null, $3
        o 'SWITCH INDENT Whens ELSE Block OUTDENT',                -> new Switch null, $3, LOC(4,5) $5
      ]
    
      Whens: [
        o 'When',                                   -> [$1]
        o 'Whens When',                             -> $1.concat $2
      ]
  • §

    An individual When clause, with action.

      When: [
        o 'LEADING_WHEN SimpleArgs Block',            -> new SwitchWhen $2, $3
        o 'LEADING_WHEN SimpleArgs Block TERMINATOR', -> LOC(1, 3) new SwitchWhen $2, $3
      ]
  • §

    The most basic form of if is a condition and an action. The following if-related rules are broken up along these lines in order to avoid ambiguity.

      IfBlock: [
        o 'IF Expression Block',                    -> new If $2, $3, type: $1
        o 'IfBlock ELSE IF Expression Block',       -> $1.addElse LOC(3,5) new If $4, $5, type: $3
      ]
  • §

    The full complement of if expressions, including postfix one-liner if and unless.

      If: [
        o 'IfBlock'
        o 'IfBlock ELSE Block',                     -> $1.addElse $3
        o 'Statement  POST_IF Expression',          -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true
        o 'Expression POST_IF Expression',          -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true
      ]
    
      IfBlockLine: [
        o 'IF ExpressionLine Block',                  -> new If $2, $3, type: $1
        o 'IfBlockLine ELSE IF ExpressionLine Block', -> $1.addElse LOC(3,5) new If $4, $5, type: $3
      ]
    
      IfLine: [
        o 'IfBlockLine'
        o 'IfBlockLine ELSE Block',               -> $1.addElse $3
        o 'Statement  POST_IF ExpressionLine',    -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true
        o 'Expression POST_IF ExpressionLine',    -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true
      ]
  • §

    Arithmetic and logical operators, working on one or more operands. Here they are grouped by order of precedence. The actual precedence rules are defined at the bottom of the page. It would be shorter if we could combine most of these rules into a single generic Operand OpSymbol Operand -type rule, but in order to make the precedence binding possible, separate rules are necessary.

      OperationLine: [
        o 'UNARY ExpressionLine',                   -> new Op $1, $2
        o 'DO ExpressionLine',                      -> new Op $1, $2
        o 'DO_IIFE CodeLine',                       -> new Op $1, $2
      ]
    
      Operation: [
        o 'UNARY Expression',                       -> new Op $1.toString(), $2, undefined, undefined, originalOperator: $1.original
        o 'DO Expression',                          -> new Op $1, $2
        o 'UNARY_MATH Expression',                  -> new Op $1, $2
        o '-     Expression',                      (-> new Op '-', $2), prec: 'UNARY_MATH'
        o '+     Expression',                      (-> new Op '+', $2), prec: 'UNARY_MATH'
    
        o 'AWAIT Expression',                       -> new Op $1, $2
        o 'AWAIT INDENT Object OUTDENT',            -> new Op $1, $3
    
        o '-- SimpleAssignable',                    -> new Op '--', $2
        o '++ SimpleAssignable',                    -> new Op '++', $2
        o 'SimpleAssignable --',                    -> new Op '--', $1, null, true
        o 'SimpleAssignable ++',                    -> new Op '++', $1, null, true
  •     o 'Expression ?',                           -> new Existence $1
    
        o 'Expression +  Expression',               -> new Op '+' , $1, $3
        o 'Expression -  Expression',               -> new Op '-' , $1, $3
    
        o 'Expression MATH     Expression',         -> new Op $2, $1, $3
        o 'Expression **       Expression',         -> new Op $2, $1, $3
        o 'Expression SHIFT    Expression',         -> new Op $2, $1, $3
        o 'Expression COMPARE  Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original
        o 'Expression &        Expression',         -> new Op $2, $1, $3
        o 'Expression ^        Expression',         -> new Op $2, $1, $3
        o 'Expression |        Expression',         -> new Op $2, $1, $3
        o 'Expression &&       Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original
        o 'Expression ||       Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original
        o 'Expression BIN?     Expression',         -> new Op $2, $1, $3
        o 'Expression RELATION Expression',         -> new Op $2.toString(), $1, $3, undefined, invertOperator: $2.invert?.original ? $2.invert
    
        o 'SimpleAssignable COMPOUND_ASSIGN
           Expression',                             -> new Assign $1, $3, $2.toString(), originalContext: $2.original
        o 'SimpleAssignable COMPOUND_ASSIGN
           INDENT Expression OUTDENT',              -> new Assign $1, $4, $2.toString(), originalContext: $2.original
        o 'SimpleAssignable COMPOUND_ASSIGN TERMINATOR
           Expression',                             -> new Assign $1, $4, $2.toString(), originalContext: $2.original
      ]
    
      DoIife: [
        o 'DO_IIFE Code',                           -> new Op $1 , $2
      ]
  • §

    Precedence

  • §
  • §

    Operators at the top of this list have higher precedence than the ones lower down. Following these rules is what makes 2 + 3 * 4 parse as:

    2 + (3 * 4)
    

    And not:

    (2 + 3) * 4
    
    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']
    ]
  • §

    Wrapping Up

  • §
  • §

    Finally, now that we have our grammar and our operators, we can create our Jison.Parser. We do this by processing all of our rules, recording all terminals (every symbol which does not appear as the name of a rule above) as “tokens”.

    tokens = []
    for name, alternatives of grammar
      grammar[name] = for alt in alternatives
        for token in alt[0].split ' '
          tokens.push token unless grammar[token]
        alt[1] = "return #{alt[1]}" if name is 'Root'
        alt
  • §

    Initialize the Parser with our list of terminal tokens, our grammar rules, and the name of the root. Reverse the operators because Jison orders precedence from low to high, and we have it high to low (as in Yacc).

    exports.parser = new Parser
      tokens      : tokens.join ' '
      bnf         : grammar
      operators   : operators.reverse()
      startSymbol : 'Root'
================================================ FILE: docs/v2/annotated-source/helpers.html ================================================ helpers.coffee
  • helpers.coffee

  • §

    This file contains the common helper functions that we’d like to share among the Lexer, Rewriter, and the Nodes. Merge objects, flatten arrays, count characters, that sort of thing.

  • §

    Peek at the beginning of a given string to see if it matches a sequence.

    exports.starts = (string, literal, start) ->
      literal is string.substr start, literal.length
  • §

    Peek at the end of a given string to see if it matches a sequence.

    exports.ends = (string, literal, back) ->
      len = literal.length
      literal is string.substr string.length - len - (back or 0), len
  • §

    Repeat a string n times.

    exports.repeat = repeat = (str, n) ->
  • §

    Use clever algorithm to have O(log(n)) string concatenation operations.

      res = ''
      while n > 0
        res += str if n & 1
        n >>>= 1
        str += str
      res
  • §

    Trim out all falsy values from an array.

    exports.compact = (array) ->
      item for item in array when item
  • §

    Count the number of occurrences of a string in a string.

    exports.count = (string, substr) ->
      num = pos = 0
      return 1/0 unless substr.length
      num++ while pos = 1 + string.indexOf substr, pos
      num
  • §

    Merge objects, returning a fresh copy with attributes from both sides. Used every time Base#compile is called, to allow properties in the options hash to propagate down the tree without polluting other branches.

    exports.merge = (options, overrides) ->
      extend (extend {}, options), overrides
  • §

    Extend a source object with the properties of another object (shallow copy).

    extend = exports.extend = (object, properties) ->
      for key, val of properties
        object[key] = val
      object
  • §

    Return a flattened version of an array. Handy for getting a list of children from the nodes.

    exports.flatten = flatten = (array) ->
      array.flat(Infinity)
  • §

    Delete a key from an object, returning the value. Useful when a node is looking for a particular method in an options hash.

    exports.del = (obj, key) ->
      val =  obj[key]
      delete obj[key]
      val
  • §

    Typical Array::some

    exports.some = Array::some ? (fn) ->
      return true for e in this when fn e
      false
  • §

    Helper function for extracting code from Literate CoffeeScript by stripping out all non-code blocks, producing a string of CoffeeScript code that can be compiled “normally.”

    exports.invertLiterate = (code) ->
      out = []
      blankLine = /^\s*$/
      indented = /^[\t ]/
      listItemStart = /// ^
        (?:\t?|\ {0,3})   # Up to one tab, or up to three spaces, or neither;
        (?:
          [\*\-\+] |      # followed by `*`, `-` or `+`;
          [0-9]{1,9}\.    # or by an integer up to 9 digits long, followed by a period;
        )
        [\ \t]            # followed by a space or a tab.
      ///
      insideComment = no
      for line in code.split('\n')
        if blankLine.test(line)
          insideComment = no
          out.push line
        else if insideComment or listItemStart.test(line)
          insideComment = yes
          out.push "# #{line}"
        else if not insideComment and indented.test(line)
          out.push line
        else
          insideComment = yes
          out.push "# #{line}"
      out.join '\n'
  • §

    Merge two jison-style location data objects together. If last is not provided, this will simply return first.

    buildLocationData = (first, last) ->
      if not last
        first
      else
        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]
        ]
  • §

    Build a list of all comments attached to tokens.

    exports.extractAllCommentTokens = (tokens) ->
      allCommentsObj = {}
      for token in tokens when token.comments
        for comment in token.comments
          commentKey = comment.locationData.range[0]
          allCommentsObj[commentKey] = comment
      sortedKeys = Object.keys(allCommentsObj).sort (a, b) -> a - b
      for key in sortedKeys
        allCommentsObj[key]
  • §

    Get a lookup hash for a token based on its location data. Multiple tokens might have the same location hash, but using exclusive location data distinguishes e.g. zero-length generated tokens from actual source tokens.

    buildLocationHash = (loc) ->
      "#{loc.range[0]}-#{loc.range[1]}"
  • §

    Build a dictionary of extra token properties organized by tokens’ locations used as lookup hashes.

    exports.buildTokenDataDictionary = buildTokenDataDictionary = (tokens) ->
      tokenData = {}
      for token in tokens when token.comments
        tokenHash = buildLocationHash token[2]
  • §

    Multiple tokens might have the same location hash, such as the generated JS tokens added at the start or end of the token stream to hold comments that start or end a file.

        tokenData[tokenHash] ?= {}
        if token.comments # `comments` is always an array.
  • §

    For “overlapping” tokens, that is tokens with the same location data and therefore matching tokenHashes, merge the comments from both/all tokens together into one array, even if there are duplicate comments; they will get sorted out later.

          (tokenData[tokenHash].comments ?= []).push token.comments...
      tokenData
  • §

    This returns a function which takes an object as a parameter, and if that object is an AST node, updates that object’s locationData. The object is returned either way.

    exports.addDataToNode = (parserState, firstLocationData, firstValue, lastLocationData, lastValue, forceUpdateLocation = yes) ->
      (obj) ->
  • §

    Add location data.

        locationData = buildLocationData(firstValue?.locationData ? firstLocationData, lastValue?.locationData ? lastLocationData)
        if obj?.updateLocationDataIfMissing? and firstLocationData?
          obj.updateLocationDataIfMissing locationData, forceUpdateLocation
        else
          obj.locationData = locationData
  • §

    Add comments, building the dictionary of token data if it hasn’t been built yet.

        parserState.tokenData ?= buildTokenDataDictionary parserState.parser.tokens
        if obj.locationData?
          objHash = buildLocationHash obj.locationData
          if parserState.tokenData[objHash]?.comments?
            attachCommentsToNode parserState.tokenData[objHash].comments, obj
        obj
    
    exports.attachCommentsToNode = attachCommentsToNode = (comments, node) ->
      return if not comments? or comments.length is 0
      node.comments ?= []
      node.comments.push comments...
  • §

    Convert jison location data to a string. obj can be a token, or a locationData.

    exports.locationDataToString = (obj) ->
      if ("2" of obj) and ("first_line" of obj[2]) then locationData = obj[2]
      else if "first_line" of obj then locationData = obj
    
      if locationData
        "#{locationData.first_line + 1}:#{locationData.first_column + 1}-" +
        "#{locationData.last_line + 1}:#{locationData.last_column + 1}"
      else
        "No location data"
  • §

    Generate a unique anonymous file name so we can distinguish source map cache entries for any number of anonymous scripts.

    exports.anonymousFileName = do ->
      n = 0
      ->
        "<anonymous-#{n++}>"
  • §

    A .coffee.md compatible version of basename, that returns the file sans-extension.

    exports.baseFileName = (file, stripExt = no, useWinPathSep = no) ->
      pathSep = if useWinPathSep then /\\|\// else /\//
      parts = file.split(pathSep)
      file = parts[parts.length - 1]
      return file unless stripExt and file.indexOf('.') >= 0
      parts = file.split('.')
      parts.pop()
      parts.pop() if parts[parts.length - 1] is 'coffee' and parts.length > 1
      parts.join('.')
  • §

    Determine if a filename represents a CoffeeScript file.

    exports.isCoffee = (file) -> /\.((lit)?coffee|coffee\.md)$/.test file
  • §

    Determine if a filename represents a Literate CoffeeScript file.

    exports.isLiterate = (file) -> /\.(litcoffee|coffee\.md)$/.test file
  • §

    Throws a SyntaxError from a given location. The error’s toString will return an error message following the “standard” format <filename>:<line>:<col>: <message> plus the line with the error and a marker showing where the error is.

    exports.throwSyntaxError = (message, location) ->
      error = new SyntaxError message
      error.location = location
      error.toString = syntaxErrorToString
  • §

    Instead of showing the compiler’s stacktrace, show our custom error message (this is useful when the error bubbles up in Node.js applications that compile CoffeeScript for example).

      error.stack = error.toString()
    
      throw error
  • §

    Update a compiler SyntaxError with source code information if it didn’t have it already.

    exports.updateSyntaxError = (error, code, filename) ->
  • §

    Avoid screwing up the stack property of other errors (i.e. possible bugs).

      if error.toString is syntaxErrorToString
        error.code or= code
        error.filename or= filename
        error.stack = error.toString()
      error
    
    syntaxErrorToString = ->
      return Error::toString.call @ unless @code and @location
    
      {first_line, first_column, last_line, last_column} = @location
      last_line ?= first_line
      last_column ?= first_column
    
      if @filename?.startsWith '<anonymous'
        filename = '[stdin]'
      else
        filename = @filename or '[stdin]'
    
      codeLine = @code.split('\n')[first_line]
      start    = first_column
  • §

    Show only the first line on multi-line errors.

      end      = if first_line is last_line then last_column + 1 else codeLine.length
      marker   = codeLine[...start].replace(/[^\s]/g, ' ') + repeat('^', end - start)
  • §

    Check to see if we’re running on a color-enabled TTY.

      if process?
        colorsEnabled = process.stdout?.isTTY and not process.env?.NODE_DISABLE_COLORS
    
      if @colorful ? colorsEnabled
        colorize = (str) -> "\x1B[1;31m#{str}\x1B[0m"
        codeLine = codeLine[...start] + colorize(codeLine[start...end]) + codeLine[end..]
        marker   = colorize marker
    
      """
        #{filename}:#{first_line + 1}:#{first_column + 1}: error: #{@message}
        #{codeLine}
        #{marker}
      """
    
    exports.nameWhitespaceCharacter = (string) ->
      switch string
        when ' ' then 'space'
        when '\n' then 'newline'
        when '\r' then 'carriage return'
        when '\t' then 'tab'
        else string
    
    exports.parseNumber = (string) ->
      return NaN unless string?
    
      base = switch string.charAt 1
        when 'b' then 2
        when 'o' then 8
        when 'x' then 16
        else null
    
      if base?
        parseInt string[2..].replace(/_/g, ''), base
      else
        parseFloat string.replace(/_/g, '')
    
    exports.isFunction = (obj) -> Object::toString.call(obj) is '[object Function]'
    exports.isNumber = isNumber = (obj) -> Object::toString.call(obj) is '[object Number]'
    exports.isString = isString = (obj) -> Object::toString.call(obj) is '[object String]'
    exports.isBoolean = isBoolean = (obj) -> obj is yes or obj is no or Object::toString.call(obj) is '[object Boolean]'
    exports.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)
    
    unicodeCodePointToUnicodeEscapes = (codePoint) ->
      toUnicodeEscape = (val) ->
        str = val.toString 16
        "\\u#{repeat '0', 4 - str.length}#{str}"
      return toUnicodeEscape(codePoint) if codePoint < 0x10000
  • §

    surrogate pair

      high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800
      low = (codePoint - 0x10000) % 0x400 + 0xDC00
      "#{toUnicodeEscape(high)}#{toUnicodeEscape(low)}"
  • §

    Replace \u{...} with \uxxxx[\uxxxx] in regexes without u flag

    exports.replaceUnicodeCodePointEscapes = (str, {flags, error, delimiter = ''} = {}) ->
      shouldReplace = flags? and 'u' not in flags
      str.replace UNICODE_CODE_POINT_ESCAPE, (match, escapedBackslash, codePointHex, offset) ->
        return escapedBackslash if escapedBackslash
    
        codePointDecimal = parseInt codePointHex, 16
        if codePointDecimal > 0x10ffff
          error "unicode code point escapes greater than \\u{10ffff} are not allowed",
            offset: offset + delimiter.length
            length: codePointHex.length + 4
        return match unless shouldReplace
    
        unicodeCodePointToUnicodeEscapes codePointDecimal
    
    UNICODE_CODE_POINT_ESCAPE = ///
      ( \\\\ )        # Make sure the escape isn’t escaped.
      |
      \\u\{ ( [\da-fA-F]+ ) \}
    ///g
================================================ FILE: docs/v2/annotated-source/index.html ================================================ index.coffee
  • index.coffee

  • §

    Node.js Implementation

    CoffeeScript  = require './coffeescript'
    fs            = require 'fs'
    vm            = require 'vm'
    path          = require 'path'
    
    helpers       = CoffeeScript.helpers
    
    CoffeeScript.transpile = (js, options) ->
      try
        babel = require '@babel/core'
      catch
        try
          babel = require 'babel-core'
        catch
  • §

    This error is only for Node, as CLI users will see a different error earlier if they don’t have Babel installed.

          throw new Error 'To use the transpile option, you must have the \'@babel/core\' module installed'
      babel.transform js, options
  • §

    The compile method shared by the CLI, Node and browser APIs.

    universalCompile = CoffeeScript.compile
  • §

    The compile method particular to the Node API.

    CoffeeScript.compile = (code, options) ->
  • §

    Pass a reference to Babel into the compiler, so that the transpile option is available in the Node API. We need to do this so that tools like Webpack can require('coffeescript') and build correctly, without trying to require Babel.

      if options?.transpile
        options.transpile.transpile = CoffeeScript.transpile
      universalCompile.call CoffeeScript, code, options
  • §

    Compile and execute a string of CoffeeScript (on the server), correctly setting __filename, __dirname, and relative require().

    CoffeeScript.run = (code, options = {}) ->
      mainModule = require.main
  • §

    Set the filename.

      mainModule.filename = process.argv[1] =
        if options.filename then fs.realpathSync(options.filename) else helpers.anonymousFileName()
  • §

    Clear the module cache.

      mainModule.moduleCache and= {}
  • §

    Assign paths for node_modules loading

      dir = if options.filename?
        path.dirname fs.realpathSync options.filename
      else
        fs.realpathSync '.'
      mainModule.paths = require('module')._nodeModulePaths dir
  • §

    Save the options for compiling child imports.

      mainModule.options = options
    
      options.filename = mainModule.filename
      options.inlineMap = true
  • §

    Compile.

      answer = CoffeeScript.compile code, options
      code = answer.js ? answer
    
      mainModule._compile code, mainModule.filename
  • §

    Compile and evaluate a string of CoffeeScript (in a Node.js-like environment). The CoffeeScript REPL uses this to run the input.

    CoffeeScript.eval = (code, options = {}) ->
      return unless code = code.trim()
      createContext = vm.Script.createContext ? vm.createContext
    
      isContext = vm.isContext ? (ctx) ->
        options.sandbox instanceof createContext().constructor
    
      if createContext
        if options.sandbox?
          if isContext options.sandbox
            sandbox = options.sandbox
          else
            sandbox = createContext()
            sandbox[k] = v for own k, v of options.sandbox
          sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox
        else
          sandbox = global
        sandbox.__filename = options.filename || 'eval'
        sandbox.__dirname  = path.dirname sandbox.__filename
  • §

    define module/require only if they chose not to specify their own

        unless sandbox isnt global or sandbox.module or sandbox.require
          Module = require 'module'
          sandbox.module  = _module  = new Module(options.modulename || 'eval')
          sandbox.require = _require = (path) ->  Module._load path, _module, true
          _module.filename = sandbox.__filename
          for r in Object.getOwnPropertyNames require when r not in ['paths', 'arguments', 'caller']
            _require[r] = require[r]
  • §

    use the same hack node currently uses for their own REPL

          _require.paths = _module.paths = Module._nodeModulePaths process.cwd()
          _require.resolve = (request) -> Module._resolveFilename request, _module
      o = {}
      o[k] = v for own k, v of options
      o.bare = on # ensure return value
      js = CoffeeScript.compile code, o
      if sandbox is global
        vm.runInThisContext js
      else
        vm.runInContext js, sandbox
    
    CoffeeScript.register = -> require './register'
  • §

    Throw error with deprecation warning when depending upon implicit require.extensions registration

    if require.extensions
      for ext in CoffeeScript.FILE_EXTENSIONS then do (ext) ->
        require.extensions[ext] ?= ->
          throw new Error """
          Use CoffeeScript.register() or require the coffeescript/register module to require #{ext} files.
          """
    
    CoffeeScript._compileRawFileContent = (raw, filename, options = {}) ->
  • §

    Strip the Unicode byte order mark, if this file begins with one.

      stripped = if raw.charCodeAt(0) is 0xFEFF then raw.substring 1 else raw
    
      options = Object.assign {}, options,
        filename: filename
        literate: helpers.isLiterate filename
        sourceFiles: [filename]
    
      try
        answer = CoffeeScript.compile stripped, options
      catch err
  • §

    As the filename and code of a dynamically loaded file will be different from the original file compiled with CoffeeScript.run, add that information to error so it can be pretty-printed later.

        throw helpers.updateSyntaxError err, stripped, filename
    
      answer
    
    CoffeeScript._compileFile = (filename, options = {}) ->
      raw = fs.readFileSync filename, 'utf8'
    
      CoffeeScript._compileRawFileContent raw, filename, options
    
    module.exports = CoffeeScript
  • §

    Explicitly define all named exports so that Node’s automatic detection of named exports from CommonJS packages finds all of them. This enables consuming packages to write code like import { compile } from 'coffeescript'. Don’t simplify this into a loop or similar; the module.exports.name part is essential for Node’s algorithm to successfully detect the name.

    module.exports.VERSION = CoffeeScript.VERSION
    module.exports.FILE_EXTENSIONS = CoffeeScript.FILE_EXTENSIONS
    module.exports.helpers = CoffeeScript.helpers
    module.exports.registerCompiled = CoffeeScript.registerCompiled
    module.exports.compile = CoffeeScript.compile
    module.exports.tokens = CoffeeScript.tokens
    module.exports.nodes = CoffeeScript.nodes
    module.exports.register = CoffeeScript.register
    module.exports.eval = CoffeeScript.eval
    module.exports.run = CoffeeScript.run
    module.exports.transpile = CoffeeScript.transpile
    module.exports.patchStackTrace = CoffeeScript.patchStackTrace
    module.exports._compileRawFileContent = CoffeeScript._compileRawFileContent
    module.exports._compileFile = CoffeeScript._compileFile
================================================ FILE: docs/v2/annotated-source/lexer.html ================================================ lexer.coffee
  • lexer.coffee

  • §

    The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt matches against the beginning of the source code. When a match is found, a token is produced, we consume the match, and start again. Tokens are in the form:

    [tag, value, locationData]
    

    where locationData is {first_line, first_column, last_line, last_column, last_line_exclusive, last_column_exclusive}, which is a format that can be fed directly into Jison. These are read by jison in the parser.lexer function defined in coffeescript.coffee.

    {Rewriter, INVERSES, UNFINISHED} = require './rewriter'
  • §

    Import the helpers we need.

    {count, starts, compact, repeat, invertLiterate, merge,
    attachCommentsToNode, locationDataToString, throwSyntaxError
    replaceUnicodeCodePointEscapes, flatten, parseNumber} = require './helpers'
  • §

    The Lexer Class

  • §
  • §

    The Lexer class reads a stream of CoffeeScript and divvies it up into tagged tokens. Some potential ambiguity in the grammar has been avoided by pushing some extra smarts into the Lexer.

    exports.Lexer = class Lexer
  • §

    tokenize is the Lexer’s main method. Scan by attempting to match tokens one at a time, using a regular expression anchored at the start of the remaining code, or a custom recursive token-matching method (for interpolations). When the next token has been recorded, we move forward within the code past the token, and begin again.

    Each tokenizing method is responsible for returning the number of characters it has consumed.

    Before returning the token stream, run it through the Rewriter.

      tokenize: (code, opts = {}) ->
        @literate   = opts.literate  # Are we lexing literate CoffeeScript?
        @indent     = 0              # The current indentation level.
        @baseIndent = 0              # The overall minimum indentation level.
        @continuationLineAdditionalIndent = 0 # The over-indentation at the current level.
        @outdebt    = 0              # The under-outdentation at the current level.
        @indents    = []             # The stack of all current indentation levels.
        @indentLiteral = ''          # The indentation.
        @ends       = []             # The stack for pairing up tokens.
        @tokens     = []             # Stream of parsed tokens in the form `['TYPE', value, location data]`.
        @seenFor    = no             # Used to recognize `FORIN`, `FOROF` and `FORFROM` tokens.
        @seenImport = no             # Used to recognize `IMPORT FROM? AS?` tokens.
        @seenExport = no             # Used to recognize `EXPORT FROM? AS?` tokens.
        @importSpecifierList = no    # Used to identify when in an `IMPORT {...} FROM? ...`.
        @exportSpecifierList = no    # Used to identify when in an `EXPORT {...} FROM? ...`.
        @jsxDepth = 0                # Used to optimize JSX checks, how deep in JSX we are.
        @jsxObjAttribute = {}        # Used to detect if JSX attributes is wrapped in {} (<div {props...} />).
    
        @chunkLine =
          opts.line or 0             # The start line for the current @chunk.
        @chunkColumn =
          opts.column or 0           # The start column of the current @chunk.
        @chunkOffset =
          opts.offset or 0           # The start offset for the current @chunk.
        @locationDataCompensations =
          opts.locationDataCompensations or {} # The location data compensations for the current @chunk.
        code = @clean code           # The stripped, cleaned original source code.
  • §

    At every position, run through this list of attempted matches, short-circuiting if any of them succeed. Their order determines precedence: @literalToken is the fallback catch-all.

        i = 0
        while @chunk = code[i..]
          consumed = \
               @identifierToken() or
               @commentToken()    or
               @whitespaceToken() or
               @lineToken()       or
               @stringToken()     or
               @numberToken()     or
               @jsxToken()        or
               @regexToken()      or
               @jsToken()         or
               @literalToken()
  • §

    Update position.

          [@chunkLine, @chunkColumn, @chunkOffset] = @getLineAndColumnFromChunk consumed
    
          i += consumed
    
          return {@tokens, index: i} if opts.untilBalanced and @ends.length is 0
    
        @closeIndentation()
        @error "missing #{end.tag}", (end.origin ? end)[2] if end = @ends.pop()
        return @tokens if opts.rewrite is off
        (new Rewriter).rewrite @tokens
  • §

    Preprocess the code to remove leading and trailing whitespace, carriage returns, etc. If we’re lexing literate CoffeeScript, strip external Markdown by removing all lines that aren’t indented by at least four spaces or a tab.

      clean: (code) ->
        thusFar = 0
        if code.charCodeAt(0) is BOM
          code = code.slice 1
          @locationDataCompensations[0] = 1
          thusFar += 1
        if WHITESPACE.test code
          code = "\n#{code}"
          @chunkLine--
          @locationDataCompensations[0] ?= 0
          @locationDataCompensations[0] -= 1
        code = code
          .replace /\r/g, (match, offset) =>
            @locationDataCompensations[thusFar + offset] = 1
            ''
          .replace TRAILING_SPACES, ''
        code = invertLiterate code if @literate
        code
  • §

    Tokenizers

  • §
  • §

    Matches identifying literals: variables, keywords, method names, etc. Check to ensure that JavaScript reserved words aren’t being used as identifiers. Because CoffeeScript reserves a handful of keywords that are allowed in JavaScript, we’re careful not to tag them as keywords when referenced as property names here, so you can still do jQuery.is() even though is means === otherwise.

      identifierToken: ->
        inJSXTag = @atJSXTag()
        regex = if inJSXTag then JSX_ATTRIBUTE else IDENTIFIER
        return 0 unless match = regex.exec @chunk
        [input, id, colon] = match
  • §

    Preserve length of id for location data

        idLength = id.length
        poppedToken = undefined
        if id is 'own' and @tag() is 'FOR'
          @token 'OWN', id
          return id.length
        if id is 'from' and @tag() is 'YIELD'
          @token 'FROM', id
          return id.length
        if id is 'as' and @seenImport
          if @value() is '*'
            @tokens[@tokens.length - 1][0] = 'IMPORT_ALL'
          else if @value(yes) in COFFEE_KEYWORDS
            prev = @prev()
            [prev[0], prev[1]] = ['IDENTIFIER', @value(yes)]
          if @tag() in ['DEFAULT', 'IMPORT_ALL', 'IDENTIFIER']
            @token 'AS', id
            return id.length
        if id is 'as' and @seenExport
          if @tag() in ['IDENTIFIER', 'DEFAULT']
            @token 'AS', id
            return id.length
          if @value(yes) in COFFEE_KEYWORDS
            prev = @prev()
            [prev[0], prev[1]] = ['IDENTIFIER', @value(yes)]
            @token 'AS', id
            return id.length
        if id is 'default' and @seenExport and @tag() in ['EXPORT', 'AS']
          @token 'DEFAULT', id
          return id.length
        if id is 'assert' and (@seenImport or @seenExport) and @tag() is 'STRING'
          @token 'ASSERT', id
          return id.length
        if id is 'do' and regExSuper = /^(\s*super)(?!\(\))/.exec @chunk[3...]
          @token 'SUPER', 'super'
          @token 'CALL_START', '('
          @token 'CALL_END', ')'
          [input, sup] = regExSuper
          return sup.length + 3
    
        prev = @prev()
    
        tag =
          if colon or prev? and
             (prev[0] in ['.', '?.', '::', '?::'] or
             not prev.spaced and prev[0] is '@')
            'PROPERTY'
          else
            'IDENTIFIER'
    
        tokenData = {}
        if tag is 'IDENTIFIER' and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS) and
           not (@exportSpecifierList and id in COFFEE_KEYWORDS)
          tag = id.toUpperCase()
          if tag is 'WHEN' and @tag() in LINE_BREAK
            tag = 'LEADING_WHEN'
          else if tag is 'FOR'
            @seenFor = {endsLength: @ends.length}
          else if tag is 'UNLESS'
            tag = 'IF'
          else if tag is 'IMPORT'
            @seenImport = yes
          else if tag is 'EXPORT'
            @seenExport = yes
          else if tag in UNARY
            tag = 'UNARY'
          else if tag in RELATION
            if tag isnt 'INSTANCEOF' and @seenFor
              tag = 'FOR' + tag
              @seenFor = no
            else
              tag = 'RELATION'
              if @value() is '!'
                poppedToken = @tokens.pop()
                tokenData.invert = poppedToken.data?.original ? poppedToken[1]
        else if tag is 'IDENTIFIER' and @seenFor and id is 'from' and
           isForFrom(prev)
          tag = 'FORFROM'
          @seenFor = no
  • §

    Throw an error on attempts to use get or set as keywords, or what CoffeeScript would normally interpret as calls to functions named get or set, i.e. get({foo: function () {}}).

        else if tag is 'PROPERTY' and prev
          if prev.spaced and prev[0] in CALLABLE and /^[gs]et$/.test(prev[1]) and
             @tokens.length > 1 and @tokens[@tokens.length - 2][0] not in ['.', '?.', '@']
            @error "'#{prev[1]}' cannot be used as a keyword, or as a function call
            without parentheses", prev[2]
          else if prev[0] is '.' and @tokens.length > 1 and (prevprev = @tokens[@tokens.length - 2])[0] is 'UNARY' and prevprev[1] is 'new'
            prevprev[0] = 'NEW_TARGET'
          else if prev[0] is '.' and @tokens.length > 1 and (prevprev = @tokens[@tokens.length - 2])[0] is 'IMPORT' and prevprev[1] is 'import'
            @seenImport = no
            prevprev[0] = 'IMPORT_META'
          else if @tokens.length > 2
            prevprev = @tokens[@tokens.length - 2]
            if prev[0] in ['@', 'THIS'] and prevprev and prevprev.spaced and
               /^[gs]et$/.test(prevprev[1]) and
               @tokens[@tokens.length - 3][0] not in ['.', '?.', '@']
              @error "'#{prevprev[1]}' cannot be used as a keyword, or as a
              function call without parentheses", prevprev[2]
    
        if tag is 'IDENTIFIER' and id in RESERVED and not inJSXTag
          @error "reserved word '#{id}'", length: id.length
    
        unless tag is 'PROPERTY' or @exportSpecifierList or @importSpecifierList
          if id in COFFEE_ALIASES
            alias = id
            id = COFFEE_ALIAS_MAP[id]
            tokenData.original = alias
          tag = switch id
            when '!'                 then 'UNARY'
            when '==', '!='          then 'COMPARE'
            when 'true', 'false'     then 'BOOL'
            when 'break', 'continue', \
                 'debugger'          then 'STATEMENT'
            when '&&', '||'          then id
            else  tag
    
        tagToken = @token tag, id, length: idLength, data: tokenData
        tagToken.origin = [tag, alias, tagToken[2]] if alias
        if poppedToken
          [tagToken[2].first_line, tagToken[2].first_column, tagToken[2].range[0]] =
            [poppedToken[2].first_line, poppedToken[2].first_column, poppedToken[2].range[0]]
        if colon
          colonOffset = input.lastIndexOf if inJSXTag then '=' else ':'
          colonToken = @token ':', ':', offset: colonOffset
          colonToken.jsxColon = yes if inJSXTag # used by rewriter
        if inJSXTag and tag is 'IDENTIFIER' and prev[0] isnt ':'
          @token ',', ',', length: 0, origin: tagToken, generated: yes
    
        input.length
  • §

    Matches numbers, including decimals, hex, and exponential notation. Be careful not to interfere with ranges in progress.

      numberToken: ->
        return 0 unless match = NUMBER.exec @chunk
    
        number = match[0]
        lexedLength = number.length
    
        switch
          when /^0[BOX]/.test number
            @error "radix prefix in '#{number}' must be lowercase", offset: 1
          when /^0\d*[89]/.test number
            @error "decimal literal '#{number}' must not be prefixed with '0'", length: lexedLength
          when /^0\d+/.test number
            @error "octal literal '#{number}' must be prefixed with '0o'", length: lexedLength
    
        parsedValue = parseNumber number
        tokenData = {parsedValue}
    
        tag = if parsedValue is Infinity then 'INFINITY' else 'NUMBER'
        if tag is 'INFINITY'
          tokenData.original = number
        @token tag, number,
          length: lexedLength
          data: tokenData
        lexedLength
  • §

    Matches strings, including multiline strings, as well as heredocs, with or without interpolation.

      stringToken: ->
        [quote] = STRING_START.exec(@chunk) || []
        return 0 unless quote
  • §

    If the preceding token is from and this is an import or export statement, properly tag the from.

        prev = @prev()
        if prev and @value() is 'from' and (@seenImport or @seenExport)
          prev[0] = 'FROM'
    
        regex = switch quote
          when "'"   then STRING_SINGLE
          when '"'   then STRING_DOUBLE
          when "'''" then HEREDOC_SINGLE
          when '"""' then HEREDOC_DOUBLE
    
        {tokens, index: end} = @matchWithInterpolations regex, quote
    
        heredoc = quote.length is 3
        if heredoc
  • §

    Find the smallest indentation. It will be removed from all lines later.

          indent = null
          doc = (token[1] for token, i in tokens when token[0] is 'NEOSTRING').join '#{}'
          while match = HEREDOC_INDENT.exec doc
            attempt = match[1]
            indent = attempt if indent is null or 0 < attempt.length < indent.length
    
        delimiter = quote.charAt(0)
        @mergeInterpolationTokens tokens, {quote, indent, endOffset: end}, (value) =>
          @validateUnicodeCodePointEscapes value, delimiter: quote
    
        if @atJSXTag()
          @token ',', ',', length: 0, origin: @prev, generated: yes
    
        end
  • §

    Matches and consumes comments. The comments are taken out of the token stream and saved for later, to be reinserted into the output after everything has been parsed and the JavaScript code generated.

      commentToken: (chunk = @chunk, {heregex, returnCommentTokens = no, offsetInChunk = 0} = {}) ->
        return 0 unless match = chunk.match COMMENT
        [commentWithSurroundingWhitespace, hereLeadingWhitespace, hereComment, hereTrailingWhitespace, lineComment] = match
        contents = null
  • §

    Does this comment follow code on the same line?

        leadingNewline = /^\s*\n+\s*#/.test commentWithSurroundingWhitespace
        if hereComment
          matchIllegal = HERECOMMENT_ILLEGAL.exec hereComment
          if matchIllegal
            @error "block comments cannot contain #{matchIllegal[0]}",
              offset: '###'.length + matchIllegal.index, length: matchIllegal[0].length
  • §

    Parse indentation or outdentation as if this block comment didn’t exist.

          chunk = chunk.replace "####{hereComment}###", ''
  • §

    Remove leading newlines, like Rewriter::removeLeadingNewlines, to avoid the creation of unwanted TERMINATOR tokens.

          chunk = chunk.replace /^\n+/, ''
          @lineToken {chunk}
  • §

    Pull out the ###-style comment’s content, and format it.

          content = hereComment
          contents = [{
            content
            length: commentWithSurroundingWhitespace.length - hereLeadingWhitespace.length - hereTrailingWhitespace.length
            leadingWhitespace: hereLeadingWhitespace
          }]
        else
  • §

    The COMMENT regex captures successive line comments as one token. Remove any leading newlines before the first comment, but preserve blank lines between line comments.

          leadingNewlines = ''
          content = lineComment.replace /^(\n*)/, (leading) ->
            leadingNewlines = leading
            ''
          precedingNonCommentLines = ''
          hasSeenFirstCommentLine = no
          contents =
            content.split '\n'
            .map (line, index) ->
              unless line.indexOf('#') > -1
                precedingNonCommentLines += "\n#{line}"
                return
              leadingWhitespace = ''
              content = line.replace /^([ |\t]*)#/, (_, whitespace) ->
                leadingWhitespace = whitespace
                ''
              comment = {
                content
                length: '#'.length + content.length
                leadingWhitespace: "#{unless hasSeenFirstCommentLine then leadingNewlines else ''}#{precedingNonCommentLines}#{leadingWhitespace}"
                precededByBlankLine: !!precedingNonCommentLines
              }
              hasSeenFirstCommentLine = yes
              precedingNonCommentLines = ''
              comment
            .filter (comment) -> comment
    
        getIndentSize = ({leadingWhitespace, nonInitial}) ->
          lastNewlineIndex = leadingWhitespace.lastIndexOf '\n'
          if hereComment? or not nonInitial
            return null unless lastNewlineIndex > -1
          else
            lastNewlineIndex ?= -1
          leadingWhitespace.length - 1 - lastNewlineIndex
        commentAttachments = for {content, length, leadingWhitespace, precededByBlankLine}, i in contents
          nonInitial = i isnt 0
          leadingNewlineOffset = if nonInitial then 1 else 0
          offsetInChunk += leadingNewlineOffset + leadingWhitespace.length
          indentSize = getIndentSize {leadingWhitespace, nonInitial}
          noIndent = not indentSize? or indentSize is -1
          commentAttachment = {
            content
            here: hereComment?
            newLine: leadingNewline or nonInitial # Line comments after the first one start new lines, by definition.
            locationData: @makeLocationData {offsetInChunk, length}
            precededByBlankLine
            indentSize
            indented:  not noIndent and indentSize > @indent
            outdented: not noIndent and indentSize < @indent
          }
          commentAttachment.heregex = yes if heregex
          offsetInChunk += length
          commentAttachment
    
        prev = @prev()
        unless prev
  • §

    If there’s no previous token, create a placeholder token to attach this comment to; and follow with a newline.

          commentAttachments[0].newLine = yes
          @lineToken chunk: @chunk[commentWithSurroundingWhitespace.length..], offset: commentWithSurroundingWhitespace.length # Set the indent.
          placeholderToken = @makeToken 'JS', '', offset: commentWithSurroundingWhitespace.length, generated: yes
          placeholderToken.comments = commentAttachments
          @tokens.push placeholderToken
          @newlineToken commentWithSurroundingWhitespace.length
        else
          attachCommentsToNode commentAttachments, prev
    
        return commentAttachments if returnCommentTokens
        commentWithSurroundingWhitespace.length
  • §

    Matches JavaScript interpolated directly into the source via backticks.

      jsToken: ->
        return 0 unless @chunk.charAt(0) is '`' and
          (match = (matchedHere = HERE_JSTOKEN.exec(@chunk)) or JSTOKEN.exec(@chunk))
  • §

    Convert escaped backticks to backticks, and escaped backslashes just before escaped backticks to backslashes

        script = match[1]
        {length} = match[0]
        @token 'JS', script, {length, data: {here: !!matchedHere}}
        length
  • §

    Matches regular expression literals, as well as multiline extended ones. Lexing regular expressions is difficult to distinguish from division, so we borrow some basic heuristics from JavaScript and Ruby.

      regexToken: ->
        switch
          when match = REGEX_ILLEGAL.exec @chunk
            @error "regular expressions cannot begin with #{match[2]}",
              offset: match.index + match[1].length
          when match = @matchWithInterpolations HEREGEX, '///'
            {tokens, index} = match
            comments = []
            while matchedComment = HEREGEX_COMMENT.exec @chunk[0...index]
              {index: commentIndex} = matchedComment
              [fullMatch, leadingWhitespace, comment] = matchedComment
              comments.push {comment, offsetInChunk: commentIndex + leadingWhitespace.length}
            commentTokens = flatten(
              for commentOpts in comments
                @commentToken commentOpts.comment, Object.assign commentOpts, heregex: yes, returnCommentTokens: yes
            )
          when match = REGEX.exec @chunk
            [regex, body, closed] = match
            @validateEscapes body, isRegex: yes, offsetInChunk: 1
            index = regex.length
            prev = @prev()
            if prev
              if prev.spaced and prev[0] in CALLABLE
                return 0 if not closed or POSSIBLY_DIVISION.test regex
              else if prev[0] in NOT_REGEX
                return 0
            @error 'missing / (unclosed regex)' unless closed
          else
            return 0
    
        [flags] = REGEX_FLAGS.exec @chunk[index..]
        end = index + flags.length
        origin = @makeToken 'REGEX', null, length: end
        switch
          when not VALID_FLAGS.test flags
            @error "invalid regular expression flags #{flags}", offset: index, length: flags.length
          when regex or tokens.length is 1
            delimiter = if body then '/' else '///'
            body ?= tokens[0][1]
            @validateUnicodeCodePointEscapes body, {delimiter}
            @token 'REGEX', "/#{body}/#{flags}", {length: end, origin, data: {delimiter}}
          else
            @token 'REGEX_START', '(',    {length: 0, origin, generated: yes}
            @token 'IDENTIFIER', 'RegExp', length: 0, generated: yes
            @token 'CALL_START', '(',      length: 0, generated: yes
            @mergeInterpolationTokens tokens, {double: yes, heregex: {flags}, endOffset: end - flags.length, quote: '///'}, (str) =>
              @validateUnicodeCodePointEscapes str, {delimiter}
            if flags
              @token ',', ',',                    offset: index - 1, length: 0, generated: yes
              @token 'STRING', '"' + flags + '"', offset: index,     length: flags.length
            @token ')', ')',                      offset: end,       length: 0, generated: yes
            @token 'REGEX_END', ')',              offset: end,       length: 0, generated: yes
  • §

    Explicitly attach any heregex comments to the REGEX/REGEX_END token.

        if commentTokens?.length
          addTokenData @tokens[@tokens.length - 1],
            heregexCommentTokens: commentTokens
    
        end
  • §

    Matches newlines, indents, and outdents, and determines which is which. If we can detect that the current line is continued onto the next line, then the newline is suppressed:

    elements
      .each( ... )
      .map( ... )
    

    Keeps track of the level of indentation, because a single outdent token can close multiple indents, so we need to know how far in we happen to be.

      lineToken: ({chunk = @chunk, offset = 0} = {}) ->
        return 0 unless match = MULTI_DENT.exec chunk
        indent = match[0]
    
        prev = @prev()
        backslash = prev?[0] is '\\'
        @seenFor = no unless (backslash or @seenFor?.endsLength < @ends.length) and @seenFor
        @seenImport = no unless (backslash and @seenImport) or @importSpecifierList
        @seenExport = no unless (backslash and @seenExport) or @exportSpecifierList
    
        size = indent.length - 1 - indent.lastIndexOf '\n'
        noNewlines = @unfinished()
    
        newIndentLiteral = if size > 0 then indent[-size..] else ''
        unless /^(.?)\1*$/.exec newIndentLiteral
          @error 'mixed indentation', offset: indent.length
          return indent.length
    
        minLiteralLength = Math.min newIndentLiteral.length, @indentLiteral.length
        if newIndentLiteral[...minLiteralLength] isnt @indentLiteral[...minLiteralLength]
          @error 'indentation mismatch', offset: indent.length
          return indent.length
    
        if size - @continuationLineAdditionalIndent is @indent
          if noNewlines then @suppressNewlines() else @newlineToken offset
          return indent.length
    
        if size > @indent
          if noNewlines
            @continuationLineAdditionalIndent = size - @indent unless backslash
            if @continuationLineAdditionalIndent
              prev.continuationLineIndent = @indent + @continuationLineAdditionalIndent
            @suppressNewlines()
            return indent.length
          unless @tokens.length
            @baseIndent = @indent = size
            @indentLiteral = newIndentLiteral
            return indent.length
          diff = size - @indent + @outdebt
          @token 'INDENT', diff, offset: offset + indent.length - size, length: size
          @indents.push diff
          @ends.push {tag: 'OUTDENT'}
          @outdebt = @continuationLineAdditionalIndent = 0
          @indent = size
          @indentLiteral = newIndentLiteral
        else if size < @baseIndent
          @error 'missing indentation', offset: offset + indent.length
        else
          endsContinuationLineIndentation = @continuationLineAdditionalIndent > 0
          @continuationLineAdditionalIndent = 0
          @outdentToken {moveOut: @indent - size, noNewlines, outdentLength: indent.length, offset, indentSize: size, endsContinuationLineIndentation}
        indent.length
  • §

    Record an outdent token or multiple tokens, if we happen to be moving back inwards past several recorded indents. Sets new @indent value.

      outdentToken: ({moveOut, noNewlines, outdentLength = 0, offset = 0, indentSize, endsContinuationLineIndentation}) ->
        decreasedIndent = @indent - moveOut
        while moveOut > 0
          lastIndent = @indents[@indents.length - 1]
          if not lastIndent
            @outdebt = moveOut = 0
          else if @outdebt and moveOut <= @outdebt
            @outdebt -= moveOut
            moveOut   = 0
          else
            dent = @indents.pop() + @outdebt
            if outdentLength and @chunk[outdentLength] in INDENTABLE_CLOSERS
              decreasedIndent -= dent - moveOut
              moveOut = dent
            @outdebt = 0
  • §

    pair might call outdentToken, so preserve decreasedIndent

            @pair 'OUTDENT'
            @token 'OUTDENT', moveOut, length: outdentLength, indentSize: indentSize + moveOut - dent
            moveOut -= dent
        @outdebt -= moveOut if dent
        @suppressSemicolons()
    
        unless @tag() is 'TERMINATOR' or noNewlines
          terminatorToken = @token 'TERMINATOR', '\n', offset: offset + outdentLength, length: 0
          terminatorToken.endsContinuationLineIndentation = {preContinuationLineIndent: @indent} if endsContinuationLineIndentation
        @indent = decreasedIndent
        @indentLiteral = @indentLiteral[...decreasedIndent]
        this
  • §

    Matches and consumes non-meaningful whitespace. Tag the previous token as being “spaced”, because there are some cases where it makes a difference.

      whitespaceToken: ->
        return 0 unless (match = WHITESPACE.exec @chunk) or
                        (nline = @chunk.charAt(0) is '\n')
        prev = @prev()
        prev[if match then 'spaced' else 'newLine'] = true if prev
        if match then match[0].length else 0
  • §

    Generate a newline token. Consecutive newlines get merged together.

      newlineToken: (offset) ->
        @suppressSemicolons()
        @token 'TERMINATOR', '\n', {offset, length: 0} unless @tag() is 'TERMINATOR'
        this
  • §

    Use a \ at a line-ending to suppress the newline. The slash is removed here once its job is done.

      suppressNewlines: ->
        prev = @prev()
        if prev[1] is '\\'
          if prev.comments and @tokens.length > 1
  • §

    @tokens.length should be at least 2 (some code, then \). If something puts a \ after nothing, they deserve to lose any comments that trail it.

            attachCommentsToNode prev.comments, @tokens[@tokens.length - 2]
          @tokens.pop()
        this
    
      jsxToken: ->
        firstChar = @chunk[0]
  • §

    Check the previous token to detect if attribute is spread.

        prevChar = if @tokens.length > 0 then @tokens[@tokens.length - 1][0] else ''
        if firstChar is '<'
          match = JSX_IDENTIFIER.exec(@chunk[1...]) or JSX_FRAGMENT_IDENTIFIER.exec(@chunk[1...])
          return 0 unless match and (
            @jsxDepth > 0 or
  • §

    Not the right hand side of an unspaced comparison (i.e. a<b).

            not (prev = @prev()) or
            prev.spaced or
            prev[0] not in COMPARABLE_LEFT_SIDE
          )
          [input, id] = match
          fullId = id
          if '.' in id
            [id, properties...] = id.split '.'
          else
            properties = []
          tagToken = @token 'JSX_TAG', id,
            length: id.length + 1
            data:
              openingBracketToken: @makeToken '<', '<'
              tagNameToken: @makeToken 'IDENTIFIER', id, offset: 1
          offset = id.length + 1
          for property in properties
            @token '.', '.', {offset}
            offset += 1
            @token 'PROPERTY', property, {offset}
            offset += property.length
          @token 'CALL_START', '(', generated: yes
          @token '[', '[', generated: yes
          @ends.push {tag: '/>', origin: tagToken, name: id, properties}
          @jsxDepth++
          return fullId.length + 1
        else if jsxTag = @atJSXTag()
          if @chunk[...2] is '/>' # Self-closing tag.
            @pair '/>'
            @token ']', ']',
              length: 2
              generated: yes
            @token 'CALL_END', ')',
              length: 2
              generated: yes
              data:
                selfClosingSlashToken: @makeToken '/', '/'
                closingBracketToken: @makeToken '>', '>', offset: 1
            @jsxDepth--
            return 2
          else if firstChar is '{'
            if prevChar is ':'
  • §

    This token represents the start of a JSX attribute value that’s an expression (e.g. the {b} in <div a={b} />). Our grammar represents the beginnings of expressions as ( tokens, so make this into a ( token that displays as {.

              token = @token '(', '{'
              @jsxObjAttribute[@jsxDepth] = no
  • §

    tag attribute name as JSX

              addTokenData @tokens[@tokens.length - 3],
                jsx: yes
            else
              token = @token '{', '{'
              @jsxObjAttribute[@jsxDepth] = yes
            @ends.push {tag: '}', origin: token}
            return 1
          else if firstChar is '>' # end of opening tag
  • §

    Ignore terminators inside a tag.

            {origin: openingTagToken} = @pair '/>' # As if the current tag was self-closing.
            @token ']', ']',
              generated: yes
              data:
                closingBracketToken: @makeToken '>', '>'
            @token ',', 'JSX_COMMA', generated: yes
            {tokens, index: end} =
              @matchWithInterpolations INSIDE_JSX, '>', '</', JSX_INTERPOLATION
            @mergeInterpolationTokens tokens, {endOffset: end, jsx: yes}, (value) =>
              @validateUnicodeCodePointEscapes value, delimiter: '>'
            match = JSX_IDENTIFIER.exec(@chunk[end...]) or JSX_FRAGMENT_IDENTIFIER.exec(@chunk[end...])
            if not match or match[1] isnt "#{jsxTag.name}#{(".#{property}" for property in jsxTag.properties).join ''}"
              @error "expected corresponding JSX closing tag for #{jsxTag.name}",
                jsxTag.origin.data.tagNameToken[2]
            [, fullTagName] = match
            afterTag = end + fullTagName.length
            if @chunk[afterTag] isnt '>'
              @error "missing closing > after tag name", offset: afterTag, length: 1
  • §

    -2/+2 for the opening </ and +1 for the closing >.

            endToken = @token 'CALL_END', ')',
              offset: end - 2
              length: fullTagName.length + 3
              generated: yes
              data:
                closingTagOpeningBracketToken: @makeToken '<', '<', offset: end - 2
                closingTagSlashToken: @makeToken '/', '/', offset: end - 1
  • §

    TODO: individual tokens for complex tag name? eg < / A . B >

                closingTagNameToken: @makeToken 'IDENTIFIER', fullTagName, offset: end
                closingTagClosingBracketToken: @makeToken '>', '>', offset: end + fullTagName.length
  • §

    make the closing tag location data more easily accessible to the grammar

            addTokenData openingTagToken, endToken.data
            @jsxDepth--
            return afterTag + 1
          else
            return 0
        else if @atJSXTag 1
          if firstChar is '}'
            @pair firstChar
            if @jsxObjAttribute[@jsxDepth]
              @token '}', '}'
              @jsxObjAttribute[@jsxDepth] = no
            else
              @token ')', '}'
            @token ',', ',', generated: yes
            return 1
          else
            return 0
        else
          return 0
    
      atJSXTag: (depth = 0) ->
        return no if @jsxDepth is 0
        i = @ends.length - 1
        i-- while @ends[i]?.tag is 'OUTDENT' or depth-- > 0 # Ignore indents.
        last = @ends[i]
        last?.tag is '/>' and last
  • §

    We treat all other single characters as a token. E.g.: ( ) , . ! Multi-character operators are also literal tokens, so that Jison can assign the proper order of operations. There are some symbols that we tag specially here. ; and newlines are both treated as a TERMINATOR, we distinguish parentheses that indicate a method call from regular parentheses, and so on.

      literalToken: ->
        if match = OPERATOR.exec @chunk
          [value] = match
          @tagParameters() if CODE.test value
        else
          value = @chunk.charAt 0
        tag  = value
        prev = @prev()
    
        if prev and value in ['=', COMPOUND_ASSIGN...]
          skipToken = false
          if value is '=' and prev[1] in ['||', '&&'] and not prev.spaced
            prev[0] = 'COMPOUND_ASSIGN'
            prev[1] += '='
            prev.data.original += '=' if 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 = @tokens[@tokens.length - 2]
            skipToken = true
          if prev and prev[0] isnt 'PROPERTY'
            origin = prev.origin ? prev
            message = isUnassignable prev[1], origin[1]
            @error message, origin[2] if message
          return value.length if skipToken
    
        if value is '(' and prev?[0] is 'IMPORT'
          prev[0] = 'DYNAMIC_IMPORT'
    
        if value is '{' and @seenImport
          @importSpecifierList = yes
        else if @importSpecifierList and value is '}'
          @importSpecifierList = no
        else if value is '{' and prev?[0] is 'EXPORT'
          @exportSpecifierList = yes
        else if @exportSpecifierList and value is '}'
          @exportSpecifierList = no
    
        if value is ';'
          @error 'unexpected ;' if prev?[0] in ['=', UNFINISHED...]
          @seenFor = @seenImport = @seenExport = no
          tag = 'TERMINATOR'
        else if value is '*' and prev?[0] is 'EXPORT'
          tag = 'EXPORT_ALL'
        else if value in MATH            then tag = 'MATH'
        else if value in COMPARE         then tag = 'COMPARE'
        else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN'
        else if value in UNARY           then tag = 'UNARY'
        else if value in UNARY_MATH      then tag = 'UNARY_MATH'
        else if value in SHIFT           then tag = 'SHIFT'
        else if value is '?' and prev?.spaced then tag = 'BIN?'
        else if prev
          if value is '(' and not prev.spaced and prev[0] in CALLABLE
            prev[0] = 'FUNC_EXIST' if prev[0] is '?'
            tag = 'CALL_START'
          else if value is '[' and ((prev[0] in INDEXABLE and not prev.spaced) or
             (prev[0] is '::')) # `.prototype` can’t be a method you can call.
            tag = 'INDEX_START'
            switch prev[0]
              when '?'  then prev[0] = 'INDEX_SOAK'
        token = @makeToken tag, value
        switch value
          when '(', '{', '[' then @ends.push {tag: INVERSES[value], origin: token}
          when ')', '}', ']' then @pair value
        @tokens.push @makeToken tag, value
        value.length
  • §

    Token Manipulators

  • §
  • §

    A source of ambiguity in our grammar used to be parameter lists in function definitions versus argument lists in function calls. Walk backwards, tagging parameters specially in order to make things easier for the parser.

      tagParameters: ->
        return @tagDoIife() if @tag() isnt ')'
        stack = []
        {tokens} = this
        i = tokens.length
        paramEndToken = tokens[--i]
        paramEndToken[0] = 'PARAM_END'
        while tok = tokens[--i]
          switch tok[0]
            when ')'
              stack.push tok
            when '(', 'CALL_START'
              if stack.length then stack.pop()
              else if tok[0] is '('
                tok[0] = 'PARAM_START'
                return @tagDoIife i - 1
              else
                paramEndToken[0] = 'CALL_END'
                return this
        this
  • §

    Tag do followed by a function differently than do followed by eg an identifier to allow for different grammar precedence

      tagDoIife: (tokenIndex) ->
        tok = @tokens[tokenIndex ? @tokens.length - 1]
        return this unless tok?[0] is 'DO'
        tok[0] = 'DO_IIFE'
        this
  • §

    Close up all remaining open blocks at the end of the file.

      closeIndentation: ->
        @outdentToken moveOut: @indent, indentSize: 0
  • §

    Match the contents of a delimited token and expand variables and expressions inside it using Ruby-like notation for substitution of arbitrary expressions.

    "Hello #{name.capitalize()}."
    

    If it encounters an interpolation, this method will recursively create a new Lexer and tokenize until the { of #{ is balanced with a }.

    • regex matches the contents of a token (but not delimiter, and not #{ if interpolations are desired).
    • delimiter is the delimiter of the token. Examples are ', ", ''', """ and ///.
    • closingDelimiter is different from delimiter only in JSX
    • interpolators matches the start of an interpolation, for JSX it’s both { and < (i.e. nested JSX tag)

    This method allows us to have strings within interpolations within strings, ad infinitum.

      matchWithInterpolations: (regex, delimiter, closingDelimiter = delimiter, interpolators = /^#\{/) ->
        tokens = []
        offsetInChunk = delimiter.length
        return null unless @chunk[...offsetInChunk] is delimiter
        str = @chunk[offsetInChunk..]
        loop
          [strPart] = regex.exec str
    
          @validateEscapes strPart, {isRegex: delimiter.charAt(0) is '/', offsetInChunk}
  • §

    Push a fake 'NEOSTRING' token, which will get turned into a real string later.

          tokens.push @makeToken 'NEOSTRING', strPart, offset: offsetInChunk
    
          str = str[strPart.length..]
          offsetInChunk += strPart.length
    
          break unless match = interpolators.exec str
          [interpolator] = match
  • §

    To remove the # in #{.

          interpolationOffset = interpolator.length - 1
          [line, column, offset] = @getLineAndColumnFromChunk offsetInChunk + interpolationOffset
          rest = str[interpolationOffset..]
          {tokens: nested, index} =
            new Lexer().tokenize rest, {line, column, offset, untilBalanced: on, @locationDataCompensations}
  • §

    Account for the # in #{.

          index += interpolationOffset
    
          braceInterpolator = str[index - 1] is '}'
          if braceInterpolator
  • §

    Turn the leading and trailing { and } into parentheses. Unnecessary parentheses will be removed later.

            [open, ..., close] = nested
            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]]
  • §

    Remove leading 'TERMINATOR' (if any).

          nested.splice 1, 1 if nested[1]?[0] is 'TERMINATOR'
  • §

    Remove trailing 'INDENT'/'OUTDENT' pair (if any).

          nested.splice -3, 2 if nested[nested.length - 3]?[0] is 'INDENT' and nested[nested.length - 2][0] is 'OUTDENT'
    
          unless braceInterpolator
  • §

    We are not using { and }, so wrap the interpolated tokens instead.

            open = @makeToken 'INTERPOLATION_START', '(', offset: offsetInChunk,         length: 0, generated: yes
            close = @makeToken 'INTERPOLATION_END', ')',  offset: offsetInChunk + index, length: 0, generated: yes
            nested = [open, nested..., close]
  • §

    Push a fake 'TOKENS' token, which will get turned into real tokens later.

          tokens.push ['TOKENS', nested]
    
          str = str[index..]
          offsetInChunk += index
    
        unless str[...closingDelimiter.length] is closingDelimiter
          @error "missing #{closingDelimiter}", length: delimiter.length
    
        {tokens, index: offsetInChunk + closingDelimiter.length}
  • §

    Merge the array tokens of the fake token types 'TOKENS' and 'NEOSTRING' (as returned by matchWithInterpolations) into the token stream. The value of 'NEOSTRING's are converted using fn and turned into strings using options first.

      mergeInterpolationTokens: (tokens, options, fn) ->
        {quote, indent, double, heregex, endOffset, jsx} = options
    
        if tokens.length > 1
          lparen = @token 'STRING_START', '(', length: quote?.length ? 0, data: {quote}, generated: not quote?.length
    
        firstIndex = @tokens.length
        $ = tokens.length - 1
        for token, i in tokens
          [tag, value] = token
          switch tag
            when 'TOKENS'
  • §

    There are comments (and nothing else) in this interpolation.

              if value.length is 2 and (value[0].comments or value[1].comments)
                placeholderToken = @makeToken 'JS', '', generated: yes
  • §

    Use the same location data as the first parenthesis.

                placeholderToken[2] = value[0][2]
                for val in value when val.comments
                  placeholderToken.comments ?= []
                  placeholderToken.comments.push val.comments...
                value.splice 1, 0, placeholderToken
  • §

    Push all the tokens in the fake 'TOKENS' token. These already have sane location data.

              locationToken = value[0]
              tokensToPush = value
            when 'NEOSTRING'
  • §

    Convert 'NEOSTRING' into 'STRING'.

              converted = fn.call this, token[1], i
              addTokenData token, initialChunk: yes if i is 0
              addTokenData token, finalChunk: yes   if i is $
              addTokenData token, {indent, quote, double}
              addTokenData token, {heregex} if heregex
              addTokenData token, {jsx} if jsx
              token[0] = 'STRING'
              token[1] = '"' + converted + '"'
              if tokens.length is 1 and quote?
                token[2].first_column -= quote.length
                if token[1].substr(-2, 1) is '\n'
                  token[2].last_line += 1
                  token[2].last_column = quote.length - 1
                else
                  token[2].last_column += quote.length
                  token[2].last_column -= 1 if token[1].length is 2
                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]
          @tokens.push tokensToPush...
    
        if lparen
          [..., lastToken] = tokens
          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]
            ]
          ]
          lparen[2] = lparen.origin[2] unless quote?.length
          rparen = @token 'STRING_END', ')', offset: endOffset - (quote ? '').length, length: quote?.length ? 0, generated: not quote?.length
  • §

    Pairs up a closing token, ensuring that all listed pairs of tokens are correctly balanced throughout the course of the token stream.

      pair: (tag) ->
        [..., prev] = @ends
        unless tag is wanted = prev?.tag
          @error "unmatched #{tag}" unless 'OUTDENT' is wanted
  • §

    Auto-close INDENT to support syntax like this:

    el.click((event) ->
      el.hide())
    
          [..., lastIndent] = @indents
          @outdentToken moveOut: lastIndent, noNewlines: true
          return @pair tag
        @ends.pop()
  • §

    Helpers

  • §
  • §

    Compensate for the things we strip out initially (e.g. carriage returns) so that location data stays accurate with respect to the original source file.

      getLocationDataCompensation: (start, end) ->
        totalCompensation = 0
        initialEnd = end
        current = start
        while current <= end
          break if current is end and start isnt initialEnd
          compensation = @locationDataCompensations[current]
          if compensation?
            totalCompensation += compensation
            end += compensation
          current++
        return totalCompensation
  • §

    Returns the line and column number from an offset into the current chunk.

    offset is a number of characters into @chunk.

      getLineAndColumnFromChunk: (offset) ->
        compensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset
    
        if offset is 0
          return [@chunkLine, @chunkColumn + compensation, @chunkOffset + compensation]
    
        if offset >= @chunk.length
          string = @chunk
        else
          string = @chunk[..offset-1]
    
        lineCount = count string, '\n'
    
        column = @chunkColumn
        if lineCount > 0
          [..., lastLine] = string.split '\n'
          column = lastLine.length
          previousLinesCompensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset - column
  • §

    Don’t recompensate for initially inserted newline.

          previousLinesCompensation = 0 if previousLinesCompensation < 0
          columnCompensation = @getLocationDataCompensation(
            @chunkOffset + offset + previousLinesCompensation - column
            @chunkOffset + offset + previousLinesCompensation
          )
        else
          column += string.length
          columnCompensation = compensation
    
        [@chunkLine + lineCount, column + columnCompensation, @chunkOffset + offset + compensation]
    
      makeLocationData: ({ offsetInChunk, length }) ->
        locationData = range: []
        [locationData.first_line, locationData.first_column, locationData.range[0]] =
          @getLineAndColumnFromChunk offsetInChunk
  • §

    Use length - 1 for the final offset - we’re supplying the last_line and the last_column, so if last_column == first_column, then we’re looking at a character of length 1.

        lastCharacter = if length > 0 then (length - 1) else 0
        [locationData.last_line, locationData.last_column, endOffset] =
          @getLineAndColumnFromChunk offsetInChunk + lastCharacter
        [locationData.last_line_exclusive, locationData.last_column_exclusive] =
          @getLineAndColumnFromChunk offsetInChunk + lastCharacter + (if length > 0 then 1 else 0)
        locationData.range[1] = if length > 0 then endOffset + 1 else endOffset
    
        locationData
  • §

    Same as token, except this just returns the token without adding it to the results.

      makeToken: (tag, value, {offset: offsetInChunk = 0, length = value.length, origin, generated, indentSize} = {}) ->
        token = [tag, value, @makeLocationData {offsetInChunk, length}]
        token.origin = origin if origin
        token.generated = yes if generated
        token.indentSize = indentSize if indentSize?
        token
  • §

    Add a token to the results. offset is the offset into the current @chunk where the token starts. length is the length of the token in the @chunk, after the offset. If not specified, the length of value will be used.

    Returns the new token.

      token: (tag, value, {offset, length, origin, data, generated, indentSize} = {}) ->
        token = @makeToken tag, value, {offset, length, origin, generated, indentSize}
        addTokenData token, data if data
        @tokens.push token
        token
  • §

    Peek at the last tag in the token stream.

      tag: ->
        [..., token] = @tokens
        token?[0]
  • §

    Peek at the last value in the token stream.

      value: (useOrigin = no) ->
        [..., token] = @tokens
        if useOrigin and token?.origin?
          token.origin[1]
        else
          token?[1]
  • §

    Get the previous token in the token stream.

      prev: ->
        @tokens[@tokens.length - 1]
  • §

    Are we in the midst of an unfinished expression?

      unfinished: ->
        LINE_CONTINUER.test(@chunk) or
        @tag() in UNFINISHED
    
      validateUnicodeCodePointEscapes: (str, options) ->
        replaceUnicodeCodePointEscapes str, merge options, {@error}
  • §

    Validates escapes in strings and regexes.

      validateEscapes: (str, options = {}) ->
        invalidEscapeRegex =
          if options.isRegex
            REGEX_INVALID_ESCAPE
          else
            STRING_INVALID_ESCAPE
        match = invalidEscapeRegex.exec str
        return unless match
        [[], before, octal, hex, unicodeCodePoint, unicode] = match
        message =
          if octal
            "octal escape sequences are not allowed"
          else
            "invalid escape sequence"
        invalidEscape = "\\#{octal or hex or unicodeCodePoint or unicode}"
        @error "#{message} #{invalidEscape}",
          offset: (options.offsetInChunk ? 0) + match.index + before.length
          length: invalidEscape.length
    
      suppressSemicolons: ->
        while @value() is ';'
          @tokens.pop()
          @error 'unexpected ;' if @prev()?[0] in ['=', UNFINISHED...]
  • §

    Throws an error at either a given offset from the current chunk or at the location of a token (token[2]).

      error: (message, options = {}) =>
        location =
          if 'first_line' of options
            options
          else
            [first_line, first_column] = @getLineAndColumnFromChunk options.offset ? 0
            {first_line, first_column, last_column: first_column + (options.length ? 1) - 1}
        throwSyntaxError message, location
  • §

    Helper functions

  • §
    
    isUnassignable = (name, displayName = name) -> switch
      when name in [JS_KEYWORDS..., COFFEE_KEYWORDS...]
        "keyword '#{displayName}' can't be assigned"
      when name in STRICT_PROSCRIBED
        "'#{displayName}' can't be assigned"
      when name in RESERVED
        "reserved word '#{displayName}' can't be assigned"
      else
        false
    
    exports.isUnassignable = isUnassignable
  • §

    from isn’t a CoffeeScript keyword, but it behaves like one in import and export statements (handled above) and in the declaration line of a for loop. Try to detect when from is a variable identifier and when it is this “sometimes” keyword.

    isForFrom = (prev) ->
  • §

    for i from iterable

      if prev[0] is 'IDENTIFIER'
        yes
  • §

    for from…

      else if prev[0] is 'FOR'
        no
  • §

    for {from}…, for [from]…, for {a, from}…, for {a: from}…

      else if prev[1] in ['{', '[', ',', ':']
        no
      else
        yes
    
    addTokenData = (token, data) ->
      Object.assign (token.data ?= {}), data
  • §

    Constants

  • §
  • §

    Keywords that CoffeeScript shares in common with JavaScript.

    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'
    ]
  • §

    CoffeeScript-only keywords.

    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  = (key for key of COFFEE_ALIAS_MAP)
    COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES
  • §

    The list of keywords that are reserved by JavaScript, but not used, or are used by CoffeeScript internally. We throw an error when these are encountered, to avoid having a JavaScript error at runtime.

    RESERVED = [
      'case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum'
      'native', 'implements', 'interface', 'package', 'private'
      'protected', 'public', 'static'
    ]
    
    STRICT_PROSCRIBED = ['arguments', 'eval']
  • §

    The superset of both JavaScript keywords and reserved words, none of which may be used as identifiers or properties.

    exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)
  • §

    The character code of the nasty Microsoft madness otherwise known as the BOM.

    BOM = 65279
  • §

    Token matching regexes.

    IDENTIFIER = /// ^
      (?!\d)
      ( (?: (?!\s)[$\w\x7f-\uffff] )+ )
      ( [^\n\S]* : (?!:) )?  # Is this a property name?
    ///
  • §

    Like IDENTIFIER, but includes -s

    JSX_IDENTIFIER_PART = /// (?: (?!\s)[\-$\w\x7f-\uffff] )+ ///.source
  • §

    In https://facebook.github.io/jsx/ spec, JSXElementName can be JSXIdentifier, JSXNamespacedName (JSXIdentifier : JSXIdentifier), or JSXMemberExpression (two or more JSXIdentifier connected by .s).

    JSX_IDENTIFIER = /// ^
      (?![\d<]) # Must not start with `<`.
      ( #{JSX_IDENTIFIER_PART}
        (?: \s* : \s* #{JSX_IDENTIFIER_PART}       # JSXNamespacedName
        | (?: \s* \. \s* #{JSX_IDENTIFIER_PART} )+ # JSXMemberExpression
        )? )
    ///
  • §

    Fragment: <></>

    JSX_FRAGMENT_IDENTIFIER = /// ^
      ()> # Ends immediately with `>`.
    ///
  • §

    In https://facebook.github.io/jsx/ spec, JSXAttributeName can be either JSXIdentifier or JSXNamespacedName which is JSXIdentifier : JSXIdentifier

    JSX_ATTRIBUTE = /// ^
      (?!\d)
      ( #{JSX_IDENTIFIER_PART}
        (?: \s* : \s* #{JSX_IDENTIFIER_PART}       # JSXNamespacedName
        )? )
      ( [^\S]* = (?!=) )?  # Is this an attribute with a value?
    ///
    
    NUMBER     = ///
      ^ 0b[01](?:_?[01])*n?                         | # binary
      ^ 0o[0-7](?:_?[0-7])*n?                       | # octal
      ^ 0x[\da-f](?:_?[\da-f])*n?                   | # hex
      ^ \d+(?:_\d+)*n                               | # decimal bigint
      ^ (?:\d+(?:_\d+)*)?      \.? \d+(?:_\d+)*       # decimal
                         (?:e[+-]? \d+(?:_\d+)* )?
    
  • §

    decimal without support for numeric literal separators for reference: \d*.?\d+ (?:e[+-]?\d+)?

    ///i
    
    OPERATOR   = /// ^ (
      ?: [-=]>             # function
       | [-+*/%<>&|^!?=]=  # compound assign / compare
       | >>>=?             # zero-fill right shift
       | ([-+:])\1         # doubles
       | ([&|<>*/%])\2=?   # logic / shift / power / floor division / modulo
       | \?(\.|::)         # soak access
       | \.{2,3}           # range or splat
    ) ///
    
    WHITESPACE = /^[^\n\S]+/
    
    COMMENT    = /^(\s*)###([^#][\s\S]*?)(?:###([^\n\S]*)|###$)|^((?:\s*#(?!##[^#]).*)+)/
    
    CODE       = /^[-=]>/
    
    MULTI_DENT = /^(?:\n[^\n\S]*)+/
    
    JSTOKEN      = ///^ `(?!``) ((?: [^`\\] | \\[\s\S]           )*) `   ///
    HERE_JSTOKEN = ///^ ```     ((?: [^`\\] | \\[\s\S] | `(?!``) )*) ``` ///
    
    
  • §

    String-matching-regexes.

    STRING_START   = /^(?:'''|"""|'|")/
    
    STRING_SINGLE  = /// ^(?: [^\\']  | \\[\s\S]                      )* ///
    STRING_DOUBLE  = /// ^(?: [^\\"#] | \\[\s\S] |           \#(?!\{) )* ///
    HEREDOC_SINGLE = /// ^(?: [^\\']  | \\[\s\S] | '(?!'')            )* ///
    HEREDOC_DOUBLE = /// ^(?: [^\\"#] | \\[\s\S] | "(?!"") | \#(?!\{) )* ///
    
    INSIDE_JSX = /// ^(?:
        [^
          \{ # Start of CoffeeScript interpolation.
          <  # Maybe JSX tag (`<` not allowed even if bare).
        ]
      )* /// # Similar to `HEREDOC_DOUBLE` but there is no escaping.
    JSX_INTERPOLATION = /// ^(?:
          \{       # CoffeeScript interpolation.
        | <(?!/)   # JSX opening tag.
      )///
    
    HEREDOC_INDENT     = /\n+([^\n\S]*)(?=\S)/g
  • §

    Regex-matching-regexes.

    REGEX = /// ^
      / (?!/) ((
      ?: [^ [ / \n \\ ]  # Every other thing.
       | \\[^\n]         # Anything but newlines escaped.
       | \[              # Character class.
           (?: \\[^\n] | [^ \] \n \\ ] )*
         \]
      )*) (/)?
    ///
    
    REGEX_FLAGS  = /^\w*/
    VALID_FLAGS  = /^(?!.*(.).*\1)[gimsuy]*$/
    
    HEREGEX      = /// ^
      (?:
    
  • §

    Match any character, except those that need special handling below.

          [^\\/#\s]
  • §

    Match \ followed by any character.

        | \\[\s\S]
  • §

    Match any / except ///.

        | /(?!//)
  • §

    Match # which is not part of interpolation, e.g. #{}.

        | \#(?!\{)
  • §

    Comments consume everything until the end of the line, including ///.

        | \s+(?:#(?!\{).*)?
      )*
    ///
    
    HEREGEX_COMMENT = /(\s+)(#(?!{).*)/gm
    
    REGEX_ILLEGAL = /// ^ ( / | /{3}\s*) (\*) ///
    
    POSSIBLY_DIVISION   = /// ^ /=?\s ///
  • §

    Other regexes.

    HERECOMMENT_ILLEGAL = /\*\//
    
    LINE_CONTINUER      = /// ^ \s* (?: , | \??\.(?![.\d]) | \??:: ) ///
    
    STRING_INVALID_ESCAPE = ///
      ( (?:^|[^\\]) (?:\\\\)* )        # Make sure the escape isn’t escaped.
      \\ (
         ?: (0\d|[1-7])                # octal escape
          | (x(?![\da-fA-F]{2}).{0,2}) # hex escape
          | (u\{(?![\da-fA-F]{1,}\})[^}]*\}?) # unicode code point escape
          | (u(?!\{|[\da-fA-F]{4}).{0,4}) # unicode escape
      )
    ///
    REGEX_INVALID_ESCAPE = ///
      ( (?:^|[^\\]) (?:\\\\)* )        # Make sure the escape isn’t escaped.
      \\ (
         ?: (0\d)                      # octal escape
          | (x(?![\da-fA-F]{2}).{0,2}) # hex escape
          | (u\{(?![\da-fA-F]{1,}\})[^}]*\}?) # unicode code point escape
          | (u(?!\{|[\da-fA-F]{4}).{0,4}) # unicode escape
      )
    ///
    
    TRAILING_SPACES     = /\s+$/
  • §

    Compound assignment tokens.

    COMPOUND_ASSIGN = [
      '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>='
      '&=', '^=', '|=', '**=', '//=', '%%='
    ]
  • §

    Unary tokens.

    UNARY = ['NEW', 'TYPEOF', 'DELETE']
    
    UNARY_MATH = ['!', '~']
  • §

    Bit-shifting tokens.

    SHIFT = ['<<', '>>', '>>>']
  • §

    Comparison tokens.

    COMPARE = ['==', '!=', '<', '>', '<=', '>=']
  • §

    Mathematical tokens.

    MATH = ['*', '/', '%', '//', '%%']
  • §

    Relational tokens that are negatable with not prefix.

    RELATION = ['IN', 'OF', 'INSTANCEOF']
  • §

    Boolean tokens.

    BOOL = ['TRUE', 'FALSE']
  • §

    Tokens which could legitimately be invoked or indexed. An opening parentheses or bracket following these tokens will be recorded as the start of a function invocation or indexing operation.

    CALLABLE  = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER', 'DYNAMIC_IMPORT']
    INDEXABLE = CALLABLE.concat [
      'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END'
      'BOOL', 'NULL', 'UNDEFINED', '}', '::'
    ]
  • §

    Tokens which can be the left-hand side of a less-than comparison, i.e. a<b.

    COMPARABLE_LEFT_SIDE = ['IDENTIFIER', ')', ']', 'NUMBER']
  • §

    Tokens which a regular expression will never immediately follow (except spaced CALLABLEs in some cases), but which a division operator can.

    See: http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions

    NOT_REGEX = INDEXABLE.concat ['++', '--']
  • §

    Tokens that, when immediately preceding a WHEN, indicate that the WHEN occurs at the start of a line. We disambiguate these from trailing whens to avoid an ambiguity in the grammar.

    LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']
  • §

    Additional indent in front of these is ignored.

    INDENTABLE_CLOSERS = [')', '}', ']']
================================================ FILE: docs/v2/annotated-source/nodes.html ================================================ nodes.coffee
  • nodes.coffee

  • §

    nodes.coffee contains all of the node classes for the syntax tree. Most nodes are created as the result of actions in the grammar, but some are created by other nodes as a method of code generation. To convert the syntax tree into a string of JavaScript code, call compile() on the root.

    Error.stackTraceLimit = Infinity
    
    {Scope} = require './scope'
    {isUnassignable, JS_FORBIDDEN} = require './lexer'
  • §

    Import the helpers we plan to use.

    {compact, flatten, extend, merge, del, starts, ends, some,
    addDataToNode, attachCommentsToNode, locationDataToString,
    throwSyntaxError, replaceUnicodeCodePointEscapes,
    isFunction, isPlainObject, isNumber, parseNumber} = require './helpers'
  • §

    Functions required by parser.

    exports.extend = extend
    exports.addDataToNode = addDataToNode
  • §

    Constant functions for nodes that don’t need customization.

    YES     = -> yes
    NO      = -> no
    THIS    = -> this
    NEGATE  = -> @negated = not @negated; this
  • §

    CodeFragment

  • §

    The various nodes defined below all compile to a collection of CodeFragment objects. A CodeFragments is a block of generated code, and the location in the source file where the code came from. CodeFragments can be assembled together into working code just by catting together all the CodeFragments’ code snippets, in order.

    exports.CodeFragment = class CodeFragment
      constructor: (parent, code) ->
        @code = "#{code}"
        @type = parent?.constructor?.name or 'unknown'
        @locationData = parent?.locationData
        @comments = parent?.comments
    
      toString: ->
  • §

    This is only intended for debugging.

        "#{@code}#{if @locationData then ": " + locationDataToString(@locationData) else ''}"
  • §

    Convert an array of CodeFragments into a string.

    fragmentsToText = (fragments) ->
      (fragment.code for fragment in fragments).join('')
  • §

    Base

  • §

    The Base is the abstract base class for all nodes in the syntax tree. Each subclass implements the compileNode method, which performs the code generation for that node. To compile a node to JavaScript, call compile on it, which wraps compileNode in some generic extra smarts, to know when the generated code needs to be wrapped up in a closure. An options hash is passed and cloned throughout, containing information about the environment from higher in the tree (such as if a returned value is being requested by the surrounding function), information about the current scope, and indentation level.

    exports.Base = class Base
    
      compile: (o, lvl) ->
        fragmentsToText @compileToFragments o, lvl
  • §

    Occasionally a node is compiled multiple times, for example to get the name of a variable to add to scope tracking. When we know that a “premature” compilation won’t result in comments being output, set those comments aside so that they’re preserved for a later compile call that will result in the comments being included in the output.

      compileWithoutComments: (o, lvl, method = 'compile') ->
        if @comments
          @ignoreTheseCommentsTemporarily = @comments
          delete @comments
        unwrapped = @unwrapAll()
        if unwrapped.comments
          unwrapped.ignoreTheseCommentsTemporarily = unwrapped.comments
          delete unwrapped.comments
    
        fragments = @[method] o, lvl
    
        if @ignoreTheseCommentsTemporarily
          @comments = @ignoreTheseCommentsTemporarily
          delete @ignoreTheseCommentsTemporarily
        if unwrapped.ignoreTheseCommentsTemporarily
          unwrapped.comments = unwrapped.ignoreTheseCommentsTemporarily
          delete unwrapped.ignoreTheseCommentsTemporarily
    
        fragments
    
      compileNodeWithoutComments: (o, lvl) ->
        @compileWithoutComments o, lvl, 'compileNode'
  • §

    Common logic for determining whether to wrap this node in a closure before compiling it, or to compile directly. We need to wrap if this node is a statement, and it’s not a pureStatement, and we’re not at the top level of a block (which would be unnecessary), and we haven’t already been asked to return the result (because statements know how to return results).

      compileToFragments: (o, lvl) ->
        o        = extend {}, o
        o.level  = lvl if lvl
        node     = @unfoldSoak(o) or this
        node.tab = o.indent
    
        fragments = if o.level is LEVEL_TOP or not node.isStatement(o)
          node.compileNode o
        else
          node.compileClosure o
        @compileCommentFragments o, node, fragments
        fragments
    
      compileToFragmentsWithoutComments: (o, lvl) ->
        @compileWithoutComments o, lvl, 'compileToFragments'
  • §

    Statements converted into expressions via closure-wrapping share a scope object with their parent closure, to preserve the expected lexical scope.

      compileClosure: (o) ->
        @checkForPureStatementInExpression()
        o.sharedScope = yes
        func = new Code [], Block.wrap [this]
        args = []
        if @contains ((node) -> node instanceof SuperCall)
          func.bound = yes
        else if (argumentsNode = @contains isLiteralArguments) or @contains isLiteralThis
          args = [new ThisLiteral]
          if argumentsNode
            meth = 'apply'
            args.push new IdentifierLiteral 'arguments'
          else
            meth = 'call'
          func = new Value func, [new Access new PropertyName meth]
        parts = (new Call func, args).compileNode o
    
        switch
          when func.isGenerator or func.base?.isGenerator
            parts.unshift @makeCode "(yield* "
            parts.push    @makeCode ")"
          when func.isAsync or func.base?.isAsync
            parts.unshift @makeCode "(await "
            parts.push    @makeCode ")"
        parts
    
      compileCommentFragments: (o, node, fragments) ->
        return fragments unless node.comments
  • §

    This is where comments, that are attached to nodes as a comments property, become CodeFragments. “Inline block comments,” e.g. /* */-delimited comments that are interspersed within code on a line, are added to the current fragments stream. All other fragments are attached as properties to the nearest preceding or following fragment, to remain stowaways until they get properly output in compileComments later on.

        unshiftCommentFragment = (commentFragment) ->
          if commentFragment.unshift
  • §

    Find the first non-comment fragment and insert commentFragment before it.

            unshiftAfterComments fragments, commentFragment
          else
            if fragments.length isnt 0
              precedingFragment = fragments[fragments.length - 1]
              if commentFragment.newLine and precedingFragment.code isnt '' and
                 not /\n\s*$/.test precedingFragment.code
                commentFragment.code = "\n#{commentFragment.code}"
            fragments.push commentFragment
    
        for comment in node.comments when comment not in @compiledComments
          @compiledComments.push comment # Don’t output this comment twice.
  • §

    For block/here comments, denoted by ###, that are inline comments like 1 + ### comment ### 2, create fragments and insert them into the fragments array. Otherwise attach comment fragments to their closest fragment for now, so they can be inserted into the output later after all the newlines have been added.

          if comment.here # Block comment, delimited by `###`.
            commentFragment = new HereComment(comment).compileNode o
          else # Line comment, delimited by `#`.
            commentFragment = new LineComment(comment).compileNode o
          if (commentFragment.isHereComment and not commentFragment.newLine) or
             node.includeCommentFragments()
  • §

    Inline block comments, like 1 + /* comment */ 2, or a node whose compileToFragments method has logic for outputting comments.

            unshiftCommentFragment commentFragment
          else
            fragments.push @makeCode '' if fragments.length is 0
            if commentFragment.unshift
              fragments[0].precedingComments ?= []
              fragments[0].precedingComments.push commentFragment
            else
              fragments[fragments.length - 1].followingComments ?= []
              fragments[fragments.length - 1].followingComments.push commentFragment
        fragments
  • §

    If the code generation wishes to use the result of a complex expression in multiple places, ensure that the expression is only ever evaluated once, by assigning it to a temporary variable. Pass a level to precompile.

    If level is passed, then returns [val, ref], where val is the compiled value, and ref is the compiled reference. If level is not passed, this returns [val, ref] where the two values are raw nodes which have not been compiled.

      cache: (o, level, shouldCache) ->
        complex = if shouldCache? then shouldCache this else @shouldCache()
        if complex
          ref = new IdentifierLiteral o.scope.freeVariable 'ref'
          sub = new Assign ref, this
          if level then [sub.compileToFragments(o, level), [@makeCode(ref.value)]] else [sub, ref]
        else
          ref = if level then @compileToFragments o, level else this
          [ref, ref]
  • §

    Occasionally it may be useful to make an expression behave as if it was ‘hoisted’, whereby the result of the expression is available before its location in the source, but the expression’s variable scope corresponds to the source position. This is used extensively to deal with executable class bodies in classes.

    Calling this method mutates the node, proxying the compileNode and compileToFragments methods to store their result for later replacing the target node, which is returned by the call.

      hoist: ->
        @hoisted = yes
        target   = new HoistTarget @
    
        compileNode        = @compileNode
        compileToFragments = @compileToFragments
    
        @compileNode = (o) ->
          target.update compileNode, o
    
        @compileToFragments = (o) ->
          target.update compileToFragments, o
    
        target
    
      cacheToCodeFragments: (cacheValues) ->
        [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])]
  • §

    Construct a node that returns the current node’s result. Note that this is overridden for smarter behavior for many statement nodes (e.g. If, For).

      makeReturn: (results, mark) ->
        if mark
  • §

    Mark this node as implicitly returned, so that it can be part of the node metadata returned in the AST.

          @canBeReturned = yes
          return
        node = @unwrapAll()
        if results
          new Call new Literal("#{results}.push"), [node]
        else
          new Return node
  • §

    Does this node, or any of its children, contain a node of a certain kind? Recursively traverses down the children nodes and returns the first one that verifies pred. Otherwise return undefined. contains does not cross scope boundaries.

      contains: (pred) ->
        node = undefined
        @traverseChildren no, (n) ->
          if pred n
            node = n
            return no
        node
  • §

    Pull out the last node of a node list.

      lastNode: (list) ->
        if list.length is 0 then null else list[list.length - 1]
  • §

    Debugging representation of the node, for inspecting the parse tree. This is what coffee --nodes prints out.

      toString: (idt = '', name = @constructor.name) ->
        tree = '\n' + idt + name
        tree += '?' if @soak
        @eachChild (node) -> tree += node.toString idt + TAB
        tree
    
      checkForPureStatementInExpression: ->
        if jumpNode = @jumps()
          jumpNode.error 'cannot use a pure statement in an expression'
  • §

    Plain JavaScript object representation of the node, that can be serialized as JSON. This is what the ast option in the Node API returns. We try to follow the Babel AST spec as closely as possible, for improved interoperability with other tools. WARNING: DO NOT OVERRIDE THIS METHOD IN CHILD CLASSES. Only override the component ast* methods as needed.

      ast: (o, level) ->
  • §

    Merge level into o and perform other universal checks.

        o = @astInitialize o, level
  • §

    Create serializable representation of this node.

        astNode = @astNode o
  • §

    Mark AST nodes that correspond to expressions that (implicitly) return. We can’t do this as part of astNode because we need to assemble child nodes first before marking the parent being returned.

        if @astNode? and @canBeReturned
          Object.assign astNode, {returns: yes}
        astNode
    
      astInitialize: (o, level) ->
        o = Object.assign {}, o
        o.level = level if level?
        if o.level > LEVEL_TOP
          @checkForPureStatementInExpression()
  • §

    @makeReturn must be called before astProperties, because the latter may call .ast() for child nodes and those nodes would need the return logic from makeReturn already executed by then.

        @makeReturn null, yes if @isStatement(o) and o.level isnt LEVEL_TOP and o.scope?
        o
    
      astNode: (o) ->
  • §

    Every abstract syntax tree node object has four categories of properties:

    • type, stored in the type field and a string like NumberLiteral.
    • location data, stored in the loc, start, end and range fields.
    • properties specific to this node, like parsedValue.
    • properties that are themselves child nodes, like body. These fields are all intermixed in the Babel spec; type and start and parsedValue are all top level fields in the AST node object. We have separate methods for returning each category, that we merge together here.
        Object.assign {}, {type: @astType(o)}, @astProperties(o), @astLocationData()
  • §

    By default, a node class has no specific properties.

      astProperties: -> {}
  • §

    By default, a node class’s AST type is its class name.

      astType: -> @constructor.name
  • §

    The AST location data is a rearranged version of our Jison location data, mutated into the structure that the Babel spec uses.

      astLocationData: ->
        jisonLocationDataToAstLocationData @locationData
  • §

    Determines whether an AST node needs an ExpressionStatement wrapper. Typically matches our isStatement() logic but this allows overriding.

      isStatementAst: (o) ->
        @isStatement o
  • §

    Passes each child to a function, breaking when the function returns false.

      eachChild: (func) ->
        return this unless @children
        for attr in @children when @[attr]
          for child in flatten [@[attr]]
            return this if func(child) is false
        this
    
      traverseChildren: (crossScope, func) ->
        @eachChild (child) ->
          recur = func(child)
          child.traverseChildren(crossScope, func) unless recur is no
  • §

    replaceInContext will traverse children looking for a node for which match returns true. Once found, the matching node will be replaced by the result of calling replacement.

      replaceInContext: (match, replacement) ->
        return false unless @children
        for attr in @children when children = @[attr]
          if Array.isArray children
            for child, i in children
              if match child
                children[i..i] = replacement child, @
                return true
              else
                return true if child.replaceInContext match, replacement
          else if match children
            @[attr] = replacement children, @
            return true
          else
            return true if children.replaceInContext match, replacement
    
      invert: ->
        new Op '!', this
    
      unwrapAll: ->
        node = this
        continue until node is node = node.unwrap()
        node
  • §

    Default implementations of the common node properties and methods. Nodes will override these with custom logic, if needed.

  • §

    children are the properties to recurse into when tree walking. The children list is the structure of the AST. The parent pointer, and the pointer to the children are how you can traverse the tree.

      children: []
  • §

    isStatement has to do with “everything is an expression”. A few things can’t be expressions, such as break. Things that isStatement returns true for are things that can’t be used as expressions. There are some error messages that come from nodes.coffee due to statements ending up in expression position.

      isStatement: NO
  • §

    Track comments that have been compiled into fragments, to avoid outputting them twice.

      compiledComments: []
  • §

    includeCommentFragments lets compileCommentFragments know whether this node has special awareness of how to handle comments within its output.

      includeCommentFragments: NO
  • §

    jumps tells you if an expression, or an internal part of an expression, has a flow control construct (like break, continue, or return) that jumps out of the normal flow of control and can’t be used as a value. (Note that throw is not considered a flow control construct.) This is important because flow control in the middle of an expression makes no sense; we have to disallow it.

      jumps: NO
  • §

    If node.shouldCache() is false, it is safe to use node more than once. Otherwise you need to store the value of node in a variable and output that variable several times instead. Kind of like this: 5 need not be cached. returnFive(), however, could have side effects as a result of evaluating it more than once, and therefore we need to cache it. The parameter is named shouldCache rather than mustCache because there are also cases where we might not need to cache but where we want to, for example a long expression that may well be idempotent but we want to cache for brevity.

      shouldCache: YES
    
      isChainable: NO
      isAssignable: NO
      isNumber: NO
    
      unwrap: THIS
      unfoldSoak: NO
  • §

    Is this node used to assign a certain variable?

      assigns: NO
  • §

    For this node and all descendents, set the location data to locationData if the location data is not already set.

      updateLocationDataIfMissing: (locationData, force) ->
        @forceUpdateLocation = yes if force
        return this if @locationData and not @forceUpdateLocation
        delete @forceUpdateLocation
        @locationData = locationData
    
        @eachChild (child) ->
          child.updateLocationDataIfMissing locationData
  • §

    Add location data from another node

      withLocationDataFrom: ({locationData}) ->
        @updateLocationDataIfMissing locationData
  • §

    Add location data and comments from another node

      withLocationDataAndCommentsFrom: (node) ->
        @withLocationDataFrom node
        {comments} = node
        @comments = comments if comments?.length
        this
  • §

    Throw a SyntaxError associated with this node’s location.

      error: (message) ->
        throwSyntaxError message, @locationData
    
      makeCode: (code) ->
        new CodeFragment this, code
    
      wrapInParentheses: (fragments) ->
        [@makeCode('('), fragments..., @makeCode(')')]
    
      wrapInBraces: (fragments) ->
        [@makeCode('{'), fragments..., @makeCode('}')]
  • §

    fragmentsList is an array of arrays of fragments. Each array in fragmentsList will be concatenated together, with joinStr added in between each, to produce a final flat array of fragments.

      joinFragmentArrays: (fragmentsList, joinStr) ->
        answer = []
        for fragments, i in fragmentsList
          if i then answer.push @makeCode joinStr
          answer = answer.concat fragments
        answer
  • §

    HoistTarget

  • §

    A HoistTargetNode represents the output location in the node tree for a hoisted node. See Base#hoist.

    exports.HoistTarget = class HoistTarget extends Base
  • §

    Expands hoisted fragments in the given array

      @expand = (fragments) ->
        for fragment, i in fragments by -1 when fragment.fragments
          fragments[i..i] = @expand fragment.fragments
        fragments
    
      constructor: (@source) ->
        super()
  • §

    Holds presentational options to apply when the source node is compiled.

        @options = {}
  • §

    Placeholder fragments to be replaced by the source node’s compilation.

        @targetFragments = { fragments: [] }
    
      isStatement: (o) ->
        @source.isStatement o
  • §

    Update the target fragments with the result of compiling the source. Calls the given compile function with the node and options (overriden with the target presentational options).

      update: (compile, o) ->
        @targetFragments.fragments = compile.call @source, merge o, @options
  • §

    Copies the target indent and level, and returns the placeholder fragments

      compileToFragments: (o, level) ->
        @options.indent = o.indent
        @options.level  = level ? o.level
        [ @targetFragments ]
    
      compileNode: (o) ->
        @compileToFragments o
    
      compileClosure: (o) ->
        @compileToFragments o
  • §

    Root

  • §

    The root node of the node tree

    exports.Root = class Root extends Base
      constructor: (@body) ->
        super()
    
        @isAsync = (new Code [], @body).isAsync
    
      children: ['body']
  • §

    Wrap everything in a safety closure, unless requested not to. It would be better not to generate them in the first place, but for now, clean up obvious double-parentheses.

      compileNode: (o) ->
        o.indent    = if o.bare then '' else TAB
        o.level     = LEVEL_TOP
        o.compiling = yes
        @initializeScope o
        fragments = @body.compileRoot o
        return fragments if o.bare
        functionKeyword = "#{if @isAsync then 'async ' else ''}function"
        [].concat @makeCode("(#{functionKeyword}() {\n"), fragments, @makeCode("\n}).call(this);\n")
    
      initializeScope: (o) ->
        o.scope = new Scope null, @body, null, o.referencedVars ? []
  • §

    Mark given local variables in the root scope as parameters so they don’t end up being declared on the root block.

        o.scope.parameter name for name in o.locals or []
    
      commentsAst: ->
        @allComments ?=
          for commentToken in (@allCommentTokens ? []) when not commentToken.heregex
            if commentToken.here
              new HereComment commentToken
            else
              new LineComment commentToken
        comment.ast() for comment in @allComments
    
      astNode: (o) ->
        o.level = LEVEL_TOP
        @initializeScope o
        super o
    
      astType: -> 'File'
    
      astProperties: (o) ->
        @body.isRootBlock = yes
        return
          program: Object.assign @body.ast(o), @astLocationData()
          comments: @commentsAst()
  • §

    Block

  • §

    The block is the list of expressions that forms the body of an indented block of code – the implementation of a function, a clause in an if, switch, or try, and so on…

    exports.Block = class Block extends Base
      constructor: (nodes) ->
        super()
    
        @expressions = compact flatten nodes or []
    
      children: ['expressions']
  • §

    Tack an expression on to the end of this expression list.

      push: (node) ->
        @expressions.push node
        this
  • §

    Remove and return the last expression of this expression list.

      pop: ->
        @expressions.pop()
  • §

    Add an expression at the beginning of this expression list.

      unshift: (node) ->
        @expressions.unshift node
        this
  • §

    If this Block consists of just a single node, unwrap it by pulling it back out.

      unwrap: ->
        if @expressions.length is 1 then @expressions[0] else this
  • §

    Is this an empty block of code?

      isEmpty: ->
        not @expressions.length
    
      isStatement: (o) ->
        for exp in @expressions when exp.isStatement o
          return yes
        no
    
      jumps: (o) ->
        for exp in @expressions
          return jumpNode if jumpNode = exp.jumps o
  • §

    A Block node does not return its entire body, rather it ensures that the final expression is returned.

      makeReturn: (results, mark) ->
        len = @expressions.length
        [..., lastExp] = @expressions
        lastExp = lastExp?.unwrap() or no
  • §

    We also need to check that we’re not returning a JSX tag if there’s an adjacent one at the same level; JSX doesn’t allow that.

        if lastExp and lastExp instanceof Parens and lastExp.body.expressions.length > 1
          {body:{expressions}} = lastExp
          [..., penult, last] = expressions
          penult = penult.unwrap()
          last = last.unwrap()
          if penult instanceof JSXElement and last instanceof JSXElement
            expressions[expressions.length - 1].error 'Adjacent JSX elements must be wrapped in an enclosing tag'
        if mark
          @expressions[len - 1]?.makeReturn results, mark
          return
        while len--
          expr = @expressions[len]
          @expressions[len] = expr.makeReturn results
          @expressions.splice(len, 1) if expr instanceof Return and not expr.expression
          break
        this
    
      compile: (o, lvl) ->
        return new Root(this).withLocationDataFrom(this).compile o, lvl unless o.scope
    
        super o, lvl
  • §

    Compile all expressions within the Block body. If we need to return the result, and it’s an expression, simply return it. If it’s a statement, ask the statement to do so.

      compileNode: (o) ->
        @tab  = o.indent
        top   = o.level is LEVEL_TOP
        compiledNodes = []
    
        for node, index in @expressions
          if node.hoisted
  • §

    This is a hoisted expression. We want to compile this and ignore the result.

            node.compileToFragments o
            continue
          node = (node.unfoldSoak(o) or node)
          if node instanceof Block
  • §

    This is a nested block. We don’t do anything special here like enclose it in a new scope; we just compile the statements in this block along with our own.

            compiledNodes.push node.compileNode o
          else if top
            node.front = yes
            fragments = node.compileToFragments o
            unless node.isStatement o
              fragments = indentInitial fragments, @
              [..., lastFragment] = fragments
              unless lastFragment.code is '' or lastFragment.isComment
                fragments.push @makeCode ';'
            compiledNodes.push fragments
          else
            compiledNodes.push node.compileToFragments o, LEVEL_LIST
        if top
          if @spaced
            return [].concat @joinFragmentArrays(compiledNodes, '\n\n'), @makeCode('\n')
          else
            return @joinFragmentArrays(compiledNodes, '\n')
        if compiledNodes.length
          answer = @joinFragmentArrays(compiledNodes, ', ')
        else
          answer = [@makeCode 'void 0']
        if compiledNodes.length > 1 and o.level >= LEVEL_LIST then @wrapInParentheses answer else answer
    
      compileRoot: (o) ->
        @spaced = yes
        fragments = @compileWithDeclarations o
        HoistTarget.expand fragments
        @compileComments fragments
  • §

    Compile the expressions body for the contents of a function, with declarations of all inner variables pushed up to the top.

      compileWithDeclarations: (o) ->
        fragments = []
        post = []
        for exp, i in @expressions
          exp = exp.unwrap()
          break unless exp instanceof Literal
        o = merge(o, level: LEVEL_TOP)
        if i
          rest = @expressions.splice i, 9e9
          [spaced,    @spaced] = [@spaced, no]
          [fragments, @spaced] = [@compileNode(o), spaced]
          @expressions = rest
        post = @compileNode o
        {scope} = o
        if scope.expressions is this
          declars = o.scope.hasDeclarations()
          assigns = scope.hasAssignments
          if declars or assigns
            fragments.push @makeCode '\n' if i
            fragments.push @makeCode "#{@tab}var "
            if declars
              declaredVariables = scope.declaredVariables()
              for declaredVariable, declaredVariablesIndex in declaredVariables
                fragments.push @makeCode declaredVariable
                if Object::hasOwnProperty.call o.scope.comments, declaredVariable
                  fragments.push o.scope.comments[declaredVariable]...
                if declaredVariablesIndex isnt declaredVariables.length - 1
                  fragments.push @makeCode ', '
            if assigns
              fragments.push @makeCode ",\n#{@tab + TAB}" if declars
              fragments.push @makeCode scope.assignedVariables().join(",\n#{@tab + TAB}")
            fragments.push @makeCode ";\n#{if @spaced then '\n' else ''}"
          else if fragments.length and post.length
            fragments.push @makeCode "\n"
        fragments.concat post
    
      compileComments: (fragments) ->
        for fragment, fragmentIndex in fragments
  • §

    Insert comments into the output at the next or previous newline. If there are no newlines at which to place comments, create them.

          if fragment.precedingComments
  • §

    Determine the indentation level of the fragment that we are about to insert comments before, and use that indentation level for our inserted comments. At this point, the fragments’ code property is the generated output JavaScript, and CoffeeScript always generates output indented by two spaces; so all we need to do is search for a code property that begins with at least two spaces.

            fragmentIndent = ''
            for pastFragment in fragments[0...(fragmentIndex + 1)] by -1
              indent = /^ {2,}/m.exec pastFragment.code
              if indent
                fragmentIndent = indent[0]
                break
              else if '\n' in pastFragment.code
                break
            code = "\n#{fragmentIndent}" + (
                for commentFragment in fragment.precedingComments
                  if commentFragment.isHereComment and commentFragment.multiline
                    multident commentFragment.code, fragmentIndent, no
                  else
                    commentFragment.code
              ).join("\n#{fragmentIndent}").replace /^(\s*)$/gm, ''
            for pastFragment, pastFragmentIndex in fragments[0...(fragmentIndex + 1)] by -1
              newLineIndex = pastFragment.code.lastIndexOf '\n'
              if newLineIndex is -1
  • §

    Keep searching previous fragments until we can’t go back any further, either because there are no fragments left or we’ve discovered that we’re in a code block that is interpolated inside a string.

                if pastFragmentIndex is 0
                  pastFragment.code = '\n' + pastFragment.code
                  newLineIndex = 0
                else if pastFragment.isStringWithInterpolations and pastFragment.code is '{'
                  code = code[1..] + '\n' # Move newline to end.
                  newLineIndex = 1
                else
                  continue
              delete fragment.precedingComments
              pastFragment.code = pastFragment.code[0...newLineIndex] +
                code + pastFragment.code[newLineIndex..]
              break
  • §

    Yes, this is awfully similar to the previous if block, but if you look closely you’ll find lots of tiny differences that make this confusing if it were abstracted into a function that both blocks share.

          if fragment.followingComments
  • §

    Does the first trailing comment follow at the end of a line of code, like ; // Comment, or does it start a new line after a line of code?

            trail = fragment.followingComments[0].trail
            fragmentIndent = ''
  • §

    Find the indent of the next line of code, if we have any non-trailing comments to output. We need to first find the next newline, as these comments will be output after that; and then the indent of the line that follows the next newline.

            unless trail and fragment.followingComments.length is 1
              onNextLine = no
              for upcomingFragment in fragments[fragmentIndex...]
                unless onNextLine
                  if '\n' in upcomingFragment.code
                    onNextLine = yes
                  else
                    continue
                else
                  indent = /^ {2,}/m.exec upcomingFragment.code
                  if indent
                    fragmentIndent = indent[0]
                    break
                  else if '\n' in upcomingFragment.code
                    break
  • §

    Is this comment following the indent inserted by bare mode? If so, there’s no need to indent this further.

            code = if fragmentIndex is 1 and /^\s+$/.test fragments[0].code
              ''
            else if trail
              ' '
            else
              "\n#{fragmentIndent}"
  • §

    Assemble properly indented comments.

            code += (
                for commentFragment in fragment.followingComments
                  if commentFragment.isHereComment and commentFragment.multiline
                    multident commentFragment.code, fragmentIndent, no
                  else
                    commentFragment.code
              ).join("\n#{fragmentIndent}").replace /^(\s*)$/gm, ''
            for upcomingFragment, upcomingFragmentIndex in fragments[fragmentIndex...]
              newLineIndex = upcomingFragment.code.indexOf '\n'
              if newLineIndex is -1
  • §

    Keep searching upcoming fragments until we can’t go any further, either because there are no fragments left or we’ve discovered that we’re in a code block that is interpolated inside a string.

                if upcomingFragmentIndex is fragments.length - 1
                  upcomingFragment.code = upcomingFragment.code + '\n'
                  newLineIndex = upcomingFragment.code.length
                else if upcomingFragment.isStringWithInterpolations and upcomingFragment.code is '}'
                  code = "#{code}\n"
                  newLineIndex = 0
                else
                  continue
              delete fragment.followingComments
  • §

    Avoid inserting extra blank lines.

              code = code.replace /^\n/, '' if upcomingFragment.code is '\n'
              upcomingFragment.code = upcomingFragment.code[0...newLineIndex] +
                code + upcomingFragment.code[newLineIndex..]
              break
    
        fragments
  • §

    Wrap up the given nodes as a Block, unless it already happens to be one.

      @wrap: (nodes) ->
        return nodes[0] if nodes.length is 1 and nodes[0] instanceof Block
        new Block nodes
    
      astNode: (o) ->
        if (o.level? and o.level isnt LEVEL_TOP) and @expressions.length
          return (new Sequence(@expressions).withLocationDataFrom @).ast o
    
        super o
    
      astType: ->
        if @isRootBlock
          'Program'
        else if @isClassBody
          'ClassBody'
        else
          'BlockStatement'
    
      astProperties: (o) ->
        checkForDirectives = del o, 'checkForDirectives'
    
        sniffDirectives @expressions, notFinalExpression: checkForDirectives if @isRootBlock or checkForDirectives
        directives = []
        body = []
        for expression in @expressions
          expressionAst = expression.ast o
  • §

    Ignore generated PassthroughLiteral

          if not expressionAst?
            continue
          else if expression instanceof Directive
            directives.push expressionAst
  • §

    If an expression is a statement, it can be added to the body as is.

          else if expression.isStatementAst o
            body.push expressionAst
  • §

    Otherwise, we need to wrap it in an ExpressionStatement AST node.

          else
            body.push Object.assign
                type: 'ExpressionStatement'
                expression: expressionAst
              ,
                expression.astLocationData()
    
        return {
  • §

    For now, we’re not including sourceType on the Program AST node. Its value could be either 'script' or 'module', and there’s no way for CoffeeScript to always know which it should be. The presence of an import or export statement in source code would imply that it should be a module, but a project may consist of mostly such files and also an outlier file that lacks import or export but is still imported into the project and therefore expects to be treated as a module. Determining the value of sourceType is essentially the same challenge posed by determining the parse goal of a JavaScript file, also module or script, and so if Node figures out a way to do so for .js files then CoffeeScript can copy Node’s algorithm.

  • §

    sourceType: ‘module’

          body, directives
        }
    
      astLocationData: ->
        return if @isRootBlock and not @locationData?
        super()
  • §

    A directive e.g. ‘use strict’. Currently only used during AST generation.

    exports.Directive = class Directive extends Base
      constructor: (@value) ->
        super()
    
      astProperties: (o) ->
        return
          value: Object.assign {},
            @value.ast o
            type: 'DirectiveLiteral'
  • §

    Literal

  • §

    Literal is a base class for static values that can be passed through directly into JavaScript without translation, such as: strings, numbers, true, false, null

    exports.Literal = class Literal extends Base
      constructor: (@value) ->
        super()
    
      shouldCache: NO
    
      assigns: (name) ->
        name is @value
    
      compileNode: (o) ->
        [@makeCode @value]
    
      astProperties: ->
        return
          value: @value
    
      toString: ->
  • §

    This is only intended for debugging.

        " #{if @isStatement() then super() else @constructor.name}: #{@value}"
    
    exports.NumberLiteral = class NumberLiteral extends Literal
      constructor: (@value, {@parsedValue} = {}) ->
        super()
        unless @parsedValue?
          if isNumber @value
            @parsedValue = @value
            @value = "#{@value}"
          else
            @parsedValue = parseNumber @value
    
      isBigInt: ->
        /n$/.test @value
    
      astType: ->
        if @isBigInt()
          'BigIntLiteral'
        else
          'NumericLiteral'
    
      astProperties: ->
        return
          value:
            if @isBigInt()
              @parsedValue.toString()
            else
              @parsedValue
          extra:
            rawValue:
              if @isBigInt()
                @parsedValue.toString()
              else
                @parsedValue
            raw: @value
    
    exports.InfinityLiteral = class InfinityLiteral extends NumberLiteral
      constructor: (@value, {@originalValue = 'Infinity'} = {}) ->
        super()
    
      compileNode: ->
        [@makeCode '2e308']
    
      astNode: (o) ->
        unless @originalValue is 'Infinity'
          return new NumberLiteral(@value).withLocationDataFrom(@).ast o
        super o
    
      astType: -> 'Identifier'
    
      astProperties: ->
        return
          name: 'Infinity'
          declaration: no
    
    exports.NaNLiteral = class NaNLiteral extends NumberLiteral
      constructor: ->
        super 'NaN'
    
      compileNode: (o) ->
        code = [@makeCode '0/0']
        if o.level >= LEVEL_OP then @wrapInParentheses code else code
    
      astType: -> 'Identifier'
    
      astProperties: ->
        return
          name: 'NaN'
          declaration: no
    
    exports.StringLiteral = class StringLiteral extends Literal
      constructor: (@originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex} = {}) ->
        super ''
        @quote = null if @quote is '///'
        @fromSourceString = @quote?
        @quote ?= '"'
        heredoc = @isFromHeredoc()
    
        val = @originalValue
        if @heregex
          val = val.replace HEREGEX_OMIT, '$1$2'
          val = replaceUnicodeCodePointEscapes val, flags: @heregex.flags
        else
          val = val.replace STRING_OMIT, '$1'
          val =
            unless @fromSourceString
              val
            else if heredoc
              indentRegex = /// \n#{@indent} ///g if @indent
    
              val = val.replace indentRegex, '\n' if indentRegex
              val = val.replace LEADING_BLANK_LINE,  '' if @initialChunk
              val = val.replace TRAILING_BLANK_LINE, '' if @finalChunk
              val
            else
              val.replace SIMPLE_STRING_OMIT, (match, offset) =>
                if (@initialChunk and offset is 0) or
                   (@finalChunk and offset + match.length is val.length)
                  ''
                else
                  ' '
        @delimiter = @quote.charAt 0
        @value = makeDelimitedLiteral val, {
          @delimiter
          @double
        }
    
        @unquotedValueForTemplateLiteral = makeDelimitedLiteral val, {
          delimiter: '`'
          @double
          escapeNewlines: no
          includeDelimiters: no
          convertTrailingNullEscapes: yes
        }
    
        @unquotedValueForJSX = makeDelimitedLiteral val, {
          @double
          escapeNewlines: no
          includeDelimiters: no
          escapeDelimiter: no
        }
    
      compileNode: (o) ->
        return StringWithInterpolations.fromStringLiteral(@).compileNode o if @shouldGenerateTemplateLiteral()
        return [@makeCode @unquotedValueForJSX] if @jsx
        super o
  • §

    StringLiterals can represent either entire literal strings or pieces of text inside of e.g. an interpolated string. When parsed as the former but needing to be treated as the latter (e.g. the string part of a tagged template literal), this will return a copy of the StringLiteral with the quotes trimmed from its location data (like it would have if parsed as part of an interpolated string).

      withoutQuotesInLocationData: ->
        endsWithNewline = @originalValue[-1..] is '\n'
        locationData = Object.assign {}, @locationData
        locationData.first_column          += @quote.length
        if endsWithNewline
          locationData.last_line -= 1
          locationData.last_column =
            if locationData.last_line is locationData.first_line
              locationData.first_column + @originalValue.length - '\n'.length
            else
              @originalValue[...-1].length - '\n'.length - @originalValue[...-1].lastIndexOf('\n')
        else
          locationData.last_column         -= @quote.length
        locationData.last_column_exclusive -= @quote.length
        locationData.range = [
          locationData.range[0] + @quote.length
          locationData.range[1] - @quote.length
        ]
        copy = new StringLiteral @originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex}
        copy.locationData = locationData
        copy
    
      isFromHeredoc: ->
        @quote.length is 3
    
      shouldGenerateTemplateLiteral: ->
        @isFromHeredoc()
    
      astNode: (o) ->
        return StringWithInterpolations.fromStringLiteral(@).ast o if @shouldGenerateTemplateLiteral()
        super o
    
      astProperties: ->
        return
          value: @originalValue
          extra:
            raw: "#{@delimiter}#{@originalValue}#{@delimiter}"
    
    exports.RegexLiteral = class RegexLiteral extends Literal
      constructor: (value, {@delimiter = '/', @heregexCommentTokens = []} = {}) ->
        super ''
        heregex = @delimiter is '///'
        endDelimiterIndex = value.lastIndexOf '/'
        @flags = value[endDelimiterIndex + 1..]
        val = @originalValue = value[1...endDelimiterIndex]
        val = val.replace HEREGEX_OMIT, '$1$2' if heregex
        val = replaceUnicodeCodePointEscapes val, {@flags}
        @value = "#{makeDelimitedLiteral val, delimiter: '/'}#{@flags}"
    
      REGEX_REGEX: /// ^ / (.*) / \w* $ ///
    
      astType: -> 'RegExpLiteral'
    
      astProperties: (o) ->
        [, pattern] = @REGEX_REGEX.exec @value
        return {
          value: undefined
          pattern, @flags, @delimiter
          originalPattern: @originalValue
          extra:
            raw: @value
            originalRaw: "#{@delimiter}#{@originalValue}#{@delimiter}#{@flags}"
            rawValue: undefined
          comments:
            for heregexCommentToken in @heregexCommentTokens
              if heregexCommentToken.here
                new HereComment(heregexCommentToken).ast o
              else
                new LineComment(heregexCommentToken).ast o
        }
    
    exports.PassthroughLiteral = class PassthroughLiteral extends Literal
      constructor: (@originalValue, {@here, @generated} = {}) ->
        super ''
        @value = @originalValue.replace /\\+(`|$)/g, (string) ->
  • §

    string is always a value like ‘`‘, ‘\`‘, ‘\\`‘, etc. By reducing it to its latter half, we turn ‘`‘ to ‘', '\\\‘ to ‘`‘, etc.

          string[-Math.ceil(string.length / 2)..]
    
      astNode: (o) ->
        return null if @generated
        super o
    
      astProperties: ->
        return {
          value: @originalValue
          here: !!@here
        }
    
    exports.IdentifierLiteral = class IdentifierLiteral extends Literal
      isAssignable: YES
    
      eachName: (iterator) ->
        iterator @
    
      astType: ->
        if @jsx
          'JSXIdentifier'
        else
          'Identifier'
    
      astProperties: ->
        return
          name: @value
          declaration: !!@isDeclaration
    
    exports.PropertyName = class PropertyName extends Literal
      isAssignable: YES
    
      astType: ->
        if @jsx
          'JSXIdentifier'
        else
          'Identifier'
    
      astProperties: ->
        return
          name: @value
          declaration: no
    
    exports.ComputedPropertyName = class ComputedPropertyName extends PropertyName
      compileNode: (o) ->
        [@makeCode('['), @value.compileToFragments(o, LEVEL_LIST)..., @makeCode(']')]
    
      astNode: (o) ->
        @value.ast o
    
    exports.StatementLiteral = class StatementLiteral extends Literal
      isStatement: YES
    
      makeReturn: THIS
    
      jumps: (o) ->
        return this if @value is 'break' and not (o?.loop or o?.block)
        return this if @value is 'continue' and not o?.loop
    
      compileNode: (o) ->
        [@makeCode "#{@tab}#{@value};"]
    
      astType: ->
        switch @value
          when 'continue' then 'ContinueStatement'
          when 'break'    then 'BreakStatement'
          when 'debugger' then 'DebuggerStatement'
    
    exports.ThisLiteral = class ThisLiteral extends Literal
      constructor: (value) ->
        super 'this'
        @shorthand = value is '@'
    
      compileNode: (o) ->
        code = if o.scope.method?.bound then o.scope.method.context else @value
        [@makeCode code]
    
      astType: -> 'ThisExpression'
    
      astProperties: ->
        return
          shorthand: @shorthand
    
    exports.UndefinedLiteral = class UndefinedLiteral extends Literal
      constructor: ->
        super 'undefined'
    
      compileNode: (o) ->
        [@makeCode if o.level >= LEVEL_ACCESS then '(void 0)' else 'void 0']
    
      astType: -> 'Identifier'
    
      astProperties: ->
        return
          name: @value
          declaration: no
    
    exports.NullLiteral = class NullLiteral extends Literal
      constructor: ->
        super 'null'
    
    exports.BooleanLiteral = class BooleanLiteral extends Literal
      constructor: (value, {@originalValue} = {}) ->
        super value
        @originalValue ?= @value
    
      astProperties: ->
        value: if @value is 'true' then yes else no
        name: @originalValue
    
    exports.DefaultLiteral = class DefaultLiteral extends Literal
      astType: -> 'Identifier'
    
      astProperties: ->
        return
          name: 'default'
          declaration: no
  • §

    Return

  • §

    A return is a pureStatement—wrapping it in a closure wouldn’t make sense.

    exports.Return = class Return extends Base
      constructor: (@expression, {@belongsToFuncDirectiveReturn} = {}) ->
        super()
    
      children: ['expression']
    
      isStatement:     YES
      makeReturn:      THIS
      jumps:           THIS
    
      compileToFragments: (o, level) ->
        expr = @expression?.makeReturn()
        if expr and expr not instanceof Return then expr.compileToFragments o, level else super o, level
    
      compileNode: (o) ->
        answer = []
  • §

    TODO: If we call expression.compile() here twice, we’ll sometimes get back different results!

        if @expression
          answer = @expression.compileToFragments o, LEVEL_PAREN
          unshiftAfterComments answer, @makeCode "#{@tab}return "
  • §

    Since the return got indented by @tab, preceding comments that are multiline need to be indented.

          for fragment in answer
            if fragment.isHereComment and '\n' in fragment.code
              fragment.code = multident fragment.code, @tab
            else if fragment.isLineComment
              fragment.code = "#{@tab}#{fragment.code}"
            else
              break
        else
          answer.push @makeCode "#{@tab}return"
        answer.push @makeCode ';'
        answer
    
      checkForPureStatementInExpression: ->
  • §

    don’t flag return from await return/yield return as invalid.

        return if @belongsToFuncDirectiveReturn
        super()
    
      astType: -> 'ReturnStatement'
    
      astProperties: (o) ->
        argument: @expression?.ast(o, LEVEL_PAREN) ? null
  • §

    Parent class for YieldReturn/AwaitReturn.

    exports.FuncDirectiveReturn = class FuncDirectiveReturn extends Return
      constructor: (expression, {@returnKeyword}) ->
        super expression
    
      compileNode: (o) ->
        @checkScope o
        super o
    
      checkScope: (o) ->
        unless o.scope.parent?
          @error "#{@keyword} can only occur inside functions"
    
      isStatementAst: NO
    
      astNode: (o) ->
        @checkScope o
    
        new Op @keyword,
          new Return @expression, belongsToFuncDirectiveReturn: yes
          .withLocationDataFrom(
            if @expression?
              locationData: mergeLocationData @returnKeyword.locationData, @expression.locationData
            else
              @returnKeyword
          )
        .withLocationDataFrom @
        .ast o
  • §

    yield return works exactly like return, except that it turns the function into a generator.

    exports.YieldReturn = class YieldReturn extends FuncDirectiveReturn
      keyword: 'yield'
    
    exports.AwaitReturn = class AwaitReturn extends FuncDirectiveReturn
      keyword: 'await'
  • §

    Value

  • §

    A value, variable or literal or parenthesized, indexed or dotted into, or vanilla.

    exports.Value = class Value extends Base
      constructor: (base, props, tag, isDefaultValue = no) ->
        super()
        return base if not props and base instanceof Value
        @base           = base
        @properties     = props or []
        @tag            = tag
        @[tag]          = yes if tag
        @isDefaultValue = isDefaultValue
  • §

    If this is a @foo = assignment, if there are comments on @ move them to be on foo.

        if @base?.comments and @base instanceof ThisLiteral and @properties[0]?.name?
          moveComments @base, @properties[0].name
    
      children: ['base', 'properties']
  • §

    Add a property (or properties ) Access to the list.

      add: (props) ->
        @properties = @properties.concat props
        @forceUpdateLocation = yes
        this
    
      hasProperties: ->
        @properties.length isnt 0
    
      bareLiteral: (type) ->
        not @properties.length and @base instanceof type
  • §

    Some boolean checks for the benefit of other nodes.

      isArray        : -> @bareLiteral(Arr)
      isRange        : -> @bareLiteral(Range)
      shouldCache    : -> @hasProperties() or @base.shouldCache()
      isAssignable   : (opts) -> @hasProperties() or @base.isAssignable opts
      isNumber       : -> @bareLiteral(NumberLiteral)
      isString       : -> @bareLiteral(StringLiteral)
      isRegex        : -> @bareLiteral(RegexLiteral)
      isUndefined    : -> @bareLiteral(UndefinedLiteral)
      isNull         : -> @bareLiteral(NullLiteral)
      isBoolean      : -> @bareLiteral(BooleanLiteral)
      isAtomic       : ->
        for node in @properties.concat @base
          return no if node.soak or node instanceof Call or node instanceof Op and node.operator is 'do'
        yes
    
      isNotCallable  : -> @isNumber() or @isString() or @isRegex() or
                          @isArray() or @isRange() or @isSplice() or @isObject() or
                          @isUndefined() or @isNull() or @isBoolean()
    
      isStatement : (o)    -> not @properties.length and @base.isStatement o
      isJSXTag    : -> @base instanceof JSXTag
      assigns     : (name) -> not @properties.length and @base.assigns name
      jumps       : (o)    -> not @properties.length and @base.jumps o
    
      isObject: (onlyGenerated) ->
        return no if @properties.length
        (@base instanceof Obj) and (not onlyGenerated or @base.generated)
    
      isElision: ->
        return no unless @base instanceof Arr
        @base.hasElision()
    
      isSplice: ->
        [..., lastProperty] = @properties
        lastProperty instanceof Slice
    
      looksStatic: (className) ->
        return no unless ((thisLiteral = @base) instanceof ThisLiteral or (name = @base).value is className) and
          @properties.length is 1 and @properties[0].name?.value isnt 'prototype'
        return
          staticClassName: thisLiteral ? name
  • §

    The value can be unwrapped as its inner node, if there are no attached properties.

      unwrap: ->
        if @properties.length then this else @base
  • §

    A reference has base part (this value) and name part. We cache them separately for compiling complex expressions. a()[b()] ?= c -> (_base = a())[_name = b()] ? _base[_name] = c

      cacheReference: (o) ->
        [..., name] = @properties
        if @properties.length < 2 and not @base.shouldCache() and not name?.shouldCache()
          return [this, this]  # `a` `a.b`
        base = new Value @base, @properties[...-1]
        if base.shouldCache()  # `a().b`
          bref = new IdentifierLiteral o.scope.freeVariable 'base'
          base = new Value new Parens new Assign bref, base
        return [base, bref] unless name  # `a()`
        if name.shouldCache()  # `a[b()]`
          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 or base.base, [nref or name])]
  • §

    We compile a value to JavaScript by compiling and joining each property. Things get much more interesting if the chain of properties has soak operators ?. interspersed. Then we have to take care not to accidentally evaluate anything twice when building the soak chain.

      compileNode: (o) ->
        @base.front = @front
        props = @properties
        if props.length and @base.cached?
  • §

    Cached fragments enable correct order of the compilation, and reuse of variables in the scope. Example: a(x = 5).b(-> x = 6) should compile in the same order as a(x = 5); b(-> x = 6) (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)

          fragments = @base.cached
        else
          fragments = @base.compileToFragments o, (if props.length then LEVEL_ACCESS else null)
        if props.length and SIMPLENUM.test fragmentsToText fragments
          fragments.push @makeCode '.'
        for prop in props
          fragments.push (prop.compileToFragments o)...
    
        fragments
  • §

    Unfold a soak into an If: a?.b -> a.b if a?

      unfoldSoak: (o) ->
        @unfoldedSoak ?= do =>
          ifn = @base.unfoldSoak o
          if ifn
            ifn.body.properties.push @properties...
            return ifn
          for prop, i in @properties when prop.soak
            prop.soak = off
            fst = new Value @base, @properties[...i]
            snd = new Value @base, @properties[i..]
            if fst.shouldCache()
              ref = new IdentifierLiteral o.scope.freeVariable 'ref'
              fst = new Parens new Assign ref, fst
              snd.base = ref
            return new If new Existence(fst), snd, soak: on
          no
    
      eachName: (iterator, {checkAssignability = yes} = {}) ->
        if @hasProperties()
          iterator @
        else if not checkAssignability or @base.isAssignable()
          @base.eachName iterator
        else
          @error 'tried to assign to unassignable value'
  • §

    For AST generation, we need an object that’s this Value minus its last property, if it has properties.

      object: ->
        return @ unless @hasProperties()
  • §

    Get all properties except the last one; for a Value with only one property, initialProperties is an empty array.

        initialProperties = @properties[0...@properties.length - 1]
  • §

    Create the object that becomes the new “base” for the split-off final property.

        object = new Value @base, initialProperties, @tag, @isDefaultValue
  • §

    Add location data to our new node, so that it has correct location data for source maps or later conversion into AST location data.

        object.locationData =
          if initialProperties.length is 0
  • §

    This new Value has only one property, so the location data is just that of the parent Value’s base.

            @base.locationData
          else
  • §

    This new Value has multiple properties, so the location data spans from the parent Value’s base to the last property that’s included in this new node (a.k.a. the second-to-last property of the parent).

            mergeLocationData @base.locationData, initialProperties[initialProperties.length - 1].locationData
        object
    
      containsSoak: ->
        return no unless @hasProperties()
    
        for property in @properties when property.soak
          return yes
    
        return yes if @base instanceof Call and @base.soak
    
        no
    
      astNode: (o) ->
  • §

    If the Value has no properties, the AST node is just whatever this node’s base is.

        return @base.ast o unless @hasProperties()
  • §

    Otherwise, call Base::ast which in turn calls the astType and astProperties methods below.

        super o
    
      astType: ->
        if @isJSXTag()
          'JSXMemberExpression'
        else if @containsSoak()
          'OptionalMemberExpression'
        else
          'MemberExpression'
  • §

    If this Value has properties, the last property (e.g. c in a.b.c) becomes the property, and the preceding properties (e.g. a.b) become a child Value node assigned to the object property.

      astProperties: (o) ->
        [..., property] = @properties
        property.name.jsx = yes if @isJSXTag()
        computed = property instanceof Index or property.name?.unwrap() not instanceof PropertyName
        return {
          object: @object().ast o, LEVEL_ACCESS
          property: property.ast o, (LEVEL_PAREN if computed)
          computed
          optional: !!property.soak
          shorthand: !!property.shorthand
        }
    
      astLocationData: ->
        return super() unless @isJSXTag()
  • §

    don’t include leading < of JSX tag in location data

        mergeAstLocationData(
          jisonLocationDataToAstLocationData(@base.tagNameLocationData),
          jisonLocationDataToAstLocationData(@properties[@properties.length - 1].locationData)
        )
    
    exports.MetaProperty = class MetaProperty extends Base
      constructor: (@meta, @property) ->
        super()
    
      children: ['meta', 'property']
    
      checkValid: (o) ->
        if @meta.value is 'new'
          if @property instanceof Access and @property.name.value is 'target'
            unless o.scope.parent?
              @error "new.target can only occur inside functions"
          else
            @error "the only valid meta property for new is new.target"
        else if @meta.value is 'import'
          unless @property instanceof Access and @property.name.value is 'meta'
            @error "the only valid meta property for import is import.meta"
    
      compileNode: (o) ->
        @checkValid o
        fragments = []
        fragments.push @meta.compileToFragments(o, LEVEL_ACCESS)...
        fragments.push @property.compileToFragments(o)...
        fragments
    
      astProperties: (o) ->
        @checkValid o
    
        return
          meta: @meta.ast o, LEVEL_ACCESS
          property: @property.ast o
  • §

    HereComment

  • §

    Comment delimited by ### (becoming /* */).

    exports.HereComment = class HereComment extends Base
      constructor: ({ @content, @newLine, @unshift, @locationData }) ->
        super()
    
      compileNode: (o) ->
        multiline = '\n' in @content
  • §

    Unindent multiline comments. They will be reindented later.

        if multiline
          indent = null
          for line in @content.split '\n'
            leadingWhitespace = /^\s*/.exec(line)[0]
            if not indent or leadingWhitespace.length < indent.length
              indent = leadingWhitespace
          @content = @content.replace /// \n #{indent} ///g, '\n' if indent
    
        hasLeadingMarks = /\n\s*[#|\*]/.test @content
        @content = @content.replace /^([ \t]*)#(?=\s)/gm, ' *' if hasLeadingMarks
    
        @content = "/*#{@content}#{if hasLeadingMarks then ' ' else ''}*/"
        fragment = @makeCode @content
        fragment.newLine = @newLine
        fragment.unshift = @unshift
        fragment.multiline = multiline
  • §

    Don’t rely on fragment.type, which can break when the compiler is minified.

        fragment.isComment = fragment.isHereComment = yes
        fragment
    
      astType: -> 'CommentBlock'
    
      astProperties: ->
        return
          value: @content
  • §

    LineComment

  • §

    Comment running from # to the end of a line (becoming //).

    exports.LineComment = class LineComment extends Base
      constructor: ({ @content, @newLine, @unshift, @locationData, @precededByBlankLine }) ->
        super()
    
      compileNode: (o) ->
        fragment = @makeCode(if /^\s*$/.test @content then '' else "#{if @precededByBlankLine then "\n#{o.indent}" else ''}//#{@content}")
        fragment.newLine = @newLine
        fragment.unshift = @unshift
        fragment.trail = not @newLine and not @unshift
  • §

    Don’t rely on fragment.type, which can break when the compiler is minified.

        fragment.isComment = fragment.isLineComment = yes
        fragment
    
      astType: -> 'CommentLine'
    
      astProperties: ->
        return
          value: @content
  • §

    JSX

    exports.JSXIdentifier = class JSXIdentifier extends IdentifierLiteral
      astType: -> 'JSXIdentifier'
    
    exports.JSXTag = class JSXTag extends JSXIdentifier
      constructor: (value, {
        @tagNameLocationData
        @closingTagOpeningBracketLocationData
        @closingTagSlashLocationData
        @closingTagNameLocationData
        @closingTagClosingBracketLocationData
      }) ->
        super value
    
      astProperties: ->
        return
          name: @value
    
    exports.JSXExpressionContainer = class JSXExpressionContainer extends Base
      constructor: (@expression, {locationData} = {}) ->
        super()
        @expression.jsxAttribute = yes
        @locationData = locationData ? @expression.locationData
    
      children: ['expression']
    
      compileNode: (o) ->
        @expression.compileNode(o)
    
      astProperties: (o) ->
        return
          expression: astAsBlockIfNeeded @expression, o
    
    exports.JSXEmptyExpression = class JSXEmptyExpression extends Base
    
    exports.JSXText = class JSXText extends Base
      constructor: (stringLiteral) ->
        super()
        @value = stringLiteral.unquotedValueForJSX
        @locationData = stringLiteral.locationData
    
      astProperties: ->
        return {
          @value
          extra:
            raw: @value
        }
    
    exports.JSXAttribute = class JSXAttribute extends Base
      constructor: ({@name, value}) ->
        super()
        @value =
          if value?
            value = value.base
            if value instanceof StringLiteral and not value.shouldGenerateTemplateLiteral()
              value
            else
              new JSXExpressionContainer value
          else
            null
        @value?.comments = value.comments
    
      children: ['name', 'value']
    
      compileNode: (o) ->
        compiledName = @name.compileToFragments o, LEVEL_LIST
        return compiledName unless @value?
        val = @value.compileToFragments o, LEVEL_LIST
        compiledName.concat @makeCode('='), val
    
      astProperties: (o) ->
        name = @name
        if ':' in name.value
          name = new JSXNamespacedName name
        return
          name: name.ast o
          value: @value?.ast(o) ? null
    
    exports.JSXAttributes = class JSXAttributes extends Base
      constructor: (arr) ->
        super()
        @attributes = []
        for object in arr.objects
          @checkValidAttribute object
          {base} = object
          if base instanceof IdentifierLiteral
  • §

    attribute with no value eg disabled

            attribute = new JSXAttribute name: new JSXIdentifier(base.value).withLocationDataAndCommentsFrom base
            attribute.locationData = base.locationData
            @attributes.push attribute
          else if not base.generated
  • §

    object spread attribute eg {…props}

            attribute = base.properties[0]
            attribute.jsx = yes
            attribute.locationData = base.locationData
            @attributes.push attribute
          else
  • §

    Obj containing attributes with values eg a=”b” c={d}

            for property in base.properties
              {variable, value} = property
              attribute = new JSXAttribute {
                name: new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom variable.base
                value
              }
              attribute.locationData = property.locationData
              @attributes.push attribute
        @locationData = arr.locationData
    
      children: ['attributes']
  • §

    Catch invalid attributes: <div {a:”b”, props} {props} “value” />

      checkValidAttribute: (object) ->
        {base: attribute} = object
        properties = attribute?.properties or []
        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)))
          object.error """
            Unexpected token. Allowed JSX attributes are: id="val", src={source}, {props...} or attribute.
          """
    
      compileNode: (o) ->
        fragments = []
        for attribute in @attributes
          fragments.push @makeCode ' '
          fragments.push attribute.compileToFragments(o, LEVEL_TOP)...
        fragments
    
      astNode: (o) ->
        attribute.ast(o) for attribute in @attributes
    
    exports.JSXNamespacedName = class JSXNamespacedName extends Base
      constructor: (tag) ->
        super()
        [namespace, name] = tag.value.split ':'
        @namespace = new JSXIdentifier(namespace).withLocationDataFrom locationData: extractSameLineLocationDataFirst(namespace.length) tag.locationData
        @name      = new JSXIdentifier(name     ).withLocationDataFrom locationData: extractSameLineLocationDataLast(name.length      ) tag.locationData
        @locationData = tag.locationData
    
      children: ['namespace', 'name']
    
      astProperties: (o) ->
        return
          namespace: @namespace.ast o
          name: @name.ast o
  • §

    Node for a JSX element

    exports.JSXElement = class JSXElement extends Base
      constructor: ({@tagName, @attributes, @content}) ->
        super()
    
      children: ['tagName', 'attributes', 'content']
    
      compileNode: (o) ->
        @content?.base.jsx = yes
        fragments = [@makeCode('<')]
        fragments.push (tag = @tagName.compileToFragments(o, LEVEL_ACCESS))...
        fragments.push @attributes.compileToFragments(o)...
        if @content
          fragments.push @makeCode('>')
          fragments.push @content.compileNode(o, LEVEL_LIST)...
          fragments.push [@makeCode('</'), tag..., @makeCode('>')]...
        else
          fragments.push @makeCode(' />')
        fragments
    
      isFragment: ->
        !@tagName.base.value.length
    
      astNode: (o) ->
  • §

    The location data spanning the opening element < … > is captured by the generated Arr which contains the element’s attributes

        @openingElementLocationData = jisonLocationDataToAstLocationData @attributes.locationData
    
        tagName = @tagName.base
        tagName.locationData = tagName.tagNameLocationData
        if @content?
          @closingElementLocationData = mergeAstLocationData(
            jisonLocationDataToAstLocationData tagName.closingTagOpeningBracketLocationData
            jisonLocationDataToAstLocationData tagName.closingTagClosingBracketLocationData
          )
    
        super o
    
      astType: ->
        if @isFragment()
          'JSXFragment'
        else
          'JSXElement'
    
      elementAstProperties: (o) ->
        tagNameAst = =>
          tag = @tagName.unwrap()
          if tag?.value and ':' in tag.value
            tag = new JSXNamespacedName tag
          tag.ast o
    
        openingElement = Object.assign {
          type: 'JSXOpeningElement'
          name: tagNameAst()
          selfClosing: not @closingElementLocationData?
          attributes: @attributes.ast o
        }, @openingElementLocationData
    
        closingElement = null
        if @closingElementLocationData?
          closingElement = Object.assign {
            type: 'JSXClosingElement'
            name: Object.assign(
              tagNameAst(),
              jisonLocationDataToAstLocationData @tagName.base.closingTagNameLocationData
            )
          }, @closingElementLocationData
          if closingElement.name.type in ['JSXMemberExpression', 'JSXNamespacedName']
            rangeDiff = closingElement.range[0] - openingElement.range[0] + '/'.length
            columnDiff = closingElement.loc.start.column - openingElement.loc.start.column + '/'.length
            shiftAstLocationData = (node) =>
              node.range = [
                node.range[0] + rangeDiff
                node.range[1] + rangeDiff
              ]
              node.start += rangeDiff
              node.end += rangeDiff
              node.loc.start =
                line: @closingElementLocationData.loc.start.line
                column: node.loc.start.column + columnDiff
              node.loc.end =
                line: @closingElementLocationData.loc.start.line
                column: node.loc.end.column + columnDiff
            if closingElement.name.type is 'JSXMemberExpression'
              currentExpr = closingElement.name
              while currentExpr.type is 'JSXMemberExpression'
                shiftAstLocationData currentExpr unless currentExpr is closingElement.name
                shiftAstLocationData currentExpr.property
                currentExpr = currentExpr.object
              shiftAstLocationData currentExpr
            else # JSXNamespacedName
              shiftAstLocationData closingElement.name.namespace
              shiftAstLocationData closingElement.name.name
    
        {openingElement, closingElement}
    
      fragmentAstProperties: (o) ->
        openingFragment = Object.assign {
          type: 'JSXOpeningFragment'
        }, @openingElementLocationData
    
        closingFragment = Object.assign {
          type: 'JSXClosingFragment'
        }, @closingElementLocationData
    
        {openingFragment, closingFragment}
    
      contentAst: (o) ->
        return [] unless @content and not @content.base.isEmpty?()
    
        content = @content.unwrapAll()
        children =
          if content instanceof StringLiteral
            [new JSXText content]
          else # StringWithInterpolations
            for element in @content.unwrapAll().extractElements o, includeInterpolationWrappers: yes, isJsx: yes
              if element instanceof StringLiteral
                new JSXText element
              else # Interpolation
                {expression} = element
                unless expression?
                  emptyExpression = new JSXEmptyExpression()
                  emptyExpression.locationData = emptyExpressionLocationData {
                    interpolationNode: element
                    openingBrace: '{'
                    closingBrace: '}'
                  }
    
                  new JSXExpressionContainer emptyExpression, locationData: element.locationData
                else
                  unwrapped = expression.unwrapAll()
                  if unwrapped instanceof JSXElement and
  • §

    distinguish <a><b /></a> from <a>{<b />}</a>

                      unwrapped.locationData.range[0] is element.locationData.range[0]
                    unwrapped
                  else
                    new JSXExpressionContainer unwrapped, locationData: element.locationData
    
        child.ast(o) for child in children when not (child instanceof JSXText and child.value.length is 0)
    
      astProperties: (o) ->
        Object.assign(
          if @isFragment()
            @fragmentAstProperties o
          else
            @elementAstProperties o
        ,
          children: @contentAst o
        )
    
      astLocationData: ->
        if @closingElementLocationData?
          mergeAstLocationData @openingElementLocationData, @closingElementLocationData
        else
          @openingElementLocationData
  • §

    Call

  • §

    Node for a function invocation.

    exports.Call = class Call extends Base
      constructor: (@variable, @args = [], @soak, @token) ->
        super()
    
        @implicit = @args.implicit
        @isNew = no
        if @variable instanceof Value and @variable.isNotCallable()
          @variable.error "literal is not a function"
    
        if @variable.base instanceof JSXTag
          return new JSXElement(
            tagName: @variable
            attributes: new JSXAttributes @args[0].base
            content: @args[1]
          )
  • §

    @variable never gets output as a result of this node getting created as part of RegexWithInterpolations, so for that case move any comments to the args property that gets passed into RegexWithInterpolations via the grammar.

        if @variable.base?.value is 'RegExp' and @args.length isnt 0
          moveComments @variable, @args[0]
    
      children: ['variable', 'args']
  • §

    When setting the location, we sometimes need to update the start location to account for a newly-discovered new operator to the left of us. This expands the range on the left, but not the right.

      updateLocationDataIfMissing: (locationData) ->
        if @locationData and @needsUpdatedStartLocation
          @locationData = Object.assign {},
            @locationData,
            first_line: locationData.first_line
            first_column: locationData.first_column
            range: [
              locationData.range[0]
              @locationData.range[1]
            ]
          base = @variable?.base or @variable
          if base.needsUpdatedStartLocation
            @variable.locationData = Object.assign {},
              @variable.locationData,
              first_line: locationData.first_line
              first_column: locationData.first_column
              range: [
                locationData.range[0]
                @variable.locationData.range[1]
              ]
            base.updateLocationDataIfMissing locationData
          delete @needsUpdatedStartLocation
        super locationData
  • §

    Tag this invocation as creating a new instance.

      newInstance: ->
        base = @variable?.base or @variable
        if base instanceof Call and not base.isNew
          base.newInstance()
        else
          @isNew = true
        @needsUpdatedStartLocation = true
        this
  • §

    Soaked chained invocations unfold into if/else ternary structures.

      unfoldSoak: (o) ->
        if @soak
          if @variable instanceof Super
            left = new Literal @variable.compile o
            rite = new Value left
            @variable.error "Unsupported reference to 'super'" unless @variable.accessor?
          else
            return ifn if ifn = unfoldSoak o, this, 'variable'
            [left, rite] = new Value(@variable).cacheReference o
          rite = new Call rite, @args
          rite.isNew = @isNew
          left = new Literal "typeof #{ left.compile o } === \"function\""
          return new If left, new Value(rite), soak: yes
        call = this
        list = []
        loop
          if call.variable instanceof Call
            list.push call
            call = call.variable
            continue
          break unless call.variable instanceof Value
          list.push call
          break unless (call = call.variable.base) instanceof Call
        for call in list.reverse()
          if ifn
            if call.variable instanceof Call
              call.variable = ifn
            else
              call.variable.base = ifn
          ifn = unfoldSoak o, call, 'variable'
        ifn
  • §

    Compile a vanilla function call.

      compileNode: (o) ->
        @checkForNewSuper()
        @variable?.front = @front
        compiledArgs = []
  • §

    If variable is Accessor fragments are cached and used later in Value::compileNode to ensure correct order of the compilation, and reuse of variables in the scope. Example: a(x = 5).b(-> x = 6) should compile in the same order as a(x = 5); b(-> x = 6) (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)

        varAccess = @variable?.properties?[0] instanceof Access
        argCode = (arg for arg in (@args || []) when arg instanceof Code)
        if argCode.length > 0 and varAccess and not @variable.base.cached
          [cache] = @variable.base.cache o, LEVEL_ACCESS, -> no
          @variable.base.cached = cache
    
        for arg, argIndex in @args
          if argIndex then compiledArgs.push @makeCode ", "
          compiledArgs.push (arg.compileToFragments o, LEVEL_LIST)...
    
        fragments = []
        if @isNew
          fragments.push @makeCode 'new '
        fragments.push @variable.compileToFragments(o, LEVEL_ACCESS)...
        fragments.push @makeCode('('), compiledArgs..., @makeCode(')')
        fragments
    
      checkForNewSuper: ->
        if @isNew
          @variable.error "Unsupported reference to 'super'" if @variable instanceof Super
    
      containsSoak: ->
        return yes if @soak
        return yes if @variable?.containsSoak?()
        no
    
      astNode: (o) ->
        if @soak and @variable instanceof Super and o.scope.namedMethod()?.ctor
          @variable.error "Unsupported reference to 'super'"
        @checkForNewSuper()
        super o
    
      astType: ->
        if @isNew
          'NewExpression'
        else if @containsSoak()
          'OptionalCallExpression'
        else
          'CallExpression'
    
      astProperties: (o) ->
        return
          callee: @variable.ast o, LEVEL_ACCESS
          arguments: arg.ast(o, LEVEL_LIST) for arg in @args
          optional: !!@soak
          implicit: !!@implicit
  • §

    Super

  • §

    Takes care of converting super() calls into calls against the prototype’s function of the same name. When expressions are set the call will be compiled in such a way that the expressions are evaluated without altering the return value of the SuperCall expression.

    exports.SuperCall = class SuperCall extends Call
      children: Call::children.concat ['expressions']
    
      isStatement: (o) ->
        @expressions?.length and o.level is LEVEL_TOP
    
      compileNode: (o) ->
        return super o unless @expressions?.length
    
        superCall   = new Literal fragmentsToText super o
        replacement = new Block @expressions.slice()
    
        if o.level > LEVEL_TOP
  • §

    If we might be in an expression we need to cache and return the result

          [superCall, ref] = superCall.cache o, null, YES
          replacement.push ref
    
        replacement.unshift superCall
        replacement.compileToFragments o, if o.level is LEVEL_TOP then o.level else LEVEL_LIST
    
    exports.Super = class Super extends Base
      constructor: (@accessor, @superLiteral) ->
        super()
    
      children: ['accessor']
    
      compileNode: (o) ->
        @checkInInstanceMethod o
    
        method = o.scope.namedMethod()
        unless method.ctor? or @accessor?
          {name, variable} = method
          if name.shouldCache() or (name instanceof Index and name.index.isAssignable())
            nref = new IdentifierLiteral o.scope.parent.freeVariable 'name'
            name.index = new Assign nref, name.index
          @accessor = if nref? then new Index nref else name
    
        if @accessor?.name?.comments
  • §

    A super() call gets compiled to e.g. super.method(), which means the method property name gets compiled for the first time here, and again when the method: property of the class gets compiled. Since this compilation happens first, comments attached to method: would get incorrectly output near super.method(), when we want them to get output on the second pass when method: is output. So set them aside during this compilation pass, and put them back on the object so that they’re there for the later compilation.

          salvagedComments = @accessor.name.comments
          delete @accessor.name.comments
        fragments = (new Value (new Literal 'super'), if @accessor then [ @accessor ] else [])
        .compileToFragments o
        attachCommentsToNode salvagedComments, @accessor.name if salvagedComments
        fragments
    
      checkInInstanceMethod: (o) ->
        method = o.scope.namedMethod()
        @error 'cannot use super outside of an instance method' unless method?.isMethod
    
      astNode: (o) ->
        @checkInInstanceMethod o
    
        if @accessor?
          return (
            new Value(
              new Super().withLocationDataFrom (@superLiteral ? @)
              [@accessor]
            ).withLocationDataFrom @
          ).ast o
    
        super o
  • §

    RegexWithInterpolations

  • §

    Regexes with interpolations are in fact just a variation of a Call (a RegExp() call to be precise) with a StringWithInterpolations inside.

    exports.RegexWithInterpolations = class RegexWithInterpolations extends Base
      constructor: (@call, {@heregexCommentTokens = []} = {}) ->
        super()
    
      children: ['call']
    
      compileNode: (o) ->
        @call.compileNode o
    
      astType: -> 'InterpolatedRegExpLiteral'
    
      astProperties: (o) ->
        interpolatedPattern: @call.args[0].ast o
        flags: @call.args[1]?.unwrap().originalValue ? ''
        comments:
          for heregexCommentToken in @heregexCommentTokens
            if heregexCommentToken.here
              new HereComment(heregexCommentToken).ast o
            else
              new LineComment(heregexCommentToken).ast o
  • §

    TaggedTemplateCall

    exports.TaggedTemplateCall = class TaggedTemplateCall extends Call
      constructor: (variable, arg, soak) ->
        arg = StringWithInterpolations.fromStringLiteral arg if arg instanceof StringLiteral
        super variable, [ arg ], soak
    
      compileNode: (o) ->
        @variable.compileToFragments(o, LEVEL_ACCESS).concat @args[0].compileToFragments(o, LEVEL_LIST)
    
      astType: -> 'TaggedTemplateExpression'
    
      astProperties: (o) ->
        return
          tag: @variable.ast o, LEVEL_ACCESS
          quasi: @args[0].ast o, LEVEL_LIST
  • §

    Extends

  • §

    Node to extend an object’s prototype with an ancestor object. After goog.inherits from the Closure Library.

    exports.Extends = class Extends extends Base
      constructor: (@child, @parent) ->
        super()
    
      children: ['child', 'parent']
  • §

    Hooks one constructor into another’s prototype chain.

      compileToFragments: (o) ->
        new Call(new Value(new Literal utility 'extend', o), [@child, @parent]).compileToFragments o
  • §

    Access

  • §

    A . access into a property of a value, or the :: shorthand for an access into the object’s prototype.

    exports.Access = class Access extends Base
      constructor: (@name, {@soak, @shorthand} = {}) ->
        super()
    
      children: ['name']
    
      compileToFragments: (o) ->
        name = @name.compileToFragments o
        node = @name.unwrap()
        if node instanceof PropertyName
          [@makeCode('.'), name...]
        else
          [@makeCode('['), name..., @makeCode(']')]
    
      shouldCache: NO
    
      astNode: (o) ->
  • §

    Babel doesn’t have an AST node for Access, but rather just includes this Access node’s child name Identifier node as the property of the MemberExpression node.

        @name.ast o
  • §

    Index

  • §

    A [ ... ] indexed access into an array or object.

    exports.Index = class Index extends Base
      constructor: (@index) ->
        super()
    
      children: ['index']
    
      compileToFragments: (o) ->
        [].concat @makeCode("["), @index.compileToFragments(o, LEVEL_PAREN), @makeCode("]")
    
      shouldCache: ->
        @index.shouldCache()
    
      astNode: (o) ->
  • §

    Babel doesn’t have an AST node for Index, but rather just includes this Index node’s child index Identifier node as the property of the MemberExpression node. The fact that the MemberExpression’s property is an Index means that computed is true for the MemberExpression.

        @index.ast o
  • §

    Range

  • §

    A range literal. Ranges can be used to extract portions (slices) of arrays, to specify a range for comprehensions, or as a value, to be expanded into the corresponding array of integers at runtime.

    exports.Range = class Range extends Base
    
      children: ['from', 'to']
    
      constructor: (@from, @to, tag) ->
        super()
    
        @exclusive = tag is 'exclusive'
        @equals = if @exclusive then '' else '='
  • §

    Compiles the range’s source variables – where it starts and where it ends. But only if they need to be cached to avoid double evaluation.

      compileVariables: (o) ->
        o = merge o, top: true
        shouldCache = del o, 'shouldCache'
        [@fromC, @fromVar] = @cacheToCodeFragments @from.cache o, LEVEL_LIST, shouldCache
        [@toC, @toVar]     = @cacheToCodeFragments @to.cache o, LEVEL_LIST, shouldCache
        [@step, @stepVar]  = @cacheToCodeFragments step.cache o, LEVEL_LIST, shouldCache if step = del o, 'step'
        @fromNum = if @from.isNumber() then parseNumber @fromVar else null
        @toNum   = if @to.isNumber()   then parseNumber @toVar   else null
        @stepNum = if step?.isNumber() then parseNumber @stepVar else null
  • §

    When compiled normally, the range returns the contents of the for loop needed to iterate over the values in the range. Used by comprehensions.

      compileNode: (o) ->
        @compileVariables o unless @fromVar
        return @compileArray(o) unless o.index
  • §

    Set up endpoints.

        known    = @fromNum? and @toNum?
        idx      = del o, 'index'
        idxName  = del o, 'name'
        namedIndex = idxName and idxName isnt idx
        varPart  =
          if known and not namedIndex
            "var #{idx} = #{@fromC}"
          else
            "#{idx} = #{@fromC}"
        varPart += ", #{@toC}" if @toC isnt @toVar
        varPart += ", #{@step}" if @step isnt @stepVar
        [lt, gt] = ["#{idx} <#{@equals}", "#{idx} >#{@equals}"]
  • §

    Generate the condition.

        [from, to] = [@fromNum, @toNum]
  • §

    Always check if the step isn’t zero to avoid the infinite loop.

        stepNotZero = "#{ @stepNum ? @stepVar } !== 0"
        stepCond = "#{ @stepNum ? @stepVar } > 0"
        lowerBound = "#{lt} #{ if known then to else @toVar }"
        upperBound = "#{gt} #{ if known then to else @toVar }"
        condPart =
          if @step?
            if @stepNum? and @stepNum isnt 0
              if @stepNum > 0 then "#{lowerBound}" else "#{upperBound}"
            else
              "#{stepNotZero} && (#{stepCond} ? #{lowerBound} : #{upperBound})"
          else
            if known
              "#{ if from <= to then lt else gt } #{to}"
            else
              "(#{@fromVar} <= #{@toVar} ? #{lowerBound} : #{upperBound})"
    
        cond = if @stepVar then "#{@stepVar} > 0" else "#{@fromVar} <= #{@toVar}"
  • §

    Generate the step.

        stepPart = if @stepVar
          "#{idx} += #{@stepVar}"
        else if known
          if namedIndex
            if from <= to then "++#{idx}" else "--#{idx}"
          else
            if from <= to then "#{idx}++" else "#{idx}--"
        else
          if namedIndex
            "#{cond} ? ++#{idx} : --#{idx}"
          else
            "#{cond} ? #{idx}++ : #{idx}--"
    
        varPart  = "#{idxName} = #{varPart}" if namedIndex
        stepPart = "#{idxName} = #{stepPart}" if namedIndex
  • §

    The final loop body.

        [@makeCode "#{varPart}; #{condPart}; #{stepPart}"]
  • §

    When used as a value, expand the range into the equivalent array.

      compileArray: (o) ->
        known = @fromNum? and @toNum?
        if known and Math.abs(@fromNum - @toNum) <= 20
          range = [@fromNum..@toNum]
          range.pop() if @exclusive
          return [@makeCode "[#{ range.join(', ') }]"]
        idt    = @tab + TAB
        i      = o.scope.freeVariable 'i', single: true, reserve: no
        result = o.scope.freeVariable 'results', reserve: no
        pre    = "\n#{idt}var #{result} = [];"
        if known
          o.index = i
          body    = fragmentsToText @compileNode o
        else
          vars    = "#{i} = #{@fromC}" + if @toC isnt @toVar then ", #{@toC}" else ''
          cond    = "#{@fromVar} <= #{@toVar}"
          body    = "var #{vars}; #{cond} ? #{i} <#{@equals} #{@toVar} : #{i} >#{@equals} #{@toVar}; #{cond} ? #{i}++ : #{i}--"
        post   = "{ #{result}.push(#{i}); }\n#{idt}return #{result};\n#{o.indent}"
        hasArgs = (node) -> node?.contains isLiteralArguments
        args   = ', arguments' if hasArgs(@from) or hasArgs(@to)
        [@makeCode "(function() {#{pre}\n#{idt}for (#{body})#{post}}).apply(this#{args ? ''})"]
    
      astProperties: (o) ->
        return {
          from: @from?.ast(o) ? null
          to: @to?.ast(o) ? null
          @exclusive
        }
  • §

    Slice

  • §

    An array slice literal. Unlike JavaScript’s Array#slice, the second parameter specifies the index of the end of the slice, just as the first parameter is the index of the beginning.

    exports.Slice = class Slice extends Base
    
      children: ['range']
    
      constructor: (@range) ->
        super()
  • §

    We have to be careful when trying to slice through the end of the array, 9e9 is used because not all implementations respect undefined or 1/0. 9e9 should be safe because 9e9 > 2**32, the max array length.

      compileNode: (o) ->
        {to, from} = @range
  • §

    Handle an expression in the property access, e.g. a[!b in c..].

        if from?.shouldCache()
          from = new Value new Parens from
        if to?.shouldCache()
          to = new Value new Parens to
        fromCompiled = from?.compileToFragments(o, LEVEL_PAREN) or [@makeCode '0']
        if to
          compiled     = to.compileToFragments o, LEVEL_PAREN
          compiledText = fragmentsToText compiled
          if not (not @range.exclusive and +compiledText is -1)
            toStr = ', ' + if @range.exclusive
              compiledText
            else if to.isNumber()
              "#{+compiledText + 1}"
            else
              compiled = to.compileToFragments o, LEVEL_ACCESS
              "+#{fragmentsToText compiled} + 1 || 9e9"
        [@makeCode ".slice(#{ fragmentsToText fromCompiled }#{ toStr or '' })"]
    
      astNode: (o) ->
        @range.ast o
  • §

    Obj

  • §

    An object literal, nothing fancy.

    exports.Obj = class Obj extends Base
      constructor: (props, @generated = no) ->
        super()
    
        @objects = @properties = props or []
    
      children: ['properties']
    
      isAssignable: (opts) ->
        for prop in @properties
  • §

    Check for reserved words.

          message = isUnassignable prop.unwrapAll().value
          prop.error message if message
    
          prop = prop.value if prop instanceof Assign and
            prop.context is 'object' and
            prop.value?.base not instanceof Arr
          return no unless prop.isAssignable opts
        yes
    
      shouldCache: ->
        not @isAssignable()
  • §

    Check if object contains splat.

      hasSplat: ->
        return yes for prop in @properties when prop instanceof Splat
        no
  • §

    Move rest property to the end of the list. {a, rest..., b} = obj -> {a, b, rest...} = obj foo = ({a, rest..., b}) -> -> foo = {a, b, rest...}) ->

      reorderProperties: ->
        props = @properties
        splatProps = @getAndCheckSplatProps()
        splatProp = props.splice splatProps[0], 1
        @objects = @properties = [].concat props, splatProp
    
      compileNode: (o) ->
        @reorderProperties() if @hasSplat() and @lhs
        props = @properties
        if @generated
          for node in props when node instanceof Value
            node.error 'cannot have an implicit value in an implicit object'
    
        idt      = o.indent += TAB
        lastNode = @lastNode @properties
  • §

    If this object is the left-hand side of an assignment, all its children are too.

        @propagateLhs()
    
        isCompact = yes
        for prop in @properties
          if prop instanceof Assign and prop.context is 'object'
            isCompact = no
    
        answer = []
        answer.push @makeCode if isCompact then '' else '\n'
        for prop, i in props
          join = if i is props.length - 1
            ''
          else if isCompact
            ', '
          else if prop is lastNode
            '\n'
          else
            ',\n'
          indent = if isCompact then '' else idt
    
          key = if prop instanceof Assign and prop.context is 'object'
            prop.variable
          else if prop instanceof Assign
            prop.operatorToken.error "unexpected #{prop.operatorToken.value}" unless @lhs
            prop.variable
          else
            prop
          if key instanceof Value and key.hasProperties()
            key.error 'invalid object key' if prop.context is 'object' or not key.this
            key  = key.properties[0].name
            prop = new Assign key, prop, 'object'
          if key is prop
            if prop.shouldCache()
              [key, value] = prop.base.cache o
              key  = new PropertyName key.value if key instanceof IdentifierLiteral
              prop = new Assign key, value, 'object'
            else if key instanceof Value and key.base instanceof ComputedPropertyName
  • §

    { [foo()] } output as { [ref = foo()]: ref }.

              if prop.base.value.shouldCache()
                [key, value] = prop.base.value.cache o
                key  = new ComputedPropertyName key.value if key instanceof IdentifierLiteral
                prop = new Assign key, value, 'object'
              else
  • §

    { [expression] } output as { [expression]: expression }.

                prop = new Assign key, prop.base.value, 'object'
            else if not prop.bareLiteral?(IdentifierLiteral) and prop not instanceof Splat
              prop = new Assign prop, prop, 'object'
          if indent then answer.push @makeCode indent
          answer.push prop.compileToFragments(o, LEVEL_TOP)...
          if join then answer.push @makeCode join
        answer.push @makeCode if isCompact then '' else "\n#{@tab}"
        answer = @wrapInBraces answer
        if @front then @wrapInParentheses answer else answer
    
      getAndCheckSplatProps: ->
        return unless @hasSplat() and @lhs
        props = @properties
        splatProps = (i for prop, i in props when prop instanceof Splat)
        props[splatProps[1]].error "multiple spread elements are disallowed" if splatProps?.length > 1
        splatProps
    
      assigns: (name) ->
        for prop in @properties when prop.assigns name then return yes
        no
    
      eachName: (iterator) ->
        for prop in @properties
          prop = prop.value if prop instanceof Assign and prop.context is 'object'
          prop = prop.unwrapAll()
          prop.eachName iterator if prop.eachName?
  • §

    Convert “bare” properties to ObjectPropertys (or Splats).

      expandProperty: (property) ->
        {variable, context, operatorToken} = property
        key = if property instanceof Assign and context is 'object'
          variable
        else if property instanceof Assign
          operatorToken.error "unexpected #{operatorToken.value}" unless @lhs
          variable
        else
          property
        if key instanceof Value and key.hasProperties()
          key.error 'invalid object key' unless context isnt 'object' and key.this
          if property instanceof Assign
            return new ObjectProperty fromAssign: property
          else
            return new ObjectProperty key: property
        return new ObjectProperty(fromAssign: property) unless key is property
        return property if property instanceof Splat
    
        new ObjectProperty key: property
    
      expandProperties: ->
        @expandProperty(property) for property in @properties
    
      propagateLhs: (setLhs) ->
        @lhs = yes if setLhs
        return unless @lhs
    
        for property in @properties
          if property instanceof Assign and property.context is 'object'
            {value} = property
            unwrappedValue = value.unwrapAll()
            if unwrappedValue instanceof Arr or unwrappedValue instanceof Obj
              unwrappedValue.propagateLhs yes
            else if unwrappedValue instanceof Assign
              unwrappedValue.nestedLhs = yes
          else if property instanceof Assign
  • §

    Shorthand property with default, e.g. {a = 1} = b.

            property.nestedLhs = yes
          else if property instanceof Splat
            property.propagateLhs yes
    
      astNode: (o) ->
        @getAndCheckSplatProps()
        super o
    
      astType: ->
        if @lhs
          'ObjectPattern'
        else
          'ObjectExpression'
    
      astProperties: (o) ->
        return
          implicit: !!@generated
          properties:
            property.ast(o) for property in @expandProperties()
    
    exports.ObjectProperty = class ObjectProperty extends Base
      constructor: ({key, fromAssign}) ->
        super()
        if fromAssign
          {variable: @key, value, context} = fromAssign
          if context is 'object'
  • §

    All non-shorthand properties (i.e. includes :).

            @value = value
          else
  • §

    Left-hand-side shorthand with default e.g. {a = 1} = b.

            @value = fromAssign
            @shorthand = yes
          @locationData = fromAssign.locationData
        else
  • §

    Shorthand without default e.g. {a} or {@a} or {[a]}.

          @key = key
          @shorthand = yes
          @locationData = key.locationData
    
      astProperties: (o) ->
        isComputedPropertyName = (@key instanceof Value and @key.base instanceof ComputedPropertyName) or @key.unwrap() instanceof StringWithInterpolations
        keyAst = @key.ast o, LEVEL_LIST
    
        return
          key:
            if keyAst?.declaration
              Object.assign {}, keyAst, declaration: no
            else
              keyAst
          value: @value?.ast(o, LEVEL_LIST) ? keyAst
          shorthand: !!@shorthand
          computed: !!isComputedPropertyName
          method: no
  • §

    Arr

  • §

    An array literal.

    exports.Arr = class Arr extends Base
      constructor: (objs, @lhs = no) ->
        super()
        @objects = objs or []
        @propagateLhs()
    
      children: ['objects']
    
      hasElision: ->
        return yes for obj in @objects when obj instanceof Elision
        no
    
      isAssignable: (opts) ->
        {allowExpansion, allowNontrailingSplat, allowEmptyArray = no} = opts ? {}
        return allowEmptyArray unless @objects.length
    
        for obj, i in @objects
          return no if not allowNontrailingSplat and obj instanceof Splat and i + 1 isnt @objects.length
          return no unless (allowExpansion and obj instanceof Expansion) or (obj.isAssignable(opts) and (not obj.isAtomic or obj.isAtomic()))
        yes
    
      shouldCache: ->
        not @isAssignable()
    
      compileNode: (o) ->
        return [@makeCode '[]'] unless @objects.length
        o.indent += TAB
        fragmentIsElision = ([ fragment ]) ->
          fragment.type is 'Elision' and fragment.code.trim() is ','
  • §

    Detect if Elisions at the beginning of the array are processed (e.g. [, , , a]).

        passedElision = no
    
        answer = []
        for obj, objIndex in @objects
          unwrappedObj = obj.unwrapAll()
  • §

    Let compileCommentFragments know to intersperse block comments into the fragments created when compiling this array.

          if unwrappedObj.comments and
             unwrappedObj.comments.filter((comment) -> not comment.here).length is 0
            unwrappedObj.includeCommentFragments = YES
    
        compiledObjs = (obj.compileToFragments o, LEVEL_LIST for obj in @objects)
        olen = compiledObjs.length
  • §

    If compiledObjs includes newlines, we will output this as a multiline array (i.e. with a newline and indentation after the [). If an element contains line comments, that should also trigger multiline output since by definition line comments will introduce newlines into our output. The exception is if only the first element has line comments; in that case, output as the compact form if we otherwise would have, so that the first element’s line comments get output before or after the array.

        includesLineCommentsOnNonFirstElement = no
        for fragments, index in compiledObjs
          for fragment in fragments
            if fragment.isHereComment
              fragment.code = fragment.code.trim()
            else if index isnt 0 and includesLineCommentsOnNonFirstElement is no and hasLineComments fragment
              includesLineCommentsOnNonFirstElement = yes
  • §

    Add ‘, ‘ if all Elisions from the beginning of the array are processed (e.g. [, , , a]) and element isn’t Elision or last element is Elision (e.g. [a,,b,,])

          if index isnt 0 and passedElision and (not fragmentIsElision(fragments) or index is olen - 1)
            answer.push @makeCode ', '
          passedElision = passedElision or not fragmentIsElision fragments
          answer.push fragments...
        if includesLineCommentsOnNonFirstElement or '\n' in fragmentsToText(answer)
          for fragment, fragmentIndex in answer
            if fragment.isHereComment
              fragment.code = "#{multident(fragment.code, o.indent, no)}\n#{o.indent}"
            else if fragment.code is ', ' and not fragment?.isElision and fragment.type not in ['StringLiteral', 'StringWithInterpolations']
              fragment.code = ",\n#{o.indent}"
          answer.unshift @makeCode "[\n#{o.indent}"
          answer.push @makeCode "\n#{@tab}]"
        else
          for fragment in answer when fragment.isHereComment
            fragment.code = "#{fragment.code} "
          answer.unshift @makeCode '['
          answer.push @makeCode ']'
        answer
    
      assigns: (name) ->
        for obj in @objects when obj.assigns name then return yes
        no
    
      eachName: (iterator) ->
        for obj in @objects
          obj = obj.unwrapAll()
          obj.eachName iterator
  • §

    If this array is the left-hand side of an assignment, all its children are too.

      propagateLhs: (setLhs) ->
        @lhs = yes if setLhs
        return unless @lhs
        for object in @objects
          object.lhs = yes if object instanceof Splat or object instanceof Expansion
          unwrappedObject = object.unwrapAll()
          if unwrappedObject instanceof Arr or unwrappedObject instanceof Obj
            unwrappedObject.propagateLhs yes
          else if unwrappedObject instanceof Assign
            unwrappedObject.nestedLhs = yes
    
      astType: ->
        if @lhs
          'ArrayPattern'
        else
          'ArrayExpression'
    
      astProperties: (o) ->
        return
          elements:
            object.ast(o, LEVEL_LIST) for object in @objects
  • §

    Class

  • §

    The CoffeeScript class definition. Initialize a Class with its name, an optional superclass, and a body.

    exports.Class = class Class extends Base
      children: ['variable', 'parent', 'body']
    
      constructor: (@variable, @parent, @body) ->
        super()
        unless @body?
          @body = new Block
          @hasGeneratedBody = yes
    
      compileNode: (o) ->
        @name          = @determineName()
        executableBody = @walkBody o
  • §

    Special handling to allow class expr.A extends A declarations

        parentName    = @parent.base.value if @parent instanceof Value and not @parent.hasProperties()
        @hasNameClash = @name? and @name is parentName
    
        node = @
    
        if executableBody or @hasNameClash
          node = new ExecutableClassBody node, executableBody
        else if not @name? and o.level is LEVEL_TOP
  • §

    Anonymous classes are only valid in expressions

          node = new Parens node
    
        if @boundMethods.length and @parent
          @variable ?= new IdentifierLiteral o.scope.freeVariable '_class'
          [@variable, @variableRef] = @variable.cache o unless @variableRef?
    
        if @variable
          node = new Assign @variable, node, null, { @moduleDeclaration }
    
        @compileNode = @compileClassDeclaration
        try
          return node.compileToFragments o
        finally
          delete @compileNode
    
      compileClassDeclaration: (o) ->
        @ctor ?= @makeDefaultConstructor() if @externalCtor or @boundMethods.length
        @ctor?.noReturn = true
    
        @proxyBoundMethods() if @boundMethods.length
    
        o.indent += TAB
    
        result = []
        result.push @makeCode "class "
        result.push @makeCode @name if @name
        @compileCommentFragments o, @variable, result if @variable?.comments?
        result.push @makeCode ' ' if @name
        result.push @makeCode('extends '), @parent.compileToFragments(o)..., @makeCode ' ' if @parent
    
        result.push @makeCode '{'
        unless @body.isEmpty()
          @body.spaced = true
          result.push @makeCode '\n'
          result.push @body.compileToFragments(o, LEVEL_TOP)...
          result.push @makeCode "\n#{@tab}"
        result.push @makeCode '}'
    
        result
  • §

    Figure out the appropriate name for this class

      determineName: ->
        return null unless @variable
        [..., tail] = @variable.properties
        node = if tail
          tail instanceof Access and tail.name
        else
          @variable.base
        unless node instanceof IdentifierLiteral or node instanceof PropertyName
          return null
        name = node.value
        unless tail
          message = isUnassignable name
          @variable.error message if message
        if name in JS_FORBIDDEN then "_#{name}" else name
    
      walkBody: (o) ->
        @ctor          = null
        @boundMethods  = []
        executableBody = null
    
        initializer     = []
        { expressions } = @body
    
        i = 0
        for expression in expressions.slice()
          if expression instanceof Value and expression.isObject true
            { properties } = expression.base
            exprs     = []
            end       = 0
            start     = 0
            pushSlice = -> exprs.push new Value new Obj properties[start...end], true if end > start
    
            while assign = properties[end]
              if initializerExpression = @addInitializerExpression assign, o
                pushSlice()
                exprs.push initializerExpression
                initializer.push initializerExpression
                start = end + 1
              end++
            pushSlice()
    
            expressions[i..i] = exprs
            i += exprs.length
          else
            if initializerExpression = @addInitializerExpression expression, o
              initializer.push initializerExpression
              expressions[i] = initializerExpression
            i += 1
    
        for method in initializer when method instanceof Code
          if method.ctor
            method.error 'Cannot define more than one constructor in a class' if @ctor
            @ctor = method
          else if method.isStatic and method.bound
            method.context = @name
          else if method.bound
            @boundMethods.push method
    
        return unless o.compiling
        if initializer.length isnt expressions.length
          @body.expressions = (expression.hoist() for expression in initializer)
          new Block expressions
  • §

    Add an expression to the class initializer

    This is the key method for determining whether an expression in a class body should appear in the initializer or the executable body. If the given node is valid in a class body the method will return a (new, modified, or identical) node for inclusion in the class initializer, otherwise nothing will be returned and the node will appear in the executable body.

    At time of writing, only methods (instance and static) are valid in ES class initializers. As new ES class features (such as class fields) reach Stage 4, this method will need to be updated to support them. We additionally allow PassthroughLiterals (backticked expressions) in the initializer as an escape hatch for ES features that are not implemented (e.g. getters and setters defined via the get and set keywords as opposed to the Object.defineProperty method).

      addInitializerExpression: (node, o) ->
        if node.unwrapAll() instanceof PassthroughLiteral
          node
        else if @validInitializerMethod node
          @addInitializerMethod node
        else if not o.compiling and @validClassProperty node
          @addClassProperty node
        else if not o.compiling and @validClassPrototypeProperty node
          @addClassPrototypeProperty node
        else
          null
  • §

    Checks if the given node is a valid ES class initializer method.

      validInitializerMethod: (node) ->
        return no unless node instanceof Assign and node.value instanceof Code
        return yes if node.context is 'object' and not node.variable.hasProperties()
        return node.variable.looksStatic(@name) and (@name or not node.value.bound)
  • §

    Returns a configured class initializer method

      addInitializerMethod: (assign) ->
        { variable, value: method, operatorToken } = assign
        method.isMethod = yes
        method.isStatic = variable.looksStatic @name
    
        if method.isStatic
          method.name = variable.properties[0]
        else
          methodName  = variable.base
          method.name = new (if methodName.shouldCache() then Index else Access) methodName
          method.name.updateLocationDataIfMissing methodName.locationData
          isConstructor =
            if methodName instanceof StringLiteral
              methodName.originalValue is 'constructor'
            else
              methodName.value is 'constructor'
          method.ctor = (if @parent then 'derived' else 'base') if isConstructor
          method.error 'Cannot define a constructor as a bound (fat arrow) function' if method.bound and method.ctor
    
        method.operatorToken = operatorToken
        method
    
      validClassProperty: (node) ->
        return no unless node instanceof Assign
        return node.variable.looksStatic @name
    
      addClassProperty: (assign) ->
        {variable, value, operatorToken} = assign
        {staticClassName} = variable.looksStatic @name
        new ClassProperty({
          name: variable.properties[0]
          isStatic: yes
          staticClassName
          value
          operatorToken
        }).withLocationDataFrom assign
    
      validClassPrototypeProperty: (node) ->
        return no unless node instanceof Assign
        node.context is 'object' and not node.variable.hasProperties()
    
      addClassPrototypeProperty: (assign) ->
        {variable, value} = assign
        new ClassPrototypeProperty({
          name: variable.base
          value
        }).withLocationDataFrom assign
    
      makeDefaultConstructor: ->
        ctor = @addInitializerMethod new Assign (new Value new PropertyName 'constructor'), new Code
        @body.unshift ctor
    
        if @parent
          ctor.body.push new SuperCall new Super, [new Splat new IdentifierLiteral 'arguments']
    
        if @externalCtor
          applyCtor = new Value @externalCtor, [ new Access new PropertyName 'apply' ]
          applyArgs = [ new ThisLiteral, new IdentifierLiteral 'arguments' ]
          ctor.body.push new Call applyCtor, applyArgs
          ctor.body.makeReturn()
    
        ctor
    
      proxyBoundMethods: ->
        @ctor.thisAssignments = for method in @boundMethods
          method.classVariable = @variableRef if @parent
    
          name = new Value(new ThisLiteral, [ method.name ])
          new Assign name, new Call(new Value(name, [new Access new PropertyName 'bind']), [new ThisLiteral])
    
        null
    
      declareName: (o) ->
        return unless (name = @variable?.unwrap()) instanceof IdentifierLiteral
        alreadyDeclared = o.scope.find name.value
        name.isDeclaration = not alreadyDeclared
    
      isStatementAst: -> yes
    
      astNode: (o) ->
        if jumpNode = @body.jumps()
          jumpNode.error 'Class bodies cannot contain pure statements'
        if argumentsNode = @body.contains isLiteralArguments
          argumentsNode.error "Class bodies shouldn't reference arguments"
        @declareName o
        @name = @determineName()
        @body.isClassBody = yes
        @body.locationData = zeroWidthLocationDataFromEndLocation @locationData if @hasGeneratedBody
        @walkBody o
        sniffDirectives @body.expressions
        @ctor?.noReturn = yes
    
        super o
    
      astType: (o) ->
        if o.level is LEVEL_TOP
          'ClassDeclaration'
        else
          'ClassExpression'
    
      astProperties: (o) ->
        return
          id: @variable?.ast(o) ? null
          superClass: @parent?.ast(o, LEVEL_PAREN) ? null
          body: @body.ast o, LEVEL_TOP
    
    exports.ExecutableClassBody = class ExecutableClassBody extends Base
      children: [ 'class', 'body' ]
    
      defaultClassVariableName: '_Class'
    
      constructor: (@class, @body = new Block) ->
        super()
    
      compileNode: (o) ->
        if jumpNode = @body.jumps()
          jumpNode.error 'Class bodies cannot contain pure statements'
        if argumentsNode = @body.contains isLiteralArguments
          argumentsNode.error "Class bodies shouldn't reference arguments"
    
        params  = []
        args    = [new ThisLiteral]
        wrapper = new Code params, @body
        klass   = new Parens new Call (new Value wrapper, [new Access new PropertyName 'call']), args
    
        @body.spaced = true
    
        o.classScope = wrapper.makeScope o.scope
    
        @name      = @class.name ? o.classScope.freeVariable @defaultClassVariableName
        ident      = new IdentifierLiteral @name
        directives = @walkBody()
        @setContext()
    
        if @class.hasNameClash
          parent = new IdentifierLiteral o.classScope.freeVariable 'superClass'
          wrapper.params.push new Param parent
          args.push @class.parent
          @class.parent = parent
    
        if @externalCtor
          externalCtor = new IdentifierLiteral o.classScope.freeVariable 'ctor', reserve: no
          @class.externalCtor = externalCtor
          @externalCtor.variable.base = externalCtor
    
        if @name isnt @class.name
          @body.expressions.unshift new Assign (new IdentifierLiteral @name), @class
        else
          @body.expressions.unshift @class
        @body.expressions.unshift directives...
        @body.push ident
    
        klass.compileToFragments o
  • §

    Traverse the class’s children and:

    • Hoist valid ES properties into @properties
    • Hoist static assignments into @properties
    • Convert invalid ES properties into class or prototype assignments
      walkBody: ->
        directives  = []
    
        index = 0
        while expr = @body.expressions[index]
          break unless expr instanceof Value and expr.isString()
          if expr.hoisted
            index++
          else
            directives.push @body.expressions.splice(index, 1)...
    
        @traverseChildren false, (child) =>
          return false if child instanceof Class or child instanceof HoistTarget
    
          cont = true
          if child instanceof Block
            for node, i in child.expressions
              if node instanceof Value and node.isObject(true)
                cont = false
                child.expressions[i] = @addProperties node.base.properties
              else if node instanceof Assign and node.variable.looksStatic @name
                node.value.isStatic = yes
            child.expressions = flatten child.expressions
          cont
    
        directives
    
      setContext: ->
        @body.traverseChildren false, (node) =>
          if node instanceof ThisLiteral
            node.value   = @name
          else if node instanceof Code and node.bound and (node.isStatic or not node.name)
            node.context = @name
  • §

    Make class/prototype assignments for invalid ES properties

      addProperties: (assigns) ->
        result = for assign in assigns
          variable = assign.variable
          base     = variable?.base
          value    = assign.value
          delete assign.context
    
          if base.value is 'constructor'
            if value instanceof Code
              base.error 'constructors must be defined at the top level of a class body'
  • §

    The class scope is not available yet, so return the assignment to update later

            assign = @externalCtor = new Assign new Value, value
          else if not assign.variable.this
            name =
              if base instanceof ComputedPropertyName
                new Index base.value
              else
                new (if base.shouldCache() then Index else Access) base
            prototype = new Access new PropertyName 'prototype'
            variable  = new Value new ThisLiteral(), [ prototype, name ]
    
            assign.variable = variable
          else if assign.value instanceof Code
            assign.value.isStatic = true
    
          assign
        compact result
    
    exports.ClassProperty = class ClassProperty extends Base
      constructor: ({@name, @isStatic, @staticClassName, @value, @operatorToken}) ->
        super()
    
      children: ['name', 'value', 'staticClassName']
    
      isStatement: YES
    
      astProperties: (o) ->
        return
          key: @name.ast o, LEVEL_LIST
          value: @value.ast o, LEVEL_LIST
          static: !!@isStatic
          computed: @name instanceof Index or @name instanceof ComputedPropertyName
          operator: @operatorToken?.value ? '='
          staticClassName: @staticClassName?.ast(o) ? null
    
    exports.ClassPrototypeProperty = class ClassPrototypeProperty extends Base
      constructor: ({@name, @value}) ->
        super()
    
      children: ['name', 'value']
    
      isStatement: YES
    
      astProperties: (o) ->
        return
          key: @name.ast o, LEVEL_LIST
          value: @value.ast o, LEVEL_LIST
          computed: @name instanceof ComputedPropertyName or @name instanceof StringWithInterpolations
  • §

    Import and Export

    exports.ModuleDeclaration = class ModuleDeclaration extends Base
      constructor: (@clause, @source, @assertions) ->
        super()
        @checkSource()
    
      children: ['clause', 'source', 'assertions']
    
      isStatement: YES
      jumps:       THIS
      makeReturn:  THIS
    
      checkSource: ->
        if @source? and @source instanceof StringWithInterpolations
          @source.error 'the name of the module to be imported from must be an uninterpolated string'
    
      checkScope: (o, moduleDeclarationType) ->
  • §

    TODO: would be appropriate to flag this error during AST generation (as well as when compiling to JS). But o.indent isn’t tracked during AST generation, and there doesn’t seem to be a current alternative way to track whether we’re at the “program top-level”.

        if o.indent.length isnt 0
          @error "#{moduleDeclarationType} statements must be at top-level scope"
    
      astAssertions: (o) ->
        if @assertions?.properties?
          @assertions.properties.map (assertion) =>
            { start, end, loc, left, right } = assertion.ast(o)
            { type: 'ImportAttribute', start, end, loc, key: left, value: right }
        else
          []
    
    exports.ImportDeclaration = class ImportDeclaration extends ModuleDeclaration
      compileNode: (o) ->
        @checkScope o, 'import'
        o.importedSymbols = []
    
        code = []
        code.push @makeCode "#{@tab}import "
        code.push @clause.compileNode(o)... if @clause?
    
        if @source?.value?
          code.push @makeCode ' from ' unless @clause is null
          code.push @makeCode @source.value
          if @assertions?
            code.push @makeCode ' assert '
            code.push @assertions.compileToFragments(o)...
    
        code.push @makeCode ';'
        code
    
      astNode: (o) ->
        o.importedSymbols = []
        super o
    
      astProperties: (o) ->
        ret =
          specifiers: @clause?.ast(o) ? []
          source: @source.ast o
          assertions: @astAssertions(o)
        ret.importKind = 'value' if @clause
        ret
    
    exports.ImportClause = class ImportClause extends Base
      constructor: (@defaultBinding, @namedImports) ->
        super()
    
      children: ['defaultBinding', 'namedImports']
    
      compileNode: (o) ->
        code = []
    
        if @defaultBinding?
          code.push @defaultBinding.compileNode(o)...
          code.push @makeCode ', ' if @namedImports?
    
        if @namedImports?
          code.push @namedImports.compileNode(o)...
    
        code
    
      astNode: (o) ->
  • §

    The AST for ImportClause is the non-nested list of import specifiers that will be the specifiers property of an ImportDeclaration AST

        compact flatten [
          @defaultBinding?.ast o
          @namedImports?.ast o
        ]
    
    exports.ExportDeclaration = class ExportDeclaration extends ModuleDeclaration
      compileNode: (o) ->
        @checkScope o, 'export'
        @checkForAnonymousClassExport()
    
        code = []
        code.push @makeCode "#{@tab}export "
        code.push @makeCode 'default ' if @ instanceof ExportDefaultDeclaration
    
        if @ not instanceof ExportDefaultDeclaration and
           (@clause instanceof Assign or @clause instanceof Class)
          code.push @makeCode 'var '
          @clause.moduleDeclaration = 'export'
    
        if @clause.body? and @clause.body instanceof Block
          code = code.concat @clause.compileToFragments o, LEVEL_TOP
        else
          code = code.concat @clause.compileNode o
    
        if @source?.value?
          code.push @makeCode " from #{@source.value}"
          if @assertions?
            code.push @makeCode ' assert '
            code.push @assertions.compileToFragments(o)...
    
        code.push @makeCode ';'
        code
  • §

    Prevent exporting an anonymous class; all exported members must be named

      checkForAnonymousClassExport: ->
        if @ not instanceof ExportDefaultDeclaration and @clause instanceof Class and not @clause.variable
          @clause.error 'anonymous classes cannot be exported'
    
      astNode: (o) ->
        @checkForAnonymousClassExport()
        super o
    
    exports.ExportNamedDeclaration = class ExportNamedDeclaration extends ExportDeclaration
      astProperties: (o) ->
        ret =
          source: @source?.ast(o) ? null
          assertions: @astAssertions(o)
          exportKind: 'value'
        clauseAst = @clause.ast o
        if @clause instanceof ExportSpecifierList
          ret.specifiers = clauseAst
          ret.declaration = null
        else
          ret.specifiers = []
          ret.declaration = clauseAst
        ret
    
    exports.ExportDefaultDeclaration = class ExportDefaultDeclaration extends ExportDeclaration
      astProperties: (o) ->
        return
          declaration: @clause.ast o
          assertions: @astAssertions(o)
    
    exports.ExportAllDeclaration = class ExportAllDeclaration extends ExportDeclaration
      astProperties: (o) ->
        return
          source: @source.ast o
          assertions: @astAssertions(o)
          exportKind: 'value'
    
    exports.ModuleSpecifierList = class ModuleSpecifierList extends Base
      constructor: (@specifiers) ->
        super()
    
      children: ['specifiers']
    
      compileNode: (o) ->
        code = []
        o.indent += TAB
        compiledList = (specifier.compileToFragments o, LEVEL_LIST for specifier in @specifiers)
    
        if @specifiers.length isnt 0
          code.push @makeCode "{\n#{o.indent}"
          for fragments, index in compiledList
            code.push @makeCode(",\n#{o.indent}") if index
            code.push fragments...
          code.push @makeCode "\n}"
        else
          code.push @makeCode '{}'
        code
    
      astNode: (o) ->
        specifier.ast(o) for specifier in @specifiers
    
    exports.ImportSpecifierList = class ImportSpecifierList extends ModuleSpecifierList
    
    exports.ExportSpecifierList = class ExportSpecifierList extends ModuleSpecifierList
    
    exports.ModuleSpecifier = class ModuleSpecifier extends Base
      constructor: (@original, @alias, @moduleDeclarationType) ->
        super()
    
        if @original.comments or @alias?.comments
          @comments = []
          @comments.push @original.comments... if @original.comments
          @comments.push @alias.comments...    if @alias?.comments
  • §

    The name of the variable entering the local scope

        @identifier = if @alias? then @alias.value else @original.value
    
      children: ['original', 'alias']
    
      compileNode: (o) ->
        @addIdentifierToScope o
        code = []
        code.push @makeCode @original.value
        code.push @makeCode " as #{@alias.value}" if @alias?
        code
    
      addIdentifierToScope: (o) ->
        o.scope.find @identifier, @moduleDeclarationType
    
      astNode: (o) ->
        @addIdentifierToScope o
        super o
    
    exports.ImportSpecifier = class ImportSpecifier extends ModuleSpecifier
      constructor: (imported, local) ->
        super imported, local, 'import'
    
      addIdentifierToScope: (o) ->
  • §

    Per the spec, symbols can’t be imported multiple times (e.g. import { foo, foo } from 'lib' is invalid)

        if @identifier in o.importedSymbols or o.scope.check(@identifier)
          @error "'#{@identifier}' has already been declared"
        else
          o.importedSymbols.push @identifier
        super o
    
      astProperties: (o) ->
        originalAst = @original.ast o
        return
          imported: originalAst
          local: @alias?.ast(o) ? originalAst
          importKind: null
    
    exports.ImportDefaultSpecifier = class ImportDefaultSpecifier extends ImportSpecifier
      astProperties: (o) ->
        return
          local: @original.ast o
    
    exports.ImportNamespaceSpecifier = class ImportNamespaceSpecifier extends ImportSpecifier
      astProperties: (o) ->
        return
          local: @alias.ast o
    
    exports.ExportSpecifier = class ExportSpecifier extends ModuleSpecifier
      constructor: (local, exported) ->
        super local, exported, 'export'
    
      astProperties: (o) ->
        originalAst = @original.ast o
        return
          local: originalAst
          exported: @alias?.ast(o) ? originalAst
    
    exports.DynamicImport = class DynamicImport extends Base
      compileNode: ->
        [@makeCode 'import']
    
      astType: -> 'Import'
    
    exports.DynamicImportCall = class DynamicImportCall extends Call
      compileNode: (o) ->
        @checkArguments()
        super o
    
      checkArguments: ->
        unless 1 <= @args.length <= 2
          @error 'import() accepts either one or two arguments'
    
      astNode: (o) ->
        @checkArguments()
        super o
  • §

    Assign

  • §

    The Assign is used to assign a local variable to value, or to set the property of an object – including within object literals.

    exports.Assign = class Assign extends Base
      constructor: (@variable, @value, @context, options = {}) ->
        super()
        {@param, @subpattern, @operatorToken, @moduleDeclaration, @originalContext = @context} = options
        @propagateLhs()
    
      children: ['variable', 'value']
    
      isAssignable: YES
    
      isStatement: (o) ->
        o?.level is LEVEL_TOP and @context? and (@moduleDeclaration or "?" in @context)
    
      checkNameAssignability: (o, varBase) ->
        if o.scope.type(varBase.value) is 'import'
          varBase.error "'#{varBase.value}' is read-only"
    
      assigns: (name) ->
        @[if @context is 'object' then 'value' else 'variable'].assigns name
    
      unfoldSoak: (o) ->
        unfoldSoak o, this, 'variable'
    
      addScopeVariables: (o, {
  • §

    During AST generation, we need to allow assignment to these constructs that are considered “unassignable” during compile-to-JS, while still flagging things like [null] = b.

        allowAssignmentToExpansion = no,
        allowAssignmentToNontrailingSplat = no,
        allowAssignmentToEmptyArray = no,
        allowAssignmentToComplexSplat = no
      } = {}) ->
        return unless not @context or @context is '**='
    
        varBase = @variable.unwrapAll()
        if not varBase.isAssignable {
          allowExpansion: allowAssignmentToExpansion
          allowNontrailingSplat: allowAssignmentToNontrailingSplat
          allowEmptyArray: allowAssignmentToEmptyArray
          allowComplexSplat: allowAssignmentToComplexSplat
        }
          @variable.error "'#{@variable.compile o}' can't be assigned"
    
        varBase.eachName (name) =>
          return if name.hasProperties?()
    
          message = isUnassignable name.value
          name.error message if message
  • §

    moduleDeclaration can be 'import' or 'export'.

          @checkNameAssignability o, name
          if @moduleDeclaration
            o.scope.add name.value, @moduleDeclaration
            name.isDeclaration = yes
          else if @param
            o.scope.add name.value,
              if @param is 'alwaysDeclare'
                'var'
              else
                'param'
          else
            alreadyDeclared = o.scope.find name.value
            name.isDeclaration ?= not alreadyDeclared
  • §

    If this assignment identifier has one or more herecomments attached, output them as part of the declarations line (unless other herecomments are already staged there) for compatibility with Flow typing. Don’t do this if this assignment is for a class, e.g. ClassName = class ClassName {, as Flow requires the comment to be between the class name and the {.

            if name.comments and not o.scope.comments[name.value] and
               @value not instanceof Class and
               name.comments.every((comment) -> comment.here and not comment.multiline)
              commentsNode = new IdentifierLiteral name.value
              commentsNode.comments = name.comments
              commentFragments = []
              @compileCommentFragments o, commentsNode, commentFragments
              o.scope.comments[name.value] = commentFragments
  • §

    Compile an assignment, delegating to compileDestructuring or compileSplice if appropriate. Keep track of the name of the base object we’ve been assigned to, for correct internal references. If the variable has not been seen yet within the current scope, declare it.

      compileNode: (o) ->
        isValue = @variable instanceof Value
        if isValue
  • §

    If @variable is an array or an object, we’re destructuring; if it’s also isAssignable(), the destructuring syntax is supported in ES and we can output it as is; otherwise we @compileDestructuring and convert this ES-unsupported destructuring into acceptable output.

          if @variable.isArray() or @variable.isObject()
            unless @variable.isAssignable()
              if @variable.isObject() and @variable.base.hasSplat()
                return @compileObjectDestruct o
              else
                return @compileDestructuring o
    
          return @compileSplice       o if @variable.isSplice()
          return @compileConditional  o if @isConditional()
          return @compileSpecialMath  o if @context in ['//=', '%%=']
    
        @addScopeVariables o
        if @value instanceof Code
          if @value.isStatic
            @value.name = @variable.properties[0]
          else if @variable.properties?.length >= 2
            [properties..., prototype, name] = @variable.properties
            @value.name = name if prototype.name?.value is 'prototype'
    
        val = @value.compileToFragments o, LEVEL_LIST
        compiledName = @variable.compileToFragments o, LEVEL_LIST
    
        if @context is 'object'
          if @variable.shouldCache()
            compiledName.unshift @makeCode '['
            compiledName.push @makeCode ']'
          return compiledName.concat @makeCode(': '), val
    
        answer = compiledName.concat @makeCode(" #{ @context or '=' } "), val
  • §

    Per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration, if we’re destructuring without declaring, the destructuring assignment must be wrapped in parentheses. The assignment is wrapped in parentheses if ‘o.level’ has lower precedence than LEVEL_LIST (3) (i.e. LEVEL_COND (4), LEVEL_OP (5) or LEVEL_ACCESS (6)), or if we’re destructuring object, e.g. {a,b} = obj.

        if o.level > LEVEL_LIST or isValue and @variable.base instanceof Obj and not @nestedLhs and not (@param is yes)
          @wrapInParentheses answer
        else
          answer
  • §

    Object rest property is not assignable: {{a}...}

      compileObjectDestruct: (o) ->
        @variable.base.reorderProperties()
        {properties: props} = @variable.base
        [..., splat] = props
        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), @value).compileToFragments o, LEVEL_LIST
        assigns.push new Assign(new Value(splatProp), refVal).compileToFragments o, LEVEL_LIST
        @joinFragmentArrays assigns, ', '
  • §

    Brief implementation of recursive pattern matching, when assigning array or object literals to a value. Peeks at their properties to assign inner names.

      compileDestructuring: (o) ->
        top       = o.level is LEVEL_TOP
        {value}   = this
        {objects} = @variable.base
        olen      = objects.length
  • §

    Special-case for {} = a and [] = a (empty patterns). Compile to simply a.

        if olen is 0
          code = value.compileToFragments o
          return if o.level >= LEVEL_OP then @wrapInParentheses code else code
        [obj] = objects
    
        @disallowLoneExpansion()
        {splats, expans, splatsAndExpans} = @getAndCheckSplatsAndExpansions()
    
        isSplat = splats?.length > 0
        isExpans = expans?.length > 0
    
        vvar     = value.compileToFragments o, LEVEL_LIST
        vvarText = fragmentsToText vvar
        assigns  = []
        pushAssign = (variable, val) =>
          assigns.push new Assign(variable, val, null, param: @param, subpattern: yes).compileToFragments o, LEVEL_LIST
    
        if isSplat
          splatVar = objects[splats[0]].name.unwrap()
          if splatVar instanceof Arr or splatVar instanceof Obj
            splatVarRef = new IdentifierLiteral o.scope.freeVariable 'ref'
            objects[splats[0]].name = splatVarRef
            splatVarAssign = -> pushAssign new Value(splatVar), splatVarRef
  • §

    At this point, there are several things to destructure. So the fn() in {a, b} = fn() must be cached, for example. Make vvar into a simple variable if it isn’t already.

        if value.unwrap() not instanceof IdentifierLiteral or @variable.assigns(vvarText)
          ref = o.scope.freeVariable 'ref'
          assigns.push [@makeCode(ref + ' = '), vvar...]
          vvar = [@makeCode ref]
          vvarText = ref
    
        slicer = (type) -> (vvar, start, end = no) ->
          vvar = new IdentifierLiteral vvar unless vvar instanceof Value
          args = [vvar, new NumberLiteral(start)]
          args.push new NumberLiteral end if end
          slice = new Value (new IdentifierLiteral utility type, o), [new Access new PropertyName 'call']
          new Value new Call slice, args
  • §

    Helper which outputs [].slice code.

        compSlice = slicer "slice"
  • §

    Helper which outputs [].splice code.

        compSplice = slicer "splice"
  • §

    Check if objects array contains any instance of Assign, e.g. {a:1}.

        hasObjAssigns = (objs) ->
          (i for obj, i in objs when obj instanceof Assign and obj.context is 'object')
  • §

    Check if objects array contains any unassignable object.

        objIsUnassignable = (objs) ->
          return yes for obj in objs when not obj.isAssignable()
          no
  • §

    objects are complex when there is object assign ({a:1}), unassignable object, or just a single node.

        complexObjects = (objs) ->
          hasObjAssigns(objs).length or objIsUnassignable(objs) or olen is 1
  • §

    “Complex” objects are processed in a loop. Examples: [a, b, {c, r…}, d], [a, …, {b, r…}, c, d]

        loopObjects = (objs, vvar, vvarTxt) =>
          for obj, i in objs
  • §

    Elision can be skipped.

            continue if obj instanceof Elision
  • §

    If obj is {a: 1}

            if obj instanceof Assign and obj.context is 'object'
              {variable: {base: idx}, value: vvar} = obj
              {variable: vvar} = vvar if vvar instanceof Assign
              idx =
                if vvar.this
                  vvar.properties[0].name
                else
                  new PropertyName vvar.unwrap().value
              acc = idx.unwrap() instanceof PropertyName
              vval = new Value value, [new (if acc then Access else Index) idx]
            else
  • §

    obj is [a…], {a…} or a

              vvar = switch
                when obj instanceof Splat then new Value obj.name
                else obj
              vval = switch
                when obj instanceof Splat then compSlice(vvarTxt, i)
                else new Value new Literal(vvarTxt), [new Index new NumberLiteral i]
            message = isUnassignable vvar.unwrap().value
            vvar.error message if message
            pushAssign vvar, vval
  • §

    “Simple” objects can be split and compiled to arrays, [a, b, c] = arr, [a, b, c…] = arr

        assignObjects = (objs, vvar, vvarTxt) =>
          vvar = new Value new Arr(objs, yes)
          vval = if vvarTxt instanceof Value then vvarTxt else new Value new Literal(vvarTxt)
          pushAssign vvar, vval
    
        processObjects = (objs, vvar, vvarTxt) ->
          if complexObjects objs
            loopObjects objs, vvar, vvarTxt
          else
            assignObjects objs, vvar, vvarTxt
  • §

    In case there is Splat or Expansion in objects, we can split array in two simple subarrays. Splat [a, b, c…, d, e] can be split into [a, b, c…] and [d, e]. Expansion [a, b, …, c, d] can be split into [a, b] and [c, d]. Examples: a) Splat CS: [a, b, c…, d, e] = arr JS: [a, b, …c] = arr, [d, e] = splice.call(c, -2) b) Expansion CS: [a, b, …, d, e] = arr JS: [a, b] = arr, [d, e] = slice.call(arr, -2)

        if splatsAndExpans.length
          expIdx = splatsAndExpans[0]
          leftObjs = objects.slice 0, expIdx + (if isSplat then 1 else 0)
          rightObjs = objects.slice expIdx + 1
          processObjects leftObjs, vvar, vvarText if leftObjs.length isnt 0
          if rightObjs.length isnt 0
  • §

    Slice or splice objects.

            refExp = switch
              when isSplat then compSplice new Value(objects[expIdx].name), rightObjs.length * -1
              when isExpans then compSlice vvarText, rightObjs.length * -1
            if complexObjects rightObjs
              restVar = refExp
              refExp = o.scope.freeVariable 'ref'
              assigns.push [@makeCode(refExp + ' = '), restVar.compileToFragments(o, LEVEL_LIST)...]
            processObjects rightObjs, vvar, refExp
        else
  • §

    There is no Splat or Expansion in objects.

          processObjects objects, vvar, vvarText
        splatVarAssign?()
        assigns.push vvar unless top or @subpattern
        fragments = @joinFragmentArrays assigns, ', '
        if o.level < LEVEL_LIST then fragments else @wrapInParentheses fragments
  • §

    Disallow [...] = a for some reason. (Could be equivalent to [] = a?)

      disallowLoneExpansion: ->
        return unless @variable.base instanceof Arr
        {objects} = @variable.base
        return unless objects?.length is 1
        [loneObject] = objects
        if loneObject instanceof Expansion
          loneObject.error 'Destructuring assignment has no target'
  • §

    Show error if there is more than one Splat, or Expansion. Examples: [a, b, c…, d, e, f…], [a, b, …, c, d, …], [a, b, …, c, d, e…]

      getAndCheckSplatsAndExpansions: ->
        return {splats: [], expans: [], splatsAndExpans: []} unless @variable.base instanceof Arr
        {objects} = @variable.base
  • §

    Count all Splats: [a, b, c…, d, e]

        splats = (i for obj, i in objects when obj instanceof Splat)
  • §

    Count all Expansions: [a, b, …, c, d]

        expans = (i for obj, i in objects when obj instanceof Expansion)
  • §

    Combine splats and expansions.

        splatsAndExpans = [splats..., expans...]
        if splatsAndExpans.length > 1
  • §

    Sort ‘splatsAndExpans’ so we can show error at first disallowed token.

          objects[splatsAndExpans.sort()[1]].error "multiple splats/expansions are disallowed in an assignment"
        {splats, expans, splatsAndExpans}
  • §

    When compiling a conditional assignment, take care to ensure that the operands are only evaluated once, even though we have to reference them more than once.

      compileConditional: (o) ->
        [left, right] = @variable.cacheReference o
  • §

    Disallow conditional assignment of undefined variables.

        if not left.properties.length and left.base instanceof Literal and
               left.base not instanceof ThisLiteral and not o.scope.check left.base.value
          @throwUnassignableConditionalError left.base.value
        if "?" in @context
          o.isExistentialEquals = true
          new If(new Existence(left), right, type: 'if').addElse(new Assign(right, @value, '=')).compileToFragments o
        else
          fragments = new Op(@context[...-1], left, new Assign(right, @value, '=')).compileToFragments o
          if o.level <= LEVEL_LIST then fragments else @wrapInParentheses fragments
  • §

    Convert special math assignment operators like a //= b to the equivalent extended form a = a ** b and then compiles that.

      compileSpecialMath: (o) ->
        [left, right] = @variable.cacheReference o
        new Assign(left, new Op(@context[...-1], right, @value)).compileToFragments o
  • §

    Compile the assignment from an array splice literal, using JavaScript’s Array#splice method.

      compileSplice: (o) ->
        {range: {from, to, exclusive}} = @variable.properties.pop()
        unwrappedVar = @variable.unwrapAll()
        if unwrappedVar.comments
          moveComments unwrappedVar, @
          delete @variable.comments
        name = @variable.compile o
        if from
          [fromDecl, fromRef] = @cacheToCodeFragments from.cache o, LEVEL_OP
        else
          fromDecl = fromRef = '0'
        if to
          if from?.isNumber() and to.isNumber()
            to = to.compile(o) - fromRef
            to += 1 unless exclusive
          else
            to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef
            to += ' + 1' unless exclusive
        else
          to = "9e9"
        [valDef, valRef] = @value.cache o, LEVEL_LIST
        answer = [].concat @makeCode("#{utility 'splice', o}.apply(#{name}, [#{fromDecl}, #{to}].concat("), valDef, @makeCode(")), "), valRef
        if o.level > LEVEL_TOP then @wrapInParentheses answer else answer
    
      eachName: (iterator) ->
        @variable.unwrapAll().eachName iterator
    
      isDefaultAssignment: -> @param or @nestedLhs
    
      propagateLhs: ->
        return unless @variable?.isArray?() or @variable?.isObject?()
  • §

    This is the left-hand side of an assignment; let Arr and Obj know that, so that those nodes know that they’re assignable as destructured variables.

        @variable.base.propagateLhs yes
    
      throwUnassignableConditionalError: (name) ->
        @variable.error "the variable \"#{name}\" can't be assigned with #{@context} because it has not been declared before"
    
      isConditional: ->
        @context in ['||=', '&&=', '?=']
    
      isStatementAst: NO
    
      astNode: (o) ->
        @disallowLoneExpansion()
        @getAndCheckSplatsAndExpansions()
        if @isConditional()
          variable = @variable.unwrap()
          if variable instanceof IdentifierLiteral and not o.scope.check variable.value
            @throwUnassignableConditionalError variable.value
        @addScopeVariables o, allowAssignmentToExpansion: yes, allowAssignmentToNontrailingSplat: yes, allowAssignmentToEmptyArray: yes, allowAssignmentToComplexSplat: yes
        super o
    
      astType: ->
        if @isDefaultAssignment()
          'AssignmentPattern'
        else
          'AssignmentExpression'
    
      astProperties: (o) ->
        ret =
          right: @value.ast o, LEVEL_LIST
          left: @variable.ast o, LEVEL_LIST
    
        unless @isDefaultAssignment()
          ret.operator = @originalContext ? '='
    
        ret
  • §

    FuncGlyph

    exports.FuncGlyph = class FuncGlyph extends Base
      constructor: (@glyph) ->
        super()
  • §

    Code

  • §

    A function definition. This is the only node that creates a new Scope. When for the purposes of walking the contents of a function body, the Code has no children – they’re within the inner scope.

    exports.Code = class Code extends Base
      constructor: (params, body, @funcGlyph, @paramStart) ->
        super()
    
        @params      = params or []
        @body        = body or new Block
        @bound       = @funcGlyph?.glyph is '=>'
        @isGenerator = no
        @isAsync     = no
        @isMethod    = no
    
        @body.traverseChildren no, (node) =>
          if (node instanceof Op and node.isYield()) or node instanceof YieldReturn
            @isGenerator = yes
          if (node instanceof Op and node.isAwait()) or node instanceof AwaitReturn
            @isAsync = yes
          if node instanceof For and node.isAwait()
            @isAsync = yes
    
        @propagateLhs()
    
      children: ['params', 'body']
    
      isStatement: -> @isMethod
    
      jumps: NO
    
      makeScope: (parentScope) -> new Scope parentScope, @body, this
  • §

    Compilation creates a new scope unless explicitly asked to share with the outer scope. Handles splat parameters in the parameter list by setting such parameters to be the final parameter in the function definition, as required per the ES2015 spec. If the CoffeeScript function definition had parameters after the splat, they are declared via expressions in the function body.

      compileNode: (o) ->
        @checkForAsyncOrGeneratorConstructor()
    
        if @bound
          @context = o.scope.method.context if o.scope.method?.bound
          @context = 'this' unless @context
    
        @updateOptions o
        params           = []
        exprs            = []
        thisAssignments  = @thisAssignments?.slice() ? []
        paramsAfterSplat = []
        haveSplatParam   = no
        haveBodyParam    = no
    
        @checkForDuplicateParams()
        @disallowLoneExpansionAndMultipleSplats()
  • §

    Separate this assignments.

        @eachParamName (name, node, param, obj) ->
          if node.this
            name   = node.properties[0].name.value
            name   = "_#{name}" if name in JS_FORBIDDEN
            target = new IdentifierLiteral o.scope.freeVariable name, reserve: no
  • §

    Param is object destructuring with a default value: ({@prop = 1}) -> In a case when the variable name is already reserved, we have to assign a new variable name to the destructured variable: ({prop:prop1 = 1}) ->

            replacement =
                if param.name instanceof Obj and obj instanceof Assign and
                    obj.operatorToken.value is '='
                  new Assign (new IdentifierLiteral name), target, 'object' #, operatorToken: new Literal ':'
                else
                  target
            param.renameParam node, replacement
            thisAssignments.push new Assign node, target
  • §

    Parse the parameters, adding them to the list of parameters to put in the function definition; and dealing with splats or expansions, including adding expressions to the function body to declare all parameter variables that would have been after the splat/expansion parameter. If we encounter a parameter that needs to be declared in the function body for any reason, for example it’s destructured with this, also declare and assign all subsequent parameters in the function body so that any non-idempotent parameters are evaluated in the correct order.

        for param, i in @params
  • §

    Was ... used with this parameter? Splat/expansion parameters cannot have default values, so we need not worry about that.

          if param.splat or param instanceof Expansion
            haveSplatParam = yes
            if param.splat
              if param.name instanceof Arr or param.name instanceof Obj
  • §

    Splat arrays are treated oddly by ES; deal with them the legacy way in the function body. TODO: Should this be handled in the function parameter list, and if so, how?

                splatParamName = o.scope.freeVariable 'arg'
                params.push ref = new Value new IdentifierLiteral splatParamName
                exprs.push new Assign new Value(param.name), ref
              else
                params.push ref = param.asReference o
                splatParamName = fragmentsToText ref.compileNodeWithoutComments o
              if param.shouldCache()
                exprs.push new Assign new Value(param.name), ref
            else # `param` is an Expansion
              splatParamName = o.scope.freeVariable 'args'
              params.push new Value new IdentifierLiteral splatParamName
    
            o.scope.parameter splatParamName
  • §

    Parse all other parameters; if a splat paramater has not yet been encountered, add these other parameters to the list to be output in the function definition.

          else
            if param.shouldCache() or haveBodyParam
              param.assignedInBody = yes
              haveBodyParam = yes
  • §

    This parameter cannot be declared or assigned in the parameter list. So put a reference in the parameter list and add a statement to the function body assigning it, e.g. (arg) => { var a = arg.a; }, with a default value if it has one.

              if param.value?
                condition = new Op '===', param, new UndefinedLiteral
                ifTrue = new Assign new Value(param.name), param.value
                exprs.push new If condition, ifTrue
              else
                exprs.push new Assign new Value(param.name), param.asReference(o), null, param: 'alwaysDeclare'
  • §

    If this parameter comes before the splat or expansion, it will go in the function definition parameter list.

            unless haveSplatParam
  • §

    If this parameter has a default value, and it hasn’t already been set by the shouldCache() block above, define it as a statement in the function body. This parameter comes after the splat parameter, so we can’t define its default value in the parameter list.

              if param.shouldCache()
                ref = param.asReference o
              else
                if param.value? and not param.assignedInBody
                  ref = new Assign new Value(param.name), param.value, null, param: yes
                else
                  ref = param
  • §

    Add this parameter’s reference(s) to the function scope.

              if param.name instanceof Arr or param.name instanceof Obj
  • §

    This parameter is destructured.

                param.name.lhs = yes
                unless param.shouldCache()
                  param.name.eachName (prop) ->
                    o.scope.parameter prop.value
              else
  • §

    This compilation of the parameter is only to get its name to add to the scope name tracking; since the compilation output here isn’t kept for eventual output, don’t include comments in this compilation, so that they get output the “real” time this param is compiled.

                paramToAddToScope = if param.value? then param else ref
                o.scope.parameter fragmentsToText paramToAddToScope.compileToFragmentsWithoutComments o
              params.push ref
            else
              paramsAfterSplat.push param
  • §

    If this parameter had a default value, since it’s no longer in the function parameter list we need to assign its default value (if necessary) as an expression in the body.

              if param.value? and not param.shouldCache()
                condition = new Op '===', param, new UndefinedLiteral
                ifTrue = new Assign new Value(param.name), param.value
                exprs.push new If condition, ifTrue
  • §

    Add this parameter to the scope, since it wouldn’t have been added yet since it was skipped earlier.

              o.scope.add param.name.value, 'var', yes if param.name?.value?
  • §

    If there were parameters after the splat or expansion parameter, those parameters need to be assigned in the body of the function.

        if paramsAfterSplat.length isnt 0
  • §

    Create a destructured assignment, e.g. [a, b, c] = [args..., b, c]

          exprs.unshift new Assign new Value(
              new Arr [new Splat(new IdentifierLiteral(splatParamName)), (param.asReference o for param in paramsAfterSplat)...]
            ), new Value new IdentifierLiteral splatParamName
  • §

    Add new expressions to the function body

        wasEmpty = @body.isEmpty()
        @disallowSuperInParamDefaults()
        @checkSuperCallsInConstructorBody()
        @body.expressions.unshift thisAssignments... unless @expandCtorSuper thisAssignments
        @body.expressions.unshift exprs...
        if @isMethod and @bound and not @isStatic and @classVariable
          boundMethodCheck = new Value new Literal utility 'boundMethodCheck', o
          @body.expressions.unshift new Call(boundMethodCheck, [new Value(new ThisLiteral), @classVariable])
        @body.makeReturn() unless wasEmpty or @noReturn
  • §

    JavaScript doesn’t allow bound (=>) functions to also be generators. This is usually caught via Op::compileContinuation, but double-check:

        if @bound and @isGenerator
          yieldNode = @body.contains (node) -> node instanceof Op and node.operator is 'yield'
          (yieldNode or @).error 'yield cannot occur inside bound (fat arrow) functions'
  • §

    Assemble the output

        modifiers = []
        modifiers.push 'static' if @isMethod and @isStatic
        modifiers.push 'async'  if @isAsync
        unless @isMethod or @bound
          modifiers.push "function#{if @isGenerator then '*' else ''}"
        else if @isGenerator
          modifiers.push '*'
    
        signature = [@makeCode '(']
  • §

    Block comments between a function name and ( get output between function and (.

        if @paramStart?.comments?
          @compileCommentFragments o, @paramStart, signature
        for param, i in params
          signature.push @makeCode ', ' if i isnt 0
          signature.push @makeCode '...' if haveSplatParam and i is params.length - 1
  • §

    Compile this parameter, but if any generated variables get created (e.g. ref), shift those into the parent scope since we can’t put a var line inside a function parameter list.

          scopeVariablesCount = o.scope.variables.length
          signature.push param.compileToFragments(o, LEVEL_PAREN)...
          if scopeVariablesCount isnt o.scope.variables.length
            generatedVariables = o.scope.variables.splice scopeVariablesCount
            o.scope.parent.variables.push generatedVariables...
        signature.push @makeCode ')'
  • §

    Block comments between ) and ->/=> get output between ) and {.

        if @funcGlyph?.comments?
          comment.unshift = no for comment in @funcGlyph.comments
          @compileCommentFragments o, @funcGlyph, signature
    
        body = @body.compileWithDeclarations o unless @body.isEmpty()
  • §

    We need to compile the body before method names to ensure super references are handled.

        if @isMethod
          [methodScope, o.scope] = [o.scope, o.scope.parent]
          name = @name.compileToFragments o
          name.shift() if name[0].code is '.'
          o.scope = methodScope
    
        answer = @joinFragmentArrays (@makeCode m for m in modifiers), ' '
        answer.push @makeCode ' ' if modifiers.length and name
        answer.push name... if name
        answer.push signature...
        answer.push @makeCode ' =>' if @bound and not @isMethod
        answer.push @makeCode ' {'
        answer.push @makeCode('\n'), body..., @makeCode("\n#{@tab}") if body?.length
        answer.push @makeCode '}'
    
        return indentInitial answer, @ if @isMethod
        if @front or (o.level >= LEVEL_ACCESS) then @wrapInParentheses answer else answer
    
      updateOptions: (o) ->
        o.scope         = del(o, 'classScope') or @makeScope o.scope
        o.scope.shared  = del(o, 'sharedScope')
        o.indent        += TAB
        delete o.bare
        delete o.isExistentialEquals
    
      checkForDuplicateParams: ->
        paramNames = []
        @eachParamName (name, node, param) ->
          node.error "multiple parameters named '#{name}'" if name in paramNames
          paramNames.push name
    
      eachParamName: (iterator) ->
        param.eachName iterator for param in @params
  • §

    Short-circuit traverseChildren method to prevent it from crossing scope boundaries unless crossScope is true.

      traverseChildren: (crossScope, func) ->
        super(crossScope, func) if crossScope
  • §

    Short-circuit replaceInContext method to prevent it from crossing context boundaries. Bound functions have the same context.

      replaceInContext: (child, replacement) ->
        if @bound
          super child, replacement
        else
          false
    
      disallowSuperInParamDefaults: ({forAst} = {}) ->
        return false unless @ctor
    
        @eachSuperCall Block.wrap(@params), (superCall) ->
          superCall.error "'super' is not allowed in constructor parameter defaults"
        , checkForThisBeforeSuper: not forAst
    
      checkSuperCallsInConstructorBody: ->
        return false unless @ctor
    
        seenSuper = @eachSuperCall @body, (superCall) =>
          superCall.error "'super' is only allowed in derived class constructors" if @ctor is 'base'
    
        seenSuper
    
      flagThisParamInDerivedClassConstructorWithoutCallingSuper: (param) ->
        param.error "Can't use @params in derived class constructors without calling super"
    
      checkForAsyncOrGeneratorConstructor: ->
        if @ctor
          @name.error 'Class constructor may not be async'       if @isAsync
          @name.error 'Class constructor may not be a generator' if @isGenerator
    
      disallowLoneExpansionAndMultipleSplats: ->
        seenSplatParam = no
        for param in @params
  • §

    Was ... used with this parameter? (Only one such parameter is allowed per function.)

          if param.splat or param instanceof Expansion
            if seenSplatParam
              param.error 'only one splat or expansion parameter is allowed per function definition'
            else if param instanceof Expansion and @params.length is 1
              param.error 'an expansion parameter cannot be the only parameter in a function definition'
            seenSplatParam = yes
    
      expandCtorSuper: (thisAssignments) ->
        return false unless @ctor
    
        seenSuper = @eachSuperCall @body, (superCall) =>
          superCall.expressions = thisAssignments
    
        haveThisParam = thisAssignments.length and thisAssignments.length isnt @thisAssignments?.length
        if @ctor is 'derived' and not seenSuper and haveThisParam
          param = thisAssignments[0].variable
          @flagThisParamInDerivedClassConstructorWithoutCallingSuper param
    
        seenSuper
  • §

    Find all super calls in the given context node; returns true if iterator is called.

      eachSuperCall: (context, iterator, {checkForThisBeforeSuper = yes} = {}) ->
        seenSuper = no
    
        context.traverseChildren yes, (child) =>
          if child instanceof SuperCall
  • §

    super in a constructor (the only super without an accessor) cannot be given an argument with a reference to this, as that would be referencing this before calling super.

            unless child.variable.accessor
              childArgs = child.args.filter (arg) ->
                arg not instanceof Class and (arg not instanceof Code or arg.bound)
              Block.wrap(childArgs).traverseChildren yes, (node) =>
                node.error "Can't call super with @params in derived class constructors" if node.this
            seenSuper = yes
            iterator child
          else if checkForThisBeforeSuper and child instanceof ThisLiteral and @ctor is 'derived' and not seenSuper
            child.error "Can't reference 'this' before calling super in derived class constructors"
  • §

    super has the same target in bound (arrow) functions, so check them too

          child not instanceof SuperCall and (child not instanceof Code or child.bound)
    
        seenSuper
    
      propagateLhs: ->
        for param in @params
          {name} = param
          if name instanceof Arr or name instanceof Obj
            name.propagateLhs yes
          else if param instanceof Expansion
            param.lhs = yes
    
      astAddParamsToScope: (o) ->
        @eachParamName (name) ->
          o.scope.add name, 'param'
    
      astNode: (o) ->
        @updateOptions o
        @checkForAsyncOrGeneratorConstructor()
        @checkForDuplicateParams()
        @disallowSuperInParamDefaults forAst: yes
        @disallowLoneExpansionAndMultipleSplats()
        seenSuper = @checkSuperCallsInConstructorBody()
        if @ctor is 'derived' and not seenSuper
          @eachParamName (name, node) =>
            if node.this
              @flagThisParamInDerivedClassConstructorWithoutCallingSuper node
        @astAddParamsToScope o
        @body.makeReturn null, yes unless @body.isEmpty() or @noReturn
    
        super o
    
      astType: ->
        if @isMethod
          'ClassMethod'
        else if @bound
          'ArrowFunctionExpression'
        else
          'FunctionExpression'
    
      paramForAst: (param) ->
        return param if param instanceof Expansion
        {name, value, splat} = param
        if splat
          new Splat name, lhs: yes, postfix: splat.postfix
          .withLocationDataFrom param
        else if value?
          new Assign name, value, null, param: yes
          .withLocationDataFrom locationData: mergeLocationData name.locationData, value.locationData
        else
          name
    
      methodAstProperties: (o) ->
        getIsComputed = =>
          return yes if @name instanceof Index
          return yes if @name instanceof ComputedPropertyName
          return yes if @name.name instanceof ComputedPropertyName
          no
    
        return
          static: !!@isStatic
          key: @name.ast o
          computed: getIsComputed()
          kind:
            if @ctor
              'constructor'
            else
              'method'
          operator: @operatorToken?.value ? '='
          staticClassName: @isStatic.staticClassName?.ast(o) ? null
          bound: !!@bound
    
      astProperties: (o) ->
        return Object.assign
          params: @paramForAst(param).ast(o) for param in @params
          body: @body.ast (Object.assign {}, o, checkForDirectives: yes), LEVEL_TOP
          generator: !!@isGenerator
          async: !!@isAsync
  • §

    We never generate named functions, so specify id as null, which matches the Babel AST for anonymous function expressions/arrow functions

          id: null
          hasIndentedBody: @body.locationData.first_line > @funcGlyph?.locationData.first_line
        ,
          if @isMethod then @methodAstProperties o else {}
    
      astLocationData: ->
        functionLocationData = super()
        return functionLocationData unless @isMethod
    
        astLocationData = mergeAstLocationData @name.astLocationData(), functionLocationData
        if @isStatic.staticClassName?
          astLocationData = mergeAstLocationData @isStatic.staticClassName.astLocationData(), astLocationData
        astLocationData
  • §

    Param

  • §

    A parameter in a function definition. Beyond a typical JavaScript parameter, these parameters can also attach themselves to the context of the function, as well as be a splat, gathering up a group of parameters into an array.

    exports.Param = class Param extends Base
      constructor: (@name, @value, @splat) ->
        super()
    
        message = isUnassignable @name.unwrapAll().value
        @name.error message if message
        if @name instanceof Obj and @name.generated
          token = @name.objects[0].operatorToken
          token.error "unexpected #{token.value}"
    
      children: ['name', 'value']
    
      compileToFragments: (o) ->
        @name.compileToFragments o, LEVEL_LIST
    
      compileToFragmentsWithoutComments: (o) ->
        @name.compileToFragmentsWithoutComments o, LEVEL_LIST
    
      asReference: (o) ->
        return @reference if @reference
        node = @name
        if node.this
          name = node.properties[0].name.value
          name = "_#{name}" if name in JS_FORBIDDEN
          node = new IdentifierLiteral o.scope.freeVariable name
        else if node.shouldCache()
          node = new IdentifierLiteral o.scope.freeVariable 'arg'
        node = new Value node
        node.updateLocationDataIfMissing @locationData
        @reference = node
    
      shouldCache: ->
        @name.shouldCache()
  • §

    Iterates the name or names of a Param. In a sense, a destructured parameter represents multiple JS parameters. This method allows to iterate them all. The iterator function will be called as iterator(name, node) where name is the name of the parameter and node is the AST node corresponding to that name.

      eachName: (iterator, name = @name) ->
        checkAssignabilityOfLiteral = (literal) ->
          message = isUnassignable literal.value
          if message
            literal.error message
          unless literal.isAssignable()
            literal.error "'#{literal.value}' can't be assigned"
    
        atParam = (obj, originalObj = null) => iterator "@#{obj.properties[0].name.value}", obj, @, originalObj
        if name instanceof Call
          name.error "Function invocation can't be assigned"
  • §
    • simple literals foo
        if name instanceof Literal
          checkAssignabilityOfLiteral name
          return iterator name.value, name, @
  • §
    • at-params @foo
        return atParam name if name instanceof Value
        for obj in name.objects ? []
  • §

    Save original obj.

          nObj = obj
  • §
    • destructured parameter with default value
          if obj instanceof Assign and not obj.context?
            obj = obj.variable
  • §
    • assignments within destructured parameters {foo:bar}
          if obj instanceof Assign
  • §

    … possibly with a default value

            if obj.value instanceof Assign
              obj = obj.value.variable
            else
              obj = obj.value
            @eachName iterator, obj.unwrap()
  • §
    • splats within destructured parameters [xs...]
          else if obj instanceof Splat
            node = obj.name.unwrap()
            iterator node.value, node, @
          else if obj instanceof Value
  • §
    • destructured parameters within destructured parameters [{a}]
            if obj.isArray() or obj.isObject()
              @eachName iterator, obj.base
  • §
    • at-params within destructured parameters {@foo}
            else if obj.this
              atParam obj, nObj
  • §
    • simple destructured parameters {foo}
            else
              checkAssignabilityOfLiteral obj.base
              iterator obj.base.value, obj.base, @
          else if obj instanceof Elision
            obj
          else if obj not instanceof Expansion
            obj.error "illegal parameter #{obj.compile()}"
        return
  • §

    Rename a param by replacing the given AST node for a name with a new node. This needs to ensure that the the source for object destructuring does not change.

      renameParam: (node, newNode) ->
        isNode      = (candidate) -> candidate is node
        replacement = (node, parent) =>
          if parent instanceof Obj
            key = node
            key = node.properties[0].name if node.this
  • §

    No need to assign a new variable for the destructured variable if the variable isn’t reserved. Examples: ({@foo}) -> should compile to ({foo}) { this.foo = foo} foo = 1; ({@foo}) -> should compile to foo = 1; ({foo:foo1}) { this.foo = foo1 }

            if node.this and key.value is newNode.value
              new Value newNode
            else
              new Assign new Value(key), newNode, 'object'
          else
            newNode
    
        @replaceInContext isNode, replacement
  • §

    Splat

  • §

    A splat, either as a parameter to a function, an argument to a call, or as part of a destructuring assignment.

    exports.Splat = class Splat extends Base
      constructor: (name, {@lhs, @postfix = true} = {}) ->
        super()
        @name = if name.compile then name else new Literal name
    
      children: ['name']
    
      shouldCache: -> no
    
      isAssignable: ({allowComplexSplat = no} = {})->
        return allowComplexSplat if @name instanceof Obj or @name instanceof Parens
        @name.isAssignable() and (not @name.isAtomic or @name.isAtomic())
    
      assigns: (name) ->
        @name.assigns name
    
      compileNode: (o) ->
        compiledSplat = [@makeCode('...'), @name.compileToFragments(o, LEVEL_OP)...]
        return compiledSplat unless @jsx
        return [@makeCode('{'), compiledSplat..., @makeCode('}')]
    
      unwrap: -> @name
    
      propagateLhs: (setLhs) ->
        @lhs = yes if setLhs
        return unless @lhs
        @name.propagateLhs? yes
    
      astType: ->
        if @jsx
          'JSXSpreadAttribute'
        else if @lhs
          'RestElement'
        else
          'SpreadElement'
    
      astProperties: (o) -> {
        argument: @name.ast o, LEVEL_OP
        @postfix
      }
  • §

    Expansion

  • §

    Used to skip values inside an array destructuring (pattern matching) or parameter list.

    exports.Expansion = class Expansion extends Base
    
      shouldCache: NO
    
      compileNode: (o) ->
        @throwLhsError()
    
      asReference: (o) ->
        this
    
      eachName: (iterator) ->
    
      throwLhsError: ->
        @error 'Expansion must be used inside a destructuring assignment or parameter list'
    
      astNode: (o) ->
        unless @lhs
          @throwLhsError()
    
        super o
    
      astType: -> 'RestElement'
    
      astProperties: ->
        return
          argument: null
  • §

    Elision

  • §

    Array elision element (for example, [,a, , , b, , c, ,]).

    exports.Elision = class Elision extends Base
    
      isAssignable: YES
    
      shouldCache: NO
    
      compileToFragments: (o, level) ->
        fragment = super o, level
        fragment.isElision = yes
        fragment
    
      compileNode: (o) ->
        [@makeCode ', ']
    
      asReference: (o) ->
        this
    
      eachName: (iterator) ->
    
      astNode: ->
        null
  • §

    While

  • §

    A while loop, the only sort of low-level loop exposed by CoffeeScript. From it, all other loops can be manufactured. Useful in cases where you need more flexibility or more speed than a comprehension can provide.

    exports.While = class While extends Base
      constructor: (@condition, {invert: @inverted, @guard, @isLoop} = {}) ->
        super()
    
      children: ['condition', 'guard', 'body']
    
      isStatement: YES
    
      makeReturn: (results, mark) ->
        return super(results, mark) if results
        @returns = not @jumps()
        if mark
          @body.makeReturn(results, mark) if @returns
          return
        this
    
      addBody: (@body) ->
        this
    
      jumps: ->
        {expressions} = @body
        return no unless expressions.length
        for node in expressions
          return jumpNode if jumpNode = node.jumps loop: yes
        no
  • §

    The main difference from a JavaScript while is that the CoffeeScript while can be used as a part of a larger expression – while loops may return an array containing the computed result of each iteration.

      compileNode: (o) ->
        o.indent += TAB
        set      = ''
        {body}   = this
        if body.isEmpty()
          body = @makeCode ''
        else
          if @returns
            body.makeReturn rvar = o.scope.freeVariable 'results'
            set  = "#{@tab}#{rvar} = [];\n"
          if @guard
            if body.expressions.length > 1
              body.expressions.unshift new If (new Parens @guard).invert(), new StatementLiteral "continue"
            else
              body = Block.wrap [new If @guard, body] if @guard
          body = [].concat @makeCode("\n"), (body.compileToFragments o, LEVEL_TOP), @makeCode("\n#{@tab}")
        answer = [].concat @makeCode(set + @tab + "while ("), @processedCondition().compileToFragments(o, LEVEL_PAREN),
          @makeCode(") {"), body, @makeCode("}")
        if @returns
          answer.push @makeCode "\n#{@tab}return #{rvar};"
        answer
    
      processedCondition: ->
        @processedConditionCache ?= if @inverted then @condition.invert() else @condition
    
      astType: -> 'WhileStatement'
    
      astProperties: (o) ->
        return
          test: @condition.ast o, LEVEL_PAREN
          body: @body.ast o, LEVEL_TOP
          guard: @guard?.ast(o) ? null
          inverted: !!@inverted
          postfix: !!@postfix
          loop: !!@isLoop
  • §

    Op

  • §

    Simple Arithmetic and logical operations. Performs some conversion from CoffeeScript operations into their JavaScript equivalents.

    exports.Op = class Op extends Base
      constructor: (op, first, second, flip, {@invertOperator, @originalOperator = op} = {}) ->
        super()
    
        if op is 'new'
          if ((firstCall = unwrapped = first.unwrap()) instanceof Call or (firstCall = unwrapped.base) instanceof Call) and not firstCall.do and not firstCall.isNew
            return new Value firstCall.newInstance(), if firstCall is unwrapped then [] else unwrapped.properties
          first = new Parens first unless first instanceof Parens or first.unwrap() instanceof IdentifierLiteral or first.hasProperties?()
          call = new Call first, []
          call.locationData = @locationData
          call.isNew = yes
          return call
    
        @operator = CONVERSIONS[op] or op
        @first    = first
        @second   = second
        @flip     = !!flip
    
        if @operator in ['--', '++']
          message = isUnassignable @first.unwrapAll().value
          @first.error message if message
    
        return this
  • §

    The map of conversions from CoffeeScript to JavaScript symbols.

      CONVERSIONS =
        '==':        '==='
        '!=':        '!=='
        'of':        'in'
        'yieldfrom': 'yield*'
  • §

    The map of invertible operators.

      INVERSIONS =
        '!==': '==='
        '===': '!=='
    
      children: ['first', 'second']
    
      isNumber: ->
        @isUnary() and @operator in ['+', '-'] and
          @first instanceof Value and @first.isNumber()
    
      isAwait: ->
        @operator is 'await'
    
      isYield: ->
        @operator in ['yield', 'yield*']
    
      isUnary: ->
        not @second
    
      shouldCache: ->
        not @isNumber()
  •   isChainable: ->
        @operator in ['<', '>', '>=', '<=', '===', '!==']
    
      isChain: ->
        @isChainable() and @first.isChainable()
    
      invert: ->
        if @isInOperator()
          @invertOperator = '!'
          return @
        if @isChain()
          allInvertable = yes
          curr = this
          while curr and curr.operator
            allInvertable and= (curr.operator of INVERSIONS)
            curr = curr.first
          return new Parens(this).invert() unless allInvertable
          curr = this
          while curr and curr.operator
            curr.invert = !curr.invert
            curr.operator = INVERSIONS[curr.operator]
            curr = curr.first
          this
        else if op = INVERSIONS[@operator]
          @operator = op
          if @first.unwrap() instanceof Op
            @first.invert()
          this
        else if @second
          new Parens(this).invert()
        else if @operator is '!' and (fst = @first.unwrap()) instanceof Op and
                                      fst.operator in ['!', 'in', 'instanceof']
          fst
        else
          new Op '!', this
    
      unfoldSoak: (o) ->
        @operator in ['++', '--', 'delete'] and unfoldSoak o, this, 'first'
    
      generateDo: (exp) ->
        passedParams = []
        func = if exp instanceof Assign and (ref = exp.value.unwrap()) instanceof Code
          ref
        else
          exp
        for param in func.params or []
          if param.value
            passedParams.push param.value
            delete param.value
          else
            passedParams.push param
        call = new Call exp, passedParams
        call.do = yes
        call
    
      isInOperator: ->
        @originalOperator is 'in'
    
      compileNode: (o) ->
        if @isInOperator()
          inNode = new In @first, @second
          return (if @invertOperator then inNode.invert() else inNode).compileNode o
        if @invertOperator
          @invertOperator = null
          return @invert().compileNode(o)
        return Op::generateDo(@first).compileNode o if @operator is 'do'
        isChain = @isChain()
  • §

    In chains, there’s no need to wrap bare obj literals in parens, as the chained expression is wrapped.

        @first.front = @front unless isChain
        @checkDeleteOperand o
        return @compileContinuation o if @isYield() or @isAwait()
        return @compileUnary        o if @isUnary()
        return @compileChain        o if isChain
        switch @operator
          when '?'  then @compileExistence o, @second.isDefaultValue
          when '//' then @compileFloorDivision o
          when '%%' then @compileModulo o
          else
            lhs = @first.compileToFragments o, LEVEL_OP
            rhs = @second.compileToFragments o, LEVEL_OP
            answer = [].concat lhs, @makeCode(" #{@operator} "), rhs
            if o.level <= LEVEL_OP then answer else @wrapInParentheses answer
  • §

    Mimic Python’s chained comparisons when multiple comparison operators are used sequentially. For example:

    bin/coffee -e 'console.log 50 < 65 > 10'
    true
    
      compileChain: (o) ->
        [@first.second, shared] = @first.second.cache o
        fst = @first.compileToFragments o, LEVEL_OP
        fragments = fst.concat @makeCode(" #{if @invert then '&&' else '||'} "),
          (shared.compileToFragments o), @makeCode(" #{@operator} "), (@second.compileToFragments o, LEVEL_OP)
        @wrapInParentheses fragments
  • §

    Keep reference to the left expression, unless this an existential assignment

      compileExistence: (o, checkOnlyUndefined) ->
        if @first.shouldCache()
          ref = new IdentifierLiteral o.scope.freeVariable 'ref'
          fst = new Parens new Assign ref, @first
        else
          fst = @first
          ref = fst
        new If(new Existence(fst, checkOnlyUndefined), ref, type: 'if').addElse(@second).compileToFragments o
  • §

    Compile a unary Op.

      compileUnary: (o) ->
        parts = []
        op = @operator
        parts.push [@makeCode op]
        if op is '!' and @first instanceof Existence
          @first.negated = not @first.negated
          return @first.compileToFragments o
        if o.level >= LEVEL_ACCESS
          return (new Parens this).compileToFragments o
        plusMinus = op in ['+', '-']
        parts.push [@makeCode(' ')] if op in ['typeof', 'delete'] or
                          plusMinus and @first instanceof Op and @first.operator is op
        if plusMinus and @first instanceof Op
          @first = new Parens @first
        parts.push @first.compileToFragments o, LEVEL_OP
        parts.reverse() if @flip
        @joinFragmentArrays parts, ''
    
      compileContinuation: (o) ->
        parts = []
        op = @operator
        @checkContinuation o unless @isAwait()
        if 'expression' in Object.keys(@first) and not (@first instanceof Throw)
          parts.push @first.expression.compileToFragments o, LEVEL_OP if @first.expression?
        else
          parts.push [@makeCode "("] if o.level >= LEVEL_PAREN
          parts.push [@makeCode op]
          parts.push [@makeCode " "] if @first.base?.value isnt ''
          parts.push @first.compileToFragments o, LEVEL_OP
          parts.push [@makeCode ")"] if o.level >= LEVEL_PAREN
        @joinFragmentArrays parts, ''
    
      checkContinuation: (o) ->
        unless o.scope.parent?
          @error "#{@operator} can only occur inside functions"
        if o.scope.method?.bound and o.scope.method.isGenerator
          @error 'yield cannot occur inside bound (fat arrow) functions'
    
      compileFloorDivision: (o) ->
        floor = new Value new IdentifierLiteral('Math'), [new Access new PropertyName 'floor']
        second = if @second.shouldCache() then new Parens @second else @second
        div = new Op '/', @first, second
        new Call(floor, [div]).compileToFragments o
    
      compileModulo: (o) ->
        mod = new Value new Literal utility 'modulo', o
        new Call(mod, [@first, @second]).compileToFragments o
    
      toString: (idt) ->
        super idt, @constructor.name + ' ' + @operator
    
      checkDeleteOperand: (o) ->
        if @operator is 'delete' and o.scope.check(@first.unwrapAll().value)
          @error 'delete operand may not be argument or var'
    
      astNode: (o) ->
        @checkContinuation o if @isYield()
        @checkDeleteOperand o
        super o
    
      astType: ->
        return 'AwaitExpression' if @isAwait()
        return 'YieldExpression' if @isYield()
        return 'ChainedComparison' if @isChain()
        switch @operator
          when '||', '&&', '?' then 'LogicalExpression'
          when '++', '--'      then 'UpdateExpression'
          else
            if @isUnary()      then 'UnaryExpression'
            else                    'BinaryExpression'
    
      operatorAst: ->
        "#{if @invertOperator then "#{@invertOperator} " else ''}#{@originalOperator}"
    
      chainAstProperties: (o) ->
        operators = [@operatorAst()]
        operands = [@second]
        currentOp = @first
        loop
          operators.unshift currentOp.operatorAst()
          operands.unshift currentOp.second
          currentOp = currentOp.first
          unless currentOp.isChainable()
            operands.unshift currentOp
            break
        return {
          operators
          operands: (operand.ast(o, LEVEL_OP) for operand in operands)
        }
    
      astProperties: (o) ->
        return @chainAstProperties(o) if @isChain()
    
        firstAst = @first.ast o, LEVEL_OP
        secondAst = @second?.ast o, LEVEL_OP
        operatorAst = @operatorAst()
        switch
          when @isUnary()
            argument =
              if @isYield() and @first.unwrap().value is ''
                null
              else
                firstAst
            return {argument} if @isAwait()
            return {
              argument
              delegate: @operator is 'yield*'
            } if @isYield()
            return {
              argument
              operator: operatorAst
              prefix: !@flip
            }
          else
            return
              left: firstAst
              right: secondAst
              operator: operatorAst
  • §

    In

    exports.In = class In extends Base
      constructor: (@object, @array) ->
        super()
    
      children: ['object', 'array']
    
      invert: NEGATE
    
      compileNode: (o) ->
        if @array instanceof Value and @array.isArray() and @array.base.objects.length
          for obj in @array.base.objects when obj instanceof Splat
            hasSplat = yes
            break
  • §

    compileOrTest only if we have an array literal with no splats

          return @compileOrTest o unless hasSplat
        @compileLoopTest o
    
      compileOrTest: (o) ->
        [sub, ref] = @object.cache o, LEVEL_OP
        [cmp, cnj] = if @negated then [' !== ', ' && '] else [' === ', ' || ']
        tests = []
        for item, i in @array.base.objects
          if i then tests.push @makeCode cnj
          tests = tests.concat (if i then ref else sub), @makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)
        if o.level < LEVEL_OP then tests else @wrapInParentheses tests
    
      compileLoopTest: (o) ->
        [sub, ref] = @object.cache o, LEVEL_LIST
        fragments = [].concat @makeCode(utility('indexOf', o) + ".call("), @array.compileToFragments(o, LEVEL_LIST),
          @makeCode(", "), ref, @makeCode(") " + if @negated then '< 0' else '>= 0')
        return fragments if fragmentsToText(sub) is fragmentsToText(ref)
        fragments = sub.concat @makeCode(', '), fragments
        if o.level < LEVEL_LIST then fragments else @wrapInParentheses fragments
    
      toString: (idt) ->
        super idt, @constructor.name + if @negated then '!' else ''
  • §

    Try

  • §

    A classic try/catch/finally block.

    exports.Try = class Try extends Base
      constructor: (@attempt, @catch, @ensure, @finallyTag) ->
        super()
    
      children: ['attempt', 'catch', 'ensure']
    
      isStatement: YES
    
      jumps: (o) -> @attempt.jumps(o) or @catch?.jumps(o)
    
      makeReturn: (results, mark) ->
        if mark
          @attempt?.makeReturn results, mark
          @catch?.makeReturn results, mark
          return
        @attempt = @attempt.makeReturn results if @attempt
        @catch   = @catch  .makeReturn results if @catch
        this
  • §

    Compilation is more or less as you would expect – the finally clause is optional, the catch is not.

      compileNode: (o) ->
        originalIndent = o.indent
        o.indent  += TAB
        tryPart   = @attempt.compileToFragments o, LEVEL_TOP
    
        catchPart = if @catch
          @catch.compileToFragments merge(o, indent: originalIndent), LEVEL_TOP
        else unless @ensure or @catch
          generatedErrorVariableName = o.scope.freeVariable 'error', reserve: no
          [@makeCode(" catch (#{generatedErrorVariableName}) {}")]
        else
          []
    
        ensurePart = if @ensure then ([].concat @makeCode(" finally {\n"), @ensure.compileToFragments(o, LEVEL_TOP),
          @makeCode("\n#{@tab}}")) else []
    
        [].concat @makeCode("#{@tab}try {\n"),
          tryPart,
          @makeCode("\n#{@tab}}"), catchPart, ensurePart
    
      astType: -> 'TryStatement'
    
      astProperties: (o) ->
        return
          block: @attempt.ast o, LEVEL_TOP
          handler: @catch?.ast(o) ? null
          finalizer:
            if @ensure?
              Object.assign @ensure.ast(o, LEVEL_TOP),
  • §

    Include finally keyword in location data.

                mergeAstLocationData(
                  jisonLocationDataToAstLocationData(@finallyTag.locationData),
                  @ensure.astLocationData()
                )
            else
              null
    
    exports.Catch = class Catch extends Base
      constructor: (@recovery, @errorVariable) ->
        super()
        @errorVariable?.unwrap().propagateLhs? yes
    
      children: ['recovery', 'errorVariable']
    
      isStatement: YES
    
      jumps: (o) -> @recovery.jumps o
    
      makeReturn: (results, mark) ->
        ret = @recovery.makeReturn results, mark
        return if mark
        @recovery = ret
        this
    
      compileNode: (o) ->
        o.indent  += TAB
        generatedErrorVariableName = o.scope.freeVariable 'error', reserve: no
        placeholder = new IdentifierLiteral generatedErrorVariableName
        @checkUnassignable()
        if @errorVariable
          @recovery.unshift new Assign @errorVariable, placeholder
        [].concat @makeCode(" catch ("), placeholder.compileToFragments(o), @makeCode(") {\n"),
          @recovery.compileToFragments(o, LEVEL_TOP), @makeCode("\n#{@tab}}")
    
      checkUnassignable: ->
        if @errorVariable
          message = isUnassignable @errorVariable.unwrapAll().value
          @errorVariable.error message if message
    
      astNode: (o) ->
        @checkUnassignable()
        @errorVariable?.eachName (name) ->
          alreadyDeclared = o.scope.find name.value
          name.isDeclaration = not alreadyDeclared
    
        super o
    
      astType: -> 'CatchClause'
    
      astProperties: (o) ->
        return
          param: @errorVariable?.ast(o) ? null
          body: @recovery.ast o, LEVEL_TOP
  • §

    Throw

  • §

    Simple node to throw an exception.

    exports.Throw = class Throw extends Base
      constructor: (@expression) ->
        super()
    
      children: ['expression']
    
      isStatement: YES
      jumps:       NO
  • §

    A Throw is already a return, of sorts…

      makeReturn: THIS
    
      compileNode: (o) ->
        fragments = @expression.compileToFragments o, LEVEL_LIST
        unshiftAfterComments fragments, @makeCode 'throw '
        fragments.unshift @makeCode @tab
        fragments.push @makeCode ';'
        fragments
    
      astType: -> 'ThrowStatement'
    
      astProperties: (o) ->
        return
          argument: @expression.ast o, LEVEL_LIST
  • §

    Existence

  • §

    Checks a variable for existence – not null and not undefined. This is similar to .nil? in Ruby, and avoids having to consult a JavaScript truth table. Optionally only check if a variable is not undefined.

    exports.Existence = class Existence extends Base
      constructor: (@expression, onlyNotUndefined = no) ->
        super()
        @comparisonTarget = if onlyNotUndefined then 'undefined' else 'null'
        salvagedComments = []
        @expression.traverseChildren yes, (child) ->
          if child.comments
            for comment in child.comments
              salvagedComments.push comment unless comment in salvagedComments
            delete child.comments
        attachCommentsToNode salvagedComments, @
        moveComments @expression, @
    
      children: ['expression']
    
      invert: NEGATE
    
      compileNode: (o) ->
        @expression.front = @front
        code = @expression.compile o, LEVEL_OP
        if @expression.unwrap() instanceof IdentifierLiteral and not o.scope.check code
          [cmp, cnj] = if @negated then ['===', '||'] else ['!==', '&&']
          code = "typeof #{code} #{cmp} \"undefined\"" + if @comparisonTarget isnt 'undefined' then " #{cnj} #{code} #{cmp} #{@comparisonTarget}" else ''
        else
  • §

    We explicity want to use loose equality (==) when comparing against null, so that an existence check roughly corresponds to a check for truthiness. Do not change this to === for null, as this will break mountains of existing code. When comparing only against undefined, however, we want to use === because this use case is for parity with ES2015+ default values, which only get assigned when the variable is undefined (but not null).

          cmp = if @comparisonTarget is 'null'
            if @negated then '==' else '!='
          else # `undefined`
            if @negated then '===' else '!=='
          code = "#{code} #{cmp} #{@comparisonTarget}"
        [@makeCode(if o.level <= LEVEL_COND then code else "(#{code})")]
    
      astType: -> 'UnaryExpression'
    
      astProperties: (o) ->
        return
          argument: @expression.ast o
          operator: '?'
          prefix: no
  • §

    Parens

  • §

    An extra set of parentheses, specified explicitly in the source. At one time we tried to clean up the results by detecting and removing redundant parentheses, but no longer – you can put in as many as you please.

    Parentheses are a good way to force any statement to become an expression.

    exports.Parens = class Parens extends Base
      constructor: (@body) ->
        super()
    
      children: ['body']
    
      unwrap: -> @body
    
      shouldCache: -> @body.shouldCache()
    
      compileNode: (o) ->
        expr = @body.unwrap()
  • §

    If these parentheses are wrapping an IdentifierLiteral followed by a block comment, output the parentheses (or put another way, don’t optimize away these redundant parentheses). This is because Flow requires parentheses in certain circumstances to distinguish identifiers followed by comment-based type annotations from JavaScript labels.

        shouldWrapComment = expr.comments?.some(
          (comment) -> comment.here and not comment.unshift and not comment.newLine)
        if expr instanceof Value and expr.isAtomic() and not @jsxAttribute and not shouldWrapComment
          expr.front = @front
          return expr.compileToFragments o
        fragments = expr.compileToFragments o, LEVEL_PAREN
        bare = o.level < LEVEL_OP and not shouldWrapComment and (
            expr instanceof Op and not expr.isInOperator() or expr.unwrap() instanceof Call or
            (expr instanceof For and expr.returns)
          ) and (o.level < LEVEL_COND or fragments.length <= 3)
        return @wrapInBraces fragments if @jsxAttribute
        if bare then fragments else @wrapInParentheses fragments
    
      astNode: (o) -> @body.unwrap().ast o, LEVEL_PAREN
  • §

    StringWithInterpolations

    exports.StringWithInterpolations = class StringWithInterpolations extends Base
      constructor: (@body, {@quote, @startQuote, @jsxAttribute} = {}) ->
        super()
    
      @fromStringLiteral: (stringLiteral) ->
        updatedString = stringLiteral.withoutQuotesInLocationData()
        updatedStringValue = new Value(updatedString).withLocationDataFrom updatedString
        new StringWithInterpolations Block.wrap([updatedStringValue]), quote: stringLiteral.quote, jsxAttribute: stringLiteral.jsxAttribute
        .withLocationDataFrom stringLiteral
    
      children: ['body']
  • §

    unwrap returns this to stop ancestor nodes reaching in to grab @body, and using @body.compileNode. StringWithInterpolations.compileNode is the custom logic to output interpolated strings as code.

      unwrap: -> this
    
      shouldCache: -> @body.shouldCache()
    
      extractElements: (o, {includeInterpolationWrappers, isJsx} = {}) ->
  • §

    Assumes that expr is Block

        expr = @body.unwrap()
    
        elements = []
        salvagedComments = []
        expr.traverseChildren no, (node) =>
          if node instanceof StringLiteral
            if node.comments
              salvagedComments.push node.comments...
              delete node.comments
            elements.push node
            return yes
          else if node instanceof Interpolation
            if salvagedComments.length isnt 0
              for comment in salvagedComments
                comment.unshift = yes
                comment.newLine = yes
              attachCommentsToNode salvagedComments, node
            if (unwrapped = node.expression?.unwrapAll()) instanceof PassthroughLiteral and unwrapped.generated and not (isJsx and o.compiling)
              if o.compiling
                commentPlaceholder = new StringLiteral('').withLocationDataFrom node
                commentPlaceholder.comments = unwrapped.comments
                (commentPlaceholder.comments ?= []).push node.comments... if node.comments
                elements.push new Value commentPlaceholder
              else
                empty = new Interpolation().withLocationDataFrom node
                empty.comments = node.comments
                elements.push empty
            else if node.expression or includeInterpolationWrappers
              (node.expression?.comments ?= []).push node.comments... if node.comments
              elements.push if includeInterpolationWrappers then node else node.expression
            return no
          else if node.comments
  • §

    This node is getting discarded, but salvage its comments.

            if elements.length isnt 0 and elements[elements.length - 1] not instanceof StringLiteral
              for comment in node.comments
                comment.unshift = no
                comment.newLine = yes
              attachCommentsToNode node.comments, elements[elements.length - 1]
            else
              salvagedComments.push node.comments...
            delete node.comments
          return yes
    
        elements
    
      compileNode: (o) ->
        @comments ?= @startQuote?.comments
    
        if @jsxAttribute
          wrapped = new Parens new StringWithInterpolations @body
          wrapped.jsxAttribute = yes
          return wrapped.compileNode o
    
        elements = @extractElements o, isJsx: @jsx
    
        fragments = []
        fragments.push @makeCode '`' unless @jsx
        for element in elements
          if element instanceof StringLiteral
            unquotedElementValue = if @jsx then element.unquotedValueForJSX else element.unquotedValueForTemplateLiteral
            fragments.push @makeCode unquotedElementValue
          else
            fragments.push @makeCode '$' unless @jsx
            code = element.compileToFragments(o, LEVEL_PAREN)
            if not @isNestedTag(element) or
               code.some((fragment) -> fragment.comments?.some((comment) -> comment.here is no))
              code = @wrapInBraces code
  • §

    Flag the { and } fragments as having been generated by this StringWithInterpolations node, so that compileComments knows to treat them as bounds. But the braces are unnecessary if all of the enclosed comments are /* */ comments. Don’t trust fragment.type, which can report minified variable names when this compiler is minified.

              code[0].isStringWithInterpolations = yes
              code[code.length - 1].isStringWithInterpolations = yes
            fragments.push code...
        fragments.push @makeCode '`' unless @jsx
        fragments
    
      isNestedTag: (element) ->
        call = element.unwrapAll?()
        @jsx and call instanceof JSXElement
    
      astType: -> 'TemplateLiteral'
    
      astProperties: (o) ->
        elements = @extractElements o, includeInterpolationWrappers: yes
        [..., last] = elements
    
        quasis = []
        expressions = []
    
        for element, index in elements
          if element instanceof StringLiteral
            quasis.push new TemplateElement(
              element.originalValue
              tail: element is last
            ).withLocationDataFrom(element).ast o
          else # Interpolation
            {expression} = element
            node =
              unless expression?
                emptyInterpolation = new EmptyInterpolation()
                emptyInterpolation.locationData = emptyExpressionLocationData {
                  interpolationNode: element
                  openingBrace: '#{'
                  closingBrace: '}'
                }
                emptyInterpolation
              else
                expression.unwrapAll()
            expressions.push astAsBlockIfNeeded node, o
    
        {expressions, quasis, @quote}
    
    exports.TemplateElement = class TemplateElement extends Base
      constructor: (@value, {@tail} = {}) ->
        super()
    
      astProperties: ->
        return
          value:
            raw: @value
          tail: !!@tail
    
    exports.Interpolation = class Interpolation extends Base
      constructor: (@expression) ->
        super()
    
      children: ['expression']
  • §

    Represents the contents of an empty interpolation (e.g. #{}). Only used during AST generation.

    exports.EmptyInterpolation = class EmptyInterpolation extends Base
      constructor: ->
        super()
  • §

    For

  • §

    CoffeeScript’s replacement for the for loop is our array and object comprehensions, that compile into for loops here. They also act as an expression, able to return the result of each filtered iteration.

    Unlike Python array comprehensions, they can be multi-line, and you can pass the current index of the loop as a second parameter. Unlike Ruby blocks, you can map and filter in a single pass.

    exports.For = class For extends While
      constructor: (body, source) ->
        super()
        @addBody body
        @addSource source
    
      children: ['body', 'source', 'guard', 'step']
    
      isAwait: -> @await ? no
    
      addBody: (body) ->
        @body = Block.wrap [body]
        {expressions} = @body
        if expressions.length
          @body.locationData ?= mergeLocationData expressions[0].locationData, expressions[expressions.length - 1].locationData
        this
    
      addSource: (source) ->
        {@source  = no} = source
        attribs   = ["name", "index", "guard", "step", "own", "ownTag", "await", "awaitTag", "object", "from"]
        @[attr]   = source[attr] ? @[attr] for attr in attribs
        return this unless @source
        @index.error 'cannot use index with for-from' if @from and @index
        @ownTag.error "cannot use own with for-#{if @from then 'from' else 'in'}" if @own and not @object
        [@name, @index] = [@index, @name] if @object
        @index.error 'index cannot be a pattern matching expression' if @index?.isArray?() or @index?.isObject?()
        @awaitTag.error 'await must be used with for-from' if @await and not @from
        @range   = @source instanceof Value and @source.base instanceof Range and not @source.properties.length and not @from
        @pattern = @name instanceof Value
        @name.unwrap().propagateLhs?(yes) if @pattern
        @index.error 'indexes do not apply to range loops' if @range and @index
        @name.error 'cannot pattern match over range loops' if @range and @pattern
        @returns = no
  • §

    Move up any comments in the “for line”, i.e. the line of code with for, from any child nodes of that line up to the for node itself so that these comments get output, and get output above the for loop.

        for attribute in ['source', 'guard', 'step', 'name', 'index'] when @[attribute]
          @[attribute].traverseChildren yes, (node) =>
            if node.comments
  • §

    These comments are buried pretty deeply, so if they happen to be trailing comments the line they trail will be unrecognizable when we’re done compiling this for loop; so just shift them up to output above the for line.

              comment.newLine = comment.unshift = yes for comment in node.comments
              moveComments node, @[attribute]
          moveComments @[attribute], @
        this
  • §

    Welcome to the hairiest method in all of CoffeeScript. Handles the inner loop, filtering, stepping, and result saving for array, object, and range comprehensions. Some of the generated code can be shared in common, and some cannot.

      compileNode: (o) ->
        body        = Block.wrap [@body]
        [..., last] = body.expressions
        @returns    = no if last?.jumps() instanceof Return
        source      = if @range then @source.base else @source
        scope       = o.scope
        name        = @name  and (@name.compile o, LEVEL_LIST) if not @pattern
        index       = @index and (@index.compile o, LEVEL_LIST)
        scope.find(name)  if name and not @pattern
        scope.find(index) if index and @index not instanceof Value
        rvar        = scope.freeVariable 'results' if @returns
        if @from
          ivar = scope.freeVariable 'x', single: true if @pattern
        else
          ivar = (@object and index) or scope.freeVariable 'i', single: true
        kvar        = ((@range or @from) and name) or index or ivar
        kvarAssign  = if kvar isnt ivar then "#{kvar} = " else ""
        if @step and not @range
          [step, stepVar] = @cacheToCodeFragments @step.cache o, LEVEL_LIST, shouldCacheOrIsAssignable
          stepNum   = parseNumber stepVar if @step.isNumber()
        name        = ivar if @pattern
        varPart     = ''
        guardPart   = ''
        defPart     = ''
        idt1        = @tab + TAB
        if @range
          forPartFragments = source.compileToFragments merge o,
            {index: ivar, name, @step, shouldCache: shouldCacheOrIsAssignable}
        else
          svar    = @source.compile o, LEVEL_LIST
          if (name or @own) and not @from and @source.unwrap() not instanceof IdentifierLiteral
            defPart    += "#{@tab}#{ref = scope.freeVariable 'ref'} = #{svar};\n"
            svar       = ref
          if name and not @pattern and not @from
            namePart   = "#{name} = #{svar}[#{kvar}]"
          if not @object and not @from
            defPart += "#{@tab}#{step};\n" if step isnt stepVar
            down = stepNum < 0
            lvar = scope.freeVariable 'len' unless @step and stepNum? and down
            declare = "#{kvarAssign}#{ivar} = 0, #{lvar} = #{svar}.length"
            declareDown = "#{kvarAssign}#{ivar} = #{svar}.length - 1"
            compare = "#{ivar} < #{lvar}"
            compareDown = "#{ivar} >= 0"
            if @step
              if stepNum?
                if down
                  compare = compareDown
                  declare = declareDown
              else
                compare = "#{stepVar} > 0 ? #{compare} : #{compareDown}"
                declare = "(#{stepVar} > 0 ? (#{declare}) : #{declareDown})"
              increment = "#{ivar} += #{stepVar}"
            else
              increment = "#{if kvar isnt ivar then "++#{ivar}" else "#{ivar}++"}"
            forPartFragments = [@makeCode("#{declare}; #{compare}; #{kvarAssign}#{increment}")]
        if @returns
          resultPart   = "#{@tab}#{rvar} = [];\n"
          returnResult = "\n#{@tab}return #{rvar};"
          body.makeReturn rvar
        if @guard
          if body.expressions.length > 1
            body.expressions.unshift new If (new Parens @guard).invert(), new StatementLiteral "continue"
          else
            body = Block.wrap [new If @guard, body] if @guard
        if @pattern
          body.expressions.unshift new Assign @name, if @from then new IdentifierLiteral kvar else new Literal "#{svar}[#{kvar}]"
    
        varPart = "\n#{idt1}#{namePart};" if namePart
        if @object
          forPartFragments = [@makeCode("#{kvar} in #{svar}")]
          guardPart = "\n#{idt1}if (!#{utility 'hasProp', o}.call(#{svar}, #{kvar})) continue;" if @own
        else if @from
          if @await
            forPartFragments = new Op 'await', new Parens new Literal "#{kvar} of #{svar}"
            forPartFragments = forPartFragments.compileToFragments o, LEVEL_TOP
          else
            forPartFragments = [@makeCode("#{kvar} of #{svar}")]
        bodyFragments = body.compileToFragments merge(o, indent: idt1), LEVEL_TOP
        if bodyFragments and bodyFragments.length > 0
          bodyFragments = [].concat @makeCode('\n'), bodyFragments, @makeCode('\n')
    
        fragments = [@makeCode(defPart)]
        fragments.push @makeCode(resultPart) if resultPart
        forCode = if @await then 'for ' else 'for ('
        forClose = if @await then '' else ')'
        fragments = fragments.concat @makeCode(@tab), @makeCode( forCode),
          forPartFragments, @makeCode("#{forClose} {#{guardPart}#{varPart}"), bodyFragments,
          @makeCode(@tab), @makeCode('}')
        fragments.push @makeCode(returnResult) if returnResult
        fragments
    
      astNode: (o) ->
        addToScope = (name) ->
          alreadyDeclared = o.scope.find name.value
          name.isDeclaration = not alreadyDeclared
        @name?.eachName addToScope, checkAssignability: no
        @index?.eachName addToScope, checkAssignability: no
        super o
    
      astType: -> 'For'
    
      astProperties: (o) ->
        return
          source: @source?.ast o
          body: @body.ast o, LEVEL_TOP
          guard: @guard?.ast(o) ? null
          name: @name?.ast(o) ? null
          index: @index?.ast(o) ? null
          step: @step?.ast(o) ? null
          postfix: !!@postfix
          own: !!@own
          await: !!@await
          style: switch
            when @from   then 'from'
            when @object then 'of'
            when @name   then 'in'
            else              'range'
  • §

    Switch

  • §

    A JavaScript switch statement. Converts into a returnable expression on-demand.

    exports.Switch = class Switch extends Base
      constructor: (@subject, @cases, @otherwise) ->
        super()
    
      children: ['subject', 'cases', 'otherwise']
    
      isStatement: YES
    
      jumps: (o = {block: yes}) ->
        for {block} in @cases
          return jumpNode if jumpNode = block.jumps o
        @otherwise?.jumps o
    
      makeReturn: (results, mark) ->
        block.makeReturn(results, mark) for {block} in @cases
        @otherwise or= new Block [new Literal 'void 0'] if results
        @otherwise?.makeReturn results, mark
        this
    
      compileNode: (o) ->
        idt1 = o.indent + TAB
        idt2 = o.indent = idt1 + TAB
        fragments = [].concat @makeCode(@tab + "switch ("),
          (if @subject then @subject.compileToFragments(o, LEVEL_PAREN) else @makeCode "false"),
          @makeCode(") {\n")
        for {conditions, block}, i in @cases
          for cond in flatten [conditions]
            cond  = cond.invert() unless @subject
            fragments = fragments.concat @makeCode(idt1 + "case "), cond.compileToFragments(o, LEVEL_PAREN), @makeCode(":\n")
          fragments = fragments.concat body, @makeCode('\n') if (body = block.compileToFragments o, LEVEL_TOP).length > 0
          break if i is @cases.length - 1 and not @otherwise
          expr = @lastNode block.expressions
          continue if expr instanceof Return or expr instanceof Throw or (expr instanceof Literal and expr.jumps() and expr.value isnt 'debugger')
          fragments.push cond.makeCode(idt2 + 'break;\n')
        if @otherwise and @otherwise.expressions.length
          fragments.push @makeCode(idt1 + "default:\n"), (@otherwise.compileToFragments o, LEVEL_TOP)..., @makeCode("\n")
        fragments.push @makeCode @tab + '}'
        fragments
    
      astType: -> 'SwitchStatement'
    
      casesAst: (o) ->
        cases = []
    
        for kase, caseIndex in @cases
          {conditions: tests, block: consequent} = kase
          tests = flatten [tests]
          lastTestIndex = tests.length - 1
          for test, testIndex in tests
            testConsequent =
              if testIndex is lastTestIndex
                consequent
              else
                null
    
            caseLocationData = test.locationData
            caseLocationData = mergeLocationData caseLocationData, testConsequent.expressions[testConsequent.expressions.length - 1].locationData if testConsequent?.expressions.length
            caseLocationData = mergeLocationData caseLocationData, kase.locationData, justLeading: yes if testIndex is 0
            caseLocationData = mergeLocationData caseLocationData, kase.locationData, justEnding:  yes if testIndex is lastTestIndex
    
            cases.push new SwitchCase(test, testConsequent, trailing: testIndex is lastTestIndex).withLocationDataFrom locationData: caseLocationData
    
        if @otherwise?.expressions.length
          cases.push new SwitchCase(null, @otherwise).withLocationDataFrom @otherwise
    
        kase.ast(o) for kase in cases
    
      astProperties: (o) ->
        return
          discriminant: @subject?.ast(o, LEVEL_PAREN) ? null
          cases: @casesAst o
    
    class SwitchCase extends Base
      constructor: (@test, @block, {@trailing} = {}) ->
        super()
    
      children: ['test', 'block']
    
      astProperties: (o) ->
        return
          test: @test?.ast(o, LEVEL_PAREN) ? null
          consequent: @block?.ast(o, LEVEL_TOP).body ? []
          trailing: !!@trailing
    
    exports.SwitchWhen = class SwitchWhen extends Base
      constructor: (@conditions, @block) ->
        super()
    
      children: ['conditions', 'block']
  • §

    If

  • §

    If/else statements. Acts as an expression by pushing down requested returns to the last line of each clause.

    Single-expression Ifs are compiled into conditional operators if possible, because ternaries are already proper expressions, and don’t need conversion.

    exports.If = class If extends Base
      constructor: (@condition, @body, options = {}) ->
        super()
        @elseBody  = null
        @isChain   = false
        {@soak, @postfix, @type} = options
        moveComments @condition, @ if @condition.comments
    
      children: ['condition', 'body', 'elseBody']
    
      bodyNode:     -> @body?.unwrap()
      elseBodyNode: -> @elseBody?.unwrap()
  • §

    Rewrite a chain of Ifs to add a default case as the final else.

      addElse: (elseBody) ->
        if @isChain
          @elseBodyNode().addElse elseBody
          @locationData = mergeLocationData @locationData, @elseBodyNode().locationData
        else
          @isChain  = elseBody instanceof If
          @elseBody = @ensureBlock elseBody
          @elseBody.updateLocationDataIfMissing elseBody.locationData
          @locationData = mergeLocationData @locationData, @elseBody.locationData if @locationData? and @elseBody.locationData?
        this
  • §

    The If only compiles into a statement if either of its bodies needs to be a statement. Otherwise a conditional operator is safe.

      isStatement: (o) ->
        o?.level is LEVEL_TOP or
          @bodyNode().isStatement(o) or @elseBodyNode()?.isStatement(o)
    
      jumps: (o) -> @body.jumps(o) or @elseBody?.jumps(o)
    
      compileNode: (o) ->
        if @isStatement o then @compileStatement o else @compileExpression o
    
      makeReturn: (results, mark) ->
        if mark
          @body?.makeReturn results, mark
          @elseBody?.makeReturn results, mark
          return
        @elseBody  or= new Block [new Literal 'void 0'] if results
        @body     and= new Block [@body.makeReturn results]
        @elseBody and= new Block [@elseBody.makeReturn results]
        this
    
      ensureBlock: (node) ->
        if node instanceof Block then node else new Block [node]
  • §

    Compile the If as a regular if-else statement. Flattened chains force inner else bodies into statement form.

      compileStatement: (o) ->
        child    = del o, 'chainChild'
        exeq     = del o, 'isExistentialEquals'
    
        if exeq
          return new If(@processedCondition().invert(), @elseBodyNode(), type: 'if').compileToFragments o
    
        indent   = o.indent + TAB
        cond     = @processedCondition().compileToFragments o, LEVEL_PAREN
        body     = @ensureBlock(@body).compileToFragments merge o, {indent}
        ifPart   = [].concat @makeCode("if ("), cond, @makeCode(") {\n"), body, @makeCode("\n#{@tab}}")
        ifPart.unshift @makeCode @tab unless child
        return ifPart unless @elseBody
        answer = ifPart.concat @makeCode(' else ')
        if @isChain
          o.chainChild = yes
          answer = answer.concat @elseBody.unwrap().compileToFragments o, LEVEL_TOP
        else
          answer = answer.concat @makeCode("{\n"), @elseBody.compileToFragments(merge(o, {indent}), LEVEL_TOP), @makeCode("\n#{@tab}}")
        answer
  • §

    Compile the If as a conditional operator.

      compileExpression: (o) ->
        cond = @processedCondition().compileToFragments o, LEVEL_COND
        body = @bodyNode().compileToFragments o, LEVEL_LIST
        alt  = if @elseBodyNode() then @elseBodyNode().compileToFragments(o, LEVEL_LIST) else [@makeCode('void 0')]
        fragments = cond.concat @makeCode(" ? "), body, @makeCode(" : "), alt
        if o.level >= LEVEL_COND then @wrapInParentheses fragments else fragments
    
      unfoldSoak: ->
        @soak and this
    
      processedCondition: ->
        @processedConditionCache ?= if @type is 'unless' then @condition.invert() else @condition
    
      isStatementAst: (o) ->
        o.level is LEVEL_TOP
    
      astType: (o) ->
        if @isStatementAst o
          'IfStatement'
        else
          'ConditionalExpression'
    
      astProperties: (o) ->
        isStatement = @isStatementAst o
    
        return
          test: @condition.ast o, if isStatement then LEVEL_PAREN else LEVEL_COND
          consequent:
            if isStatement
              @body.ast o, LEVEL_TOP
            else
              @bodyNode().ast o, LEVEL_TOP
          alternate:
            if @isChain
              @elseBody.unwrap().ast o, if isStatement then LEVEL_TOP else LEVEL_COND
            else if not isStatement and @elseBody?.expressions?.length is 1
              @elseBody.expressions[0].ast o, LEVEL_TOP
            else
              @elseBody?.ast(o, LEVEL_TOP) ? null
          postfix: !!@postfix
          inverted: @type is 'unless'
  • §

    A sequence expression e.g. (a; b). Currently only used during AST generation.

    exports.Sequence = class Sequence extends Base
      children: ['expressions']
    
      constructor: (@expressions) ->
        super()
    
      astNode: (o) ->
        return @expressions[0].ast(o) if @expressions.length is 1
        super o
    
      astType: -> 'SequenceExpression'
    
      astProperties: (o) ->
        return
          expressions:
            expression.ast(o) for expression in @expressions
  • §

    Constants

  • §
    UTILITIES =
      modulo: -> 'function(a, b) { return (+a % (b = +b) + b) % b; }'
    
      boundMethodCheck: -> "
        function(instance, Constructor) {
          if (!(instance instanceof Constructor)) {
            throw new Error('Bound instance method accessed before binding');
          }
        }
      "
  • §

    Shortcuts to speed up the lookup time for native functions.

      hasProp: -> '{}.hasOwnProperty'
      indexOf: -> '[].indexOf'
      slice  : -> '[].slice'
      splice : -> '[].splice'
  • §

    Levels indicate a node’s position in the AST. Useful for knowing if parens are necessary or superfluous.

    LEVEL_TOP    = 1  # ...;
    LEVEL_PAREN  = 2  # (...)
    LEVEL_LIST   = 3  # [...]
    LEVEL_COND   = 4  # ... ? x : y
    LEVEL_OP     = 5  # !...
    LEVEL_ACCESS = 6  # ...[0]
  • §

    Tabs are two spaces for pretty printing.

    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    = ///
        ((?:\\\\)+)      # Consume (and preserve) an even number of backslashes.
      | \\[^\S\n]*\n\s*  # Remove escaped newlines.
    ///g
    HEREGEX_OMIT = ///
        ((?:\\\\)+)     # Consume (and preserve) an even number of backslashes.
      | \\(\s)          # Preserve escaped whitespace.
      | \s+(?:#.*)?     # Remove whitespace and comments.
    ///g
  • §

    Helper Functions

  • §
  • §

    Helper for ensuring that utility functions are assigned at the top level.

    utility = (name, o) ->
      {root} = o.scope
      if name of root.utilities
        root.utilities[name]
      else
        ref = root.freeVariable name
        root.assign ref, UTILITIES[name] o
        root.utilities[name] = ref
    
    multident = (code, tab, includingFirstLine = yes) ->
      endsWithNewLine = code[code.length - 1] is '\n'
      code = (if includingFirstLine then tab else '') + code.replace /\n/g, "$&#{tab}"
      code = code.replace /\s+$/, ''
      code = code + '\n' if endsWithNewLine
      code
  • §

    Wherever in CoffeeScript 1 we might’ve inserted a makeCode "#{@tab}" to indent a line of code, now we must account for the possibility of comments preceding that line of code. If there are such comments, indent each line of such comments, and then indent the first following line of code.

    indentInitial = (fragments, node) ->
      for fragment, fragmentIndex in fragments
        if fragment.isHereComment
          fragment.code = multident fragment.code, node.tab
        else
          fragments.splice fragmentIndex, 0, node.makeCode "#{node.tab}"
          break
      fragments
    
    hasLineComments = (node) ->
      return no unless node.comments
      for comment in node.comments
        return yes if comment.here is no
      return no
  • §

    Move the comments property from one object to another, deleting it from the first object.

    moveComments = (from, to) ->
      return unless from?.comments
      attachCommentsToNode from.comments, to
      delete from.comments
  • §

    Sometimes when compiling a node, we want to insert a fragment at the start of an array of fragments; but if the start has one or more comment fragments, we want to insert this fragment after those but before any non-comments.

    unshiftAfterComments = (fragments, fragmentToInsert) ->
      inserted = no
      for fragment, fragmentIndex in fragments when not fragment.isComment
        fragments.splice fragmentIndex, 0, fragmentToInsert
        inserted = yes
        break
      fragments.push fragmentToInsert unless inserted
      fragments
    
    isLiteralArguments = (node) ->
      node instanceof IdentifierLiteral and node.value is 'arguments'
    
    isLiteralThis = (node) ->
      node instanceof ThisLiteral or (node instanceof Code and node.bound)
    
    shouldCacheOrIsAssignable = (node) -> node.shouldCache() or node.isAssignable?()
  • §

    Unfold a node’s child if soak, then tuck the node under created If

    unfoldSoak = (o, parent, name) ->
      return unless ifn = parent[name].unfoldSoak o
      parent[name] = ifn.body
      ifn.body = new Value parent
      ifn
  • §

    Constructs a string or regex by escaping certain characters.

    makeDelimitedLiteral = (body, {delimiter: delimiterOption, escapeNewlines, double, includeDelimiters = yes, escapeDelimiter = yes, convertTrailingNullEscapes} = {}) ->
      body = '(?:)' if body is '' and delimiterOption is '/'
      escapeTemplateLiteralCurlies = delimiterOption is '`'
      regex = ///
          (\\\\)                               # Escaped backslash.
        | (\\0(?=\d))                          # Null character mistaken as octal escape.
        #{
          if convertTrailingNullEscapes
            /// | (\\0) $ ///.source           # Trailing null character that could be mistaken as octal escape.
          else
            ''
        }
        #{
          if escapeDelimiter
            /// | \\?(#{delimiterOption}) ///.source # (Possibly escaped) delimiter.
          else
            ''
        }
        #{
          if escapeTemplateLiteralCurlies
            /// | \\?(\$\{) ///.source         # `${` inside template literals must be escaped.
          else
            ''
        }
        | \\?(?:
            #{if escapeNewlines then '(\n)|' else ''}
              (\r)
            | (\u2028)
            | (\u2029)
          )                                    # (Possibly escaped) newlines.
        | (\\.)                                # Other escapes.
      ///g
      body = body.replace regex, (match, backslash, nul, ...args) ->
        trailingNullEscape =
          args.shift() if convertTrailingNullEscapes
        delimiter =
          args.shift() if escapeDelimiter
        templateLiteralCurly =
          args.shift() if escapeTemplateLiteralCurlies
        lf =
          args.shift() if escapeNewlines
        [cr, ls, ps, other] = args
        switch
  • §

    Ignore escaped backslashes.

          when backslash then (if double then backslash + backslash else backslash)
          when nul                  then '\\x00'
          when trailingNullEscape   then "\\x00"
          when delimiter            then "\\#{delimiter}"
          when templateLiteralCurly then "\\${"
          when lf                   then '\\n'
          when cr                   then '\\r'
          when ls                   then '\\u2028'
          when ps                   then '\\u2029'
          when other                then (if double then "\\#{other}" else other)
      printedDelimiter = if includeDelimiters then delimiterOption else ''
      "#{printedDelimiter}#{body}#{printedDelimiter}"
    
    sniffDirectives = (expressions, {notFinalExpression} = {}) ->
      index = 0
      lastIndex = expressions.length - 1
      while index <= lastIndex
        break if index is lastIndex and notFinalExpression
        expression = expressions[index]
        if (unwrapped = expression?.unwrap?()) instanceof PassthroughLiteral and unwrapped.generated
          index++
          continue
        break unless expression instanceof Value and expression.isString() and not expression.unwrap().shouldGenerateTemplateLiteral()
        expressions[index] =
          new Directive expression
          .withLocationDataFrom expression
        index++
    
    astAsBlockIfNeeded = (node, o) ->
      unwrapped = node.unwrap()
      if unwrapped instanceof Block and unwrapped.expressions.length > 1
        unwrapped.makeReturn null, yes
        unwrapped.ast o, LEVEL_TOP
      else
        node.ast o, LEVEL_PAREN
  • §

    Helpers for mergeLocationData and mergeAstLocationData below.

    lesser  = (a, b) -> if a < b then a else b
    greater = (a, b) -> if a > b then a else b
    
    isAstLocGreater = (a, b) ->
      return yes if a.line > b.line
      return no unless a.line is b.line
      a.column > b.column
    
    isLocationDataStartGreater = (a, b) ->
      return yes if a.first_line > b.first_line
      return no unless a.first_line is b.first_line
      a.first_column > b.first_column
    
    isLocationDataEndGreater = (a, b) ->
      return yes if a.last_line > b.last_line
      return no unless a.last_line is b.last_line
      a.last_column > b.last_column
  • §

    Take two nodes’ location data and return a new locationData object that encompasses the location data of both nodes. So the new first_line value will be the earlier of the two nodes’ first_line values, the new last_column the later of the two nodes’ last_column values, etc.

    If you only want to extend the first node’s location data with the start or end location data of the second node, pass the justLeading or justEnding options. So e.g. if first’s range is [4, 5] and second’s range is [1, 10], you’d get:

    mergeLocationData(first, second).range                   # [1, 10]
    mergeLocationData(first, second, justLeading: yes).range # [1, 5]
    mergeLocationData(first, second, justEnding:  yes).range # [4, 10]
    
    exports.mergeLocationData = mergeLocationData = (locationDataA, locationDataB, {justLeading, justEnding} = {}) ->
      return Object.assign(
        if justEnding
          first_line:   locationDataA.first_line
          first_column: locationDataA.first_column
        else
          if isLocationDataStartGreater locationDataA, locationDataB
            first_line:   locationDataB.first_line
            first_column: locationDataB.first_column
          else
            first_line:   locationDataA.first_line
            first_column: locationDataA.first_column
      ,
        if 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
        else
          if 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
          else
            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: [
          if justEnding
            locationDataA.range[0]
          else
            lesser locationDataA.range[0], locationDataB.range[0]
        ,
          if justLeading
            locationDataA.range[1]
          else
            greater locationDataA.range[1], locationDataB.range[1]
        ]
      )
  • §

    Take two AST nodes, or two AST nodes’ location data objects, and return a new location data object that encompasses the location data of both nodes. So the new start value will be the earlier of the two nodes’ start values, the new end value will be the later of the two nodes’ end values, etc.

    If you only want to extend the first node’s location data with the start or end location data of the second node, pass the justLeading or justEnding options. So e.g. if first’s range is [4, 5] and second’s range is [1, 10], you’d get:

    mergeAstLocationData(first, second).range                   # [1, 10]
    mergeAstLocationData(first, second, justLeading: yes).range # [1, 5]
    mergeAstLocationData(first, second, justEnding:  yes).range # [4, 10]
    
    exports.mergeAstLocationData = mergeAstLocationData = (nodeA, nodeB, {justLeading, justEnding} = {}) ->
      return
        loc:
          start:
            if justEnding
              nodeA.loc.start
            else
              if isAstLocGreater nodeA.loc.start, nodeB.loc.start
                nodeB.loc.start
              else
                nodeA.loc.start
          end:
            if justLeading
              nodeA.loc.end
            else
              if isAstLocGreater nodeA.loc.end, nodeB.loc.end
                nodeA.loc.end
              else
                nodeB.loc.end
        range: [
          if justEnding
            nodeA.range[0]
          else
            lesser nodeA.range[0], nodeB.range[0]
        ,
          if justLeading
            nodeA.range[1]
          else
            greater nodeA.range[1], nodeB.range[1]
        ]
        start:
          if justEnding
            nodeA.start
          else
            lesser nodeA.start, nodeB.start
        end:
          if justLeading
            nodeA.end
          else
            greater nodeA.end, nodeB.end
  • §

    Convert Jison-style node class location data to Babel-style location data

    exports.jisonLocationDataToAstLocationData = jisonLocationDataToAstLocationData = ({first_line, first_column, last_line_exclusive, last_column_exclusive, 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]
  • §

    Generate a zero-width location data that corresponds to the end of another node’s location.

    zeroWidthLocationDataFromEndLocation = ({range: [, endRange], last_line_exclusive, last_column_exclusive}) -> {
      first_line: last_line_exclusive
      first_column: last_column_exclusive
      last_line: last_line_exclusive
      last_column: last_column_exclusive
      last_line_exclusive
      last_column_exclusive
      range: [endRange, endRange]
    }
    
    extractSameLineLocationDataFirst = (numChars) -> ({range: [startRange], first_line, first_column}) -> {
      first_line
      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 = (numChars) -> ({range: [, endRange], last_line, last_column, last_line_exclusive, last_column_exclusive}) -> {
      first_line: last_line
      first_column: last_column - (numChars - 1)
      last_line: last_line
      last_column: last_column
      last_line_exclusive
      last_column_exclusive
      range: [endRange - numChars, endRange]
    }
  • §

    We don’t currently have a token corresponding to the empty space between interpolation/JSX expression braces, so piece together the location data by trimming the braces from the Interpolation’s location data. Technically the last_line/last_column calculation here could be incorrect if the ending brace is preceded by a newline, but last_line/last_column aren’t used for AST generation anyway.

    emptyExpressionLocationData = ({interpolationNode: element, openingBrace, closingBrace}) ->
      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
      ]
================================================ FILE: docs/v2/annotated-source/optparse.html ================================================ optparse.coffee
  • optparse.coffee

  • §
    {repeat} = require './helpers'
  • §

    A simple OptionParser class to parse option flags from the command-line. Use it like so:

    parser  = new OptionParser switches, helpBanner
    options = parser.parse process.argv
    

    The first non-option is considered to be the start of the file (and file option) list, and all subsequent arguments are left unparsed.

    The coffee command uses an instance of OptionParser to parse its command-line arguments in src/command.coffee.

    exports.OptionParser = class OptionParser
  • §

    Initialize with a list of valid options, in the form:

    [short-flag, long-flag, description]
    

    Along with an optional banner for the usage help.

      constructor: (ruleDeclarations, @banner) ->
        @rules = buildRules ruleDeclarations
  • §

    Parse the list of arguments, populating an options object with all of the specified options, and return it. Options after the first non-option argument are treated as arguments. options.arguments will be an array containing the remaining arguments. This is a simpler API than many option parsers that allow you to attach callback actions for every flag. Instead, you’re responsible for interpreting the options object.

      parse: (args) ->
  • §

    The CoffeeScript option parser is a little odd; options after the first non-option argument are treated as non-option arguments themselves. Optional arguments are normalized by expanding merged flags into multiple flags. This allows you to have -wl be the same as --watch --lint. Note that executable scripts with a shebang (#!) line should use the line #!/usr/bin/env coffee, or #!/absolute/path/to/coffee, without a -- argument after, because that will fail on Linux (see #3946).

        {rules, positional} = normalizeArguments args, @rules.flagDict
        options = {}
  • §

    The argument field is added to the rule instance non-destructively by normalizeArguments.

        for {hasArgument, argument, isList, name} in rules
          if hasArgument
            if isList
              options[name] ?= []
              options[name].push argument
            else
              options[name] = argument
          else
            options[name] = true
    
        if positional[0] is '--'
          options.doubleDashed = yes
          positional = positional[1..]
    
        options.arguments = positional
        options
  • §

    Return the help text for this OptionParser, listing and describing all of the valid options, for --help and such.

      help: ->
        lines = []
        lines.unshift "#{@banner}\n" if @banner
        for rule in @rules.ruleList
          spaces  = 15 - rule.longFlag.length
          spaces  = if spaces > 0 then repeat ' ', spaces else ''
          letPart = if rule.shortFlag then rule.shortFlag + ', ' else '    '
          lines.push '  ' + letPart + rule.longFlag + spaces + rule.description
        "\n#{ lines.join('\n') }\n"
  • §

    Helpers

  • §
  • §

    Regex matchers for option flags on the command line and their rules.

    LONG_FLAG  = /^(--\w[\w\-]*)/
    SHORT_FLAG = /^(-\w)$/
    MULTI_FLAG = /^-(\w{2,})/
  • §

    Matches the long flag part of a rule for an option with an argument. Not applied to anything in process.argv.

    OPTIONAL   = /\[(\w+(\*?))\]/
  • §

    Build and return the list of option rules. If the optional short-flag is unspecified, leave it out by padding with null.

    buildRules = (ruleDeclarations) ->
      ruleList = for tuple in ruleDeclarations
        tuple.unshift null if tuple.length < 3
        buildRule tuple...
      flagDict = {}
      for rule in ruleList
  • §

    shortFlag is null if not provided in the rule.

        for flag in [rule.shortFlag, rule.longFlag] when flag?
          if flagDict[flag]?
            throw new Error "flag #{flag} for switch #{rule.name}
              was already declared for switch #{flagDict[flag].name}"
          flagDict[flag] = rule
    
      {ruleList, flagDict}
  • §

    Build a rule from a -o short flag, a --output [DIR] long flag, and the description of what the option does.

    buildRule = (shortFlag, longFlag, description) ->
      match     = longFlag.match(OPTIONAL)
      shortFlag = shortFlag?.match(SHORT_FLAG)[1]
      longFlag  = longFlag.match(LONG_FLAG)[1]
      {
        name:         longFlag.replace /^--/, ''
        shortFlag:    shortFlag
        longFlag:     longFlag
        description:  description
        hasArgument:  !!(match and match[1])
        isList:       !!(match and match[2])
      }
    
    normalizeArguments = (args, flagDict) ->
      rules = []
      positional = []
      needsArgOpt = null
      for arg, argIndex in args
  • §

    If the previous argument given to the script was an option that uses the next command-line argument as its argument, create copy of the option’s rule with an argument field.

        if needsArgOpt?
          withArg = Object.assign {}, needsArgOpt.rule, {argument: arg}
          rules.push withArg
          needsArgOpt = null
          continue
    
        multiFlags = arg.match(MULTI_FLAG)?[1]
          .split('')
          .map (flagName) -> "-#{flagName}"
        if multiFlags?
          multiOpts = multiFlags.map (flag) ->
            rule = flagDict[flag]
            unless rule?
              throw new Error "unrecognized option #{flag} in multi-flag #{arg}"
            {rule, flag}
  • §

    Only the last flag in a multi-flag may have an argument.

          [innerOpts..., lastOpt] = multiOpts
          for {rule, flag} in innerOpts
            if rule.hasArgument
              throw new Error "cannot use option #{flag} in multi-flag #{arg} except
              as the last option, because it needs an argument"
            rules.push rule
          if lastOpt.rule.hasArgument
            needsArgOpt = lastOpt
          else
            rules.push lastOpt.rule
        else if ([LONG_FLAG, SHORT_FLAG].some (pat) -> arg.match(pat)?)
          singleRule = flagDict[arg]
          unless singleRule?
            throw new Error "unrecognized option #{arg}"
          if singleRule.hasArgument
            needsArgOpt = {rule: singleRule, flag: arg}
          else
            rules.push singleRule
        else
  • §

    This is a positional argument.

          positional = args[argIndex..]
          break
    
      if needsArgOpt?
        throw new Error "value required for #{needsArgOpt.flag}, but it was the last
        argument provided"
      {rules, positional}
================================================ FILE: docs/v2/annotated-source/public/stylesheets/normalize.css ================================================ /*! normalize.css v2.0.1 | MIT License | git.io/normalize */ /* ========================================================================== HTML5 display definitions ========================================================================== */ /* * Corrects `block` display not defined in IE 8/9. */ article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary { display: block; } /* * Corrects `inline-block` display not defined in IE 8/9. */ audio, canvas, video { display: inline-block; } /* * Prevents modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /* * Addresses styling for `hidden` attribute not present in IE 8/9. */ [hidden] { display: none; } /* ========================================================================== Base ========================================================================== */ /* * 1. Sets default font family to sans-serif. * 2. Prevents iOS text size adjust after orientation change, without disabling * user zoom. */ html { font-family: sans-serif; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -ms-text-size-adjust: 100%; /* 2 */ } /* * Removes default margin. */ body { margin: 0; } /* ========================================================================== Links ========================================================================== */ /* * Addresses `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: thin dotted; } /* * Improves readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography ========================================================================== */ /* * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, * Safari 5, and Chrome. */ h1 { font-size: 2em; } /* * Addresses styling not present in IE 8/9, Safari 5, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /* * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ b, strong { font-weight: bold; } /* * Addresses styling not present in Safari 5 and Chrome. */ dfn { font-style: italic; } /* * Addresses styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } /* * Corrects font family set oddly in Safari 5 and Chrome. */ code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } /* * Improves readability of pre-formatted text in all browsers. */ pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } /* * Sets consistent quote types. */ q { quotes: "\201C" "\201D" "\2018" "\2019"; } /* * Addresses inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /* * Prevents `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Embedded content ========================================================================== */ /* * Removes border when inside `a` element in IE 8/9. */ img { border: 0; } /* * Corrects overflow displayed oddly in IE 9. */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures ========================================================================== */ /* * Addresses margin not present in IE 8/9 and Safari 5. */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /* * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /* * 1. Corrects color not being inherited in IE 8/9. * 2. Remove padding so people aren't caught out if they zero out fieldsets. */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /* * 1. Corrects font family not being inherited in all browsers. * 2. Corrects font size not being inherited in all browsers. * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome */ button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } /* * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ button, input { line-height: normal; } /* * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Corrects inability to style clickable `input` types in iOS. * 3. Improves usability and consistency of cursor style between image-type * `input` and others. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /* * Re-set default cursor for disabled elements. */ button[disabled], input[disabled] { cursor: default; } /* * 1. Addresses box sizing set to `content-box` in IE 8/9. * 2. Removes excess padding in IE 8/9. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /* * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /* * Removes inner padding and search cancel button in Safari 5 and Chrome * on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /* * Removes inner padding and border in Firefox 4+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /* * 1. Removes default vertical scrollbar in IE 8/9. * 2. Improves readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables ========================================================================== */ /* * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } ================================================ FILE: docs/v2/annotated-source/register.html ================================================ register.coffee
  • register.coffee

  • §
    CoffeeScript  = require './'
    child_process = require 'child_process'
    helpers       = require './helpers'
    path          = require 'path'
    
    {patchStackTrace} = CoffeeScript
  • §

    Check if Node’s built-in source map stack trace transformations are enabled.

    nodeSourceMapsSupportEnabled = process? and (
      process.execArgv.includes('--enable-source-maps') or
      process.env.NODE_OPTIONS?.includes('--enable-source-maps')
    )
    
    unless Error.prepareStackTrace or nodeSourceMapsSupportEnabled
      cacheSourceMaps = true
      patchStackTrace()
  • §

    Load and run a CoffeeScript file for Node, stripping any BOMs.

    loadFile = (module, filename) ->
      options = module.options or getRootModule(module).options or {}
  • §

    Currently CoffeeScript.compile caches all source maps if present. They are available in getSourceMap retrieved by filename.

      if cacheSourceMaps or nodeSourceMapsSupportEnabled
        options.inlineMap = true
      js = CoffeeScript._compileFile filename, options
    
      module._compile js, filename
  • §

    If the installed version of Node supports require.extensions, register CoffeeScript as an extension.

    if require.extensions
      for ext in CoffeeScript.FILE_EXTENSIONS
        require.extensions[ext] = loadFile
  • §

    Patch Node’s module loader to be able to handle multi-dot extensions. This is a horrible thing that should not be required.

      Module = require 'module'
    
      findExtension = (filename) ->
        extensions = path.basename(filename).split '.'
  • §

    Remove the initial dot from dotfiles.

        extensions.shift() if extensions[0] is ''
  • §

    Start with the longest possible extension and work our way shortwards.

        while extensions.shift()
          curExtension = '.' + extensions.join '.'
          return curExtension if Module._extensions[curExtension]
        '.js'
    
      Module::load = (filename) ->
        @filename = filename
        @paths = Module._nodeModulePaths path.dirname filename
        extension = findExtension filename
        Module._extensions[extension](this, filename)
        @loaded = true
  • §

    If we’re on Node, patch child_process.fork so that Coffee scripts are able to fork both CoffeeScript files, and JavaScript files, directly.

    if child_process
      {fork} = child_process
      binary = require.resolve '../../bin/coffee'
      child_process.fork = (path, args, options) ->
        if helpers.isCoffee path
          unless Array.isArray args
            options = args or {}
            args = []
          args = [path].concat args
          path = binary
        fork path, args, options
  • §

    Utility function to find the options object attached to the topmost module.

    getRootModule = (module) ->
      if module.parent then getRootModule module.parent else module
================================================ FILE: docs/v2/annotated-source/repl.html ================================================ repl.coffee
  • repl.coffee

  • §
    fs = require 'fs'
    path = require 'path'
    vm = require 'vm'
    nodeREPL = require 'repl'
    CoffeeScript = require './'
    {merge, updateSyntaxError} = require './helpers'
    
    sawSIGINT = no
    transpile = no
    
    replDefaults =
      prompt: 'coffee> ',
      historyFile: do ->
        historyPath = process.env.XDG_CACHE_HOME or process.env.HOME
        path.join historyPath, '.coffee_history' if historyPath
      historyMaxInputSize: 10240
      eval: (input, context, filename, cb) ->
  • §

    XXX: multiline hack.

        input = input.replace /\uFF00/g, '\n'
  • §

    Node’s REPL sends the input ending with a newline and then wrapped in parens. Unwrap all that.

        input = input.replace /^\(([\s\S]*)\n\)$/m, '$1'
  • §

    Node’s REPL v6.9.1+ sends the input wrapped in a try/catch statement. Unwrap that too.

        input = input.replace /^\s*try\s*{([\s\S]*)}\s*catch.*$/m, '$1'
  • §

    Require AST nodes to do some AST manipulation.

        {Block, Assign, Value, Literal, Call, Code, Root} = require './nodes'
    
        try
  • §

    Tokenize the clean input.

          tokens = CoffeeScript.tokens input
  • §

    Filter out tokens generated just to hold comments.

          if tokens.length >= 2 and tokens[0].generated and
             tokens[0].comments?.length isnt 0 and "#{tokens[0][1]}" is '' and
             tokens[1][0] is 'TERMINATOR'
            tokens = tokens[2...]
          if tokens.length >= 1 and tokens[tokens.length - 1].generated and
             tokens[tokens.length - 1].comments?.length isnt 0 and "#{tokens[tokens.length - 1][1]}" is ''
            tokens.pop()
  • §

    Collect referenced variable names just like in CoffeeScript.compile.

          referencedVars = (token[1] for token in tokens when token[0] is 'IDENTIFIER')
  • §

    Generate the AST of the tokens.

          ast = CoffeeScript.nodes(tokens).body
  • §

    Add assignment to __ variable to force the input to be an expression.

          ast = new Block [new Assign (new Value new Literal '__'), ast, '=']
  • §

    Wrap the expression in a closure to support top-level await.

          ast     = new Code [], ast
          isAsync = ast.isAsync
  • §

    Invoke the wrapping closure.

          ast    = new Root new Block [new Call ast]
          js     = ast.compile {bare: yes, locals: Object.keys(context), referencedVars, sharedScope: yes}
          if transpile
            js = transpile.transpile(js, transpile.options).code
  • §

    Strip "use strict", to avoid an exception on assigning to undeclared variable __.

            js = js.replace /^"use strict"|^'use strict'/, ''
          result = runInContext js, context, filename
  • §

    Await an async result, if necessary.

          if isAsync
            result.then (resolvedResult) ->
              cb null, resolvedResult unless sawSIGINT
            sawSIGINT = no
          else
            cb null, result
        catch err
  • §

    AST’s compile does not add source code information to syntax errors.

          updateSyntaxError err, input
          cb err
    
    runInContext = (js, context, filename) ->
      if context is global
        vm.runInThisContext js, filename
      else
        vm.runInContext js, context, filename
    
    addMultilineHandler = (repl) ->
      {inputStream, outputStream} = repl
  • §

    Node 0.11.12 changed API, prompt is now _prompt.

      origPrompt = repl._prompt ? repl.prompt
    
      multiline =
        enabled: off
        initialPrompt: origPrompt.replace /^[^> ]*/, (x) -> x.replace /./g, '-'
        prompt: origPrompt.replace /^[^> ]*>?/, (x) -> x.replace /./g, '.'
        buffer: ''
  • §

    Proxy node’s line listener

      nodeLineListener = repl.listeners('line')[0]
      repl.removeListener 'line', nodeLineListener
      repl.on 'line', (cmd) ->
        if multiline.enabled
          multiline.buffer += "#{cmd}\n"
          repl.setPrompt multiline.prompt
          repl.prompt true
        else
          repl.setPrompt origPrompt
          nodeLineListener cmd
        return
  • §

    Handle Ctrl-v

      inputStream.on 'keypress', (char, key) ->
        return unless key and key.ctrl and not key.meta and not key.shift and key.name is 'v'
        if multiline.enabled
  • §

    allow arbitrarily switching between modes any time before multiple lines are entered

          unless multiline.buffer.match /\n/
            multiline.enabled = not multiline.enabled
            repl.setPrompt origPrompt
            repl.prompt true
            return
  • §

    no-op unless the current line is empty

          return if repl.line? and not repl.line.match /^\s*$/
  • §

    eval, print, loop

          multiline.enabled = not multiline.enabled
          repl.line = ''
          repl.cursor = 0
          repl.output.cursorTo 0
          repl.output.clearLine 1
  • §

    XXX: multiline hack

          multiline.buffer = multiline.buffer.replace /\n/g, '\uFF00'
          repl.emit 'line', multiline.buffer
          multiline.buffer = ''
        else
          multiline.enabled = not multiline.enabled
          repl.setPrompt multiline.initialPrompt
          repl.prompt true
        return
  • §

    Store and load command history from a file

    addHistory = (repl, filename, maxSize) ->
      lastLine = null
      try
  • §

    Get file info and at most maxSize of command history

        stat = fs.statSync filename
        size = Math.min maxSize, stat.size
  • §

    Read last size bytes from the file

        readFd = fs.openSync filename, 'r'
        buffer = Buffer.alloc size
        fs.readSync readFd, buffer, 0, size, stat.size - size
        fs.closeSync readFd
  • §

    Set the history on the interpreter

        repl.history = buffer.toString().split('\n').reverse()
  • §

    If the history file was truncated we should pop off a potential partial line

        repl.history.pop() if stat.size > maxSize
  • §

    Shift off the final blank newline

        repl.history.shift() if repl.history[0] is ''
        repl.historyIndex = -1
        lastLine = repl.history[0]
    
      fd = fs.openSync filename, 'a'
    
      repl.addListener 'line', (code) ->
        if code and code.length and code isnt '.history' and code isnt '.exit' and lastLine isnt code
  • §

    Save the latest command in the file

          fs.writeSync fd, "#{code}\n"
          lastLine = code
  • §

    XXX: The SIGINT event from REPLServer is undocumented, so this is a bit fragile

      repl.on 'SIGINT', -> sawSIGINT = yes
      repl.on 'exit', -> fs.closeSync fd
  • §

    Add a command to show the history stack

      repl.commands[getCommandId(repl, 'history')] =
        help: 'Show command history'
        action: ->
          repl.outputStream.write "#{repl.history[..].reverse().join '\n'}\n"
          repl.displayPrompt()
    
    getCommandId = (repl, commandName) ->
  • §

    Node 0.11 changed API, a command such as ‘.help’ is now stored as ‘help’

      commandsHaveLeadingDot = repl.commands['.help']?
      if commandsHaveLeadingDot then ".#{commandName}" else commandName
    
    module.exports =
      start: (opts = {}) ->
        [major, minor, build] = process.versions.node.split('.').map (n) -> parseInt(n, 10)
    
        if major < 6
          console.warn "Node 6+ required for CoffeeScript REPL"
          process.exit 1
    
        CoffeeScript.register()
        process.argv = ['coffee'].concat process.argv[2..]
        if opts.transpile
          transpile = {}
          try
            transpile.transpile = require('@babel/core').transform
          catch
            try
              transpile.transpile = require('babel-core').transform
            catch
              console.error '''
                To use --transpile with an interactive REPL, @babel/core must be installed either in the current folder or globally:
                  npm install --save-dev @babel/core
                or
                  npm install --global @babel/core
                And you must save options to configure Babel in one of the places it looks to find its options.
                See https://coffeescript.org/#transpilation
              '''
              process.exit 1
          transpile.options =
            filename: path.resolve process.cwd(), '<repl>'
  • §

    Since the REPL compilation path is unique (in eval above), we need another way to get the options object attached to a module so that it knows later on whether it needs to be transpiled. In the case of the REPL, the only applicable option is transpile.

          Module = require 'module'
          originalModuleLoad = Module::load
          Module::load = (filename) ->
            @options = transpile: transpile.options
            originalModuleLoad.call @, filename
        opts = merge replDefaults, opts
        repl = nodeREPL.start opts
        runInContext opts.prelude, repl.context, 'prelude' if opts.prelude
        repl.on 'exit', -> repl.outputStream.write '\n' if not repl.closed
        addMultilineHandler repl
        addHistory repl, opts.historyFile, opts.historyMaxInputSize if opts.historyFile
  • §

    Adapt help inherited from the node REPL

        repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session'
        repl
================================================ FILE: docs/v2/annotated-source/rewriter.html ================================================ rewriter.coffee
  • rewriter.coffee

  • §

    The CoffeeScript language has a good deal of optional syntax, implicit syntax, and shorthand syntax. This can greatly complicate a grammar and bloat the resulting parse table. Instead of making the parser handle it all, we take a series of passes over the token stream, using this Rewriter to convert shorthand into the unambiguous long form, add implicit indentation and parentheses, and generally clean things up.

    {throwSyntaxError, extractAllCommentTokens} = require './helpers'
  • §

    Move attached comments from one token to another.

    moveComments = (fromToken, toToken) ->
      return unless fromToken.comments
      if toToken.comments and toToken.comments.length isnt 0
        unshiftedComments = []
        for comment in fromToken.comments
          if comment.unshift
            unshiftedComments.push comment
          else
            toToken.comments.push comment
        toToken.comments = unshiftedComments.concat toToken.comments
      else
        toToken.comments = fromToken.comments
      delete fromToken.comments
  • §

    Create a generated token: one that exists due to a use of implicit syntax. Optionally have this new token take the attached comments from another token.

    generate = (tag, value, origin, commentsToken) ->
      token = [tag, value]
      token.generated = yes
      token.origin = origin if origin
      moveComments commentsToken, token if commentsToken
      token
  • §

    The Rewriter class is used by the Lexer, directly against its internal array of tokens.

    exports.Rewriter = class Rewriter
  • §

    Rewrite the token stream in multiple passes, one logical filter at a time. This could certainly be changed into a single pass through the stream, with a big ol’ efficient switch, but it’s much nicer to work with like this. The order of these passes matters—indentation must be corrected before implicit parentheses can be wrapped around blocks of code.

      rewrite: (@tokens) ->
  • §

    Set environment variable DEBUG_TOKEN_STREAM to true to output token debugging info. Also set DEBUG_REWRITTEN_TOKEN_STREAM to true to output the token stream after it has been rewritten by this file.

        if process?.env?.DEBUG_TOKEN_STREAM
          console.log 'Initial token stream:' if process.env.DEBUG_REWRITTEN_TOKEN_STREAM
          console.log (t[0] + '/' + t[1] + (if t.comments then '*' else '') for t in @tokens).join ' '
        @removeLeadingNewlines()
        @closeOpenCalls()
        @closeOpenIndexes()
        @normalizeLines()
        @tagPostfixConditionals()
        @addImplicitBracesAndParens()
        @rescueStowawayComments()
        @addLocationDataToGeneratedTokens()
        @enforceValidJSXAttributes()
        @fixIndentationLocationData()
        @exposeTokenDataToGrammar()
        if process?.env?.DEBUG_REWRITTEN_TOKEN_STREAM
          console.log 'Rewritten token stream:' if process.env.DEBUG_TOKEN_STREAM
          console.log (t[0] + '/' + t[1] + (if t.comments then '*' else '') for t in @tokens).join ' '
        @tokens
  • §

    Rewrite the token stream, looking one token ahead and behind. Allow the return value of the block to tell us how many tokens to move forwards (or backwards) in the stream, to make sure we don’t miss anything as tokens are inserted and removed, and the stream changes length under our feet.

      scanTokens: (block) ->
        {tokens} = this
        i = 0
        i += block.call this, token, i, tokens while token = tokens[i]
        true
    
      detectEnd: (i, condition, action, opts = {}) ->
        {tokens} = this
        levels = 0
        while token = tokens[i]
          return action.call this, token, i if levels is 0 and condition.call this, token, i
          if token[0] in EXPRESSION_START
            levels += 1
          else if token[0] in EXPRESSION_END
            levels -= 1
          if levels < 0
            return if opts.returnOnNegativeLevel
            return action.call this, token, i
          i += 1
        i - 1
  • §

    Leading newlines would introduce an ambiguity in the grammar, so we dispatch them here.

      removeLeadingNewlines: ->
  • §

    Find the index of the first non-TERMINATOR token.

        break for [tag], i in @tokens when tag isnt 'TERMINATOR'
        return if i is 0
  • §

    If there are any comments attached to the tokens we’re about to discard, shift them forward to what will become the new first token.

        for leadingNewlineToken in @tokens[0...i]
          moveComments leadingNewlineToken, @tokens[i]
  • §

    Discard all the leading newline tokens.

        @tokens.splice 0, i
  • §

    The lexer has tagged the opening parenthesis of a method call. Match it with its paired close.

      closeOpenCalls: ->
        condition = (token, i) ->
          token[0] in [')', 'CALL_END']
    
        action = (token, i) ->
          token[0] = 'CALL_END'
    
        @scanTokens (token, i) ->
          @detectEnd i + 1, condition, action if token[0] is 'CALL_START'
          1
  • §

    The lexer has tagged the opening bracket of an indexing operation call. Match it with its paired close.

      closeOpenIndexes: ->
        startToken = null
        condition = (token, i) ->
          token[0] in [']', 'INDEX_END']
    
        action = (token, i) ->
          if @tokens.length >= i and @tokens[i + 1][0] is ':'
            startToken[0] = '['
            token[0] = ']'
          else
            token[0] = 'INDEX_END'
    
        @scanTokens (token, i) ->
          if token[0] is 'INDEX_START'
            startToken = token
            @detectEnd i + 1, condition, action
          1
  • §

    Match tags in token stream starting at i with pattern. pattern may consist of strings (equality), an array of strings (one of) or null (wildcard). Returns the index of the match or -1 if no match.

      indexOfTag: (i, pattern...) ->
        fuzz = 0
        for j in [0 ... pattern.length]
          continue if not pattern[j]?
          pattern[j] = [pattern[j]] if typeof pattern[j] is 'string'
          return -1 if @tag(i + j + fuzz) not in pattern[j]
        i + j + fuzz - 1
  • §

    Returns yes if standing in front of something looking like @<x>:, <x>: or <EXPRESSION_START><x>...<EXPRESSION_END>:.

      looksObjectish: (j) ->
        return yes if @indexOfTag(j, '@', null, ':') isnt -1 or @indexOfTag(j, null, ':') isnt -1
        index = @indexOfTag j, EXPRESSION_START
        if index isnt -1
          end = null
          @detectEnd index + 1, ((token) -> token[0] in EXPRESSION_END), ((token, i) -> end = i)
          return yes if @tag(end + 1) is ':'
        no
  • §

    Returns yes if current line of tokens contain an element of tags on same expression level. Stop searching at LINEBREAKS or explicit start of containing balanced expression.

      findTagsBackwards: (i, tags) ->
        backStack = []
        while i >= 0 and (backStack.length or
              @tag(i) not in tags and
              (@tag(i) not in EXPRESSION_START or @tokens[i].generated) and
              @tag(i) not in LINEBREAKS)
          backStack.push @tag(i) if @tag(i) in EXPRESSION_END
          backStack.pop() if @tag(i) in EXPRESSION_START and backStack.length
          i -= 1
        @tag(i) in tags
  • §

    Look for signs of implicit calls and objects in the token stream and add them.

      addImplicitBracesAndParens: ->
  • §

    Track current balancing depth (both implicit and explicit) on stack.

        stack = []
        start = null
    
        @scanTokens (token, i, tokens) ->
          [tag]     = token
          [prevTag] = prevToken = if i > 0 then tokens[i - 1] else []
          [nextTag] = nextToken = if i < tokens.length - 1 then tokens[i + 1] else []
          stackTop  = -> stack[stack.length - 1]
          startIdx  = i
  • §

    Helper function, used for keeping track of the number of tokens consumed and spliced, when returning for getting a new token.

          forward   = (n) -> i - startIdx + n
  • §

    Helper functions

          isImplicit        = (stackItem) -> stackItem?[2]?.ours
          isImplicitObject  = (stackItem) -> isImplicit(stackItem) and stackItem?[0] is '{'
          isImplicitCall    = (stackItem) -> isImplicit(stackItem) and stackItem?[0] is '('
          inImplicit        = -> isImplicit stackTop()
          inImplicitCall    = -> isImplicitCall stackTop()
          inImplicitObject  = -> isImplicitObject stackTop()
  • §

    Unclosed control statement inside implicit parens (like class declaration or if-conditionals).

          inImplicitControl = -> inImplicit() and stackTop()?[0] is 'CONTROL'
    
          startImplicitCall = (idx) ->
            stack.push ['(', idx, ours: yes]
            tokens.splice idx, 0, generate 'CALL_START', '(', ['', 'implicit function call', token[2]], prevToken
    
          endImplicitCall = ->
            stack.pop()
            tokens.splice i, 0, generate 'CALL_END', ')', ['', 'end of input', token[2]], prevToken
            i += 1
    
          startImplicitObject = (idx, {startsLine = yes, continuationLineIndent} = {}) ->
            stack.push ['{', idx, sameLine: yes, startsLine: startsLine, ours: yes, continuationLineIndent: continuationLineIndent]
            val = new String '{'
            val.generated = yes
            tokens.splice idx, 0, generate '{', val, token, prevToken
    
          endImplicitObject = (j) ->
            j = j ? i
            stack.pop()
            tokens.splice j, 0, generate '}', '}', token, prevToken
            i += 1
    
          implicitObjectContinues = (j) =>
            nextTerminatorIdx = null
            @detectEnd j,
              (token) -> token[0] is 'TERMINATOR'
              (token, i) -> nextTerminatorIdx = i
              returnOnNegativeLevel: yes
            return no unless nextTerminatorIdx?
            @looksObjectish nextTerminatorIdx + 1
  • §

    Don’t end an implicit call/object on next indent if any of these are in an argument/value.

          if (
            (inImplicitCall() or inImplicitObject()) and tag in CONTROL_IN_IMPLICIT or
            inImplicitObject() and prevTag is ':' and tag is 'FOR'
          )
            stack.push ['CONTROL', i, ours: yes]
            return forward(1)
    
          if tag is 'INDENT' and inImplicit()
  • §

    An INDENT closes an implicit call unless

    1. We have seen a CONTROL argument on the line.
    2. The last token before the indent is part of the list below.
            if prevTag not in ['=>', '->', '[', '(', ',', '{', 'ELSE', '=']
              while inImplicitCall() or inImplicitObject() and prevTag isnt ':'
                if inImplicitCall()
                  endImplicitCall()
                else
                  endImplicitObject()
            stack.pop() if inImplicitControl()
            stack.push [tag, i]
            return forward(1)
  • §

    Straightforward start of explicit expression.

          if tag in EXPRESSION_START
            stack.push [tag, i]
            return forward(1)
  • §

    Close all implicit expressions inside of explicitly closed expressions.

          if tag in EXPRESSION_END
            while inImplicit()
              if inImplicitCall()
                endImplicitCall()
              else if inImplicitObject()
                endImplicitObject()
              else
                stack.pop()
            start = stack.pop()
    
          inControlFlow = =>
            seenFor = @findTagsBackwards(i, ['FOR']) and @findTagsBackwards(i, ['FORIN', 'FOROF', 'FORFROM'])
            controlFlow = seenFor or @findTagsBackwards i, ['WHILE', 'UNTIL', 'LOOP', 'LEADING_WHEN']
            return no unless controlFlow
            isFunc = no
            tagCurrentLine = token[2].first_line
            @detectEnd i,
              (token, i) -> token[0] in LINEBREAKS
              (token, i) ->
                [prevTag, ,{first_line}] = tokens[i - 1] || []
                isFunc = tagCurrentLine is first_line and prevTag in ['->', '=>']
              returnOnNegativeLevel: yes
            isFunc
  • §

    Recognize standard implicit calls like f a, f() b, f? c, h[0] d etc. Added support for spread dots on the left side: f …a

          if (tag in IMPLICIT_FUNC and token.spaced or
              tag is '?' and i > 0 and not tokens[i - 1].spaced) and
             (nextTag in IMPLICIT_CALL or
             (nextTag is '...' and @tag(i + 2) in IMPLICIT_CALL and not @findTagsBackwards(i, ['INDEX_START', '['])) or
              nextTag in IMPLICIT_UNSPACED_CALL and
              not nextToken.spaced and not nextToken.newLine) and
              not inControlFlow()
            tag = token[0] = 'FUNC_EXIST' if tag is '?'
            startImplicitCall i + 1
            return forward(2)
  • §

    Implicit call taking an implicit indented object as first argument.

    f
      a: b
      c: d
    

    Don’t accept implicit calls of this type, when on the same line as the control structures below as that may misinterpret constructs like:

    if f
       a: 1
    

    as

    if f(a: 1)
    

    which is probably always unintended. Furthermore don’t allow this in the first line of a literal array or explicit object, as that creates grammatical ambiguities (#5368).

          if tag in IMPLICIT_FUNC and
             @indexOfTag(i + 1, 'INDENT') > -1 and @looksObjectish(i + 2) and
             not @findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH',
              'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL']) and
             not ((s = stackTop()?[0]) in ['{', '['] and
                  not isImplicit(stackTop()) and
                  @findTagsBackwards(i, s))
            startImplicitCall i + 1
            stack.push ['INDENT', i + 2]
            return forward(3)
  • §

    Implicit objects start here.

          if tag is ':'
  • §

    Go back to the (implicit) start of the object.

            s = switch
              when @tag(i - 1) in EXPRESSION_END
                [startTag, startIndex] = start
                if startTag is '[' and startIndex > 0 and @tag(startIndex - 1) is '@' and not tokens[startIndex - 1].spaced
                  startIndex - 1
                else
                  startIndex
              when @tag(i - 2) is '@' then i - 2
              else i - 1
    
            startsLine = s <= 0 or @tag(s - 1) in LINEBREAKS or tokens[s - 1].newLine
  • §

    Are we just continuing an already declared object? Including the case where we indent on the line after an explicit ‘{‘.

            if stackTop()
              [stackTag, stackIdx] = stackTop()
              stackNext = stack[stack.length - 2]
              if (stackTag is '{' or
                  stackTag is 'INDENT' and stackNext?[0] is '{' and
                  not isImplicit(stackNext) and
                  @findTagsBackwards(stackIdx-1, ['{'])) and
                 (startsLine or @tag(s - 1) is ',' or @tag(s - 1) is '{') and
                 @tag(s - 1) not in UNFINISHED
                return forward(1)
    
            preObjectToken = if i > 1 then tokens[i - 2] else []
            startImplicitObject(s, {startsLine: !!startsLine, continuationLineIndent: preObjectToken.continuationLineIndent})
            return forward(2)
  • §

    End implicit calls when chaining method calls like e.g.:

    f ->
      a
    .g b, ->
      c
    .h a
    

    and also

    f a
    .g b
    .h a
    
  • §

    Mark all enclosing objects as not sameLine

          if tag in LINEBREAKS
            for stackItem in stack by -1
              break unless isImplicit stackItem
              stackItem[2].sameLine = no if isImplicitObject stackItem
  • §

    End indented-continuation-line implicit objects once that indentation is over.

          if tag is 'TERMINATOR' and token.endsContinuationLineIndentation
            {preContinuationLineIndent} = token.endsContinuationLineIndentation
            while inImplicitObject() and (implicitObjectIndent = stackTop()[2].continuationLineIndent)? and implicitObjectIndent > preContinuationLineIndent
              endImplicitObject()
    
          newLine = prevTag is 'OUTDENT' or prevToken.newLine
          if tag in IMPLICIT_END or
              (tag in CALL_CLOSERS and newLine) or
              (tag in ['..', '...'] and @findTagsBackwards(i, ["INDEX_START"]))
            while inImplicit()
              [stackTag, stackIdx, {sameLine, startsLine}] = stackTop()
  • §

    Close implicit calls when reached end of argument list

              if inImplicitCall() and prevTag isnt ',' or
                  (prevTag is ',' and tag is 'TERMINATOR' and not nextTag?)
                endImplicitCall()
  • §

    Close implicit objects such as: return a: 1, b: 2 unless true

              else if inImplicitObject() and sameLine and
                      tag isnt 'TERMINATOR' and prevTag isnt ':' and
                      not (tag in ['POST_IF', 'FOR', 'WHILE', 'UNTIL'] and startsLine and implicitObjectContinues(i + 1))
                endImplicitObject()
  • §

    Close implicit objects when at end of line, line didn’t end with a comma and the implicit object didn’t start the line or the next line doesn’t look like the continuation of an object.

              else if inImplicitObject() and tag is 'TERMINATOR' and prevTag isnt ',' and
                      not (startsLine and @looksObjectish(i + 1))
                endImplicitObject()
              else if inImplicitControl() and tokens[stackTop()[1]][0] is 'CLASS' and tag is 'TERMINATOR'
                stack.pop()
              else
                break
  • §

    Close implicit object if comma is the last character and what comes after doesn’t look like it belongs. This is used for trailing commas and calls, like:

    x =
        a: b,
        c: d,
    e = 2
    

    and

    f a, b: c, d: e, f, g: h: i, j
    
          if tag is ',' and not @looksObjectish(i + 1) and inImplicitObject() and not (@tag(i + 2) in ['FOROF', 'FORIN']) and
             (nextTag isnt 'TERMINATOR' or not @looksObjectish(i + 2))
  • §

    When nextTag is OUTDENT the comma is insignificant and should just be ignored so embed it in the implicit object.

    When it isn’t the comma go on to play a role in a call or array further up the stack, so give it a chance.

            offset = if nextTag is 'OUTDENT' then 1 else 0
            while inImplicitObject()
              endImplicitObject i + offset
          return forward(1)
  • §

    Make sure only strings and wrapped expressions are used in JSX attributes.

      enforceValidJSXAttributes: ->
        @scanTokens (token, i, tokens) ->
          if token.jsxColon
            next = tokens[i + 1]
            if next[0] not in ['STRING_START', 'STRING', '(']
              throwSyntaxError 'expected wrapped or quoted JSX attribute', next[2]
          return 1
  • §

    Not all tokens survive processing by the parser. To avoid comments getting lost into the ether, find comments attached to doomed tokens and move them to a token that will make it to the other side.

      rescueStowawayComments: ->
        insertPlaceholder = (token, j, tokens, method) ->
          tokens[method] generate 'TERMINATOR', '\n', tokens[j] unless tokens[j][0] is 'TERMINATOR'
          tokens[method] generate 'JS', '', tokens[j], token
    
        dontShiftForward = (i, tokens) ->
          j = i + 1
          while j isnt tokens.length and tokens[j][0] in DISCARDED
            return yes if tokens[j][0] is 'INTERPOLATION_END'
            j++
          no
    
        shiftCommentsForward = (token, i, tokens) ->
  • §

    Find the next surviving token and attach this token’s comments to it, with a flag that we know to output such comments before that token’s own compilation. (Otherwise comments are output following the token they’re attached to.)

          j = i
          j++ while j isnt tokens.length and tokens[j][0] in DISCARDED
          unless j is tokens.length or tokens[j][0] in DISCARDED
            comment.unshift = yes for comment in token.comments
            moveComments token, tokens[j]
            return 1
          else # All following tokens are doomed!
            j = tokens.length - 1
            insertPlaceholder token, j, tokens, 'push'
  • §

    The generated tokens were added to the end, not inline, so we don’t skip.

            return 1
    
        shiftCommentsBackward = (token, i, tokens) ->
  • §

    Find the last surviving token and attach this token’s comments to it.

          j = i
          j-- while j isnt -1 and tokens[j][0] in DISCARDED
          unless j is -1 or tokens[j][0] in DISCARDED
            moveComments token, tokens[j]
            return 1
          else # All previous tokens are doomed!
            insertPlaceholder token, 0, tokens, 'unshift'
  • §

    We added two tokens, so shift forward to account for the insertion.

            return 3
    
        @scanTokens (token, i, tokens) ->
          return 1 unless token.comments
          ret = 1
          if token[0] in DISCARDED
  • §

    This token won’t survive passage through the parser, so we need to rescue its attached tokens and redistribute them to nearby tokens. Comments that don’t start a new line can shift backwards to the last safe token, while other tokens should shift forward.

            dummyToken = comments: []
            j = token.comments.length - 1
            until j is -1
              if token.comments[j].newLine is no and token.comments[j].here is no
                dummyToken.comments.unshift token.comments[j]
                token.comments.splice j, 1
              j--
            if dummyToken.comments.length isnt 0
              ret = shiftCommentsBackward dummyToken, i - 1, tokens
            if token.comments.length isnt 0
              shiftCommentsForward token, i, tokens
          else unless dontShiftForward i, tokens
  • §

    If any of this token’s comments start a line—there’s only whitespace between the preceding newline and the start of the comment—and this isn’t one of the special JS tokens, then shift this comment forward to precede the next valid token. Block.compileComments also has logic to make sure that “starting new line” comments follow or precede the nearest newline relative to the token that the comment is attached to, but that newline might be inside a } or ) or other generated token that we really want this comment to output after. Therefore we need to shift the comments here, avoiding such generated and discarded tokens.

            dummyToken = comments: []
            j = token.comments.length - 1
            until j is -1
              if token.comments[j].newLine and not token.comments[j].unshift and
                 not (token[0] is 'JS' and token.generated)
                dummyToken.comments.unshift token.comments[j]
                token.comments.splice j, 1
              j--
            if dummyToken.comments.length isnt 0
              ret = shiftCommentsForward dummyToken, i + 1, tokens
          delete token.comments if token.comments?.length is 0
          ret
  • §

    Add location data to all tokens generated by the rewriter.

      addLocationDataToGeneratedTokens: ->
        @scanTokens (token, i, tokens) ->
          return 1 if     token[2]
          return 1 unless token.generated or token.explicit
          if token.fromThen and token[0] is 'INDENT'
            token[2] = token.origin[2]
            return 1
          if token[0] is '{' and nextLocation=tokens[i + 1]?[2]
            {first_line: line, first_column: column, range: [rangeIndex]} = nextLocation
          else if prevLocation = tokens[i - 1]?[2]
            {last_line: line, last_column: column, range: [, rangeIndex]} = prevLocation
            column += 1
          else
            line = column = 0
            rangeIndex = 0
          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]
          }
          return 1
  • §

    OUTDENT tokens should always be positioned at the last character of the previous token, so that AST nodes ending in an OUTDENT token end up with a location corresponding to the last “real” token under the node.

      fixIndentationLocationData: ->
        @allComments ?= extractAllCommentTokens @tokens
        findPrecedingComment = (token, {afterPosition, indentSize, first, indented}) =>
          tokenStart = token[2].range[0]
          matches = (comment) ->
            if comment.outdented
              return no unless indentSize? and comment.indentSize > indentSize
            return no if indented and not comment.indented
            return no unless comment.locationData.range[0] < tokenStart
            return no unless comment.locationData.range[0] > afterPosition
            yes
          if first
            lastMatching = null
            for comment in @allComments by -1
              if matches comment
                lastMatching = comment
              else if lastMatching
                return lastMatching
            return lastMatching
          for comment in @allComments when matches comment by -1
            return comment
          null
    
        @scanTokens (token, i, tokens) ->
          return 1 unless token[0] in ['INDENT', 'OUTDENT'] or
            (token.generated and token[0] is 'CALL_END' and not token.data?.closingTagNameToken) or
            (token.generated and token[0] is '}')
          isIndent = token[0] is 'INDENT'
          prevToken = token.prevToken ? tokens[i - 1]
          prevLocationData = prevToken[2]
  • §

    addLocationDataToGeneratedTokens() set the outdent’s location data to the preceding token’s, but in order to detect comments inside an empty “block” we want to look for comments preceding the next token.

          useNextToken = token.explicit or token.generated
          if useNextToken
            nextToken = token
            nextTokenIndex = i
            nextToken = tokens[nextTokenIndex++] while (nextToken.explicit or nextToken.generated) and nextTokenIndex isnt tokens.length - 1
          precedingComment = findPrecedingComment(
            if useNextToken
              nextToken
            else
              token
            afterPosition: prevLocationData.range[0]
            indentSize: token.indentSize
            first: isIndent
            indented: useNextToken
          )
          if isIndent
            return 1 unless precedingComment?.newLine
  • §

    We don’t want e.g. an implicit call at the end of an if condition to include a following indented comment.

          return 1 if token.generated and token[0] is 'CALL_END' and precedingComment?.indented
          prevLocationData = precedingComment.locationData if precedingComment?
          token[2] =
            first_line:
              if precedingComment?
                prevLocationData.first_line
              else
                prevLocationData.last_line
            first_column:
              if precedingComment?
                if isIndent
                  0
                else
                  prevLocationData.first_column
              else
                prevLocationData.last_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:
              if isIndent and precedingComment?
                [
                  prevLocationData.range[0] - precedingComment.indentSize
                  prevLocationData.range[1]
                ]
              else
                prevLocationData.range
          return 1
  • §

    Because our grammar is LALR(1), it can’t handle some single-line expressions that lack ending delimiters. The Rewriter adds the implicit blocks, so it doesn’t need to. To keep the grammar clean and tidy, trailing newlines within expressions are removed and the indentation tokens of empty blocks are added.

      normalizeLines: ->
        starter = indent = outdent = null
        leading_switch_when = null
        leading_if_then = null
  • §

    Count THEN tags

        ifThens = []
    
        condition = (token, i) ->
          token[1] isnt ';' and token[0] in SINGLE_CLOSERS and
          not (token[0] is 'TERMINATOR' and @tag(i + 1) in EXPRESSION_CLOSE) and
          not (token[0] is 'ELSE' and
               (starter isnt 'THEN' or (leading_if_then or leading_switch_when))) and
          not (token[0] in ['CATCH', 'FINALLY'] and starter in ['->', '=>']) or
          token[0] in CALL_CLOSERS and
          (@tokens[i - 1].newLine or @tokens[i - 1][0] is 'OUTDENT')
    
        action = (token, i) ->
          ifThens.pop() if token[0] is 'ELSE' and starter is 'THEN'
          @tokens.splice (if @tag(i - 1) is ',' then i - 1 else i), 0, outdent
    
        closeElseTag = (tokens, i) =>
          tlen = ifThens.length
          return i unless tlen > 0
          lastThen = ifThens.pop()
          [, outdentElse] = @indentation tokens[lastThen]
  • §

    Insert OUTDENT to close inner IF.

          outdentElse[1] = tlen*2
          tokens.splice(i, 0, outdentElse)
  • §

    Insert OUTDENT to close outer IF.

          outdentElse[1] = 2
          tokens.splice(i + 1, 0, outdentElse)
  • §

    Remove outdents from the end.

          @detectEnd i + 2,
            (token, i) -> token[0] in ['OUTDENT', 'TERMINATOR']
            (token, i) ->
                if @tag(i) is 'OUTDENT' and @tag(i + 1) is 'OUTDENT'
                  tokens.splice i, 2
          i + 2
    
        @scanTokens (token, i, tokens) ->
          [tag] = token
          conditionTag = tag in ['->', '=>'] and
            @findTagsBackwards(i, ['IF', 'WHILE', 'FOR', 'UNTIL', 'SWITCH', 'WHEN', 'LEADING_WHEN', '[', 'INDEX_START']) and
            not (@findTagsBackwards i, ['THEN', '..', '...'])
    
          if tag is 'TERMINATOR'
            if @tag(i + 1) is 'ELSE' and @tag(i - 1) isnt 'OUTDENT'
              tokens.splice i, 1, @indentation()...
              return 1
            if @tag(i + 1) in EXPRESSION_CLOSE
              if token[1] is ';' and @tag(i + 1) is 'OUTDENT'
                tokens[i + 1].prevToken = token
                moveComments token, tokens[i + 1]
              tokens.splice i, 1
              return 0
          if tag is 'CATCH'
            for j in [1..2] when @tag(i + j) in ['OUTDENT', 'TERMINATOR', 'FINALLY']
              tokens.splice i + j, 0, @indentation()...
              return 2 + j
          if tag in ['->', '=>'] and (@tag(i + 1) in [',', ']'] or @tag(i + 1) is '.' and token.newLine)
            [indent, outdent] = @indentation tokens[i]
            tokens.splice i + 1, 0, indent, outdent
            return 1
          if tag in SINGLE_LINERS and @tag(i + 1) isnt 'INDENT' and
             not (tag is 'ELSE' and @tag(i + 1) is 'IF') and
             not conditionTag
            starter = tag
            [indent, outdent] = @indentation tokens[i]
            indent.fromThen   = true if starter is 'THEN'
            if tag is 'THEN'
              leading_switch_when = @findTagsBackwards(i, ['LEADING_WHEN']) and @tag(i + 1) is 'IF'
              leading_if_then = @findTagsBackwards(i, ['IF']) and @tag(i + 1) is 'IF'
            ifThens.push i if tag is 'THEN' and @findTagsBackwards(i, ['IF'])
  • §

    ELSE tag is not closed.

            if tag is 'ELSE' and @tag(i - 1) isnt 'OUTDENT'
              i = closeElseTag tokens, i
            tokens.splice i + 1, 0, indent
            @detectEnd i + 2, condition, action
            tokens.splice i, 1 if tag is 'THEN'
            return 1
          return 1
  • §

    Tag postfix conditionals as such, so that we can parse them with a different precedence.

      tagPostfixConditionals: ->
        original = null
    
        condition = (token, i) ->
          [tag] = token
          [prevTag] = @tokens[i - 1]
          tag is 'TERMINATOR' or (tag is 'INDENT' and prevTag not in SINGLE_LINERS)
    
        action = (token, i) ->
          if token[0] isnt 'INDENT' or (token.generated and not token.fromThen)
            original[0] = 'POST_' + original[0]
    
        @scanTokens (token, i) ->
          return 1 unless token[0] is 'IF'
          original = token
          @detectEnd i + 1, condition, action
          return 1
  • §

    For tokens with extra data, we want to make that data visible to the grammar by wrapping the token value as a String() object and setting the data as properties of that object. The grammar should then be responsible for cleaning this up for the node constructor: unwrapping the token value to a primitive string and separately passing any expected token data properties

      exposeTokenDataToGrammar: ->
        @scanTokens (token, i) ->
          if token.generated or (token.data and Object.keys(token.data).length isnt 0)
            token[1] = new String token[1]
            token[1][key] = val for own key, val of (token.data ? {})
            token[1].generated = yes if token.generated
          1
  • §

    Generate the indentation tokens, based on another token on the same line.

      indentation: (origin) ->
        indent  = ['INDENT', 2]
        outdent = ['OUTDENT', 2]
        if origin
          indent.generated = outdent.generated = yes
          indent.origin = outdent.origin = origin
        else
          indent.explicit = outdent.explicit = yes
        [indent, outdent]
    
      generate: generate
  • §

    Look up a tag by token index.

      tag: (i) -> @tokens[i]?[0]
  • §

    Constants

  • §
  • §

    List of the token pairs that must be balanced.

    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']
    ]
  • §

    The inverse mappings of BALANCED_PAIRS we’re trying to fix up, so we can look things up from either end.

    exports.INVERSES = INVERSES = {}
  • §

    The tokens that signal the start/end of a balanced pair.

    EXPRESSION_START = []
    EXPRESSION_END   = []
    
    for [left, right] in BALANCED_PAIRS
      EXPRESSION_START.push INVERSES[right] = left
      EXPRESSION_END  .push INVERSES[left] = right
  • §

    Tokens that indicate the close of a clause of an expression.

    EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat EXPRESSION_END
  • §

    Tokens that, if followed by an IMPLICIT_CALL, indicate a function invocation.

    IMPLICIT_FUNC    = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']
  • §

    If preceded by an IMPLICIT_FUNC, indicates a function invocation.

    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 = ['+', '-']
  • §

    Tokens that always mark the end of an implicit call for single-liners.

    IMPLICIT_END     = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY',
      'LOOP', 'TERMINATOR']
  • §

    Single-line flavors of block expressions that have unclosed endings. The grammar can’t disambiguate them, so we insert the implicit indentation.

    SINGLE_LINERS    = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']
    SINGLE_CLOSERS   = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']
  • §

    Tokens that end a line.

    LINEBREAKS       = ['TERMINATOR', 'INDENT', 'OUTDENT']
  • §

    Tokens that close open calls when they follow a newline.

    CALL_CLOSERS     = ['.', '?.', '::', '?::']
  • §

    Tokens that prevent a subsequent indent from ending implicit calls/objects

    CONTROL_IN_IMPLICIT = ['IF', 'TRY', 'FINALLY', 'CATCH', 'CLASS', 'SWITCH']
  • §

    Tokens that are swallowed up by the parser, never leading to code generation. You can spot these in grammar.coffee because the o function second argument doesn’t contain a new call for these tokens. STRING_START isn’t on this list because its locationData matches that of the node that becomes StringWithInterpolations, and therefore addDataToNode attaches STRING_START’s tokens to that node.

    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
  • §

    Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token

    exports.UNFINISHED = UNFINISHED = ['\\', '.', '?.', '?::', 'UNARY', 'DO', 'DO_IIFE', 'MATH', 'UNARY_MATH', '+', '-',
               '**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||',
               'BIN?', 'EXTENDS']
================================================ FILE: docs/v2/annotated-source/scope.html ================================================ scope.litcoffee
  • scope.litcoffee

  • §

    The Scope class regulates lexical scoping within CoffeeScript. As you generate code, you create a tree of scopes in the same shape as the nested function bodies. Each scope knows about the variables declared within it, and has a reference to its parent enclosing scope. In this way, we know which variables are new and need to be declared with var, and which are shared with external scopes.

    exports.Scope = class Scope
  • §

    Initialize a scope with its parent, for lookups up the chain, as well as a reference to the Block node it belongs to, which is where it should declare its variables, a reference to the function that it belongs to, and a list of variables referenced in the source code and therefore should be avoided when generating variables. Also track comments that should be output as part of variable declarations.

      constructor: (@parent, @expressions, @method, @referencedVars) ->
        @variables = [{name: 'arguments', type: 'arguments'}]
        @comments  = {}
        @positions = {}
        @utilities = {} unless @parent
  • §

    The @root is the top-level Scope object for a given file.

        @root = @parent?.root ? this
  • §

    Adds a new variable or overrides an existing one.

      add: (name, type, immediate) ->
        return @parent.add name, type, immediate if @shared and not immediate
        if Object::hasOwnProperty.call @positions, name
          @variables[@positions[name]].type = type
        else
          @positions[name] = @variables.push({name, type}) - 1
  • §

    When super is called, we need to find the name of the current method we’re in, so that we know how to invoke the same method of the parent class. This can get complicated if super is being called from an inner function. namedMethod will walk up the scope tree until it either finds the first function object that has a name filled in, or bottoms out.

      namedMethod: ->
        return @method if @method?.name or !@parent
        @parent.namedMethod()
  • §

    Look up a variable name in lexical scope, and declare it if it does not already exist.

      find: (name, type = 'var') ->
        return yes if @check name
        @add name, type
        no
  • §

    Reserve a variable name as originating from a function parameter for this scope. No var required for internal references.

      parameter: (name) ->
        return if @shared and @parent.check name, yes
        @add name, 'param'
  • §

    Just check to see if a variable has already been declared, without reserving, walks up to the root scope.

      check: (name) ->
        !!(@type(name) or @parent?.check(name))
  • §

    Generate a temporary variable name at the given index.

      temporary: (name, index, single=false) ->
        if single
          startCode = name.charCodeAt(0)
          endCode = 'z'.charCodeAt(0)
          diff = endCode - startCode
          newCode = startCode + index % (diff + 1)
          letter = String.fromCharCode(newCode)
          num = index // (diff + 1)
          "#{letter}#{num or ''}"
        else
          "#{name}#{index or ''}"
  • §

    Gets the type of a variable.

      type: (name) ->
        return v.type for v in @variables when v.name is name
        null
  • §

    If we need to store an intermediate result, find an available name for a compiler-generated variable. _var, _var2, and so on…

      freeVariable: (name, options={}) ->
        index = 0
        loop
          temp = @temporary name, index, options.single
          break unless @check(temp) or temp in @root.referencedVars
          index++
        @add temp, 'var', yes if options.reserve ? true
        temp
  • §

    Ensure that an assignment is made at the top of this scope (or at the top-level scope, if requested).

      assign: (name, value) ->
        @add name, {value, assigned: yes}, yes
        @hasAssignments = yes
  • §

    Does this scope have any declared variables?

      hasDeclarations: ->
        !!@declaredVariables().length
  • §

    Return the list of variables first declared in this scope.

      declaredVariables: ->
        (v.name for v in @variables when v.type is 'var').sort()
  • §

    Return the list of assignments that are supposed to be made at the top of this scope.

      assignedVariables: ->
        "#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned
================================================ FILE: docs/v2/annotated-source/sourcemap.html ================================================ sourcemap.litcoffee
  • sourcemap.litcoffee

  • §

    Source maps allow JavaScript runtimes to match running JavaScript back to the original source code that corresponds to it. This can be minified JavaScript, but in our case, we’re concerned with mapping pretty-printed JavaScript back to CoffeeScript.

    In order to produce maps, we must keep track of positions (line number, column number) that originated every node in the syntax tree, and be able to generate a map file — which is a compact, VLQ-encoded representation of the JSON serialization of this information — to write out alongside the generated JavaScript.

    LineMap

  • §

    A LineMap object keeps track of information about original line and column positions for a single line of output JavaScript code. SourceMaps are implemented in terms of LineMaps.

    class LineMap
      constructor: (@line) ->
        @columns = []
    
      add: (column, [sourceLine, sourceColumn], options={}) ->
        return if @columns[column] and options.noReplace
        @columns[column] = {line: @line, column, sourceLine, sourceColumn}
    
      sourceLocation: (column) ->
        column-- until (mapping = @columns[column]) or (column <= 0)
        mapping and [mapping.sourceLine, mapping.sourceColumn]
  • §

    SourceMap

  • §

    Maps locations in a single generated JavaScript file back to locations in the original CoffeeScript source file.

    This is intentionally agnostic towards how a source map might be represented on disk. Once the compiler is ready to produce a “v3”-style source map, we can walk through the arrays of line and column buffer to produce it.

    class SourceMap
      constructor: ->
        @lines = []
  • §

    Adds a mapping to this SourceMap. sourceLocation and generatedLocation are both [line, column] arrays. If options.noReplace is true, then if there is already a mapping for the specified line and column, this will have no effect.

      add: (sourceLocation, generatedLocation, options = {}) ->
        [line, column] = generatedLocation
        lineMap = (@lines[line] or= new LineMap(line))
        lineMap.add column, sourceLocation, options
  • §

    Look up the original position of a given line and column in the generated code.

      sourceLocation: ([line, column]) ->
        line-- until (lineMap = @lines[line]) or (line <= 0)
        lineMap and lineMap.sourceLocation column
  • §

    Caching

  • §

    A static source maps cache filename: map. These are used for transforming stack traces and are currently set in CoffeeScript.compile for all files compiled with the source maps option.

      @sourceMaps: Object.create null
    
      @registerCompiled: (filename, source, sourcemap) =>
        if sourcemap?
          @sourceMaps[filename] = sourcemap
    
      @getSourceMap: (filename) =>
        @sourceMaps[filename]
  • §

    V3 SourceMap Generation

  • §

    Builds up a V3 source map, returning the generated JSON as a string. options.sourceRoot may be used to specify the sourceRoot written to the source map. Also, options.sourceFiles and options.generatedFile may be passed to set “sources” and “file”, respectively.

      generate: (options = {}, code = null) ->
        writingline       = 0
        lastColumn        = 0
        lastSourceLine    = 0
        lastSourceColumn  = 0
        needComma         = no
        buffer            = ""
    
        for lineMap, lineNumber in @lines when lineMap
          for mapping in lineMap.columns when mapping
            while writingline < mapping.line
              lastColumn = 0
              needComma = no
              buffer += ";"
              writingline++
  • §

    Write a comma if we’ve already written a segment on this line.

            if needComma
              buffer += ","
              needComma = no
  • §

    Write the next segment. Segments can be 1, 4, or 5 values. If just one, then it is a generated column which doesn’t match anything in the source code.

    The starting column in the generated source, relative to any previous recorded column for the current line:

            buffer += @encodeVlq mapping.column - lastColumn
            lastColumn = mapping.column
  • §

    The index into the list of sources:

            buffer += @encodeVlq 0
  • §

    The starting line in the original source, relative to the previous source line.

            buffer += @encodeVlq mapping.sourceLine - lastSourceLine
            lastSourceLine = mapping.sourceLine
  • §

    The starting column in the original source, relative to the previous column.

            buffer += @encodeVlq mapping.sourceColumn - lastSourceColumn
            lastSourceColumn = mapping.sourceColumn
            needComma = yes
  • §

    Produce the canonical JSON object format for a “v3” source map.

        sources = if options.sourceFiles
          options.sourceFiles
        else if options.filename
          [options.filename]
        else
          ['<anonymous>']
    
        v3 =
          version:    3
          file:       options.generatedFile or ''
          sourceRoot: options.sourceRoot or ''
          sources:    sources
          names:      []
          mappings:   buffer
    
        v3.sourcesContent = [code] if options.sourceMap or options.inlineMap
    
        v3
  • §

    Base64 VLQ Encoding

  • §

    Note that SourceMap VLQ encoding is “backwards”. MIDI-style VLQ encoding puts the most-significant-bit (MSB) from the original value into the MSB of the VLQ encoded value (see Wikipedia). SourceMap VLQ does things the other way around, with the least significat four bits of the original value encoded into the first byte of the VLQ encoded value.

      VLQ_SHIFT            = 5
      VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT             # 0010 0000
      VLQ_VALUE_MASK       = VLQ_CONTINUATION_BIT - 1   # 0001 1111
    
      encodeVlq: (value) ->
        answer = ''
  • §

    Least significant bit represents the sign.

        signBit = if value < 0 then 1 else 0
  • §

    The next bits are the actual value.

        valueToEncode = (Math.abs(value) << 1) + signBit
  • §

    Make sure we encode at least one character, even if valueToEncode is 0.

        while valueToEncode or not answer
          nextChunk = valueToEncode & VLQ_VALUE_MASK
          valueToEncode = valueToEncode >> VLQ_SHIFT
          nextChunk |= VLQ_CONTINUATION_BIT if valueToEncode
          answer += @encodeBase64 nextChunk
    
        answer
  • §

    Regular Base64 Encoding

  • §
      BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    
      encodeBase64: (value) ->
        BASE64_CHARS[value] or throw new Error "Cannot Base64 encode value: #{value}"
  • §

    Our API for source maps is just the SourceMap class.

    module.exports = SourceMap
================================================ FILE: docs/v2/announcing-coffeescript-2/index.html ================================================ Announcing CoffeeScript 2

Announcing CoffeeScript 2

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:

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. Install now: npm install -g coffeescript@2

Modern JavaScript Output

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.

Many 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.

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):

  • Modules: import/export
  • Classes: class Animal
  • Async functions: await someFunction()
  • Bound/arrow functions: =>
  • Function default parameters: (options = {}) ->
  • Function splat/rest parameters: (items...) ->
  • Destructuring, for both arrays and objects: [first, second] = items, {length} = items
  • Object rest/spread properties: {options..., force: yes}, {force, otherOptions...} = options
  • Interpolated strings/template literals (JS backticked strings): "Hello, #{user}!"
  • Tagged template literals: html"<strong>coffee</strong>"
  • JavaScript’s for…of is now available as CoffeeScript’s for…from (we already had a for…of): for n from generatorFunction()

Not all CoffeeScript features were adopted into JavaScript in 100% the same way; most notably, 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 have their own differences. See the breaking changes for the fine details.

In 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. There seem to be two breaking changes that affect a significant number of projects:

  • In CoffeeScript 2, “bare” super (calling super without arguments) is now no longer allowed, and one must use super() or super arguments... instead.
  • References to this/@ cannot occur before a call to super, per the JS spec.

See the full details. 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.

Other Features

Besides supporting new JavaScript features and outputting older CoffeeScript features in modern JS syntax, CoffeeScript 2 has added support for the following:

There are many smaller improvements as well, such as to the coffee command-line tool. You can read all the details in the changelog for the 2.0.0 betas.

“What About …?”

A 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. CoffeeScript’s lack of equivalents for these features does not affect compatibility or interoperability with JavaScript modules or libraries.

Future Compatibility

Back when CoffeeScript 1 was created, ES2015 JavaScript and transpilers like Babel, Bublé or 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.

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. "Hello, #{name}!" into `Hello, ${name}!`. This makes adding support for new JavaScript features much easier than before.

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 do involve new syntax, like 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, 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.

Credits

The major features of 2.0.0 would not have been possible without the following people:

  • @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.
  • @connec: Classes; destructuring; splats/rest syntax in arrays and function calls; and computed properties all output using ES2015 syntax.
  • @GabrielRatener: Async functions.
  • @xixixao: JSX.
  • @zdenko: Object rest/spread properties (object destructuring).
  • @greghuc: Tagged template literals, interpolated strings output in ES2015 syntax.
  • @atg: ES2015 for…of, supported as CoffeeScript’s for…from.
  • @lydell and @jashkenas: Guidance, code reviews and feedback.

See the full honor roll.

Thanks and we hope you enjoy CoffeeScript 2!

================================================ FILE: docs/v2/browser-compiler-legacy/coffeescript.js ================================================ /** * CoffeeScript Compiler v2.7.0 * https://coffeescript.org * * Copyright 2011-2023, Jeremy Ashkenas * Released under the MIT License */ function _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;iarr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i=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>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i")}}(),exports.baseFileName=function(file){var stripExt=!!(1codePoint)?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=1indexOf.call(flags,"u"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111levels)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=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?kref;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"!==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&&0indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],"["===startTag&&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=1preContinuationLineIndent;)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;kindentSize)&&(!indented||comment.indented)&&!!(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"===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","=>","[","(","{","--","++"],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=1this.indent,outdented:!noIndent&&indentSizethis.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 sizeindexOf.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",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,">",""})}),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"!==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"===(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=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,"\n"),column=this.chunkColumn,0previousLinesCompensation&&(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=0indexOf.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&&1indexOf.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=0LEVEL_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=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=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=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=1this.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")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[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);jLEVEL_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").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 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=!!(1start)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=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=3LEVEL_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=!!(2LEVEL_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")),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(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"===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=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= 0"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(", "),fragments),o.levelindexOf.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=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=1stepNum,!(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=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);jb?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=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=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:"generate",value:function generate(){var options=0"],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<"),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||""," (").concat(fileLocation,")")):isConstructor?"new ".concat(functionName||""," (").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;iarguments.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;iarr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i=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>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i")}}(),exports.baseFileName=function(file){var stripExt=!!(1codePoint)?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=1indexOf.call(flags,"u"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111levels)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=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?kref;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"!==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&&0indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],"["===startTag&&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=1preContinuationLineIndent;)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;kindentSize)&&(!indented||comment.indented)&&!!(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"===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","=>","[","(","{","--","++"],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=1this.indent,outdented:!noIndent&&indentSizethis.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 sizeindexOf.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",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,">",""})}),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"!==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"===(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=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,"\n"),column=this.chunkColumn,0previousLinesCompensation&&(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=0indexOf.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&&1indexOf.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=0LEVEL_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=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=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=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=1this.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")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[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);jLEVEL_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").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 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=!!(1start)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=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=3LEVEL_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=!!(2LEVEL_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")),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(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"===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=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= 0"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(", "),fragments),o.levelindexOf.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=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=1stepNum,!(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=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);jb?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=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=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:"generate",value:function generate(){var options=0"],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<"),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||""," (").concat(fileLocation,")")):isConstructor?"new ".concat(functionName||""," (").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 CoffeeScript

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.

The 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.

Latest Version: 2.7.0

# Install locally for a project:
npm install --save-dev coffeescript

# Install globally to execute .coffee files anywhere:
npm install --global coffeescript

Overview

CoffeeScript on the topleft, compiled JavaScript output on the bottomright. The CoffeeScript is editable!

CoffeeScript 2

What’s New In CoffeeScript 2?

The 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 and JSX. You can read more in the announcement.

There are very few breaking changes from CoffeeScript 1.x to 2; we hope the upgrade process is smooth for most projects.

Compatibility

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:

This list may be incomplete, and excludes versions of Node that support newer features behind flags; please refer to node.green for full details. You can run the tests in your browser 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 your code. When in doubt, transpile.

For compatibility with other JavaScript frameworks and tools, see Integrations.

Installation

The command-line version of coffee is available as a Node.js utility, requiring Node 6 or later. The core compiler however, does not depend on Node, and can be run in any JavaScript environment, or in the browser (see Try CoffeeScript).

To install, first make sure you have a working copy of the latest stable version of Node.js. You can then install CoffeeScript globally with npm:

npm install --global coffeescript

This will make the coffee and cake commands available globally.

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:

npm install --save-dev coffeescript

The 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.

If you plan to use the --transpile option (see 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.

Usage

Command Line

Once 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:

Option Description
-c, --compile Compile a .coffee script into a .js JavaScript file of the same name.
-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.
-m, --map Generate source maps alongside the compiled JavaScript files. Adds sourceMappingURL directives to the JavaScript as well.
-M, --inline-map Just like --map, but include the source map directly in the compiled JavaScript files, rather than in a separate file.
-i, --interactive Launch an interactive CoffeeScript session to try short snippets. Identical to calling coffee with no arguments.
-o, --output [DIR] Write out all compiled JavaScript files into the specified directory. Use in conjunction with --compile or --watch.
-w, --watch Watch files for changes, rerunning the specified command when any file is updated.
-p, --print Instead of writing out the JavaScript as a file, print it directly to stdout.
-s, --stdio Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT. Good for use with processes written in other languages. An example:
cat src/cake.coffee | coffee -sc
-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.
-e, --eval Compile and print a little snippet of CoffeeScript directly from the command line. For example:
coffee -e "console.log num for num in [10..1]"
-r, --require [MODULE] require() the given module before starting the REPL or evaluating the code given with the --eval flag.
-b, --bare Compile the JavaScript without the top-level function safety wrapper.
--no-header Suppress the “Generated by CoffeeScript” header.
--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.
--ast Generate an abstract syntax tree of nodes of the CoffeeScript. Used for integrating with JavaScript build tools.
--tokens Instead of parsing the CoffeeScript, just lex it, and print out the token stream. Used for debugging the compiler.
-n, --nodes Instead of compiling the CoffeeScript, just lex and parse it, and print out the parse tree. Used for debugging the compiler.

Examples:

  • Compile a directory tree of .coffee files in src into a parallel tree of .js files in lib:
    coffee --compile --output lib/ src/
  • Watch a file for changes, and recompile it every time the file is saved:
    coffee --watch --compile experimental.coffee
  • Concatenate a list of files into a single script:
    coffee --join project.js --compile src/*.coffee
  • Print out the compiled JS from a one-liner:
    coffee -bpe "alert i for i in [0..10]"
  • All together now, watch and recompile an entire project as you work on it:
    coffee -o lib/ -cw src/
  • Start the CoffeeScript REPL (Ctrl-D to exit, Ctrl-Vfor multi-line):
    coffee

To use --transpile, see Transpilation.

Node.js

If 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:

require 'coffeescript/register'

App = require './app' # The .coffee extension is optional

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 require the full module:

CoffeeScript = require 'coffeescript'

eval CoffeeScript.compile 'console.log "Mmmmm, I could really go for some #{Math.pi}"'

The 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:

  • 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}.
  • options.inlineMap, boolean: if true, output the source map as a base64-encoded string in a comment at the bottom.
  • options.filename, string: the filename to use for the source map. It can include a path (relative or absolute).
  • options.bare, boolean: if true, output without the top-level function safety wrapper.
  • options.header, boolean: if true, output the Generated by CoffeeScript header.
  • options.transpile, object: if set, this must be an object with the options to pass to Babel. See Transpilation.
  • options.ast, boolean: if true, return an abstract syntax tree of the input CoffeeScript source code.

Transpilation

CoffeeScript 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. 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, Bublé or Traceur Compiler. See Build Tools.

Quickstart

From the root of your project:

npm install --save-dev @babel/core @babel/preset-env
echo '{ "presets": ["@babel/env"] }' > .babelrc
coffee --compile --transpile --inline-map some-file.coffee

Transpiling with the CoffeeScript compiler

To make things easy, CoffeeScript has built-in support for the popular Babel 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:

npm install --save-dev @babel/core

Or 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:

npm install --global @babel/core

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 .babelrc file in the folder containing the files you’re compiling, or in any parent folder up the path above those files. (Babel supports other ways, too.) A minimal .babelrc file would be just { "presets": ["@babel/env"] }. This implies that you have installed @babel/preset-env:

npm install --save-dev @babel/preset-env  # Or --global for non-project-based usage

See Babel’s website to learn about presets and plugins and the multitude of options you have. Another preset you might need is @babel/plugin-transform-react-jsx if you’re using JSX with React (JSX can also be used with other frameworks).

Once 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.

If you’re using CoffeeScript via the Node API, 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:

CoffeeScript.compile(code, {transpile: {presets: ['@babel/env']}})

You 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, Webpack, Grunt and Broccoli.

Polyfills

Note that transpiling doesn’t automatically supply polyfills for your code. CoffeeScript itself will output Array.indexOf if you use the in operator, or destructuring or spread/rest syntax; and 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, though there are many other strategies.

Language Reference

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.

Many of the examples can be run (where it makes sense) by pressing the button on the right. The CoffeeScript on the left is editable, and the JavaScript will update as you edit.

First, 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, if-statements, switch, and try/catch, use indentation.

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.
console.log sys.inspect objectconsole.log(sys.inspect(object));

Functions

Functions are defined by an optional list of parameters in parentheses, an arrow, and the function body. The empty function looks like this: ->

Functions may also have default values for arguments, which will be used if the incoming argument is missing (undefined).

Strings

Like 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.

Multiline strings are allowed in CoffeeScript. Lines are joined by a single space unless they end with a backslash. Indentation is ignored.

Block 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.

Double-quoted block strings, like other double-quoted strings, allow interpolation.

Objects and Arrays

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 YAML.

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 { and } are required for this shorthand.

Comments

In 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.

Inline ### comments make type annotations possible.

Lexical Scoping and Variable Safety

The 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.

Notice 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.

Because 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.

Although 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, and is unnecessary and automatically disabled when using modules.)

If 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. If you’re targeting both CommonJS and the browser, the existential operator (covered below), gives you a reliable way to figure out where to add them: exports ? this.

Since CoffeeScript takes care of all variable declaration, it is not possible to declare variables with ES2015’s let or const. This is intentional; 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.

If, Else, Unless, and Conditional Assignment

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.

CoffeeScript 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.

Splats, or Rest Parameters/Spread Syntax

The 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.

Splats also let us elide array elements…

…and object properties.

In ECMAScript this is called spread syntax, and has been supported for arrays since ES2015 and objects since ES2018.

Loops and Comprehensions

Most 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.

Comprehensions should be able to handle most places where you otherwise would use a loop, each/forEach, map, or select/filter, for example:
shortNames = (name for name in list when name.length < 5)
If 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.

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 true — or null, to the bottom of your function.

To step through a range comprehension in fixed-size chunks, use by, for example: evens = (x for x in [0..10] by 2)

If you don’t need the current iteration value you may omit it: browser.closeCurrentTab() for [0...count]

Comprehensions 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.

If 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.

To iterate a generator function, use from. See Generator Functions.

The 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.

For readability, the until keyword is equivalent to while not, and the loop keyword is equivalent to while true.

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 do keyword, which immediately invokes a passed function, forwarding any arguments.

Array Slicing and Splicing with Ranges

Ranges 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.

The same syntax can be used with assignment to replace a segment of an array with new values, splicing it.

Note that JavaScript strings are immutable, and can’t be spliced.

Everything is an Expression (at least, as much as possible)

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 return gets pushed down into each possible branch of execution in the function below.

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 (return value), when you know that you’re done.

Because variable declarations occur at the top of scope, assignment can be used within expressions, even for variables that haven’t been seen before:

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:

As well as silly things, like passing a try/catch statement directly into a function call:

There 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.

Operators and Aliases

Because 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 !==.

You can use not as an alias for !.

For logic, and compiles to &&, and or into ||.

Instead of a newline or semicolon, then can be used to separate conditions from expressions, in while, if/else, and switch/when statements.

As in YAML, on and yes are the same as boolean true, while off and no are boolean false.

unless can be used as the inverse of if.

As a shortcut for this.property, you can use @property.

You can use in to test for array presence, and of to test for JavaScript object-key presence.

In a for loop, from compiles to the ES2015 of. (Yes, it’s unfortunate; the CoffeeScript of predates the ES2015 of.)

To simplify math expressions, ** can be used for exponentiation and // performs floor division. % works just like in JavaScript, while %% provides “dividend dependent modulo”:

All together now:

CoffeeScript JavaScript
is ===
isnt !==
not !
and &&
or ||
true, yes, on true
false, no, off false
@, this this
a in b [].indexOf.call(b, a) >= 0
a of b a in b
for a from b for (a of b)
a ** b a ** b
a // b Math.floor(a / b)
a %% b (a % b + b) % b

The Existential Operator

It’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?.

It 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.

Note 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?.

If 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.

The 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.

For completeness:

Example Definition
a? tests that a is in scope and a != null
a ? b returns a if a is in scope and a != null; otherwise, b
a?.b or a?['b'] returns a.b if a is in scope and a != null; otherwise, undefined
a?(b, c) or a? b, c returns the result of calling a (with arguments b and c) if a is in scope and callable; otherwise, undefined
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

Chaining Function Calls

Leading . closes all open calls, allowing for simpler chaining syntax.

Destructuring Assignment

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:

But it’s also helpful for dealing with functions that return multiple values.

Destructuring assignment can be used with any depth of array and object nesting, to help pull out deeply nested properties.

Destructuring assignment can even be combined with splats.

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.

Destructuring assignment is also useful when combined with class constructors to assign properties to your instance from an options object passed to the constructor.

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 undefinedpassing null will set a value of null, not the default.

Bound (Fat Arrow) Functions

In 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 gives a good overview of the quirks.

The 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.

If 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.

The fat arrow was one of the most popular features of CoffeeScript, and ES2015 adopted it; so CoffeeScript 2 compiles => to ES =>.

Generator Functions

CoffeeScript supports ES2015 generator functions through the yield keyword. There’s no function*(){} nonsense — a generator in CoffeeScript is simply a function that yields.

yield* is called yield from, and yield return may be used if you need to force a generator that doesn’t yield.

You can iterate over a generator function using for…from.

Async Functions

ES2017’s async functions 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.

Similar to how yield return forces a generator, await return may be used to force a function to be async.

Classes

CoffeeScript 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.

Static methods can be defined using @ before the method name:

Finally, 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.

Prototypal Inheritance

In addition to supporting ES2015 classes, CoffeeScript provides a shortcut for working with prototypes. The :: operator gives you quick access to an object’s prototype:

Switch/When/Else

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.

As in Ruby, switch statements in CoffeeScript can take multiple values for each when clause. If any of the values match, the clause runs.

switch statements can also be used without a control expression, turning them in to a cleaner alternative to if/else chains.

Try/Catch/Finally

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.

Chained Comparisons

CoffeeScript borrows chained comparisons from Python — making it easy to test if a value falls within a certain range.

Block Regular Expressions

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 /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:

Tagged Template Literals

CoffeeScript supports ES2015 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: 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.

Modules

ES2015 modules are supported in CoffeeScript, with very similar import and export syntax:

Dynamic import is also supported, with mandatory parentheses:

Note 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 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.

Also, any file with an import or export statement will be output without a top-level function safety wrapper; in other words, importing or exporting modules will automatically trigger bare mode for that file. This is because per the ES2015 spec, import or export statements must occur at the topmost scope.

Embedded JavaScript

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.

Escape backticks with backslashes: \`​ becomes `​.

Escape backslashes before backticks with more backslashes: \\\`​ becomes \`​.

You can also embed blocks of JavaScript using triple backticks. That’s easier than escaping backticks, if you need them inside your JavaScript block.

JSX

JSX is JavaScript containing interspersed XML elements. While conceived for React, it is not specific to any particular library or framework.

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 Babel with the React JSX transform. 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.

Just 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.

Older 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.

Type Annotations

Static type checking can be achieved in CoffeeScript by using Flow’s Comment Types syntax:

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 build tool for this, but here’s how to do it the simplest way possible using the CoffeeScript and Flow command-line tools, assuming you’ve already installed Flow and the latest CoffeeScript in your project folder:

coffee --bare --no-header --compile app.coffee && npm run flow

--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.

If you know of another way to achieve static type checking with CoffeeScript, please create an issue and let us know.

Literate CoffeeScript

Besides 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.

Just for kicks, a little bit of the compiler is currently implemented in this fashion: See it as a document, raw, and properly highlighted in a text editor.

A few caveats:

  • 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).
  • 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.
  • 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.

Source Maps

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 --map or -m flag to the compiler.

For a full introduction to source maps, how they work, and how to hook them up in your browser, read the HTML5 Tutorial.

Cake, and Cakefiles

CoffeeScript includes a (very) simple build system similar to Make and Rake. 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.

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 options object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser:

If 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. If you need dependencies, or async callbacks, it’s best to put them in your code itself — not the cake task.

"text/coffeescript" Script Tags

While 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) as docs/v2/browser-compiler-legacy/coffeescript.js. Include this file on a page with inline CoffeeScript tags, and it will compile and evaluate them in order.

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 window object.

Integrations

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 wiki pages. If there’s a project that you feel should be added to this section, please open an issue or pull request. Projects are listed in alphabetical order by category.

Build Tools

Code Editors

Frameworks

Linters and Formatting

Testing

Resources

  • CoffeeScript on GitHub
  • CoffeeScript Issues
    Bug reports, feature proposals, and ideas for changes to the language belong here.
  • CoffeeScript Google Group
    If you’d like to ask a question, the mailing list is a good place to get help.
  • The CoffeeScript Wiki
    If you’ve ever learned a neat CoffeeScript tip or trick, or ran into a gotcha — share it on the wiki.
  • The FAQ
    Perhaps your CoffeeScript-related question has been asked before. Check the FAQ first.
  • JS2Coffee
    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.
  • High-Rez Logo
    The CoffeeScript logo is available in SVG for use in presentations.

Books

There are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.

Screencasts

  • A Sip of CoffeeScript is a Code School Course which combines 6 screencasts with in-browser coding to make learning fun. The first level is free to try out.
  • Meet CoffeeScript is a 75-minute long screencast by PeepCode, now PluralSight. Highly memorable for its animations which demonstrate transforming CoffeeScript into the equivalent JS.
  • If you’re looking for less of a time commitment, RailsCasts’ CoffeeScript Basics should have you covered, hitting all of the important notes about CoffeeScript in 11 minutes.

Examples

The best list of open-source CoffeeScript examples can be found on GitHub. But just to throw out a few more:

  • GitHub’s Hubot, a friendly IRC robot that can perform any number of useful and useless tasks.
  • sstephenson’s Pow, a zero-configuration Rack server, with comprehensive annotated source.
  • technoweenie’s Coffee-Resque, a port of Resque for Node.js.
  • stephank’s Orona, a remake of the Bolo tank game for modern browsers.
  • GitHub’s Atom, a hackable text editor built on web technologies.
  • Basecamp’s Trix, a rich text editor for web apps.

Web Chat (IRC)

Quick 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.

Annotated Source

You can browse the CoffeeScript 2.7.0 source in readable, annotated form here. You can also jump directly to a particular source file:

Contributing

Contributions are welcome! Feel free to fork the repo and submit a pull request.

Some features of ECMAScript are intentionally unsupported. Please review both the open and closed issues on GitHub 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) 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.

For more resources on adding to CoffeeScript, please see the Wiki, especially How The Parser Works.

There are several things you can do to increase your odds of having your pull request accepted:

  • 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.
  • Follow the style of the rest of the CoffeeScript codebase.
  • Ensure any ECMAScript syntax is mature (at Stage 4, or at Stage 3 with support in major browsers or runtimes).
  • Add only features that have broad utility, rather than a feature aimed at a specific use case or framework.

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 plenty of company.

Unsupported ECMAScript Features

There are a few ECMAScript features that CoffeeScript intentionally doesn’t support.

let and const: block-scoped and reassignment-protected variables

When CoffeeScript was designed, var was intentionally omitted. 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.

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.

Keep 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:

const obj = {foo: 'bar'};
obj.foo = 'baz'; // Allowed!
obj = {}; // Throws error

Named functions and function declarations

Newcomers 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, and the second is a function expression. As stated above, in CoffeeScript everything is an expression, 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.

Technically, 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 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.

get and set keyword shorthand syntax

get and set, as keywords preceding functions or class methods, are intentionally unimplemented in CoffeeScript.

This 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 that is slightly more verbose but just as effective:

Breaking Changes From CoffeeScript 1.x to 2

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.

Bound (fat arrow) functions

In 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 =>, which behaves slightly differently. The largest difference is that in ES2015, => functions lack an arguments object:

Default values for function parameters and destructured elements

Per the ES2015 spec regarding function default parameters and destructuring 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.

Bound generator functions

Bound generator functions, a.k.a. generator arrow functions, aren’t allowed in ECMAScript. You can write function* or =>, but not both. Therefore, CoffeeScript code like this:

f = => yield this
# Throws a compiler error

Needs to be rewritten the old-fashioned way:

Classes are compiled to ES2015 classes

ES2015 classes and their methods have some restrictions beyond those on regular functions.

Class constructors can’t be invoked without new:

(class)()
# Throws a TypeError at runtime

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:

class Base
  constructor: ->
    @onClick()      # This works
    clickHandler = @onClick
    clickHandler()  # This throws a runtime error

class Component extends Base
  onClick: =>
    console.log 'Clicked!', @

Class methods can’t be used with new (uncommon):

class Namespace
  @Klass = ->
new Namespace.Klass  # Throws a TypeError at runtime

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.

class A
  name = 'method'
  "#{name}": ->   # This method will be named 'undefined'
  @::[name] = ->  # This will work; assigns to `A.prototype.method`

super and this

In the constructor of a derived class (a class that extends another class), this cannot be used before calling super:

class B extends A
  constructor: -> this  # Throws a compiler error

This also means you cannot pass a reference to this as an argument to super in the constructor of a derived class:

class B extends A
  constructor: (@arg) ->
    super @arg  # Throws a compiler error

This is a limitation of ES2015 classes. As a workaround, assign to this after the super call:

super and extends

Due 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.

class B extends A
  foo: -> super
  # Throws a compiler error

Arguments can be forwarded explicitly using splats:

Or if you know that the parent function doesn’t require arguments, just call super():

CoffeeScript 1.x allowed the extends keyword to set up prototypal inheritance between functions, and super could be used manually prototype-assigned functions:

A = ->
B = ->
B extends A
B.prototype.foo = -> super arguments...
# Last two lines each throw compiler errors in CoffeeScript 2

Due 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:

or

JSX and the < and > operators

With the addition of 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.

Literate CoffeeScript parsing

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.

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.

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.

Argument parsing and shebang (#!) lines

In 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:

coffee [options] path/to/script.coffee -- [args]

Now you would just type:

coffee [options] path/to/script.coffee [args]

The deprecated version will still work, but it will print a warning before running the script.

On 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:

#!/usr/bin/env coffee

x = 2 + 2
console.log x

If this were saved as executable.coffee, it could be made executable and run:

chmod +x ./executable.coffee
▶ ./executable.coffee
4

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 #!/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.

Changelog

2.7.0

  • The import assertions syntax is now supported. This allows statements like export { version } from './package.json' assert { type: 'json' } or expressions like import('./calendar.json', { assert { type: 'json' } }).
  • 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 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().
  • 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={`...`} />).
  • Bugfixes for line continuations not behaving as expected for a nonempty first line of an explicit [ array or { object literal.

2.6.1

  • 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'.
  • Bugfix for a stack overflow error when compiling large files in non-bare mode.

2.6.0

2.5.1

  • Object splats can now include prototype shorthands, such as a = {b::c...}; and soaks, such as a = {b?.c..., d?()...}.
  • Bugfix for regression in 2.5.0 where compilation became much slower for files with Windows-style line endings.
  • Bugfix for an implicit object after a line continuation keyword like or inside a larger implicit object.

2.5.0

  • 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 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, a plugin to lint CoffeeScript via ESLint; and prettier-plugin-coffeescript, a plugin to reformat CoffeeScript source code via Prettier. The structure and properties of CoffeeScript’s AST are not final and may undergo breaking changes between CoffeeScript versions; please open an issue if you are interested in creating new integrations.
  • Numeric separators are now supported in CoffeeScript, following the same syntax as JavaScript: 1_234_567.
  • BigInt numbers are now supported in CoffeeScript, following the same syntax as JavaScript: 42n.
  • ''' and """ strings are now output as more readable JavaScript template literals, or backtick (`) strings, with actual newlines rather than \n escape sequences.
  • Classes can now contain computed properties, e.g. [someVar]: -> or @[anotherVar]: ->.
  • JSX tags can now contain XML-style namespaces, e.g. <image xlink:href="data:image/png" /> or <Something:Tag></Something:Tag>.
  • 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.

2.4.1

  • Both the traditional ES5 and modern ES module 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.

2.4.0

  • Dynamic import() expressions are now supported. The parentheses are always required, to distinguish from import statements. See Modules. 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 is finalized should be considered provisional, subject to breaking changes if the proposal changes or is rejected. We have also revised our policy on Stage 3 ECMAScript features, to support them when the features are shipped in significant runtimes such as major browsers or Node.js.
  • 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 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.
  • 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.
  • 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.

2.3.2

  • 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.
  • The syntax new.target is now supported.
  • You can now follow the keyword yield with an indented object, like has already been allowed for return and other keywords.
  • 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.

2.3.1

  • 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.
  • Invalid indentation inside a JSX interpolation (the middle of <tag>{ ... }</tag>) now throws an error.
  • The browser compiler, used in Try CoffeeScript 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.
  • 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.

2.3.0

  • 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 unless you know that your target runtime(s) support each feature.
  • Asynchronous iterators are now supported. You can now yield an await call, e.g. do -> until file.EOF then yield await file.readLine().
  • 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 between the Object.assign polyfill and the native implementation.
  • 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.
  • The s (dotAll) flag is now supported in regular expressions.

2.2.4

  • 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.
  • 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.

2.2.3

  • Bugfix for object destructuring with an empty array as a key’s value: { key: [] } = obj.
  • Bugfix for array destructuring onto targets attached to this: [ @most... , @penultimate, @last ] = arr.

2.2.2

  • 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).
  • Bugfixes for allowing backslashes in import and export statements and lines that trigger the start of an indented block, like an if statement.

2.2.1

  • 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.
  • Bugfix for regression in 2.2.0 where in certain cases a range iterator variable was declared in the global scope.

2.2.0

  • This release fixes all currently open bugs, dating as far back as 2014, 2012 and 2011.
  • 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 thens (and one or more elses) 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.
  • When a required then is missing, the error more accurately points out the location of the mistake.
  • 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.
  • Destructuring with a non-final splat/spread, e.g. [open, contents..., close] = tag.split('') is now output using ES2015 rest syntax.
  • 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'.
  • Statements such as break can now be used inside parentheses, e.g. (doSomething(); break) while condition or (pick(key); break) for key of obj.
  • Bugfix for assigning to a property attached to this/@ in destructuring, e.g. ({@prop = yes, @otherProp = no}) ->.
  • 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).
  • 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).
  • Bugfix to no longer declare iterator variables twice when evaluating a range, e.g. end = 3; fn [0..end].
  • Bugfix for incorrect scope of variables in chained calls, e.g. start(x = 3).then(-> x = 4).
  • Bugfix for incorrect scope of variables in a function passed to do, e.g. for [1..3] then masked = 10; do -> alert masked.
  • Bugfix to no longer throw a syntax error for a trailing comma in a function call, e.g. fn arg1, arg2,.
  • Bugfix for an expression in a property access, e.g. a[!b in c..].
  • Bugfix to allow a line continuation backslash (\) at any point in a for line.

2.1.1

  • 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.
  • 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.

2.1.0

  • Computed property keys in object literals are now supported: obj = { ['key' + i]: 42 }, or obj = [Symbol.iterator]: -> yield i++.
  • Skipping of array elements, a.k.a. elision, is now supported: arr = [a, , b], or [, protocol] = url.match /^(.*):\/\//.
  • JSX fragments syntax is now supported.
  • Bugfix where /// within a # line comment inside a /// block regex was erroneously closing the regex, rather than being treated as part of the comment.
  • Bugfix for incorrect output for object rest destructuring inside array destructuring.

2.0.3

  • Bugfix for export default followed by an implicit object that contains an explicit object, for example exportedMember: { obj... }.
  • Bugfix for key, val of obj after an implicit object member, e.g. foo: bar for key, val of obj.
  • Bugfix for combining array and object destructuring, e.g. [ ..., {a, b} ] = arr.
  • 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.
  • 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.
  • Bugfix for incorrect source maps generated when using --transpile with --map for multiple input files.
  • Bugfix for comments at the beginning or end of input into the REPL (coffee --interactive).

2.0.2

  • --transpile now also applies to required or imported CoffeeScript files.
  • --transpile can be used with the REPL: coffee --interactive --transpile.
  • Improvements to comments output that should now cover all of the Flow comment-based syntax. Inline ### comments near variable initial assignments are now output in the variable declaration statement, and ### comments near a class and method names are now output where Flow expects them.
  • 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.)
  • 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.
  • 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.
  • 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 syntax, in the same class along with traditional class body expressions like prop: 3 that CoffeeScript outputs as part of the class prototype.
  • Bugfix for comments not output before a complex ? operation, e.g. @a ? b.
  • All tests now pass in Windows.

2.0.1

  • 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.
  • --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.
  • 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, assuming your transpiler supports it.

2.0.0

  • 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. Also changed the -t short flag to refer to --transpile instead of --tokens.
  • Always populate source maps’ sourcesContent property.
  • Bugfixes for destructuring and for comments in JSX.
  • Note that these are only the changes between 2.0.0-beta5 and 2.0.0. See below for all changes since 1.x.

2.0.0-beta5

  • 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.
  • The command line --output flag now allows you to specify an output filename, not just an output folder.
  • 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).
  • 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.
  • A string or JSX interpolation that contains only a comment ("a#{### comment ###}b" or <div>{### comment ###}</div>) is now output (`a${/* comment */}b`)
  • Interpolated strings (ES2015 template literals) that contain quotation marks no longer have the quotation marks escaped: `say "${message}"`
  • It is now possible to chain after a function literal (for example, to define a function and then call .call on it).
  • The results of the async tests are included in the output when you run cake test.
  • 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.
  • Bugfixes for syntactical edge cases: semicolons after = and other “mid-expression” tokens; spaces after ::; and scripts that begin with : or *.
  • 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.

2.0.0-beta4

  • This release includes all the changes from 1.12.6 to 1.12.7.
  • Line comments (starting with #) are now output in the generated JavaScript.
  • Block comments (delimited by ###) are now allowed anywhere, including inline where they previously weren’t possible. This provides support for static type annotations using Flow’s comments-based syntax.
  • Spread syntax (... for objects) is now supported in JSX tags: <div {props...} />.
  • Argument parsing for scripts run via coffee is improved. See breaking changes.
  • CLI: Propagate SIGINT and SIGTERM signals when node is forked.
  • await in the REPL is now allowed without requiring a wrapper function.
  • do super is now allowed, and other accesses of super like super.x.y or super['x'].y now work.
  • Splat/spread syntax triple dots are now allowed on either the left or the right (so props... or ...props are both valid).
  • Tagged template literals are recognized as callable functions.
  • Bugfixes for object spread syntax in nested properties.
  • Bugfixes for destructured function parameter default values.

2.0.0-beta3

  • JSX is now supported.
  • Object rest/spread properties are now supported.
  • 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.
  • The REPL no longer warns about assigning to _.
  • Bugfixes for destructured nested default values and issues related to chaining or continuing expressions across multiple lines.

2.0.0-beta2

  • This release includes all the changes from 1.12.5 to 1.12.6.
  • 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.
  • All unnecessary utility helper functions have been removed, including the polyfills for indexOf and bind.
  • 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.
  • 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.
  • JavaScript reserved words used as properties are no longer wrapped in quotes.
  • 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.
  • Unreachable break statements are no longer added after switch cases that throw exceptions.
  • 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).
  • 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.)
  • If $XDG_CACHE_HOME is set, the REPL .coffee_history file is saved there.

2.0.0-beta1

  • Initial beta release of CoffeeScript 2. No further breaking changes are anticipated.
  • Destructured objects and arrays now output using ES2015+ syntax whenever possible.
  • Literate CoffeeScript now has much better support for parsing Markdown, thanks to using Markdown-It to detect Markdown sections rather than just looking at indentation.
  • Calling a function named get or set now requires parentheses, to disambiguate from the get or set keywords (which are disallowed).
  • The compiler now requires Node 7.6+, the first version of Node to support asynchronous functions without requiring a flag.

2.0.0-alpha1

  • Initial alpha release of CoffeeScript 2. The CoffeeScript compiler now outputs ES2015+ syntax whenever possible. See breaking changes.
  • Classes are output using ES2015 class and extends keywords.
  • Added support for async/await.
  • Bound (arrow) functions now output as => functions.
  • Function parameters with default values now use ES2015 default values syntax.
  • Splat function parameters now use ES2015 spread syntax.
  • Computed properties now use ES2015 syntax.
  • Interpolated strings (template literals) now use ES2015 backtick syntax.
  • Improved support for recognizing Markdown in Literate CoffeeScript files.
  • Mixing tabs and spaces in indentation is now disallowed.
  • Browser compiler is now minified using the Google Closure Compiler (JavaScript version).
  • Node 7+ required for CoffeeScript 2.

1.12.7

  • Fix regressions in 1.12.6 related to chained function calls and indented return and throw arguments.
  • The REPL no longer warns about assigning to _.

1.12.6

  • The return and export keywords can now accept implicit objects (defined by indentation, without needing braces).
  • Support Unicode code point escapes (e.g. \u{1F4A9}).
  • 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.)
  • Bugfixes for chained function calls not closing implicit objects or ternaries.
  • Bugfixes for incorrect code generated by the ? operator within a termary if statement.
  • Fixed some tests, and failing tests now result in a nonzero exit code.

1.12.5

  • 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.
  • Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler.

1.12.4

  • The cake commands have been updated, with new watch options for most tasks. Clone the CoffeeScript repo and run cake at the root of the repo to see the options.
  • Fixed a bug where exporting a referenced variable was preventing the variable from being declared.
  • Fixed a bug where the coffee command wasn’t working for a .litcoffee file.
  • Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.

1.12.3

  • @ 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.
  • 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.
  • The //= operator’s output now wraps parentheses around the right operand, like the other assignment operators.

1.12.2

  • The browser compiler can once again be built unminified via MINIFY=false cake build:browser.
  • The error-prone patched version of Error.prepareStackTrace has been removed.
  • Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+.
  • The browser-based tests now include all the tests as the Node-based version.

1.12.1

  • 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).
  • 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.

1.12.0

  • CoffeeScript now supports ES2015 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.
  • CoffeeScript now provides a for…from syntax for outputting ES2015 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.
  • 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.
  • Within single-backtick embedded JavaScript, backticks can now be escaped via \`​.
  • The browser tests now run in the browser again, and are accessible here if you would like to test your browser.
  • CoffeeScript-only keywords in ES2015 imports and exports are now ignored.
  • The compiler now throws an error on trying to export an anonymous class.
  • Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.

1.11.1

  • Bugfix for shorthand object syntax after interpolated keys.
  • Bugfix for indentation-stripping in """ strings.
  • Bugfix for not being able to use the name “arguments” for a prototype property of class.
  • Correctly compile large hexadecimal numbers literals to 2e308 (just like all other large number literals do).

1.11.0

  • CoffeeScript now supports ES2015 import and export syntax.
  • 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.
  • A bunch of fixes for yield:
    • yield return can no longer mistakenly be used as an expression.
    • 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:
      doubles = ->
        yield for i in [1..3]
          i * 2
      six = ->
        yield
          2 * 3
      
    • The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around yield no longer present.
  • &&=, ||=, and= and or= no longer accidentally allow a space before the equals sign.
  • Improved several error messages.
  • Just like undefined compiles to void 0, NaN now compiles into 0/0 and Infinity into 2e308.
  • Bugfix for renamed destructured parameters with defaults. ({a: b = 1}) -> no longer crashes the compiler.
  • 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.
  • Several minor bug fixes, including:
    • The caught error in catch blocks is no longer declared unnecessarily, and no longer mistakenly named undefined for catch-less try blocks.
    • Unassignable parameter destructuring no longer crashes the compiler.
    • Source maps are now used correctly for errors thrown from .coffee.md files.
    • coffee -e 'throw null' no longer crashes.
    • The REPL no longer crashes when using .exit to exit it.
    • Invalid JavaScript is no longer output when lots of for loops are used in the same scope.
    • A unicode issue when using stdin with the CLI.

1.10.0

  • CoffeeScript now supports ES2015-style destructuring defaults.
  • (offsetHeight: height) -> no longer compiles. That syntax was accidental and partly broken. Use ({offsetHeight: height}) -> instead. Object destructuring always requires braces.
  • Several minor bug fixes, including:
    • A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier.
    • A problem with multiple JS contexts in the jest test framework.
    • An error in io.js where strict mode is set on internal modules.
    • A variable name clash for the caught error in catch blocks.

1.9.3

  • Bugfix for interpolation in the first key of an object literal in an implicit call.
  • Fixed broken error messages in the REPL, as well as a few minor bugs with the REPL.
  • 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.
  • Slight formatting improvement of compiled block comments.
  • Better error messages for on, off, yes and no.

1.9.2

  • Fixed a watch mode error introduced in 1.9.1 when compiling multiple files with the same filename.
  • Bugfix for yield around expressions containing this.
  • Added a Ruby-style -r option to the REPL, which allows requiring a module before execution with --eval or --interactive.
  • 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.
  • Minor bug fixes for IE8, strict ES5 regular expressions and Browserify.

1.9.1

  • Interpolation now works in object literal keys (again). You can use this to dynamically name properties.
  • 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.
  • Fixed a few yield-related edge cases with yield return and yield throw.
  • Minor bug fixes and various improvements to compiler error messages.

1.9.0

  • CoffeeScript now supports ES2015 generators. A generator is simply a function that yields.
  • More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation.
  • 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.
  • Fixed REPL compatibility with latest versions of Node and Io.js.
  • Various minor bug fixes.

1.8.0

  • The --join option of the CLI is now deprecated.
  • Source maps now use .js.map as file extension, instead of just .map.
  • The CLI now exits with the exit code 1 when it fails to write a file to disk.
  • The compiler no longer crashes on unterminated, single-quoted strings.
  • Fixed location data for string interpolations, which made source maps out of sync.
  • The error marker in error messages is now correctly positioned if the code is indented with tabs.
  • Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.
  • The %% operator now coerces its right operand only once.
  • It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.
  • The CoffeeScript REPL is now exported and can be required using require 'coffeescript/repl'.
  • Fixes for the REPL in Node 0.11.

1.7.1

  • Fixed a typo that broke node module lookup when running a script directly with the coffee binary.

1.7.0

  • 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.
  • Improved error messages, source maps and stack traces. Source maps now use the updated //# syntax.
  • Leading . now closes all open calls, allowing for simpler chaining syntax.
  • Added **, // and %% operators and ... expansion in parameter lists and destructuring expressions.
  • 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.
  • Closing brackets can now be indented and therefore no longer cause unexpected error.
  • 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.
  • Formatting of compiled block comments has been improved.
  • No more -p folders on Windows.
  • The options object passed to CoffeeScript is no longer mutated.

1.6.3

  • The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should.
  • You can now use require in Node to load .coffee.md Literate CoffeeScript files. In the browser, text/literate-coffeescript script tags.
  • 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.
  • Bugfixes for Windows path separators, catch without naming the error, and executable-class-bodies-with- prototypal-property-attachment.

1.6.2

  • 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.
  • Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time.
  • Fixes for 1.6.x regressions with overriding inherited bound functions, and for Windows file path management.
  • The coffee command can now correctly fork() both .coffee and .js files. (Requires Node.js 0.9+)

1.6.1

  • First release of source maps. Pass the --map flag to the compiler, and off you go. Direct all your thanks over to Jason Walton.
  • 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.
  • .coffee.md is now also supported as a Literate CoffeeScript file extension, for existing tooling. .litcoffee remains the canonical one.
  • Several minor fixes surrounding member properties, bound methods and super in class declarations.

1.5.0

  • First release of Literate CoffeeScript.
  • The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly.
  • Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor.
  • You can now loop over an array backwards, without having to manually deal with the indexes: for item in list by -1
  • Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted.

1.4.0

  • The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files.
  • Fix Node/compiler deprecation warnings by removing registerExtension, and moving from path.exists to fs.exists.
  • Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals.

1.3.3

  • Due to the new semantics of JavaScript’s strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See #2052 for discussion.
  • Inside of a nested function inside of an instance method, it’s now possible to call super more reliably (walks recursively up).
  • Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643)
  • Fix for splats nested within the LHS of destructuring assignment.
  • Corrections to our compile time strict mode forbidding of octal literals.

1.3.1

  • 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.
  • 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.
  • CoffeeScript now prints a Generated by CoffeeScript VERSION header at the top of each compiled file.
  • Conditional assignment of previously undefined variables a or= b is now considered a syntax error.
  • A tweak to the semantics of do, which can now be used to more easily simulate a namespace: do (x = 1, y = 2) -> …
  • Loop indices are now mutable within a loop iteration, and immutable between them.
  • Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list.
  • 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.

1.2.0

  • 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.
  • The throw statement can now be used as part of an expression.
  • Block comments at the top of the file will now appear outside of the safety closure wrapper.
  • 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.

1.1.3

  • 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.
  • You can now call super in class level methods in class bodies, and bound class methods now preserve their correct context.
  • 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.
  • 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')
  • There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script.
  • The coffee --watch feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows.
  • Lots of small bug fixes from @michaelficarra, @geraldalewis, @satyr, and @trevorburnham.

1.1.2

Fixes 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.

1.1.1

Bugfix release for classes with external constructor functions, see issue #1182.

1.1.0

When 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.

1.0.1

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 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.

1.0.0

CoffeeScript 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.

0.9.6

The 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.

0.9.5

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 satyr’s 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 used to parse as result = (i for i in list) by default … it now parses as (result = i) for i in list.

0.9.4

CoffeeScript 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.

0.9.3

CoffeeScript 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.

0.9.2

Specifying 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.

0.9.1

Bugfix 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.

0.9.0

The 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.

0.7.2

Quick bugfix (right after 0.7.1) for a problem that prevented coffee command-line options from being parsed in some circumstances.

0.7.1

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.

0.7.0

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 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.

0.6.2

The 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.

0.6.1

Upgraded CoffeeScript for compatibility with the new Node.js v0.1.90 series.

0.6.0

Trailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using @property notation.

0.5.6

Interpolation 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.

0.5.5

String interpolation, contributed by Stan Angeloff. 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.

0.5.4

Bugfix 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.

0.5.3

CoffeeScript 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.

0.5.2

Added a compressed version of the compiler for inclusion in web pages as /v2/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.

0.5.1

Improvements 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.

0.5.0

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.

0.3.2

@property is now a shorthand for this.property. Switched the default JavaScript engine from Narwhal to Node.js. Pass the --narwhal flag if you’d like to continue using it.

0.3.0

CoffeeScript 0.3 includes major syntax changes: The function symbol was changed to ->, and the bound function symbol is now =>. Parameter lists in function definitions must now be wrapped in parentheses. Added property soaking, with the ?. operator. Made parentheses optional, when invoking functions with arguments. Removed the obsolete block literal syntax.

0.2.6

Added 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.

0.2.5

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 ==>, 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.

0.2.4

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.

0.2.3

Axed the unsatisfactory ino keyword, replacing it with of for object comprehensions. They now look like: for prop, value of object.

0.2.2

When performing a comprehension over an object, use ino, instead of in, which helps us generate smaller, more efficient code at compile time. Added :: as a shorthand for saying .prototype. The “splat” symbol has been changed from a prefix asterisk *, to a postfix ellipsis ... Added JavaScript’s in operator, empty return statements, and empty while loops. Constructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned. The extends keyword now functions identically to goog.inherits in Google’s Closure Library.

0.2.1

Arguments objects are now converted into real arrays when referenced.

0.2.0

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 Liam O’Connor-Davis for whitespace and expression help.

0.1.6

Bugfix for running coffee --interactive and --run from outside of the CoffeeScript directory. Bugfix for nested function/if-statements.

0.1.5

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 \ to escape newlines. The coffeescript command is now called coffee.

0.1.4

The official CoffeeScript extension is now .coffee instead of .cs, which properly belongs to C#. 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.

0.1.3

The 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.

0.1.2

Fixed a bug with calling super() through more than one level of inheritance, with the re-addition of the extends keyword. Added experimental Narwhal support (as a Tusk package), contributed by Tom Robinson, including bin/cs as a CoffeeScript REPL and interpreter. New --no-wrap option to suppress the safety function wrapper.

0.1.1

Added instanceof and typeof as operators.

0.1.0

Initial CoffeeScript release.

================================================ FILE: docs/v2/test.html ================================================ CoffeeScript Test Suite

CoffeeScript Test Suite


































































================================================
FILE: documentation/examples/aliases.coffee
================================================
launch() if ignition is on

volume = 10 if band isnt SpinalTap

letTheWildRumpusBegin() unless answer is no

if car.speed < limit then accelerate()

winner = yes if pick in [47, 92, 13]

print inspect "My name is #{@name}"


================================================
FILE: documentation/examples/array_comprehensions.coffee
================================================
# Eat lunch.
eat = (food) -> "#{food} eaten."
eat food for food in ['toast', 'cheese', 'wine']

# Fine five course dining.
courses = ['greens', 'caviar', 'truffles', 'roast', 'cake']
menu = (i, dish) -> "Menu Item #{i}: #{dish}" 
menu i + 1, dish for dish, i in courses

# Health conscious meal.
foods = ['broccoli', 'spinach', 'chocolate']
eat food for food in foods when food isnt 'chocolate'


================================================
FILE: documentation/examples/array_spread.coffee
================================================
popular  = ['pepperoni', 'sausage', 'cheese']
unwanted = ['anchovies', 'olives']

all = [popular..., unwanted..., 'mushrooms']


================================================
FILE: documentation/examples/async.coffee
================================================
# Your browser must support async/await and speech synthesis
# to run this example.

sleep = (ms) ->
  new Promise (resolve) ->
    window.setTimeout resolve, ms

say = (text) ->
  window.speechSynthesis.cancel()
  window.speechSynthesis.speak new SpeechSynthesisUtterance text

countdown = (seconds) ->
  for i in [seconds..1]
    say i
    await sleep 1000 # wait one second
  say "Blastoff!"

countdown 3


================================================
FILE: documentation/examples/breaking_change_bound_generator_function.coffee
================================================
self = this
f = -> yield self


================================================
FILE: documentation/examples/breaking_change_destructuring_default_values.coffee
================================================
{a = 1} = {a: null}

a  # Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2


================================================
FILE: documentation/examples/breaking_change_fat_arrow.coffee
================================================
outer = ->
  inner = => Array.from arguments
  inner()

outer(1, 2)  # Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2


================================================
FILE: documentation/examples/breaking_change_function_parameter_default_values.coffee
================================================
f = (a = 1) -> a

f(null)  # Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2


================================================
FILE: documentation/examples/breaking_change_super_in_non-class_methods_refactor_with_apply.coffee
================================================
# Helper functions
hasProp = {}.hasOwnProperty
extend = (child, parent) ->
  ctor = ->
    @constructor = child
    return
  for key of parent
    if hasProp.call(parent, key)
      child[key] = parent[key]
  ctor.prototype = parent.prototype
  child.prototype = new ctor
  child


A = ->
B = ->
extend B, A
B.prototype.foo = -> A::foo.apply this, arguments


================================================
FILE: documentation/examples/breaking_change_super_in_non-class_methods_refactor_with_class.coffee
================================================
class A
class B extends A
  foo: -> super arguments...


================================================
FILE: documentation/examples/breaking_change_super_this.coffee
================================================
class B extends A
  constructor: (arg) ->
    super arg
    @arg = arg


================================================
FILE: documentation/examples/breaking_change_super_with_arguments.coffee
================================================
class B extends A
  foo: -> super arguments...


================================================
FILE: documentation/examples/breaking_change_super_without_arguments.coffee
================================================
class B extends A
  foo: -> super()


================================================
FILE: documentation/examples/cake_tasks.coffee
================================================
fs = require 'fs'

option '-o', '--output [DIR]', 'directory for compiled code'

task 'build:parser', 'rebuild the Jison parser', (options) ->
  require 'jison'
  code = require('./lib/grammar').parser.generate()
  dir  = options.output or 'lib'
  fs.writeFile "#{dir}/parser.js", code


================================================
FILE: documentation/examples/chaining.coffee
================================================
$ 'body'
.click (e) ->
  $ '.box'
  .fadeIn 'fast'
  .addClass 'show'
.css 'background', 'white'


================================================
FILE: documentation/examples/classes.coffee
================================================
class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"

sam.move()
tom.move()


================================================
FILE: documentation/examples/comment.coffee
================================================
###
Fortune Cookie Reader v1.0
Released under the MIT License
###

sayFortune = (fortune) ->
  console.log fortune # in bed!


================================================
FILE: documentation/examples/comparisons.coffee
================================================
cholesterol = 127

healthy = 200 > cholesterol > 60


================================================
FILE: documentation/examples/conditionals.coffee
================================================
mood = greatlyImproved if singing

if happy and knowsIt
  clapsHands()
  chaChaCha()
else
  showIt()

date = if friday then sue else jill


================================================
FILE: documentation/examples/constructor_destructuring.coffee
================================================
class Person
  constructor: (options) ->
    {@name, @age, @height = 'average'} = options

tim = new Person name: 'Tim', age: 4


================================================
FILE: documentation/examples/default_args.coffee
================================================
fill = (container, liquid = "coffee") ->
  "Filling the #{container} with #{liquid}..."


================================================
FILE: documentation/examples/do.coffee
================================================
for filename in list
  do (filename) ->
    if filename not in ['.DS_Store', 'Thumbs.db', 'ehthumbs.db']
      fs.readFile filename, (err, contents) ->
        compile filename, contents.toString()


================================================
FILE: documentation/examples/dynamic_import.coffee
================================================
# Your browser must support dynamic import to run this example.

do ->
  { run } = await import('./browser-compiler-modern/coffeescript.js')
  run '''
    if 5 < new Date().getHours() < 9
      alert 'Time to make the coffee!'
    else
      alert 'Time to get some work done.'
  '''


================================================
FILE: documentation/examples/embedded.coffee
================================================
hi = `function() {
  return [document.title, "Hello JavaScript"].join(": ");
}`


================================================
FILE: documentation/examples/embedded_block.coffee
================================================
```
function time() {
  return `The time is ${new Date().toLocaleTimeString()}`;
}
```


================================================
FILE: documentation/examples/embedded_escaped.coffee
================================================
markdown = `function () {
  return \`In Markdown, write code like \\\`this\\\`\`;
}`


================================================
FILE: documentation/examples/existence.coffee
================================================
solipsism = true if mind? and not world?

speed = 0
speed ?= 15

footprints = yeti ? "bear"


================================================
FILE: documentation/examples/existence_declared.coffee
================================================
major = 'Computer Science'

unless major?
  signUpForClass 'Introduction to Wines'


================================================
FILE: documentation/examples/existence_undeclared.coffee
================================================
if window?
  environment = 'browser (probably)'


================================================
FILE: documentation/examples/expansion.coffee
================================================
text = "Every literary critic believes he will
        outwit history and have the last word"

[first, ..., last] = text.split " "


================================================
FILE: documentation/examples/expressions.coffee
================================================
grade = (student) ->
  if student.excellentWork
    "A+"
  else if student.okayStuff
    if student.triedHard then "B" else "B-"
  else
    "C"

eldest = if 24 > 21 then "Liz" else "Ike"


================================================
FILE: documentation/examples/expressions_assignment.coffee
================================================
six = (one = 1) + (two = 2) + (three = 3)


================================================
FILE: documentation/examples/expressions_comprehension.coffee
================================================
# The first ten global properties.

globals = (name for name of window)[0...10]


================================================
FILE: documentation/examples/expressions_try.coffee
================================================
alert(
  try
    nonexistent / undefined
  catch error
    "And the error is ... #{error}"
)


================================================
FILE: documentation/examples/fat_arrow.coffee
================================================
Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  $('.shopping_cart').on 'click', (event) =>
    @customer.purchase @cart


================================================
FILE: documentation/examples/functions.coffee
================================================
square = (x) -> x * x
cube   = (x) -> square(x) * x


================================================
FILE: documentation/examples/generator_iteration.coffee
================================================
fibonacci = ->
  [previous, current] = [1, 1]
  loop
    [previous, current] = [current, previous + current]
    yield current
  return

getFibonacciNumbers = (length) ->
  results = [1]
  for n from fibonacci()
    results.push n
    break if results.length is length
  results


================================================
FILE: documentation/examples/generators.coffee
================================================
perfectSquares = ->
  num = 0
  loop
    num += 1
    yield num * num
  return

window.ps or= perfectSquares()


================================================
FILE: documentation/examples/get_set.coffee
================================================
screen =
  width: 1200
  ratio: 16/9

Object.defineProperty screen, 'height',
  get: ->
    this.width / this.ratio
  set: (val) ->
    this.width = val * this.ratio


================================================
FILE: documentation/examples/heredocs.coffee
================================================
html = """
       
         cup of coffeescript
       
       """


================================================
FILE: documentation/examples/heregexes.coffee
================================================
NUMBER     = ///
  ^ 0b[01]+    |              # binary
  ^ 0o[0-7]+   |              # octal
  ^ 0x[\da-f]+ |              # hex
  ^ \d*\.?\d+ (?:e[+-]?\d+)?  # decimal
///i


================================================
FILE: documentation/examples/interpolation.coffee
================================================
author = "Wittgenstein"
quote  = "A picture is a fact. -- #{ author }"

sentence = "#{ 22 / 7 } is a decent approximation of π"


================================================
FILE: documentation/examples/jsx.coffee
================================================
renderStarRating = ({ rating, maxStars }) ->
  


================================================
FILE: documentation/examples/modules.coffee
================================================
import './local-file.js' # Must be the filename of the generated file
import 'package'

import _ from 'underscore'
import * as underscore from 'underscore'

import { now } from 'underscore'
import { now as currentTimestamp } from 'underscore'
import { first, last } from 'underscore'
import utilityBelt, { each } from 'underscore'

import dates from './calendar.json' assert { type: 'json' }

export default Math
export square = (x) -> x * x
export class Mathematics
  least: (x, y) -> if x < y then x else y

export { sqrt }
export { sqrt as squareRoot }
export { Mathematics as default, sqrt as squareRoot }

export * from 'underscore'
export { max, min } from 'underscore'
export { version } from './package.json' assert { type: 'json' }


================================================
FILE: documentation/examples/modulo.coffee
================================================
-7 % 5 == -2 # The remainder of 7 / 5
-7 %% 5 == 3 # n %% 5 is always between 0 and 4

tabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)


================================================
FILE: documentation/examples/multiple_return_values.coffee
================================================
weatherReport = (location) ->
  # Make an Ajax request to fetch the weather...
  [location, 72, "Mostly Sunny"]

[city, temp, forecast] = weatherReport "Berkeley, CA"


================================================
FILE: documentation/examples/object_comprehensions.coffee
================================================
yearsOld = max: 10, ida: 9, tim: 11

ages = for child, age of yearsOld
  "#{child} is #{age}"


================================================
FILE: documentation/examples/object_extraction.coffee
================================================
futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]

{sculptor} = futurists

{poet: {name, address: [street, city]}} = futurists


================================================
FILE: documentation/examples/object_spread.coffee
================================================
user =
  name: 'Werner Heisenberg'
  occupation: 'theoretical physicist'

currentUser = { user..., status: 'Uncertain' }


================================================
FILE: documentation/examples/objects_and_arrays.coffee
================================================
song = ["do", "re", "mi", "fa", "so"]

singers = {Jagger: "Rock", Elvis: "Roll"}

bitlist = [
  1, 0, 1
  0, 0, 1
  1, 1, 0
]

kids =
  brother:
    name: "Max"
    age:  11
  sister:
    name: "Ida"
    age:  9


================================================
FILE: documentation/examples/objects_reserved.coffee
================================================
$('.account').prop class: 'active'

log object.class


================================================
FILE: documentation/examples/objects_shorthand.coffee
================================================
name = "Michelangelo"
mask = "orange"
weapon = "nunchuks"
turtle = {name, mask, weapon}
output = "#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!"


================================================
FILE: documentation/examples/overview.coffee
================================================
# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

# Arrays:
list = [1, 2, 3, 4, 5]

# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# Existence:
alert "I knew it!" if elvis?

# Array comprehensions:
cubes = (math.cube num for num in list)


================================================
FILE: documentation/examples/parallel_assignment.coffee
================================================
theBait   = 1000
theSwitch = 0

[theBait, theSwitch] = [theSwitch, theBait]


================================================
FILE: documentation/examples/patterns_and_splats.coffee
================================================
tag = ""

[open, contents..., close] = tag.split("")


================================================
FILE: documentation/examples/prototypes.coffee
================================================
String::dasherize = ->
  this.replace /_/g, "-"


================================================
FILE: documentation/examples/range_comprehensions.coffee
================================================
countdown = (num for num in [10..1])


================================================
FILE: documentation/examples/scope.coffee
================================================
outer = 1
changeNumbers = ->
  inner = -1
  outer = 10
inner = changeNumbers()


================================================
FILE: documentation/examples/slices.coffee
================================================
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

start   = numbers[0..2]

middle  = numbers[3...-2]

end     = numbers[-2..]

copy    = numbers[..]


================================================
FILE: documentation/examples/soaks.coffee
================================================
zip = lottery.drawWinner?().address?.zipcode


================================================
FILE: documentation/examples/splats.coffee
================================================
gold = silver = rest = "unknown"

awardMedals = (first, second, others...) ->
  gold   = first
  silver = second
  rest   = others

contenders = [
  "Michael Phelps"
  "Liu Xiang"
  "Yao Ming"
  "Allyson Felix"
  "Shawn Johnson"
  "Roman Sebrle"
  "Guo Jingjing"
  "Tyson Gay"
  "Asafa Powell"
  "Usain Bolt"
]

awardMedals contenders...

alert """
Gold: #{gold}
Silver: #{silver}
The Field: #{rest.join ', '}
"""


================================================
FILE: documentation/examples/splices.coffee
================================================
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

numbers[3..6] = [-3, -4, -5, -6]


================================================
FILE: documentation/examples/static.coffee
================================================
class Teenager
  @say: (speech) ->
    words = speech.split ' '
    fillers = ['uh', 'um', 'like', 'actually', 'so', 'maybe']
    output = []
    for word, index in words
      output.push word
      output.push fillers[Math.floor(Math.random() * fillers.length)] unless index is words.length - 1
    output.join ', '


================================================
FILE: documentation/examples/strings.coffee
================================================
mobyDick = "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..."


================================================
FILE: documentation/examples/switch.coffee
================================================
switch day
  when "Mon" then go work
  when "Tue" then go relax
  when "Thu" then go iceFishing
  when "Fri", "Sat"
    if day is bingoDay
      go bingo
      go dancing
  when "Sun" then go church
  else go work


================================================
FILE: documentation/examples/switch_with_no_expression.coffee
================================================
score = 76
grade = switch
  when score < 60 then 'F'
  when score < 70 then 'D'
  when score < 80 then 'C'
  when score < 90 then 'B'
  else 'A'
# grade == 'C'


================================================
FILE: documentation/examples/tagged_template_literals.coffee
================================================
upperCaseExpr = (textParts, expressions...) ->
  textParts.reduce (text, textPart, i) ->
    text + expressions[i - 1].toUpperCase() + textPart

greet = (name, adjective) ->
  upperCaseExpr"""
               Hi #{name}. You look #{adjective}!
               """


================================================
FILE: documentation/examples/try.coffee
================================================
try
  allHellBreaksLoose()
  catsAndDogsLivingTogether()
catch error
  print error
finally
  cleanUp()


================================================
FILE: documentation/examples/type_annotations.coffee
================================================
# @flow

###::
type Obj = {
  num: number,
};
###

fn = (str ###: string ###, obj ###: Obj ###) ###: string ### ->
  str + obj.num


================================================
FILE: documentation/examples/while.coffee
================================================
# Econ 101
if this.studyingEconomics
  buy()  while supply > demand
  sell() until supply > demand

# Nursery Rhyme
num = 6
lyrics = while num -= 1
  "#{num} little monkeys, jumping on the bed.
    One fell out and bumped his head."


================================================
FILE: documentation/sections/annotated_source.md
================================================
## Annotated Source

You can browse the CoffeeScript <%= fullVersion %> source in readable, annotated form [here](annotated-source/). You can also jump directly to a particular source file:

- [Grammar Rules — src/grammar](annotated-source/grammar.html)
- [Lexing Tokens — src/lexer](annotated-source/lexer.html)
- [The Rewriter — src/rewriter](annotated-source/rewriter.html)
- [The Syntax Tree — src/nodes](annotated-source/nodes.html)
- [Lexical Scope — src/scope](annotated-source/scope.html)
- [Helpers & Utility Functions — src/helpers](annotated-source/helpers.html)
- [The CoffeeScript Module — src/coffeescript](annotated-source/coffeescript.html)
- [Cake & Cakefiles — src/cake](annotated-source/cake.html)
- [“coffee” Command-Line Utility — src/command](annotated-source/command.html)
- [Option Parsing — src/optparse](annotated-source/optparse.html)
- [Interactive REPL — src/repl](annotated-source/repl.html)
- [Source Maps — src/sourcemap](annotated-source/sourcemap.html)


================================================
FILE: documentation/sections/announcing_coffeescript_2.md
================================================
# Announcing CoffeeScript 2

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:

- 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).
- 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.
- 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.

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. [Install now](../#installation): `npm install -g coffeescript@2`

## Modern JavaScript Output

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.

Many 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.

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):

- Modules: `import`/`export`
- Classes: `class Animal`
- Async functions: `await someFunction()`
- Bound/arrow functions: `=>`
- Function default parameters: `(options = {}) ->`
- Function splat/rest parameters: `(items...) ->`
- Destructuring, for both arrays and objects: `[first, second] = items`, `{length} = items`
- Object rest/spread properties: `{options..., force: yes}`, `{force, otherOptions...} = options`
- Interpolated strings/template literals (JS backticked strings): `"Hello, #{user}!"`
- Tagged template literals: `html"coffee"`
- JavaScript’s `for…of` is now available as CoffeeScript’s `for…from` (we already had a `for…of`): `for n from generatorFunction()`

Not 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.

In 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:

- In CoffeeScript 2, “bare” `super` (calling `super` without arguments) is now no longer allowed, and one must use `super()` or `super arguments...` instead.
- References to `this`/`@` cannot occur before a call to `super`, per the JS spec.

See 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.

## Other Features

Besides supporting new JavaScript features and outputting older CoffeeScript features in modern JS syntax, CoffeeScript 2 has added support for the following:

- [JSX](../#jsx)
- [Line comments](../#comments) are now output (in CoffeeScript 1 they were discarded)
- Block comments are now allowed anywhere, enabling [static type annotations](../#type-annotations) using Flow’s comment-based syntax

There 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.

## “What About …?”

A 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.

## Future Compatibility

Back 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.

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. `"Hello, #{name}!"` into `` `Hello, ${name}!` ``. This makes adding support for new JavaScript features much easier than before.

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 _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.

## Credits

The major features of 2.0.0 would not have been possible without the following people:

- [@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.
- [@connec](https://github.com/connec): Classes; destructuring; splats/rest syntax in arrays and function calls; and computed properties all output using ES2015 syntax.
- [@GabrielRatener](https://github.com/GabrielRatener): Async functions.
- [@xixixao](https://github.com/xixixao): JSX.
- [@zdenko](https://github.com/zdenko): Object rest/spread properties (object destructuring).
- [@greghuc](https://github.com/greghuc): Tagged template literals, interpolated strings output in ES2015 syntax.
- [@atg](https://github.com/atg): ES2015 `for…of`, supported as CoffeeScript’s `for…from`.
- [@lydell](https://github.com/lydell) and [@jashkenas](https://github.com/jashkenas): Guidance, code reviews and feedback.


See the full [honor roll](https://github.com/jashkenas/coffeescript/wiki/CoffeeScript-2-Honor-Roll).

Thanks and we hope you enjoy CoffeeScript 2!


================================================
FILE: documentation/sections/async_functions.md
================================================
## Async Functions

ES2017’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.

Similar to how `yield return` forces a generator, `await return` may be used to force a function to be async.

```
codeFor('async', true)
```


================================================
FILE: documentation/sections/books.md
================================================
## Books

There are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.

*   [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/).
*   [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).
*   [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.
*   [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).
*   [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/).
*   [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.
*   [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.
*   [CoffeeScript in Action](https://www.manning.com/books/coffeescript-in-action) from Manning Publications, covers CoffeeScript syntax, composition techniques and application development.
*   [CoffeeScript: Die Alternative zu JavaScript](https://www.dpunkt.de/buecher/4021/coffeescript.html) from dpunkt.verlag, is the first CoffeeScript book in Deutsch.


================================================
FILE: documentation/sections/breaking_changes.md
================================================
## Breaking Changes From CoffeeScript 1.x to 2

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.


================================================
FILE: documentation/sections/breaking_changes_argument_parsing_and_shebang_lines.md
================================================
### Argument parsing and shebang (`#!`) lines

In 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:

```bash
coffee [options] path/to/script.coffee -- [args]
```

Now you would just type:

```bash
coffee [options] path/to/script.coffee [args]
```

The deprecated version will still work, but it will print a warning before running the script.

On 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:

```coffee
#!/usr/bin/env coffee

x = 2 + 2
console.log x
```

If this were saved as `executable.coffee`, it could be made executable and run:

```bash
▶ chmod +x ./executable.coffee
▶ ./executable.coffee
4
```

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 `#!/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`.

================================================
FILE: documentation/sections/breaking_changes_bound_generator_functions.md
================================================
### Bound generator functions

Bound 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:

```coffee
f = => yield this
# Throws a compiler error
```

Needs to be rewritten the old-fashioned way:

```
codeFor('breaking_change_bound_generator_function')
```


================================================
FILE: documentation/sections/breaking_changes_classes.md
================================================
### Classes are compiled to ES2015 classes

ES2015 classes and their methods have some restrictions beyond those on regular functions.

Class constructors can’t be invoked without `new`:

```coffee
(class)()
# Throws a TypeError at runtime
```

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:

```coffee
class Base
  constructor: ->
    @onClick()      # This works
    clickHandler = @onClick
    clickHandler()  # This throws a runtime error

class Component extends Base
  onClick: =>
    console.log 'Clicked!', @
```

Class methods can’t be used with `new` (uncommon):

```coffee
class Namespace
  @Klass = ->
new Namespace.Klass  # Throws a TypeError at runtime
```

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.

```coffee
class A
  name = 'method'
  "#{name}": ->   # This method will be named 'undefined'
  @::[name] = ->  # This will work; assigns to `A.prototype.method`
```


================================================
FILE: documentation/sections/breaking_changes_default_values.md
================================================
### Default values for function parameters and destructured elements

Per 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`.

```
codeFor('breaking_change_function_parameter_default_values', 'f(null)')
```

```
codeFor('breaking_change_destructuring_default_values', 'a')
```


================================================
FILE: documentation/sections/breaking_changes_fat_arrow.md
================================================
### Bound (fat arrow) functions

In 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:

```
codeFor('breaking_change_fat_arrow', 'outer(1, 2)')
```

================================================
FILE: documentation/sections/breaking_changes_jsx_and_the_less_than_and_greater_than_operators.md
================================================
### JSX and the `<` and `>` operators

With 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 `
`. For best results, in general you should always wrap the operators in spaces to distinguish them from XML tags: `i < len`, not `i super # Throws a compiler error ``` Arguments can be forwarded explicitly using splats: ``` codeFor('breaking_change_super_with_arguments') ``` Or if you know that the parent function doesn’t require arguments, just call `super()`: ``` codeFor('breaking_change_super_without_arguments') ``` CoffeeScript 1.x allowed the `extends` keyword to set up prototypal inheritance between functions, and `super` could be used manually prototype-assigned functions: ```coffee A = -> B = -> B extends A B.prototype.foo = -> super arguments... # Last two lines each throw compiler errors in CoffeeScript 2 ``` Due 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: ``` codeFor('breaking_change_super_in_non-class_methods_refactor_with_apply') ``` or ``` codeFor('breaking_change_super_in_non-class_methods_refactor_with_class') ``` ================================================ FILE: documentation/sections/breaking_changes_super_this.md ================================================ ### `super` and `this` In the constructor of a derived class (a class that `extends` another class), `this` cannot be used before calling `super`: ```coffee class B extends A constructor: -> this # Throws a compiler error ``` This also means you cannot pass a reference to `this` as an argument to `super` in the constructor of a derived class: ```coffee class B extends A constructor: (@arg) -> super @arg # Throws a compiler error ``` This is a limitation of ES2015 classes. As a workaround, assign to `this` after the `super` call: ``` codeFor('breaking_change_super_this') ``` ================================================ FILE: documentation/sections/cake.md ================================================ ## Cake, and Cakefiles CoffeeScript 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`. 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 `options` object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser: ``` codeFor('cake_tasks') ``` If 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. ================================================ FILE: documentation/sections/chaining.md ================================================ ## Chaining Function Calls Leading `.` closes all open calls, allowing for simpler chaining syntax. ``` codeFor('chaining') ``` ================================================ FILE: documentation/sections/changelog/0.1.0.md ================================================ ``` releaseHeader('2009-12-24', '0.1.0', '8e9d637985d2dc9b44922076ad54ffef7fa8e9c2') ``` Initial CoffeeScript release. ================================================ FILE: documentation/sections/changelog/0.1.1.md ================================================ ``` releaseHeader('2009-12-24', '0.1.1', '0.1.0') ``` Added `instanceof` and `typeof` as operators. ================================================ FILE: documentation/sections/changelog/0.1.2.md ================================================ ``` releaseHeader('2009-12-24', '0.1.2', '0.1.1') ``` Fixed 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. ================================================ FILE: documentation/sections/changelog/0.1.3.md ================================================ ``` releaseHeader('2009-12-25', '0.1.3', '0.1.2') ``` The `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. ================================================ FILE: documentation/sections/changelog/0.1.4.md ================================================ ``` releaseHeader('2009-12-25', '0.1.4', '0.1.3') ``` The 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. ================================================ FILE: documentation/sections/changelog/0.1.5.md ================================================ ``` releaseHeader('2009-12-26', '0.1.5', '0.1.4') ``` 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 `\` to escape newlines. The `coffeescript` command is now called `coffee`. ================================================ FILE: documentation/sections/changelog/0.1.6.md ================================================ ``` releaseHeader('2009-12-27', '0.1.6', '0.1.5') ``` Bugfix for running `coffee --interactive` and `--run` from outside of the CoffeeScript directory. Bugfix for nested function/if-statements. ================================================ FILE: documentation/sections/changelog/0.2.0.md ================================================ ``` releaseHeader('2010-01-05', '0.2.0', '0.1.6') ``` 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 [Liam O’Connor-Davis](https://github.com/liamoc) for whitespace and expression help. ================================================ FILE: documentation/sections/changelog/0.2.1.md ================================================ ``` releaseHeader('2010-01-05', '0.2.1', '0.2.0') ``` Arguments objects are now converted into real arrays when referenced. ================================================ FILE: documentation/sections/changelog/0.2.2.md ================================================ ``` releaseHeader('2010-01-10', '0.2.2', '0.2.1') ``` When performing a comprehension over an object, use `ino`, instead of `in`, which helps us generate smaller, more efficient code at compile time. Added `::` as a shorthand for saying `.prototype.` The “splat” symbol has been changed from a prefix asterisk `*`, to a postfix ellipsis `...` Added JavaScript’s `in` operator, empty `return` statements, and empty `while` loops. Constructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned. The `extends` keyword now functions identically to `goog.inherits` in Google’s Closure Library. ================================================ FILE: documentation/sections/changelog/0.2.3.md ================================================ ``` releaseHeader('2010-01-11', '0.2.3', '0.2.2') ``` Axed the unsatisfactory `ino` keyword, replacing it with `of` for object comprehensions. They now look like: `for prop, value of object`. ================================================ FILE: documentation/sections/changelog/0.2.4.md ================================================ ``` releaseHeader('2010-01-12', '0.2.4', '0.2.3') ``` 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. ================================================ FILE: documentation/sections/changelog/0.2.5.md ================================================ ``` releaseHeader('2010-01-13', '0.2.5', '0.2.4') ``` 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 `==>`, 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. ================================================ FILE: documentation/sections/changelog/0.2.6.md ================================================ ``` releaseHeader('2010-01-17', '0.2.6', '0.2.5') ``` Added 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. ================================================ FILE: documentation/sections/changelog/0.3.0.md ================================================ ``` releaseHeader('2010-01-26', '0.3.0', '0.2.6') ``` CoffeeScript 0.3 includes major syntax changes: The function symbol was changed to `->`, and the bound function symbol is now `=>`. Parameter lists in function definitions must now be wrapped in parentheses. Added property soaking, with the `?.` operator. Made parentheses optional, when invoking functions with arguments. Removed the obsolete block literal syntax. ================================================ FILE: documentation/sections/changelog/0.3.2.md ================================================ ``` releaseHeader('2010-02-08', '0.3.2', '0.3.0') ``` `@property` is now a shorthand for `this.property`. Switched the default JavaScript engine from Narwhal to Node.js. Pass the `--narwhal` flag if you’d like to continue using it. ================================================ FILE: documentation/sections/changelog/0.5.0.md ================================================ ``` releaseHeader('2010-02-21', '0.5.0', '0.3.2') ``` 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. ================================================ FILE: documentation/sections/changelog/0.5.1.md ================================================ ``` releaseHeader('2010-02-24', '0.5.1', '0.5.0') ``` Improvements 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. ================================================ FILE: documentation/sections/changelog/0.5.2.md ================================================ ``` releaseHeader('2010-02-25', '0.5.2', '0.5.1') ``` Added a compressed version of the compiler for inclusion in web pages as `/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. ================================================ FILE: documentation/sections/changelog/0.5.3.md ================================================ ``` releaseHeader('2010-02-27', '0.5.3', '0.5.2') ``` CoffeeScript 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. ================================================ FILE: documentation/sections/changelog/0.5.4.md ================================================ ``` releaseHeader('2010-03-03', '0.5.4', '0.5.3') ``` Bugfix 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. ================================================ FILE: documentation/sections/changelog/0.5.5.md ================================================ ``` releaseHeader('2010-03-08', '0.5.5', '0.5.4') ``` String 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. ================================================ FILE: documentation/sections/changelog/0.5.6.md ================================================ ``` releaseHeader('2010-03-23', '0.5.6', '0.5.5') ``` Interpolation 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. ================================================ FILE: documentation/sections/changelog/0.6.0.md ================================================ ``` releaseHeader('2010-04-03', '0.6.0', '0.5.6') ``` Trailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using `@property` notation. ================================================ FILE: documentation/sections/changelog/0.6.1.md ================================================ ``` releaseHeader('2010-04-12', '0.6.1', '0.6.0') ``` Upgraded CoffeeScript for compatibility with the new Node.js **v0.1.90** series. ================================================ FILE: documentation/sections/changelog/0.6.2.md ================================================ ``` releaseHeader('2010-05-15', '0.6.2', '0.6.1') ``` The `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**. ================================================ FILE: documentation/sections/changelog/0.7.0.md ================================================ ``` releaseHeader('2010-06-28', '0.7.0', '0.6.2') ``` 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 `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. ================================================ FILE: documentation/sections/changelog/0.7.1.md ================================================ ``` releaseHeader('2010-07-11', '0.7.1', '0.7.0') ``` 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. ================================================ FILE: documentation/sections/changelog/0.7.2.md ================================================ ``` releaseHeader('2010-07-12', '0.7.2', '0.7.1') ``` Quick bugfix (right after 0.7.1) for a problem that prevented `coffee` command-line options from being parsed in some circumstances. ================================================ FILE: documentation/sections/changelog/0.9.0.md ================================================ ``` releaseHeader('2010-08-04', '0.9.0', '0.7.2') ``` The 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. ================================================ FILE: documentation/sections/changelog/0.9.1.md ================================================ ``` releaseHeader('2010-08-11', '0.9.1', '0.9.0') ``` Bugfix 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. ================================================ FILE: documentation/sections/changelog/0.9.2.md ================================================ ``` releaseHeader('2010-08-23', '0.9.2', '0.9.1') ``` Specifying 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. ================================================ FILE: documentation/sections/changelog/0.9.3.md ================================================ ``` releaseHeader('2010-09-16', '0.9.3', '0.9.2') ``` CoffeeScript `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. ================================================ FILE: documentation/sections/changelog/0.9.4.md ================================================ ``` releaseHeader('2010-09-21', '0.9.4', '0.9.3') ``` CoffeeScript 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. ================================================ FILE: documentation/sections/changelog/0.9.5.md ================================================ ``` releaseHeader('2010-11-21', '0.9.5', '0.9.4') ``` 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 **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` used to parse as `result = (i for i in list)` by default … it now parses as `(result = i) for i in list`. ================================================ FILE: documentation/sections/changelog/0.9.6.md ================================================ ``` releaseHeader('2010-12-06', '0.9.6', '0.9.5') ``` The 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. ================================================ FILE: documentation/sections/changelog/1.0.0.md ================================================ ``` releaseHeader('2010-12-24', '1.0.0', '0.9.6') ``` CoffeeScript 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. ================================================ FILE: documentation/sections/changelog/1.0.1.md ================================================ ``` releaseHeader('2011-01-31', '1.0.1', '1.0.0') ``` 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 `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. ================================================ FILE: documentation/sections/changelog/1.1.0.md ================================================ ``` releaseHeader('2011-05-01', '1.1.0', '1.0.1') ``` When 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. ================================================ FILE: documentation/sections/changelog/1.1.1.md ================================================ ``` releaseHeader('2011-05-10', '1.1.1', '1.1.0') ``` Bugfix release for classes with external constructor functions, see issue #1182. ================================================ FILE: documentation/sections/changelog/1.1.2.md ================================================ ``` releaseHeader('2011-08-04', '1.1.2', '1.1.1') ``` Fixes 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. ================================================ FILE: documentation/sections/changelog/1.1.3.md ================================================ ``` releaseHeader('2011-11-08', '1.1.3', '1.1.2') ``` * 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. * You can now call `super` in class level methods in class bodies, and bound class methods now preserve their correct context. * 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`. * 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')` * There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script. * The `coffee --watch` feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows. * 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)**. ================================================ FILE: documentation/sections/changelog/1.10.0.md ================================================ ``` releaseHeader('2015-09-03', '1.10.0', '1.9.3') ``` * CoffeeScript now supports ES2015-style destructuring defaults. * `(offsetHeight: height) ->` no longer compiles. That syntax was accidental and partly broken. Use `({offsetHeight: height}) ->` instead. Object destructuring always requires braces. * Several minor bug fixes, including: * A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier. * A problem with multiple JS contexts in the jest test framework. * An error in io.js where strict mode is set on internal modules. * A variable name clash for the caught error in `catch` blocks. ================================================ FILE: documentation/sections/changelog/1.11.0.md ================================================ ``` releaseHeader('2016-09-24', '1.11.0', '1.10.0') ``` * CoffeeScript now supports ES2015 [`import` and `export` syntax](#modules). * 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. * A bunch of fixes for `yield`: * `yield return` can no longer mistakenly be used as an expression. * `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: ``` doubles = -> yield for i in [1..3] i * 2 six = -> yield 2 * 3 ``` * The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around `yield` no longer present. * `&&=`, `||=`, `and=` and `or=` no longer accidentally allow a space before the equals sign. * Improved several error messages. * Just like `undefined` compiles to `void 0`, `NaN` now compiles into `0/0` and `Infinity` into `2e308`. * Bugfix for renamed destructured parameters with defaults. `({a: b = 1}) ->` no longer crashes the compiler. * 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. * Several minor bug fixes, including: * The caught error in `catch` blocks is no longer declared unnecessarily, and no longer mistakenly named `undefined` for `catch`-less `try` blocks. * Unassignable parameter destructuring no longer crashes the compiler. * Source maps are now used correctly for errors thrown from .coffee.md files. * `coffee -e 'throw null'` no longer crashes. * The REPL no longer crashes when using `.exit` to exit it. * Invalid JavaScript is no longer output when lots of `for` loops are used in the same scope. * A unicode issue when using stdin with the CLI. ================================================ FILE: documentation/sections/changelog/1.11.1.md ================================================ ``` releaseHeader('2016-10-02', '1.11.1', '1.11.0') ``` * Bugfix for shorthand object syntax after interpolated keys. * Bugfix for indentation-stripping in `"""` strings. * Bugfix for not being able to use the name “arguments” for a prototype property of class. * Correctly compile large hexadecimal numbers literals to `2e308` (just like all other large number literals do). ================================================ FILE: documentation/sections/changelog/1.12.0.md ================================================ ``` releaseHeader('2016-12-04', '1.12.0', '1.11.1') ``` * 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. * 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. * 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. * Within single-backtick embedded JavaScript, backticks can now be escaped via `` \`​``. * 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. * CoffeeScript-only keywords in ES2015 `import`s and `export`s are now ignored. * The compiler now throws an error on trying to export an anonymous class. * Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools. ================================================ FILE: documentation/sections/changelog/1.12.1.md ================================================ ``` releaseHeader('2016-12-07', '1.12.1', '1.12.0') ``` * 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). * 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. ================================================ FILE: documentation/sections/changelog/1.12.2.md ================================================ ``` releaseHeader('2016-12-16', '1.12.2', '1.12.1') ``` * The browser compiler can once again be built unminified via `MINIFY=false cake build:browser`. * The error-prone patched version of `Error.prepareStackTrace` has been removed. * Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+. * The [browser-based tests](/v<%= majorVersion %>/test.html) now include all the tests as the Node-based version. ================================================ FILE: documentation/sections/changelog/1.12.3.md ================================================ ``` releaseHeader('2017-01-24', '1.12.3', '1.12.2') ``` * `@` 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`. * 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. * The `//=` operator’s output now wraps parentheses around the right operand, like the other assignment operators. ================================================ FILE: documentation/sections/changelog/1.12.4.md ================================================ ``` releaseHeader('2017-02-18', '1.12.4', '1.12.3') ``` * 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. * Fixed a bug where `export`ing a referenced variable was preventing the variable from being declared. * Fixed a bug where the `coffee` command wasn’t working for a `.litcoffee` file. * Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools. ================================================ FILE: documentation/sections/changelog/1.12.5.md ================================================ ``` releaseHeader('2017-04-10', '1.12.5', '1.12.4') ``` * 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. * Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler. ================================================ FILE: documentation/sections/changelog/1.12.6.md ================================================ ``` releaseHeader('2017-05-15', '1.12.6', '1.12.5') ``` * The `return` and `export` keywords can now accept implicit objects (defined by indentation, without needing braces). * Support Unicode code point escapes (e.g. `\u{1F4A9}`). * 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.) * Bugfixes for chained function calls not closing implicit objects or ternaries. * Bugfixes for incorrect code generated by the `?` operator within a termary `if` statement. * Fixed some tests, and failing tests now result in a nonzero exit code. ================================================ FILE: documentation/sections/changelog/1.12.7.md ================================================ ``` releaseHeader('2017-07-16', '1.12.7', '1.12.6') ``` * Fix regressions in 1.12.6 related to chained function calls and indented `return` and `throw` arguments. * The REPL no longer warns about assigning to `_`. ================================================ FILE: documentation/sections/changelog/1.2.0.md ================================================ ``` releaseHeader('2011-12-18', '1.2.0', '1.1.3') ``` * 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. * The `throw` statement can now be used as part of an expression. * Block comments at the top of the file will now appear outside of the safety closure wrapper. * 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`. ================================================ FILE: documentation/sections/changelog/1.3.1.md ================================================ ``` releaseHeader('2012-04-10', '1.3.1', '1.2.0') ``` * 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). * 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. * CoffeeScript now prints a `Generated by CoffeeScript VERSION` header at the top of each compiled file. * Conditional assignment of previously undefined variables `a or= b` is now considered a syntax error. * A tweak to the semantics of `do`, which can now be used to more easily simulate a namespace: `do (x = 1, y = 2) -> …` * Loop indices are now mutable within a loop iteration, and immutable between them. * Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list. * 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. ================================================ FILE: documentation/sections/changelog/1.3.3.md ================================================ ``` releaseHeader('2012-05-15', '1.3.3', '1.3.1') ``` * 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. * Inside of a nested function inside of an instance method, it’s now possible to call `super` more reliably (walks recursively up). * Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643) * Fix for splats nested within the LHS of destructuring assignment. * Corrections to our compile time strict mode forbidding of octal literals. ================================================ FILE: documentation/sections/changelog/1.4.0.md ================================================ ``` releaseHeader('2012-10-23', '1.4.0', '1.3.3') ``` * The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files. * Fix Node/compiler deprecation warnings by removing `registerExtension`, and moving from `path.exists` to `fs.exists`. * Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals. ================================================ FILE: documentation/sections/changelog/1.5.0.md ================================================ ``` releaseHeader('2013-02-25', '1.5.0', '1.4.0') ``` * First release of [Literate CoffeeScript](#literate). * The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly. * Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor. * You can now loop over an array backwards, without having to manually deal with the indexes: `for item in list by -1` * Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted. ================================================ FILE: documentation/sections/changelog/1.6.1.md ================================================ ``` releaseHeader('2013-03-05', '1.6.1', '1.5.0') ``` * 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). * 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. * `.coffee.md` is now also supported as a Literate CoffeeScript file extension, for existing tooling. `.litcoffee` remains the canonical one. * Several minor fixes surrounding member properties, bound methods and `super` in class declarations. ================================================ FILE: documentation/sections/changelog/1.6.2.md ================================================ ``` releaseHeader('2013-03-18', '1.6.2', '1.6.1') ``` * 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). * Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time. * Fixes for **1.6.x** regressions with overriding inherited bound functions, and for Windows file path management. * The `coffee` command can now correctly `fork()` both `.coffee` and `.js` files. (Requires Node.js 0.9+) ================================================ FILE: documentation/sections/changelog/1.6.3.md ================================================ ``` releaseHeader('2013-06-02', '1.6.3', '1.6.2') ``` * The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should. * You can now use `require` in Node to load `.coffee.md` Literate CoffeeScript files. In the browser, `text/literate-coffeescript` script tags. * 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**. * Bugfixes for Windows path separators, `catch` without naming the error, and executable-class-bodies-with- prototypal-property-attachment. ================================================ FILE: documentation/sections/changelog/1.7.0.md ================================================ ``` releaseHeader('2014-01-28', '1.7.0', '1.6.3') ``` * 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**. * Improved error messages, source maps and stack traces. Source maps now use the updated `//#` syntax. * Leading `.` now closes all open calls, allowing for simpler chaining syntax. * Added `**`, `//` and `%%` operators and `...` expansion in parameter lists and destructuring expressions. * 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. * Closing brackets can now be indented and therefore no longer cause unexpected error. * 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. * Formatting of compiled block comments has been improved. * No more `-p` folders on Windows. * The `options` object passed to CoffeeScript is no longer mutated. ================================================ FILE: documentation/sections/changelog/1.7.1.md ================================================ ``` releaseHeader('2014-01-29', '1.7.1', '1.7.0') ``` * Fixed a typo that broke node module lookup when running a script directly with the `coffee` binary. ================================================ FILE: documentation/sections/changelog/1.8.0.md ================================================ ``` releaseHeader('2014-08-26', '1.8.0', '1.7.1') ``` * The `--join` option of the CLI is now deprecated. * Source maps now use `.js.map` as file extension, instead of just `.map`. * The CLI now exits with the exit code 1 when it fails to write a file to disk. * The compiler no longer crashes on unterminated, single-quoted strings. * Fixed location data for string interpolations, which made source maps out of sync. * The error marker in error messages is now correctly positioned if the code is indented with tabs. * Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces. * The `%%` operator now coerces its right operand only once. * It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first. * The CoffeeScript REPL is now exported and can be required using `require 'coffeescript/repl'`. * Fixes for the REPL in Node 0.11. ================================================ FILE: documentation/sections/changelog/1.9.0.md ================================================ ``` releaseHeader('2015-01-29', '1.9.0', '1.8.0') ``` * CoffeeScript now supports ES2015 generators. A generator is simply a function that `yield`s. * More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation. * 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. * Fixed REPL compatibility with latest versions of Node and Io.js. * Various minor bug fixes. ================================================ FILE: documentation/sections/changelog/1.9.1.md ================================================ ``` releaseHeader('2015-02-18', '1.9.1', '1.9.0') ``` * Interpolation now works in object literal keys (again). You can use this to dynamically name properties. * 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. * Fixed a few `yield`-related edge cases with `yield return` and `yield throw`. * Minor bug fixes and various improvements to compiler error messages. ================================================ FILE: documentation/sections/changelog/1.9.2.md ================================================ ``` releaseHeader('2015-04-15', '1.9.2', '1.9.1') ``` * Fixed a **watch** mode error introduced in 1.9.1 when compiling multiple files with the same filename. * Bugfix for `yield` around expressions containing `this`. * Added a Ruby-style `-r` option to the REPL, which allows requiring a module before execution with `--eval` or `--interactive`. * In ` ================================================ FILE: documentation/site/sidebar.html ================================================ ================================================ FILE: documentation/site/styles.html ================================================ ================================================ FILE: documentation/site/test.html ================================================ CoffeeScript Test Suite

CoffeeScript Test Suite





<%= tests %>







================================================
FILE: documentation/site/try.html
================================================



================================================
FILE: lib/coffeescript/browser.js
================================================
// Generated by CoffeeScript 2.7.0
(function() {
  // This **Browser** compatibility layer extends core CoffeeScript functions
  // to make things work smoothly when compiling code directly in the browser.
  // We add support for loading remote Coffee scripts via **XHR**, and
  // `text/coffeescript` script tags, source maps via data-URLs, and so on.
  var CoffeeScript, compile,
    indexOf = [].indexOf;

  CoffeeScript = require('./coffeescript');

  ({compile} = CoffeeScript);

  // Use `window.eval` to evaluate code, rather than just `eval`, to run the
  // script in a clean global scope rather than inheriting the scope of the
  // CoffeeScript compiler. (So that `cake test:browser` also works in Node,
  // use either `window.eval` or `global.eval` as appropriate).
  CoffeeScript.eval = function(code, options = {}) {
    var globalRoot;
    if (options.bare == null) {
      options.bare = true;
    }
    globalRoot = typeof window !== "undefined" && window !== null ? window : global;
    return globalRoot['eval'](compile(code, options));
  };

  // Running code does not provide access to this scope.
  CoffeeScript.run = function(code, options = {}) {
    options.bare = true;
    options.shiftLine = true;
    return Function(compile(code, options))();
  };

  // Export this more limited `CoffeeScript` than what is exported by
  // `index.coffee`, which is intended for a Node environment.
  module.exports = CoffeeScript;

  // If we’re not in a browser environment, we’re finished with the public API.
  if (typeof window === "undefined" || window === null) {
    return;
  }

  // Include source maps where possible. If we’ve got a base64 encoder, a
  // JSON serializer, and tools for escaping unicode characters, we’re good to go.
  // Ported from https://developer.mozilla.org/en-US/docs/DOM/window.btoa
  if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) {
    compile = function(code, options = {}) {
      options.inlineMap = true;
      return CoffeeScript.compile(code, options);
    };
  }

  // Load a remote script from the current domain via XHR.
  CoffeeScript.load = function(url, callback, options = {}, hold = false) {
    var xhr;
    options.sourceFiles = [url];
    xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest();
    xhr.open('GET', url, true);
    if ('overrideMimeType' in xhr) {
      xhr.overrideMimeType('text/plain');
    }
    xhr.onreadystatechange = function() {
      var param, ref;
      if (xhr.readyState === 4) {
        if ((ref = xhr.status) === 0 || ref === 200) {
          param = [xhr.responseText, options];
          if (!hold) {
            CoffeeScript.run(...param);
          }
        } else {
          throw new Error(`Could not load ${url}`);
        }
        if (callback) {
          return callback(param);
        }
      }
    };
    return xhr.send(null);
  };

  // Activate CoffeeScript in the browser by having it compile and evaluate
  // all script tags with a content-type of `text/coffeescript`.
  // This happens on page load.
  CoffeeScript.runScripts = function() {
    var coffees, coffeetypes, execute, i, index, j, len, s, script, scripts;
    scripts = window.document.getElementsByTagName('script');
    coffeetypes = ['text/coffeescript', 'text/literate-coffeescript'];
    coffees = (function() {
      var j, len, ref, results;
      results = [];
      for (j = 0, len = scripts.length; j < len; j++) {
        s = scripts[j];
        if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) {
          results.push(s);
        }
      }
      return results;
    })();
    index = 0;
    execute = function() {
      var param;
      param = coffees[index];
      if (param instanceof Array) {
        CoffeeScript.run(...param);
        index++;
        return execute();
      }
    };
    for (i = j = 0, len = coffees.length; j < len; i = ++j) {
      script = coffees[i];
      (function(script, i) {
        var options, source;
        options = {
          literate: script.type === coffeetypes[1]
        };
        source = script.src || script.getAttribute('data-src');
        if (source) {
          options.filename = source;
          return CoffeeScript.load(source, function(param) {
            coffees[i] = param;
            return execute();
          }, options, true);
        } else {
          // `options.filename` defines the filename the source map appears as
          // in Developer Tools. If a script tag has an `id`, use that as the
          // filename; otherwise use `coffeescript`, or `coffeescript1` etc.,
          // leaving the first one unnumbered for the common case that there’s
          // only one CoffeeScript script block to parse.
          options.filename = script.id && script.id !== '' ? script.id : `coffeescript${i !== 0 ? i : ''}`;
          options.sourceFiles = ['embedded'];
          return coffees[i] = [script.innerHTML, options];
        }
      })(script, i);
    }
    return execute();
  };

  // Listen for window load, both in decent browsers and in IE.
  // Only attach this event handler on startup for the
  // non-ES module version of the browser compiler, to preserve
  // backward compatibility while letting the ES module version
  // be importable without side effects.
  if (this === window) {
    if (window.addEventListener) {
      window.addEventListener('DOMContentLoaded', CoffeeScript.runScripts, false);
    } else {
      window.attachEvent('onload', CoffeeScript.runScripts);
    }
  }

}).call(this);


================================================
FILE: lib/coffeescript/cake.js
================================================
// Generated by CoffeeScript 2.7.0
(function() {
  // `cake` is a simplified version of [Make](http://www.gnu.org/software/make/)
  // ([Rake](http://rake.rubyforge.org/), [Jake](https://github.com/280north/jake))
  // for CoffeeScript. You define tasks with names and descriptions in a Cakefile,
  // and can call them from the command line, or invoke them from other tasks.

  // Running `cake` with no arguments will print out a list of all the tasks in the
  // current directory's Cakefile.

  // External dependencies.
  var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;

  fs = require('fs');

  path = require('path');

  helpers = require('./helpers');

  optparse = require('./optparse');

  CoffeeScript = require('./');

  // Register .coffee extension
  CoffeeScript.register();

  // Keep track of the list of defined tasks, the accepted options, and so on.
  tasks = {};

  options = {};

  switches = [];

  oparse = null;

  // Mixin the top-level Cake functions for Cakefiles to use directly.
  helpers.extend(global, {
    // Define a Cake task with a short name, an optional sentence description,
    // and the function to run as the action itself.
    task: function(name, description, action) {
      if (!action) {
        [action, description] = [description, action];
      }
      return tasks[name] = {name, description, action};
    },
    // Define an option that the Cakefile accepts. The parsed options hash,
    // containing all of the command-line options passed, will be made available
    // as the first argument to the action.
    option: function(letter, flag, description) {
      return switches.push([letter, flag, description]);
    },
    // Invoke another task in the current Cakefile.
    invoke: function(name) {
      if (!tasks[name]) {
        missingTask(name);
      }
      return tasks[name].action(options);
    }
  });

  // Run `cake`. Executes all of the tasks you pass, in order. Note that Node's
  // asynchrony may cause tasks to execute in a different order than you'd expect.
  // If no tasks are passed, print the help screen. Keep a reference to the
  // original directory name, when running Cake tasks from subdirectories.
  exports.run = function() {
    var arg, args, e, i, len, ref, results;
    global.__originalDirname = fs.realpathSync('.');
    process.chdir(cakefileDirectory(__originalDirname));
    args = process.argv.slice(2);
    CoffeeScript.run(fs.readFileSync('Cakefile').toString(), {
      filename: 'Cakefile'
    });
    oparse = new optparse.OptionParser(switches);
    if (!args.length) {
      return printTasks();
    }
    try {
      options = oparse.parse(args);
    } catch (error) {
      e = error;
      return fatalError(`${e}`);
    }
    ref = options.arguments;
    results = [];
    for (i = 0, len = ref.length; i < len; i++) {
      arg = ref[i];
      results.push(invoke(arg));
    }
    return results;
  };

  // Display the list of Cake tasks in a format similar to `rake -T`
  printTasks = function() {
    var cakefilePath, desc, name, relative, spaces, task;
    relative = path.relative || path.resolve;
    cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile');
    console.log(`${cakefilePath} defines the following tasks:\n`);
    for (name in tasks) {
      task = tasks[name];
      spaces = 20 - name.length;
      spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';
      desc = task.description ? `# ${task.description}` : '';
      console.log(`cake ${name}${spaces} ${desc}`);
    }
    if (switches.length) {
      return console.log(oparse.help());
    }
  };

  // Print an error and exit when attempting to use an invalid task/option.
  fatalError = function(message) {
    console.error(message + '\n');
    console.log('To see a list of all tasks/options, run "cake"');
    return process.exit(1);
  };

  missingTask = function(task) {
    return fatalError(`No such task: ${task}`);
  };

  // When `cake` is invoked, search in the current and all parent directories
  // to find the relevant Cakefile.
  cakefileDirectory = function(dir) {
    var parent;
    if (fs.existsSync(path.join(dir, 'Cakefile'))) {
      return dir;
    }
    parent = path.normalize(path.join(dir, '..'));
    if (parent !== dir) {
      return cakefileDirectory(parent);
    }
    throw new Error(`Cakefile not found in ${process.cwd()}`);
  };

}).call(this);


================================================
FILE: lib/coffeescript/coffeescript.js
================================================
// Generated by CoffeeScript 2.7.0
(function() {
  // CoffeeScript can be used both on the server, as a command-line compiler based
  // on Node.js/V8, or to run CoffeeScript directly in the browser. This module
  // contains the main entry functions for tokenizing, parsing, and compiling
  // source CoffeeScript into JavaScript.
  var FILE_EXTENSIONS, Lexer, SourceMap, base64encode, checkShebangLine, compile, getSourceMap, helpers, lexer, packageJson, parser, registerCompiled, withPrettyErrors;

  ({Lexer} = require('./lexer'));

  ({parser} = require('./parser'));

  helpers = require('./helpers');

  SourceMap = require('./sourcemap');

  // Require `package.json`, which is two levels above this file, as this file is
  // evaluated from `lib/coffeescript`.
  packageJson = require('../../package.json');

  // The current CoffeeScript version number.
  exports.VERSION = packageJson.version;

  exports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md'];

  // Expose helpers for testing.
  exports.helpers = helpers;

  ({getSourceMap, registerCompiled} = SourceMap);

  // This is exported to enable an external module to implement caching of
  // sourcemaps. This is used only when `patchStackTrace` has been called to adjust
  // stack traces for files with cached source maps.
  exports.registerCompiled = registerCompiled;

  // Function that allows for btoa in both nodejs and the browser.
  base64encode = function(src) {
    switch (false) {
      case typeof Buffer !== 'function':
        return Buffer.from(src).toString('base64');
      case typeof btoa !== 'function':
        // The contents of a `