[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/codemirror/ -> esprima.js (source)

   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  ;


Generated: Thu Nov 21 01:00:03 2024 Cross-referenced by PHPXref 0.7.1