wp/wp-includes/js/codemirror/jshint.js
changeset 7 cf61fcea0001
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 (function webpackUniversalModuleDefinition(root, factory) {
       
     2 /* istanbul ignore next */
       
     3 	if(typeof exports === 'object' && typeof module === 'object')
       
     4 		module.exports = factory();
       
     5 	else if(typeof define === 'function' && define.amd)
       
     6 		define([], factory);
       
     7 /* istanbul ignore next */
       
     8 	else if(typeof exports === 'object')
       
     9 		exports["esprima"] = factory();
       
    10 	else
       
    11 		root["esprima"] = factory();
       
    12 })(this, function() {
       
    13 return /******/ (function(modules) { // webpackBootstrap
       
    14 /******/ 	// The module cache
       
    15 /******/ 	var installedModules = {};
       
    16 
       
    17 /******/ 	// The require function
       
    18 /******/ 	function __webpack_require__(moduleId) {
       
    19 
       
    20 /******/ 		// Check if module is in cache
       
    21 /* istanbul ignore if */
       
    22 /******/ 		if(installedModules[moduleId])
       
    23 /******/ 			return installedModules[moduleId].exports;
       
    24 
       
    25 /******/ 		// Create a new module (and put it into the cache)
       
    26 /******/ 		var module = installedModules[moduleId] = {
       
    27 /******/ 			exports: {},
       
    28 /******/ 			id: moduleId,
       
    29 /******/ 			loaded: false
       
    30 /******/ 		};
       
    31 
       
    32 /******/ 		// Execute the module function
       
    33 /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
       
    34 
       
    35 /******/ 		// Flag the module as loaded
       
    36 /******/ 		module.loaded = true;
       
    37 
       
    38 /******/ 		// Return the exports of the module
       
    39 /******/ 		return module.exports;
       
    40 /******/ 	}
       
    41 
       
    42 
       
    43 /******/ 	// expose the modules object (__webpack_modules__)
       
    44 /******/ 	__webpack_require__.m = modules;
       
    45 
       
    46 /******/ 	// expose the module cache
       
    47 /******/ 	__webpack_require__.c = installedModules;
       
    48 
       
    49 /******/ 	// __webpack_public_path__
       
    50 /******/ 	__webpack_require__.p = "";
       
    51 
       
    52 /******/ 	// Load entry module and return exports
       
    53 /******/ 	return __webpack_require__(0);
       
    54 /******/ })
       
    55 /************************************************************************/
       
    56 /******/ ([
       
    57 /* 0 */
       
    58 /***/ function(module, exports, __webpack_require__) {
       
    59 
       
    60 	"use strict";
       
    61 	/*
       
    62 	  Copyright JS Foundation and other contributors, https://js.foundation/
       
    63 
       
    64 	  Redistribution and use in source and binary forms, with or without
       
    65 	  modification, are permitted provided that the following conditions are met:
       
    66 
       
    67 	    * Redistributions of source code must retain the above copyright
       
    68 	      notice, this list of conditions and the following disclaimer.
       
    69 	    * Redistributions in binary form must reproduce the above copyright
       
    70 	      notice, this list of conditions and the following disclaimer in the
       
    71 	      documentation and/or other materials provided with the distribution.
       
    72 
       
    73 	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
       
    74 	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    75 	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    76 	  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
       
    77 	  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
       
    78 	  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
       
    79 	  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
       
    80 	  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    81 	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
       
    82 	  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    83 	*/
       
    84 	Object.defineProperty(exports, "__esModule", { value: true });
       
    85 	var comment_handler_1 = __webpack_require__(1);
       
    86 	var jsx_parser_1 = __webpack_require__(3);
       
    87 	var parser_1 = __webpack_require__(8);
       
    88 	var tokenizer_1 = __webpack_require__(15);
       
    89 	function parse(code, options, delegate) {
       
    90 	    var commentHandler = null;
       
    91 	    var proxyDelegate = function (node, metadata) {
       
    92 	        if (delegate) {
       
    93 	            delegate(node, metadata);
       
    94 	        }
       
    95 	        if (commentHandler) {
       
    96 	            commentHandler.visit(node, metadata);
       
    97 	        }
       
    98 	    };
       
    99 	    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
       
   100 	    var collectComment = false;
       
   101 	    if (options) {
       
   102 	        collectComment = (typeof options.comment === 'boolean' && options.comment);
       
   103 	        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
       
   104 	        if (collectComment || attachComment) {
       
   105 	            commentHandler = new comment_handler_1.CommentHandler();
       
   106 	            commentHandler.attach = attachComment;
       
   107 	            options.comment = true;
       
   108 	            parserDelegate = proxyDelegate;
       
   109 	        }
       
   110 	    }
       
   111 	    var isModule = false;
       
   112 	    if (options && typeof options.sourceType === 'string') {
       
   113 	        isModule = (options.sourceType === 'module');
       
   114 	    }
       
   115 	    var parser;
       
   116 	    if (options && typeof options.jsx === 'boolean' && options.jsx) {
       
   117 	        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
       
   118 	    }
       
   119 	    else {
       
   120 	        parser = new parser_1.Parser(code, options, parserDelegate);
       
   121 	    }
       
   122 	    var program = isModule ? parser.parseModule() : parser.parseScript();
       
   123 	    var ast = program;
       
   124 	    if (collectComment && commentHandler) {
       
   125 	        ast.comments = commentHandler.comments;
       
   126 	    }
       
   127 	    if (parser.config.tokens) {
       
   128 	        ast.tokens = parser.tokens;
       
   129 	    }
       
   130 	    if (parser.config.tolerant) {
       
   131 	        ast.errors = parser.errorHandler.errors;
       
   132 	    }
       
   133 	    return ast;
       
   134 	}
       
   135 	exports.parse = parse;
       
   136 	function parseModule(code, options, delegate) {
       
   137 	    var parsingOptions = options || {};
       
   138 	    parsingOptions.sourceType = 'module';
       
   139 	    return parse(code, parsingOptions, delegate);
       
   140 	}
       
   141 	exports.parseModule = parseModule;
       
   142 	function parseScript(code, options, delegate) {
       
   143 	    var parsingOptions = options || {};
       
   144 	    parsingOptions.sourceType = 'script';
       
   145 	    return parse(code, parsingOptions, delegate);
       
   146 	}
       
   147 	exports.parseScript = parseScript;
       
   148 	function tokenize(code, options, delegate) {
       
   149 	    var tokenizer = new tokenizer_1.Tokenizer(code, options);
       
   150 	    var tokens;
       
   151 	    tokens = [];
       
   152 	    try {
       
   153 	        while (true) {
       
   154 	            var token = tokenizer.getNextToken();
       
   155 	            if (!token) {
       
   156 	                break;
       
   157 	            }
       
   158 	            if (delegate) {
       
   159 	                token = delegate(token);
       
   160 	            }
       
   161 	            tokens.push(token);
       
   162 	        }
       
   163 	    }
       
   164 	    catch (e) {
       
   165 	        tokenizer.errorHandler.tolerate(e);
       
   166 	    }
       
   167 	    if (tokenizer.errorHandler.tolerant) {
       
   168 	        tokens.errors = tokenizer.errors();
       
   169 	    }
       
   170 	    return tokens;
       
   171 	}
       
   172 	exports.tokenize = tokenize;
       
   173 	var syntax_1 = __webpack_require__(2);
       
   174 	exports.Syntax = syntax_1.Syntax;
       
   175 	// Sync with *.json manifests.
       
   176 	exports.version = '4.0.0';
       
   177 
       
   178 
       
   179 /***/ },
       
   180 /* 1 */
       
   181 /***/ function(module, exports, __webpack_require__) {
       
   182 
       
   183 	"use strict";
       
   184 	Object.defineProperty(exports, "__esModule", { value: true });
       
   185 	var syntax_1 = __webpack_require__(2);
       
   186 	var CommentHandler = (function () {
       
   187 	    function CommentHandler() {
       
   188 	        this.attach = false;
       
   189 	        this.comments = [];
       
   190 	        this.stack = [];
       
   191 	        this.leading = [];
       
   192 	        this.trailing = [];
       
   193 	    }
       
   194 	    CommentHandler.prototype.insertInnerComments = function (node, metadata) {
       
   195 	        //  innnerComments for properties empty block
       
   196 	        //  `function a() {/** comments **\/}`
       
   197 	        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
       
   198 	            var innerComments = [];
       
   199 	            for (var i = this.leading.length - 1; i >= 0; --i) {
       
   200 	                var entry = this.leading[i];
       
   201 	                if (metadata.end.offset >= entry.start) {
       
   202 	                    innerComments.unshift(entry.comment);
       
   203 	                    this.leading.splice(i, 1);
       
   204 	                    this.trailing.splice(i, 1);
       
   205 	                }
       
   206 	            }
       
   207 	            if (innerComments.length) {
       
   208 	                node.innerComments = innerComments;
       
   209 	            }
       
   210 	        }
       
   211 	    };
       
   212 	    CommentHandler.prototype.findTrailingComments = function (metadata) {
       
   213 	        var trailingComments = [];
       
   214 	        if (this.trailing.length > 0) {
       
   215 	            for (var i = this.trailing.length - 1; i >= 0; --i) {
       
   216 	                var entry_1 = this.trailing[i];
       
   217 	                if (entry_1.start >= metadata.end.offset) {
       
   218 	                    trailingComments.unshift(entry_1.comment);
       
   219 	                }
       
   220 	            }
       
   221 	            this.trailing.length = 0;
       
   222 	            return trailingComments;
       
   223 	        }
       
   224 	        var entry = this.stack[this.stack.length - 1];
       
   225 	        if (entry && entry.node.trailingComments) {
       
   226 	            var firstComment = entry.node.trailingComments[0];
       
   227 	            if (firstComment && firstComment.range[0] >= metadata.end.offset) {
       
   228 	                trailingComments = entry.node.trailingComments;
       
   229 	                delete entry.node.trailingComments;
       
   230 	            }
       
   231 	        }
       
   232 	        return trailingComments;
       
   233 	    };
       
   234 	    CommentHandler.prototype.findLeadingComments = function (metadata) {
       
   235 	        var leadingComments = [];
       
   236 	        var target;
       
   237 	        while (this.stack.length > 0) {
       
   238 	            var entry = this.stack[this.stack.length - 1];
       
   239 	            if (entry && entry.start >= metadata.start.offset) {
       
   240 	                target = entry.node;
       
   241 	                this.stack.pop();
       
   242 	            }
       
   243 	            else {
       
   244 	                break;
       
   245 	            }
       
   246 	        }
       
   247 	        if (target) {
       
   248 	            var count = target.leadingComments ? target.leadingComments.length : 0;
       
   249 	            for (var i = count - 1; i >= 0; --i) {
       
   250 	                var comment = target.leadingComments[i];
       
   251 	                if (comment.range[1] <= metadata.start.offset) {
       
   252 	                    leadingComments.unshift(comment);
       
   253 	                    target.leadingComments.splice(i, 1);
       
   254 	                }
       
   255 	            }
       
   256 	            if (target.leadingComments && target.leadingComments.length === 0) {
       
   257 	                delete target.leadingComments;
       
   258 	            }
       
   259 	            return leadingComments;
       
   260 	        }
       
   261 	        for (var i = this.leading.length - 1; i >= 0; --i) {
       
   262 	            var entry = this.leading[i];
       
   263 	            if (entry.start <= metadata.start.offset) {
       
   264 	                leadingComments.unshift(entry.comment);
       
   265 	                this.leading.splice(i, 1);
       
   266 	            }
       
   267 	        }
       
   268 	        return leadingComments;
       
   269 	    };
       
   270 	    CommentHandler.prototype.visitNode = function (node, metadata) {
       
   271 	        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
       
   272 	            return;
       
   273 	        }
       
   274 	        this.insertInnerComments(node, metadata);
       
   275 	        var trailingComments = this.findTrailingComments(metadata);
       
   276 	        var leadingComments = this.findLeadingComments(metadata);
       
   277 	        if (leadingComments.length > 0) {
       
   278 	            node.leadingComments = leadingComments;
       
   279 	        }
       
   280 	        if (trailingComments.length > 0) {
       
   281 	            node.trailingComments = trailingComments;
       
   282 	        }
       
   283 	        this.stack.push({
       
   284 	            node: node,
       
   285 	            start: metadata.start.offset
       
   286 	        });
       
   287 	    };
       
   288 	    CommentHandler.prototype.visitComment = function (node, metadata) {
       
   289 	        var type = (node.type[0] === 'L') ? 'Line' : 'Block';
       
   290 	        var comment = {
       
   291 	            type: type,
       
   292 	            value: node.value
       
   293 	        };
       
   294 	        if (node.range) {
       
   295 	            comment.range = node.range;
       
   296 	        }
       
   297 	        if (node.loc) {
       
   298 	            comment.loc = node.loc;
       
   299 	        }
       
   300 	        this.comments.push(comment);
       
   301 	        if (this.attach) {
       
   302 	            var entry = {
       
   303 	                comment: {
       
   304 	                    type: type,
       
   305 	                    value: node.value,
       
   306 	                    range: [metadata.start.offset, metadata.end.offset]
       
   307 	                },
       
   308 	                start: metadata.start.offset
       
   309 	            };
       
   310 	            if (node.loc) {
       
   311 	                entry.comment.loc = node.loc;
       
   312 	            }
       
   313 	            node.type = type;
       
   314 	            this.leading.push(entry);
       
   315 	            this.trailing.push(entry);
       
   316 	        }
       
   317 	    };
       
   318 	    CommentHandler.prototype.visit = function (node, metadata) {
       
   319 	        if (node.type === 'LineComment') {
       
   320 	            this.visitComment(node, metadata);
       
   321 	        }
       
   322 	        else if (node.type === 'BlockComment') {
       
   323 	            this.visitComment(node, metadata);
       
   324 	        }
       
   325 	        else if (this.attach) {
       
   326 	            this.visitNode(node, metadata);
       
   327 	        }
       
   328 	    };
       
   329 	    return CommentHandler;
       
   330 	}());
       
   331 	exports.CommentHandler = CommentHandler;
       
   332 
       
   333 
       
   334 /***/ },
       
   335 /* 2 */
       
   336 /***/ function(module, exports) {
       
   337 
       
   338 	"use strict";
       
   339 	Object.defineProperty(exports, "__esModule", { value: true });
       
   340 	exports.Syntax = {
       
   341 	    AssignmentExpression: 'AssignmentExpression',
       
   342 	    AssignmentPattern: 'AssignmentPattern',
       
   343 	    ArrayExpression: 'ArrayExpression',
       
   344 	    ArrayPattern: 'ArrayPattern',
       
   345 	    ArrowFunctionExpression: 'ArrowFunctionExpression',
       
   346 	    AwaitExpression: 'AwaitExpression',
       
   347 	    BlockStatement: 'BlockStatement',
       
   348 	    BinaryExpression: 'BinaryExpression',
       
   349 	    BreakStatement: 'BreakStatement',
       
   350 	    CallExpression: 'CallExpression',
       
   351 	    CatchClause: 'CatchClause',
       
   352 	    ClassBody: 'ClassBody',
       
   353 	    ClassDeclaration: 'ClassDeclaration',
       
   354 	    ClassExpression: 'ClassExpression',
       
   355 	    ConditionalExpression: 'ConditionalExpression',
       
   356 	    ContinueStatement: 'ContinueStatement',
       
   357 	    DoWhileStatement: 'DoWhileStatement',
       
   358 	    DebuggerStatement: 'DebuggerStatement',
       
   359 	    EmptyStatement: 'EmptyStatement',
       
   360 	    ExportAllDeclaration: 'ExportAllDeclaration',
       
   361 	    ExportDefaultDeclaration: 'ExportDefaultDeclaration',
       
   362 	    ExportNamedDeclaration: 'ExportNamedDeclaration',
       
   363 	    ExportSpecifier: 'ExportSpecifier',
       
   364 	    ExpressionStatement: 'ExpressionStatement',
       
   365 	    ForStatement: 'ForStatement',
       
   366 	    ForOfStatement: 'ForOfStatement',
       
   367 	    ForInStatement: 'ForInStatement',
       
   368 	    FunctionDeclaration: 'FunctionDeclaration',
       
   369 	    FunctionExpression: 'FunctionExpression',
       
   370 	    Identifier: 'Identifier',
       
   371 	    IfStatement: 'IfStatement',
       
   372 	    ImportDeclaration: 'ImportDeclaration',
       
   373 	    ImportDefaultSpecifier: 'ImportDefaultSpecifier',
       
   374 	    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
       
   375 	    ImportSpecifier: 'ImportSpecifier',
       
   376 	    Literal: 'Literal',
       
   377 	    LabeledStatement: 'LabeledStatement',
       
   378 	    LogicalExpression: 'LogicalExpression',
       
   379 	    MemberExpression: 'MemberExpression',
       
   380 	    MetaProperty: 'MetaProperty',
       
   381 	    MethodDefinition: 'MethodDefinition',
       
   382 	    NewExpression: 'NewExpression',
       
   383 	    ObjectExpression: 'ObjectExpression',
       
   384 	    ObjectPattern: 'ObjectPattern',
       
   385 	    Program: 'Program',
       
   386 	    Property: 'Property',
       
   387 	    RestElement: 'RestElement',
       
   388 	    ReturnStatement: 'ReturnStatement',
       
   389 	    SequenceExpression: 'SequenceExpression',
       
   390 	    SpreadElement: 'SpreadElement',
       
   391 	    Super: 'Super',
       
   392 	    SwitchCase: 'SwitchCase',
       
   393 	    SwitchStatement: 'SwitchStatement',
       
   394 	    TaggedTemplateExpression: 'TaggedTemplateExpression',
       
   395 	    TemplateElement: 'TemplateElement',
       
   396 	    TemplateLiteral: 'TemplateLiteral',
       
   397 	    ThisExpression: 'ThisExpression',
       
   398 	    ThrowStatement: 'ThrowStatement',
       
   399 	    TryStatement: 'TryStatement',
       
   400 	    UnaryExpression: 'UnaryExpression',
       
   401 	    UpdateExpression: 'UpdateExpression',
       
   402 	    VariableDeclaration: 'VariableDeclaration',
       
   403 	    VariableDeclarator: 'VariableDeclarator',
       
   404 	    WhileStatement: 'WhileStatement',
       
   405 	    WithStatement: 'WithStatement',
       
   406 	    YieldExpression: 'YieldExpression'
       
   407 	};
       
   408 
       
   409 
       
   410 /***/ },
       
   411 /* 3 */
       
   412 /***/ function(module, exports, __webpack_require__) {
       
   413 
       
   414 	"use strict";
       
   415 /* istanbul ignore next */
       
   416 	var __extends = (this && this.__extends) || (function () {
       
   417 	    var extendStatics = Object.setPrototypeOf ||
       
   418 	        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
       
   419 	        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
       
   420 	    return function (d, b) {
       
   421 	        extendStatics(d, b);
       
   422 	        function __() { this.constructor = d; }
       
   423 	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
       
   424 	    };
       
   425 	})();
       
   426 	Object.defineProperty(exports, "__esModule", { value: true });
       
   427 	var character_1 = __webpack_require__(4);
       
   428 	var JSXNode = __webpack_require__(5);
       
   429 	var jsx_syntax_1 = __webpack_require__(6);
       
   430 	var Node = __webpack_require__(7);
       
   431 	var parser_1 = __webpack_require__(8);
       
   432 	var token_1 = __webpack_require__(13);
       
   433 	var xhtml_entities_1 = __webpack_require__(14);
       
   434 	token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
       
   435 	token_1.TokenName[101 /* Text */] = 'JSXText';
       
   436 	// Fully qualified element name, e.g. <svg:path> returns "svg:path"
       
   437 	function getQualifiedElementName(elementName) {
       
   438 	    var qualifiedName;
       
   439 	    switch (elementName.type) {
       
   440 	        case jsx_syntax_1.JSXSyntax.JSXIdentifier:
       
   441 	            var id = elementName;
       
   442 	            qualifiedName = id.name;
       
   443 	            break;
       
   444 	        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
       
   445 	            var ns = elementName;
       
   446 	            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
       
   447 	                getQualifiedElementName(ns.name);
       
   448 	            break;
       
   449 	        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
       
   450 	            var expr = elementName;
       
   451 	            qualifiedName = getQualifiedElementName(expr.object) + '.' +
       
   452 	                getQualifiedElementName(expr.property);
       
   453 	            break;
       
   454 	        /* istanbul ignore next */
       
   455 	        default:
       
   456 	            break;
       
   457 	    }
       
   458 	    return qualifiedName;
       
   459 	}
       
   460 	var JSXParser = (function (_super) {
       
   461 	    __extends(JSXParser, _super);
       
   462 	    function JSXParser(code, options, delegate) {
       
   463 	        return _super.call(this, code, options, delegate) || this;
       
   464 	    }
       
   465 	    JSXParser.prototype.parsePrimaryExpression = function () {
       
   466 	        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
       
   467 	    };
       
   468 	    JSXParser.prototype.startJSX = function () {
       
   469 	        // Unwind the scanner before the lookahead token.
       
   470 	        this.scanner.index = this.startMarker.index;
       
   471 	        this.scanner.lineNumber = this.startMarker.line;
       
   472 	        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
       
   473 	    };
       
   474 	    JSXParser.prototype.finishJSX = function () {
       
   475 	        // Prime the next lookahead.
       
   476 	        this.nextToken();
       
   477 	    };
       
   478 	    JSXParser.prototype.reenterJSX = function () {
       
   479 	        this.startJSX();
       
   480 	        this.expectJSX('}');
       
   481 	        // Pop the closing '}' added from the lookahead.
       
   482 	        if (this.config.tokens) {
       
   483 	            this.tokens.pop();
       
   484 	        }
       
   485 	    };
       
   486 	    JSXParser.prototype.createJSXNode = function () {
       
   487 	        this.collectComments();
       
   488 	        return {
       
   489 	            index: this.scanner.index,
       
   490 	            line: this.scanner.lineNumber,
       
   491 	            column: this.scanner.index - this.scanner.lineStart
       
   492 	        };
       
   493 	    };
       
   494 	    JSXParser.prototype.createJSXChildNode = function () {
       
   495 	        return {
       
   496 	            index: this.scanner.index,
       
   497 	            line: this.scanner.lineNumber,
       
   498 	            column: this.scanner.index - this.scanner.lineStart
       
   499 	        };
       
   500 	    };
       
   501 	    JSXParser.prototype.scanXHTMLEntity = function (quote) {
       
   502 	        var result = '&';
       
   503 	        var valid = true;
       
   504 	        var terminated = false;
       
   505 	        var numeric = false;
       
   506 	        var hex = false;
       
   507 	        while (!this.scanner.eof() && valid && !terminated) {
       
   508 	            var ch = this.scanner.source[this.scanner.index];
       
   509 	            if (ch === quote) {
       
   510 	                break;
       
   511 	            }
       
   512 	            terminated = (ch === ';');
       
   513 	            result += ch;
       
   514 	            ++this.scanner.index;
       
   515 	            if (!terminated) {
       
   516 	                switch (result.length) {
       
   517 	                    case 2:
       
   518 	                        // e.g. '&#123;'
       
   519 	                        numeric = (ch === '#');
       
   520 	                        break;
       
   521 	                    case 3:
       
   522 	                        if (numeric) {
       
   523 	                            // e.g. '&#x41;'
       
   524 	                            hex = (ch === 'x');
       
   525 	                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
       
   526 	                            numeric = numeric && !hex;
       
   527 	                        }
       
   528 	                        break;
       
   529 	                    default:
       
   530 	                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
       
   531 	                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
       
   532 	                        break;
       
   533 	                }
       
   534 	            }
       
   535 	        }
       
   536 	        if (valid && terminated && result.length > 2) {
       
   537 	            // e.g. '&#x41;' becomes just '#x41'
       
   538 	            var str = result.substr(1, result.length - 2);
       
   539 	            if (numeric && str.length > 1) {
       
   540 	                result = String.fromCharCode(parseInt(str.substr(1), 10));
       
   541 	            }
       
   542 	            else if (hex && str.length > 2) {
       
   543 	                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
       
   544 	            }
       
   545 	            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
       
   546 	                result = xhtml_entities_1.XHTMLEntities[str];
       
   547 	            }
       
   548 	        }
       
   549 	        return result;
       
   550 	    };
       
   551 	    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
       
   552 	    JSXParser.prototype.lexJSX = function () {
       
   553 	        var cp = this.scanner.source.charCodeAt(this.scanner.index);
       
   554 	        // < > / : = { }
       
   555 	        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
       
   556 	            var value = this.scanner.source[this.scanner.index++];
       
   557 	            return {
       
   558 	                type: 7 /* Punctuator */,
       
   559 	                value: value,
       
   560 	                lineNumber: this.scanner.lineNumber,
       
   561 	                lineStart: this.scanner.lineStart,
       
   562 	                start: this.scanner.index - 1,
       
   563 	                end: this.scanner.index
       
   564 	            };
       
   565 	        }
       
   566 	        // " '
       
   567 	        if (cp === 34 || cp === 39) {
       
   568 	            var start = this.scanner.index;
       
   569 	            var quote = this.scanner.source[this.scanner.index++];
       
   570 	            var str = '';
       
   571 	            while (!this.scanner.eof()) {
       
   572 	                var ch = this.scanner.source[this.scanner.index++];
       
   573 	                if (ch === quote) {
       
   574 	                    break;
       
   575 	                }
       
   576 	                else if (ch === '&') {
       
   577 	                    str += this.scanXHTMLEntity(quote);
       
   578 	                }
       
   579 	                else {
       
   580 	                    str += ch;
       
   581 	                }
       
   582 	            }
       
   583 	            return {
       
   584 	                type: 8 /* StringLiteral */,
       
   585 	                value: str,
       
   586 	                lineNumber: this.scanner.lineNumber,
       
   587 	                lineStart: this.scanner.lineStart,
       
   588 	                start: start,
       
   589 	                end: this.scanner.index
       
   590 	            };
       
   591 	        }
       
   592 	        // ... or .
       
   593 	        if (cp === 46) {
       
   594 	            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
       
   595 	            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
       
   596 	            var value = (n1 === 46 && n2 === 46) ? '...' : '.';
       
   597 	            var start = this.scanner.index;
       
   598 	            this.scanner.index += value.length;
       
   599 	            return {
       
   600 	                type: 7 /* Punctuator */,
       
   601 	                value: value,
       
   602 	                lineNumber: this.scanner.lineNumber,
       
   603 	                lineStart: this.scanner.lineStart,
       
   604 	                start: start,
       
   605 	                end: this.scanner.index
       
   606 	            };
       
   607 	        }
       
   608 	        // `
       
   609 	        if (cp === 96) {
       
   610 	            // Only placeholder, since it will be rescanned as a real assignment expression.
       
   611 	            return {
       
   612 	                type: 10 /* Template */,
       
   613 	                value: '',
       
   614 	                lineNumber: this.scanner.lineNumber,
       
   615 	                lineStart: this.scanner.lineStart,
       
   616 	                start: this.scanner.index,
       
   617 	                end: this.scanner.index
       
   618 	            };
       
   619 	        }
       
   620 	        // Identifer can not contain backslash (char code 92).
       
   621 	        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
       
   622 	            var start = this.scanner.index;
       
   623 	            ++this.scanner.index;
       
   624 	            while (!this.scanner.eof()) {
       
   625 	                var ch = this.scanner.source.charCodeAt(this.scanner.index);
       
   626 	                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
       
   627 	                    ++this.scanner.index;
       
   628 	                }
       
   629 	                else if (ch === 45) {
       
   630 	                    // Hyphen (char code 45) can be part of an identifier.
       
   631 	                    ++this.scanner.index;
       
   632 	                }
       
   633 	                else {
       
   634 	                    break;
       
   635 	                }
       
   636 	            }
       
   637 	            var id = this.scanner.source.slice(start, this.scanner.index);
       
   638 	            return {
       
   639 	                type: 100 /* Identifier */,
       
   640 	                value: id,
       
   641 	                lineNumber: this.scanner.lineNumber,
       
   642 	                lineStart: this.scanner.lineStart,
       
   643 	                start: start,
       
   644 	                end: this.scanner.index
       
   645 	            };
       
   646 	        }
       
   647 	        return this.scanner.lex();
       
   648 	    };
       
   649 	    JSXParser.prototype.nextJSXToken = function () {
       
   650 	        this.collectComments();
       
   651 	        this.startMarker.index = this.scanner.index;
       
   652 	        this.startMarker.line = this.scanner.lineNumber;
       
   653 	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
       
   654 	        var token = this.lexJSX();
       
   655 	        this.lastMarker.index = this.scanner.index;
       
   656 	        this.lastMarker.line = this.scanner.lineNumber;
       
   657 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
       
   658 	        if (this.config.tokens) {
       
   659 	            this.tokens.push(this.convertToken(token));
       
   660 	        }
       
   661 	        return token;
       
   662 	    };
       
   663 	    JSXParser.prototype.nextJSXText = function () {
       
   664 	        this.startMarker.index = this.scanner.index;
       
   665 	        this.startMarker.line = this.scanner.lineNumber;
       
   666 	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
       
   667 	        var start = this.scanner.index;
       
   668 	        var text = '';
       
   669 	        while (!this.scanner.eof()) {
       
   670 	            var ch = this.scanner.source[this.scanner.index];
       
   671 	            if (ch === '{' || ch === '<') {
       
   672 	                break;
       
   673 	            }
       
   674 	            ++this.scanner.index;
       
   675 	            text += ch;
       
   676 	            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
   677 	                ++this.scanner.lineNumber;
       
   678 	                if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
       
   679 	                    ++this.scanner.index;
       
   680 	                }
       
   681 	                this.scanner.lineStart = this.scanner.index;
       
   682 	            }
       
   683 	        }
       
   684 	        this.lastMarker.index = this.scanner.index;
       
   685 	        this.lastMarker.line = this.scanner.lineNumber;
       
   686 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
       
   687 	        var token = {
       
   688 	            type: 101 /* Text */,
       
   689 	            value: text,
       
   690 	            lineNumber: this.scanner.lineNumber,
       
   691 	            lineStart: this.scanner.lineStart,
       
   692 	            start: start,
       
   693 	            end: this.scanner.index
       
   694 	        };
       
   695 	        if ((text.length > 0) && this.config.tokens) {
       
   696 	            this.tokens.push(this.convertToken(token));
       
   697 	        }
       
   698 	        return token;
       
   699 	    };
       
   700 	    JSXParser.prototype.peekJSXToken = function () {
       
   701 	        var state = this.scanner.saveState();
       
   702 	        this.scanner.scanComments();
       
   703 	        var next = this.lexJSX();
       
   704 	        this.scanner.restoreState(state);
       
   705 	        return next;
       
   706 	    };
       
   707 	    // Expect the next JSX token to match the specified punctuator.
       
   708 	    // If not, an exception will be thrown.
       
   709 	    JSXParser.prototype.expectJSX = function (value) {
       
   710 	        var token = this.nextJSXToken();
       
   711 	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
       
   712 	            this.throwUnexpectedToken(token);
       
   713 	        }
       
   714 	    };
       
   715 	    // Return true if the next JSX token matches the specified punctuator.
       
   716 	    JSXParser.prototype.matchJSX = function (value) {
       
   717 	        var next = this.peekJSXToken();
       
   718 	        return next.type === 7 /* Punctuator */ && next.value === value;
       
   719 	    };
       
   720 	    JSXParser.prototype.parseJSXIdentifier = function () {
       
   721 	        var node = this.createJSXNode();
       
   722 	        var token = this.nextJSXToken();
       
   723 	        if (token.type !== 100 /* Identifier */) {
       
   724 	            this.throwUnexpectedToken(token);
       
   725 	        }
       
   726 	        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
       
   727 	    };
       
   728 	    JSXParser.prototype.parseJSXElementName = function () {
       
   729 	        var node = this.createJSXNode();
       
   730 	        var elementName = this.parseJSXIdentifier();
       
   731 	        if (this.matchJSX(':')) {
       
   732 	            var namespace = elementName;
       
   733 	            this.expectJSX(':');
       
   734 	            var name_1 = this.parseJSXIdentifier();
       
   735 	            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
       
   736 	        }
       
   737 	        else if (this.matchJSX('.')) {
       
   738 	            while (this.matchJSX('.')) {
       
   739 	                var object = elementName;
       
   740 	                this.expectJSX('.');
       
   741 	                var property = this.parseJSXIdentifier();
       
   742 	                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
       
   743 	            }
       
   744 	        }
       
   745 	        return elementName;
       
   746 	    };
       
   747 	    JSXParser.prototype.parseJSXAttributeName = function () {
       
   748 	        var node = this.createJSXNode();
       
   749 	        var attributeName;
       
   750 	        var identifier = this.parseJSXIdentifier();
       
   751 	        if (this.matchJSX(':')) {
       
   752 	            var namespace = identifier;
       
   753 	            this.expectJSX(':');
       
   754 	            var name_2 = this.parseJSXIdentifier();
       
   755 	            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
       
   756 	        }
       
   757 	        else {
       
   758 	            attributeName = identifier;
       
   759 	        }
       
   760 	        return attributeName;
       
   761 	    };
       
   762 	    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
       
   763 	        var node = this.createJSXNode();
       
   764 	        var token = this.nextJSXToken();
       
   765 	        if (token.type !== 8 /* StringLiteral */) {
       
   766 	            this.throwUnexpectedToken(token);
       
   767 	        }
       
   768 	        var raw = this.getTokenRaw(token);
       
   769 	        return this.finalize(node, new Node.Literal(token.value, raw));
       
   770 	    };
       
   771 	    JSXParser.prototype.parseJSXExpressionAttribute = function () {
       
   772 	        var node = this.createJSXNode();
       
   773 	        this.expectJSX('{');
       
   774 	        this.finishJSX();
       
   775 	        if (this.match('}')) {
       
   776 	            this.tolerateError('JSX attributes must only be assigned a non-empty expression');
       
   777 	        }
       
   778 	        var expression = this.parseAssignmentExpression();
       
   779 	        this.reenterJSX();
       
   780 	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
       
   781 	    };
       
   782 	    JSXParser.prototype.parseJSXAttributeValue = function () {
       
   783 	        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
       
   784 	            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
       
   785 	    };
       
   786 	    JSXParser.prototype.parseJSXNameValueAttribute = function () {
       
   787 	        var node = this.createJSXNode();
       
   788 	        var name = this.parseJSXAttributeName();
       
   789 	        var value = null;
       
   790 	        if (this.matchJSX('=')) {
       
   791 	            this.expectJSX('=');
       
   792 	            value = this.parseJSXAttributeValue();
       
   793 	        }
       
   794 	        return this.finalize(node, new JSXNode.JSXAttribute(name, value));
       
   795 	    };
       
   796 	    JSXParser.prototype.parseJSXSpreadAttribute = function () {
       
   797 	        var node = this.createJSXNode();
       
   798 	        this.expectJSX('{');
       
   799 	        this.expectJSX('...');
       
   800 	        this.finishJSX();
       
   801 	        var argument = this.parseAssignmentExpression();
       
   802 	        this.reenterJSX();
       
   803 	        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
       
   804 	    };
       
   805 	    JSXParser.prototype.parseJSXAttributes = function () {
       
   806 	        var attributes = [];
       
   807 	        while (!this.matchJSX('/') && !this.matchJSX('>')) {
       
   808 	            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
       
   809 	                this.parseJSXNameValueAttribute();
       
   810 	            attributes.push(attribute);
       
   811 	        }
       
   812 	        return attributes;
       
   813 	    };
       
   814 	    JSXParser.prototype.parseJSXOpeningElement = function () {
       
   815 	        var node = this.createJSXNode();
       
   816 	        this.expectJSX('<');
       
   817 	        var name = this.parseJSXElementName();
       
   818 	        var attributes = this.parseJSXAttributes();
       
   819 	        var selfClosing = this.matchJSX('/');
       
   820 	        if (selfClosing) {
       
   821 	            this.expectJSX('/');
       
   822 	        }
       
   823 	        this.expectJSX('>');
       
   824 	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
       
   825 	    };
       
   826 	    JSXParser.prototype.parseJSXBoundaryElement = function () {
       
   827 	        var node = this.createJSXNode();
       
   828 	        this.expectJSX('<');
       
   829 	        if (this.matchJSX('/')) {
       
   830 	            this.expectJSX('/');
       
   831 	            var name_3 = this.parseJSXElementName();
       
   832 	            this.expectJSX('>');
       
   833 	            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
       
   834 	        }
       
   835 	        var name = this.parseJSXElementName();
       
   836 	        var attributes = this.parseJSXAttributes();
       
   837 	        var selfClosing = this.matchJSX('/');
       
   838 	        if (selfClosing) {
       
   839 	            this.expectJSX('/');
       
   840 	        }
       
   841 	        this.expectJSX('>');
       
   842 	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
       
   843 	    };
       
   844 	    JSXParser.prototype.parseJSXEmptyExpression = function () {
       
   845 	        var node = this.createJSXChildNode();
       
   846 	        this.collectComments();
       
   847 	        this.lastMarker.index = this.scanner.index;
       
   848 	        this.lastMarker.line = this.scanner.lineNumber;
       
   849 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
       
   850 	        return this.finalize(node, new JSXNode.JSXEmptyExpression());
       
   851 	    };
       
   852 	    JSXParser.prototype.parseJSXExpressionContainer = function () {
       
   853 	        var node = this.createJSXNode();
       
   854 	        this.expectJSX('{');
       
   855 	        var expression;
       
   856 	        if (this.matchJSX('}')) {
       
   857 	            expression = this.parseJSXEmptyExpression();
       
   858 	            this.expectJSX('}');
       
   859 	        }
       
   860 	        else {
       
   861 	            this.finishJSX();
       
   862 	            expression = this.parseAssignmentExpression();
       
   863 	            this.reenterJSX();
       
   864 	        }
       
   865 	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
       
   866 	    };
       
   867 	    JSXParser.prototype.parseJSXChildren = function () {
       
   868 	        var children = [];
       
   869 	        while (!this.scanner.eof()) {
       
   870 	            var node = this.createJSXChildNode();
       
   871 	            var token = this.nextJSXText();
       
   872 	            if (token.start < token.end) {
       
   873 	                var raw = this.getTokenRaw(token);
       
   874 	                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
       
   875 	                children.push(child);
       
   876 	            }
       
   877 	            if (this.scanner.source[this.scanner.index] === '{') {
       
   878 	                var container = this.parseJSXExpressionContainer();
       
   879 	                children.push(container);
       
   880 	            }
       
   881 	            else {
       
   882 	                break;
       
   883 	            }
       
   884 	        }
       
   885 	        return children;
       
   886 	    };
       
   887 	    JSXParser.prototype.parseComplexJSXElement = function (el) {
       
   888 	        var stack = [];
       
   889 	        while (!this.scanner.eof()) {
       
   890 	            el.children = el.children.concat(this.parseJSXChildren());
       
   891 	            var node = this.createJSXChildNode();
       
   892 	            var element = this.parseJSXBoundaryElement();
       
   893 	            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
       
   894 	                var opening = element;
       
   895 	                if (opening.selfClosing) {
       
   896 	                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
       
   897 	                    el.children.push(child);
       
   898 	                }
       
   899 	                else {
       
   900 	                    stack.push(el);
       
   901 	                    el = { node: node, opening: opening, closing: null, children: [] };
       
   902 	                }
       
   903 	            }
       
   904 	            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
       
   905 	                el.closing = element;
       
   906 	                var open_1 = getQualifiedElementName(el.opening.name);
       
   907 	                var close_1 = getQualifiedElementName(el.closing.name);
       
   908 	                if (open_1 !== close_1) {
       
   909 	                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
       
   910 	                }
       
   911 	                if (stack.length > 0) {
       
   912 	                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
       
   913 	                    el = stack[stack.length - 1];
       
   914 	                    el.children.push(child);
       
   915 	                    stack.pop();
       
   916 	                }
       
   917 	                else {
       
   918 	                    break;
       
   919 	                }
       
   920 	            }
       
   921 	        }
       
   922 	        return el;
       
   923 	    };
       
   924 	    JSXParser.prototype.parseJSXElement = function () {
       
   925 	        var node = this.createJSXNode();
       
   926 	        var opening = this.parseJSXOpeningElement();
       
   927 	        var children = [];
       
   928 	        var closing = null;
       
   929 	        if (!opening.selfClosing) {
       
   930 	            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
       
   931 	            children = el.children;
       
   932 	            closing = el.closing;
       
   933 	        }
       
   934 	        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
       
   935 	    };
       
   936 	    JSXParser.prototype.parseJSXRoot = function () {
       
   937 	        // Pop the opening '<' added from the lookahead.
       
   938 	        if (this.config.tokens) {
       
   939 	            this.tokens.pop();
       
   940 	        }
       
   941 	        this.startJSX();
       
   942 	        var element = this.parseJSXElement();
       
   943 	        this.finishJSX();
       
   944 	        return element;
       
   945 	    };
       
   946 	    JSXParser.prototype.isStartOfExpression = function () {
       
   947 	        return _super.prototype.isStartOfExpression.call(this) || this.match('<');
       
   948 	    };
       
   949 	    return JSXParser;
       
   950 	}(parser_1.Parser));
       
   951 	exports.JSXParser = JSXParser;
       
   952 
       
   953 
       
   954 /***/ },
       
   955 /* 4 */
       
   956 /***/ function(module, exports) {
       
   957 
       
   958 	"use strict";
       
   959 	Object.defineProperty(exports, "__esModule", { value: true });
       
   960 	// See also tools/generate-unicode-regex.js.
       
   961 	var Regex = {
       
   962 	    // Unicode v8.0.0 NonAsciiIdentifierStart:
       
   963 	    NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
       
   964 	    // Unicode v8.0.0 NonAsciiIdentifierPart:
       
   965 	    NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
       
   966 	};
       
   967 	exports.Character = {
       
   968 	    /* tslint:disable:no-bitwise */
       
   969 	    fromCodePoint: function (cp) {
       
   970 	        return (cp < 0x10000) ? String.fromCharCode(cp) :
       
   971 	            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
       
   972 	                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
       
   973 	    },
       
   974 	    // https://tc39.github.io/ecma262/#sec-white-space
       
   975 	    isWhiteSpace: function (cp) {
       
   976 	        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
       
   977 	            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
       
   978 	    },
       
   979 	    // https://tc39.github.io/ecma262/#sec-line-terminators
       
   980 	    isLineTerminator: function (cp) {
       
   981 	        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
       
   982 	    },
       
   983 	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
       
   984 	    isIdentifierStart: function (cp) {
       
   985 	        return (cp === 0x24) || (cp === 0x5F) ||
       
   986 	            (cp >= 0x41 && cp <= 0x5A) ||
       
   987 	            (cp >= 0x61 && cp <= 0x7A) ||
       
   988 	            (cp === 0x5C) ||
       
   989 	            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
       
   990 	    },
       
   991 	    isIdentifierPart: function (cp) {
       
   992 	        return (cp === 0x24) || (cp === 0x5F) ||
       
   993 	            (cp >= 0x41 && cp <= 0x5A) ||
       
   994 	            (cp >= 0x61 && cp <= 0x7A) ||
       
   995 	            (cp >= 0x30 && cp <= 0x39) ||
       
   996 	            (cp === 0x5C) ||
       
   997 	            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
       
   998 	    },
       
   999 	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
       
  1000 	    isDecimalDigit: function (cp) {
       
  1001 	        return (cp >= 0x30 && cp <= 0x39); // 0..9
       
  1002 	    },
       
  1003 	    isHexDigit: function (cp) {
       
  1004 	        return (cp >= 0x30 && cp <= 0x39) ||
       
  1005 	            (cp >= 0x41 && cp <= 0x46) ||
       
  1006 	            (cp >= 0x61 && cp <= 0x66); // a..f
       
  1007 	    },
       
  1008 	    isOctalDigit: function (cp) {
       
  1009 	        return (cp >= 0x30 && cp <= 0x37); // 0..7
       
  1010 	    }
       
  1011 	};
       
  1012 
       
  1013 
       
  1014 /***/ },
       
  1015 /* 5 */
       
  1016 /***/ function(module, exports, __webpack_require__) {
       
  1017 
       
  1018 	"use strict";
       
  1019 	Object.defineProperty(exports, "__esModule", { value: true });
       
  1020 	var jsx_syntax_1 = __webpack_require__(6);
       
  1021 	/* tslint:disable:max-classes-per-file */
       
  1022 	var JSXClosingElement = (function () {
       
  1023 	    function JSXClosingElement(name) {
       
  1024 	        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
       
  1025 	        this.name = name;
       
  1026 	    }
       
  1027 	    return JSXClosingElement;
       
  1028 	}());
       
  1029 	exports.JSXClosingElement = JSXClosingElement;
       
  1030 	var JSXElement = (function () {
       
  1031 	    function JSXElement(openingElement, children, closingElement) {
       
  1032 	        this.type = jsx_syntax_1.JSXSyntax.JSXElement;
       
  1033 	        this.openingElement = openingElement;
       
  1034 	        this.children = children;
       
  1035 	        this.closingElement = closingElement;
       
  1036 	    }
       
  1037 	    return JSXElement;
       
  1038 	}());
       
  1039 	exports.JSXElement = JSXElement;
       
  1040 	var JSXEmptyExpression = (function () {
       
  1041 	    function JSXEmptyExpression() {
       
  1042 	        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
       
  1043 	    }
       
  1044 	    return JSXEmptyExpression;
       
  1045 	}());
       
  1046 	exports.JSXEmptyExpression = JSXEmptyExpression;
       
  1047 	var JSXExpressionContainer = (function () {
       
  1048 	    function JSXExpressionContainer(expression) {
       
  1049 	        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
       
  1050 	        this.expression = expression;
       
  1051 	    }
       
  1052 	    return JSXExpressionContainer;
       
  1053 	}());
       
  1054 	exports.JSXExpressionContainer = JSXExpressionContainer;
       
  1055 	var JSXIdentifier = (function () {
       
  1056 	    function JSXIdentifier(name) {
       
  1057 	        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
       
  1058 	        this.name = name;
       
  1059 	    }
       
  1060 	    return JSXIdentifier;
       
  1061 	}());
       
  1062 	exports.JSXIdentifier = JSXIdentifier;
       
  1063 	var JSXMemberExpression = (function () {
       
  1064 	    function JSXMemberExpression(object, property) {
       
  1065 	        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
       
  1066 	        this.object = object;
       
  1067 	        this.property = property;
       
  1068 	    }
       
  1069 	    return JSXMemberExpression;
       
  1070 	}());
       
  1071 	exports.JSXMemberExpression = JSXMemberExpression;
       
  1072 	var JSXAttribute = (function () {
       
  1073 	    function JSXAttribute(name, value) {
       
  1074 	        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
       
  1075 	        this.name = name;
       
  1076 	        this.value = value;
       
  1077 	    }
       
  1078 	    return JSXAttribute;
       
  1079 	}());
       
  1080 	exports.JSXAttribute = JSXAttribute;
       
  1081 	var JSXNamespacedName = (function () {
       
  1082 	    function JSXNamespacedName(namespace, name) {
       
  1083 	        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
       
  1084 	        this.namespace = namespace;
       
  1085 	        this.name = name;
       
  1086 	    }
       
  1087 	    return JSXNamespacedName;
       
  1088 	}());
       
  1089 	exports.JSXNamespacedName = JSXNamespacedName;
       
  1090 	var JSXOpeningElement = (function () {
       
  1091 	    function JSXOpeningElement(name, selfClosing, attributes) {
       
  1092 	        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
       
  1093 	        this.name = name;
       
  1094 	        this.selfClosing = selfClosing;
       
  1095 	        this.attributes = attributes;
       
  1096 	    }
       
  1097 	    return JSXOpeningElement;
       
  1098 	}());
       
  1099 	exports.JSXOpeningElement = JSXOpeningElement;
       
  1100 	var JSXSpreadAttribute = (function () {
       
  1101 	    function JSXSpreadAttribute(argument) {
       
  1102 	        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
       
  1103 	        this.argument = argument;
       
  1104 	    }
       
  1105 	    return JSXSpreadAttribute;
       
  1106 	}());
       
  1107 	exports.JSXSpreadAttribute = JSXSpreadAttribute;
       
  1108 	var JSXText = (function () {
       
  1109 	    function JSXText(value, raw) {
       
  1110 	        this.type = jsx_syntax_1.JSXSyntax.JSXText;
       
  1111 	        this.value = value;
       
  1112 	        this.raw = raw;
       
  1113 	    }
       
  1114 	    return JSXText;
       
  1115 	}());
       
  1116 	exports.JSXText = JSXText;
       
  1117 
       
  1118 
       
  1119 /***/ },
       
  1120 /* 6 */
       
  1121 /***/ function(module, exports) {
       
  1122 
       
  1123 	"use strict";
       
  1124 	Object.defineProperty(exports, "__esModule", { value: true });
       
  1125 	exports.JSXSyntax = {
       
  1126 	    JSXAttribute: 'JSXAttribute',
       
  1127 	    JSXClosingElement: 'JSXClosingElement',
       
  1128 	    JSXElement: 'JSXElement',
       
  1129 	    JSXEmptyExpression: 'JSXEmptyExpression',
       
  1130 	    JSXExpressionContainer: 'JSXExpressionContainer',
       
  1131 	    JSXIdentifier: 'JSXIdentifier',
       
  1132 	    JSXMemberExpression: 'JSXMemberExpression',
       
  1133 	    JSXNamespacedName: 'JSXNamespacedName',
       
  1134 	    JSXOpeningElement: 'JSXOpeningElement',
       
  1135 	    JSXSpreadAttribute: 'JSXSpreadAttribute',
       
  1136 	    JSXText: 'JSXText'
       
  1137 	};
       
  1138 
       
  1139 
       
  1140 /***/ },
       
  1141 /* 7 */
       
  1142 /***/ function(module, exports, __webpack_require__) {
       
  1143 
       
  1144 	"use strict";
       
  1145 	Object.defineProperty(exports, "__esModule", { value: true });
       
  1146 	var syntax_1 = __webpack_require__(2);
       
  1147 	/* tslint:disable:max-classes-per-file */
       
  1148 	var ArrayExpression = (function () {
       
  1149 	    function ArrayExpression(elements) {
       
  1150 	        this.type = syntax_1.Syntax.ArrayExpression;
       
  1151 	        this.elements = elements;
       
  1152 	    }
       
  1153 	    return ArrayExpression;
       
  1154 	}());
       
  1155 	exports.ArrayExpression = ArrayExpression;
       
  1156 	var ArrayPattern = (function () {
       
  1157 	    function ArrayPattern(elements) {
       
  1158 	        this.type = syntax_1.Syntax.ArrayPattern;
       
  1159 	        this.elements = elements;
       
  1160 	    }
       
  1161 	    return ArrayPattern;
       
  1162 	}());
       
  1163 	exports.ArrayPattern = ArrayPattern;
       
  1164 	var ArrowFunctionExpression = (function () {
       
  1165 	    function ArrowFunctionExpression(params, body, expression) {
       
  1166 	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
       
  1167 	        this.id = null;
       
  1168 	        this.params = params;
       
  1169 	        this.body = body;
       
  1170 	        this.generator = false;
       
  1171 	        this.expression = expression;
       
  1172 	        this.async = false;
       
  1173 	    }
       
  1174 	    return ArrowFunctionExpression;
       
  1175 	}());
       
  1176 	exports.ArrowFunctionExpression = ArrowFunctionExpression;
       
  1177 	var AssignmentExpression = (function () {
       
  1178 	    function AssignmentExpression(operator, left, right) {
       
  1179 	        this.type = syntax_1.Syntax.AssignmentExpression;
       
  1180 	        this.operator = operator;
       
  1181 	        this.left = left;
       
  1182 	        this.right = right;
       
  1183 	    }
       
  1184 	    return AssignmentExpression;
       
  1185 	}());
       
  1186 	exports.AssignmentExpression = AssignmentExpression;
       
  1187 	var AssignmentPattern = (function () {
       
  1188 	    function AssignmentPattern(left, right) {
       
  1189 	        this.type = syntax_1.Syntax.AssignmentPattern;
       
  1190 	        this.left = left;
       
  1191 	        this.right = right;
       
  1192 	    }
       
  1193 	    return AssignmentPattern;
       
  1194 	}());
       
  1195 	exports.AssignmentPattern = AssignmentPattern;
       
  1196 	var AsyncArrowFunctionExpression = (function () {
       
  1197 	    function AsyncArrowFunctionExpression(params, body, expression) {
       
  1198 	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
       
  1199 	        this.id = null;
       
  1200 	        this.params = params;
       
  1201 	        this.body = body;
       
  1202 	        this.generator = false;
       
  1203 	        this.expression = expression;
       
  1204 	        this.async = true;
       
  1205 	    }
       
  1206 	    return AsyncArrowFunctionExpression;
       
  1207 	}());
       
  1208 	exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
       
  1209 	var AsyncFunctionDeclaration = (function () {
       
  1210 	    function AsyncFunctionDeclaration(id, params, body) {
       
  1211 	        this.type = syntax_1.Syntax.FunctionDeclaration;
       
  1212 	        this.id = id;
       
  1213 	        this.params = params;
       
  1214 	        this.body = body;
       
  1215 	        this.generator = false;
       
  1216 	        this.expression = false;
       
  1217 	        this.async = true;
       
  1218 	    }
       
  1219 	    return AsyncFunctionDeclaration;
       
  1220 	}());
       
  1221 	exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
       
  1222 	var AsyncFunctionExpression = (function () {
       
  1223 	    function AsyncFunctionExpression(id, params, body) {
       
  1224 	        this.type = syntax_1.Syntax.FunctionExpression;
       
  1225 	        this.id = id;
       
  1226 	        this.params = params;
       
  1227 	        this.body = body;
       
  1228 	        this.generator = false;
       
  1229 	        this.expression = false;
       
  1230 	        this.async = true;
       
  1231 	    }
       
  1232 	    return AsyncFunctionExpression;
       
  1233 	}());
       
  1234 	exports.AsyncFunctionExpression = AsyncFunctionExpression;
       
  1235 	var AwaitExpression = (function () {
       
  1236 	    function AwaitExpression(argument) {
       
  1237 	        this.type = syntax_1.Syntax.AwaitExpression;
       
  1238 	        this.argument = argument;
       
  1239 	    }
       
  1240 	    return AwaitExpression;
       
  1241 	}());
       
  1242 	exports.AwaitExpression = AwaitExpression;
       
  1243 	var BinaryExpression = (function () {
       
  1244 	    function BinaryExpression(operator, left, right) {
       
  1245 	        var logical = (operator === '||' || operator === '&&');
       
  1246 	        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
       
  1247 	        this.operator = operator;
       
  1248 	        this.left = left;
       
  1249 	        this.right = right;
       
  1250 	    }
       
  1251 	    return BinaryExpression;
       
  1252 	}());
       
  1253 	exports.BinaryExpression = BinaryExpression;
       
  1254 	var BlockStatement = (function () {
       
  1255 	    function BlockStatement(body) {
       
  1256 	        this.type = syntax_1.Syntax.BlockStatement;
       
  1257 	        this.body = body;
       
  1258 	    }
       
  1259 	    return BlockStatement;
       
  1260 	}());
       
  1261 	exports.BlockStatement = BlockStatement;
       
  1262 	var BreakStatement = (function () {
       
  1263 	    function BreakStatement(label) {
       
  1264 	        this.type = syntax_1.Syntax.BreakStatement;
       
  1265 	        this.label = label;
       
  1266 	    }
       
  1267 	    return BreakStatement;
       
  1268 	}());
       
  1269 	exports.BreakStatement = BreakStatement;
       
  1270 	var CallExpression = (function () {
       
  1271 	    function CallExpression(callee, args) {
       
  1272 	        this.type = syntax_1.Syntax.CallExpression;
       
  1273 	        this.callee = callee;
       
  1274 	        this.arguments = args;
       
  1275 	    }
       
  1276 	    return CallExpression;
       
  1277 	}());
       
  1278 	exports.CallExpression = CallExpression;
       
  1279 	var CatchClause = (function () {
       
  1280 	    function CatchClause(param, body) {
       
  1281 	        this.type = syntax_1.Syntax.CatchClause;
       
  1282 	        this.param = param;
       
  1283 	        this.body = body;
       
  1284 	    }
       
  1285 	    return CatchClause;
       
  1286 	}());
       
  1287 	exports.CatchClause = CatchClause;
       
  1288 	var ClassBody = (function () {
       
  1289 	    function ClassBody(body) {
       
  1290 	        this.type = syntax_1.Syntax.ClassBody;
       
  1291 	        this.body = body;
       
  1292 	    }
       
  1293 	    return ClassBody;
       
  1294 	}());
       
  1295 	exports.ClassBody = ClassBody;
       
  1296 	var ClassDeclaration = (function () {
       
  1297 	    function ClassDeclaration(id, superClass, body) {
       
  1298 	        this.type = syntax_1.Syntax.ClassDeclaration;
       
  1299 	        this.id = id;
       
  1300 	        this.superClass = superClass;
       
  1301 	        this.body = body;
       
  1302 	    }
       
  1303 	    return ClassDeclaration;
       
  1304 	}());
       
  1305 	exports.ClassDeclaration = ClassDeclaration;
       
  1306 	var ClassExpression = (function () {
       
  1307 	    function ClassExpression(id, superClass, body) {
       
  1308 	        this.type = syntax_1.Syntax.ClassExpression;
       
  1309 	        this.id = id;
       
  1310 	        this.superClass = superClass;
       
  1311 	        this.body = body;
       
  1312 	    }
       
  1313 	    return ClassExpression;
       
  1314 	}());
       
  1315 	exports.ClassExpression = ClassExpression;
       
  1316 	var ComputedMemberExpression = (function () {
       
  1317 	    function ComputedMemberExpression(object, property) {
       
  1318 	        this.type = syntax_1.Syntax.MemberExpression;
       
  1319 	        this.computed = true;
       
  1320 	        this.object = object;
       
  1321 	        this.property = property;
       
  1322 	    }
       
  1323 	    return ComputedMemberExpression;
       
  1324 	}());
       
  1325 	exports.ComputedMemberExpression = ComputedMemberExpression;
       
  1326 	var ConditionalExpression = (function () {
       
  1327 	    function ConditionalExpression(test, consequent, alternate) {
       
  1328 	        this.type = syntax_1.Syntax.ConditionalExpression;
       
  1329 	        this.test = test;
       
  1330 	        this.consequent = consequent;
       
  1331 	        this.alternate = alternate;
       
  1332 	    }
       
  1333 	    return ConditionalExpression;
       
  1334 	}());
       
  1335 	exports.ConditionalExpression = ConditionalExpression;
       
  1336 	var ContinueStatement = (function () {
       
  1337 	    function ContinueStatement(label) {
       
  1338 	        this.type = syntax_1.Syntax.ContinueStatement;
       
  1339 	        this.label = label;
       
  1340 	    }
       
  1341 	    return ContinueStatement;
       
  1342 	}());
       
  1343 	exports.ContinueStatement = ContinueStatement;
       
  1344 	var DebuggerStatement = (function () {
       
  1345 	    function DebuggerStatement() {
       
  1346 	        this.type = syntax_1.Syntax.DebuggerStatement;
       
  1347 	    }
       
  1348 	    return DebuggerStatement;
       
  1349 	}());
       
  1350 	exports.DebuggerStatement = DebuggerStatement;
       
  1351 	var Directive = (function () {
       
  1352 	    function Directive(expression, directive) {
       
  1353 	        this.type = syntax_1.Syntax.ExpressionStatement;
       
  1354 	        this.expression = expression;
       
  1355 	        this.directive = directive;
       
  1356 	    }
       
  1357 	    return Directive;
       
  1358 	}());
       
  1359 	exports.Directive = Directive;
       
  1360 	var DoWhileStatement = (function () {
       
  1361 	    function DoWhileStatement(body, test) {
       
  1362 	        this.type = syntax_1.Syntax.DoWhileStatement;
       
  1363 	        this.body = body;
       
  1364 	        this.test = test;
       
  1365 	    }
       
  1366 	    return DoWhileStatement;
       
  1367 	}());
       
  1368 	exports.DoWhileStatement = DoWhileStatement;
       
  1369 	var EmptyStatement = (function () {
       
  1370 	    function EmptyStatement() {
       
  1371 	        this.type = syntax_1.Syntax.EmptyStatement;
       
  1372 	    }
       
  1373 	    return EmptyStatement;
       
  1374 	}());
       
  1375 	exports.EmptyStatement = EmptyStatement;
       
  1376 	var ExportAllDeclaration = (function () {
       
  1377 	    function ExportAllDeclaration(source) {
       
  1378 	        this.type = syntax_1.Syntax.ExportAllDeclaration;
       
  1379 	        this.source = source;
       
  1380 	    }
       
  1381 	    return ExportAllDeclaration;
       
  1382 	}());
       
  1383 	exports.ExportAllDeclaration = ExportAllDeclaration;
       
  1384 	var ExportDefaultDeclaration = (function () {
       
  1385 	    function ExportDefaultDeclaration(declaration) {
       
  1386 	        this.type = syntax_1.Syntax.ExportDefaultDeclaration;
       
  1387 	        this.declaration = declaration;
       
  1388 	    }
       
  1389 	    return ExportDefaultDeclaration;
       
  1390 	}());
       
  1391 	exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
       
  1392 	var ExportNamedDeclaration = (function () {
       
  1393 	    function ExportNamedDeclaration(declaration, specifiers, source) {
       
  1394 	        this.type = syntax_1.Syntax.ExportNamedDeclaration;
       
  1395 	        this.declaration = declaration;
       
  1396 	        this.specifiers = specifiers;
       
  1397 	        this.source = source;
       
  1398 	    }
       
  1399 	    return ExportNamedDeclaration;
       
  1400 	}());
       
  1401 	exports.ExportNamedDeclaration = ExportNamedDeclaration;
       
  1402 	var ExportSpecifier = (function () {
       
  1403 	    function ExportSpecifier(local, exported) {
       
  1404 	        this.type = syntax_1.Syntax.ExportSpecifier;
       
  1405 	        this.exported = exported;
       
  1406 	        this.local = local;
       
  1407 	    }
       
  1408 	    return ExportSpecifier;
       
  1409 	}());
       
  1410 	exports.ExportSpecifier = ExportSpecifier;
       
  1411 	var ExpressionStatement = (function () {
       
  1412 	    function ExpressionStatement(expression) {
       
  1413 	        this.type = syntax_1.Syntax.ExpressionStatement;
       
  1414 	        this.expression = expression;
       
  1415 	    }
       
  1416 	    return ExpressionStatement;
       
  1417 	}());
       
  1418 	exports.ExpressionStatement = ExpressionStatement;
       
  1419 	var ForInStatement = (function () {
       
  1420 	    function ForInStatement(left, right, body) {
       
  1421 	        this.type = syntax_1.Syntax.ForInStatement;
       
  1422 	        this.left = left;
       
  1423 	        this.right = right;
       
  1424 	        this.body = body;
       
  1425 	        this.each = false;
       
  1426 	    }
       
  1427 	    return ForInStatement;
       
  1428 	}());
       
  1429 	exports.ForInStatement = ForInStatement;
       
  1430 	var ForOfStatement = (function () {
       
  1431 	    function ForOfStatement(left, right, body) {
       
  1432 	        this.type = syntax_1.Syntax.ForOfStatement;
       
  1433 	        this.left = left;
       
  1434 	        this.right = right;
       
  1435 	        this.body = body;
       
  1436 	    }
       
  1437 	    return ForOfStatement;
       
  1438 	}());
       
  1439 	exports.ForOfStatement = ForOfStatement;
       
  1440 	var ForStatement = (function () {
       
  1441 	    function ForStatement(init, test, update, body) {
       
  1442 	        this.type = syntax_1.Syntax.ForStatement;
       
  1443 	        this.init = init;
       
  1444 	        this.test = test;
       
  1445 	        this.update = update;
       
  1446 	        this.body = body;
       
  1447 	    }
       
  1448 	    return ForStatement;
       
  1449 	}());
       
  1450 	exports.ForStatement = ForStatement;
       
  1451 	var FunctionDeclaration = (function () {
       
  1452 	    function FunctionDeclaration(id, params, body, generator) {
       
  1453 	        this.type = syntax_1.Syntax.FunctionDeclaration;
       
  1454 	        this.id = id;
       
  1455 	        this.params = params;
       
  1456 	        this.body = body;
       
  1457 	        this.generator = generator;
       
  1458 	        this.expression = false;
       
  1459 	        this.async = false;
       
  1460 	    }
       
  1461 	    return FunctionDeclaration;
       
  1462 	}());
       
  1463 	exports.FunctionDeclaration = FunctionDeclaration;
       
  1464 	var FunctionExpression = (function () {
       
  1465 	    function FunctionExpression(id, params, body, generator) {
       
  1466 	        this.type = syntax_1.Syntax.FunctionExpression;
       
  1467 	        this.id = id;
       
  1468 	        this.params = params;
       
  1469 	        this.body = body;
       
  1470 	        this.generator = generator;
       
  1471 	        this.expression = false;
       
  1472 	        this.async = false;
       
  1473 	    }
       
  1474 	    return FunctionExpression;
       
  1475 	}());
       
  1476 	exports.FunctionExpression = FunctionExpression;
       
  1477 	var Identifier = (function () {
       
  1478 	    function Identifier(name) {
       
  1479 	        this.type = syntax_1.Syntax.Identifier;
       
  1480 	        this.name = name;
       
  1481 	    }
       
  1482 	    return Identifier;
       
  1483 	}());
       
  1484 	exports.Identifier = Identifier;
       
  1485 	var IfStatement = (function () {
       
  1486 	    function IfStatement(test, consequent, alternate) {
       
  1487 	        this.type = syntax_1.Syntax.IfStatement;
       
  1488 	        this.test = test;
       
  1489 	        this.consequent = consequent;
       
  1490 	        this.alternate = alternate;
       
  1491 	    }
       
  1492 	    return IfStatement;
       
  1493 	}());
       
  1494 	exports.IfStatement = IfStatement;
       
  1495 	var ImportDeclaration = (function () {
       
  1496 	    function ImportDeclaration(specifiers, source) {
       
  1497 	        this.type = syntax_1.Syntax.ImportDeclaration;
       
  1498 	        this.specifiers = specifiers;
       
  1499 	        this.source = source;
       
  1500 	    }
       
  1501 	    return ImportDeclaration;
       
  1502 	}());
       
  1503 	exports.ImportDeclaration = ImportDeclaration;
       
  1504 	var ImportDefaultSpecifier = (function () {
       
  1505 	    function ImportDefaultSpecifier(local) {
       
  1506 	        this.type = syntax_1.Syntax.ImportDefaultSpecifier;
       
  1507 	        this.local = local;
       
  1508 	    }
       
  1509 	    return ImportDefaultSpecifier;
       
  1510 	}());
       
  1511 	exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
       
  1512 	var ImportNamespaceSpecifier = (function () {
       
  1513 	    function ImportNamespaceSpecifier(local) {
       
  1514 	        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
       
  1515 	        this.local = local;
       
  1516 	    }
       
  1517 	    return ImportNamespaceSpecifier;
       
  1518 	}());
       
  1519 	exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
       
  1520 	var ImportSpecifier = (function () {
       
  1521 	    function ImportSpecifier(local, imported) {
       
  1522 	        this.type = syntax_1.Syntax.ImportSpecifier;
       
  1523 	        this.local = local;
       
  1524 	        this.imported = imported;
       
  1525 	    }
       
  1526 	    return ImportSpecifier;
       
  1527 	}());
       
  1528 	exports.ImportSpecifier = ImportSpecifier;
       
  1529 	var LabeledStatement = (function () {
       
  1530 	    function LabeledStatement(label, body) {
       
  1531 	        this.type = syntax_1.Syntax.LabeledStatement;
       
  1532 	        this.label = label;
       
  1533 	        this.body = body;
       
  1534 	    }
       
  1535 	    return LabeledStatement;
       
  1536 	}());
       
  1537 	exports.LabeledStatement = LabeledStatement;
       
  1538 	var Literal = (function () {
       
  1539 	    function Literal(value, raw) {
       
  1540 	        this.type = syntax_1.Syntax.Literal;
       
  1541 	        this.value = value;
       
  1542 	        this.raw = raw;
       
  1543 	    }
       
  1544 	    return Literal;
       
  1545 	}());
       
  1546 	exports.Literal = Literal;
       
  1547 	var MetaProperty = (function () {
       
  1548 	    function MetaProperty(meta, property) {
       
  1549 	        this.type = syntax_1.Syntax.MetaProperty;
       
  1550 	        this.meta = meta;
       
  1551 	        this.property = property;
       
  1552 	    }
       
  1553 	    return MetaProperty;
       
  1554 	}());
       
  1555 	exports.MetaProperty = MetaProperty;
       
  1556 	var MethodDefinition = (function () {
       
  1557 	    function MethodDefinition(key, computed, value, kind, isStatic) {
       
  1558 	        this.type = syntax_1.Syntax.MethodDefinition;
       
  1559 	        this.key = key;
       
  1560 	        this.computed = computed;
       
  1561 	        this.value = value;
       
  1562 	        this.kind = kind;
       
  1563 	        this.static = isStatic;
       
  1564 	    }
       
  1565 	    return MethodDefinition;
       
  1566 	}());
       
  1567 	exports.MethodDefinition = MethodDefinition;
       
  1568 	var Module = (function () {
       
  1569 	    function Module(body) {
       
  1570 	        this.type = syntax_1.Syntax.Program;
       
  1571 	        this.body = body;
       
  1572 	        this.sourceType = 'module';
       
  1573 	    }
       
  1574 	    return Module;
       
  1575 	}());
       
  1576 	exports.Module = Module;
       
  1577 	var NewExpression = (function () {
       
  1578 	    function NewExpression(callee, args) {
       
  1579 	        this.type = syntax_1.Syntax.NewExpression;
       
  1580 	        this.callee = callee;
       
  1581 	        this.arguments = args;
       
  1582 	    }
       
  1583 	    return NewExpression;
       
  1584 	}());
       
  1585 	exports.NewExpression = NewExpression;
       
  1586 	var ObjectExpression = (function () {
       
  1587 	    function ObjectExpression(properties) {
       
  1588 	        this.type = syntax_1.Syntax.ObjectExpression;
       
  1589 	        this.properties = properties;
       
  1590 	    }
       
  1591 	    return ObjectExpression;
       
  1592 	}());
       
  1593 	exports.ObjectExpression = ObjectExpression;
       
  1594 	var ObjectPattern = (function () {
       
  1595 	    function ObjectPattern(properties) {
       
  1596 	        this.type = syntax_1.Syntax.ObjectPattern;
       
  1597 	        this.properties = properties;
       
  1598 	    }
       
  1599 	    return ObjectPattern;
       
  1600 	}());
       
  1601 	exports.ObjectPattern = ObjectPattern;
       
  1602 	var Property = (function () {
       
  1603 	    function Property(kind, key, computed, value, method, shorthand) {
       
  1604 	        this.type = syntax_1.Syntax.Property;
       
  1605 	        this.key = key;
       
  1606 	        this.computed = computed;
       
  1607 	        this.value = value;
       
  1608 	        this.kind = kind;
       
  1609 	        this.method = method;
       
  1610 	        this.shorthand = shorthand;
       
  1611 	    }
       
  1612 	    return Property;
       
  1613 	}());
       
  1614 	exports.Property = Property;
       
  1615 	var RegexLiteral = (function () {
       
  1616 	    function RegexLiteral(value, raw, pattern, flags) {
       
  1617 	        this.type = syntax_1.Syntax.Literal;
       
  1618 	        this.value = value;
       
  1619 	        this.raw = raw;
       
  1620 	        this.regex = { pattern: pattern, flags: flags };
       
  1621 	    }
       
  1622 	    return RegexLiteral;
       
  1623 	}());
       
  1624 	exports.RegexLiteral = RegexLiteral;
       
  1625 	var RestElement = (function () {
       
  1626 	    function RestElement(argument) {
       
  1627 	        this.type = syntax_1.Syntax.RestElement;
       
  1628 	        this.argument = argument;
       
  1629 	    }
       
  1630 	    return RestElement;
       
  1631 	}());
       
  1632 	exports.RestElement = RestElement;
       
  1633 	var ReturnStatement = (function () {
       
  1634 	    function ReturnStatement(argument) {
       
  1635 	        this.type = syntax_1.Syntax.ReturnStatement;
       
  1636 	        this.argument = argument;
       
  1637 	    }
       
  1638 	    return ReturnStatement;
       
  1639 	}());
       
  1640 	exports.ReturnStatement = ReturnStatement;
       
  1641 	var Script = (function () {
       
  1642 	    function Script(body) {
       
  1643 	        this.type = syntax_1.Syntax.Program;
       
  1644 	        this.body = body;
       
  1645 	        this.sourceType = 'script';
       
  1646 	    }
       
  1647 	    return Script;
       
  1648 	}());
       
  1649 	exports.Script = Script;
       
  1650 	var SequenceExpression = (function () {
       
  1651 	    function SequenceExpression(expressions) {
       
  1652 	        this.type = syntax_1.Syntax.SequenceExpression;
       
  1653 	        this.expressions = expressions;
       
  1654 	    }
       
  1655 	    return SequenceExpression;
       
  1656 	}());
       
  1657 	exports.SequenceExpression = SequenceExpression;
       
  1658 	var SpreadElement = (function () {
       
  1659 	    function SpreadElement(argument) {
       
  1660 	        this.type = syntax_1.Syntax.SpreadElement;
       
  1661 	        this.argument = argument;
       
  1662 	    }
       
  1663 	    return SpreadElement;
       
  1664 	}());
       
  1665 	exports.SpreadElement = SpreadElement;
       
  1666 	var StaticMemberExpression = (function () {
       
  1667 	    function StaticMemberExpression(object, property) {
       
  1668 	        this.type = syntax_1.Syntax.MemberExpression;
       
  1669 	        this.computed = false;
       
  1670 	        this.object = object;
       
  1671 	        this.property = property;
       
  1672 	    }
       
  1673 	    return StaticMemberExpression;
       
  1674 	}());
       
  1675 	exports.StaticMemberExpression = StaticMemberExpression;
       
  1676 	var Super = (function () {
       
  1677 	    function Super() {
       
  1678 	        this.type = syntax_1.Syntax.Super;
       
  1679 	    }
       
  1680 	    return Super;
       
  1681 	}());
       
  1682 	exports.Super = Super;
       
  1683 	var SwitchCase = (function () {
       
  1684 	    function SwitchCase(test, consequent) {
       
  1685 	        this.type = syntax_1.Syntax.SwitchCase;
       
  1686 	        this.test = test;
       
  1687 	        this.consequent = consequent;
       
  1688 	    }
       
  1689 	    return SwitchCase;
       
  1690 	}());
       
  1691 	exports.SwitchCase = SwitchCase;
       
  1692 	var SwitchStatement = (function () {
       
  1693 	    function SwitchStatement(discriminant, cases) {
       
  1694 	        this.type = syntax_1.Syntax.SwitchStatement;
       
  1695 	        this.discriminant = discriminant;
       
  1696 	        this.cases = cases;
       
  1697 	    }
       
  1698 	    return SwitchStatement;
       
  1699 	}());
       
  1700 	exports.SwitchStatement = SwitchStatement;
       
  1701 	var TaggedTemplateExpression = (function () {
       
  1702 	    function TaggedTemplateExpression(tag, quasi) {
       
  1703 	        this.type = syntax_1.Syntax.TaggedTemplateExpression;
       
  1704 	        this.tag = tag;
       
  1705 	        this.quasi = quasi;
       
  1706 	    }
       
  1707 	    return TaggedTemplateExpression;
       
  1708 	}());
       
  1709 	exports.TaggedTemplateExpression = TaggedTemplateExpression;
       
  1710 	var TemplateElement = (function () {
       
  1711 	    function TemplateElement(value, tail) {
       
  1712 	        this.type = syntax_1.Syntax.TemplateElement;
       
  1713 	        this.value = value;
       
  1714 	        this.tail = tail;
       
  1715 	    }
       
  1716 	    return TemplateElement;
       
  1717 	}());
       
  1718 	exports.TemplateElement = TemplateElement;
       
  1719 	var TemplateLiteral = (function () {
       
  1720 	    function TemplateLiteral(quasis, expressions) {
       
  1721 	        this.type = syntax_1.Syntax.TemplateLiteral;
       
  1722 	        this.quasis = quasis;
       
  1723 	        this.expressions = expressions;
       
  1724 	    }
       
  1725 	    return TemplateLiteral;
       
  1726 	}());
       
  1727 	exports.TemplateLiteral = TemplateLiteral;
       
  1728 	var ThisExpression = (function () {
       
  1729 	    function ThisExpression() {
       
  1730 	        this.type = syntax_1.Syntax.ThisExpression;
       
  1731 	    }
       
  1732 	    return ThisExpression;
       
  1733 	}());
       
  1734 	exports.ThisExpression = ThisExpression;
       
  1735 	var ThrowStatement = (function () {
       
  1736 	    function ThrowStatement(argument) {
       
  1737 	        this.type = syntax_1.Syntax.ThrowStatement;
       
  1738 	        this.argument = argument;
       
  1739 	    }
       
  1740 	    return ThrowStatement;
       
  1741 	}());
       
  1742 	exports.ThrowStatement = ThrowStatement;
       
  1743 	var TryStatement = (function () {
       
  1744 	    function TryStatement(block, handler, finalizer) {
       
  1745 	        this.type = syntax_1.Syntax.TryStatement;
       
  1746 	        this.block = block;
       
  1747 	        this.handler = handler;
       
  1748 	        this.finalizer = finalizer;
       
  1749 	    }
       
  1750 	    return TryStatement;
       
  1751 	}());
       
  1752 	exports.TryStatement = TryStatement;
       
  1753 	var UnaryExpression = (function () {
       
  1754 	    function UnaryExpression(operator, argument) {
       
  1755 	        this.type = syntax_1.Syntax.UnaryExpression;
       
  1756 	        this.operator = operator;
       
  1757 	        this.argument = argument;
       
  1758 	        this.prefix = true;
       
  1759 	    }
       
  1760 	    return UnaryExpression;
       
  1761 	}());
       
  1762 	exports.UnaryExpression = UnaryExpression;
       
  1763 	var UpdateExpression = (function () {
       
  1764 	    function UpdateExpression(operator, argument, prefix) {
       
  1765 	        this.type = syntax_1.Syntax.UpdateExpression;
       
  1766 	        this.operator = operator;
       
  1767 	        this.argument = argument;
       
  1768 	        this.prefix = prefix;
       
  1769 	    }
       
  1770 	    return UpdateExpression;
       
  1771 	}());
       
  1772 	exports.UpdateExpression = UpdateExpression;
       
  1773 	var VariableDeclaration = (function () {
       
  1774 	    function VariableDeclaration(declarations, kind) {
       
  1775 	        this.type = syntax_1.Syntax.VariableDeclaration;
       
  1776 	        this.declarations = declarations;
       
  1777 	        this.kind = kind;
       
  1778 	    }
       
  1779 	    return VariableDeclaration;
       
  1780 	}());
       
  1781 	exports.VariableDeclaration = VariableDeclaration;
       
  1782 	var VariableDeclarator = (function () {
       
  1783 	    function VariableDeclarator(id, init) {
       
  1784 	        this.type = syntax_1.Syntax.VariableDeclarator;
       
  1785 	        this.id = id;
       
  1786 	        this.init = init;
       
  1787 	    }
       
  1788 	    return VariableDeclarator;
       
  1789 	}());
       
  1790 	exports.VariableDeclarator = VariableDeclarator;
       
  1791 	var WhileStatement = (function () {
       
  1792 	    function WhileStatement(test, body) {
       
  1793 	        this.type = syntax_1.Syntax.WhileStatement;
       
  1794 	        this.test = test;
       
  1795 	        this.body = body;
       
  1796 	    }
       
  1797 	    return WhileStatement;
       
  1798 	}());
       
  1799 	exports.WhileStatement = WhileStatement;
       
  1800 	var WithStatement = (function () {
       
  1801 	    function WithStatement(object, body) {
       
  1802 	        this.type = syntax_1.Syntax.WithStatement;
       
  1803 	        this.object = object;
       
  1804 	        this.body = body;
       
  1805 	    }
       
  1806 	    return WithStatement;
       
  1807 	}());
       
  1808 	exports.WithStatement = WithStatement;
       
  1809 	var YieldExpression = (function () {
       
  1810 	    function YieldExpression(argument, delegate) {
       
  1811 	        this.type = syntax_1.Syntax.YieldExpression;
       
  1812 	        this.argument = argument;
       
  1813 	        this.delegate = delegate;
       
  1814 	    }
       
  1815 	    return YieldExpression;
       
  1816 	}());
       
  1817 	exports.YieldExpression = YieldExpression;
       
  1818 
       
  1819 
       
  1820 /***/ },
       
  1821 /* 8 */
       
  1822 /***/ function(module, exports, __webpack_require__) {
       
  1823 
       
  1824 	"use strict";
       
  1825 	Object.defineProperty(exports, "__esModule", { value: true });
       
  1826 	var assert_1 = __webpack_require__(9);
       
  1827 	var error_handler_1 = __webpack_require__(10);
       
  1828 	var messages_1 = __webpack_require__(11);
       
  1829 	var Node = __webpack_require__(7);
       
  1830 	var scanner_1 = __webpack_require__(12);
       
  1831 	var syntax_1 = __webpack_require__(2);
       
  1832 	var token_1 = __webpack_require__(13);
       
  1833 	var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
       
  1834 	var Parser = (function () {
       
  1835 	    function Parser(code, options, delegate) {
       
  1836 	        if (options === void 0) { options = {}; }
       
  1837 	        this.config = {
       
  1838 	            range: (typeof options.range === 'boolean') && options.range,
       
  1839 	            loc: (typeof options.loc === 'boolean') && options.loc,
       
  1840 	            source: null,
       
  1841 	            tokens: (typeof options.tokens === 'boolean') && options.tokens,
       
  1842 	            comment: (typeof options.comment === 'boolean') && options.comment,
       
  1843 	            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
       
  1844 	        };
       
  1845 	        if (this.config.loc && options.source && options.source !== null) {
       
  1846 	            this.config.source = String(options.source);
       
  1847 	        }
       
  1848 	        this.delegate = delegate;
       
  1849 	        this.errorHandler = new error_handler_1.ErrorHandler();
       
  1850 	        this.errorHandler.tolerant = this.config.tolerant;
       
  1851 	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
       
  1852 	        this.scanner.trackComment = this.config.comment;
       
  1853 	        this.operatorPrecedence = {
       
  1854 	            ')': 0,
       
  1855 	            ';': 0,
       
  1856 	            ',': 0,
       
  1857 	            '=': 0,
       
  1858 	            ']': 0,
       
  1859 	            '||': 1,
       
  1860 	            '&&': 2,
       
  1861 	            '|': 3,
       
  1862 	            '^': 4,
       
  1863 	            '&': 5,
       
  1864 	            '==': 6,
       
  1865 	            '!=': 6,
       
  1866 	            '===': 6,
       
  1867 	            '!==': 6,
       
  1868 	            '<': 7,
       
  1869 	            '>': 7,
       
  1870 	            '<=': 7,
       
  1871 	            '>=': 7,
       
  1872 	            '<<': 8,
       
  1873 	            '>>': 8,
       
  1874 	            '>>>': 8,
       
  1875 	            '+': 9,
       
  1876 	            '-': 9,
       
  1877 	            '*': 11,
       
  1878 	            '/': 11,
       
  1879 	            '%': 11
       
  1880 	        };
       
  1881 	        this.lookahead = {
       
  1882 	            type: 2 /* EOF */,
       
  1883 	            value: '',
       
  1884 	            lineNumber: this.scanner.lineNumber,
       
  1885 	            lineStart: 0,
       
  1886 	            start: 0,
       
  1887 	            end: 0
       
  1888 	        };
       
  1889 	        this.hasLineTerminator = false;
       
  1890 	        this.context = {
       
  1891 	            isModule: false,
       
  1892 	            await: false,
       
  1893 	            allowIn: true,
       
  1894 	            allowStrictDirective: true,
       
  1895 	            allowYield: true,
       
  1896 	            firstCoverInitializedNameError: null,
       
  1897 	            isAssignmentTarget: false,
       
  1898 	            isBindingElement: false,
       
  1899 	            inFunctionBody: false,
       
  1900 	            inIteration: false,
       
  1901 	            inSwitch: false,
       
  1902 	            labelSet: {},
       
  1903 	            strict: false
       
  1904 	        };
       
  1905 	        this.tokens = [];
       
  1906 	        this.startMarker = {
       
  1907 	            index: 0,
       
  1908 	            line: this.scanner.lineNumber,
       
  1909 	            column: 0
       
  1910 	        };
       
  1911 	        this.lastMarker = {
       
  1912 	            index: 0,
       
  1913 	            line: this.scanner.lineNumber,
       
  1914 	            column: 0
       
  1915 	        };
       
  1916 	        this.nextToken();
       
  1917 	        this.lastMarker = {
       
  1918 	            index: this.scanner.index,
       
  1919 	            line: this.scanner.lineNumber,
       
  1920 	            column: this.scanner.index - this.scanner.lineStart
       
  1921 	        };
       
  1922 	    }
       
  1923 	    Parser.prototype.throwError = function (messageFormat) {
       
  1924 	        var values = [];
       
  1925 	        for (var _i = 1; _i < arguments.length; _i++) {
       
  1926 	            values[_i - 1] = arguments[_i];
       
  1927 	        }
       
  1928 	        var args = Array.prototype.slice.call(arguments, 1);
       
  1929 	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
       
  1930 	            assert_1.assert(idx < args.length, 'Message reference must be in range');
       
  1931 	            return args[idx];
       
  1932 	        });
       
  1933 	        var index = this.lastMarker.index;
       
  1934 	        var line = this.lastMarker.line;
       
  1935 	        var column = this.lastMarker.column + 1;
       
  1936 	        throw this.errorHandler.createError(index, line, column, msg);
       
  1937 	    };
       
  1938 	    Parser.prototype.tolerateError = function (messageFormat) {
       
  1939 	        var values = [];
       
  1940 	        for (var _i = 1; _i < arguments.length; _i++) {
       
  1941 	            values[_i - 1] = arguments[_i];
       
  1942 	        }
       
  1943 	        var args = Array.prototype.slice.call(arguments, 1);
       
  1944 	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
       
  1945 	            assert_1.assert(idx < args.length, 'Message reference must be in range');
       
  1946 	            return args[idx];
       
  1947 	        });
       
  1948 	        var index = this.lastMarker.index;
       
  1949 	        var line = this.scanner.lineNumber;
       
  1950 	        var column = this.lastMarker.column + 1;
       
  1951 	        this.errorHandler.tolerateError(index, line, column, msg);
       
  1952 	    };
       
  1953 	    // Throw an exception because of the token.
       
  1954 	    Parser.prototype.unexpectedTokenError = function (token, message) {
       
  1955 	        var msg = message || messages_1.Messages.UnexpectedToken;
       
  1956 	        var value;
       
  1957 	        if (token) {
       
  1958 	            if (!message) {
       
  1959 	                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
       
  1960 	                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
       
  1961 	                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
       
  1962 	                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
       
  1963 	                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
       
  1964 	                                    messages_1.Messages.UnexpectedToken;
       
  1965 	                if (token.type === 4 /* Keyword */) {
       
  1966 	                    if (this.scanner.isFutureReservedWord(token.value)) {
       
  1967 	                        msg = messages_1.Messages.UnexpectedReserved;
       
  1968 	                    }
       
  1969 	                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
       
  1970 	                        msg = messages_1.Messages.StrictReservedWord;
       
  1971 	                    }
       
  1972 	                }
       
  1973 	            }
       
  1974 	            value = token.value;
       
  1975 	        }
       
  1976 	        else {
       
  1977 	            value = 'ILLEGAL';
       
  1978 	        }
       
  1979 	        msg = msg.replace('%0', value);
       
  1980 	        if (token && typeof token.lineNumber === 'number') {
       
  1981 	            var index = token.start;
       
  1982 	            var line = token.lineNumber;
       
  1983 	            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
       
  1984 	            var column = token.start - lastMarkerLineStart + 1;
       
  1985 	            return this.errorHandler.createError(index, line, column, msg);
       
  1986 	        }
       
  1987 	        else {
       
  1988 	            var index = this.lastMarker.index;
       
  1989 	            var line = this.lastMarker.line;
       
  1990 	            var column = this.lastMarker.column + 1;
       
  1991 	            return this.errorHandler.createError(index, line, column, msg);
       
  1992 	        }
       
  1993 	    };
       
  1994 	    Parser.prototype.throwUnexpectedToken = function (token, message) {
       
  1995 	        throw this.unexpectedTokenError(token, message);
       
  1996 	    };
       
  1997 	    Parser.prototype.tolerateUnexpectedToken = function (token, message) {
       
  1998 	        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
       
  1999 	    };
       
  2000 	    Parser.prototype.collectComments = function () {
       
  2001 	        if (!this.config.comment) {
       
  2002 	            this.scanner.scanComments();
       
  2003 	        }
       
  2004 	        else {
       
  2005 	            var comments = this.scanner.scanComments();
       
  2006 	            if (comments.length > 0 && this.delegate) {
       
  2007 	                for (var i = 0; i < comments.length; ++i) {
       
  2008 	                    var e = comments[i];
       
  2009 	                    var node = void 0;
       
  2010 	                    node = {
       
  2011 	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
       
  2012 	                        value: this.scanner.source.slice(e.slice[0], e.slice[1])
       
  2013 	                    };
       
  2014 	                    if (this.config.range) {
       
  2015 	                        node.range = e.range;
       
  2016 	                    }
       
  2017 	                    if (this.config.loc) {
       
  2018 	                        node.loc = e.loc;
       
  2019 	                    }
       
  2020 	                    var metadata = {
       
  2021 	                        start: {
       
  2022 	                            line: e.loc.start.line,
       
  2023 	                            column: e.loc.start.column,
       
  2024 	                            offset: e.range[0]
       
  2025 	                        },
       
  2026 	                        end: {
       
  2027 	                            line: e.loc.end.line,
       
  2028 	                            column: e.loc.end.column,
       
  2029 	                            offset: e.range[1]
       
  2030 	                        }
       
  2031 	                    };
       
  2032 	                    this.delegate(node, metadata);
       
  2033 	                }
       
  2034 	            }
       
  2035 	        }
       
  2036 	    };
       
  2037 	    // From internal representation to an external structure
       
  2038 	    Parser.prototype.getTokenRaw = function (token) {
       
  2039 	        return this.scanner.source.slice(token.start, token.end);
       
  2040 	    };
       
  2041 	    Parser.prototype.convertToken = function (token) {
       
  2042 	        var t = {
       
  2043 	            type: token_1.TokenName[token.type],
       
  2044 	            value: this.getTokenRaw(token)
       
  2045 	        };
       
  2046 	        if (this.config.range) {
       
  2047 	            t.range = [token.start, token.end];
       
  2048 	        }
       
  2049 	        if (this.config.loc) {
       
  2050 	            t.loc = {
       
  2051 	                start: {
       
  2052 	                    line: this.startMarker.line,
       
  2053 	                    column: this.startMarker.column
       
  2054 	                },
       
  2055 	                end: {
       
  2056 	                    line: this.scanner.lineNumber,
       
  2057 	                    column: this.scanner.index - this.scanner.lineStart
       
  2058 	                }
       
  2059 	            };
       
  2060 	        }
       
  2061 	        if (token.type === 9 /* RegularExpression */) {
       
  2062 	            var pattern = token.pattern;
       
  2063 	            var flags = token.flags;
       
  2064 	            t.regex = { pattern: pattern, flags: flags };
       
  2065 	        }
       
  2066 	        return t;
       
  2067 	    };
       
  2068 	    Parser.prototype.nextToken = function () {
       
  2069 	        var token = this.lookahead;
       
  2070 	        this.lastMarker.index = this.scanner.index;
       
  2071 	        this.lastMarker.line = this.scanner.lineNumber;
       
  2072 	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
       
  2073 	        this.collectComments();
       
  2074 	        if (this.scanner.index !== this.startMarker.index) {
       
  2075 	            this.startMarker.index = this.scanner.index;
       
  2076 	            this.startMarker.line = this.scanner.lineNumber;
       
  2077 	            this.startMarker.column = this.scanner.index - this.scanner.lineStart;
       
  2078 	        }
       
  2079 	        var next = this.scanner.lex();
       
  2080 	        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
       
  2081 	        if (next && this.context.strict && next.type === 3 /* Identifier */) {
       
  2082 	            if (this.scanner.isStrictModeReservedWord(next.value)) {
       
  2083 	                next.type = 4 /* Keyword */;
       
  2084 	            }
       
  2085 	        }
       
  2086 	        this.lookahead = next;
       
  2087 	        if (this.config.tokens && next.type !== 2 /* EOF */) {
       
  2088 	            this.tokens.push(this.convertToken(next));
       
  2089 	        }
       
  2090 	        return token;
       
  2091 	    };
       
  2092 	    Parser.prototype.nextRegexToken = function () {
       
  2093 	        this.collectComments();
       
  2094 	        var token = this.scanner.scanRegExp();
       
  2095 	        if (this.config.tokens) {
       
  2096 	            // Pop the previous token, '/' or '/='
       
  2097 	            // This is added from the lookahead token.
       
  2098 	            this.tokens.pop();
       
  2099 	            this.tokens.push(this.convertToken(token));
       
  2100 	        }
       
  2101 	        // Prime the next lookahead.
       
  2102 	        this.lookahead = token;
       
  2103 	        this.nextToken();
       
  2104 	        return token;
       
  2105 	    };
       
  2106 	    Parser.prototype.createNode = function () {
       
  2107 	        return {
       
  2108 	            index: this.startMarker.index,
       
  2109 	            line: this.startMarker.line,
       
  2110 	            column: this.startMarker.column
       
  2111 	        };
       
  2112 	    };
       
  2113 	    Parser.prototype.startNode = function (token) {
       
  2114 	        return {
       
  2115 	            index: token.start,
       
  2116 	            line: token.lineNumber,
       
  2117 	            column: token.start - token.lineStart
       
  2118 	        };
       
  2119 	    };
       
  2120 	    Parser.prototype.finalize = function (marker, node) {
       
  2121 	        if (this.config.range) {
       
  2122 	            node.range = [marker.index, this.lastMarker.index];
       
  2123 	        }
       
  2124 	        if (this.config.loc) {
       
  2125 	            node.loc = {
       
  2126 	                start: {
       
  2127 	                    line: marker.line,
       
  2128 	                    column: marker.column,
       
  2129 	                },
       
  2130 	                end: {
       
  2131 	                    line: this.lastMarker.line,
       
  2132 	                    column: this.lastMarker.column
       
  2133 	                }
       
  2134 	            };
       
  2135 	            if (this.config.source) {
       
  2136 	                node.loc.source = this.config.source;
       
  2137 	            }
       
  2138 	        }
       
  2139 	        if (this.delegate) {
       
  2140 	            var metadata = {
       
  2141 	                start: {
       
  2142 	                    line: marker.line,
       
  2143 	                    column: marker.column,
       
  2144 	                    offset: marker.index
       
  2145 	                },
       
  2146 	                end: {
       
  2147 	                    line: this.lastMarker.line,
       
  2148 	                    column: this.lastMarker.column,
       
  2149 	                    offset: this.lastMarker.index
       
  2150 	                }
       
  2151 	            };
       
  2152 	            this.delegate(node, metadata);
       
  2153 	        }
       
  2154 	        return node;
       
  2155 	    };
       
  2156 	    // Expect the next token to match the specified punctuator.
       
  2157 	    // If not, an exception will be thrown.
       
  2158 	    Parser.prototype.expect = function (value) {
       
  2159 	        var token = this.nextToken();
       
  2160 	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
       
  2161 	            this.throwUnexpectedToken(token);
       
  2162 	        }
       
  2163 	    };
       
  2164 	    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
       
  2165 	    Parser.prototype.expectCommaSeparator = function () {
       
  2166 	        if (this.config.tolerant) {
       
  2167 	            var token = this.lookahead;
       
  2168 	            if (token.type === 7 /* Punctuator */ && token.value === ',') {
       
  2169 	                this.nextToken();
       
  2170 	            }
       
  2171 	            else if (token.type === 7 /* Punctuator */ && token.value === ';') {
       
  2172 	                this.nextToken();
       
  2173 	                this.tolerateUnexpectedToken(token);
       
  2174 	            }
       
  2175 	            else {
       
  2176 	                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
       
  2177 	            }
       
  2178 	        }
       
  2179 	        else {
       
  2180 	            this.expect(',');
       
  2181 	        }
       
  2182 	    };
       
  2183 	    // Expect the next token to match the specified keyword.
       
  2184 	    // If not, an exception will be thrown.
       
  2185 	    Parser.prototype.expectKeyword = function (keyword) {
       
  2186 	        var token = this.nextToken();
       
  2187 	        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
       
  2188 	            this.throwUnexpectedToken(token);
       
  2189 	        }
       
  2190 	    };
       
  2191 	    // Return true if the next token matches the specified punctuator.
       
  2192 	    Parser.prototype.match = function (value) {
       
  2193 	        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
       
  2194 	    };
       
  2195 	    // Return true if the next token matches the specified keyword
       
  2196 	    Parser.prototype.matchKeyword = function (keyword) {
       
  2197 	        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
       
  2198 	    };
       
  2199 	    // Return true if the next token matches the specified contextual keyword
       
  2200 	    // (where an identifier is sometimes a keyword depending on the context)
       
  2201 	    Parser.prototype.matchContextualKeyword = function (keyword) {
       
  2202 	        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
       
  2203 	    };
       
  2204 	    // Return true if the next token is an assignment operator
       
  2205 	    Parser.prototype.matchAssign = function () {
       
  2206 	        if (this.lookahead.type !== 7 /* Punctuator */) {
       
  2207 	            return false;
       
  2208 	        }
       
  2209 	        var op = this.lookahead.value;
       
  2210 	        return op === '=' ||
       
  2211 	            op === '*=' ||
       
  2212 	            op === '**=' ||
       
  2213 	            op === '/=' ||
       
  2214 	            op === '%=' ||
       
  2215 	            op === '+=' ||
       
  2216 	            op === '-=' ||
       
  2217 	            op === '<<=' ||
       
  2218 	            op === '>>=' ||
       
  2219 	            op === '>>>=' ||
       
  2220 	            op === '&=' ||
       
  2221 	            op === '^=' ||
       
  2222 	            op === '|=';
       
  2223 	    };
       
  2224 	    // Cover grammar support.
       
  2225 	    //
       
  2226 	    // When an assignment expression position starts with an left parenthesis, the determination of the type
       
  2227 	    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
       
  2228 	    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
       
  2229 	    //
       
  2230 	    // There are three productions that can be parsed in a parentheses pair that needs to be determined
       
  2231 	    // after the outermost pair is closed. They are:
       
  2232 	    //
       
  2233 	    //   1. AssignmentExpression
       
  2234 	    //   2. BindingElements
       
  2235 	    //   3. AssignmentTargets
       
  2236 	    //
       
  2237 	    // In order to avoid exponential backtracking, we use two flags to denote if the production can be
       
  2238 	    // binding element or assignment target.
       
  2239 	    //
       
  2240 	    // The three productions have the relationship:
       
  2241 	    //
       
  2242 	    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
       
  2243 	    //
       
  2244 	    // with a single exception that CoverInitializedName when used directly in an Expression, generates
       
  2245 	    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
       
  2246 	    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
       
  2247 	    //
       
  2248 	    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
       
  2249 	    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
       
  2250 	    // the CoverInitializedName check is conducted.
       
  2251 	    //
       
  2252 	    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
       
  2253 	    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
       
  2254 	    // pattern. The CoverInitializedName check is deferred.
       
  2255 	    Parser.prototype.isolateCoverGrammar = function (parseFunction) {
       
  2256 	        var previousIsBindingElement = this.context.isBindingElement;
       
  2257 	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
       
  2258 	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
       
  2259 	        this.context.isBindingElement = true;
       
  2260 	        this.context.isAssignmentTarget = true;
       
  2261 	        this.context.firstCoverInitializedNameError = null;
       
  2262 	        var result = parseFunction.call(this);
       
  2263 	        if (this.context.firstCoverInitializedNameError !== null) {
       
  2264 	            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
       
  2265 	        }
       
  2266 	        this.context.isBindingElement = previousIsBindingElement;
       
  2267 	        this.context.isAssignmentTarget = previousIsAssignmentTarget;
       
  2268 	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
       
  2269 	        return result;
       
  2270 	    };
       
  2271 	    Parser.prototype.inheritCoverGrammar = function (parseFunction) {
       
  2272 	        var previousIsBindingElement = this.context.isBindingElement;
       
  2273 	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
       
  2274 	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
       
  2275 	        this.context.isBindingElement = true;
       
  2276 	        this.context.isAssignmentTarget = true;
       
  2277 	        this.context.firstCoverInitializedNameError = null;
       
  2278 	        var result = parseFunction.call(this);
       
  2279 	        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
       
  2280 	        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
       
  2281 	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
       
  2282 	        return result;
       
  2283 	    };
       
  2284 	    Parser.prototype.consumeSemicolon = function () {
       
  2285 	        if (this.match(';')) {
       
  2286 	            this.nextToken();
       
  2287 	        }
       
  2288 	        else if (!this.hasLineTerminator) {
       
  2289 	            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
       
  2290 	                this.throwUnexpectedToken(this.lookahead);
       
  2291 	            }
       
  2292 	            this.lastMarker.index = this.startMarker.index;
       
  2293 	            this.lastMarker.line = this.startMarker.line;
       
  2294 	            this.lastMarker.column = this.startMarker.column;
       
  2295 	        }
       
  2296 	    };
       
  2297 	    // https://tc39.github.io/ecma262/#sec-primary-expression
       
  2298 	    Parser.prototype.parsePrimaryExpression = function () {
       
  2299 	        var node = this.createNode();
       
  2300 	        var expr;
       
  2301 	        var token, raw;
       
  2302 	        switch (this.lookahead.type) {
       
  2303 	            case 3 /* Identifier */:
       
  2304 	                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
       
  2305 	                    this.tolerateUnexpectedToken(this.lookahead);
       
  2306 	                }
       
  2307 	                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
       
  2308 	                break;
       
  2309 	            case 6 /* NumericLiteral */:
       
  2310 	            case 8 /* StringLiteral */:
       
  2311 	                if (this.context.strict && this.lookahead.octal) {
       
  2312 	                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
       
  2313 	                }
       
  2314 	                this.context.isAssignmentTarget = false;
       
  2315 	                this.context.isBindingElement = false;
       
  2316 	                token = this.nextToken();
       
  2317 	                raw = this.getTokenRaw(token);
       
  2318 	                expr = this.finalize(node, new Node.Literal(token.value, raw));
       
  2319 	                break;
       
  2320 	            case 1 /* BooleanLiteral */:
       
  2321 	                this.context.isAssignmentTarget = false;
       
  2322 	                this.context.isBindingElement = false;
       
  2323 	                token = this.nextToken();
       
  2324 	                raw = this.getTokenRaw(token);
       
  2325 	                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
       
  2326 	                break;
       
  2327 	            case 5 /* NullLiteral */:
       
  2328 	                this.context.isAssignmentTarget = false;
       
  2329 	                this.context.isBindingElement = false;
       
  2330 	                token = this.nextToken();
       
  2331 	                raw = this.getTokenRaw(token);
       
  2332 	                expr = this.finalize(node, new Node.Literal(null, raw));
       
  2333 	                break;
       
  2334 	            case 10 /* Template */:
       
  2335 	                expr = this.parseTemplateLiteral();
       
  2336 	                break;
       
  2337 	            case 7 /* Punctuator */:
       
  2338 	                switch (this.lookahead.value) {
       
  2339 	                    case '(':
       
  2340 	                        this.context.isBindingElement = false;
       
  2341 	                        expr = this.inheritCoverGrammar(this.parseGroupExpression);
       
  2342 	                        break;
       
  2343 	                    case '[':
       
  2344 	                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);
       
  2345 	                        break;
       
  2346 	                    case '{':
       
  2347 	                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);
       
  2348 	                        break;
       
  2349 	                    case '/':
       
  2350 	                    case '/=':
       
  2351 	                        this.context.isAssignmentTarget = false;
       
  2352 	                        this.context.isBindingElement = false;
       
  2353 	                        this.scanner.index = this.startMarker.index;
       
  2354 	                        token = this.nextRegexToken();
       
  2355 	                        raw = this.getTokenRaw(token);
       
  2356 	                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
       
  2357 	                        break;
       
  2358 	                    default:
       
  2359 	                        expr = this.throwUnexpectedToken(this.nextToken());
       
  2360 	                }
       
  2361 	                break;
       
  2362 	            case 4 /* Keyword */:
       
  2363 	                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
       
  2364 	                    expr = this.parseIdentifierName();
       
  2365 	                }
       
  2366 	                else if (!this.context.strict && this.matchKeyword('let')) {
       
  2367 	                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
       
  2368 	                }
       
  2369 	                else {
       
  2370 	                    this.context.isAssignmentTarget = false;
       
  2371 	                    this.context.isBindingElement = false;
       
  2372 	                    if (this.matchKeyword('function')) {
       
  2373 	                        expr = this.parseFunctionExpression();
       
  2374 	                    }
       
  2375 	                    else if (this.matchKeyword('this')) {
       
  2376 	                        this.nextToken();
       
  2377 	                        expr = this.finalize(node, new Node.ThisExpression());
       
  2378 	                    }
       
  2379 	                    else if (this.matchKeyword('class')) {
       
  2380 	                        expr = this.parseClassExpression();
       
  2381 	                    }
       
  2382 	                    else {
       
  2383 	                        expr = this.throwUnexpectedToken(this.nextToken());
       
  2384 	                    }
       
  2385 	                }
       
  2386 	                break;
       
  2387 	            default:
       
  2388 	                expr = this.throwUnexpectedToken(this.nextToken());
       
  2389 	        }
       
  2390 	        return expr;
       
  2391 	    };
       
  2392 	    // https://tc39.github.io/ecma262/#sec-array-initializer
       
  2393 	    Parser.prototype.parseSpreadElement = function () {
       
  2394 	        var node = this.createNode();
       
  2395 	        this.expect('...');
       
  2396 	        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
       
  2397 	        return this.finalize(node, new Node.SpreadElement(arg));
       
  2398 	    };
       
  2399 	    Parser.prototype.parseArrayInitializer = function () {
       
  2400 	        var node = this.createNode();
       
  2401 	        var elements = [];
       
  2402 	        this.expect('[');
       
  2403 	        while (!this.match(']')) {
       
  2404 	            if (this.match(',')) {
       
  2405 	                this.nextToken();
       
  2406 	                elements.push(null);
       
  2407 	            }
       
  2408 	            else if (this.match('...')) {
       
  2409 	                var element = this.parseSpreadElement();
       
  2410 	                if (!this.match(']')) {
       
  2411 	                    this.context.isAssignmentTarget = false;
       
  2412 	                    this.context.isBindingElement = false;
       
  2413 	                    this.expect(',');
       
  2414 	                }
       
  2415 	                elements.push(element);
       
  2416 	            }
       
  2417 	            else {
       
  2418 	                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
       
  2419 	                if (!this.match(']')) {
       
  2420 	                    this.expect(',');
       
  2421 	                }
       
  2422 	            }
       
  2423 	        }
       
  2424 	        this.expect(']');
       
  2425 	        return this.finalize(node, new Node.ArrayExpression(elements));
       
  2426 	    };
       
  2427 	    // https://tc39.github.io/ecma262/#sec-object-initializer
       
  2428 	    Parser.prototype.parsePropertyMethod = function (params) {
       
  2429 	        this.context.isAssignmentTarget = false;
       
  2430 	        this.context.isBindingElement = false;
       
  2431 	        var previousStrict = this.context.strict;
       
  2432 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
       
  2433 	        this.context.allowStrictDirective = params.simple;
       
  2434 	        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
       
  2435 	        if (this.context.strict && params.firstRestricted) {
       
  2436 	            this.tolerateUnexpectedToken(params.firstRestricted, params.message);
       
  2437 	        }
       
  2438 	        if (this.context.strict && params.stricted) {
       
  2439 	            this.tolerateUnexpectedToken(params.stricted, params.message);
       
  2440 	        }
       
  2441 	        this.context.strict = previousStrict;
       
  2442 	        this.context.allowStrictDirective = previousAllowStrictDirective;
       
  2443 	        return body;
       
  2444 	    };
       
  2445 	    Parser.prototype.parsePropertyMethodFunction = function () {
       
  2446 	        var isGenerator = false;
       
  2447 	        var node = this.createNode();
       
  2448 	        var previousAllowYield = this.context.allowYield;
       
  2449 	        this.context.allowYield = false;
       
  2450 	        var params = this.parseFormalParameters();
       
  2451 	        var method = this.parsePropertyMethod(params);
       
  2452 	        this.context.allowYield = previousAllowYield;
       
  2453 	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
       
  2454 	    };
       
  2455 	    Parser.prototype.parsePropertyMethodAsyncFunction = function () {
       
  2456 	        var node = this.createNode();
       
  2457 	        var previousAllowYield = this.context.allowYield;
       
  2458 	        var previousAwait = this.context.await;
       
  2459 	        this.context.allowYield = false;
       
  2460 	        this.context.await = true;
       
  2461 	        var params = this.parseFormalParameters();
       
  2462 	        var method = this.parsePropertyMethod(params);
       
  2463 	        this.context.allowYield = previousAllowYield;
       
  2464 	        this.context.await = previousAwait;
       
  2465 	        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
       
  2466 	    };
       
  2467 	    Parser.prototype.parseObjectPropertyKey = function () {
       
  2468 	        var node = this.createNode();
       
  2469 	        var token = this.nextToken();
       
  2470 	        var key;
       
  2471 	        switch (token.type) {
       
  2472 	            case 8 /* StringLiteral */:
       
  2473 	            case 6 /* NumericLiteral */:
       
  2474 	                if (this.context.strict && token.octal) {
       
  2475 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
       
  2476 	                }
       
  2477 	                var raw = this.getTokenRaw(token);
       
  2478 	                key = this.finalize(node, new Node.Literal(token.value, raw));
       
  2479 	                break;
       
  2480 	            case 3 /* Identifier */:
       
  2481 	            case 1 /* BooleanLiteral */:
       
  2482 	            case 5 /* NullLiteral */:
       
  2483 	            case 4 /* Keyword */:
       
  2484 	                key = this.finalize(node, new Node.Identifier(token.value));
       
  2485 	                break;
       
  2486 	            case 7 /* Punctuator */:
       
  2487 	                if (token.value === '[') {
       
  2488 	                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  2489 	                    this.expect(']');
       
  2490 	                }
       
  2491 	                else {
       
  2492 	                    key = this.throwUnexpectedToken(token);
       
  2493 	                }
       
  2494 	                break;
       
  2495 	            default:
       
  2496 	                key = this.throwUnexpectedToken(token);
       
  2497 	        }
       
  2498 	        return key;
       
  2499 	    };
       
  2500 	    Parser.prototype.isPropertyKey = function (key, value) {
       
  2501 	        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
       
  2502 	            (key.type === syntax_1.Syntax.Literal && key.value === value);
       
  2503 	    };
       
  2504 	    Parser.prototype.parseObjectProperty = function (hasProto) {
       
  2505 	        var node = this.createNode();
       
  2506 	        var token = this.lookahead;
       
  2507 	        var kind;
       
  2508 	        var key = null;
       
  2509 	        var value = null;
       
  2510 	        var computed = false;
       
  2511 	        var method = false;
       
  2512 	        var shorthand = false;
       
  2513 	        var isAsync = false;
       
  2514 	        if (token.type === 3 /* Identifier */) {
       
  2515 	            var id = token.value;
       
  2516 	            this.nextToken();
       
  2517 	            computed = this.match('[');
       
  2518 	            isAsync = !this.hasLineTerminator && (id === 'async') &&
       
  2519 	                !this.match(':') && !this.match('(') && !this.match('*');
       
  2520 	            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
       
  2521 	        }
       
  2522 	        else if (this.match('*')) {
       
  2523 	            this.nextToken();
       
  2524 	        }
       
  2525 	        else {
       
  2526 	            computed = this.match('[');
       
  2527 	            key = this.parseObjectPropertyKey();
       
  2528 	        }
       
  2529 	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
       
  2530 	        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
       
  2531 	            kind = 'get';
       
  2532 	            computed = this.match('[');
       
  2533 	            key = this.parseObjectPropertyKey();
       
  2534 	            this.context.allowYield = false;
       
  2535 	            value = this.parseGetterMethod();
       
  2536 	        }
       
  2537 	        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
       
  2538 	            kind = 'set';
       
  2539 	            computed = this.match('[');
       
  2540 	            key = this.parseObjectPropertyKey();
       
  2541 	            value = this.parseSetterMethod();
       
  2542 	        }
       
  2543 	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
       
  2544 	            kind = 'init';
       
  2545 	            computed = this.match('[');
       
  2546 	            key = this.parseObjectPropertyKey();
       
  2547 	            value = this.parseGeneratorMethod();
       
  2548 	            method = true;
       
  2549 	        }
       
  2550 	        else {
       
  2551 	            if (!key) {
       
  2552 	                this.throwUnexpectedToken(this.lookahead);
       
  2553 	            }
       
  2554 	            kind = 'init';
       
  2555 	            if (this.match(':') && !isAsync) {
       
  2556 	                if (!computed && this.isPropertyKey(key, '__proto__')) {
       
  2557 	                    if (hasProto.value) {
       
  2558 	                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
       
  2559 	                    }
       
  2560 	                    hasProto.value = true;
       
  2561 	                }
       
  2562 	                this.nextToken();
       
  2563 	                value = this.inheritCoverGrammar(this.parseAssignmentExpression);
       
  2564 	            }
       
  2565 	            else if (this.match('(')) {
       
  2566 	                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
       
  2567 	                method = true;
       
  2568 	            }
       
  2569 	            else if (token.type === 3 /* Identifier */) {
       
  2570 	                var id = this.finalize(node, new Node.Identifier(token.value));
       
  2571 	                if (this.match('=')) {
       
  2572 	                    this.context.firstCoverInitializedNameError = this.lookahead;
       
  2573 	                    this.nextToken();
       
  2574 	                    shorthand = true;
       
  2575 	                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  2576 	                    value = this.finalize(node, new Node.AssignmentPattern(id, init));
       
  2577 	                }
       
  2578 	                else {
       
  2579 	                    shorthand = true;
       
  2580 	                    value = id;
       
  2581 	                }
       
  2582 	            }
       
  2583 	            else {
       
  2584 	                this.throwUnexpectedToken(this.nextToken());
       
  2585 	            }
       
  2586 	        }
       
  2587 	        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
       
  2588 	    };
       
  2589 	    Parser.prototype.parseObjectInitializer = function () {
       
  2590 	        var node = this.createNode();
       
  2591 	        this.expect('{');
       
  2592 	        var properties = [];
       
  2593 	        var hasProto = { value: false };
       
  2594 	        while (!this.match('}')) {
       
  2595 	            properties.push(this.parseObjectProperty(hasProto));
       
  2596 	            if (!this.match('}')) {
       
  2597 	                this.expectCommaSeparator();
       
  2598 	            }
       
  2599 	        }
       
  2600 	        this.expect('}');
       
  2601 	        return this.finalize(node, new Node.ObjectExpression(properties));
       
  2602 	    };
       
  2603 	    // https://tc39.github.io/ecma262/#sec-template-literals
       
  2604 	    Parser.prototype.parseTemplateHead = function () {
       
  2605 	        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
       
  2606 	        var node = this.createNode();
       
  2607 	        var token = this.nextToken();
       
  2608 	        var raw = token.value;
       
  2609 	        var cooked = token.cooked;
       
  2610 	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
       
  2611 	    };
       
  2612 	    Parser.prototype.parseTemplateElement = function () {
       
  2613 	        if (this.lookahead.type !== 10 /* Template */) {
       
  2614 	            this.throwUnexpectedToken();
       
  2615 	        }
       
  2616 	        var node = this.createNode();
       
  2617 	        var token = this.nextToken();
       
  2618 	        var raw = token.value;
       
  2619 	        var cooked = token.cooked;
       
  2620 	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
       
  2621 	    };
       
  2622 	    Parser.prototype.parseTemplateLiteral = function () {
       
  2623 	        var node = this.createNode();
       
  2624 	        var expressions = [];
       
  2625 	        var quasis = [];
       
  2626 	        var quasi = this.parseTemplateHead();
       
  2627 	        quasis.push(quasi);
       
  2628 	        while (!quasi.tail) {
       
  2629 	            expressions.push(this.parseExpression());
       
  2630 	            quasi = this.parseTemplateElement();
       
  2631 	            quasis.push(quasi);
       
  2632 	        }
       
  2633 	        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
       
  2634 	    };
       
  2635 	    // https://tc39.github.io/ecma262/#sec-grouping-operator
       
  2636 	    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
       
  2637 	        switch (expr.type) {
       
  2638 	            case syntax_1.Syntax.Identifier:
       
  2639 	            case syntax_1.Syntax.MemberExpression:
       
  2640 	            case syntax_1.Syntax.RestElement:
       
  2641 	            case syntax_1.Syntax.AssignmentPattern:
       
  2642 	                break;
       
  2643 	            case syntax_1.Syntax.SpreadElement:
       
  2644 	                expr.type = syntax_1.Syntax.RestElement;
       
  2645 	                this.reinterpretExpressionAsPattern(expr.argument);
       
  2646 	                break;
       
  2647 	            case syntax_1.Syntax.ArrayExpression:
       
  2648 	                expr.type = syntax_1.Syntax.ArrayPattern;
       
  2649 	                for (var i = 0; i < expr.elements.length; i++) {
       
  2650 	                    if (expr.elements[i] !== null) {
       
  2651 	                        this.reinterpretExpressionAsPattern(expr.elements[i]);
       
  2652 	                    }
       
  2653 	                }
       
  2654 	                break;
       
  2655 	            case syntax_1.Syntax.ObjectExpression:
       
  2656 	                expr.type = syntax_1.Syntax.ObjectPattern;
       
  2657 	                for (var i = 0; i < expr.properties.length; i++) {
       
  2658 	                    this.reinterpretExpressionAsPattern(expr.properties[i].value);
       
  2659 	                }
       
  2660 	                break;
       
  2661 	            case syntax_1.Syntax.AssignmentExpression:
       
  2662 	                expr.type = syntax_1.Syntax.AssignmentPattern;
       
  2663 	                delete expr.operator;
       
  2664 	                this.reinterpretExpressionAsPattern(expr.left);
       
  2665 	                break;
       
  2666 	            default:
       
  2667 	                // Allow other node type for tolerant parsing.
       
  2668 	                break;
       
  2669 	        }
       
  2670 	    };
       
  2671 	    Parser.prototype.parseGroupExpression = function () {
       
  2672 	        var expr;
       
  2673 	        this.expect('(');
       
  2674 	        if (this.match(')')) {
       
  2675 	            this.nextToken();
       
  2676 	            if (!this.match('=>')) {
       
  2677 	                this.expect('=>');
       
  2678 	            }
       
  2679 	            expr = {
       
  2680 	                type: ArrowParameterPlaceHolder,
       
  2681 	                params: [],
       
  2682 	                async: false
       
  2683 	            };
       
  2684 	        }
       
  2685 	        else {
       
  2686 	            var startToken = this.lookahead;
       
  2687 	            var params = [];
       
  2688 	            if (this.match('...')) {
       
  2689 	                expr = this.parseRestElement(params);
       
  2690 	                this.expect(')');
       
  2691 	                if (!this.match('=>')) {
       
  2692 	                    this.expect('=>');
       
  2693 	                }
       
  2694 	                expr = {
       
  2695 	                    type: ArrowParameterPlaceHolder,
       
  2696 	                    params: [expr],
       
  2697 	                    async: false
       
  2698 	                };
       
  2699 	            }
       
  2700 	            else {
       
  2701 	                var arrow = false;
       
  2702 	                this.context.isBindingElement = true;
       
  2703 	                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
       
  2704 	                if (this.match(',')) {
       
  2705 	                    var expressions = [];
       
  2706 	                    this.context.isAssignmentTarget = false;
       
  2707 	                    expressions.push(expr);
       
  2708 	                    while (this.lookahead.type !== 2 /* EOF */) {
       
  2709 	                        if (!this.match(',')) {
       
  2710 	                            break;
       
  2711 	                        }
       
  2712 	                        this.nextToken();
       
  2713 	                        if (this.match(')')) {
       
  2714 	                            this.nextToken();
       
  2715 	                            for (var i = 0; i < expressions.length; i++) {
       
  2716 	                                this.reinterpretExpressionAsPattern(expressions[i]);
       
  2717 	                            }
       
  2718 	                            arrow = true;
       
  2719 	                            expr = {
       
  2720 	                                type: ArrowParameterPlaceHolder,
       
  2721 	                                params: expressions,
       
  2722 	                                async: false
       
  2723 	                            };
       
  2724 	                        }
       
  2725 	                        else if (this.match('...')) {
       
  2726 	                            if (!this.context.isBindingElement) {
       
  2727 	                                this.throwUnexpectedToken(this.lookahead);
       
  2728 	                            }
       
  2729 	                            expressions.push(this.parseRestElement(params));
       
  2730 	                            this.expect(')');
       
  2731 	                            if (!this.match('=>')) {
       
  2732 	                                this.expect('=>');
       
  2733 	                            }
       
  2734 	                            this.context.isBindingElement = false;
       
  2735 	                            for (var i = 0; i < expressions.length; i++) {
       
  2736 	                                this.reinterpretExpressionAsPattern(expressions[i]);
       
  2737 	                            }
       
  2738 	                            arrow = true;
       
  2739 	                            expr = {
       
  2740 	                                type: ArrowParameterPlaceHolder,
       
  2741 	                                params: expressions,
       
  2742 	                                async: false
       
  2743 	                            };
       
  2744 	                        }
       
  2745 	                        else {
       
  2746 	                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
       
  2747 	                        }
       
  2748 	                        if (arrow) {
       
  2749 	                            break;
       
  2750 	                        }
       
  2751 	                    }
       
  2752 	                    if (!arrow) {
       
  2753 	                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
       
  2754 	                    }
       
  2755 	                }
       
  2756 	                if (!arrow) {
       
  2757 	                    this.expect(')');
       
  2758 	                    if (this.match('=>')) {
       
  2759 	                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
       
  2760 	                            arrow = true;
       
  2761 	                            expr = {
       
  2762 	                                type: ArrowParameterPlaceHolder,
       
  2763 	                                params: [expr],
       
  2764 	                                async: false
       
  2765 	                            };
       
  2766 	                        }
       
  2767 	                        if (!arrow) {
       
  2768 	                            if (!this.context.isBindingElement) {
       
  2769 	                                this.throwUnexpectedToken(this.lookahead);
       
  2770 	                            }
       
  2771 	                            if (expr.type === syntax_1.Syntax.SequenceExpression) {
       
  2772 	                                for (var i = 0; i < expr.expressions.length; i++) {
       
  2773 	                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);
       
  2774 	                                }
       
  2775 	                            }
       
  2776 	                            else {
       
  2777 	                                this.reinterpretExpressionAsPattern(expr);
       
  2778 	                            }
       
  2779 	                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
       
  2780 	                            expr = {
       
  2781 	                                type: ArrowParameterPlaceHolder,
       
  2782 	                                params: parameters,
       
  2783 	                                async: false
       
  2784 	                            };
       
  2785 	                        }
       
  2786 	                    }
       
  2787 	                    this.context.isBindingElement = false;
       
  2788 	                }
       
  2789 	            }
       
  2790 	        }
       
  2791 	        return expr;
       
  2792 	    };
       
  2793 	    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
       
  2794 	    Parser.prototype.parseArguments = function () {
       
  2795 	        this.expect('(');
       
  2796 	        var args = [];
       
  2797 	        if (!this.match(')')) {
       
  2798 	            while (true) {
       
  2799 	                var expr = this.match('...') ? this.parseSpreadElement() :
       
  2800 	                    this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  2801 	                args.push(expr);
       
  2802 	                if (this.match(')')) {
       
  2803 	                    break;
       
  2804 	                }
       
  2805 	                this.expectCommaSeparator();
       
  2806 	                if (this.match(')')) {
       
  2807 	                    break;
       
  2808 	                }
       
  2809 	            }
       
  2810 	        }
       
  2811 	        this.expect(')');
       
  2812 	        return args;
       
  2813 	    };
       
  2814 	    Parser.prototype.isIdentifierName = function (token) {
       
  2815 	        return token.type === 3 /* Identifier */ ||
       
  2816 	            token.type === 4 /* Keyword */ ||
       
  2817 	            token.type === 1 /* BooleanLiteral */ ||
       
  2818 	            token.type === 5 /* NullLiteral */;
       
  2819 	    };
       
  2820 	    Parser.prototype.parseIdentifierName = function () {
       
  2821 	        var node = this.createNode();
       
  2822 	        var token = this.nextToken();
       
  2823 	        if (!this.isIdentifierName(token)) {
       
  2824 	            this.throwUnexpectedToken(token);
       
  2825 	        }
       
  2826 	        return this.finalize(node, new Node.Identifier(token.value));
       
  2827 	    };
       
  2828 	    Parser.prototype.parseNewExpression = function () {
       
  2829 	        var node = this.createNode();
       
  2830 	        var id = this.parseIdentifierName();
       
  2831 	        assert_1.assert(id.name === 'new', 'New expression must start with `new`');
       
  2832 	        var expr;
       
  2833 	        if (this.match('.')) {
       
  2834 	            this.nextToken();
       
  2835 	            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
       
  2836 	                var property = this.parseIdentifierName();
       
  2837 	                expr = new Node.MetaProperty(id, property);
       
  2838 	            }
       
  2839 	            else {
       
  2840 	                this.throwUnexpectedToken(this.lookahead);
       
  2841 	            }
       
  2842 	        }
       
  2843 	        else {
       
  2844 	            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
       
  2845 	            var args = this.match('(') ? this.parseArguments() : [];
       
  2846 	            expr = new Node.NewExpression(callee, args);
       
  2847 	            this.context.isAssignmentTarget = false;
       
  2848 	            this.context.isBindingElement = false;
       
  2849 	        }
       
  2850 	        return this.finalize(node, expr);
       
  2851 	    };
       
  2852 	    Parser.prototype.parseAsyncArgument = function () {
       
  2853 	        var arg = this.parseAssignmentExpression();
       
  2854 	        this.context.firstCoverInitializedNameError = null;
       
  2855 	        return arg;
       
  2856 	    };
       
  2857 	    Parser.prototype.parseAsyncArguments = function () {
       
  2858 	        this.expect('(');
       
  2859 	        var args = [];
       
  2860 	        if (!this.match(')')) {
       
  2861 	            while (true) {
       
  2862 	                var expr = this.match('...') ? this.parseSpreadElement() :
       
  2863 	                    this.isolateCoverGrammar(this.parseAsyncArgument);
       
  2864 	                args.push(expr);
       
  2865 	                if (this.match(')')) {
       
  2866 	                    break;
       
  2867 	                }
       
  2868 	                this.expectCommaSeparator();
       
  2869 	                if (this.match(')')) {
       
  2870 	                    break;
       
  2871 	                }
       
  2872 	            }
       
  2873 	        }
       
  2874 	        this.expect(')');
       
  2875 	        return args;
       
  2876 	    };
       
  2877 	    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
       
  2878 	        var startToken = this.lookahead;
       
  2879 	        var maybeAsync = this.matchContextualKeyword('async');
       
  2880 	        var previousAllowIn = this.context.allowIn;
       
  2881 	        this.context.allowIn = true;
       
  2882 	        var expr;
       
  2883 	        if (this.matchKeyword('super') && this.context.inFunctionBody) {
       
  2884 	            expr = this.createNode();
       
  2885 	            this.nextToken();
       
  2886 	            expr = this.finalize(expr, new Node.Super());
       
  2887 	            if (!this.match('(') && !this.match('.') && !this.match('[')) {
       
  2888 	                this.throwUnexpectedToken(this.lookahead);
       
  2889 	            }
       
  2890 	        }
       
  2891 	        else {
       
  2892 	            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
       
  2893 	        }
       
  2894 	        while (true) {
       
  2895 	            if (this.match('.')) {
       
  2896 	                this.context.isBindingElement = false;
       
  2897 	                this.context.isAssignmentTarget = true;
       
  2898 	                this.expect('.');
       
  2899 	                var property = this.parseIdentifierName();
       
  2900 	                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
       
  2901 	            }
       
  2902 	            else if (this.match('(')) {
       
  2903 	                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
       
  2904 	                this.context.isBindingElement = false;
       
  2905 	                this.context.isAssignmentTarget = false;
       
  2906 	                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
       
  2907 	                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
       
  2908 	                if (asyncArrow && this.match('=>')) {
       
  2909 	                    for (var i = 0; i < args.length; ++i) {
       
  2910 	                        this.reinterpretExpressionAsPattern(args[i]);
       
  2911 	                    }
       
  2912 	                    expr = {
       
  2913 	                        type: ArrowParameterPlaceHolder,
       
  2914 	                        params: args,
       
  2915 	                        async: true
       
  2916 	                    };
       
  2917 	                }
       
  2918 	            }
       
  2919 	            else if (this.match('[')) {
       
  2920 	                this.context.isBindingElement = false;
       
  2921 	                this.context.isAssignmentTarget = true;
       
  2922 	                this.expect('[');
       
  2923 	                var property = this.isolateCoverGrammar(this.parseExpression);
       
  2924 	                this.expect(']');
       
  2925 	                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
       
  2926 	            }
       
  2927 	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
       
  2928 	                var quasi = this.parseTemplateLiteral();
       
  2929 	                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
       
  2930 	            }
       
  2931 	            else {
       
  2932 	                break;
       
  2933 	            }
       
  2934 	        }
       
  2935 	        this.context.allowIn = previousAllowIn;
       
  2936 	        return expr;
       
  2937 	    };
       
  2938 	    Parser.prototype.parseSuper = function () {
       
  2939 	        var node = this.createNode();
       
  2940 	        this.expectKeyword('super');
       
  2941 	        if (!this.match('[') && !this.match('.')) {
       
  2942 	            this.throwUnexpectedToken(this.lookahead);
       
  2943 	        }
       
  2944 	        return this.finalize(node, new Node.Super());
       
  2945 	    };
       
  2946 	    Parser.prototype.parseLeftHandSideExpression = function () {
       
  2947 	        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
       
  2948 	        var node = this.startNode(this.lookahead);
       
  2949 	        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
       
  2950 	            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
       
  2951 	        while (true) {
       
  2952 	            if (this.match('[')) {
       
  2953 	                this.context.isBindingElement = false;
       
  2954 	                this.context.isAssignmentTarget = true;
       
  2955 	                this.expect('[');
       
  2956 	                var property = this.isolateCoverGrammar(this.parseExpression);
       
  2957 	                this.expect(']');
       
  2958 	                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
       
  2959 	            }
       
  2960 	            else if (this.match('.')) {
       
  2961 	                this.context.isBindingElement = false;
       
  2962 	                this.context.isAssignmentTarget = true;
       
  2963 	                this.expect('.');
       
  2964 	                var property = this.parseIdentifierName();
       
  2965 	                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
       
  2966 	            }
       
  2967 	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
       
  2968 	                var quasi = this.parseTemplateLiteral();
       
  2969 	                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
       
  2970 	            }
       
  2971 	            else {
       
  2972 	                break;
       
  2973 	            }
       
  2974 	        }
       
  2975 	        return expr;
       
  2976 	    };
       
  2977 	    // https://tc39.github.io/ecma262/#sec-update-expressions
       
  2978 	    Parser.prototype.parseUpdateExpression = function () {
       
  2979 	        var expr;
       
  2980 	        var startToken = this.lookahead;
       
  2981 	        if (this.match('++') || this.match('--')) {
       
  2982 	            var node = this.startNode(startToken);
       
  2983 	            var token = this.nextToken();
       
  2984 	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
       
  2985 	            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
       
  2986 	                this.tolerateError(messages_1.Messages.StrictLHSPrefix);
       
  2987 	            }
       
  2988 	            if (!this.context.isAssignmentTarget) {
       
  2989 	                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
       
  2990 	            }
       
  2991 	            var prefix = true;
       
  2992 	            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
       
  2993 	            this.context.isAssignmentTarget = false;
       
  2994 	            this.context.isBindingElement = false;
       
  2995 	        }
       
  2996 	        else {
       
  2997 	            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
       
  2998 	            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
       
  2999 	                if (this.match('++') || this.match('--')) {
       
  3000 	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
       
  3001 	                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);
       
  3002 	                    }
       
  3003 	                    if (!this.context.isAssignmentTarget) {
       
  3004 	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
       
  3005 	                    }
       
  3006 	                    this.context.isAssignmentTarget = false;
       
  3007 	                    this.context.isBindingElement = false;
       
  3008 	                    var operator = this.nextToken().value;
       
  3009 	                    var prefix = false;
       
  3010 	                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
       
  3011 	                }
       
  3012 	            }
       
  3013 	        }
       
  3014 	        return expr;
       
  3015 	    };
       
  3016 	    // https://tc39.github.io/ecma262/#sec-unary-operators
       
  3017 	    Parser.prototype.parseAwaitExpression = function () {
       
  3018 	        var node = this.createNode();
       
  3019 	        this.nextToken();
       
  3020 	        var argument = this.parseUnaryExpression();
       
  3021 	        return this.finalize(node, new Node.AwaitExpression(argument));
       
  3022 	    };
       
  3023 	    Parser.prototype.parseUnaryExpression = function () {
       
  3024 	        var expr;
       
  3025 	        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
       
  3026 	            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
       
  3027 	            var node = this.startNode(this.lookahead);
       
  3028 	            var token = this.nextToken();
       
  3029 	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
       
  3030 	            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
       
  3031 	            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
       
  3032 	                this.tolerateError(messages_1.Messages.StrictDelete);
       
  3033 	            }
       
  3034 	            this.context.isAssignmentTarget = false;
       
  3035 	            this.context.isBindingElement = false;
       
  3036 	        }
       
  3037 	        else if (this.context.await && this.matchContextualKeyword('await')) {
       
  3038 	            expr = this.parseAwaitExpression();
       
  3039 	        }
       
  3040 	        else {
       
  3041 	            expr = this.parseUpdateExpression();
       
  3042 	        }
       
  3043 	        return expr;
       
  3044 	    };
       
  3045 	    Parser.prototype.parseExponentiationExpression = function () {
       
  3046 	        var startToken = this.lookahead;
       
  3047 	        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
       
  3048 	        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
       
  3049 	            this.nextToken();
       
  3050 	            this.context.isAssignmentTarget = false;
       
  3051 	            this.context.isBindingElement = false;
       
  3052 	            var left = expr;
       
  3053 	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
       
  3054 	            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
       
  3055 	        }
       
  3056 	        return expr;
       
  3057 	    };
       
  3058 	    // https://tc39.github.io/ecma262/#sec-exp-operator
       
  3059 	    // https://tc39.github.io/ecma262/#sec-multiplicative-operators
       
  3060 	    // https://tc39.github.io/ecma262/#sec-additive-operators
       
  3061 	    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
       
  3062 	    // https://tc39.github.io/ecma262/#sec-relational-operators
       
  3063 	    // https://tc39.github.io/ecma262/#sec-equality-operators
       
  3064 	    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
       
  3065 	    // https://tc39.github.io/ecma262/#sec-binary-logical-operators
       
  3066 	    Parser.prototype.binaryPrecedence = function (token) {
       
  3067 	        var op = token.value;
       
  3068 	        var precedence;
       
  3069 	        if (token.type === 7 /* Punctuator */) {
       
  3070 	            precedence = this.operatorPrecedence[op] || 0;
       
  3071 	        }
       
  3072 	        else if (token.type === 4 /* Keyword */) {
       
  3073 	            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
       
  3074 	        }
       
  3075 	        else {
       
  3076 	            precedence = 0;
       
  3077 	        }
       
  3078 	        return precedence;
       
  3079 	    };
       
  3080 	    Parser.prototype.parseBinaryExpression = function () {
       
  3081 	        var startToken = this.lookahead;
       
  3082 	        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
       
  3083 	        var token = this.lookahead;
       
  3084 	        var prec = this.binaryPrecedence(token);
       
  3085 	        if (prec > 0) {
       
  3086 	            this.nextToken();
       
  3087 	            this.context.isAssignmentTarget = false;
       
  3088 	            this.context.isBindingElement = false;
       
  3089 	            var markers = [startToken, this.lookahead];
       
  3090 	            var left = expr;
       
  3091 	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
       
  3092 	            var stack = [left, token.value, right];
       
  3093 	            var precedences = [prec];
       
  3094 	            while (true) {
       
  3095 	                prec = this.binaryPrecedence(this.lookahead);
       
  3096 	                if (prec <= 0) {
       
  3097 	                    break;
       
  3098 	                }
       
  3099 	                // Reduce: make a binary expression from the three topmost entries.
       
  3100 	                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
       
  3101 	                    right = stack.pop();
       
  3102 	                    var operator = stack.pop();
       
  3103 	                    precedences.pop();
       
  3104 	                    left = stack.pop();
       
  3105 	                    markers.pop();
       
  3106 	                    var node = this.startNode(markers[markers.length - 1]);
       
  3107 	                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
       
  3108 	                }
       
  3109 	                // Shift.
       
  3110 	                stack.push(this.nextToken().value);
       
  3111 	                precedences.push(prec);
       
  3112 	                markers.push(this.lookahead);
       
  3113 	                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
       
  3114 	            }
       
  3115 	            // Final reduce to clean-up the stack.
       
  3116 	            var i = stack.length - 1;
       
  3117 	            expr = stack[i];
       
  3118 	            markers.pop();
       
  3119 	            while (i > 1) {
       
  3120 	                var node = this.startNode(markers.pop());
       
  3121 	                var operator = stack[i - 1];
       
  3122 	                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
       
  3123 	                i -= 2;
       
  3124 	            }
       
  3125 	        }
       
  3126 	        return expr;
       
  3127 	    };
       
  3128 	    // https://tc39.github.io/ecma262/#sec-conditional-operator
       
  3129 	    Parser.prototype.parseConditionalExpression = function () {
       
  3130 	        var startToken = this.lookahead;
       
  3131 	        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
       
  3132 	        if (this.match('?')) {
       
  3133 	            this.nextToken();
       
  3134 	            var previousAllowIn = this.context.allowIn;
       
  3135 	            this.context.allowIn = true;
       
  3136 	            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3137 	            this.context.allowIn = previousAllowIn;
       
  3138 	            this.expect(':');
       
  3139 	            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3140 	            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
       
  3141 	            this.context.isAssignmentTarget = false;
       
  3142 	            this.context.isBindingElement = false;
       
  3143 	        }
       
  3144 	        return expr;
       
  3145 	    };
       
  3146 	    // https://tc39.github.io/ecma262/#sec-assignment-operators
       
  3147 	    Parser.prototype.checkPatternParam = function (options, param) {
       
  3148 	        switch (param.type) {
       
  3149 	            case syntax_1.Syntax.Identifier:
       
  3150 	                this.validateParam(options, param, param.name);
       
  3151 	                break;
       
  3152 	            case syntax_1.Syntax.RestElement:
       
  3153 	                this.checkPatternParam(options, param.argument);
       
  3154 	                break;
       
  3155 	            case syntax_1.Syntax.AssignmentPattern:
       
  3156 	                this.checkPatternParam(options, param.left);
       
  3157 	                break;
       
  3158 	            case syntax_1.Syntax.ArrayPattern:
       
  3159 	                for (var i = 0; i < param.elements.length; i++) {
       
  3160 	                    if (param.elements[i] !== null) {
       
  3161 	                        this.checkPatternParam(options, param.elements[i]);
       
  3162 	                    }
       
  3163 	                }
       
  3164 	                break;
       
  3165 	            case syntax_1.Syntax.ObjectPattern:
       
  3166 	                for (var i = 0; i < param.properties.length; i++) {
       
  3167 	                    this.checkPatternParam(options, param.properties[i].value);
       
  3168 	                }
       
  3169 	                break;
       
  3170 	            default:
       
  3171 	                break;
       
  3172 	        }
       
  3173 	        options.simple = options.simple && (param instanceof Node.Identifier);
       
  3174 	    };
       
  3175 	    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
       
  3176 	        var params = [expr];
       
  3177 	        var options;
       
  3178 	        var asyncArrow = false;
       
  3179 	        switch (expr.type) {
       
  3180 	            case syntax_1.Syntax.Identifier:
       
  3181 	                break;
       
  3182 	            case ArrowParameterPlaceHolder:
       
  3183 	                params = expr.params;
       
  3184 	                asyncArrow = expr.async;
       
  3185 	                break;
       
  3186 	            default:
       
  3187 	                return null;
       
  3188 	        }
       
  3189 	        options = {
       
  3190 	            simple: true,
       
  3191 	            paramSet: {}
       
  3192 	        };
       
  3193 	        for (var i = 0; i < params.length; ++i) {
       
  3194 	            var param = params[i];
       
  3195 	            if (param.type === syntax_1.Syntax.AssignmentPattern) {
       
  3196 	                if (param.right.type === syntax_1.Syntax.YieldExpression) {
       
  3197 	                    if (param.right.argument) {
       
  3198 	                        this.throwUnexpectedToken(this.lookahead);
       
  3199 	                    }
       
  3200 	                    param.right.type = syntax_1.Syntax.Identifier;
       
  3201 	                    param.right.name = 'yield';
       
  3202 	                    delete param.right.argument;
       
  3203 	                    delete param.right.delegate;
       
  3204 	                }
       
  3205 	            }
       
  3206 	            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
       
  3207 	                this.throwUnexpectedToken(this.lookahead);
       
  3208 	            }
       
  3209 	            this.checkPatternParam(options, param);
       
  3210 	            params[i] = param;
       
  3211 	        }
       
  3212 	        if (this.context.strict || !this.context.allowYield) {
       
  3213 	            for (var i = 0; i < params.length; ++i) {
       
  3214 	                var param = params[i];
       
  3215 	                if (param.type === syntax_1.Syntax.YieldExpression) {
       
  3216 	                    this.throwUnexpectedToken(this.lookahead);
       
  3217 	                }
       
  3218 	            }
       
  3219 	        }
       
  3220 	        if (options.message === messages_1.Messages.StrictParamDupe) {
       
  3221 	            var token = this.context.strict ? options.stricted : options.firstRestricted;
       
  3222 	            this.throwUnexpectedToken(token, options.message);
       
  3223 	        }
       
  3224 	        return {
       
  3225 	            simple: options.simple,
       
  3226 	            params: params,
       
  3227 	            stricted: options.stricted,
       
  3228 	            firstRestricted: options.firstRestricted,
       
  3229 	            message: options.message
       
  3230 	        };
       
  3231 	    };
       
  3232 	    Parser.prototype.parseAssignmentExpression = function () {
       
  3233 	        var expr;
       
  3234 	        if (!this.context.allowYield && this.matchKeyword('yield')) {
       
  3235 	            expr = this.parseYieldExpression();
       
  3236 	        }
       
  3237 	        else {
       
  3238 	            var startToken = this.lookahead;
       
  3239 	            var token = startToken;
       
  3240 	            expr = this.parseConditionalExpression();
       
  3241 	            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
       
  3242 	                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
       
  3243 	                    var arg = this.parsePrimaryExpression();
       
  3244 	                    this.reinterpretExpressionAsPattern(arg);
       
  3245 	                    expr = {
       
  3246 	                        type: ArrowParameterPlaceHolder,
       
  3247 	                        params: [arg],
       
  3248 	                        async: true
       
  3249 	                    };
       
  3250 	                }
       
  3251 	            }
       
  3252 	            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
       
  3253 	                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
       
  3254 	                this.context.isAssignmentTarget = false;
       
  3255 	                this.context.isBindingElement = false;
       
  3256 	                var isAsync = expr.async;
       
  3257 	                var list = this.reinterpretAsCoverFormalsList(expr);
       
  3258 	                if (list) {
       
  3259 	                    if (this.hasLineTerminator) {
       
  3260 	                        this.tolerateUnexpectedToken(this.lookahead);
       
  3261 	                    }
       
  3262 	                    this.context.firstCoverInitializedNameError = null;
       
  3263 	                    var previousStrict = this.context.strict;
       
  3264 	                    var previousAllowStrictDirective = this.context.allowStrictDirective;
       
  3265 	                    this.context.allowStrictDirective = list.simple;
       
  3266 	                    var previousAllowYield = this.context.allowYield;
       
  3267 	                    var previousAwait = this.context.await;
       
  3268 	                    this.context.allowYield = true;
       
  3269 	                    this.context.await = isAsync;
       
  3270 	                    var node = this.startNode(startToken);
       
  3271 	                    this.expect('=>');
       
  3272 	                    var body = void 0;
       
  3273 	                    if (this.match('{')) {
       
  3274 	                        var previousAllowIn = this.context.allowIn;
       
  3275 	                        this.context.allowIn = true;
       
  3276 	                        body = this.parseFunctionSourceElements();
       
  3277 	                        this.context.allowIn = previousAllowIn;
       
  3278 	                    }
       
  3279 	                    else {
       
  3280 	                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3281 	                    }
       
  3282 	                    var expression = body.type !== syntax_1.Syntax.BlockStatement;
       
  3283 	                    if (this.context.strict && list.firstRestricted) {
       
  3284 	                        this.throwUnexpectedToken(list.firstRestricted, list.message);
       
  3285 	                    }
       
  3286 	                    if (this.context.strict && list.stricted) {
       
  3287 	                        this.tolerateUnexpectedToken(list.stricted, list.message);
       
  3288 	                    }
       
  3289 	                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
       
  3290 	                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
       
  3291 	                    this.context.strict = previousStrict;
       
  3292 	                    this.context.allowStrictDirective = previousAllowStrictDirective;
       
  3293 	                    this.context.allowYield = previousAllowYield;
       
  3294 	                    this.context.await = previousAwait;
       
  3295 	                }
       
  3296 	            }
       
  3297 	            else {
       
  3298 	                if (this.matchAssign()) {
       
  3299 	                    if (!this.context.isAssignmentTarget) {
       
  3300 	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
       
  3301 	                    }
       
  3302 	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
       
  3303 	                        var id = expr;
       
  3304 	                        if (this.scanner.isRestrictedWord(id.name)) {
       
  3305 	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
       
  3306 	                        }
       
  3307 	                        if (this.scanner.isStrictModeReservedWord(id.name)) {
       
  3308 	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
       
  3309 	                        }
       
  3310 	                    }
       
  3311 	                    if (!this.match('=')) {
       
  3312 	                        this.context.isAssignmentTarget = false;
       
  3313 	                        this.context.isBindingElement = false;
       
  3314 	                    }
       
  3315 	                    else {
       
  3316 	                        this.reinterpretExpressionAsPattern(expr);
       
  3317 	                    }
       
  3318 	                    token = this.nextToken();
       
  3319 	                    var operator = token.value;
       
  3320 	                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3321 	                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
       
  3322 	                    this.context.firstCoverInitializedNameError = null;
       
  3323 	                }
       
  3324 	            }
       
  3325 	        }
       
  3326 	        return expr;
       
  3327 	    };
       
  3328 	    // https://tc39.github.io/ecma262/#sec-comma-operator
       
  3329 	    Parser.prototype.parseExpression = function () {
       
  3330 	        var startToken = this.lookahead;
       
  3331 	        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3332 	        if (this.match(',')) {
       
  3333 	            var expressions = [];
       
  3334 	            expressions.push(expr);
       
  3335 	            while (this.lookahead.type !== 2 /* EOF */) {
       
  3336 	                if (!this.match(',')) {
       
  3337 	                    break;
       
  3338 	                }
       
  3339 	                this.nextToken();
       
  3340 	                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
       
  3341 	            }
       
  3342 	            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
       
  3343 	        }
       
  3344 	        return expr;
       
  3345 	    };
       
  3346 	    // https://tc39.github.io/ecma262/#sec-block
       
  3347 	    Parser.prototype.parseStatementListItem = function () {
       
  3348 	        var statement;
       
  3349 	        this.context.isAssignmentTarget = true;
       
  3350 	        this.context.isBindingElement = true;
       
  3351 	        if (this.lookahead.type === 4 /* Keyword */) {
       
  3352 	            switch (this.lookahead.value) {
       
  3353 	                case 'export':
       
  3354 	                    if (!this.context.isModule) {
       
  3355 	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
       
  3356 	                    }
       
  3357 	                    statement = this.parseExportDeclaration();
       
  3358 	                    break;
       
  3359 	                case 'import':
       
  3360 	                    if (!this.context.isModule) {
       
  3361 	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
       
  3362 	                    }
       
  3363 	                    statement = this.parseImportDeclaration();
       
  3364 	                    break;
       
  3365 	                case 'const':
       
  3366 	                    statement = this.parseLexicalDeclaration({ inFor: false });
       
  3367 	                    break;
       
  3368 	                case 'function':
       
  3369 	                    statement = this.parseFunctionDeclaration();
       
  3370 	                    break;
       
  3371 	                case 'class':
       
  3372 	                    statement = this.parseClassDeclaration();
       
  3373 	                    break;
       
  3374 	                case 'let':
       
  3375 	                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
       
  3376 	                    break;
       
  3377 	                default:
       
  3378 	                    statement = this.parseStatement();
       
  3379 	                    break;
       
  3380 	            }
       
  3381 	        }
       
  3382 	        else {
       
  3383 	            statement = this.parseStatement();
       
  3384 	        }
       
  3385 	        return statement;
       
  3386 	    };
       
  3387 	    Parser.prototype.parseBlock = function () {
       
  3388 	        var node = this.createNode();
       
  3389 	        this.expect('{');
       
  3390 	        var block = [];
       
  3391 	        while (true) {
       
  3392 	            if (this.match('}')) {
       
  3393 	                break;
       
  3394 	            }
       
  3395 	            block.push(this.parseStatementListItem());
       
  3396 	        }
       
  3397 	        this.expect('}');
       
  3398 	        return this.finalize(node, new Node.BlockStatement(block));
       
  3399 	    };
       
  3400 	    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
       
  3401 	    Parser.prototype.parseLexicalBinding = function (kind, options) {
       
  3402 	        var node = this.createNode();
       
  3403 	        var params = [];
       
  3404 	        var id = this.parsePattern(params, kind);
       
  3405 	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
       
  3406 	            if (this.scanner.isRestrictedWord(id.name)) {
       
  3407 	                this.tolerateError(messages_1.Messages.StrictVarName);
       
  3408 	            }
       
  3409 	        }
       
  3410 	        var init = null;
       
  3411 	        if (kind === 'const') {
       
  3412 	            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
       
  3413 	                if (this.match('=')) {
       
  3414 	                    this.nextToken();
       
  3415 	                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3416 	                }
       
  3417 	                else {
       
  3418 	                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
       
  3419 	                }
       
  3420 	            }
       
  3421 	        }
       
  3422 	        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
       
  3423 	            this.expect('=');
       
  3424 	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3425 	        }
       
  3426 	        return this.finalize(node, new Node.VariableDeclarator(id, init));
       
  3427 	    };
       
  3428 	    Parser.prototype.parseBindingList = function (kind, options) {
       
  3429 	        var list = [this.parseLexicalBinding(kind, options)];
       
  3430 	        while (this.match(',')) {
       
  3431 	            this.nextToken();
       
  3432 	            list.push(this.parseLexicalBinding(kind, options));
       
  3433 	        }
       
  3434 	        return list;
       
  3435 	    };
       
  3436 	    Parser.prototype.isLexicalDeclaration = function () {
       
  3437 	        var state = this.scanner.saveState();
       
  3438 	        this.scanner.scanComments();
       
  3439 	        var next = this.scanner.lex();
       
  3440 	        this.scanner.restoreState(state);
       
  3441 	        return (next.type === 3 /* Identifier */) ||
       
  3442 	            (next.type === 7 /* Punctuator */ && next.value === '[') ||
       
  3443 	            (next.type === 7 /* Punctuator */ && next.value === '{') ||
       
  3444 	            (next.type === 4 /* Keyword */ && next.value === 'let') ||
       
  3445 	            (next.type === 4 /* Keyword */ && next.value === 'yield');
       
  3446 	    };
       
  3447 	    Parser.prototype.parseLexicalDeclaration = function (options) {
       
  3448 	        var node = this.createNode();
       
  3449 	        var kind = this.nextToken().value;
       
  3450 	        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
       
  3451 	        var declarations = this.parseBindingList(kind, options);
       
  3452 	        this.consumeSemicolon();
       
  3453 	        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
       
  3454 	    };
       
  3455 	    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
       
  3456 	    Parser.prototype.parseBindingRestElement = function (params, kind) {
       
  3457 	        var node = this.createNode();
       
  3458 	        this.expect('...');
       
  3459 	        var arg = this.parsePattern(params, kind);
       
  3460 	        return this.finalize(node, new Node.RestElement(arg));
       
  3461 	    };
       
  3462 	    Parser.prototype.parseArrayPattern = function (params, kind) {
       
  3463 	        var node = this.createNode();
       
  3464 	        this.expect('[');
       
  3465 	        var elements = [];
       
  3466 	        while (!this.match(']')) {
       
  3467 	            if (this.match(',')) {
       
  3468 	                this.nextToken();
       
  3469 	                elements.push(null);
       
  3470 	            }
       
  3471 	            else {
       
  3472 	                if (this.match('...')) {
       
  3473 	                    elements.push(this.parseBindingRestElement(params, kind));
       
  3474 	                    break;
       
  3475 	                }
       
  3476 	                else {
       
  3477 	                    elements.push(this.parsePatternWithDefault(params, kind));
       
  3478 	                }
       
  3479 	                if (!this.match(']')) {
       
  3480 	                    this.expect(',');
       
  3481 	                }
       
  3482 	            }
       
  3483 	        }
       
  3484 	        this.expect(']');
       
  3485 	        return this.finalize(node, new Node.ArrayPattern(elements));
       
  3486 	    };
       
  3487 	    Parser.prototype.parsePropertyPattern = function (params, kind) {
       
  3488 	        var node = this.createNode();
       
  3489 	        var computed = false;
       
  3490 	        var shorthand = false;
       
  3491 	        var method = false;
       
  3492 	        var key;
       
  3493 	        var value;
       
  3494 	        if (this.lookahead.type === 3 /* Identifier */) {
       
  3495 	            var keyToken = this.lookahead;
       
  3496 	            key = this.parseVariableIdentifier();
       
  3497 	            var init = this.finalize(node, new Node.Identifier(keyToken.value));
       
  3498 	            if (this.match('=')) {
       
  3499 	                params.push(keyToken);
       
  3500 	                shorthand = true;
       
  3501 	                this.nextToken();
       
  3502 	                var expr = this.parseAssignmentExpression();
       
  3503 	                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
       
  3504 	            }
       
  3505 	            else if (!this.match(':')) {
       
  3506 	                params.push(keyToken);
       
  3507 	                shorthand = true;
       
  3508 	                value = init;
       
  3509 	            }
       
  3510 	            else {
       
  3511 	                this.expect(':');
       
  3512 	                value = this.parsePatternWithDefault(params, kind);
       
  3513 	            }
       
  3514 	        }
       
  3515 	        else {
       
  3516 	            computed = this.match('[');
       
  3517 	            key = this.parseObjectPropertyKey();
       
  3518 	            this.expect(':');
       
  3519 	            value = this.parsePatternWithDefault(params, kind);
       
  3520 	        }
       
  3521 	        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
       
  3522 	    };
       
  3523 	    Parser.prototype.parseObjectPattern = function (params, kind) {
       
  3524 	        var node = this.createNode();
       
  3525 	        var properties = [];
       
  3526 	        this.expect('{');
       
  3527 	        while (!this.match('}')) {
       
  3528 	            properties.push(this.parsePropertyPattern(params, kind));
       
  3529 	            if (!this.match('}')) {
       
  3530 	                this.expect(',');
       
  3531 	            }
       
  3532 	        }
       
  3533 	        this.expect('}');
       
  3534 	        return this.finalize(node, new Node.ObjectPattern(properties));
       
  3535 	    };
       
  3536 	    Parser.prototype.parsePattern = function (params, kind) {
       
  3537 	        var pattern;
       
  3538 	        if (this.match('[')) {
       
  3539 	            pattern = this.parseArrayPattern(params, kind);
       
  3540 	        }
       
  3541 	        else if (this.match('{')) {
       
  3542 	            pattern = this.parseObjectPattern(params, kind);
       
  3543 	        }
       
  3544 	        else {
       
  3545 	            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
       
  3546 	                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
       
  3547 	            }
       
  3548 	            params.push(this.lookahead);
       
  3549 	            pattern = this.parseVariableIdentifier(kind);
       
  3550 	        }
       
  3551 	        return pattern;
       
  3552 	    };
       
  3553 	    Parser.prototype.parsePatternWithDefault = function (params, kind) {
       
  3554 	        var startToken = this.lookahead;
       
  3555 	        var pattern = this.parsePattern(params, kind);
       
  3556 	        if (this.match('=')) {
       
  3557 	            this.nextToken();
       
  3558 	            var previousAllowYield = this.context.allowYield;
       
  3559 	            this.context.allowYield = true;
       
  3560 	            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3561 	            this.context.allowYield = previousAllowYield;
       
  3562 	            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
       
  3563 	        }
       
  3564 	        return pattern;
       
  3565 	    };
       
  3566 	    // https://tc39.github.io/ecma262/#sec-variable-statement
       
  3567 	    Parser.prototype.parseVariableIdentifier = function (kind) {
       
  3568 	        var node = this.createNode();
       
  3569 	        var token = this.nextToken();
       
  3570 	        if (token.type === 4 /* Keyword */ && token.value === 'yield') {
       
  3571 	            if (this.context.strict) {
       
  3572 	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
       
  3573 	            }
       
  3574 	            else if (!this.context.allowYield) {
       
  3575 	                this.throwUnexpectedToken(token);
       
  3576 	            }
       
  3577 	        }
       
  3578 	        else if (token.type !== 3 /* Identifier */) {
       
  3579 	            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
       
  3580 	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
       
  3581 	            }
       
  3582 	            else {
       
  3583 	                if (this.context.strict || token.value !== 'let' || kind !== 'var') {
       
  3584 	                    this.throwUnexpectedToken(token);
       
  3585 	                }
       
  3586 	            }
       
  3587 	        }
       
  3588 	        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
       
  3589 	            this.tolerateUnexpectedToken(token);
       
  3590 	        }
       
  3591 	        return this.finalize(node, new Node.Identifier(token.value));
       
  3592 	    };
       
  3593 	    Parser.prototype.parseVariableDeclaration = function (options) {
       
  3594 	        var node = this.createNode();
       
  3595 	        var params = [];
       
  3596 	        var id = this.parsePattern(params, 'var');
       
  3597 	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
       
  3598 	            if (this.scanner.isRestrictedWord(id.name)) {
       
  3599 	                this.tolerateError(messages_1.Messages.StrictVarName);
       
  3600 	            }
       
  3601 	        }
       
  3602 	        var init = null;
       
  3603 	        if (this.match('=')) {
       
  3604 	            this.nextToken();
       
  3605 	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
       
  3606 	        }
       
  3607 	        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
       
  3608 	            this.expect('=');
       
  3609 	        }
       
  3610 	        return this.finalize(node, new Node.VariableDeclarator(id, init));
       
  3611 	    };
       
  3612 	    Parser.prototype.parseVariableDeclarationList = function (options) {
       
  3613 	        var opt = { inFor: options.inFor };
       
  3614 	        var list = [];
       
  3615 	        list.push(this.parseVariableDeclaration(opt));
       
  3616 	        while (this.match(',')) {
       
  3617 	            this.nextToken();
       
  3618 	            list.push(this.parseVariableDeclaration(opt));
       
  3619 	        }
       
  3620 	        return list;
       
  3621 	    };
       
  3622 	    Parser.prototype.parseVariableStatement = function () {
       
  3623 	        var node = this.createNode();
       
  3624 	        this.expectKeyword('var');
       
  3625 	        var declarations = this.parseVariableDeclarationList({ inFor: false });
       
  3626 	        this.consumeSemicolon();
       
  3627 	        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
       
  3628 	    };
       
  3629 	    // https://tc39.github.io/ecma262/#sec-empty-statement
       
  3630 	    Parser.prototype.parseEmptyStatement = function () {
       
  3631 	        var node = this.createNode();
       
  3632 	        this.expect(';');
       
  3633 	        return this.finalize(node, new Node.EmptyStatement());
       
  3634 	    };
       
  3635 	    // https://tc39.github.io/ecma262/#sec-expression-statement
       
  3636 	    Parser.prototype.parseExpressionStatement = function () {
       
  3637 	        var node = this.createNode();
       
  3638 	        var expr = this.parseExpression();
       
  3639 	        this.consumeSemicolon();
       
  3640 	        return this.finalize(node, new Node.ExpressionStatement(expr));
       
  3641 	    };
       
  3642 	    // https://tc39.github.io/ecma262/#sec-if-statement
       
  3643 	    Parser.prototype.parseIfClause = function () {
       
  3644 	        if (this.context.strict && this.matchKeyword('function')) {
       
  3645 	            this.tolerateError(messages_1.Messages.StrictFunction);
       
  3646 	        }
       
  3647 	        return this.parseStatement();
       
  3648 	    };
       
  3649 	    Parser.prototype.parseIfStatement = function () {
       
  3650 	        var node = this.createNode();
       
  3651 	        var consequent;
       
  3652 	        var alternate = null;
       
  3653 	        this.expectKeyword('if');
       
  3654 	        this.expect('(');
       
  3655 	        var test = this.parseExpression();
       
  3656 	        if (!this.match(')') && this.config.tolerant) {
       
  3657 	            this.tolerateUnexpectedToken(this.nextToken());
       
  3658 	            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
       
  3659 	        }
       
  3660 	        else {
       
  3661 	            this.expect(')');
       
  3662 	            consequent = this.parseIfClause();
       
  3663 	            if (this.matchKeyword('else')) {
       
  3664 	                this.nextToken();
       
  3665 	                alternate = this.parseIfClause();
       
  3666 	            }
       
  3667 	        }
       
  3668 	        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
       
  3669 	    };
       
  3670 	    // https://tc39.github.io/ecma262/#sec-do-while-statement
       
  3671 	    Parser.prototype.parseDoWhileStatement = function () {
       
  3672 	        var node = this.createNode();
       
  3673 	        this.expectKeyword('do');
       
  3674 	        var previousInIteration = this.context.inIteration;
       
  3675 	        this.context.inIteration = true;
       
  3676 	        var body = this.parseStatement();
       
  3677 	        this.context.inIteration = previousInIteration;
       
  3678 	        this.expectKeyword('while');
       
  3679 	        this.expect('(');
       
  3680 	        var test = this.parseExpression();
       
  3681 	        if (!this.match(')') && this.config.tolerant) {
       
  3682 	            this.tolerateUnexpectedToken(this.nextToken());
       
  3683 	        }
       
  3684 	        else {
       
  3685 	            this.expect(')');
       
  3686 	            if (this.match(';')) {
       
  3687 	                this.nextToken();
       
  3688 	            }
       
  3689 	        }
       
  3690 	        return this.finalize(node, new Node.DoWhileStatement(body, test));
       
  3691 	    };
       
  3692 	    // https://tc39.github.io/ecma262/#sec-while-statement
       
  3693 	    Parser.prototype.parseWhileStatement = function () {
       
  3694 	        var node = this.createNode();
       
  3695 	        var body;
       
  3696 	        this.expectKeyword('while');
       
  3697 	        this.expect('(');
       
  3698 	        var test = this.parseExpression();
       
  3699 	        if (!this.match(')') && this.config.tolerant) {
       
  3700 	            this.tolerateUnexpectedToken(this.nextToken());
       
  3701 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
       
  3702 	        }
       
  3703 	        else {
       
  3704 	            this.expect(')');
       
  3705 	            var previousInIteration = this.context.inIteration;
       
  3706 	            this.context.inIteration = true;
       
  3707 	            body = this.parseStatement();
       
  3708 	            this.context.inIteration = previousInIteration;
       
  3709 	        }
       
  3710 	        return this.finalize(node, new Node.WhileStatement(test, body));
       
  3711 	    };
       
  3712 	    // https://tc39.github.io/ecma262/#sec-for-statement
       
  3713 	    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
       
  3714 	    Parser.prototype.parseForStatement = function () {
       
  3715 	        var init = null;
       
  3716 	        var test = null;
       
  3717 	        var update = null;
       
  3718 	        var forIn = true;
       
  3719 	        var left, right;
       
  3720 	        var node = this.createNode();
       
  3721 	        this.expectKeyword('for');
       
  3722 	        this.expect('(');
       
  3723 	        if (this.match(';')) {
       
  3724 	            this.nextToken();
       
  3725 	        }
       
  3726 	        else {
       
  3727 	            if (this.matchKeyword('var')) {
       
  3728 	                init = this.createNode();
       
  3729 	                this.nextToken();
       
  3730 	                var previousAllowIn = this.context.allowIn;
       
  3731 	                this.context.allowIn = false;
       
  3732 	                var declarations = this.parseVariableDeclarationList({ inFor: true });
       
  3733 	                this.context.allowIn = previousAllowIn;
       
  3734 	                if (declarations.length === 1 && this.matchKeyword('in')) {
       
  3735 	                    var decl = declarations[0];
       
  3736 	                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
       
  3737 	                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
       
  3738 	                    }
       
  3739 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
       
  3740 	                    this.nextToken();
       
  3741 	                    left = init;
       
  3742 	                    right = this.parseExpression();
       
  3743 	                    init = null;
       
  3744 	                }
       
  3745 	                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
       
  3746 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
       
  3747 	                    this.nextToken();
       
  3748 	                    left = init;
       
  3749 	                    right = this.parseAssignmentExpression();
       
  3750 	                    init = null;
       
  3751 	                    forIn = false;
       
  3752 	                }
       
  3753 	                else {
       
  3754 	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
       
  3755 	                    this.expect(';');
       
  3756 	                }
       
  3757 	            }
       
  3758 	            else if (this.matchKeyword('const') || this.matchKeyword('let')) {
       
  3759 	                init = this.createNode();
       
  3760 	                var kind = this.nextToken().value;
       
  3761 	                if (!this.context.strict && this.lookahead.value === 'in') {
       
  3762 	                    init = this.finalize(init, new Node.Identifier(kind));
       
  3763 	                    this.nextToken();
       
  3764 	                    left = init;
       
  3765 	                    right = this.parseExpression();
       
  3766 	                    init = null;
       
  3767 	                }
       
  3768 	                else {
       
  3769 	                    var previousAllowIn = this.context.allowIn;
       
  3770 	                    this.context.allowIn = false;
       
  3771 	                    var declarations = this.parseBindingList(kind, { inFor: true });
       
  3772 	                    this.context.allowIn = previousAllowIn;
       
  3773 	                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
       
  3774 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
       
  3775 	                        this.nextToken();
       
  3776 	                        left = init;
       
  3777 	                        right = this.parseExpression();
       
  3778 	                        init = null;
       
  3779 	                    }
       
  3780 	                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
       
  3781 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
       
  3782 	                        this.nextToken();
       
  3783 	                        left = init;
       
  3784 	                        right = this.parseAssignmentExpression();
       
  3785 	                        init = null;
       
  3786 	                        forIn = false;
       
  3787 	                    }
       
  3788 	                    else {
       
  3789 	                        this.consumeSemicolon();
       
  3790 	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
       
  3791 	                    }
       
  3792 	                }
       
  3793 	            }
       
  3794 	            else {
       
  3795 	                var initStartToken = this.lookahead;
       
  3796 	                var previousAllowIn = this.context.allowIn;
       
  3797 	                this.context.allowIn = false;
       
  3798 	                init = this.inheritCoverGrammar(this.parseAssignmentExpression);
       
  3799 	                this.context.allowIn = previousAllowIn;
       
  3800 	                if (this.matchKeyword('in')) {
       
  3801 	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
       
  3802 	                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
       
  3803 	                    }
       
  3804 	                    this.nextToken();
       
  3805 	                    this.reinterpretExpressionAsPattern(init);
       
  3806 	                    left = init;
       
  3807 	                    right = this.parseExpression();
       
  3808 	                    init = null;
       
  3809 	                }
       
  3810 	                else if (this.matchContextualKeyword('of')) {
       
  3811 	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
       
  3812 	                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
       
  3813 	                    }
       
  3814 	                    this.nextToken();
       
  3815 	                    this.reinterpretExpressionAsPattern(init);
       
  3816 	                    left = init;
       
  3817 	                    right = this.parseAssignmentExpression();
       
  3818 	                    init = null;
       
  3819 	                    forIn = false;
       
  3820 	                }
       
  3821 	                else {
       
  3822 	                    if (this.match(',')) {
       
  3823 	                        var initSeq = [init];
       
  3824 	                        while (this.match(',')) {
       
  3825 	                            this.nextToken();
       
  3826 	                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
       
  3827 	                        }
       
  3828 	                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
       
  3829 	                    }
       
  3830 	                    this.expect(';');
       
  3831 	                }
       
  3832 	            }
       
  3833 	        }
       
  3834 	        if (typeof left === 'undefined') {
       
  3835 	            if (!this.match(';')) {
       
  3836 	                test = this.parseExpression();
       
  3837 	            }
       
  3838 	            this.expect(';');
       
  3839 	            if (!this.match(')')) {
       
  3840 	                update = this.parseExpression();
       
  3841 	            }
       
  3842 	        }
       
  3843 	        var body;
       
  3844 	        if (!this.match(')') && this.config.tolerant) {
       
  3845 	            this.tolerateUnexpectedToken(this.nextToken());
       
  3846 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
       
  3847 	        }
       
  3848 	        else {
       
  3849 	            this.expect(')');
       
  3850 	            var previousInIteration = this.context.inIteration;
       
  3851 	            this.context.inIteration = true;
       
  3852 	            body = this.isolateCoverGrammar(this.parseStatement);
       
  3853 	            this.context.inIteration = previousInIteration;
       
  3854 	        }
       
  3855 	        return (typeof left === 'undefined') ?
       
  3856 	            this.finalize(node, new Node.ForStatement(init, test, update, body)) :
       
  3857 	            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
       
  3858 	                this.finalize(node, new Node.ForOfStatement(left, right, body));
       
  3859 	    };
       
  3860 	    // https://tc39.github.io/ecma262/#sec-continue-statement
       
  3861 	    Parser.prototype.parseContinueStatement = function () {
       
  3862 	        var node = this.createNode();
       
  3863 	        this.expectKeyword('continue');
       
  3864 	        var label = null;
       
  3865 	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
       
  3866 	            var id = this.parseVariableIdentifier();
       
  3867 	            label = id;
       
  3868 	            var key = '$' + id.name;
       
  3869 	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
       
  3870 	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
       
  3871 	            }
       
  3872 	        }
       
  3873 	        this.consumeSemicolon();
       
  3874 	        if (label === null && !this.context.inIteration) {
       
  3875 	            this.throwError(messages_1.Messages.IllegalContinue);
       
  3876 	        }
       
  3877 	        return this.finalize(node, new Node.ContinueStatement(label));
       
  3878 	    };
       
  3879 	    // https://tc39.github.io/ecma262/#sec-break-statement
       
  3880 	    Parser.prototype.parseBreakStatement = function () {
       
  3881 	        var node = this.createNode();
       
  3882 	        this.expectKeyword('break');
       
  3883 	        var label = null;
       
  3884 	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
       
  3885 	            var id = this.parseVariableIdentifier();
       
  3886 	            var key = '$' + id.name;
       
  3887 	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
       
  3888 	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
       
  3889 	            }
       
  3890 	            label = id;
       
  3891 	        }
       
  3892 	        this.consumeSemicolon();
       
  3893 	        if (label === null && !this.context.inIteration && !this.context.inSwitch) {
       
  3894 	            this.throwError(messages_1.Messages.IllegalBreak);
       
  3895 	        }
       
  3896 	        return this.finalize(node, new Node.BreakStatement(label));
       
  3897 	    };
       
  3898 	    // https://tc39.github.io/ecma262/#sec-return-statement
       
  3899 	    Parser.prototype.parseReturnStatement = function () {
       
  3900 	        if (!this.context.inFunctionBody) {
       
  3901 	            this.tolerateError(messages_1.Messages.IllegalReturn);
       
  3902 	        }
       
  3903 	        var node = this.createNode();
       
  3904 	        this.expectKeyword('return');
       
  3905 	        var hasArgument = !this.match(';') && !this.match('}') &&
       
  3906 	            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */;
       
  3907 	        var argument = hasArgument ? this.parseExpression() : null;
       
  3908 	        this.consumeSemicolon();
       
  3909 	        return this.finalize(node, new Node.ReturnStatement(argument));
       
  3910 	    };
       
  3911 	    // https://tc39.github.io/ecma262/#sec-with-statement
       
  3912 	    Parser.prototype.parseWithStatement = function () {
       
  3913 	        if (this.context.strict) {
       
  3914 	            this.tolerateError(messages_1.Messages.StrictModeWith);
       
  3915 	        }
       
  3916 	        var node = this.createNode();
       
  3917 	        var body;
       
  3918 	        this.expectKeyword('with');
       
  3919 	        this.expect('(');
       
  3920 	        var object = this.parseExpression();
       
  3921 	        if (!this.match(')') && this.config.tolerant) {
       
  3922 	            this.tolerateUnexpectedToken(this.nextToken());
       
  3923 	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
       
  3924 	        }
       
  3925 	        else {
       
  3926 	            this.expect(')');
       
  3927 	            body = this.parseStatement();
       
  3928 	        }
       
  3929 	        return this.finalize(node, new Node.WithStatement(object, body));
       
  3930 	    };
       
  3931 	    // https://tc39.github.io/ecma262/#sec-switch-statement
       
  3932 	    Parser.prototype.parseSwitchCase = function () {
       
  3933 	        var node = this.createNode();
       
  3934 	        var test;
       
  3935 	        if (this.matchKeyword('default')) {
       
  3936 	            this.nextToken();
       
  3937 	            test = null;
       
  3938 	        }
       
  3939 	        else {
       
  3940 	            this.expectKeyword('case');
       
  3941 	            test = this.parseExpression();
       
  3942 	        }
       
  3943 	        this.expect(':');
       
  3944 	        var consequent = [];
       
  3945 	        while (true) {
       
  3946 	            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
       
  3947 	                break;
       
  3948 	            }
       
  3949 	            consequent.push(this.parseStatementListItem());
       
  3950 	        }
       
  3951 	        return this.finalize(node, new Node.SwitchCase(test, consequent));
       
  3952 	    };
       
  3953 	    Parser.prototype.parseSwitchStatement = function () {
       
  3954 	        var node = this.createNode();
       
  3955 	        this.expectKeyword('switch');
       
  3956 	        this.expect('(');
       
  3957 	        var discriminant = this.parseExpression();
       
  3958 	        this.expect(')');
       
  3959 	        var previousInSwitch = this.context.inSwitch;
       
  3960 	        this.context.inSwitch = true;
       
  3961 	        var cases = [];
       
  3962 	        var defaultFound = false;
       
  3963 	        this.expect('{');
       
  3964 	        while (true) {
       
  3965 	            if (this.match('}')) {
       
  3966 	                break;
       
  3967 	            }
       
  3968 	            var clause = this.parseSwitchCase();
       
  3969 	            if (clause.test === null) {
       
  3970 	                if (defaultFound) {
       
  3971 	                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
       
  3972 	                }
       
  3973 	                defaultFound = true;
       
  3974 	            }
       
  3975 	            cases.push(clause);
       
  3976 	        }
       
  3977 	        this.expect('}');
       
  3978 	        this.context.inSwitch = previousInSwitch;
       
  3979 	        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
       
  3980 	    };
       
  3981 	    // https://tc39.github.io/ecma262/#sec-labelled-statements
       
  3982 	    Parser.prototype.parseLabelledStatement = function () {
       
  3983 	        var node = this.createNode();
       
  3984 	        var expr = this.parseExpression();
       
  3985 	        var statement;
       
  3986 	        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
       
  3987 	            this.nextToken();
       
  3988 	            var id = expr;
       
  3989 	            var key = '$' + id.name;
       
  3990 	            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
       
  3991 	                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
       
  3992 	            }
       
  3993 	            this.context.labelSet[key] = true;
       
  3994 	            var body = void 0;
       
  3995 	            if (this.matchKeyword('class')) {
       
  3996 	                this.tolerateUnexpectedToken(this.lookahead);
       
  3997 	                body = this.parseClassDeclaration();
       
  3998 	            }
       
  3999 	            else if (this.matchKeyword('function')) {
       
  4000 	                var token = this.lookahead;
       
  4001 	                var declaration = this.parseFunctionDeclaration();
       
  4002 	                if (this.context.strict) {
       
  4003 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
       
  4004 	                }
       
  4005 	                else if (declaration.generator) {
       
  4006 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
       
  4007 	                }
       
  4008 	                body = declaration;
       
  4009 	            }
       
  4010 	            else {
       
  4011 	                body = this.parseStatement();
       
  4012 	            }
       
  4013 	            delete this.context.labelSet[key];
       
  4014 	            statement = new Node.LabeledStatement(id, body);
       
  4015 	        }
       
  4016 	        else {
       
  4017 	            this.consumeSemicolon();
       
  4018 	            statement = new Node.ExpressionStatement(expr);
       
  4019 	        }
       
  4020 	        return this.finalize(node, statement);
       
  4021 	    };
       
  4022 	    // https://tc39.github.io/ecma262/#sec-throw-statement
       
  4023 	    Parser.prototype.parseThrowStatement = function () {
       
  4024 	        var node = this.createNode();
       
  4025 	        this.expectKeyword('throw');
       
  4026 	        if (this.hasLineTerminator) {
       
  4027 	            this.throwError(messages_1.Messages.NewlineAfterThrow);
       
  4028 	        }
       
  4029 	        var argument = this.parseExpression();
       
  4030 	        this.consumeSemicolon();
       
  4031 	        return this.finalize(node, new Node.ThrowStatement(argument));
       
  4032 	    };
       
  4033 	    // https://tc39.github.io/ecma262/#sec-try-statement
       
  4034 	    Parser.prototype.parseCatchClause = function () {
       
  4035 	        var node = this.createNode();
       
  4036 	        this.expectKeyword('catch');
       
  4037 	        this.expect('(');
       
  4038 	        if (this.match(')')) {
       
  4039 	            this.throwUnexpectedToken(this.lookahead);
       
  4040 	        }
       
  4041 	        var params = [];
       
  4042 	        var param = this.parsePattern(params);
       
  4043 	        var paramMap = {};
       
  4044 	        for (var i = 0; i < params.length; i++) {
       
  4045 	            var key = '$' + params[i].value;
       
  4046 	            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
       
  4047 	                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
       
  4048 	            }
       
  4049 	            paramMap[key] = true;
       
  4050 	        }
       
  4051 	        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
       
  4052 	            if (this.scanner.isRestrictedWord(param.name)) {
       
  4053 	                this.tolerateError(messages_1.Messages.StrictCatchVariable);
       
  4054 	            }
       
  4055 	        }
       
  4056 	        this.expect(')');
       
  4057 	        var body = this.parseBlock();
       
  4058 	        return this.finalize(node, new Node.CatchClause(param, body));
       
  4059 	    };
       
  4060 	    Parser.prototype.parseFinallyClause = function () {
       
  4061 	        this.expectKeyword('finally');
       
  4062 	        return this.parseBlock();
       
  4063 	    };
       
  4064 	    Parser.prototype.parseTryStatement = function () {
       
  4065 	        var node = this.createNode();
       
  4066 	        this.expectKeyword('try');
       
  4067 	        var block = this.parseBlock();
       
  4068 	        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
       
  4069 	        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
       
  4070 	        if (!handler && !finalizer) {
       
  4071 	            this.throwError(messages_1.Messages.NoCatchOrFinally);
       
  4072 	        }
       
  4073 	        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
       
  4074 	    };
       
  4075 	    // https://tc39.github.io/ecma262/#sec-debugger-statement
       
  4076 	    Parser.prototype.parseDebuggerStatement = function () {
       
  4077 	        var node = this.createNode();
       
  4078 	        this.expectKeyword('debugger');
       
  4079 	        this.consumeSemicolon();
       
  4080 	        return this.finalize(node, new Node.DebuggerStatement());
       
  4081 	    };
       
  4082 	    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
       
  4083 	    Parser.prototype.parseStatement = function () {
       
  4084 	        var statement;
       
  4085 	        switch (this.lookahead.type) {
       
  4086 	            case 1 /* BooleanLiteral */:
       
  4087 	            case 5 /* NullLiteral */:
       
  4088 	            case 6 /* NumericLiteral */:
       
  4089 	            case 8 /* StringLiteral */:
       
  4090 	            case 10 /* Template */:
       
  4091 	            case 9 /* RegularExpression */:
       
  4092 	                statement = this.parseExpressionStatement();
       
  4093 	                break;
       
  4094 	            case 7 /* Punctuator */:
       
  4095 	                var value = this.lookahead.value;
       
  4096 	                if (value === '{') {
       
  4097 	                    statement = this.parseBlock();
       
  4098 	                }
       
  4099 	                else if (value === '(') {
       
  4100 	                    statement = this.parseExpressionStatement();
       
  4101 	                }
       
  4102 	                else if (value === ';') {
       
  4103 	                    statement = this.parseEmptyStatement();
       
  4104 	                }
       
  4105 	                else {
       
  4106 	                    statement = this.parseExpressionStatement();
       
  4107 	                }
       
  4108 	                break;
       
  4109 	            case 3 /* Identifier */:
       
  4110 	                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
       
  4111 	                break;
       
  4112 	            case 4 /* Keyword */:
       
  4113 	                switch (this.lookahead.value) {
       
  4114 	                    case 'break':
       
  4115 	                        statement = this.parseBreakStatement();
       
  4116 	                        break;
       
  4117 	                    case 'continue':
       
  4118 	                        statement = this.parseContinueStatement();
       
  4119 	                        break;
       
  4120 	                    case 'debugger':
       
  4121 	                        statement = this.parseDebuggerStatement();
       
  4122 	                        break;
       
  4123 	                    case 'do':
       
  4124 	                        statement = this.parseDoWhileStatement();
       
  4125 	                        break;
       
  4126 	                    case 'for':
       
  4127 	                        statement = this.parseForStatement();
       
  4128 	                        break;
       
  4129 	                    case 'function':
       
  4130 	                        statement = this.parseFunctionDeclaration();
       
  4131 	                        break;
       
  4132 	                    case 'if':
       
  4133 	                        statement = this.parseIfStatement();
       
  4134 	                        break;
       
  4135 	                    case 'return':
       
  4136 	                        statement = this.parseReturnStatement();
       
  4137 	                        break;
       
  4138 	                    case 'switch':
       
  4139 	                        statement = this.parseSwitchStatement();
       
  4140 	                        break;
       
  4141 	                    case 'throw':
       
  4142 	                        statement = this.parseThrowStatement();
       
  4143 	                        break;
       
  4144 	                    case 'try':
       
  4145 	                        statement = this.parseTryStatement();
       
  4146 	                        break;
       
  4147 	                    case 'var':
       
  4148 	                        statement = this.parseVariableStatement();
       
  4149 	                        break;
       
  4150 	                    case 'while':
       
  4151 	                        statement = this.parseWhileStatement();
       
  4152 	                        break;
       
  4153 	                    case 'with':
       
  4154 	                        statement = this.parseWithStatement();
       
  4155 	                        break;
       
  4156 	                    default:
       
  4157 	                        statement = this.parseExpressionStatement();
       
  4158 	                        break;
       
  4159 	                }
       
  4160 	                break;
       
  4161 	            default:
       
  4162 	                statement = this.throwUnexpectedToken(this.lookahead);
       
  4163 	        }
       
  4164 	        return statement;
       
  4165 	    };
       
  4166 	    // https://tc39.github.io/ecma262/#sec-function-definitions
       
  4167 	    Parser.prototype.parseFunctionSourceElements = function () {
       
  4168 	        var node = this.createNode();
       
  4169 	        this.expect('{');
       
  4170 	        var body = this.parseDirectivePrologues();
       
  4171 	        var previousLabelSet = this.context.labelSet;
       
  4172 	        var previousInIteration = this.context.inIteration;
       
  4173 	        var previousInSwitch = this.context.inSwitch;
       
  4174 	        var previousInFunctionBody = this.context.inFunctionBody;
       
  4175 	        this.context.labelSet = {};
       
  4176 	        this.context.inIteration = false;
       
  4177 	        this.context.inSwitch = false;
       
  4178 	        this.context.inFunctionBody = true;
       
  4179 	        while (this.lookahead.type !== 2 /* EOF */) {
       
  4180 	            if (this.match('}')) {
       
  4181 	                break;
       
  4182 	            }
       
  4183 	            body.push(this.parseStatementListItem());
       
  4184 	        }
       
  4185 	        this.expect('}');
       
  4186 	        this.context.labelSet = previousLabelSet;
       
  4187 	        this.context.inIteration = previousInIteration;
       
  4188 	        this.context.inSwitch = previousInSwitch;
       
  4189 	        this.context.inFunctionBody = previousInFunctionBody;
       
  4190 	        return this.finalize(node, new Node.BlockStatement(body));
       
  4191 	    };
       
  4192 	    Parser.prototype.validateParam = function (options, param, name) {
       
  4193 	        var key = '$' + name;
       
  4194 	        if (this.context.strict) {
       
  4195 	            if (this.scanner.isRestrictedWord(name)) {
       
  4196 	                options.stricted = param;
       
  4197 	                options.message = messages_1.Messages.StrictParamName;
       
  4198 	            }
       
  4199 	            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
       
  4200 	                options.stricted = param;
       
  4201 	                options.message = messages_1.Messages.StrictParamDupe;
       
  4202 	            }
       
  4203 	        }
       
  4204 	        else if (!options.firstRestricted) {
       
  4205 	            if (this.scanner.isRestrictedWord(name)) {
       
  4206 	                options.firstRestricted = param;
       
  4207 	                options.message = messages_1.Messages.StrictParamName;
       
  4208 	            }
       
  4209 	            else if (this.scanner.isStrictModeReservedWord(name)) {
       
  4210 	                options.firstRestricted = param;
       
  4211 	                options.message = messages_1.Messages.StrictReservedWord;
       
  4212 	            }
       
  4213 	            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
       
  4214 	                options.stricted = param;
       
  4215 	                options.message = messages_1.Messages.StrictParamDupe;
       
  4216 	            }
       
  4217 	        }
       
  4218 	        /* istanbul ignore next */
       
  4219 	        if (typeof Object.defineProperty === 'function') {
       
  4220 	            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
       
  4221 	        }
       
  4222 	        else {
       
  4223 	            options.paramSet[key] = true;
       
  4224 	        }
       
  4225 	    };
       
  4226 	    Parser.prototype.parseRestElement = function (params) {
       
  4227 	        var node = this.createNode();
       
  4228 	        this.expect('...');
       
  4229 	        var arg = this.parsePattern(params);
       
  4230 	        if (this.match('=')) {
       
  4231 	            this.throwError(messages_1.Messages.DefaultRestParameter);
       
  4232 	        }
       
  4233 	        if (!this.match(')')) {
       
  4234 	            this.throwError(messages_1.Messages.ParameterAfterRestParameter);
       
  4235 	        }
       
  4236 	        return this.finalize(node, new Node.RestElement(arg));
       
  4237 	    };
       
  4238 	    Parser.prototype.parseFormalParameter = function (options) {
       
  4239 	        var params = [];
       
  4240 	        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
       
  4241 	        for (var i = 0; i < params.length; i++) {
       
  4242 	            this.validateParam(options, params[i], params[i].value);
       
  4243 	        }
       
  4244 	        options.simple = options.simple && (param instanceof Node.Identifier);
       
  4245 	        options.params.push(param);
       
  4246 	    };
       
  4247 	    Parser.prototype.parseFormalParameters = function (firstRestricted) {
       
  4248 	        var options;
       
  4249 	        options = {
       
  4250 	            simple: true,
       
  4251 	            params: [],
       
  4252 	            firstRestricted: firstRestricted
       
  4253 	        };
       
  4254 	        this.expect('(');
       
  4255 	        if (!this.match(')')) {
       
  4256 	            options.paramSet = {};
       
  4257 	            while (this.lookahead.type !== 2 /* EOF */) {
       
  4258 	                this.parseFormalParameter(options);
       
  4259 	                if (this.match(')')) {
       
  4260 	                    break;
       
  4261 	                }
       
  4262 	                this.expect(',');
       
  4263 	                if (this.match(')')) {
       
  4264 	                    break;
       
  4265 	                }
       
  4266 	            }
       
  4267 	        }
       
  4268 	        this.expect(')');
       
  4269 	        return {
       
  4270 	            simple: options.simple,
       
  4271 	            params: options.params,
       
  4272 	            stricted: options.stricted,
       
  4273 	            firstRestricted: options.firstRestricted,
       
  4274 	            message: options.message
       
  4275 	        };
       
  4276 	    };
       
  4277 	    Parser.prototype.matchAsyncFunction = function () {
       
  4278 	        var match = this.matchContextualKeyword('async');
       
  4279 	        if (match) {
       
  4280 	            var state = this.scanner.saveState();
       
  4281 	            this.scanner.scanComments();
       
  4282 	            var next = this.scanner.lex();
       
  4283 	            this.scanner.restoreState(state);
       
  4284 	            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
       
  4285 	        }
       
  4286 	        return match;
       
  4287 	    };
       
  4288 	    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
       
  4289 	        var node = this.createNode();
       
  4290 	        var isAsync = this.matchContextualKeyword('async');
       
  4291 	        if (isAsync) {
       
  4292 	            this.nextToken();
       
  4293 	        }
       
  4294 	        this.expectKeyword('function');
       
  4295 	        var isGenerator = isAsync ? false : this.match('*');
       
  4296 	        if (isGenerator) {
       
  4297 	            this.nextToken();
       
  4298 	        }
       
  4299 	        var message;
       
  4300 	        var id = null;
       
  4301 	        var firstRestricted = null;
       
  4302 	        if (!identifierIsOptional || !this.match('(')) {
       
  4303 	            var token = this.lookahead;
       
  4304 	            id = this.parseVariableIdentifier();
       
  4305 	            if (this.context.strict) {
       
  4306 	                if (this.scanner.isRestrictedWord(token.value)) {
       
  4307 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
       
  4308 	                }
       
  4309 	            }
       
  4310 	            else {
       
  4311 	                if (this.scanner.isRestrictedWord(token.value)) {
       
  4312 	                    firstRestricted = token;
       
  4313 	                    message = messages_1.Messages.StrictFunctionName;
       
  4314 	                }
       
  4315 	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
       
  4316 	                    firstRestricted = token;
       
  4317 	                    message = messages_1.Messages.StrictReservedWord;
       
  4318 	                }
       
  4319 	            }
       
  4320 	        }
       
  4321 	        var previousAllowAwait = this.context.await;
       
  4322 	        var previousAllowYield = this.context.allowYield;
       
  4323 	        this.context.await = isAsync;
       
  4324 	        this.context.allowYield = !isGenerator;
       
  4325 	        var formalParameters = this.parseFormalParameters(firstRestricted);
       
  4326 	        var params = formalParameters.params;
       
  4327 	        var stricted = formalParameters.stricted;
       
  4328 	        firstRestricted = formalParameters.firstRestricted;
       
  4329 	        if (formalParameters.message) {
       
  4330 	            message = formalParameters.message;
       
  4331 	        }
       
  4332 	        var previousStrict = this.context.strict;
       
  4333 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
       
  4334 	        this.context.allowStrictDirective = formalParameters.simple;
       
  4335 	        var body = this.parseFunctionSourceElements();
       
  4336 	        if (this.context.strict && firstRestricted) {
       
  4337 	            this.throwUnexpectedToken(firstRestricted, message);
       
  4338 	        }
       
  4339 	        if (this.context.strict && stricted) {
       
  4340 	            this.tolerateUnexpectedToken(stricted, message);
       
  4341 	        }
       
  4342 	        this.context.strict = previousStrict;
       
  4343 	        this.context.allowStrictDirective = previousAllowStrictDirective;
       
  4344 	        this.context.await = previousAllowAwait;
       
  4345 	        this.context.allowYield = previousAllowYield;
       
  4346 	        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
       
  4347 	            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
       
  4348 	    };
       
  4349 	    Parser.prototype.parseFunctionExpression = function () {
       
  4350 	        var node = this.createNode();
       
  4351 	        var isAsync = this.matchContextualKeyword('async');
       
  4352 	        if (isAsync) {
       
  4353 	            this.nextToken();
       
  4354 	        }
       
  4355 	        this.expectKeyword('function');
       
  4356 	        var isGenerator = isAsync ? false : this.match('*');
       
  4357 	        if (isGenerator) {
       
  4358 	            this.nextToken();
       
  4359 	        }
       
  4360 	        var message;
       
  4361 	        var id = null;
       
  4362 	        var firstRestricted;
       
  4363 	        var previousAllowAwait = this.context.await;
       
  4364 	        var previousAllowYield = this.context.allowYield;
       
  4365 	        this.context.await = isAsync;
       
  4366 	        this.context.allowYield = !isGenerator;
       
  4367 	        if (!this.match('(')) {
       
  4368 	            var token = this.lookahead;
       
  4369 	            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
       
  4370 	            if (this.context.strict) {
       
  4371 	                if (this.scanner.isRestrictedWord(token.value)) {
       
  4372 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
       
  4373 	                }
       
  4374 	            }
       
  4375 	            else {
       
  4376 	                if (this.scanner.isRestrictedWord(token.value)) {
       
  4377 	                    firstRestricted = token;
       
  4378 	                    message = messages_1.Messages.StrictFunctionName;
       
  4379 	                }
       
  4380 	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
       
  4381 	                    firstRestricted = token;
       
  4382 	                    message = messages_1.Messages.StrictReservedWord;
       
  4383 	                }
       
  4384 	            }
       
  4385 	        }
       
  4386 	        var formalParameters = this.parseFormalParameters(firstRestricted);
       
  4387 	        var params = formalParameters.params;
       
  4388 	        var stricted = formalParameters.stricted;
       
  4389 	        firstRestricted = formalParameters.firstRestricted;
       
  4390 	        if (formalParameters.message) {
       
  4391 	            message = formalParameters.message;
       
  4392 	        }
       
  4393 	        var previousStrict = this.context.strict;
       
  4394 	        var previousAllowStrictDirective = this.context.allowStrictDirective;
       
  4395 	        this.context.allowStrictDirective = formalParameters.simple;
       
  4396 	        var body = this.parseFunctionSourceElements();
       
  4397 	        if (this.context.strict && firstRestricted) {
       
  4398 	            this.throwUnexpectedToken(firstRestricted, message);
       
  4399 	        }
       
  4400 	        if (this.context.strict && stricted) {
       
  4401 	            this.tolerateUnexpectedToken(stricted, message);
       
  4402 	        }
       
  4403 	        this.context.strict = previousStrict;
       
  4404 	        this.context.allowStrictDirective = previousAllowStrictDirective;
       
  4405 	        this.context.await = previousAllowAwait;
       
  4406 	        this.context.allowYield = previousAllowYield;
       
  4407 	        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
       
  4408 	            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
       
  4409 	    };
       
  4410 	    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
       
  4411 	    Parser.prototype.parseDirective = function () {
       
  4412 	        var token = this.lookahead;
       
  4413 	        var node = this.createNode();
       
  4414 	        var expr = this.parseExpression();
       
  4415 	        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
       
  4416 	        this.consumeSemicolon();
       
  4417 	        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
       
  4418 	    };
       
  4419 	    Parser.prototype.parseDirectivePrologues = function () {
       
  4420 	        var firstRestricted = null;
       
  4421 	        var body = [];
       
  4422 	        while (true) {
       
  4423 	            var token = this.lookahead;
       
  4424 	            if (token.type !== 8 /* StringLiteral */) {
       
  4425 	                break;
       
  4426 	            }
       
  4427 	            var statement = this.parseDirective();
       
  4428 	            body.push(statement);
       
  4429 	            var directive = statement.directive;
       
  4430 	            if (typeof directive !== 'string') {
       
  4431 	                break;
       
  4432 	            }
       
  4433 	            if (directive === 'use strict') {
       
  4434 	                this.context.strict = true;
       
  4435 	                if (firstRestricted) {
       
  4436 	                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
       
  4437 	                }
       
  4438 	                if (!this.context.allowStrictDirective) {
       
  4439 	                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
       
  4440 	                }
       
  4441 	            }
       
  4442 	            else {
       
  4443 	                if (!firstRestricted && token.octal) {
       
  4444 	                    firstRestricted = token;
       
  4445 	                }
       
  4446 	            }
       
  4447 	        }
       
  4448 	        return body;
       
  4449 	    };
       
  4450 	    // https://tc39.github.io/ecma262/#sec-method-definitions
       
  4451 	    Parser.prototype.qualifiedPropertyName = function (token) {
       
  4452 	        switch (token.type) {
       
  4453 	            case 3 /* Identifier */:
       
  4454 	            case 8 /* StringLiteral */:
       
  4455 	            case 1 /* BooleanLiteral */:
       
  4456 	            case 5 /* NullLiteral */:
       
  4457 	            case 6 /* NumericLiteral */:
       
  4458 	            case 4 /* Keyword */:
       
  4459 	                return true;
       
  4460 	            case 7 /* Punctuator */:
       
  4461 	                return token.value === '[';
       
  4462 	            default:
       
  4463 	                break;
       
  4464 	        }
       
  4465 	        return false;
       
  4466 	    };
       
  4467 	    Parser.prototype.parseGetterMethod = function () {
       
  4468 	        var node = this.createNode();
       
  4469 	        var isGenerator = false;
       
  4470 	        var previousAllowYield = this.context.allowYield;
       
  4471 	        this.context.allowYield = false;
       
  4472 	        var formalParameters = this.parseFormalParameters();
       
  4473 	        if (formalParameters.params.length > 0) {
       
  4474 	            this.tolerateError(messages_1.Messages.BadGetterArity);
       
  4475 	        }
       
  4476 	        var method = this.parsePropertyMethod(formalParameters);
       
  4477 	        this.context.allowYield = previousAllowYield;
       
  4478 	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
       
  4479 	    };
       
  4480 	    Parser.prototype.parseSetterMethod = function () {
       
  4481 	        var node = this.createNode();
       
  4482 	        var isGenerator = false;
       
  4483 	        var previousAllowYield = this.context.allowYield;
       
  4484 	        this.context.allowYield = false;
       
  4485 	        var formalParameters = this.parseFormalParameters();
       
  4486 	        if (formalParameters.params.length !== 1) {
       
  4487 	            this.tolerateError(messages_1.Messages.BadSetterArity);
       
  4488 	        }
       
  4489 	        else if (formalParameters.params[0] instanceof Node.RestElement) {
       
  4490 	            this.tolerateError(messages_1.Messages.BadSetterRestParameter);
       
  4491 	        }
       
  4492 	        var method = this.parsePropertyMethod(formalParameters);
       
  4493 	        this.context.allowYield = previousAllowYield;
       
  4494 	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
       
  4495 	    };
       
  4496 	    Parser.prototype.parseGeneratorMethod = function () {
       
  4497 	        var node = this.createNode();
       
  4498 	        var isGenerator = true;
       
  4499 	        var previousAllowYield = this.context.allowYield;
       
  4500 	        this.context.allowYield = true;
       
  4501 	        var params = this.parseFormalParameters();
       
  4502 	        this.context.allowYield = false;
       
  4503 	        var method = this.parsePropertyMethod(params);
       
  4504 	        this.context.allowYield = previousAllowYield;
       
  4505 	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
       
  4506 	    };
       
  4507 	    // https://tc39.github.io/ecma262/#sec-generator-function-definitions
       
  4508 	    Parser.prototype.isStartOfExpression = function () {
       
  4509 	        var start = true;
       
  4510 	        var value = this.lookahead.value;
       
  4511 	        switch (this.lookahead.type) {
       
  4512 	            case 7 /* Punctuator */:
       
  4513 	                start = (value === '[') || (value === '(') || (value === '{') ||
       
  4514 	                    (value === '+') || (value === '-') ||
       
  4515 	                    (value === '!') || (value === '~') ||
       
  4516 	                    (value === '++') || (value === '--') ||
       
  4517 	                    (value === '/') || (value === '/='); // regular expression literal
       
  4518 	                break;
       
  4519 	            case 4 /* Keyword */:
       
  4520 	                start = (value === 'class') || (value === 'delete') ||
       
  4521 	                    (value === 'function') || (value === 'let') || (value === 'new') ||
       
  4522 	                    (value === 'super') || (value === 'this') || (value === 'typeof') ||
       
  4523 	                    (value === 'void') || (value === 'yield');
       
  4524 	                break;
       
  4525 	            default:
       
  4526 	                break;
       
  4527 	        }
       
  4528 	        return start;
       
  4529 	    };
       
  4530 	    Parser.prototype.parseYieldExpression = function () {
       
  4531 	        var node = this.createNode();
       
  4532 	        this.expectKeyword('yield');
       
  4533 	        var argument = null;
       
  4534 	        var delegate = false;
       
  4535 	        if (!this.hasLineTerminator) {
       
  4536 	            var previousAllowYield = this.context.allowYield;
       
  4537 	            this.context.allowYield = false;
       
  4538 	            delegate = this.match('*');
       
  4539 	            if (delegate) {
       
  4540 	                this.nextToken();
       
  4541 	                argument = this.parseAssignmentExpression();
       
  4542 	            }
       
  4543 	            else if (this.isStartOfExpression()) {
       
  4544 	                argument = this.parseAssignmentExpression();
       
  4545 	            }
       
  4546 	            this.context.allowYield = previousAllowYield;
       
  4547 	        }
       
  4548 	        return this.finalize(node, new Node.YieldExpression(argument, delegate));
       
  4549 	    };
       
  4550 	    // https://tc39.github.io/ecma262/#sec-class-definitions
       
  4551 	    Parser.prototype.parseClassElement = function (hasConstructor) {
       
  4552 	        var token = this.lookahead;
       
  4553 	        var node = this.createNode();
       
  4554 	        var kind = '';
       
  4555 	        var key = null;
       
  4556 	        var value = null;
       
  4557 	        var computed = false;
       
  4558 	        var method = false;
       
  4559 	        var isStatic = false;
       
  4560 	        var isAsync = false;
       
  4561 	        if (this.match('*')) {
       
  4562 	            this.nextToken();
       
  4563 	        }
       
  4564 	        else {
       
  4565 	            computed = this.match('[');
       
  4566 	            key = this.parseObjectPropertyKey();
       
  4567 	            var id = key;
       
  4568 	            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
       
  4569 	                token = this.lookahead;
       
  4570 	                isStatic = true;
       
  4571 	                computed = this.match('[');
       
  4572 	                if (this.match('*')) {
       
  4573 	                    this.nextToken();
       
  4574 	                }
       
  4575 	                else {
       
  4576 	                    key = this.parseObjectPropertyKey();
       
  4577 	                }
       
  4578 	            }
       
  4579 	            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
       
  4580 	                var punctuator = this.lookahead.value;
       
  4581 	                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
       
  4582 	                    isAsync = true;
       
  4583 	                    token = this.lookahead;
       
  4584 	                    key = this.parseObjectPropertyKey();
       
  4585 	                    if (token.type === 3 /* Identifier */) {
       
  4586 	                        if (token.value === 'get' || token.value === 'set') {
       
  4587 	                            this.tolerateUnexpectedToken(token);
       
  4588 	                        }
       
  4589 	                        else if (token.value === 'constructor') {
       
  4590 	                            this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
       
  4591 	                        }
       
  4592 	                    }
       
  4593 	                }
       
  4594 	            }
       
  4595 	        }
       
  4596 	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
       
  4597 	        if (token.type === 3 /* Identifier */) {
       
  4598 	            if (token.value === 'get' && lookaheadPropertyKey) {
       
  4599 	                kind = 'get';
       
  4600 	                computed = this.match('[');
       
  4601 	                key = this.parseObjectPropertyKey();
       
  4602 	                this.context.allowYield = false;
       
  4603 	                value = this.parseGetterMethod();
       
  4604 	            }
       
  4605 	            else if (token.value === 'set' && lookaheadPropertyKey) {
       
  4606 	                kind = 'set';
       
  4607 	                computed = this.match('[');
       
  4608 	                key = this.parseObjectPropertyKey();
       
  4609 	                value = this.parseSetterMethod();
       
  4610 	            }
       
  4611 	        }
       
  4612 	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
       
  4613 	            kind = 'init';
       
  4614 	            computed = this.match('[');
       
  4615 	            key = this.parseObjectPropertyKey();
       
  4616 	            value = this.parseGeneratorMethod();
       
  4617 	            method = true;
       
  4618 	        }
       
  4619 	        if (!kind && key && this.match('(')) {
       
  4620 	            kind = 'init';
       
  4621 	            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
       
  4622 	            method = true;
       
  4623 	        }
       
  4624 	        if (!kind) {
       
  4625 	            this.throwUnexpectedToken(this.lookahead);
       
  4626 	        }
       
  4627 	        if (kind === 'init') {
       
  4628 	            kind = 'method';
       
  4629 	        }
       
  4630 	        if (!computed) {
       
  4631 	            if (isStatic && this.isPropertyKey(key, 'prototype')) {
       
  4632 	                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
       
  4633 	            }
       
  4634 	            if (!isStatic && this.isPropertyKey(key, 'constructor')) {
       
  4635 	                if (kind !== 'method' || !method || (value && value.generator)) {
       
  4636 	                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
       
  4637 	                }
       
  4638 	                if (hasConstructor.value) {
       
  4639 	                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
       
  4640 	                }
       
  4641 	                else {
       
  4642 	                    hasConstructor.value = true;
       
  4643 	                }
       
  4644 	                kind = 'constructor';
       
  4645 	            }
       
  4646 	        }
       
  4647 	        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
       
  4648 	    };
       
  4649 	    Parser.prototype.parseClassElementList = function () {
       
  4650 	        var body = [];
       
  4651 	        var hasConstructor = { value: false };
       
  4652 	        this.expect('{');
       
  4653 	        while (!this.match('}')) {
       
  4654 	            if (this.match(';')) {
       
  4655 	                this.nextToken();
       
  4656 	            }
       
  4657 	            else {
       
  4658 	                body.push(this.parseClassElement(hasConstructor));
       
  4659 	            }
       
  4660 	        }
       
  4661 	        this.expect('}');
       
  4662 	        return body;
       
  4663 	    };
       
  4664 	    Parser.prototype.parseClassBody = function () {
       
  4665 	        var node = this.createNode();
       
  4666 	        var elementList = this.parseClassElementList();
       
  4667 	        return this.finalize(node, new Node.ClassBody(elementList));
       
  4668 	    };
       
  4669 	    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
       
  4670 	        var node = this.createNode();
       
  4671 	        var previousStrict = this.context.strict;
       
  4672 	        this.context.strict = true;
       
  4673 	        this.expectKeyword('class');
       
  4674 	        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
       
  4675 	        var superClass = null;
       
  4676 	        if (this.matchKeyword('extends')) {
       
  4677 	            this.nextToken();
       
  4678 	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
       
  4679 	        }
       
  4680 	        var classBody = this.parseClassBody();
       
  4681 	        this.context.strict = previousStrict;
       
  4682 	        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
       
  4683 	    };
       
  4684 	    Parser.prototype.parseClassExpression = function () {
       
  4685 	        var node = this.createNode();
       
  4686 	        var previousStrict = this.context.strict;
       
  4687 	        this.context.strict = true;
       
  4688 	        this.expectKeyword('class');
       
  4689 	        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
       
  4690 	        var superClass = null;
       
  4691 	        if (this.matchKeyword('extends')) {
       
  4692 	            this.nextToken();
       
  4693 	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
       
  4694 	        }
       
  4695 	        var classBody = this.parseClassBody();
       
  4696 	        this.context.strict = previousStrict;
       
  4697 	        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
       
  4698 	    };
       
  4699 	    // https://tc39.github.io/ecma262/#sec-scripts
       
  4700 	    // https://tc39.github.io/ecma262/#sec-modules
       
  4701 	    Parser.prototype.parseModule = function () {
       
  4702 	        this.context.strict = true;
       
  4703 	        this.context.isModule = true;
       
  4704 	        var node = this.createNode();
       
  4705 	        var body = this.parseDirectivePrologues();
       
  4706 	        while (this.lookahead.type !== 2 /* EOF */) {
       
  4707 	            body.push(this.parseStatementListItem());
       
  4708 	        }
       
  4709 	        return this.finalize(node, new Node.Module(body));
       
  4710 	    };
       
  4711 	    Parser.prototype.parseScript = function () {
       
  4712 	        var node = this.createNode();
       
  4713 	        var body = this.parseDirectivePrologues();
       
  4714 	        while (this.lookahead.type !== 2 /* EOF */) {
       
  4715 	            body.push(this.parseStatementListItem());
       
  4716 	        }
       
  4717 	        return this.finalize(node, new Node.Script(body));
       
  4718 	    };
       
  4719 	    // https://tc39.github.io/ecma262/#sec-imports
       
  4720 	    Parser.prototype.parseModuleSpecifier = function () {
       
  4721 	        var node = this.createNode();
       
  4722 	        if (this.lookahead.type !== 8 /* StringLiteral */) {
       
  4723 	            this.throwError(messages_1.Messages.InvalidModuleSpecifier);
       
  4724 	        }
       
  4725 	        var token = this.nextToken();
       
  4726 	        var raw = this.getTokenRaw(token);
       
  4727 	        return this.finalize(node, new Node.Literal(token.value, raw));
       
  4728 	    };
       
  4729 	    // import {<foo as bar>} ...;
       
  4730 	    Parser.prototype.parseImportSpecifier = function () {
       
  4731 	        var node = this.createNode();
       
  4732 	        var imported;
       
  4733 	        var local;
       
  4734 	        if (this.lookahead.type === 3 /* Identifier */) {
       
  4735 	            imported = this.parseVariableIdentifier();
       
  4736 	            local = imported;
       
  4737 	            if (this.matchContextualKeyword('as')) {
       
  4738 	                this.nextToken();
       
  4739 	                local = this.parseVariableIdentifier();
       
  4740 	            }
       
  4741 	        }
       
  4742 	        else {
       
  4743 	            imported = this.parseIdentifierName();
       
  4744 	            local = imported;
       
  4745 	            if (this.matchContextualKeyword('as')) {
       
  4746 	                this.nextToken();
       
  4747 	                local = this.parseVariableIdentifier();
       
  4748 	            }
       
  4749 	            else {
       
  4750 	                this.throwUnexpectedToken(this.nextToken());
       
  4751 	            }
       
  4752 	        }
       
  4753 	        return this.finalize(node, new Node.ImportSpecifier(local, imported));
       
  4754 	    };
       
  4755 	    // {foo, bar as bas}
       
  4756 	    Parser.prototype.parseNamedImports = function () {
       
  4757 	        this.expect('{');
       
  4758 	        var specifiers = [];
       
  4759 	        while (!this.match('}')) {
       
  4760 	            specifiers.push(this.parseImportSpecifier());
       
  4761 	            if (!this.match('}')) {
       
  4762 	                this.expect(',');
       
  4763 	            }
       
  4764 	        }
       
  4765 	        this.expect('}');
       
  4766 	        return specifiers;
       
  4767 	    };
       
  4768 	    // import <foo> ...;
       
  4769 	    Parser.prototype.parseImportDefaultSpecifier = function () {
       
  4770 	        var node = this.createNode();
       
  4771 	        var local = this.parseIdentifierName();
       
  4772 	        return this.finalize(node, new Node.ImportDefaultSpecifier(local));
       
  4773 	    };
       
  4774 	    // import <* as foo> ...;
       
  4775 	    Parser.prototype.parseImportNamespaceSpecifier = function () {
       
  4776 	        var node = this.createNode();
       
  4777 	        this.expect('*');
       
  4778 	        if (!this.matchContextualKeyword('as')) {
       
  4779 	            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
       
  4780 	        }
       
  4781 	        this.nextToken();
       
  4782 	        var local = this.parseIdentifierName();
       
  4783 	        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
       
  4784 	    };
       
  4785 	    Parser.prototype.parseImportDeclaration = function () {
       
  4786 	        if (this.context.inFunctionBody) {
       
  4787 	            this.throwError(messages_1.Messages.IllegalImportDeclaration);
       
  4788 	        }
       
  4789 	        var node = this.createNode();
       
  4790 	        this.expectKeyword('import');
       
  4791 	        var src;
       
  4792 	        var specifiers = [];
       
  4793 	        if (this.lookahead.type === 8 /* StringLiteral */) {
       
  4794 	            // import 'foo';
       
  4795 	            src = this.parseModuleSpecifier();
       
  4796 	        }
       
  4797 	        else {
       
  4798 	            if (this.match('{')) {
       
  4799 	                // import {bar}
       
  4800 	                specifiers = specifiers.concat(this.parseNamedImports());
       
  4801 	            }
       
  4802 	            else if (this.match('*')) {
       
  4803 	                // import * as foo
       
  4804 	                specifiers.push(this.parseImportNamespaceSpecifier());
       
  4805 	            }
       
  4806 	            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
       
  4807 	                // import foo
       
  4808 	                specifiers.push(this.parseImportDefaultSpecifier());
       
  4809 	                if (this.match(',')) {
       
  4810 	                    this.nextToken();
       
  4811 	                    if (this.match('*')) {
       
  4812 	                        // import foo, * as foo
       
  4813 	                        specifiers.push(this.parseImportNamespaceSpecifier());
       
  4814 	                    }
       
  4815 	                    else if (this.match('{')) {
       
  4816 	                        // import foo, {bar}
       
  4817 	                        specifiers = specifiers.concat(this.parseNamedImports());
       
  4818 	                    }
       
  4819 	                    else {
       
  4820 	                        this.throwUnexpectedToken(this.lookahead);
       
  4821 	                    }
       
  4822 	                }
       
  4823 	            }
       
  4824 	            else {
       
  4825 	                this.throwUnexpectedToken(this.nextToken());
       
  4826 	            }
       
  4827 	            if (!this.matchContextualKeyword('from')) {
       
  4828 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
       
  4829 	                this.throwError(message, this.lookahead.value);
       
  4830 	            }
       
  4831 	            this.nextToken();
       
  4832 	            src = this.parseModuleSpecifier();
       
  4833 	        }
       
  4834 	        this.consumeSemicolon();
       
  4835 	        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
       
  4836 	    };
       
  4837 	    // https://tc39.github.io/ecma262/#sec-exports
       
  4838 	    Parser.prototype.parseExportSpecifier = function () {
       
  4839 	        var node = this.createNode();
       
  4840 	        var local = this.parseIdentifierName();
       
  4841 	        var exported = local;
       
  4842 	        if (this.matchContextualKeyword('as')) {
       
  4843 	            this.nextToken();
       
  4844 	            exported = this.parseIdentifierName();
       
  4845 	        }
       
  4846 	        return this.finalize(node, new Node.ExportSpecifier(local, exported));
       
  4847 	    };
       
  4848 	    Parser.prototype.parseExportDeclaration = function () {
       
  4849 	        if (this.context.inFunctionBody) {
       
  4850 	            this.throwError(messages_1.Messages.IllegalExportDeclaration);
       
  4851 	        }
       
  4852 	        var node = this.createNode();
       
  4853 	        this.expectKeyword('export');
       
  4854 	        var exportDeclaration;
       
  4855 	        if (this.matchKeyword('default')) {
       
  4856 	            // export default ...
       
  4857 	            this.nextToken();
       
  4858 	            if (this.matchKeyword('function')) {
       
  4859 	                // export default function foo () {}
       
  4860 	                // export default function () {}
       
  4861 	                var declaration = this.parseFunctionDeclaration(true);
       
  4862 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
       
  4863 	            }
       
  4864 	            else if (this.matchKeyword('class')) {
       
  4865 	                // export default class foo {}
       
  4866 	                var declaration = this.parseClassDeclaration(true);
       
  4867 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
       
  4868 	            }
       
  4869 	            else if (this.matchContextualKeyword('async')) {
       
  4870 	                // export default async function f () {}
       
  4871 	                // export default async function () {}
       
  4872 	                // export default async x => x
       
  4873 	                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
       
  4874 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
       
  4875 	            }
       
  4876 	            else {
       
  4877 	                if (this.matchContextualKeyword('from')) {
       
  4878 	                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
       
  4879 	                }
       
  4880 	                // export default {};
       
  4881 	                // export default [];
       
  4882 	                // export default (1 + 2);
       
  4883 	                var declaration = this.match('{') ? this.parseObjectInitializer() :
       
  4884 	                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
       
  4885 	                this.consumeSemicolon();
       
  4886 	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
       
  4887 	            }
       
  4888 	        }
       
  4889 	        else if (this.match('*')) {
       
  4890 	            // export * from 'foo';
       
  4891 	            this.nextToken();
       
  4892 	            if (!this.matchContextualKeyword('from')) {
       
  4893 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
       
  4894 	                this.throwError(message, this.lookahead.value);
       
  4895 	            }
       
  4896 	            this.nextToken();
       
  4897 	            var src = this.parseModuleSpecifier();
       
  4898 	            this.consumeSemicolon();
       
  4899 	            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
       
  4900 	        }
       
  4901 	        else if (this.lookahead.type === 4 /* Keyword */) {
       
  4902 	            // export var f = 1;
       
  4903 	            var declaration = void 0;
       
  4904 	            switch (this.lookahead.value) {
       
  4905 	                case 'let':
       
  4906 	                case 'const':
       
  4907 	                    declaration = this.parseLexicalDeclaration({ inFor: false });
       
  4908 	                    break;
       
  4909 	                case 'var':
       
  4910 	                case 'class':
       
  4911 	                case 'function':
       
  4912 	                    declaration = this.parseStatementListItem();
       
  4913 	                    break;
       
  4914 	                default:
       
  4915 	                    this.throwUnexpectedToken(this.lookahead);
       
  4916 	            }
       
  4917 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
       
  4918 	        }
       
  4919 	        else if (this.matchAsyncFunction()) {
       
  4920 	            var declaration = this.parseFunctionDeclaration();
       
  4921 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
       
  4922 	        }
       
  4923 	        else {
       
  4924 	            var specifiers = [];
       
  4925 	            var source = null;
       
  4926 	            var isExportFromIdentifier = false;
       
  4927 	            this.expect('{');
       
  4928 	            while (!this.match('}')) {
       
  4929 	                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
       
  4930 	                specifiers.push(this.parseExportSpecifier());
       
  4931 	                if (!this.match('}')) {
       
  4932 	                    this.expect(',');
       
  4933 	                }
       
  4934 	            }
       
  4935 	            this.expect('}');
       
  4936 	            if (this.matchContextualKeyword('from')) {
       
  4937 	                // export {default} from 'foo';
       
  4938 	                // export {foo} from 'foo';
       
  4939 	                this.nextToken();
       
  4940 	                source = this.parseModuleSpecifier();
       
  4941 	                this.consumeSemicolon();
       
  4942 	            }
       
  4943 	            else if (isExportFromIdentifier) {
       
  4944 	                // export {default}; // missing fromClause
       
  4945 	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
       
  4946 	                this.throwError(message, this.lookahead.value);
       
  4947 	            }
       
  4948 	            else {
       
  4949 	                // export {foo};
       
  4950 	                this.consumeSemicolon();
       
  4951 	            }
       
  4952 	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
       
  4953 	        }
       
  4954 	        return exportDeclaration;
       
  4955 	    };
       
  4956 	    return Parser;
       
  4957 	}());
       
  4958 	exports.Parser = Parser;
       
  4959 
       
  4960 
       
  4961 /***/ },
       
  4962 /* 9 */
       
  4963 /***/ function(module, exports) {
       
  4964 
       
  4965 	"use strict";
       
  4966 	// Ensure the condition is true, otherwise throw an error.
       
  4967 	// This is only to have a better contract semantic, i.e. another safety net
       
  4968 	// to catch a logic error. The condition shall be fulfilled in normal case.
       
  4969 	// Do NOT use this to enforce a certain condition on any user input.
       
  4970 	Object.defineProperty(exports, "__esModule", { value: true });
       
  4971 	function assert(condition, message) {
       
  4972 	    /* istanbul ignore if */
       
  4973 	    if (!condition) {
       
  4974 	        throw new Error('ASSERT: ' + message);
       
  4975 	    }
       
  4976 	}
       
  4977 	exports.assert = assert;
       
  4978 
       
  4979 
       
  4980 /***/ },
       
  4981 /* 10 */
       
  4982 /***/ function(module, exports) {
       
  4983 
       
  4984 	"use strict";
       
  4985 	/* tslint:disable:max-classes-per-file */
       
  4986 	Object.defineProperty(exports, "__esModule", { value: true });
       
  4987 	var ErrorHandler = (function () {
       
  4988 	    function ErrorHandler() {
       
  4989 	        this.errors = [];
       
  4990 	        this.tolerant = false;
       
  4991 	    }
       
  4992 	    ErrorHandler.prototype.recordError = function (error) {
       
  4993 	        this.errors.push(error);
       
  4994 	    };
       
  4995 	    ErrorHandler.prototype.tolerate = function (error) {
       
  4996 	        if (this.tolerant) {
       
  4997 	            this.recordError(error);
       
  4998 	        }
       
  4999 	        else {
       
  5000 	            throw error;
       
  5001 	        }
       
  5002 	    };
       
  5003 	    ErrorHandler.prototype.constructError = function (msg, column) {
       
  5004 	        var error = new Error(msg);
       
  5005 	        try {
       
  5006 	            throw error;
       
  5007 	        }
       
  5008 	        catch (base) {
       
  5009 	            /* istanbul ignore else */
       
  5010 	            if (Object.create && Object.defineProperty) {
       
  5011 	                error = Object.create(base);
       
  5012 	                Object.defineProperty(error, 'column', { value: column });
       
  5013 	            }
       
  5014 	        }
       
  5015 	        /* istanbul ignore next */
       
  5016 	        return error;
       
  5017 	    };
       
  5018 	    ErrorHandler.prototype.createError = function (index, line, col, description) {
       
  5019 	        var msg = 'Line ' + line + ': ' + description;
       
  5020 	        var error = this.constructError(msg, col);
       
  5021 	        error.index = index;
       
  5022 	        error.lineNumber = line;
       
  5023 	        error.description = description;
       
  5024 	        return error;
       
  5025 	    };
       
  5026 	    ErrorHandler.prototype.throwError = function (index, line, col, description) {
       
  5027 	        throw this.createError(index, line, col, description);
       
  5028 	    };
       
  5029 	    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
       
  5030 	        var error = this.createError(index, line, col, description);
       
  5031 	        if (this.tolerant) {
       
  5032 	            this.recordError(error);
       
  5033 	        }
       
  5034 	        else {
       
  5035 	            throw error;
       
  5036 	        }
       
  5037 	    };
       
  5038 	    return ErrorHandler;
       
  5039 	}());
       
  5040 	exports.ErrorHandler = ErrorHandler;
       
  5041 
       
  5042 
       
  5043 /***/ },
       
  5044 /* 11 */
       
  5045 /***/ function(module, exports) {
       
  5046 
       
  5047 	"use strict";
       
  5048 	Object.defineProperty(exports, "__esModule", { value: true });
       
  5049 	// Error messages should be identical to V8.
       
  5050 	exports.Messages = {
       
  5051 	    BadGetterArity: 'Getter must not have any formal parameters',
       
  5052 	    BadSetterArity: 'Setter must have exactly one formal parameter',
       
  5053 	    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
       
  5054 	    ConstructorIsAsync: 'Class constructor may not be an async method',
       
  5055 	    ConstructorSpecialMethod: 'Class constructor may not be an accessor',
       
  5056 	    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
       
  5057 	    DefaultRestParameter: 'Unexpected token =',
       
  5058 	    DuplicateBinding: 'Duplicate binding %0',
       
  5059 	    DuplicateConstructor: 'A class may only have one constructor',
       
  5060 	    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
       
  5061 	    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
       
  5062 	    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
       
  5063 	    IllegalBreak: 'Illegal break statement',
       
  5064 	    IllegalContinue: 'Illegal continue statement',
       
  5065 	    IllegalExportDeclaration: 'Unexpected token',
       
  5066 	    IllegalImportDeclaration: 'Unexpected token',
       
  5067 	    IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
       
  5068 	    IllegalReturn: 'Illegal return statement',
       
  5069 	    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
       
  5070 	    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
       
  5071 	    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
       
  5072 	    InvalidLHSInForIn: 'Invalid left-hand side in for-in',
       
  5073 	    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
       
  5074 	    InvalidModuleSpecifier: 'Unexpected token',
       
  5075 	    InvalidRegExp: 'Invalid regular expression',
       
  5076 	    LetInLexicalBinding: 'let is disallowed as a lexically bound name',
       
  5077 	    MissingFromClause: 'Unexpected token',
       
  5078 	    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
       
  5079 	    NewlineAfterThrow: 'Illegal newline after throw',
       
  5080 	    NoAsAfterImportNamespace: 'Unexpected token',
       
  5081 	    NoCatchOrFinally: 'Missing catch or finally after try',
       
  5082 	    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
       
  5083 	    Redeclaration: '%0 \'%1\' has already been declared',
       
  5084 	    StaticPrototype: 'Classes may not have static property named prototype',
       
  5085 	    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
       
  5086 	    StrictDelete: 'Delete of an unqualified identifier in strict mode.',
       
  5087 	    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
       
  5088 	    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
       
  5089 	    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
       
  5090 	    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
       
  5091 	    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
       
  5092 	    StrictModeWith: 'Strict mode code may not include a with statement',
       
  5093 	    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
       
  5094 	    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
       
  5095 	    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
       
  5096 	    StrictReservedWord: 'Use of future reserved word in strict mode',
       
  5097 	    StrictVarName: 'Variable name may not be eval or arguments in strict mode',
       
  5098 	    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
       
  5099 	    UnexpectedEOS: 'Unexpected end of input',
       
  5100 	    UnexpectedIdentifier: 'Unexpected identifier',
       
  5101 	    UnexpectedNumber: 'Unexpected number',
       
  5102 	    UnexpectedReserved: 'Unexpected reserved word',
       
  5103 	    UnexpectedString: 'Unexpected string',
       
  5104 	    UnexpectedTemplate: 'Unexpected quasi %0',
       
  5105 	    UnexpectedToken: 'Unexpected token %0',
       
  5106 	    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
       
  5107 	    UnknownLabel: 'Undefined label \'%0\'',
       
  5108 	    UnterminatedRegExp: 'Invalid regular expression: missing /'
       
  5109 	};
       
  5110 
       
  5111 
       
  5112 /***/ },
       
  5113 /* 12 */
       
  5114 /***/ function(module, exports, __webpack_require__) {
       
  5115 
       
  5116 	"use strict";
       
  5117 	Object.defineProperty(exports, "__esModule", { value: true });
       
  5118 	var assert_1 = __webpack_require__(9);
       
  5119 	var character_1 = __webpack_require__(4);
       
  5120 	var messages_1 = __webpack_require__(11);
       
  5121 	function hexValue(ch) {
       
  5122 	    return '0123456789abcdef'.indexOf(ch.toLowerCase());
       
  5123 	}
       
  5124 	function octalValue(ch) {
       
  5125 	    return '01234567'.indexOf(ch);
       
  5126 	}
       
  5127 	var Scanner = (function () {
       
  5128 	    function Scanner(code, handler) {
       
  5129 	        this.source = code;
       
  5130 	        this.errorHandler = handler;
       
  5131 	        this.trackComment = false;
       
  5132 	        this.length = code.length;
       
  5133 	        this.index = 0;
       
  5134 	        this.lineNumber = (code.length > 0) ? 1 : 0;
       
  5135 	        this.lineStart = 0;
       
  5136 	        this.curlyStack = [];
       
  5137 	    }
       
  5138 	    Scanner.prototype.saveState = function () {
       
  5139 	        return {
       
  5140 	            index: this.index,
       
  5141 	            lineNumber: this.lineNumber,
       
  5142 	            lineStart: this.lineStart
       
  5143 	        };
       
  5144 	    };
       
  5145 	    Scanner.prototype.restoreState = function (state) {
       
  5146 	        this.index = state.index;
       
  5147 	        this.lineNumber = state.lineNumber;
       
  5148 	        this.lineStart = state.lineStart;
       
  5149 	    };
       
  5150 	    Scanner.prototype.eof = function () {
       
  5151 	        return this.index >= this.length;
       
  5152 	    };
       
  5153 	    Scanner.prototype.throwUnexpectedToken = function (message) {
       
  5154 	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
       
  5155 	        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
       
  5156 	    };
       
  5157 	    Scanner.prototype.tolerateUnexpectedToken = function (message) {
       
  5158 	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
       
  5159 	        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
       
  5160 	    };
       
  5161 	    // https://tc39.github.io/ecma262/#sec-comments
       
  5162 	    Scanner.prototype.skipSingleLineComment = function (offset) {
       
  5163 	        var comments = [];
       
  5164 	        var start, loc;
       
  5165 	        if (this.trackComment) {
       
  5166 	            comments = [];
       
  5167 	            start = this.index - offset;
       
  5168 	            loc = {
       
  5169 	                start: {
       
  5170 	                    line: this.lineNumber,
       
  5171 	                    column: this.index - this.lineStart - offset
       
  5172 	                },
       
  5173 	                end: {}
       
  5174 	            };
       
  5175 	        }
       
  5176 	        while (!this.eof()) {
       
  5177 	            var ch = this.source.charCodeAt(this.index);
       
  5178 	            ++this.index;
       
  5179 	            if (character_1.Character.isLineTerminator(ch)) {
       
  5180 	                if (this.trackComment) {
       
  5181 	                    loc.end = {
       
  5182 	                        line: this.lineNumber,
       
  5183 	                        column: this.index - this.lineStart - 1
       
  5184 	                    };
       
  5185 	                    var entry = {
       
  5186 	                        multiLine: false,
       
  5187 	                        slice: [start + offset, this.index - 1],
       
  5188 	                        range: [start, this.index - 1],
       
  5189 	                        loc: loc
       
  5190 	                    };
       
  5191 	                    comments.push(entry);
       
  5192 	                }
       
  5193 	                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
       
  5194 	                    ++this.index;
       
  5195 	                }
       
  5196 	                ++this.lineNumber;
       
  5197 	                this.lineStart = this.index;
       
  5198 	                return comments;
       
  5199 	            }
       
  5200 	        }
       
  5201 	        if (this.trackComment) {
       
  5202 	            loc.end = {
       
  5203 	                line: this.lineNumber,
       
  5204 	                column: this.index - this.lineStart
       
  5205 	            };
       
  5206 	            var entry = {
       
  5207 	                multiLine: false,
       
  5208 	                slice: [start + offset, this.index],
       
  5209 	                range: [start, this.index],
       
  5210 	                loc: loc
       
  5211 	            };
       
  5212 	            comments.push(entry);
       
  5213 	        }
       
  5214 	        return comments;
       
  5215 	    };
       
  5216 	    Scanner.prototype.skipMultiLineComment = function () {
       
  5217 	        var comments = [];
       
  5218 	        var start, loc;
       
  5219 	        if (this.trackComment) {
       
  5220 	            comments = [];
       
  5221 	            start = this.index - 2;
       
  5222 	            loc = {
       
  5223 	                start: {
       
  5224 	                    line: this.lineNumber,
       
  5225 	                    column: this.index - this.lineStart - 2
       
  5226 	                },
       
  5227 	                end: {}
       
  5228 	            };
       
  5229 	        }
       
  5230 	        while (!this.eof()) {
       
  5231 	            var ch = this.source.charCodeAt(this.index);
       
  5232 	            if (character_1.Character.isLineTerminator(ch)) {
       
  5233 	                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
       
  5234 	                    ++this.index;
       
  5235 	                }
       
  5236 	                ++this.lineNumber;
       
  5237 	                ++this.index;
       
  5238 	                this.lineStart = this.index;
       
  5239 	            }
       
  5240 	            else if (ch === 0x2A) {
       
  5241 	                // Block comment ends with '*/'.
       
  5242 	                if (this.source.charCodeAt(this.index + 1) === 0x2F) {
       
  5243 	                    this.index += 2;
       
  5244 	                    if (this.trackComment) {
       
  5245 	                        loc.end = {
       
  5246 	                            line: this.lineNumber,
       
  5247 	                            column: this.index - this.lineStart
       
  5248 	                        };
       
  5249 	                        var entry = {
       
  5250 	                            multiLine: true,
       
  5251 	                            slice: [start + 2, this.index - 2],
       
  5252 	                            range: [start, this.index],
       
  5253 	                            loc: loc
       
  5254 	                        };
       
  5255 	                        comments.push(entry);
       
  5256 	                    }
       
  5257 	                    return comments;
       
  5258 	                }
       
  5259 	                ++this.index;
       
  5260 	            }
       
  5261 	            else {
       
  5262 	                ++this.index;
       
  5263 	            }
       
  5264 	        }
       
  5265 	        // Ran off the end of the file - the whole thing is a comment
       
  5266 	        if (this.trackComment) {
       
  5267 	            loc.end = {
       
  5268 	                line: this.lineNumber,
       
  5269 	                column: this.index - this.lineStart
       
  5270 	            };
       
  5271 	            var entry = {
       
  5272 	                multiLine: true,
       
  5273 	                slice: [start + 2, this.index],
       
  5274 	                range: [start, this.index],
       
  5275 	                loc: loc
       
  5276 	            };
       
  5277 	            comments.push(entry);
       
  5278 	        }
       
  5279 	        this.tolerateUnexpectedToken();
       
  5280 	        return comments;
       
  5281 	    };
       
  5282 	    Scanner.prototype.scanComments = function () {
       
  5283 	        var comments;
       
  5284 	        if (this.trackComment) {
       
  5285 	            comments = [];
       
  5286 	        }
       
  5287 	        var start = (this.index === 0);
       
  5288 	        while (!this.eof()) {
       
  5289 	            var ch = this.source.charCodeAt(this.index);
       
  5290 	            if (character_1.Character.isWhiteSpace(ch)) {
       
  5291 	                ++this.index;
       
  5292 	            }
       
  5293 	            else if (character_1.Character.isLineTerminator(ch)) {
       
  5294 	                ++this.index;
       
  5295 	                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
       
  5296 	                    ++this.index;
       
  5297 	                }
       
  5298 	                ++this.lineNumber;
       
  5299 	                this.lineStart = this.index;
       
  5300 	                start = true;
       
  5301 	            }
       
  5302 	            else if (ch === 0x2F) {
       
  5303 	                ch = this.source.charCodeAt(this.index + 1);
       
  5304 	                if (ch === 0x2F) {
       
  5305 	                    this.index += 2;
       
  5306 	                    var comment = this.skipSingleLineComment(2);
       
  5307 	                    if (this.trackComment) {
       
  5308 	                        comments = comments.concat(comment);
       
  5309 	                    }
       
  5310 	                    start = true;
       
  5311 	                }
       
  5312 	                else if (ch === 0x2A) {
       
  5313 	                    this.index += 2;
       
  5314 	                    var comment = this.skipMultiLineComment();
       
  5315 	                    if (this.trackComment) {
       
  5316 	                        comments = comments.concat(comment);
       
  5317 	                    }
       
  5318 	                }
       
  5319 	                else {
       
  5320 	                    break;
       
  5321 	                }
       
  5322 	            }
       
  5323 	            else if (start && ch === 0x2D) {
       
  5324 	                // U+003E is '>'
       
  5325 	                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
       
  5326 	                    // '-->' is a single-line comment
       
  5327 	                    this.index += 3;
       
  5328 	                    var comment = this.skipSingleLineComment(3);
       
  5329 	                    if (this.trackComment) {
       
  5330 	                        comments = comments.concat(comment);
       
  5331 	                    }
       
  5332 	                }
       
  5333 	                else {
       
  5334 	                    break;
       
  5335 	                }
       
  5336 	            }
       
  5337 	            else if (ch === 0x3C) {
       
  5338 	                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
       
  5339 	                    this.index += 4; // `<!--`
       
  5340 	                    var comment = this.skipSingleLineComment(4);
       
  5341 	                    if (this.trackComment) {
       
  5342 	                        comments = comments.concat(comment);
       
  5343 	                    }
       
  5344 	                }
       
  5345 	                else {
       
  5346 	                    break;
       
  5347 	                }
       
  5348 	            }
       
  5349 	            else {
       
  5350 	                break;
       
  5351 	            }
       
  5352 	        }
       
  5353 	        return comments;
       
  5354 	    };
       
  5355 	    // https://tc39.github.io/ecma262/#sec-future-reserved-words
       
  5356 	    Scanner.prototype.isFutureReservedWord = function (id) {
       
  5357 	        switch (id) {
       
  5358 	            case 'enum':
       
  5359 	            case 'export':
       
  5360 	            case 'import':
       
  5361 	            case 'super':
       
  5362 	                return true;
       
  5363 	            default:
       
  5364 	                return false;
       
  5365 	        }
       
  5366 	    };
       
  5367 	    Scanner.prototype.isStrictModeReservedWord = function (id) {
       
  5368 	        switch (id) {
       
  5369 	            case 'implements':
       
  5370 	            case 'interface':
       
  5371 	            case 'package':
       
  5372 	            case 'private':
       
  5373 	            case 'protected':
       
  5374 	            case 'public':
       
  5375 	            case 'static':
       
  5376 	            case 'yield':
       
  5377 	            case 'let':
       
  5378 	                return true;
       
  5379 	            default:
       
  5380 	                return false;
       
  5381 	        }
       
  5382 	    };
       
  5383 	    Scanner.prototype.isRestrictedWord = function (id) {
       
  5384 	        return id === 'eval' || id === 'arguments';
       
  5385 	    };
       
  5386 	    // https://tc39.github.io/ecma262/#sec-keywords
       
  5387 	    Scanner.prototype.isKeyword = function (id) {
       
  5388 	        switch (id.length) {
       
  5389 	            case 2:
       
  5390 	                return (id === 'if') || (id === 'in') || (id === 'do');
       
  5391 	            case 3:
       
  5392 	                return (id === 'var') || (id === 'for') || (id === 'new') ||
       
  5393 	                    (id === 'try') || (id === 'let');
       
  5394 	            case 4:
       
  5395 	                return (id === 'this') || (id === 'else') || (id === 'case') ||
       
  5396 	                    (id === 'void') || (id === 'with') || (id === 'enum');
       
  5397 	            case 5:
       
  5398 	                return (id === 'while') || (id === 'break') || (id === 'catch') ||
       
  5399 	                    (id === 'throw') || (id === 'const') || (id === 'yield') ||
       
  5400 	                    (id === 'class') || (id === 'super');
       
  5401 	            case 6:
       
  5402 	                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
       
  5403 	                    (id === 'switch') || (id === 'export') || (id === 'import');
       
  5404 	            case 7:
       
  5405 	                return (id === 'default') || (id === 'finally') || (id === 'extends');
       
  5406 	            case 8:
       
  5407 	                return (id === 'function') || (id === 'continue') || (id === 'debugger');
       
  5408 	            case 10:
       
  5409 	                return (id === 'instanceof');
       
  5410 	            default:
       
  5411 	                return false;
       
  5412 	        }
       
  5413 	    };
       
  5414 	    Scanner.prototype.codePointAt = function (i) {
       
  5415 	        var cp = this.source.charCodeAt(i);
       
  5416 	        if (cp >= 0xD800 && cp <= 0xDBFF) {
       
  5417 	            var second = this.source.charCodeAt(i + 1);
       
  5418 	            if (second >= 0xDC00 && second <= 0xDFFF) {
       
  5419 	                var first = cp;
       
  5420 	                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
       
  5421 	            }
       
  5422 	        }
       
  5423 	        return cp;
       
  5424 	    };
       
  5425 	    Scanner.prototype.scanHexEscape = function (prefix) {
       
  5426 	        var len = (prefix === 'u') ? 4 : 2;
       
  5427 	        var code = 0;
       
  5428 	        for (var i = 0; i < len; ++i) {
       
  5429 	            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
       
  5430 	                code = code * 16 + hexValue(this.source[this.index++]);
       
  5431 	            }
       
  5432 	            else {
       
  5433 	                return null;
       
  5434 	            }
       
  5435 	        }
       
  5436 	        return String.fromCharCode(code);
       
  5437 	    };
       
  5438 	    Scanner.prototype.scanUnicodeCodePointEscape = function () {
       
  5439 	        var ch = this.source[this.index];
       
  5440 	        var code = 0;
       
  5441 	        // At least, one hex digit is required.
       
  5442 	        if (ch === '}') {
       
  5443 	            this.throwUnexpectedToken();
       
  5444 	        }
       
  5445 	        while (!this.eof()) {
       
  5446 	            ch = this.source[this.index++];
       
  5447 	            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {
       
  5448 	                break;
       
  5449 	            }
       
  5450 	            code = code * 16 + hexValue(ch);
       
  5451 	        }
       
  5452 	        if (code > 0x10FFFF || ch !== '}') {
       
  5453 	            this.throwUnexpectedToken();
       
  5454 	        }
       
  5455 	        return character_1.Character.fromCodePoint(code);
       
  5456 	    };
       
  5457 	    Scanner.prototype.getIdentifier = function () {
       
  5458 	        var start = this.index++;
       
  5459 	        while (!this.eof()) {
       
  5460 	            var ch = this.source.charCodeAt(this.index);
       
  5461 	            if (ch === 0x5C) {
       
  5462 	                // Blackslash (U+005C) marks Unicode escape sequence.
       
  5463 	                this.index = start;
       
  5464 	                return this.getComplexIdentifier();
       
  5465 	            }
       
  5466 	            else if (ch >= 0xD800 && ch < 0xDFFF) {
       
  5467 	                // Need to handle surrogate pairs.
       
  5468 	                this.index = start;
       
  5469 	                return this.getComplexIdentifier();
       
  5470 	            }
       
  5471 	            if (character_1.Character.isIdentifierPart(ch)) {
       
  5472 	                ++this.index;
       
  5473 	            }
       
  5474 	            else {
       
  5475 	                break;
       
  5476 	            }
       
  5477 	        }
       
  5478 	        return this.source.slice(start, this.index);
       
  5479 	    };
       
  5480 	    Scanner.prototype.getComplexIdentifier = function () {
       
  5481 	        var cp = this.codePointAt(this.index);
       
  5482 	        var id = character_1.Character.fromCodePoint(cp);
       
  5483 	        this.index += id.length;
       
  5484 	        // '\u' (U+005C, U+0075) denotes an escaped character.
       
  5485 	        var ch;
       
  5486 	        if (cp === 0x5C) {
       
  5487 	            if (this.source.charCodeAt(this.index) !== 0x75) {
       
  5488 	                this.throwUnexpectedToken();
       
  5489 	            }
       
  5490 	            ++this.index;
       
  5491 	            if (this.source[this.index] === '{') {
       
  5492 	                ++this.index;
       
  5493 	                ch = this.scanUnicodeCodePointEscape();
       
  5494 	            }
       
  5495 	            else {
       
  5496 	                ch = this.scanHexEscape('u');
       
  5497 	                if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {
       
  5498 	                    this.throwUnexpectedToken();
       
  5499 	                }
       
  5500 	            }
       
  5501 	            id = ch;
       
  5502 	        }
       
  5503 	        while (!this.eof()) {
       
  5504 	            cp = this.codePointAt(this.index);
       
  5505 	            if (!character_1.Character.isIdentifierPart(cp)) {
       
  5506 	                break;
       
  5507 	            }
       
  5508 	            ch = character_1.Character.fromCodePoint(cp);
       
  5509 	            id += ch;
       
  5510 	            this.index += ch.length;
       
  5511 	            // '\u' (U+005C, U+0075) denotes an escaped character.
       
  5512 	            if (cp === 0x5C) {
       
  5513 	                id = id.substr(0, id.length - 1);
       
  5514 	                if (this.source.charCodeAt(this.index) !== 0x75) {
       
  5515 	                    this.throwUnexpectedToken();
       
  5516 	                }
       
  5517 	                ++this.index;
       
  5518 	                if (this.source[this.index] === '{') {
       
  5519 	                    ++this.index;
       
  5520 	                    ch = this.scanUnicodeCodePointEscape();
       
  5521 	                }
       
  5522 	                else {
       
  5523 	                    ch = this.scanHexEscape('u');
       
  5524 	                    if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
       
  5525 	                        this.throwUnexpectedToken();
       
  5526 	                    }
       
  5527 	                }
       
  5528 	                id += ch;
       
  5529 	            }
       
  5530 	        }
       
  5531 	        return id;
       
  5532 	    };
       
  5533 	    Scanner.prototype.octalToDecimal = function (ch) {
       
  5534 	        // \0 is not octal escape sequence
       
  5535 	        var octal = (ch !== '0');
       
  5536 	        var code = octalValue(ch);
       
  5537 	        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
       
  5538 	            octal = true;
       
  5539 	            code = code * 8 + octalValue(this.source[this.index++]);
       
  5540 	            // 3 digits are only allowed when string starts
       
  5541 	            // with 0, 1, 2, 3
       
  5542 	            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
       
  5543 	                code = code * 8 + octalValue(this.source[this.index++]);
       
  5544 	            }
       
  5545 	        }
       
  5546 	        return {
       
  5547 	            code: code,
       
  5548 	            octal: octal
       
  5549 	        };
       
  5550 	    };
       
  5551 	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
       
  5552 	    Scanner.prototype.scanIdentifier = function () {
       
  5553 	        var type;
       
  5554 	        var start = this.index;
       
  5555 	        // Backslash (U+005C) starts an escaped character.
       
  5556 	        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();
       
  5557 	        // There is no keyword or literal with only one character.
       
  5558 	        // Thus, it must be an identifier.
       
  5559 	        if (id.length === 1) {
       
  5560 	            type = 3 /* Identifier */;
       
  5561 	        }
       
  5562 	        else if (this.isKeyword(id)) {
       
  5563 	            type = 4 /* Keyword */;
       
  5564 	        }
       
  5565 	        else if (id === 'null') {
       
  5566 	            type = 5 /* NullLiteral */;
       
  5567 	        }
       
  5568 	        else if (id === 'true' || id === 'false') {
       
  5569 	            type = 1 /* BooleanLiteral */;
       
  5570 	        }
       
  5571 	        else {
       
  5572 	            type = 3 /* Identifier */;
       
  5573 	        }
       
  5574 	        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {
       
  5575 	            var restore = this.index;
       
  5576 	            this.index = start;
       
  5577 	            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);
       
  5578 	            this.index = restore;
       
  5579 	        }
       
  5580 	        return {
       
  5581 	            type: type,
       
  5582 	            value: id,
       
  5583 	            lineNumber: this.lineNumber,
       
  5584 	            lineStart: this.lineStart,
       
  5585 	            start: start,
       
  5586 	            end: this.index
       
  5587 	        };
       
  5588 	    };
       
  5589 	    // https://tc39.github.io/ecma262/#sec-punctuators
       
  5590 	    Scanner.prototype.scanPunctuator = function () {
       
  5591 	        var start = this.index;
       
  5592 	        // Check for most common single-character punctuators.
       
  5593 	        var str = this.source[this.index];
       
  5594 	        switch (str) {
       
  5595 	            case '(':
       
  5596 	            case '{':
       
  5597 	                if (str === '{') {
       
  5598 	                    this.curlyStack.push('{');
       
  5599 	                }
       
  5600 	                ++this.index;
       
  5601 	                break;
       
  5602 	            case '.':
       
  5603 	                ++this.index;
       
  5604 	                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {
       
  5605 	                    // Spread operator: ...
       
  5606 	                    this.index += 2;
       
  5607 	                    str = '...';
       
  5608 	                }
       
  5609 	                break;
       
  5610 	            case '}':
       
  5611 	                ++this.index;
       
  5612 	                this.curlyStack.pop();
       
  5613 	                break;
       
  5614 	            case ')':
       
  5615 	            case ';':
       
  5616 	            case ',':
       
  5617 	            case '[':
       
  5618 	            case ']':
       
  5619 	            case ':':
       
  5620 	            case '?':
       
  5621 	            case '~':
       
  5622 	                ++this.index;
       
  5623 	                break;
       
  5624 	            default:
       
  5625 	                // 4-character punctuator.
       
  5626 	                str = this.source.substr(this.index, 4);
       
  5627 	                if (str === '>>>=') {
       
  5628 	                    this.index += 4;
       
  5629 	                }
       
  5630 	                else {
       
  5631 	                    // 3-character punctuators.
       
  5632 	                    str = str.substr(0, 3);
       
  5633 	                    if (str === '===' || str === '!==' || str === '>>>' ||
       
  5634 	                        str === '<<=' || str === '>>=' || str === '**=') {
       
  5635 	                        this.index += 3;
       
  5636 	                    }
       
  5637 	                    else {
       
  5638 	                        // 2-character punctuators.
       
  5639 	                        str = str.substr(0, 2);
       
  5640 	                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
       
  5641 	                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
       
  5642 	                            str === '++' || str === '--' || str === '<<' || str === '>>' ||
       
  5643 	                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
       
  5644 	                            str === '<=' || str === '>=' || str === '=>' || str === '**') {
       
  5645 	                            this.index += 2;
       
  5646 	                        }
       
  5647 	                        else {
       
  5648 	                            // 1-character punctuators.
       
  5649 	                            str = this.source[this.index];
       
  5650 	                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
       
  5651 	                                ++this.index;
       
  5652 	                            }
       
  5653 	                        }
       
  5654 	                    }
       
  5655 	                }
       
  5656 	        }
       
  5657 	        if (this.index === start) {
       
  5658 	            this.throwUnexpectedToken();
       
  5659 	        }
       
  5660 	        return {
       
  5661 	            type: 7 /* Punctuator */,
       
  5662 	            value: str,
       
  5663 	            lineNumber: this.lineNumber,
       
  5664 	            lineStart: this.lineStart,
       
  5665 	            start: start,
       
  5666 	            end: this.index
       
  5667 	        };
       
  5668 	    };
       
  5669 	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
       
  5670 	    Scanner.prototype.scanHexLiteral = function (start) {
       
  5671 	        var num = '';
       
  5672 	        while (!this.eof()) {
       
  5673 	            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
       
  5674 	                break;
       
  5675 	            }
       
  5676 	            num += this.source[this.index++];
       
  5677 	        }
       
  5678 	        if (num.length === 0) {
       
  5679 	            this.throwUnexpectedToken();
       
  5680 	        }
       
  5681 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
       
  5682 	            this.throwUnexpectedToken();
       
  5683 	        }
       
  5684 	        return {
       
  5685 	            type: 6 /* NumericLiteral */,
       
  5686 	            value: parseInt('0x' + num, 16),
       
  5687 	            lineNumber: this.lineNumber,
       
  5688 	            lineStart: this.lineStart,
       
  5689 	            start: start,
       
  5690 	            end: this.index
       
  5691 	        };
       
  5692 	    };
       
  5693 	    Scanner.prototype.scanBinaryLiteral = function (start) {
       
  5694 	        var num = '';
       
  5695 	        var ch;
       
  5696 	        while (!this.eof()) {
       
  5697 	            ch = this.source[this.index];
       
  5698 	            if (ch !== '0' && ch !== '1') {
       
  5699 	                break;
       
  5700 	            }
       
  5701 	            num += this.source[this.index++];
       
  5702 	        }
       
  5703 	        if (num.length === 0) {
       
  5704 	            // only 0b or 0B
       
  5705 	            this.throwUnexpectedToken();
       
  5706 	        }
       
  5707 	        if (!this.eof()) {
       
  5708 	            ch = this.source.charCodeAt(this.index);
       
  5709 	            /* istanbul ignore else */
       
  5710 	            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {
       
  5711 	                this.throwUnexpectedToken();
       
  5712 	            }
       
  5713 	        }
       
  5714 	        return {
       
  5715 	            type: 6 /* NumericLiteral */,
       
  5716 	            value: parseInt(num, 2),
       
  5717 	            lineNumber: this.lineNumber,
       
  5718 	            lineStart: this.lineStart,
       
  5719 	            start: start,
       
  5720 	            end: this.index
       
  5721 	        };
       
  5722 	    };
       
  5723 	    Scanner.prototype.scanOctalLiteral = function (prefix, start) {
       
  5724 	        var num = '';
       
  5725 	        var octal = false;
       
  5726 	        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {
       
  5727 	            octal = true;
       
  5728 	            num = '0' + this.source[this.index++];
       
  5729 	        }
       
  5730 	        else {
       
  5731 	            ++this.index;
       
  5732 	        }
       
  5733 	        while (!this.eof()) {
       
  5734 	            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
       
  5735 	                break;
       
  5736 	            }
       
  5737 	            num += this.source[this.index++];
       
  5738 	        }
       
  5739 	        if (!octal && num.length === 0) {
       
  5740 	            // only 0o or 0O
       
  5741 	            this.throwUnexpectedToken();
       
  5742 	        }
       
  5743 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  5744 	            this.throwUnexpectedToken();
       
  5745 	        }
       
  5746 	        return {
       
  5747 	            type: 6 /* NumericLiteral */,
       
  5748 	            value: parseInt(num, 8),
       
  5749 	            octal: octal,
       
  5750 	            lineNumber: this.lineNumber,
       
  5751 	            lineStart: this.lineStart,
       
  5752 	            start: start,
       
  5753 	            end: this.index
       
  5754 	        };
       
  5755 	    };
       
  5756 	    Scanner.prototype.isImplicitOctalLiteral = function () {
       
  5757 	        // Implicit octal, unless there is a non-octal digit.
       
  5758 	        // (Annex B.1.1 on Numeric Literals)
       
  5759 	        for (var i = this.index + 1; i < this.length; ++i) {
       
  5760 	            var ch = this.source[i];
       
  5761 	            if (ch === '8' || ch === '9') {
       
  5762 	                return false;
       
  5763 	            }
       
  5764 	            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
       
  5765 	                return true;
       
  5766 	            }
       
  5767 	        }
       
  5768 	        return true;
       
  5769 	    };
       
  5770 	    Scanner.prototype.scanNumericLiteral = function () {
       
  5771 	        var start = this.index;
       
  5772 	        var ch = this.source[start];
       
  5773 	        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');
       
  5774 	        var num = '';
       
  5775 	        if (ch !== '.') {
       
  5776 	            num = this.source[this.index++];
       
  5777 	            ch = this.source[this.index];
       
  5778 	            // Hex number starts with '0x'.
       
  5779 	            // Octal number starts with '0'.
       
  5780 	            // Octal number in ES6 starts with '0o'.
       
  5781 	            // Binary number in ES6 starts with '0b'.
       
  5782 	            if (num === '0') {
       
  5783 	                if (ch === 'x' || ch === 'X') {
       
  5784 	                    ++this.index;
       
  5785 	                    return this.scanHexLiteral(start);
       
  5786 	                }
       
  5787 	                if (ch === 'b' || ch === 'B') {
       
  5788 	                    ++this.index;
       
  5789 	                    return this.scanBinaryLiteral(start);
       
  5790 	                }
       
  5791 	                if (ch === 'o' || ch === 'O') {
       
  5792 	                    return this.scanOctalLiteral(ch, start);
       
  5793 	                }
       
  5794 	                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
       
  5795 	                    if (this.isImplicitOctalLiteral()) {
       
  5796 	                        return this.scanOctalLiteral(ch, start);
       
  5797 	                    }
       
  5798 	                }
       
  5799 	            }
       
  5800 	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  5801 	                num += this.source[this.index++];
       
  5802 	            }
       
  5803 	            ch = this.source[this.index];
       
  5804 	        }
       
  5805 	        if (ch === '.') {
       
  5806 	            num += this.source[this.index++];
       
  5807 	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  5808 	                num += this.source[this.index++];
       
  5809 	            }
       
  5810 	            ch = this.source[this.index];
       
  5811 	        }
       
  5812 	        if (ch === 'e' || ch === 'E') {
       
  5813 	            num += this.source[this.index++];
       
  5814 	            ch = this.source[this.index];
       
  5815 	            if (ch === '+' || ch === '-') {
       
  5816 	                num += this.source[this.index++];
       
  5817 	            }
       
  5818 	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  5819 	                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  5820 	                    num += this.source[this.index++];
       
  5821 	                }
       
  5822 	            }
       
  5823 	            else {
       
  5824 	                this.throwUnexpectedToken();
       
  5825 	            }
       
  5826 	        }
       
  5827 	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
       
  5828 	            this.throwUnexpectedToken();
       
  5829 	        }
       
  5830 	        return {
       
  5831 	            type: 6 /* NumericLiteral */,
       
  5832 	            value: parseFloat(num),
       
  5833 	            lineNumber: this.lineNumber,
       
  5834 	            lineStart: this.lineStart,
       
  5835 	            start: start,
       
  5836 	            end: this.index
       
  5837 	        };
       
  5838 	    };
       
  5839 	    // https://tc39.github.io/ecma262/#sec-literals-string-literals
       
  5840 	    Scanner.prototype.scanStringLiteral = function () {
       
  5841 	        var start = this.index;
       
  5842 	        var quote = this.source[start];
       
  5843 	        assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote');
       
  5844 	        ++this.index;
       
  5845 	        var octal = false;
       
  5846 	        var str = '';
       
  5847 	        while (!this.eof()) {
       
  5848 	            var ch = this.source[this.index++];
       
  5849 	            if (ch === quote) {
       
  5850 	                quote = '';
       
  5851 	                break;
       
  5852 	            }
       
  5853 	            else if (ch === '\\') {
       
  5854 	                ch = this.source[this.index++];
       
  5855 	                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  5856 	                    switch (ch) {
       
  5857 	                        case 'u':
       
  5858 	                            if (this.source[this.index] === '{') {
       
  5859 	                                ++this.index;
       
  5860 	                                str += this.scanUnicodeCodePointEscape();
       
  5861 	                            }
       
  5862 	                            else {
       
  5863 	                                var unescaped_1 = this.scanHexEscape(ch);
       
  5864 	                                if (unescaped_1 === null) {
       
  5865 	                                    this.throwUnexpectedToken();
       
  5866 	                                }
       
  5867 	                                str += unescaped_1;
       
  5868 	                            }
       
  5869 	                            break;
       
  5870 	                        case 'x':
       
  5871 	                            var unescaped = this.scanHexEscape(ch);
       
  5872 	                            if (unescaped === null) {
       
  5873 	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
       
  5874 	                            }
       
  5875 	                            str += unescaped;
       
  5876 	                            break;
       
  5877 	                        case 'n':
       
  5878 	                            str += '\n';
       
  5879 	                            break;
       
  5880 	                        case 'r':
       
  5881 	                            str += '\r';
       
  5882 	                            break;
       
  5883 	                        case 't':
       
  5884 	                            str += '\t';
       
  5885 	                            break;
       
  5886 	                        case 'b':
       
  5887 	                            str += '\b';
       
  5888 	                            break;
       
  5889 	                        case 'f':
       
  5890 	                            str += '\f';
       
  5891 	                            break;
       
  5892 	                        case 'v':
       
  5893 	                            str += '\x0B';
       
  5894 	                            break;
       
  5895 	                        case '8':
       
  5896 	                        case '9':
       
  5897 	                            str += ch;
       
  5898 	                            this.tolerateUnexpectedToken();
       
  5899 	                            break;
       
  5900 	                        default:
       
  5901 	                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
       
  5902 	                                var octToDec = this.octalToDecimal(ch);
       
  5903 	                                octal = octToDec.octal || octal;
       
  5904 	                                str += String.fromCharCode(octToDec.code);
       
  5905 	                            }
       
  5906 	                            else {
       
  5907 	                                str += ch;
       
  5908 	                            }
       
  5909 	                            break;
       
  5910 	                    }
       
  5911 	                }
       
  5912 	                else {
       
  5913 	                    ++this.lineNumber;
       
  5914 	                    if (ch === '\r' && this.source[this.index] === '\n') {
       
  5915 	                        ++this.index;
       
  5916 	                    }
       
  5917 	                    this.lineStart = this.index;
       
  5918 	                }
       
  5919 	            }
       
  5920 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  5921 	                break;
       
  5922 	            }
       
  5923 	            else {
       
  5924 	                str += ch;
       
  5925 	            }
       
  5926 	        }
       
  5927 	        if (quote !== '') {
       
  5928 	            this.index = start;
       
  5929 	            this.throwUnexpectedToken();
       
  5930 	        }
       
  5931 	        return {
       
  5932 	            type: 8 /* StringLiteral */,
       
  5933 	            value: str,
       
  5934 	            octal: octal,
       
  5935 	            lineNumber: this.lineNumber,
       
  5936 	            lineStart: this.lineStart,
       
  5937 	            start: start,
       
  5938 	            end: this.index
       
  5939 	        };
       
  5940 	    };
       
  5941 	    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components
       
  5942 	    Scanner.prototype.scanTemplate = function () {
       
  5943 	        var cooked = '';
       
  5944 	        var terminated = false;
       
  5945 	        var start = this.index;
       
  5946 	        var head = (this.source[start] === '`');
       
  5947 	        var tail = false;
       
  5948 	        var rawOffset = 2;
       
  5949 	        ++this.index;
       
  5950 	        while (!this.eof()) {
       
  5951 	            var ch = this.source[this.index++];
       
  5952 	            if (ch === '`') {
       
  5953 	                rawOffset = 1;
       
  5954 	                tail = true;
       
  5955 	                terminated = true;
       
  5956 	                break;
       
  5957 	            }
       
  5958 	            else if (ch === '$') {
       
  5959 	                if (this.source[this.index] === '{') {
       
  5960 	                    this.curlyStack.push('${');
       
  5961 	                    ++this.index;
       
  5962 	                    terminated = true;
       
  5963 	                    break;
       
  5964 	                }
       
  5965 	                cooked += ch;
       
  5966 	            }
       
  5967 	            else if (ch === '\\') {
       
  5968 	                ch = this.source[this.index++];
       
  5969 	                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  5970 	                    switch (ch) {
       
  5971 	                        case 'n':
       
  5972 	                            cooked += '\n';
       
  5973 	                            break;
       
  5974 	                        case 'r':
       
  5975 	                            cooked += '\r';
       
  5976 	                            break;
       
  5977 	                        case 't':
       
  5978 	                            cooked += '\t';
       
  5979 	                            break;
       
  5980 	                        case 'u':
       
  5981 	                            if (this.source[this.index] === '{') {
       
  5982 	                                ++this.index;
       
  5983 	                                cooked += this.scanUnicodeCodePointEscape();
       
  5984 	                            }
       
  5985 	                            else {
       
  5986 	                                var restore = this.index;
       
  5987 	                                var unescaped_2 = this.scanHexEscape(ch);
       
  5988 	                                if (unescaped_2 !== null) {
       
  5989 	                                    cooked += unescaped_2;
       
  5990 	                                }
       
  5991 	                                else {
       
  5992 	                                    this.index = restore;
       
  5993 	                                    cooked += ch;
       
  5994 	                                }
       
  5995 	                            }
       
  5996 	                            break;
       
  5997 	                        case 'x':
       
  5998 	                            var unescaped = this.scanHexEscape(ch);
       
  5999 	                            if (unescaped === null) {
       
  6000 	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
       
  6001 	                            }
       
  6002 	                            cooked += unescaped;
       
  6003 	                            break;
       
  6004 	                        case 'b':
       
  6005 	                            cooked += '\b';
       
  6006 	                            break;
       
  6007 	                        case 'f':
       
  6008 	                            cooked += '\f';
       
  6009 	                            break;
       
  6010 	                        case 'v':
       
  6011 	                            cooked += '\v';
       
  6012 	                            break;
       
  6013 	                        default:
       
  6014 	                            if (ch === '0') {
       
  6015 	                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
       
  6016 	                                    // Illegal: \01 \02 and so on
       
  6017 	                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
       
  6018 	                                }
       
  6019 	                                cooked += '\0';
       
  6020 	                            }
       
  6021 	                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
       
  6022 	                                // Illegal: \1 \2
       
  6023 	                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
       
  6024 	                            }
       
  6025 	                            else {
       
  6026 	                                cooked += ch;
       
  6027 	                            }
       
  6028 	                            break;
       
  6029 	                    }
       
  6030 	                }
       
  6031 	                else {
       
  6032 	                    ++this.lineNumber;
       
  6033 	                    if (ch === '\r' && this.source[this.index] === '\n') {
       
  6034 	                        ++this.index;
       
  6035 	                    }
       
  6036 	                    this.lineStart = this.index;
       
  6037 	                }
       
  6038 	            }
       
  6039 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  6040 	                ++this.lineNumber;
       
  6041 	                if (ch === '\r' && this.source[this.index] === '\n') {
       
  6042 	                    ++this.index;
       
  6043 	                }
       
  6044 	                this.lineStart = this.index;
       
  6045 	                cooked += '\n';
       
  6046 	            }
       
  6047 	            else {
       
  6048 	                cooked += ch;
       
  6049 	            }
       
  6050 	        }
       
  6051 	        if (!terminated) {
       
  6052 	            this.throwUnexpectedToken();
       
  6053 	        }
       
  6054 	        if (!head) {
       
  6055 	            this.curlyStack.pop();
       
  6056 	        }
       
  6057 	        return {
       
  6058 	            type: 10 /* Template */,
       
  6059 	            value: this.source.slice(start + 1, this.index - rawOffset),
       
  6060 	            cooked: cooked,
       
  6061 	            head: head,
       
  6062 	            tail: tail,
       
  6063 	            lineNumber: this.lineNumber,
       
  6064 	            lineStart: this.lineStart,
       
  6065 	            start: start,
       
  6066 	            end: this.index
       
  6067 	        };
       
  6068 	    };
       
  6069 	    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
       
  6070 	    Scanner.prototype.testRegExp = function (pattern, flags) {
       
  6071 	        // The BMP character to use as a replacement for astral symbols when
       
  6072 	        // translating an ES6 "u"-flagged pattern to an ES5-compatible
       
  6073 	        // approximation.
       
  6074 	        // Note: replacing with '\uFFFF' enables false positives in unlikely
       
  6075 	        // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
       
  6076 	        // pattern that would not be detected by this substitution.
       
  6077 	        var astralSubstitute = '\uFFFF';
       
  6078 	        var tmp = pattern;
       
  6079 	        var self = this;
       
  6080 	        if (flags.indexOf('u') >= 0) {
       
  6081 	            tmp = tmp
       
  6082 	                .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
       
  6083 	                var codePoint = parseInt($1 || $2, 16);
       
  6084 	                if (codePoint > 0x10FFFF) {
       
  6085 	                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
       
  6086 	                }
       
  6087 	                if (codePoint <= 0xFFFF) {
       
  6088 	                    return String.fromCharCode(codePoint);
       
  6089 	                }
       
  6090 	                return astralSubstitute;
       
  6091 	            })
       
  6092 	                .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute);
       
  6093 	        }
       
  6094 	        // First, detect invalid regular expressions.
       
  6095 	        try {
       
  6096 	            RegExp(tmp);
       
  6097 	        }
       
  6098 	        catch (e) {
       
  6099 	            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
       
  6100 	        }
       
  6101 	        // Return a regular expression object for this pattern-flag pair, or
       
  6102 	        // `null` in case the current environment doesn't support the flags it
       
  6103 	        // uses.
       
  6104 	        try {
       
  6105 	            return new RegExp(pattern, flags);
       
  6106 	        }
       
  6107 	        catch (exception) {
       
  6108 	            /* istanbul ignore next */
       
  6109 	            return null;
       
  6110 	        }
       
  6111 	    };
       
  6112 	    Scanner.prototype.scanRegExpBody = function () {
       
  6113 	        var ch = this.source[this.index];
       
  6114 	        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');
       
  6115 	        var str = this.source[this.index++];
       
  6116 	        var classMarker = false;
       
  6117 	        var terminated = false;
       
  6118 	        while (!this.eof()) {
       
  6119 	            ch = this.source[this.index++];
       
  6120 	            str += ch;
       
  6121 	            if (ch === '\\') {
       
  6122 	                ch = this.source[this.index++];
       
  6123 	                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
       
  6124 	                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  6125 	                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
       
  6126 	                }
       
  6127 	                str += ch;
       
  6128 	            }
       
  6129 	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
       
  6130 	                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
       
  6131 	            }
       
  6132 	            else if (classMarker) {
       
  6133 	                if (ch === ']') {
       
  6134 	                    classMarker = false;
       
  6135 	                }
       
  6136 	            }
       
  6137 	            else {
       
  6138 	                if (ch === '/') {
       
  6139 	                    terminated = true;
       
  6140 	                    break;
       
  6141 	                }
       
  6142 	                else if (ch === '[') {
       
  6143 	                    classMarker = true;
       
  6144 	                }
       
  6145 	            }
       
  6146 	        }
       
  6147 	        if (!terminated) {
       
  6148 	            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
       
  6149 	        }
       
  6150 	        // Exclude leading and trailing slash.
       
  6151 	        return str.substr(1, str.length - 2);
       
  6152 	    };
       
  6153 	    Scanner.prototype.scanRegExpFlags = function () {
       
  6154 	        var str = '';
       
  6155 	        var flags = '';
       
  6156 	        while (!this.eof()) {
       
  6157 	            var ch = this.source[this.index];
       
  6158 	            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
       
  6159 	                break;
       
  6160 	            }
       
  6161 	            ++this.index;
       
  6162 	            if (ch === '\\' && !this.eof()) {
       
  6163 	                ch = this.source[this.index];
       
  6164 	                if (ch === 'u') {
       
  6165 	                    ++this.index;
       
  6166 	                    var restore = this.index;
       
  6167 	                    var char = this.scanHexEscape('u');
       
  6168 	                    if (char !== null) {
       
  6169 	                        flags += char;
       
  6170 	                        for (str += '\\u'; restore < this.index; ++restore) {
       
  6171 	                            str += this.source[restore];
       
  6172 	                        }
       
  6173 	                    }
       
  6174 	                    else {
       
  6175 	                        this.index = restore;
       
  6176 	                        flags += 'u';
       
  6177 	                        str += '\\u';
       
  6178 	                    }
       
  6179 	                    this.tolerateUnexpectedToken();
       
  6180 	                }
       
  6181 	                else {
       
  6182 	                    str += '\\';
       
  6183 	                    this.tolerateUnexpectedToken();
       
  6184 	                }
       
  6185 	            }
       
  6186 	            else {
       
  6187 	                flags += ch;
       
  6188 	                str += ch;
       
  6189 	            }
       
  6190 	        }
       
  6191 	        return flags;
       
  6192 	    };
       
  6193 	    Scanner.prototype.scanRegExp = function () {
       
  6194 	        var start = this.index;
       
  6195 	        var pattern = this.scanRegExpBody();
       
  6196 	        var flags = this.scanRegExpFlags();
       
  6197 	        var value = this.testRegExp(pattern, flags);
       
  6198 	        return {
       
  6199 	            type: 9 /* RegularExpression */,
       
  6200 	            value: '',
       
  6201 	            pattern: pattern,
       
  6202 	            flags: flags,
       
  6203 	            regex: value,
       
  6204 	            lineNumber: this.lineNumber,
       
  6205 	            lineStart: this.lineStart,
       
  6206 	            start: start,
       
  6207 	            end: this.index
       
  6208 	        };
       
  6209 	    };
       
  6210 	    Scanner.prototype.lex = function () {
       
  6211 	        if (this.eof()) {
       
  6212 	            return {
       
  6213 	                type: 2 /* EOF */,
       
  6214 	                value: '',
       
  6215 	                lineNumber: this.lineNumber,
       
  6216 	                lineStart: this.lineStart,
       
  6217 	                start: this.index,
       
  6218 	                end: this.index
       
  6219 	            };
       
  6220 	        }
       
  6221 	        var cp = this.source.charCodeAt(this.index);
       
  6222 	        if (character_1.Character.isIdentifierStart(cp)) {
       
  6223 	            return this.scanIdentifier();
       
  6224 	        }
       
  6225 	        // Very common: ( and ) and ;
       
  6226 	        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {
       
  6227 	            return this.scanPunctuator();
       
  6228 	        }
       
  6229 	        // String literal starts with single quote (U+0027) or double quote (U+0022).
       
  6230 	        if (cp === 0x27 || cp === 0x22) {
       
  6231 	            return this.scanStringLiteral();
       
  6232 	        }
       
  6233 	        // Dot (.) U+002E can also start a floating-point number, hence the need
       
  6234 	        // to check the next character.
       
  6235 	        if (cp === 0x2E) {
       
  6236 	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {
       
  6237 	                return this.scanNumericLiteral();
       
  6238 	            }
       
  6239 	            return this.scanPunctuator();
       
  6240 	        }
       
  6241 	        if (character_1.Character.isDecimalDigit(cp)) {
       
  6242 	            return this.scanNumericLiteral();
       
  6243 	        }
       
  6244 	        // Template literals start with ` (U+0060) for template head
       
  6245 	        // or } (U+007D) for template middle or template tail.
       
  6246 	        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {
       
  6247 	            return this.scanTemplate();
       
  6248 	        }
       
  6249 	        // Possible identifier start in a surrogate pair.
       
  6250 	        if (cp >= 0xD800 && cp < 0xDFFF) {
       
  6251 	            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {
       
  6252 	                return this.scanIdentifier();
       
  6253 	            }
       
  6254 	        }
       
  6255 	        return this.scanPunctuator();
       
  6256 	    };
       
  6257 	    return Scanner;
       
  6258 	}());
       
  6259 	exports.Scanner = Scanner;
       
  6260 
       
  6261 
       
  6262 /***/ },
       
  6263 /* 13 */
       
  6264 /***/ function(module, exports) {
       
  6265 
       
  6266 	"use strict";
       
  6267 	Object.defineProperty(exports, "__esModule", { value: true });
       
  6268 	exports.TokenName = {};
       
  6269 	exports.TokenName[1 /* BooleanLiteral */] = 'Boolean';
       
  6270 	exports.TokenName[2 /* EOF */] = '<end>';
       
  6271 	exports.TokenName[3 /* Identifier */] = 'Identifier';
       
  6272 	exports.TokenName[4 /* Keyword */] = 'Keyword';
       
  6273 	exports.TokenName[5 /* NullLiteral */] = 'Null';
       
  6274 	exports.TokenName[6 /* NumericLiteral */] = 'Numeric';
       
  6275 	exports.TokenName[7 /* Punctuator */] = 'Punctuator';
       
  6276 	exports.TokenName[8 /* StringLiteral */] = 'String';
       
  6277 	exports.TokenName[9 /* RegularExpression */] = 'RegularExpression';
       
  6278 	exports.TokenName[10 /* Template */] = 'Template';
       
  6279 
       
  6280 
       
  6281 /***/ },
       
  6282 /* 14 */
       
  6283 /***/ function(module, exports) {
       
  6284 
       
  6285 	"use strict";
       
  6286 	// Generated by generate-xhtml-entities.js. DO NOT MODIFY!
       
  6287 	Object.defineProperty(exports, "__esModule", { value: true });
       
  6288 	exports.XHTMLEntities = {
       
  6289 	    quot: '\u0022',
       
  6290 	    amp: '\u0026',
       
  6291 	    apos: '\u0027',
       
  6292 	    gt: '\u003E',
       
  6293 	    nbsp: '\u00A0',
       
  6294 	    iexcl: '\u00A1',
       
  6295 	    cent: '\u00A2',
       
  6296 	    pound: '\u00A3',
       
  6297 	    curren: '\u00A4',
       
  6298 	    yen: '\u00A5',
       
  6299 	    brvbar: '\u00A6',
       
  6300 	    sect: '\u00A7',
       
  6301 	    uml: '\u00A8',
       
  6302 	    copy: '\u00A9',
       
  6303 	    ordf: '\u00AA',
       
  6304 	    laquo: '\u00AB',
       
  6305 	    not: '\u00AC',
       
  6306 	    shy: '\u00AD',
       
  6307 	    reg: '\u00AE',
       
  6308 	    macr: '\u00AF',
       
  6309 	    deg: '\u00B0',
       
  6310 	    plusmn: '\u00B1',
       
  6311 	    sup2: '\u00B2',
       
  6312 	    sup3: '\u00B3',
       
  6313 	    acute: '\u00B4',
       
  6314 	    micro: '\u00B5',
       
  6315 	    para: '\u00B6',
       
  6316 	    middot: '\u00B7',
       
  6317 	    cedil: '\u00B8',
       
  6318 	    sup1: '\u00B9',
       
  6319 	    ordm: '\u00BA',
       
  6320 	    raquo: '\u00BB',
       
  6321 	    frac14: '\u00BC',
       
  6322 	    frac12: '\u00BD',
       
  6323 	    frac34: '\u00BE',
       
  6324 	    iquest: '\u00BF',
       
  6325 	    Agrave: '\u00C0',
       
  6326 	    Aacute: '\u00C1',
       
  6327 	    Acirc: '\u00C2',
       
  6328 	    Atilde: '\u00C3',
       
  6329 	    Auml: '\u00C4',
       
  6330 	    Aring: '\u00C5',
       
  6331 	    AElig: '\u00C6',
       
  6332 	    Ccedil: '\u00C7',
       
  6333 	    Egrave: '\u00C8',
       
  6334 	    Eacute: '\u00C9',
       
  6335 	    Ecirc: '\u00CA',
       
  6336 	    Euml: '\u00CB',
       
  6337 	    Igrave: '\u00CC',
       
  6338 	    Iacute: '\u00CD',
       
  6339 	    Icirc: '\u00CE',
       
  6340 	    Iuml: '\u00CF',
       
  6341 	    ETH: '\u00D0',
       
  6342 	    Ntilde: '\u00D1',
       
  6343 	    Ograve: '\u00D2',
       
  6344 	    Oacute: '\u00D3',
       
  6345 	    Ocirc: '\u00D4',
       
  6346 	    Otilde: '\u00D5',
       
  6347 	    Ouml: '\u00D6',
       
  6348 	    times: '\u00D7',
       
  6349 	    Oslash: '\u00D8',
       
  6350 	    Ugrave: '\u00D9',
       
  6351 	    Uacute: '\u00DA',
       
  6352 	    Ucirc: '\u00DB',
       
  6353 	    Uuml: '\u00DC',
       
  6354 	    Yacute: '\u00DD',
       
  6355 	    THORN: '\u00DE',
       
  6356 	    szlig: '\u00DF',
       
  6357 	    agrave: '\u00E0',
       
  6358 	    aacute: '\u00E1',
       
  6359 	    acirc: '\u00E2',
       
  6360 	    atilde: '\u00E3',
       
  6361 	    auml: '\u00E4',
       
  6362 	    aring: '\u00E5',
       
  6363 	    aelig: '\u00E6',
       
  6364 	    ccedil: '\u00E7',
       
  6365 	    egrave: '\u00E8',
       
  6366 	    eacute: '\u00E9',
       
  6367 	    ecirc: '\u00EA',
       
  6368 	    euml: '\u00EB',
       
  6369 	    igrave: '\u00EC',
       
  6370 	    iacute: '\u00ED',
       
  6371 	    icirc: '\u00EE',
       
  6372 	    iuml: '\u00EF',
       
  6373 	    eth: '\u00F0',
       
  6374 	    ntilde: '\u00F1',
       
  6375 	    ograve: '\u00F2',
       
  6376 	    oacute: '\u00F3',
       
  6377 	    ocirc: '\u00F4',
       
  6378 	    otilde: '\u00F5',
       
  6379 	    ouml: '\u00F6',
       
  6380 	    divide: '\u00F7',
       
  6381 	    oslash: '\u00F8',
       
  6382 	    ugrave: '\u00F9',
       
  6383 	    uacute: '\u00FA',
       
  6384 	    ucirc: '\u00FB',
       
  6385 	    uuml: '\u00FC',
       
  6386 	    yacute: '\u00FD',
       
  6387 	    thorn: '\u00FE',
       
  6388 	    yuml: '\u00FF',
       
  6389 	    OElig: '\u0152',
       
  6390 	    oelig: '\u0153',
       
  6391 	    Scaron: '\u0160',
       
  6392 	    scaron: '\u0161',
       
  6393 	    Yuml: '\u0178',
       
  6394 	    fnof: '\u0192',
       
  6395 	    circ: '\u02C6',
       
  6396 	    tilde: '\u02DC',
       
  6397 	    Alpha: '\u0391',
       
  6398 	    Beta: '\u0392',
       
  6399 	    Gamma: '\u0393',
       
  6400 	    Delta: '\u0394',
       
  6401 	    Epsilon: '\u0395',
       
  6402 	    Zeta: '\u0396',
       
  6403 	    Eta: '\u0397',
       
  6404 	    Theta: '\u0398',
       
  6405 	    Iota: '\u0399',
       
  6406 	    Kappa: '\u039A',
       
  6407 	    Lambda: '\u039B',
       
  6408 	    Mu: '\u039C',
       
  6409 	    Nu: '\u039D',
       
  6410 	    Xi: '\u039E',
       
  6411 	    Omicron: '\u039F',
       
  6412 	    Pi: '\u03A0',
       
  6413 	    Rho: '\u03A1',
       
  6414 	    Sigma: '\u03A3',
       
  6415 	    Tau: '\u03A4',
       
  6416 	    Upsilon: '\u03A5',
       
  6417 	    Phi: '\u03A6',
       
  6418 	    Chi: '\u03A7',
       
  6419 	    Psi: '\u03A8',
       
  6420 	    Omega: '\u03A9',
       
  6421 	    alpha: '\u03B1',
       
  6422 	    beta: '\u03B2',
       
  6423 	    gamma: '\u03B3',
       
  6424 	    delta: '\u03B4',
       
  6425 	    epsilon: '\u03B5',
       
  6426 	    zeta: '\u03B6',
       
  6427 	    eta: '\u03B7',
       
  6428 	    theta: '\u03B8',
       
  6429 	    iota: '\u03B9',
       
  6430 	    kappa: '\u03BA',
       
  6431 	    lambda: '\u03BB',
       
  6432 	    mu: '\u03BC',
       
  6433 	    nu: '\u03BD',
       
  6434 	    xi: '\u03BE',
       
  6435 	    omicron: '\u03BF',
       
  6436 	    pi: '\u03C0',
       
  6437 	    rho: '\u03C1',
       
  6438 	    sigmaf: '\u03C2',
       
  6439 	    sigma: '\u03C3',
       
  6440 	    tau: '\u03C4',
       
  6441 	    upsilon: '\u03C5',
       
  6442 	    phi: '\u03C6',
       
  6443 	    chi: '\u03C7',
       
  6444 	    psi: '\u03C8',
       
  6445 	    omega: '\u03C9',
       
  6446 	    thetasym: '\u03D1',
       
  6447 	    upsih: '\u03D2',
       
  6448 	    piv: '\u03D6',
       
  6449 	    ensp: '\u2002',
       
  6450 	    emsp: '\u2003',
       
  6451 	    thinsp: '\u2009',
       
  6452 	    zwnj: '\u200C',
       
  6453 	    zwj: '\u200D',
       
  6454 	    lrm: '\u200E',
       
  6455 	    rlm: '\u200F',
       
  6456 	    ndash: '\u2013',
       
  6457 	    mdash: '\u2014',
       
  6458 	    lsquo: '\u2018',
       
  6459 	    rsquo: '\u2019',
       
  6460 	    sbquo: '\u201A',
       
  6461 	    ldquo: '\u201C',
       
  6462 	    rdquo: '\u201D',
       
  6463 	    bdquo: '\u201E',
       
  6464 	    dagger: '\u2020',
       
  6465 	    Dagger: '\u2021',
       
  6466 	    bull: '\u2022',
       
  6467 	    hellip: '\u2026',
       
  6468 	    permil: '\u2030',
       
  6469 	    prime: '\u2032',
       
  6470 	    Prime: '\u2033',
       
  6471 	    lsaquo: '\u2039',
       
  6472 	    rsaquo: '\u203A',
       
  6473 	    oline: '\u203E',
       
  6474 	    frasl: '\u2044',
       
  6475 	    euro: '\u20AC',
       
  6476 	    image: '\u2111',
       
  6477 	    weierp: '\u2118',
       
  6478 	    real: '\u211C',
       
  6479 	    trade: '\u2122',
       
  6480 	    alefsym: '\u2135',
       
  6481 	    larr: '\u2190',
       
  6482 	    uarr: '\u2191',
       
  6483 	    rarr: '\u2192',
       
  6484 	    darr: '\u2193',
       
  6485 	    harr: '\u2194',
       
  6486 	    crarr: '\u21B5',
       
  6487 	    lArr: '\u21D0',
       
  6488 	    uArr: '\u21D1',
       
  6489 	    rArr: '\u21D2',
       
  6490 	    dArr: '\u21D3',
       
  6491 	    hArr: '\u21D4',
       
  6492 	    forall: '\u2200',
       
  6493 	    part: '\u2202',
       
  6494 	    exist: '\u2203',
       
  6495 	    empty: '\u2205',
       
  6496 	    nabla: '\u2207',
       
  6497 	    isin: '\u2208',
       
  6498 	    notin: '\u2209',
       
  6499 	    ni: '\u220B',
       
  6500 	    prod: '\u220F',
       
  6501 	    sum: '\u2211',
       
  6502 	    minus: '\u2212',
       
  6503 	    lowast: '\u2217',
       
  6504 	    radic: '\u221A',
       
  6505 	    prop: '\u221D',
       
  6506 	    infin: '\u221E',
       
  6507 	    ang: '\u2220',
       
  6508 	    and: '\u2227',
       
  6509 	    or: '\u2228',
       
  6510 	    cap: '\u2229',
       
  6511 	    cup: '\u222A',
       
  6512 	    int: '\u222B',
       
  6513 	    there4: '\u2234',
       
  6514 	    sim: '\u223C',
       
  6515 	    cong: '\u2245',
       
  6516 	    asymp: '\u2248',
       
  6517 	    ne: '\u2260',
       
  6518 	    equiv: '\u2261',
       
  6519 	    le: '\u2264',
       
  6520 	    ge: '\u2265',
       
  6521 	    sub: '\u2282',
       
  6522 	    sup: '\u2283',
       
  6523 	    nsub: '\u2284',
       
  6524 	    sube: '\u2286',
       
  6525 	    supe: '\u2287',
       
  6526 	    oplus: '\u2295',
       
  6527 	    otimes: '\u2297',
       
  6528 	    perp: '\u22A5',
       
  6529 	    sdot: '\u22C5',
       
  6530 	    lceil: '\u2308',
       
  6531 	    rceil: '\u2309',
       
  6532 	    lfloor: '\u230A',
       
  6533 	    rfloor: '\u230B',
       
  6534 	    loz: '\u25CA',
       
  6535 	    spades: '\u2660',
       
  6536 	    clubs: '\u2663',
       
  6537 	    hearts: '\u2665',
       
  6538 	    diams: '\u2666',
       
  6539 	    lang: '\u27E8',
       
  6540 	    rang: '\u27E9'
       
  6541 	};
       
  6542 
       
  6543 
       
  6544 /***/ },
       
  6545 /* 15 */
       
  6546 /***/ function(module, exports, __webpack_require__) {
       
  6547 
       
  6548 	"use strict";
       
  6549 	Object.defineProperty(exports, "__esModule", { value: true });
       
  6550 	var error_handler_1 = __webpack_require__(10);
       
  6551 	var scanner_1 = __webpack_require__(12);
       
  6552 	var token_1 = __webpack_require__(13);
       
  6553 	var Reader = (function () {
       
  6554 	    function Reader() {
       
  6555 	        this.values = [];
       
  6556 	        this.curly = this.paren = -1;
       
  6557 	    }
       
  6558 	    // A function following one of those tokens is an expression.
       
  6559 	    Reader.prototype.beforeFunctionExpression = function (t) {
       
  6560 	        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
       
  6561 	            'return', 'case', 'delete', 'throw', 'void',
       
  6562 	            // assignment operators
       
  6563 	            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',
       
  6564 	            '&=', '|=', '^=', ',',
       
  6565 	            // binary/unary operators
       
  6566 	            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
       
  6567 	            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
       
  6568 	            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;
       
  6569 	    };
       
  6570 	    // Determine if forward slash (/) is an operator or part of a regular expression
       
  6571 	    // https://github.com/mozilla/sweet.js/wiki/design
       
  6572 	    Reader.prototype.isRegexStart = function () {
       
  6573 	        var previous = this.values[this.values.length - 1];
       
  6574 	        var regex = (previous !== null);
       
  6575 	        switch (previous) {
       
  6576 	            case 'this':
       
  6577 	            case ']':
       
  6578 	                regex = false;
       
  6579 	                break;
       
  6580 	            case ')':
       
  6581 	                var keyword = this.values[this.paren - 1];
       
  6582 	                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');
       
  6583 	                break;
       
  6584 	            case '}':
       
  6585 	                // Dividing a function by anything makes little sense,
       
  6586 	                // but we have to check for that.
       
  6587 	                regex = false;
       
  6588 	                if (this.values[this.curly - 3] === 'function') {
       
  6589 	                    // Anonymous function, e.g. function(){} /42
       
  6590 	                    var check = this.values[this.curly - 4];
       
  6591 	                    regex = check ? !this.beforeFunctionExpression(check) : false;
       
  6592 	                }
       
  6593 	                else if (this.values[this.curly - 4] === 'function') {
       
  6594 	                    // Named function, e.g. function f(){} /42/
       
  6595 	                    var check = this.values[this.curly - 5];
       
  6596 	                    regex = check ? !this.beforeFunctionExpression(check) : true;
       
  6597 	                }
       
  6598 	                break;
       
  6599 	            default:
       
  6600 	                break;
       
  6601 	        }
       
  6602 	        return regex;
       
  6603 	    };
       
  6604 	    Reader.prototype.push = function (token) {
       
  6605 	        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {
       
  6606 	            if (token.value === '{') {
       
  6607 	                this.curly = this.values.length;
       
  6608 	            }
       
  6609 	            else if (token.value === '(') {
       
  6610 	                this.paren = this.values.length;
       
  6611 	            }
       
  6612 	            this.values.push(token.value);
       
  6613 	        }
       
  6614 	        else {
       
  6615 	            this.values.push(null);
       
  6616 	        }
       
  6617 	    };
       
  6618 	    return Reader;
       
  6619 	}());
       
  6620 	var Tokenizer = (function () {
       
  6621 	    function Tokenizer(code, config) {
       
  6622 	        this.errorHandler = new error_handler_1.ErrorHandler();
       
  6623 	        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;
       
  6624 	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
       
  6625 	        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;
       
  6626 	        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;
       
  6627 	        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;
       
  6628 	        this.buffer = [];
       
  6629 	        this.reader = new Reader();
       
  6630 	    }
       
  6631 	    Tokenizer.prototype.errors = function () {
       
  6632 	        return this.errorHandler.errors;
       
  6633 	    };
       
  6634 	    Tokenizer.prototype.getNextToken = function () {
       
  6635 	        if (this.buffer.length === 0) {
       
  6636 	            var comments = this.scanner.scanComments();
       
  6637 	            if (this.scanner.trackComment) {
       
  6638 	                for (var i = 0; i < comments.length; ++i) {
       
  6639 	                    var e = comments[i];
       
  6640 	                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);
       
  6641 	                    var comment = {
       
  6642 	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
       
  6643 	                        value: value
       
  6644 	                    };
       
  6645 	                    if (this.trackRange) {
       
  6646 	                        comment.range = e.range;
       
  6647 	                    }
       
  6648 	                    if (this.trackLoc) {
       
  6649 	                        comment.loc = e.loc;
       
  6650 	                    }
       
  6651 	                    this.buffer.push(comment);
       
  6652 	                }
       
  6653 	            }
       
  6654 	            if (!this.scanner.eof()) {
       
  6655 	                var loc = void 0;
       
  6656 	                if (this.trackLoc) {
       
  6657 	                    loc = {
       
  6658 	                        start: {
       
  6659 	                            line: this.scanner.lineNumber,
       
  6660 	                            column: this.scanner.index - this.scanner.lineStart
       
  6661 	                        },
       
  6662 	                        end: {}
       
  6663 	                    };
       
  6664 	                }
       
  6665 	                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();
       
  6666 	                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();
       
  6667 	                this.reader.push(token);
       
  6668 	                var entry = {
       
  6669 	                    type: token_1.TokenName[token.type],
       
  6670 	                    value: this.scanner.source.slice(token.start, token.end)
       
  6671 	                };
       
  6672 	                if (this.trackRange) {
       
  6673 	                    entry.range = [token.start, token.end];
       
  6674 	                }
       
  6675 	                if (this.trackLoc) {
       
  6676 	                    loc.end = {
       
  6677 	                        line: this.scanner.lineNumber,
       
  6678 	                        column: this.scanner.index - this.scanner.lineStart
       
  6679 	                    };
       
  6680 	                    entry.loc = loc;
       
  6681 	                }
       
  6682 	                if (token.type === 9 /* RegularExpression */) {
       
  6683 	                    var pattern = token.pattern;
       
  6684 	                    var flags = token.flags;
       
  6685 	                    entry.regex = { pattern: pattern, flags: flags };
       
  6686 	                }
       
  6687 	                this.buffer.push(entry);
       
  6688 	            }
       
  6689 	        }
       
  6690 	        return this.buffer.shift();
       
  6691 	    };
       
  6692 	    return Tokenizer;
       
  6693 	}());
       
  6694 	exports.Tokenizer = Tokenizer;
       
  6695 
       
  6696 
       
  6697 /***/ }
       
  6698 /******/ ])
       
  6699 });
       
  6700 ;
       
  6701 
       
  6702 // JSHINT has some GPL Compatability issues, so we are faking it out and using esprima for validation
       
  6703 // Based on https://github.com/jquery/esprima/blob/gh-pages/demo/validate.js which is MIT licensed
       
  6704 
       
  6705 var fakeJSHINT = new function() {
       
  6706 	var syntax, errors;
       
  6707 	var that = this;
       
  6708 	this.data = [];
       
  6709 	this.convertError = function( error ){
       
  6710 		return {
       
  6711 			line: error.lineNumber,
       
  6712 			character: error.column,
       
  6713 			reason: error.description,
       
  6714 			code: 'E'
       
  6715 		};
       
  6716 	};
       
  6717 	this.parse = function( code ){
       
  6718 		try {
       
  6719 			syntax = window.esprima.parse(code, { tolerant: true, loc: true });
       
  6720 			errors = syntax.errors;
       
  6721 			if ( errors.length > 0 ) {
       
  6722 				for ( var i = 0; i < errors.length; i++) {
       
  6723 					var error = errors[i];
       
  6724 					that.data.push( that.convertError( error ) );
       
  6725 				}
       
  6726 			} else {
       
  6727 				that.data = [];
       
  6728 			}
       
  6729 		} catch (e) {
       
  6730 			that.data.push( that.convertError( e ) );
       
  6731 		}
       
  6732 	};
       
  6733 };
       
  6734 
       
  6735 window.JSHINT = function( text ){
       
  6736 	fakeJSHINT.parse( text );
       
  6737 };
       
  6738 window.JSHINT.data = function(){
       
  6739 	return {
       
  6740 		errors: fakeJSHINT.data
       
  6741 	};
       
  6742 };
       
  6743 
       
  6744