github.com/igggame/nebulas-go@v2.1.0+incompatible/nf/nvm/v8/lib/1.0.0/esprima.js (about)

     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  ;