UNPKG

test-scribe

Version:

Your sidekick for analog machine development. Run machines interactively and generate automated test scripts based on the outcome.

5,604 lines 225 kB
"no use strict";
(function(e) {
  if (typeof e.window != "undefined" && e.document) return;
  e.console = function() {
    var e = Array.prototype.slice.call(arguments, 0);
    postMessage({
      type: "log",
      data: e
    })
  }, e.console.error = e.console.warn = e.console.log = e.console.trace = e.console, e.window = e, e.ace = e, e.onerror = function(e, t, n, r, i) {
    postMessage({
      type: "error",
      data: {
        message: e,
        file: t,
        line: n,
        col: r,
        stack: i.stack
      }
    })
  }, e.normalizeModule = function(t, n) {
    if (n.indexOf("!") !== -1) {
      var r = n.split("!");
      return e.normalizeModule(t, r[0]) + "!" + e.normalizeModule(t, r[1])
    }
    if (n.charAt(0) == ".") {
      var i = t.split("/").slice(0, -1).join("/");
      n = (i ? i + "/" : "") + n;
      while (n.indexOf(".") !== -1 && s != n) {
        var s = n;
        n = n.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "")
      }
    }
    return n
  }, e.require = function(t, n) {
    n || (n = t, t = null);
    if (!n.charAt) throw new Error("worker.js require() accepts only (parentId, id) as arguments");
    n = e.normalizeModule(t, n);
    var r = e.require.modules[n];
    if (r) return r.initialized || (r.initialized = !0, r.exports = r.factory().exports), r.exports;
    var i = n.split("/");
    if (!e.require.tlns) return console.log("unable to load " + n);
    i[0] = e.require.tlns[i[0]] || i[0];
    var s = i.join("/") + ".js";
    return e.require.id = n, importScripts(s), e.require(t, n)
  }, e.require.modules = {}, e.require.tlns = {}, e.define = function(t, n, r) {
    arguments.length == 2 ? (r = n, typeof t != "string" && (n = t, t = e.require.id)) : arguments.length == 1 && (r = t, n = [], t = e.require.id);
    if (typeof r != "function") {
      e.require.modules[t] = {
        exports: r,
        initialized: !0
      };
      return
    }
    n.length || (n = ["require", "exports", "module"]);
    var i = function(n) {
      return e.require(t, n)
    };
    e.require.modules[t] = {
      exports: {},
      factory: function() {
        var e = this,
          t = r.apply(this, n.map(function(t) {
            switch (t) {
              case "require":
                return i;
              case "exports":
                return e.exports;
              case "module":
                return e;
              default:
                return i(t)
            }
          }));
        return t && (e.exports = t), e
      }
    }
  }, e.define.amd = {}, e.initBaseUrls = function(t) {
    require.tlns = t
  }, e.initSender = function() {
    var n = e.require("ace/lib/event_emitter").EventEmitter,
      r = e.require("ace/lib/oop"),
      i = function() {};
    return function() {
      r.implement(this, n), this.callback = function(e, t) {
        postMessage({
          type: "call",
          id: t,
          data: e
        })
      }, this.emit = function(e, t) {
        postMessage({
          type: "event",
          name: e,
          data: t
        })
      }
    }.call(i.prototype), new i
  };
  var t = e.main = null,
    n = e.sender = null;
  e.onmessage = function(r) {
    var i = r.data;
    if (i.command) {
      if (!t[i.command]) throw new Error("Unknown command:" + i.command);
      t[i.command].apply(t, i.args)
    } else if (i.init) {
      initBaseUrls(i.tlns), require("ace/lib/es5-shim"), n = e.sender = initSender();
      var s = require(i.module)[i.classname];
      t = e.main = new s(n)
    } else i.event && n && n._signal(i.event, i.data)
  }
})(this), ace.define("ace/lib/oop", ["require", "exports", "module"], function(e, t, n) {
  "use strict";
  t.inherits = function(e, t) {
    e.super_ = t, e.prototype = Object.create(t.prototype, {
      constructor: {
        value: e,
        enumerable: !1,
        writable: !0,
        configurable: !0
      }
    })
  }, t.mixin = function(e, t) {
    for (var n in t) e[n] = t[n];
    return e
  }, t.implement = function(e, n) {
    t.mixin(e, n)
  }
}), ace.define("ace/lib/event_emitter", ["require", "exports", "module"], function(e, t, n) {
  "use strict";
  var r = {},
    i = function() {
      this.propagationStopped = !0
    },
    s = function() {
      this.defaultPrevented = !0
    };
  r._emit = r._dispatchEvent = function(e, t) {
    this._eventRegistry || (this._eventRegistry = {}), this._defaultHandlers || (this._defaultHandlers = {});
    var n = this._eventRegistry[e] || [],
      r = this._defaultHandlers[e];
    if (!n.length && !r) return;
    if (typeof t != "object" || !t) t = {};
    t.type || (t.type = e), t.stopPropagation || (t.stopPropagation = i), t.preventDefault || (t.preventDefault = s), n = n.slice();
    for (var o = 0; o < n.length; o++) {
      n[o](t, this);
      if (t.propagationStopped) break
    }
    if (r && !t.defaultPrevented) return r(t, this)
  }, r._signal = function(e, t) {
    var n = (this._eventRegistry || {})[e];
    if (!n) return;
    n = n.slice();
    for (var r = 0; r < n.length; r++) n[r](t, this)
  }, r.once = function(e, t) {
    var n = this;
    t && this.addEventListener(e, function r() {
      n.removeEventListener(e, r), t.apply(null, arguments)
    })
  }, r.setDefaultHandler = function(e, t) {
    var n = this._defaultHandlers;
    n || (n = this._defaultHandlers = {
      _disabled_: {}
    });
    if (n[e]) {
      var r = n[e],
        i = n._disabled_[e];
      i || (n._disabled_[e] = i = []), i.push(r);
      var s = i.indexOf(t);
      s != -1 && i.splice(s, 1)
    }
    n[e] = t
  }, r.removeDefaultHandler = function(e, t) {
    var n = this._defaultHandlers;
    if (!n) return;
    var r = n._disabled_[e];
    if (n[e] == t) {
      var i = n[e];
      r && this.setDefaultHandler(e, r.pop())
    } else if (r) {
      var s = r.indexOf(t);
      s != -1 && r.splice(s, 1)
    }
  }, r.on = r.addEventListener = function(e, t, n) {
    this._eventRegistry = this._eventRegistry || {};
    var r = this._eventRegistry[e];
    return r || (r = this._eventRegistry[e] = []), r.indexOf(t) == -1 && r[n ? "unshift" : "push"](t), t
  }, r.off = r.removeListener = r.removeEventListener = function(e, t) {
    this._eventRegistry = this._eventRegistry || {};
    var n = this._eventRegistry[e];
    if (!n) return;
    var r = n.indexOf(t);
    r !== -1 && n.splice(r, 1)
  }, r.removeAllListeners = function(e) {
    this._eventRegistry && (this._eventRegistry[e] = [])
  }, t.EventEmitter = r
}), ace.define("ace/range", ["require", "exports", "module"], function(e, t, n) {
  "use strict";
  var r = function(e, t) {
      return e.row - t.row || e.column - t.column
    },
    i = function(e, t, n, r) {
      this.start = {
        row: e,
        column: t
      }, this.end = {
        row: n,
        column: r
      }
    };
  (function() {
    this.isEqual = function(e) {
      return this.start.row === e.start.row && this.end.row === e.end.row && this.start.column === e.start.column && this.end.column === e.end.column
    }, this.toString = function() {
      return "Range: [" + this.start.row + "/" + this.start.column + "] -> [" + this.end.row + "/" + this.end.column + "]"
    }, this.contains = function(e, t) {
      return this.compare(e, t) == 0
    }, this.compareRange = function(e) {
      var t, n = e.end,
        r = e.start;
      return t = this.compare(n.row, n.column), t == 1 ? (t = this.compare(r.row, r.column), t == 1 ? 2 : t == 0 ? 1 : 0) : t == -1 ? -2 : (t = this.compare(r.row, r.column), t == -1 ? -1 : t == 1 ? 42 : 0)
    }, this.comparePoint = function(e) {
      return this.compare(e.row, e.column)
    }, this.containsRange = function(e) {
      return this.comparePoint(e.start) == 0 && this.comparePoint(e.end) == 0
    }, this.intersects = function(e) {
      var t = this.compareRange(e);
      return t == -1 || t == 0 || t == 1
    }, this.isEnd = function(e, t) {
      return this.end.row == e && this.end.column == t
    }, this.isStart = function(e, t) {
      return this.start.row == e && this.start.column == t
    }, this.setStart = function(e, t) {
      typeof e == "object" ? (this.start.column = e.column, this.start.row = e.row) : (this.start.row = e, this.start.column = t)
    }, this.setEnd = function(e, t) {
      typeof e == "object" ? (this.end.column = e.column, this.end.row = e.row) : (this.end.row = e, this.end.column = t)
    }, this.inside = function(e, t) {
      return this.compare(e, t) == 0 ? this.isEnd(e, t) || this.isStart(e, t) ? !1 : !0 : !1
    }, this.insideStart = function(e, t) {
      return this.compare(e, t) == 0 ? this.isEnd(e, t) ? !1 : !0 : !1
    }, this.insideEnd = function(e, t) {
      return this.compare(e, t) == 0 ? this.isStart(e, t) ? !1 : !0 : !1
    }, this.compare = function(e, t) {
      return !this.isMultiLine() && e === this.start.row ? t < this.start.column ? -1 : t > this.end.column ? 1 : 0 : e < this.start.row ? -1 : e > this.end.row ? 1 : this.start.row === e ? t >= this.start.column ? 0 : -1 : this.end.row === e ? t <= this.end.column ? 0 : 1 : 0
    }, this.compareStart = function(e, t) {
      return this.start.row == e && this.start.column == t ? -1 : this.compare(e, t)
    }, this.compareEnd = function(e, t) {
      return this.end.row == e && this.end.column == t ? 1 : this.compare(e, t)
    }, this.compareInside = function(e, t) {
      return this.end.row == e && this.end.column == t ? 1 : this.start.row == e && this.start.column == t ? -1 : this.compare(e, t)
    }, this.clipRows = function(e, t) {
      if (this.end.row > t) var n = {
        row: t + 1,
        column: 0
      };
      else if (this.end.row < e) var n = {
        row: e,
        column: 0
      };
      if (this.start.row > t) var r = {
        row: t + 1,
        column: 0
      };
      else if (this.start.row < e) var r = {
        row: e,
        column: 0
      };
      return i.fromPoints(r || this.start, n || this.end)
    }, this.extend = function(e, t) {
      var n = this.compare(e, t);
      if (n == 0) return this;
      if (n == -1) var r = {
        row: e,
        column: t
      };
      else var s = {
        row: e,
        column: t
      };
      return i.fromPoints(r || this.start, s || this.end)
    }, this.isEmpty = function() {
      return this.start.row === this.end.row && this.start.column === this.end.column
    }, this.isMultiLine = function() {
      return this.start.row !== this.end.row
    }, this.clone = function() {
      return i.fromPoints(this.start, this.end)
    }, this.collapseRows = function() {
      return this.end.column == 0 ? new i(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0) : new i(this.start.row, 0, this.end.row, 0)
    }, this.toScreenRange = function(e) {
      var t = e.documentToScreenPosition(this.start),
        n = e.documentToScreenPosition(this.end);
      return new i(t.row, t.column, n.row, n.column)
    }, this.moveBy = function(e, t) {
      this.start.row += e, this.start.column += t, this.end.row += e, this.end.column += t
    }
  }).call(i.prototype), i.fromPoints = function(e, t) {
    return new i(e.row, e.column, t.row, t.column)
  }, i.comparePoints = r, i.comparePoints = function(e, t) {
    return e.row - t.row || e.column - t.column
  }, t.Range = i
}), ace.define("ace/anchor", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter"], function(e, t, n) {
  "use strict";
  var r = e("./lib/oop"),
    i = e("./lib/event_emitter").EventEmitter,
    s = t.Anchor = function(e, t, n) {
      this.$onChange = this.onChange.bind(this), this.attach(e), typeof n == "undefined" ? this.setPosition(t.row, t.column) : this.setPosition(t, n)
    };
  (function() {
    r.implement(this, i), this.getPosition = function() {
      return this.$clipPositionToDocument(this.row, this.column)
    }, this.getDocument = function() {
      return this.document
    }, this.$insertRight = !1, this.onChange = function(e) {
      var t = e.data,
        n = t.range;
      if (n.start.row == n.end.row && n.start.row != this.row) return;
      if (n.start.row > this.row) return;
      if (n.start.row == this.row && n.start.column > this.column) return;
      var r = this.row,
        i = this.column,
        s = n.start,
        o = n.end;
      if (t.action === "insertText")
        if (s.row === r && s.column <= i) {
          if (s.column !== i || !this.$insertRight) s.row === o.row ? i += o.column - s.column : (i -= s.column, r += o.row - s.row)
        } else s.row !== o.row && s.row < r && (r += o.row - s.row);
      else t.action === "insertLines" ? (s.row !== r || i !== 0 || !this.$insertRight) && s.row <= r && (r += o.row - s.row) : t.action === "removeText" ? s.row === r && s.column < i ? o.column >= i ? i = s.column : i = Math.max(0, i - (o.column - s.column)) : s.row !== o.row && s.row < r ? (o.row === r && (i = Math.max(0, i - o.column) + s.column), r -= o.row - s.row) : o.row === r && (r -= o.row - s.row, i = Math.max(0, i - o.column) + s.column) : t.action == "removeLines" && s.row <= r && (o.row <= r ? r -= o.row - s.row : (r = s.row, i = 0));
      this.setPosition(r, i, !0)
    }, this.setPosition = function(e, t, n) {
      var r;
      n ? r = {
        row: e,
        column: t
      } : r = this.$clipPositionToDocument(e, t);
      if (this.row == r.row && this.column == r.column) return;
      var i = {
        row: this.row,
        column: this.column
      };
      this.row = r.row, this.column = r.column, this._signal("change", {
        old: i,
        value: r
      })
    }, this.detach = function() {
      this.document.removeEventListener("change", this.$onChange)
    }, this.attach = function(e) {
      this.document = e || this.document, this.document.on("change", this.$onChange)
    }, this.$clipPositionToDocument = function(e, t) {
      var n = {};
      return e >= this.document.getLength() ? (n.row = Math.max(0, this.document.getLength() - 1), n.column = this.document.getLine(n.row).length) : e < 0 ? (n.row = 0, n.column = 0) : (n.row = e, n.column = Math.min(this.document.getLine(n.row).length, Math.max(0, t))), t < 0 && (n.column = 0), n
    }
  }).call(s.prototype)
}), ace.define("ace/document", ["require", "exports", "module", "ace/lib/oop", "ace/lib/event_emitter", "ace/range", "ace/anchor"], function(e, t, n) {
  "use strict";
  var r = e("./lib/oop"),
    i = e("./lib/event_emitter").EventEmitter,
    s = e("./range").Range,
    o = e("./anchor").Anchor,
    u = function(e) {
      this.$lines = [], e.length === 0 ? this.$lines = [""] : Array.isArray(e) ? this._insertLines(0, e) : this.insert({
        row: 0,
        column: 0
      }, e)
    };
  (function() {
    r.implement(this, i), this.setValue = function(e) {
      var t = this.getLength();
      this.remove(new s(0, 0, t, this.getLine(t - 1).length)), this.insert({
        row: 0,
        column: 0
      }, e)
    }, this.getValue = function() {
      return this.getAllLines().join(this.getNewLineCharacter())
    }, this.createAnchor = function(e, t) {
      return new o(this, e, t)
    }, "aaa".split(/a/).length === 0 ? this.$split = function(e) {
      return e.replace(/\r\n|\r/g, "\n").split("\n")
    } : this.$split = function(e) {
      return e.split(/\r\n|\r|\n/)
    }, this.$detectNewLine = function(e) {
      var t = e.match(/^.*?(\r\n|\r|\n)/m);
      this.$autoNewLine = t ? t[1] : "\n", this._signal("changeNewLineMode")
    }, this.getNewLineCharacter = function() {
      switch (this.$newLineMode) {
        case "windows":
          return "\r\n";
        case "unix":
          return "\n";
        default:
          return this.$autoNewLine || "\n"
      }
    }, this.$autoNewLine = "", this.$newLineMode = "auto", this.setNewLineMode = function(e) {
      if (this.$newLineMode === e) return;
      this.$newLineMode = e, this._signal("changeNewLineMode")
    }, this.getNewLineMode = function() {
      return this.$newLineMode
    }, this.isNewLine = function(e) {
      return e == "\r\n" || e == "\r" || e == "\n"
    }, this.getLine = function(e) {
      return this.$lines[e] || ""
    }, this.getLines = function(e, t) {
      return this.$lines.slice(e, t + 1)
    }, this.getAllLines = function() {
      return this.getLines(0, this.getLength())
    }, this.getLength = function() {
      return this.$lines.length
    }, this.getTextRange = function(e) {
      if (e.start.row == e.end.row) return this.getLine(e.start.row).substring(e.start.column, e.end.column);
      var t = this.getLines(e.start.row, e.end.row);
      t[0] = (t[0] || "").substring(e.start.column);
      var n = t.length - 1;
      return e.end.row - e.start.row == n && (t[n] = t[n].substring(0, e.end.column)), t.join(this.getNewLineCharacter())
    }, this.$clipPosition = function(e) {
      var t = this.getLength();
      return e.row >= t ? (e.row = Math.max(0, t - 1), e.column = this.getLine(t - 1).length) : e.row < 0 && (e.row = 0), e
    }, this.insert = function(e, t) {
      if (!t || t.length === 0) return e;
      e = this.$clipPosition(e), this.getLength() <= 1 && this.$detectNewLine(t);
      var n = this.$split(t),
        r = n.splice(0, 1)[0],
        i = n.length == 0 ? null : n.splice(n.length - 1, 1)[0];
      return e = this.insertInLine(e, r), i !== null && (e = this.insertNewLine(e), e = this._insertLines(e.row, n), e = this.insertInLine(e, i || "")), e
    }, this.insertLines = function(e, t) {
      return e >= this.getLength() ? this.insert({
        row: e,
        column: 0
      }, "\n" + t.join("\n")) : this._insertLines(Math.max(e, 0), t)
    }, this._insertLines = function(e, t) {
      if (t.length == 0) return {
        row: e,
        column: 0
      };
      while (t.length > 61440) {
        var n = this._insertLines(e, t.slice(0, 61440));
        t = t.slice(61440), e = n.row
      }
      var r = [e, 0];
      r.push.apply(r, t), this.$lines.splice.apply(this.$lines, r);
      var i = new s(e, 0, e + t.length, 0),
        o = {
          action: "insertLines",
          range: i,
          lines: t
        };
      return this._signal("change", {
        data: o
      }), i.end
    }, this.insertNewLine = function(e) {
      e = this.$clipPosition(e);
      var t = this.$lines[e.row] || "";
      this.$lines[e.row] = t.substring(0, e.column), this.$lines.splice(e.row + 1, 0, t.substring(e.column, t.length));
      var n = {
          row: e.row + 1,
          column: 0
        },
        r = {
          action: "insertText",
          range: s.fromPoints(e, n),
          text: this.getNewLineCharacter()
        };
      return this._signal("change", {
        data: r
      }), n
    }, this.insertInLine = function(e, t) {
      if (t.length == 0) return e;
      var n = this.$lines[e.row] || "";
      this.$lines[e.row] = n.substring(0, e.column) + t + n.substring(e.column);
      var r = {
          row: e.row,
          column: e.column + t.length
        },
        i = {
          action: "insertText",
          range: s.fromPoints(e, r),
          text: t
        };
      return this._signal("change", {
        data: i
      }), r
    }, this.remove = function(e) {
      e instanceof s || (e = s.fromPoints(e.start, e.end)), e.start = this.$clipPosition(e.start), e.end = this.$clipPosition(e.end);
      if (e.isEmpty()) return e.start;
      var t = e.start.row,
        n = e.end.row;
      if (e.isMultiLine()) {
        var r = e.start.column == 0 ? t : t + 1,
          i = n - 1;
        e.end.column > 0 && this.removeInLine(n, 0, e.end.column), i >= r && this._removeLines(r, i), r != t && (this.removeInLine(t, e.start.column, this.getLine(t).length), this.removeNewLine(e.start.row))
      } else this.removeInLine(t, e.start.column, e.end.column);
      return e.start
    }, this.removeInLine = function(e, t, n) {
      if (t == n) return;
      var r = new s(e, t, e, n),
        i = this.getLine(e),
        o = i.substring(t, n),
        u = i.substring(0, t) + i.substring(n, i.length);
      this.$lines.splice(e, 1, u);
      var a = {
        action: "removeText",
        range: r,
        text: o
      };
      return this._signal("change", {
        data: a
      }), r.start
    }, this.removeLines = function(e, t) {
      return e < 0 || t >= this.getLength() ? this.remove(new s(e, 0, t + 1, 0)) : this._removeLines(e, t)
    }, this._removeLines = function(e, t) {
      var n = new s(e, 0, t + 1, 0),
        r = this.$lines.splice(e, t - e + 1),
        i = {
          action: "removeLines",
          range: n,
          nl: this.getNewLineCharacter(),
          lines: r
        };
      return this._signal("change", {
        data: i
      }), r
    }, this.removeNewLine = function(e) {
      var t = this.getLine(e),
        n = this.getLine(e + 1),
        r = new s(e, t.length, e + 1, 0),
        i = t + n;
      this.$lines.splice(e, 2, i);
      var o = {
        action: "removeText",
        range: r,
        text: this.getNewLineCharacter()
      };
      this._signal("change", {
        data: o
      })
    }, this.replace = function(e, t) {
      e instanceof s || (e = s.fromPoints(e.start, e.end));
      if (t.length == 0 && e.isEmpty()) return e.start;
      if (t == this.getTextRange(e)) return e.end;
      this.remove(e);
      if (t) var n = this.insert(e.start, t);
      else n = e.start;
      return n
    }, this.applyDeltas = function(e) {
      for (var t = 0; t < e.length; t++) {
        var n = e[t],
          r = s.fromPoints(n.range.start, n.range.end);
        n.action == "insertLines" ? this.insertLines(r.start.row, n.lines) : n.action == "insertText" ? this.insert(r.start, n.text) : n.action == "removeLines" ? this._removeLines(r.start.row, r.end.row - 1) : n.action == "removeText" && this.remove(r)
      }
    }, this.revertDeltas = function(e) {
      for (var t = e.length - 1; t >= 0; t--) {
        var n = e[t],
          r = s.fromPoints(n.range.start, n.range.end);
        n.action == "insertLines" ? this._removeLines(r.start.row, r.end.row - 1) : n.action == "insertText" ? this.remove(r) : n.action == "removeLines" ? this._insertLines(r.start.row, n.lines) : n.action == "removeText" && this.insert(r.start, n.text)
      }
    }, this.indexToPosition = function(e, t) {
      var n = this.$lines || this.getAllLines(),
        r = this.getNewLineCharacter().length;
      for (var i = t || 0, s = n.length; i < s; i++) {
        e -= n[i].length + r;
        if (e < 0) return {
          row: i,
          column: e + n[i].length + r
        }
      }
      return {
        row: s - 1,
        column: n[s - 1].length
      }
    }, this.positionToIndex = function(e, t) {
      var n = this.$lines || this.getAllLines(),
        r = this.getNewLineCharacter().length,
        i = 0,
        s = Math.min(e.row, n.length);
      for (var o = t || 0; o < s; ++o) i += n[o].length + r;
      return i + e.column
    }
  }).call(u.prototype), t.Document = u
}), ace.define("ace/lib/lang", ["require", "exports", "module"], function(e, t, n) {
  "use strict";
  t.last = function(e) {
    return e[e.length - 1]
  }, t.stringReverse = function(e) {
    return e.split("").reverse().join("")
  }, t.stringRepeat = function(e, t) {
    var n = "";
    while (t > 0) {
      t & 1 && (n += e);
      if (t >>= 1) e += e
    }
    return n
  };
  var r = /^\s\s*/,
    i = /\s\s*$/;
  t.stringTrimLeft = function(e) {
    return e.replace(r, "")
  }, t.stringTrimRight = function(e) {
    return e.replace(i, "")
  }, t.copyObject = function(e) {
    var t = {};
    for (var n in e) t[n] = e[n];
    return t
  }, t.copyArray = function(e) {
    var t = [];
    for (var n = 0, r = e.length; n < r; n++) e[n] && typeof e[n] == "object" ? t[n] = this.copyObject(e[n]) : t[n] = e[n];
    return t
  }, t.deepCopy = function(e) {
    if (typeof e != "object" || !e) return e;
    var n = e.constructor;
    if (n === RegExp) return e;
    var r = n();
    for (var i in e) typeof e[i] == "object" ? r[i] = t.deepCopy(e[i]) : r[i] = e[i];
    return r
  }, t.arrayToMap = function(e) {
    var t = {};
    for (var n = 0; n < e.length; n++) t[e[n]] = 1;
    return t
  }, t.createMap = function(e) {
    var t = Object.create(null);
    for (var n in e) t[n] = e[n];
    return t
  }, t.arrayRemove = function(e, t) {
    for (var n = 0; n <= e.length; n++) t === e[n] && e.splice(n, 1)
  }, t.escapeRegExp = function(e) {
    return e.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1")
  }, t.escapeHTML = function(e) {
    return e.replace(/&/g, "&#38;").replace(/"/g, "&#34;").replace(/'/g, "&#39;").replace(/</g, "&#60;")
  }, t.getMatchOffsets = function(e, t) {
    var n = [];
    return e.replace(t, function(e) {
      n.push({
        offset: arguments[arguments.length - 2],
        length: e.length
      })
    }), n
  }, t.deferredCall = function(e) {
    var t = null,
      n = function() {
        t = null, e()
      },
      r = function(e) {
        return r.cancel(), t = setTimeout(n, e || 0), r
      };
    return r.schedule = r, r.call = function() {
      return this.cancel(), e(), r
    }, r.cancel = function() {
      return clearTimeout(t), t = null, r
    }, r.isPending = function() {
      return t
    }, r
  }, t.delayedCall = function(e, t) {
    var n = null,
      r = function() {
        n = null, e()
      },
      i = function(e) {
        n == null && (n = setTimeout(r, e || t))
      };
    return i.delay = function(e) {
      n && clearTimeout(n), n = setTimeout(r, e || t)
    }, i.schedule = i, i.call = function() {
      this.cancel(), e()
    }, i.cancel = function() {
      n && clearTimeout(n), n = null
    }, i.isPending = function() {
      return n
    }, i
  }
}), ace.define("ace/worker/mirror", ["require", "exports", "module", "ace/document", "ace/lib/lang"], function(e, t, n) {
  "use strict";
  var r = e("../document").Document,
    i = e("../lib/lang"),
    s = t.Mirror = function(e) {
      this.sender = e;
      var t = this.doc = new r(""),
        n = this.deferredUpdate = i.delayedCall(this.onUpdate.bind(this)),
        s = this;
      e.on("change", function(e) {
        t.applyDeltas(e.data);
        if (s.$timeout) return n.schedule(s.$timeout);
        s.onUpdate()
      })
    };
  (function() {
    this.$timeout = 500, this.setTimeout = function(e) {
      this.$timeout = e
    }, this.setValue = function(e) {
      this.doc.setValue(e), this.deferredUpdate.schedule(this.$timeout)
    }, this.getValue = function(e) {
      this.sender.callback(this.doc.getValue(), e)
    }, this.onUpdate = function() {}, this.isPending = function() {
      return this.deferredUpdate.isPending()
    }
  }).call(s.prototype)
}), ace.define("ace/mode/javascript/jshint", ["require", "exports", "module"], function(e, t, n) {
  n.exports = function r(t, n, i) {
    function s(u, a) {
      if (!n[u]) {
        if (!t[u]) {
          var f = typeof e == "function" && e;
          if (!a && f) return f(u, !0);
          if (o) return o(u, !0);
          throw new Error("Cannot find module '" + u + "'")
        }
        var l = n[u] = {
          exports: {}
        };
        t[u][0].call(l.exports, function(e) {
          var n = t[u][1][e];
          return s(n ? n : e)
        }, l, l.exports, r, t, n, i)
      }
      return n[u].exports
    }
    var o = typeof e == "function" && e;
    for (var u = 0; u < i.length; u++) s(i[u]);
    return s
  }({
    1: [function(e, t, n) {
      var r = [];
      for (var i = 0; i < 128; i++) r[i] = i === 36 || i >= 65 && i <= 90 || i === 95 || i >= 97 && i <= 122;
      var s = [];
      for (var i = 0; i < 128; i++) s[i] = r[i] || i >= 48 && i <= 57;
      t.exports = {
        asciiIdentifierStartTable: r,
        asciiIdentifierPartTable: s
      }
    }, {}],
    2: [function(e, t, n) {
      (function() {
        var e = this,
          r = e._,
          i = {},
          s = Array.prototype,
          o = Object.prototype,
          u = Function.prototype,
          a = s.push,
          f = s.slice,
          l = s.concat,
          c = o.toString,
          h = o.hasOwnProperty,
          p = s.forEach,
          d = s.map,
          v = s.reduce,
          m = s.reduceRight,
          g = s.filter,
          y = s.every,
          b = s.some,
          w = s.indexOf,
          E = s.lastIndexOf,
          S = Array.isArray,
          x = Object.keys,
          T = u.bind,
          N = function(e) {
            if (e instanceof N) return e;
            if (!(this instanceof N)) return new N(e);
            this._wrapped = e
          };
        typeof n != "undefined" ? (typeof t != "undefined" && t.exports && (n = t.exports = N), n._ = N) : e._ = N, N.VERSION = "1.6.0";
        var C = N.each = N.forEach = function(e, t, n) {
          if (e == null) return e;
          if (p && e.forEach === p) e.forEach(t, n);
          else if (e.length === +e.length) {
            for (var r = 0, s = e.length; r < s; r++)
              if (t.call(n, e[r], r, e) === i) return
          } else {
            var o = N.keys(e);
            for (var r = 0, s = o.length; r < s; r++)
              if (t.call(n, e[o[r]], o[r], e) === i) return
          }
          return e
        };
        N.map = N.collect = function(e, t, n) {
          var r = [];
          return e == null ? r : d && e.map === d ? e.map(t, n) : (C(e, function(e, i, s) {
            r.push(t.call(n, e, i, s))
          }), r)
        };
        var k = "Reduce of empty array with no initial value";
        N.reduce = N.foldl = N.inject = function(e, t, n, r) {
          var i = arguments.length > 2;
          e == null && (e = []);
          if (v && e.reduce === v) return r && (t = N.bind(t, r)), i ? e.reduce(t, n) : e.reduce(t);
          C(e, function(e, s, o) {
            i ? n = t.call(r, n, e, s, o) : (n = e, i = !0)
          });
          if (!i) throw new TypeError(k);
          return n
        }, N.reduceRight = N.foldr = function(e, t, n, r) {
          var i = arguments.length > 2;
          e == null && (e = []);
          if (m && e.reduceRight === m) return r && (t = N.bind(t, r)), i ? e.reduceRight(t, n) : e.reduceRight(t);
          var s = e.length;
          if (s !== +s) {
            var o = N.keys(e);
            s = o.length
          }
          C(e, function(u, a, f) {
            a = o ? o[--s] : --s, i ? n = t.call(r, n, e[a], a, f) : (n = e[a], i = !0)
          });
          if (!i) throw new TypeError(k);
          return n
        }, N.find = N.detect = function(e, t, n) {
          var r;
          return L(e, function(e, i, s) {
            if (t.call(n, e, i, s)) return r = e, !0
          }), r
        }, N.filter = N.select = function(e, t, n) {
          var r = [];
          return e == null ? r : g && e.filter === g ? e.filter(t, n) : (C(e, function(e, i, s) {
            t.call(n, e, i, s) && r.push(e)
          }), r)
        }, N.reject = function(e, t, n) {
          return N.filter(e, function(e, r, i) {
            return !t.call(n, e, r, i)
          }, n)
        }, N.every = N.all = function(e, t, n) {
          t || (t = N.identity);
          var r = !0;
          return e == null ? r : y && e.every === y ? e.every(t, n) : (C(e, function(e, s, o) {
            if (!(r = r && t.call(n, e, s, o))) return i
          }), !!r)
        };
        var L = N.some = N.any = function(e, t, n) {
          t || (t = N.identity);
          var r = !1;
          return e == null ? r : b && e.some === b ? e.some(t, n) : (C(e, function(e, s, o) {
            if (r || (r = t.call(n, e, s, o))) return i
          }), !!r)
        };
        N.contains = N.include = function(e, t) {
          return e == null ? !1 : w && e.indexOf === w ? e.indexOf(t) != -1 : L(e, function(e) {
            return e === t
          })
        }, N.invoke = function(e, t) {
          var n = f.call(arguments, 2),
            r = N.isFunction(t);
          return N.map(e, function(e) {
            return (r ? t : e[t]).apply(e, n)
          })
        }, N.pluck = function(e, t) {
          return N.map(e, N.property(t))
        }, N.where = function(e, t) {
          return N.filter(e, N.matches(t))
        }, N.findWhere = function(e, t) {
          return N.find(e, N.matches(t))
        }, N.max = function(e, t, n) {
          if (!t && N.isArray(e) && e[0] === +e[0] && e.length < 65535) return Math.max.apply(Math, e);
          var r = -Infinity,
            i = -Infinity;
          return C(e, function(e, s, o) {
            var u = t ? t.call(n, e, s, o) : e;
            u > i && (r = e, i = u)
          }), r
        }, N.min = function(e, t, n) {
          if (!t && N.isArray(e) && e[0] === +e[0] && e.length < 65535) return Math.min.apply(Math, e);
          var r = Infinity,
            i = Infinity;
          return C(e, function(e, s, o) {
            var u = t ? t.call(n, e, s, o) : e;
            u < i && (r = e, i = u)
          }), r
        }, N.shuffle = function(e) {
          var t, n = 0,
            r = [];
          return C(e, function(e) {
            t = N.random(n++), r[n - 1] = r[t], r[t] = e
          }), r
        }, N.sample = function(e, t, n) {
          return t == null || n ? (e.length !== +e.length && (e = N.values(e)), e[N.random(e.length - 1)]) : N.shuffle(e).slice(0, Math.max(0, t))
        };
        var A = function(e) {
          return e == null ? N.identity : N.isFunction(e) ? e : N.property(e)
        };
        N.sortBy = function(e, t, n) {
          return t = A(t), N.pluck(N.map(e, function(e, r, i) {
            return {
              value: e,
              index: r,
              criteria: t.call(n, e, r, i)
            }
          }).sort(function(e, t) {
            var n = e.criteria,
              r = t.criteria;
            if (n !== r) {
              if (n > r || n === void 0) return 1;
              if (n < r || r === void 0) return -1
            }
            return e.index - t.index
          }), "value")
        };
        var O = function(e) {
          return function(t, n, r) {
            var i = {};
            return n = A(n), C(t, function(s, o) {
              var u = n.call(r, s, o, t);
              e(i, u, s)
            }), i
          }
        };
        N.groupBy = O(function(e, t, n) {
          N.has(e, t) ? e[t].push(n) : e[t] = [n]
        }), N.indexBy = O(function(e, t, n) {
          e[t] = n
        }), N.countBy = O(function(e, t) {
          N.has(e, t) ? e[t] ++ : e[t] = 1
        }), N.sortedIndex = function(e, t, n, r) {
          n = A(n);
          var i = n.call(r, t),
            s = 0,
            o = e.length;
          while (s < o) {
            var u = s + o >>> 1;
            n.call(r, e[u]) < i ? s = u + 1 : o = u
          }
          return s
        }, N.toArray = function(e) {
          return e ? N.isArray(e) ? f.call(e) : e.length === +e.length ? N.map(e, N.identity) : N.values(e) : []
        }, N.size = function(e) {
          return e == null ? 0 : e.length === +e.length ? e.length : N.keys(e).length
        }, N.first = N.head = N.take = function(e, t, n) {
          return e == null ? void 0 : t == null || n ? e[0] : t < 0 ? [] : f.call(e, 0, t)
        }, N.initial = function(e, t, n) {
          return f.call(e, 0, e.length - (t == null || n ? 1 : t))
        }, N.last = function(e, t, n) {
          return e == null ? void 0 : t == null || n ? e[e.length - 1] : f.call(e, Math.max(e.length - t, 0))
        }, N.rest = N.tail = N.drop = function(e, t, n) {
          return f.call(e, t == null || n ? 1 : t)
        }, N.compact = function(e) {
          return N.filter(e, N.identity)
        };
        var M = function(e, t, n) {
          return t && N.every(e, N.isArray) ? l.apply(n, e) : (C(e, function(e) {
            N.isArray(e) || N.isArguments(e) ? t ? a.apply(n, e) : M(e, t, n) : n.push(e)
          }), n)
        };
        N.flatten = function(e, t) {
          return M(e, t, [])
        }, N.without = function(e) {
          return N.difference(e, f.call(arguments, 1))
        }, N.partition = function(e, t) {
          var n = [],
            r = [];
          return C(e, function(e) {
            (t(e) ? n : r).push(e)
          }), [n, r]
        }, N.uniq = N.unique = function(e, t, n, r) {
          N.isFunction(t) && (r = n, n = t, t = !1);
          var i = n ? N.map(e, n, r) : e,
            s = [],
            o = [];
          return C(i, function(n, r) {
            if (t ? !r || o[o.length - 1] !== n : !N.contains(o, n)) o.push(n), s.push(e[r])
          }), s
        }, N.union = function() {
          return N.uniq(N.flatten(arguments, !0))
        }, N.intersection = function(e) {
          var t = f.call(arguments, 1);
          return N.filter(N.uniq(e), function(e) {
            return N.every(t, function(t) {
              return N.contains(t, e)
            })
          })
        }, N.difference = function(e) {
          var t = l.apply(s, f.call(arguments, 1));
          return N.filter(e, function(e) {
            return !N.contains(t, e)
          })
        }, N.zip = function() {
          var e = N.max(N.pluck(arguments, "length").concat(0)),
            t = new Array(e);
          for (var n = 0; n < e; n++) t[n] = N.pluck(arguments, "" + n);
          return t
        }, N.object = function(e, t) {
          if (e == null) return {};
          var n = {};
          for (var r = 0, i = e.length; r < i; r++) t ? n[e[r]] = t[r] : n[e[r][0]] = e[r][1];
          return n
        }, N.indexOf = function(e, t, n) {
          if (e == null) return -1;
          var r = 0,
            i = e.length;
          if (n) {
            if (typeof n != "number") return r = N.sortedIndex(e, t), e[r] === t ? r : -1;
            r = n < 0 ? Math.max(0, i + n) : n
          }
          if (w && e.indexOf === w) return e.indexOf(t, n);
          for (; r < i; r++)
            if (e[r] === t) return r;
          return -1
        }, N.lastIndexOf = function(e, t, n) {
          if (e == null) return -1;
          var r = n != null;
          if (E && e.lastIndexOf === E) return r ? e.lastIndexOf(t, n) : e.lastIndexOf(t);
          var i = r ? n : e.length;
          while (i--)
            if (e[i] === t) return i;
          return -1
        }, N.range = function(e, t, n) {
          arguments.length <= 1 && (t = e || 0, e = 0), n = arguments[2] || 1;
          var r = Math.max(Math.ceil((t - e) / n), 0),
            i = 0,
            s = new Array(r);
          while (i < r) s[i++] = e, e += n;
          return s
        };
        var _ = function() {};
        N.bind = function(e, t) {
          var n, r;
          if (T && e.bind === T) return T.apply(e, f.call(arguments, 1));
          if (!N.isFunction(e)) throw new TypeError;
          return n = f.call(arguments, 2), r = function() {
            if (this instanceof r) {
              _.prototype = e.prototype;
              var i = new _;
              _.prototype = null;
              var s = e.apply(i, n.concat(f.call(arguments)));
              return Object(s) === s ? s : i
            }
            return e.apply(t, n.concat(f.call(arguments)))
          }
        }, N.partial = function(e) {
          var t = f.call(arguments, 1);
          return function() {
            var n = 0,
              r = t.slice();
            for (var i = 0, s = r.length; i < s; i++) r[i] === N && (r[i] = arguments[n++]);
            while (n < arguments.length) r.push(arguments[n++]);
            return e.apply(this, r)
          }
        }, N.bindAll = function(e) {
          var t = f.call(arguments, 1);
          if (t.length === 0) throw new Error("bindAll must be passed function names");
          return C(t, function(t) {
            e[t] = N.bind(e[t], e)
          }), e
        }, N.memoize = function(e, t) {
          var n = {};
          return t || (t = N.identity),
            function() {
              var r = t.apply(this, arguments);
              return N.has(n, r) ? n[r] : n[r] = e.apply(this, arguments)
            }
        }, N.delay = function(e, t) {
          var n = f.call(arguments, 2);
          return setTimeout(function() {
            return e.apply(null, n)
          }, t)
        }, N.defer = function(e) {
          return N.delay.apply(N, [e, 1].concat(f.call(arguments, 1)))
        }, N.throttle = function(e, t, n) {
          var r, i, s, o = null,
            u = 0;
          n || (n = {});
          var a = function() {
            u = n.leading === !1 ? 0 : N.now(), o = null, s = e.apply(r, i), r = i = null
          };
          return function() {
            var f = N.now();
            !u && n.leading === !1 && (u = f);
            var l = t - (f - u);
            return r = this, i = arguments, l <= 0 ? (clearTimeout(o), o = null, u = f, s = e.apply(r, i), r = i = null) : !o && n.trailing !== !1 && (o = setTimeout(a, l)), s
          }
        }, N.debounce = function(e, t, n) {
          var r, i, s, o, u, a = function() {
            var f = N.now() - o;
            f < t ? r = setTimeout(a, t - f) : (r = null, n || (u = e.apply(s, i), s = i = null))
          };
          return function() {
            s = this, i = arguments, o = N.now();
            var f = n && !r;
            return r || (r = setTimeout(a, t)), f && (u = e.apply(s, i), s = i = null), u
          }
        }, N.once = function(e) {
          var t = !1,
            n;
          return function() {
            return t ? n : (t = !0, n = e.apply(this, arguments), e = null, n)
          }
        }, N.wrap = function(e, t) {
          return N.partial(t, e)
        }, N.compose = function() {
          var e = arguments;
          return function() {
            var t = arguments;
            for (var n = e.length - 1; n >= 0; n--) t = [e[n].apply(this, t)];
            return t[0]
          }
        }, N.after = function(e, t) {
          return function() {
            if (--e < 1) return t.apply(this, arguments)
          }
        }, N.keys = function(e) {
          if (!N.isObject(e)) return [];
          if (x) return x(e);
          var t = [];
          for (var n in e) N.has(e, n) && t.push(n);
          return t
        }, N.values = function(e) {
          var t = N.keys(e),
            n = t.length,
            r = new Array(n);
          for (var i = 0; i < n; i++) r[i] = e[t[i]];
          return r
        }, N.pairs = function(e) {
          var t = N.keys(e),
            n = t.length,
            r = new Array(n);
          for (var i = 0; i < n; i++) r[i] = [t[i], e[t[i]]];
          return r
        }, N.invert = function(e) {
          var t = {},
            n = N.keys(e);
          for (var r = 0, i = n.length; r < i; r++) t[e[n[r]]] = n[r];
          return t
        }, N.functions = N.methods = function(e) {
          var t = [];
          for (var n in e) N.isFunction(e[n]) && t.push(n);
          return t.sort()
        }, N.extend = function(e) {
          return C(f.call(arguments, 1), function(t) {
            if (t)
              for (var n in t) e[n] = t[n]
          }), e
        }, N.pick = function(e) {
          var t = {},
            n = l.apply(s, f.call(arguments, 1));
          return C(n, function(n) {
            n in e && (t[n] = e[n])
          }), t
        }, N.omit = function(e) {
          var t = {},
            n = l.apply(s, f.call(arguments, 1));
          for (var r in e) N.contains(n, r) || (t[r] = e[r]);
          return t
        }, N.defaults = function(e) {
          return C(f.call(arguments, 1), function(t) {
            if (t)
              for (var n in t) e[n] === void 0 && (e[n] = t[n])
          }), e
        }, N.clone = function(e) {
          return N.isObject(e) ? N.isArray(e) ? e.slice() : N.extend({}, e) : e
        }, N.tap = function(e, t) {
          return t(e), e
        };
        var D = function(e, t, n, r) {
          if (e === t) return e !== 0 || 1 / e == 1 / t;
          if (e == null || t == null) return e === t;
          e instanceof N && (e = e._wrapped), t instanceof N && (t = t._wrapped);
          var i = c.call(e);
          if (i != c.call(t)) return !1;
          switch (i) {
            case "[object String]":
              return e == String(t);
            case "[object Number]":
              return e != +e ? t != +t : e == 0 ? 1 / e == 1 / t : e == +t;
            case "[object Date]":
            case "[object Boolean]":
              return +e == +t;
            case "[object RegExp]":
              return e.source == t.source && e.global == t.global && e.multiline == t.multiline && e.ignoreCase == t.ignoreCase
          }
          if (typeof e != "object" || typeof t != "object") return !1;
          var s = n.length;
          while (s--)
            if (n[s] == e) return r[s] == t;
          var o = e.constructor,
            u = t.constructor;
          if (o !== u && !(N.isFunction(o) && o instanceof o && N.isFunction(u) && u instanceof u) && "constructor" in e && "constructor" in t) return !1;
          n.push(e), r.push(t);
          var a = 0,
            f = !0;
          if (i == "[object Array]") {
            a = e.length, f = a == t.length;
            if (f)
              while (a--)
                if (!(f = D(e[a], t[a], n, r))) break
          } else {
            for (var l in e)
              if (N.has(e, l)) {
                a++;
                if (!(f = N.has(t, l) && D(e[l], t[l], n, r))) break
              }
            if (f) {
              for (l in t)
                if (N.has(t, l) && !(a--)) break;
              f = !a
            }
          }
          return n.pop(), r.pop(), f
        };
        N.isEqual = function(e, t) {
          return D(e, t, [], [])
        }, N.isEmpty = function(e) {
          if (e == null) return !0;
          if (N.isArray(e) || N.isString(e)) return e.length === 0;
          for (var t in e)
            if (N.has(e, t)) return !1;
          return !0
        }, N.isElement = function(e) {
          return !!e && e.nodeType === 1
        }, N.isArray = S || function(e) {
          return c.call(e) == "[object Array]"
        }, N.isObject = function(e) {
          return e === Object(e)
        }, C(["Arguments", "Function", "String", "Number", "Date", "RegExp"], function(e) {
          N["is" + e] = function(t) {
            return c.call(t) == "[object " + e + "]"
          }
        }), N.isArguments(arguments) || (N.isArguments = function(e) {
          return !!e && !!N.has(e, "callee")
        }), typeof /./ != "function" && (N.isFunction = function(e) {
          return typeof e == "function"
        }), N.isFinite = function(e) {
          return isFinite(e) && !isNaN(parseFloat(e))
        }, N.isNaN = function(e) {
          return N.isNumber(e) && e != +e
        }, N.isBoolean = function(e) {
          return e === !0 || e === !1 || c.call(e) == "[object Boolean]"
        }, N.isNull = function(e) {
          return e === null
        }, N.isUndefined = function(e) {
          return e === void 0
        }, N.has = function(e, t) {
          return h.call(e, t)
        }, N.noConflict = function() {
          return e._ = r, this
        }, N.identity = function(e) {
          return e
        }, N.constant = function(e) {
          return function() {
            return e
          }
        }, N.property = function(e) {
          return function(t) {
            return t[e]
          }
        }, N.matches = function(e) {
          return function(t) {
            if (t === e) return !0;
            for (var n in e)
              if (e[n] !== t[n]) return !1;
            return !0
          }
        }, N.times = function(e, t, n) {
          var r = Array(Math.max(0, e));
          for (var i = 0; i < e; i++) r[i] = t.call(n, i);
          return r
        }, N.random = function(e, t) {
          return t == null && (t = e, e = 0), e + Math.floor(Math.random() * (t - e + 1))
        }, N.now = Date.now || function() {
          return (new Date).getTime()
        };
        var P = {
          escape: {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': "&quot;",
            "'": "&#x27;"
          }
        };
        P.unescape = N.invert(P.escape);
        var H = {
          escape: new RegExp("[" + N.keys(P.escape).join("") + "]", "g"),
          unescape: new RegExp("(" + N.keys(P.unescape).join("|") + ")", "g")
        };
        N.each(["escape", "unescape"], function(e) {
          N[e] = function(t) {
            return t == null ? "" : ("" + t).replace(H[e], function(t) {
              return P[e][t]
            })
          }
        }), N.result = function(e, t) {
          if (e == null) return void 0;
          var n = e[t];
          return N.isFunction(n) ? n.call(e) : n
        }, N.mixin = function(e) {
          C(N.functions(e), function(t) {
            var n = N[t] = e[t];
            N.prototype[t] = function() {
              var e = [this._wrapped];
              return a.apply(e, arguments), q.call(this, n.apply(N, e))
            }
          })
        };
        var B = 0;
        N.uniqueId = function(e) {
          var t = ++B + "";
          return e ? e + t : t
        }, N.templateSettings = {
          evaluate: /<%([\s\S]+?)%>/g,
          interpolate: /<%=([\s\S]+?)%>/g,
          escape: /<%-([\s\S]+?)%>/g
        };
        var j = /(.)^/,
          F = {
            "'": "'",
            "\\": "\\",
            "\r": "r",
            "\n": "n",
            "	": "t",
            "\u2028": "u2028",
            "\u2029": "u2029"
          },
          I = /\\|'|\r|\n|\t|\u2028|\u2029/g;
        N.template = function(e, t, n) {
          var r;
          n = N.defaults({}, n, N.templateSettings);
          var i = new RegExp([(n.escape || j).source, (n.interpolate || j).source, (n.evaluate || j).source].join("|") + "|$", "g"),
            s = 0,
            o = "__p+='";
          e.replace(i, function(t, n, r, i, u) {
            return o += e.slice(s, u).replace(I, function(e) {
              return "\\" + F[e]
            }), n && (o += "'+\n((__t=(" + n + "))==null?'':_.escape(__t))+\n'"), r && (o += "'+\n((__t=(" + r + "))==null?'':__t)+\n'"), i && (o += "';\n" + i + "\n__p+='"), s = u + t.length, t
          }), o += "';\n", n.variable || (o = "with(obj||{}){\n" + o + "}\n"), o = "var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n" + o + "return __p;\n";
          try {
            r = new Function(n.variable || "obj", "_", o)
          } catch (u) {
            throw u.source = o, u
          }
          if (t) return r(t, N);
          var a = function(e) {
            return r.call(this, e, N)
          };
          return a.source = "function(" + (n.variable || "obj") + "){\n" + o + "}", a
        }, N.chain = function(e) {
          return N(e).chain()
        };
        var q = function(e) {
          return this._chain ? N(e).chain() : e
        };
        N.mixin(N), C(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function(e) {
          var t = s[e];
          N.prototype[e] = function() {
            var n = this._wrapped;
            return t.apply(n, arguments), (e == "shift" || e == "splice") && n.length === 0 && delete n[0], q.call(this, n)
          }
        }), C(["concat", "join", "slice"], function(e) {
          var t = s[e];
          N.prototype[e] = function() {
            return q.call(this, t.apply(this._wrapped, arguments))
          }
        }), N.extend(N.prototype, {
          chain: function() {
            return this._chain = !0, this
          },
          value: function() {
            return this._wrapped
          }
        }), typeof define == "function" && define.amd && ace.define("underscore", [], function() {
          return N
        })
      }).call(this)
    }, {}],
    3: [function(e, t, n) {
      var r = e("underscore"),
        i = e("events"),
        s = e("./vars.js"),
        o = e("./messages.js"),
        u = e("./lex.js").Lexer,
        a = e("./reg.js"),
        f = e("./state.js").state,
        l = e("./style.js"),
        c = function() {
          "use strict";

          function I(e, t) {
            return e = e.trim(), /^[+-]W\d{3}$/g.test(e) ? !0 : p[e] === undefined && h[e] === undefined && t.type !== "jslint" && !m[e] ? (G("E001", t, e), !1) : !0
          }

          function q(e) {
            return Object.prototype.toString.call(e) === "[object String]"
          }

          function R(e, t) {
            return e ? !e.identifier || e.value !== t ? !1 : !0 : !1
          }

          function U(e) {
            if (!e.reserved) return !1;
            var t = e.meta;
            if (t && t.isFutureReservedWord && f.option.inES5()) {
              if (!t.es5) return !1;
              if (t.strictOnly && !f.option.strict && !f.directive["use strict"]) return !1;
              if (e.isProperty) return !1
            }
            return !0
          }

          function z(e, t) {
            return e.replace(/\{([^{}]*)\}/g, function(e, n) {
              var r = t[n];
              return typeof r == "string" || typeof r == "number" ? r : e
            })
          }

          function W(e, t) {
            Object.keys(t).forEach(function(n) {
              if (r.has(c.blacklist, n)) return;
              e[n] = t[n]
            })
          }

          function X() {
            f.option.esnext && W(M, s.newEcmaIdentifiers), f.option.couch && W(M, s.couch), f.option.qunit && W(M, s.qunit), f.option.rhino && W(M, s.rhino), f.option.shelljs && (W(M, s.shelljs), W(M, s.node)), f.option.typed && W(M, s.typed), f.option.phantom && W(M, s.phantom), f.option.prototypejs && W(M, s.prototypejs), f.option.node && (W(M, s.node), W(M, s.typed)), f.option.devel && W(M, s.devel), f.option.dojo && W(M, s.dojo), f.option.browser && (W(M, s.browser), W(M, s.typed)), f.option.nonstandard && W(M, s.nonstandard), f.option.jasmine && W(M, s.jasmine), f.option.jquery && W(M, s.jquery), f.option.mootools && W(M, s.mootools), f.option.worker && W(M, s.worker), f.option.wsh && W(M, s.wsh), f.option.globalstrict && f.option.strict !== !1 && (f.option.strict = !0), f.option.yui && W(M, s.yui), f.option.mocha && W(M, s.mocha), f.option.inMoz = function(e) {
              return f.option.moz
            }, f.option.inESNext = function(e) {
              return f.option.moz || f.option.esnext
            }, f.option.inES5 = function() {
              return !f.option.es3
            }, f.option.inES3 = function(e) {
              return e ? !f.option.moz && !f.option.esnext && f.option.es3 : f.option.es3
            }
          }

          function V(e, t, n) {
            var r = Math.floor(t / f.lines.length * 100),
              i = o.errors[e].desc;
            throw {
              name: "JSHintError",
              line: t,
              character: n,
              message: i + " (" + r + "% scanned).",
              raw: i,
              code: e
            }
          }

          function $(e, t, n, r) {
            return c.undefs.push([e, t, n, r])
          }

          function J() {
            var e = f.ignoredLines;
            if (r.isEmpty(e)) return;
            c.errors = r.reject(c.errors, function(t) {
              return e[t.line]
            })
          }

          function K(e, t, n, r, i, s) {
            var u, a, l, h;
            if (/^W\d{3}$/.test(e)) {
              if (f.ignored[e]) return;
              h = o.warnings[e]
            } else /E\d{3}/.test(e) ? h = o.errors[e] : /I\d{3}/.test(e) && (h = o.info[e]);
            return t = t || f.tokens.next, t.id === "(end)" && (t = f.tokens.curr), a = t.line || 0, u = t.from || 0, l = {
              id: "(error)",
              raw: h.desc,
              code: h.code,
              evidence: f.lines[a - 1] || "",
              line: a,
              character: u,
              scope: c.scope,
              a: n,
              b: r,
              c: i,
              d: s
            }, l.reason = z(h.desc, l), c.errors.push(l), J(), c.errors.length >= f.option.maxerr && V("E043", a, u), l
          }

          function Q(e, t, n, r, i, s, o) {
            return K(e, {
              line: t,
              from: n
            }, r, i, s, o)
          }

          function G(e, t, n, r, i, s) {
            K(e, t, n, r, i, s)
          }

          function Y(e, t, n, r, i, s, o) {
            return G(e, {
              line: t,
              from: n
            }, r, i, s, o)
          }

          function Z(e, t) {
            var n;
            return n = {
              id: "(internal)",
              elem: e,
              value: t
            }, c.internals.push(n), n
          }

          function et(e, t) {
            t = t || {};
            var n = t.type,
              i = t.token,
              s = t.islet;
            n === "exception" && r.has(w["(context)"], e) && w[e] !== !0 && !f.option.node && K("W002", f.tokens.next, e), r.has(w, e) && !w["(global)"] && (w[e] === !0 ? f.option.latedef && (f.option.latedef === !0 && r.contains([w[e], n], "unction") || !r.contains([w[e], n], "unction")) && K("W003", f.tokens.next, e) : ((!f.option.shadow || r.contains(["inner", "outer"], f.option.shadow)) && n !== "exception" || w["(blockscope)"].getlabel(e)) && K("W004", f.tokens.next, e)), w["(context)"] && r.has(w["(context)"], e) && n !== "function" && f.option.shadow === "outer" && K("W123", f.tokens.next, e), s ? w["(blockscope)"].current.add(e, n, f.tokens.curr) : (w["(blockscope)"].shadow(e), w[e] = n, i && (w["(tokens)"][e] = i), Xt(w, e, {
              unused: t.unused || !1
            }), w["(global)"] ? (S[e] = w, r.has(x, e) && (f.option.latedef && (f.option.latedef === !0 && r.contains([w[e], n], "unction") || !r.contains([w[e], n], "unction")) && K("W003", f.tokens.next, e), delete x[e])) : D[e] = w)
          }

          function tt() {
            var e = f.tokens.next,
              t = e.body.match(/(-\s+)?[^\s,:]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g) || [],
              n = {};
            if (e.type === "globals") {
              t.forEach(function(e) {
                e = e.split(":");
                var t = (e[0] || "").trim(),
                  r = (e[1] || "").trim();
                t.charAt(0) === "-" ? (t = t.slice(1), r = !1, c.blacklist[t] = t, delete M[t]) : n[t] = r === "true"
              }), W(M, n);
              for (var i in n) r.has(n, i) && (g[i] = e)
            }
            e.type === "exported" && t.forEach(function(e) {
              y[e] = !0
            }), e.type === "members" && (A = A || {}, t.forEach(function(e) {
              var t = e.charAt(0),
                n = e.charAt(e.length - 1);
              t === n && (t === '"' || t === "'") && (e = e.substr(1, e.length - 2).replace('\\"', '"')), A[e] = !1
            }));
            var s = ["maxstatements", "maxparams", "maxdepth", "maxcomplexity", "maxerr", "maxlen", "indent"];
            if (e.type === "jshint" || e.type === "jslint") t.forEach(function(t) {
              t = t.split(":");
              var n = (t[0] || "").trim(),
                r = (t[1] || "").trim();
              if (!I(n, e)) return;
              if (s.indexOf(n) >= 0) {
                if (r !== "false") {
                  r = +r;
                  if (typeof r != "number" || !isFinite(r) || r <= 0 || Math.floor(r) !== r) {
                    G("E032", e, t[1].trim());
                    return
                  }
                  f.option[n] = r
                } else f.option[n] = n === "indent" ? 4 : !1;
                return
              }
              if (n === "validthis") {
                if (w["(global)"]) return void G("E009");
                if (r !== "true" && r !== "false") return void G("E002", e);
                f.option.validthis = r === "true";
                return
              }
              if (n === "quotmark") {
                switch (r) {
                  case "true":
                  case "false":
                    f.option.quotmark = r === "true";
                    break;
                  case "double":
                  case "single":
                    f.option.quotmark = r;
                    break;
                  default:
                    G("E002", e)
                }
                return
              }
              if (n === "shadow") {
                switch (r) {
                  case "true":
                    f.option.shadow = !0;
                    break;
                  case "outer":
                    f.option.shadow = "outer";
                    break;
                  case "false":
                  case "inner":
                    f.option.shadow = "inner";
                    break;
                  default:
                    G("E002", e)
                }
                return
              }
              if (n === "unused") {
                switch (r) {
                  case "true":
                    f.option.unused = !0;
                    break;
                  case "false":
                    f.option.unused = !1;
                    break;
                  case "vars":
                  case "strict":
                    f.option.unused = r;
                    break;
                  default:
                    G("E002", e)
                }
                return
              }
              if (n === "latedef") {
                switch (r) {
                  case "true":
                    f.option.latedef = !0;
                    break;
                  case "false":
                    f.option.latedef = !1;
                    break;
                  case "nofunc":
                    f.option.latedef = "nofunc";
                    break;
                  default:
                    G("E002", e)
                }
                return
              }
              if (n === "ignore") {
                switch (r) {
                  case "start":
                    f.ignoreLinterErrors = !0;
                    break;
                  case "end":
                    f.ignoreLinterErrors = !1;
                    break;
                  case "line":
                    f.ignoredLines[e.line] = !0, J();
                    break;
                  default:
                    G("E002", e)
                }
                return
              }
              var i = /^([+-])(W\d{3})$/g.exec(n);
              if (i) {
                f.ignored[i[2]] = i[1] === "-";
                return
              }
              var o;
              if (r === "true" || r === "false") {
                e.type === "jslint" ? (o = v[n] || n, f.option[o] = r === "true", d[o] !== undefined && (f.option[o] = !f.option[o])) : f.option[n] = r === "true", n === "newcap" && (f.option["(explicitNewcap)"] = !0);
                return
              }
              G("E002", e)
            }), X()
          }

          function nt(e) {
            var t = e || 0,
              n = 0,
              r;
            while (n <= t) r = C[n], r || (r = C[n] = k.token()), n += 1;
            return r
          }

          function rt(t, n) {
            switch (f.tokens.curr.id) {
              case "(number)":
                f.tokens.next.id === "." && K("W005", f.tokens.curr);
                break;
              case "-":
                (f.tokens.next.id === "-" || f.tokens.next.id === "--") && K("W006");
                break;
              case "+":
                (f.tokens.next.id === "+" || f.tokens.next.id === "++") && K("W007")
            }
            if (f.tokens.curr.type === "(string)" || f.tokens.curr.identifier) e = f.tokens.curr.value;
            t && f.tokens.next.id !== t && (n ? f.tokens.next.id === "(end)" ? G("E019", n, n.id) : G("E020", f.tokens.next, t, n.id, n.line, f.tokens.next.value) : (f.tokens.next.type !== "(identifier)" || f.tokens.next.value !== t) && K("W116", f.tokens.next, t, f.tokens.next.value)), f.tokens.prev = f.tokens.curr, f.tokens.curr = f.tokens.next;
            for (;;) {
              f.tokens.next = C.shift() || k.token(), f.tokens.next || V("E041", f.tokens.curr.line);
              if (f.tokens.next.id === "(end)" || f.tokens.next.id === "(error)") return;
              f.tokens.next.check && f.tokens.next.check();
              if (f.tokens.next.isSpecial) tt();
              else if (f.tokens.next.id !== "(endline)") break
            }
          }

          function it(e) {
            return e.infix || !e.identifier && !!e.led
          }

          function st() {
            var e = f.tokens.curr,
              t = f.tokens.next;
            return t.id === ";" || t.id === "}" || t.id === ":" ? !0 : it(t) === it(e) || e.id === "yield" && f.option.inMoz(!0) ? e.line !== t.line : !1
          }

          function ot(t, n) {
            var i, s = !1,
              o = !1,
              u = !1;
            !n && f.tokens.next.value === "let" && nt(0).value === "(" && (f.option.inMoz(!0) || K("W118", f.tokens.next, "let expressions"), u = !0, w["(blockscope)"].stack(), rt("let"), rt("("), f.syntax.let.fud.call(f.syntax.let.fud, !1), rt(")")), f.tokens.next.id === "(end)" && G("E006", f.tokens.curr);
            var a = f.option.asi && f.tokens.prev.line < f.tokens.curr.line && r.contains(["]", ")"], f.tokens.prev.id) && r.contains(["[", "("], f.tokens.curr.id);
            a && K("W014", f.tokens.curr, f.tokens.curr.id), rt(), n && (e = "anonymous", w["(verb)"] = f.tokens.curr.value);
            if (n === !0 && f.tokens.curr.fud) i = f.tokens.curr.fud();
            else {
              f.tokens.curr.nud ? i = f.tokens.curr.nud() : G("E030", f.tokens.curr, f.tokens.curr.id);
              while (t < f.tokens.next.lbp && !st()) s = f.tokens.curr.value === "Array", o = f.tokens.curr.value === "Object", i && (i.value || i.first && i.first.value) && (i.value !== "new" || i.first && i.first.value && i.first.value === ".") && (s = !1, i.value !== f.tokens.curr.value && (o = !1)), rt(), s && f.tokens.curr.id === "(" && f.tokens.next.id === ")" && K("W009", f.tokens.curr), o && f.tokens.curr.id === "(" && f.tokens.next.id === ")" && K("W010", f.tokens.curr), i && f.tokens.curr.led ? i = f.tokens.curr.led(i) : G("E033", f.tokens.curr, f.tokens.curr.id)
            }
            return u && w["(blockscope)"].unstack(), i
          }

          function ut(e, t) {
            e = e || f.tokens.curr, t = t || f.tokens.next, !f.option.laxbreak && e.line !== t.line && K("W014", t, t.value)
          }

          function at(e) {
            e = e || f.tokens.curr, e.line !== f.tokens.next.line && K("E022", e, e.value)
          }

          function ft(e, t) {
            e.line !== t.line && (f.option.laxcomma || (lt.first && (K("I001"), lt.first = !1), K("W014", e, t.value)))
          }

          function lt(e) {
            e = e || {}, e.peek ? ft(f.tokens.prev, f.tokens.curr) : (ft(f.tokens.curr, f.tokens.next), rt(","));
            if (f.tokens.next.identifier && (!e.property || !f.option.inES5())) switch (f.tokens.next.value) {
              case "break":
              case "case":
              case "catch":
              case "continue":
              case "default":
              case "do":
              case "else":
              case "finally":
              case "for":
              case "if":
              case "in":
              case "instanceof":
              case "return":
              case "switch":
              case "throw":
              case "try":
              case "var":
              case "let":
              case "while":
              case "with":
                return G("E024", f.tokens.next, f.tokens.next.value), !1
            }
            if (f.tokens.next.type === "(punctuator)") switch (f.tokens.next.value) {
              case "}":
              case "]":
              case ",":
                if (e.allowTrailing) return !0;
              case ")":
                return G("E024", f.tokens.next, f.tokens.next.value), !1
            }
            return !0
          }

          function ct(e, t) {
            var n = f.syntax[e];
            if (!n || typeof n != "object") f.syntax[e] = n = {
              id: e,
              lbp: t,
              value: e
            };
            return n
          }

          function ht(e) {
            return ct(e, 0)
          }

          function pt(e, t) {
            var n = ht(e);
            return n.identifier = n.reserved = !0, n.fud = t, n
          }

          function dt(e, t) {
            var n = pt(e, t);
            return n.block = !0, n
          }

          function vt(e) {
            var t = e.id.charAt(0);
            if (t >= "a" && t <= "z" || t >= "A" && t <= "Z") e.identifier = e.reserved = !0;
            return e
          }

          function mt(e, t) {
            var n = ct(e, 150);
            return vt(n), n.nud = typeof t == "function" ? t : function() {
              this.right = ot(150), this.arity = "unary";
              if (this.id === "++" || this.id === "--") f.option.plusplus ? K("W016", this, this.id) : this.right && (!this.right.identifier || U(this.right)) && this.right.id !== "." && this.right.id !== "[" && K("W017", this);
              return this
            }, n
          }

          function gt(e, t) {
            var n = ht(e);
            return n.type = e, n.nud = t, n
          }

          function yt(e, t) {
            var n = gt(e, t);
            return n.identifier = !0, n.reserved = !0, n
          }

          function bt(e, t) {
            var n = gt(e, t && t.nud || function() {
              return this
            });
            return t = t || {}, t.isFutureReservedWord = !0, n.value = e, n.identifier = !0, n.reserved = !0, n.meta = t, n
          }

          function wt(e, t) {
            return yt(e, function() {
              return typeof t == "function" && t(this), this
            })
          }

          function Et(e, t, n, r) {
            var i = ct(e, n);
            return vt(i), i.infix = !0, i.led = function(i) {
              return r || ut(f.tokens.prev, f.tokens.curr), e === "in" && i.id === "!" && K("W018", i, "!"), typeof t == "function" ? t(i, this) : (this.left = i, this.right = ot(n), this)
            }, i
          }

          function St(e) {
            var t = ct(e, 42);
            return t.led = function(e) {
              return f.option.inESNext() || K("W104", f.tokens.curr, "arrow function syntax (=>)"), ut(f.tokens.prev, f.tokens.curr), this.left = e, this.right = Jt(undefined, undefined, !1, e), this
            }, t
          }

          function xt(e, t) {
            var n = ct(e, 100);
            return n.led = function(e) {
              ut(f.tokens.prev, f.tokens.curr);
              var n = ot(100);
              return R(e, "NaN") || R(n, "NaN") ? K("W019", this) : t && t.apply(this, [e, n]), (!e || !n) && V("E041", f.tokens.curr.line), e.id === "!" && K("W018", e, "!"), n.id === "!" && K("W018", n, "!"), this.left = e, this.right = n, this
            }, n
          }

          function Tt(e) {
            return e && (e.type === "(number)" && +e.value === 0 || e.type === "(string)" && e.value === "" || e.type === "null" && !f.option.eqnull || e.type === "true" || e.type === "false" || e.type === "undefined")
          }

          function Nt(e, t) {
            if (f.option.notypeof) return !1;
            if (!e || !t) return !1;
            var n = ["undefined", "object", "boolean", "number", "string", "function", "xml", "object", "unknown"];
            return t.type === "(identifier)" && t.value === "typeof" && e.type === "(string)" ? !r.contains(n, e.value) : !1
          }

          function Ct(e) {
            function n(e) {
              if (typeof e != "object") return;
              return e.right === "prototype" ? e : n(e.left)
            }

            function r(e) {
              while (!e.identifier && typeof e.left == "object") e = e.left;
              if (e.identifier && t.indexOf(e.value) >= 0) return e.value
            }
            var t = ["Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date", "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array", "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array", "Iterator", "Number", "NumberFormat", "Object", "RangeError", "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError", "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", "URIError"],
              i = n(e);
            if (i) return r(i)
          }

          function kt(e, t, n) {
            var r = Et(e, typeof t == "function" ? t : function(e, t) {
              t.left = e;
              if (e) {
                if (f.option.freeze) {
                  var n = Ct(e);
                  n && K("W121", e, n)
                }
                M[e.value] === !1 && D[e.value]["(global)"] === !0 ? K("W020", e) : e["function"] && K("W021", e, e.value), w[e.value] === "const" && G("E013", e, e.value);
                if (e.id === ".") return e.left ? e.left.value === "arguments" && !f.directive["use strict"] && K("E031", t) : K("E031", t), t.right = ot(10), t;
                if (e.id === "[") return f.tokens.curr.left.first ? f.tokens.curr.left.first.forEach(function(e) {
                  e && w[e.value] === "const" && G("E013", e, e.value)
                }) : e.left ? e.left.value === "arguments" && !f.directive["use strict"] && K("E031", t) : K("E031", t), t.right = ot(10), t;
                if (e.identifier && !U(e)) return w[e.value] === "exception" && K("W022", e), t.right = ot(10), t;
                e === f.syntax["function"] && K("W023", f.tokens.curr)
              }
              G("E031", t)
            }, n);
            return r.exps = !0, r.assign = !0, r
          }

          function Lt(e, t, n) {
            var r = ct(e, n);
            return vt(r), r.led = typeof t == "function" ? t : function(e) {
              return f.option.bitwise && K("W016", this, this.id), this.left = e, this.right = ot(n), this
            }, r
          }

          function At(e) {
            return kt(e, function(e, t) {
              f.option.bitwise && K("W016", t, t.id);
              if (e) return e.id === "." || e.id === "[" || e.identifier && !U(e) ? (ot(10), t) : (e === f.syntax["function"] && K("W023", f.tokens.curr), t);
              G("E031", t)
            }, 20)
          }

          function Ot(e) {
            var t = ct(e, 150);
            return t.led = function(e) {
              return f.option.plusplus ? K("W016", this, this.id) : (!e.identifier || U(e)) && e.id !== "." && e.id !== "[" && K("W017", this), this.left = e, this
            }, t
          }

          function Mt(e, t) {
            if (!f.tokens.next.identifier) return;
            rt();
            var n = f.tokens.curr,
              r = f.tokens.curr.value;
            return U(n) ? t && f.option.inES5() ? r : e && r === "undefined" ? r : (K("W024", f.tokens.curr, f.tokens.curr.id), r) : r
          }

          function _t(e, t) {
            var n = Mt(e, t);
            if (n) return n;
            f.tokens.curr.id === "function" && f.tokens.next.id === "(" ? K("W025") : G("E030", f.tokens.next, f.tokens.next.value)
          }

          function Dt(e) {
            var t = 0,
              n;
            if (f.tokens.next.id !== ";" || O) return;
            for (;;) {
              do n = nt(t), t += 1; while (n.id != "(end)" && n.id === "(comment)");
              if (n.reach) return;
              if (n.id !== "(endline)") {
                if (n.id === "function") {
                  f.option.latedef === !0 && K("W026", n);
                  break
                }
                K("W027", n, n.value, e);
                break
              }
            }
          }

          function Pt() {
            f.tokens.next.id !== ";" ? f.option.asi || (!f.option.lastsemic || f.tokens.next.id !== "}" || f.tokens.next.line !== f.tokens.curr.line) && Q("W033", f.tokens.curr.line, f.tokens.curr.character) : rt(";")
          }

          function Ht() {
            var e, t = N,
              n, i = D,
              s = f.tokens.next;
            if (s.id === ";") {
              rt(";");
              return
            }
            var o = U(s);
            o && s.meta && s.meta.isFutureReservedWord && nt().id === ":" && (K("W024", s, s.id), o = !1);
            if (s.value === "module" && s.type === "(identifier)" && nt().type === "(identifier)") {
              f.option.inESNext() || K("W119", f.tokens.curr, "module"), rt("module");
              var u = _t();
              et(u, {
                type: "unused",
                token: f.tokens.curr
              }), rt("from"), rt("(string)"), Pt();
              return
            }
            if (r.has(["[", "{"], s.value) && on().isDestAssign) {
              f.option.inESNext() || K("W104", f.tokens.curr, "destructuring expression"), e = Yt(), e.forEach(function(e) {
                $(w, "W117", e.token, e.id)
              }), rt("="), Zt(e, ot(10, !0)), rt(";");
              return
            }
            s.identifier && !o && nt().id === ":" && (rt(), rt(":"), D = Object.create(i), et(s.value, {
              type: "label"
            }), !f.tokens.next.labelled && f.tokens.next.value !== "{" && K("W028", f.tokens.next, s.value, f.tokens.next.value), f.tokens.next.label = s.value, s = f.tokens.next);
            if (s.id === "{") {
              var a = w["(verb)"] === "case" && f.tokens.curr.value === ":";
              Ft(!0, !0, !1, !1, a);
              return
            }
            return n = ot(0, !0), n && (!n.identifier || n.value !== "function") && n.type !== "(punctuator)" && !f.directive["use strict"] && f.option.globalstrict && f.option.strict && K("E007"), s.block || (!f.option.expr && (!n || !n.exps) ? K("W030", f.tokens.curr) : f.option.nonew && n && n.left && n.id === "(" && n.left.id === "new" && K("W031", s), Pt()), N = t, D = i, n
          }

          function Bt(e) {
            var t = [],
              n;
            while (!f.tokens.next.reach && f.tokens.next.id !== "(end)") f.tokens.next.id === ";" ? (n = nt(), (!n || n.id !== "(" && n.id !== "[") && K("W032"), rt(";")) : t.push(Ht(e === f.tokens.next.line));
            return t
          }

          function jt() {
            var e, t, n;
            for (;;) {
              if (f.tokens.next.id === "(string)") {
                t = nt(0);
                if (t.id === "(endline)") {
                  e = 1;
                  do n = nt(e), e += 1; while (n.id === "(endline)");
                  if (n.id !== ";") {
                    if (n.id !== "(string)" && n.id !== "(number)" && n.id !== "(regexp)" && n.identifier !== !0 && n.id !== "}") break;
                    K("W033", f.tokens.next)
                  } else t = n
                } else if (t.id === "}") K("W033", t);
                else if (t.id !== ";") break;
                rt(), f.directive[f.tokens.curr.value] && K("W034", f.tokens.curr, f.tokens.curr.value), f.tokens.curr.value === "use strict" && (f.option["(explicitNewcap)"] || (f.option.newcap = !0), f.option.undef = !0), f.directive[f.tokens.curr.value] = !0, t.id === ";" && rt(";");
                continue
              }
              break
            }
          }

          function Ft(e, t, n, i, s) {
            var o, u = T,
              a = N,
              l, c = D,
              h, p, d;
            T = e;
            if (!e || !f.option.funcscope) D = Object.create(D);
            h = f.tokens.next;
            var v = w["(metrics)"];
            v.nestedBlockDepth += 1, v.verifyMaxNestedBlockDepthPerFunction();
            if (f.tokens.next.id === "{") {
              rt("{"), w["(blockscope)"].stack(), p = f.tokens.curr.line;
              if (f.tokens.next.id !== "}") {
                N += f.option.indent;
                while (!e && f.tokens.next.from > N) N += f.option.indent;
                if (n) {
                  l = {};
                  for (d in f.directive) r.has(f.directive, d) && (l[d] = f.directive[d]);
                  jt(), f.option.strict && w["(context)"]["(global)"] && !l["use strict"] && !f.directive["use strict"] && K("E007")
                }
                o = Bt(p), v.statementCount += o.length, n && (f.directive = l), N -= f.option.indent
              }
              rt("}", h), w["(blockscope)"].unstack(), N = a
            } else if (!e)
              if (n) {
                l = {}, t && !i && !f.option.inMoz(!0) && G("W118", f.tokens.curr, "function closure expressions");
                if (!t)
                  for (d in f.directive) r.has(f.directive, d) && (l[d] = f.directive[d]);
                ot(10), f.option.strict && w["(context)"]["(global)"] && !l["use strict"] && !f.directive["use strict"] && K("E007")
              } else G("E021", f.tokens.next, "{", f.tokens.next.value);
            else w["(nolet)"] = !0, (!t || f.option.curly) && K("W116", f.tokens.next, "{", f.tokens.next.value), O = !0, N += f.option.indent, o = [Ht()], N -= f.option.indent, O = !1, delete w["(nolet)"];
            switch (w["(verb)"]) {
              case "break":
              case "continue":
              case "return":
              case "throw":
                if (s) break;
              default:
                w["(verb)"] = null
            }
            if (!e || !f.option.funcscope) D = c;
            return T = u, e && f.option.noempty && (!o || o.length === 0) && K("W035"), v.nestedBlockDepth -= 1, o
          }

          function It(e) {
            A && typeof A[e] != "boolean" && K("W036", f.tokens.curr, e), typeof L[e] == "number" ? L[e] += 1 : L[e] = 1
          }

          function qt(e) {
            var t = e.value,
              n = Object.getOwnPropertyDescriptor(x, t);
            n ? n.value.push(e.line) : x[t] = [e.line]
          }

          function Ut() {
            var e = {};
            e.exps = !0, w["(comparray)"].stack();
            var t = !1;
            return f.tokens.next.value !== "for" && (t = !0, f.option.inMoz(!0) || K("W116", f.tokens.next, "for", f.tokens.next.value), w["(comparray)"].setState("use"), e.right = ot(10)), rt("for"), f.tokens.next.value === "each" && (rt("each"), f.option.inMoz(!0) || K("W118", f.tokens.curr, "for each")), rt("("), w["(comparray)"].setState("define"), e.left = ot(130), r.contains(["in", "of"], f.tokens.next.value) ? rt() : G("E045", f.tokens.curr), w["(comparray)"].setState("generate"), ot(10), rt(")"), f.tokens.next.value === "if" && (rt("if"), rt("("), w["(comparray)"].setState("filter"), e.filter = ot(10), rt(")")), t || (w["(comparray)"].setState("use"), e.right = ot(10)), rt("]"), w["(comparray)"].unstack(), e
          }

          function zt() {
            var e = Mt(!1, !0);
            return e || (f.tokens.next.id === "(string)" ? (e = f.tokens.next.value, rt()) : f.tokens.next.id === "(number)" && (e = f.tokens.next.value.toString(), rt())), e === "hasOwnProperty" && K("W001"), e
          }

          function Wt(e) {
            var t, n, i = [],
              s, o = [],
              u, a = !1;
            if (e) {
              if (Array.isArray(e)) {
                for (var l in e) {
                  t = e[l];
                  if (t.value === "...") {
                    f.option.inESNext() || K("W104", t, "spread/rest operator");
                    continue
                  }
                  t.value !== "," && (i.push(t.value), et(t.value, {
                    type: "unused",
                    token: t
                  }))
                }
                return i
              }
              if (e.identifier === !0) return et(e.value, {
                type: "unused",
                token: e
              }), [e]
            }
            n = f.tokens.next, rt("(");
            if (f.tokens.next.id === ")") {
              rt(")");
              return
            }
            for (;;) {
              if (r.contains(["{", "["], f.tokens.next.id)) {
                o = Yt();
                for (u in o) u = o[u], u.id && (i.push(u.id), et(u.id, {
                  type: "unused",
                  token: u.token
                }))
              } else f.tokens.next.value === "..." ? (f.option.inESNext() || K("W104", f.tokens.next, "spread/rest operator"), rt("..."), s = _t(!0), i.push(s), et(s, {
                type: "unused",
                token: f.tokens.curr
              })) : (s = _t(!0), i.push(s), et(s, {
                type: "unused",
                token: f.tokens.curr
              }));
              a && f.tokens.next.id !== "=" && G("E051", f.tokens.current), f.tokens.next.id === "=" && (f.option.inESNext() || K("W119", f.tokens.next, "default parameters"), rt("="), a = !0, ot(10));
              if (f.tokens.next.id !== ",") return rt(")", n), i;
              lt()
            }
          }

          function Xt(e, t, n) {
            e["(properties)"][t] || (e["(properties)"][t] = {
              unused: !1
            }), r.extend(e["(properties)"][t], n)
          }

          function Vt(e, t, n) {
            return e["(properties)"][t] ? e["(properties)"][t][n] || null : null
          }

          function $t(e, t, n, i) {
            var s = {
              "(name)": e,
              "(breakage)": 0,
              "(loopage)": 0,
              "(scope)": n,
              "(tokens)": {},
              "(properties)": {},
              "(catch)": !1,
              "(global)": !1,
              "(line)": null,
              "(character)": null,
              "(metrics)": null,
              "(statement)": null,
              "(context)": null,
              "(blockscope)": null,
              "(comparray)": null,
              "(generator)": null,
              "(params)": null
            };
            return t && r.extend(s, {
              "(line)": t.line,
              "(character)": t.character,
              "(metrics)": Kt(t)
            }), r.extend(s, i), s["(context)"] && (s["(blockscope)"] = s["(context)"]["(blockscope)"], s["(comparray)"] = s["(context)"]["(comparray)"]), s
          }

          function Jt(t, n, i, s) {
            var o, u = f.option,
              a = f.ignored,
              l = D;
            return f.option = Object.create(f.option), f.ignored = Object.create(f.ignored), D = Object.create(D), w = $t(t || '"' + e + '"', f.tokens.next, D, {
              "(statement)": n,
              "(context)": w,
              "(generator)": i ? !0 : null
            }), o = w, f.tokens.curr.funct = w, E.push(w), t && et(t, {
              type: "function"
            }), w["(params)"] = Wt(s), w["(metrics)"].verifyMaxParametersPerFunction(w["(params)"]), c.undefs = r.filter(c.undefs, function(e) {
              return !r.contains(r.union(s), e[2])
            }), Ft(!1, !0, !0, s ? !0 : !1), !f.option.noyield && i && w["(generator)"] !== "yielded" && K("W124", f.tokens.curr), w["(metrics)"].verifyMaxStatementsPerFunction(), w["(metrics)"].verifyMaxComplexityPerFunction(), w["(unusedOption)"] = f.option.unused, D = l, f.option = u, f.ignored = a, w["(last)"] = f.tokens.curr.line, w["(lastcharacter)"] = f.tokens.curr.character, r.map(Object.keys(w), function(e) {
              if (e[0] === "(") return;
              w["(blockscope)"].unshadow(e)
            }), w = w["(context)"], o
          }

          function Kt(e) {
            return {
              statementCount: 0,
              nestedBlockDepth: -1,
              ComplexityCount: 1,
              verifyMaxStatementsPerFunction: function() {
                f.option.maxstatements && this.statementCount > f.option.maxstatements && K("W071", e, this.statementCount)
              },
              verifyMaxParametersPerFunction: function(t) {
                t = t || [], f.option.maxparams && t.length > f.option.maxparams && K("W072", e, t.length)
              },
              verifyMaxNestedBlockDepthPerFunction: function() {
                f.option.maxdepth && this.nestedBlockDepth > 0 && this.nestedBlockDepth === f.option.maxdepth + 1 && K("W073", null, this.nestedBlockDepth)
              },
              verifyMaxComplexityPerFunction: function() {
                var t = f.option.maxcomplexity,
                  n = this.ComplexityCount;
                t && n > t && K("W074", e, n)
              }
            }
          }

          function Qt() {
            w["(metrics)"].ComplexityCount += 1
          }

          function Gt(e) {
            var t, n;
            e && (t = e.id, n = e.paren, t === "," && (e = e.exprs[e.exprs.length - 1]) && (t = e.id, n = n || e.paren));
            switch (t) {
              case "=":
              case "+=":
              case "-=":
              case "*=":
              case "%=":
              case "&=":
              case "|=":
              case "^=":
              case "/=":
                !n && !f.option.boss && K("W084")
            }
          }

          function Yt() {
            var e, t, n = [];
            f.option.inESNext() || K("W104", f.tokens.curr, "destructuring expression");
            var i = function() {
              var e;
              if (r.contains(["[", "{"], f.tokens.next.value)) {
                t = Yt();
                for (var s in t) s = t[s], n.push({
                  id: s.id,
                  token: s.token
                })
              } else f.tokens.next.value === "," ? n.push({
                id: null,
                token: f.tokens.curr
              }) : f.tokens.next.value === "(" ? (rt("("), i(), rt(")")) : (e = _t(), e && n.push({
                id: e,
                token: f.tokens.curr
              }))
            };
            if (f.tokens.next.value === "[") {
              rt("["), i();
              while (f.tokens.next.value !== "]") rt(","), i();
              rt("]")
            } else if (f.tokens.next.value === "{") {
              rt("{"), e = _t(), f.tokens.next.value === ":" ? (rt(":"), i()) : n.push({
                id: e,
                token: f.tokens.curr
              });
              while (f.tokens.next.value !== "}") rt(","), e = _t(), f.tokens.next.value === ":" ? (rt(":"), i()) : n.push({
                id: e,
                token: f.tokens.curr
              });
              rt("}")
            }
            return n
          }

          function Zt(e, t) {
            var n = t.first;
            if (!n) return;
            r.zip(e, Array.isArray(n) ? n : [n]).forEach(function(e) {
              var t = e[0],
                n = e[1];
              t && n ? t.first = n : t && t.first && !n && K("W080", t.first, t.first.value)
            })
          }

          function rn(e) {
            return f.option.inESNext() || K("W104", f.tokens.curr, "class"), e ? (this.name = _t(), et(this.name, {
              type: "unused",
              token: f.tokens.curr
            })) : f.tokens.next.identifier && f.tokens.next.value !== "extends" && (this.name = _t()), sn(this), this
          }

          function sn(e) {
            var t = f.directive["use strict"];
            f.tokens.next.value === "extends" && (rt("extends"), e.heritage = ot(10)), f.directive["use strict"] = !0, rt("{"), e.body = f.syntax["{"].nud(!0), f.directive["use strict"] = t
          }

          function un() {
            var e = on();
            e.notJson ? (!f.option.inESNext() && e.isDestAssign && K("W104", f.tokens.curr, "destructuring assignment"), Bt()) : (f.option.laxbreak = !0, f.jsonMode = !0, fn())
          }

          function fn() {
            function e() {
              var e = {},
                t = f.tokens.next;
              rt("{");
              if (f.tokens.next.id !== "}")
                for (;;) {
                  if (f.tokens.next.id === "(end)") G("E026", f.tokens.next, t.line);
                  else {
                    if (f.tokens.next.id === "}") {
                      K("W094", f.tokens.curr);
                      break
                    }
                    f.tokens.next.id === "," ? G("E028", f.tokens.next) : f.tokens.next.id !== "(string)" && K("W095", f.tokens.next, f.tokens.next.value)
                  }
                  e[f.tokens.next.value] === !0 ? K("W075", f.tokens.next, f.tokens.next.value) : f.tokens.next.value === "__proto__" && !f.option.proto || f.tokens.next.value === "__iterator__" && !f.option.iterator ? K("W096", f.tokens.next, f.tokens.next.value) : e[f.tokens.next.value] = !0, rt(), rt(":"), fn();
                  if (f.tokens.next.id !== ",") break;
                  rt(",")
                }
              rt("}")
            }

            function t() {
              var e = f.tokens.next;
              rt("[");
              if (f.tokens.next.id !== "]")
                for (;;) {
                  if (f.tokens.next.id === "(end)") G("E027", f.tokens.next, e.line);
                  else {
                    if (f.tokens.next.id === "]") {
                      K("W094", f.tokens.curr);
                      break
                    }
                    f.tokens.next.id === "," && G("E028", f.tokens.next)
                  }
                  fn();
                  if (f.tokens.next.id !== ",") break;
                  rt(",")
                }
              rt("]")
            }
            switch (f.tokens.next.id) {
              case "{":
                e();
                break;
              case "[":
                t();
                break;
              case "true":
              case "false":
              case "null":
              case "(number)":
              case "(string)":
                rt();
                break;
              case "-":
                rt("-"), rt("(number)");
                break;
              default:
                G("E003", f.tokens.next)
            }
          }
          var e, t, n = {
              "<": !0,
              "<=": !0,
              "==": !0,
              "===": !0,
              "!==": !0,
              "!=": !0,
              ">": !0,
              ">=": !0,
              "+": !0,
              "-": !0,
              "*": !0,
              "/": !0,
              "%": !0
            },
            h = {
              asi: !0,
              bitwise: !0,
              boss: !0,
              browser: !0,
              camelcase: !0,
              couch: !0,
              curly: !0,
              debug: !0,
              devel: !0,
              dojo: !0,
              eqeqeq: !0,
              eqnull: !0,
              notypeof: !0,
              es3: !0,
              es5: !0,
              esnext: !0,
              moz: !0,
              evil: !0,
              expr: !0,
              forin: !0,
              funcscope: !0,
              globalstrict: !0,
              immed: !0,
              iterator: !0,
              jasmine: !0,
              jquery: !0,
              lastsemic: !0,
              laxbreak: !0,
              laxcomma: !0,
              loopfunc: !0,
              mootools: !0,
              multistr: !0,
              freeze: !0,
              newcap: !0,
              noarg: !0,
              node: !0,
              noempty: !0,
              nonbsp: !0,
              nonew: !0,
              nonstandard: !0,
              phantom: !0,
              plusplus: !0,
              proto: !0,
              prototypejs: !0,
              qunit: !0,
              rhino: !0,
              shelljs: !0,
              typed: !0,
              undef: !0,
              scripturl: !0,
              strict: !0,
              sub: !0,
              supernew: !0,
              validthis: !0,
              withstmt: !0,
              worker: !0,
              wsh: !0,
              yui: !0,
              mocha: !0,
              noyield: !0,
              onecase: !0,
              regexp: !0,
              regexdash: !0
            },
            p = {
              maxlen: !1,
              indent: !1,
              maxerr: !1,
              predef: !1,
              globals: !1,
              quotmark: !1,
              scope: !1,
              maxstatements: !1,
              maxdepth: !1,
              maxparams: !1,
              maxcomplexity: !1,
              shadow: !1,
              unused: !0,
              latedef: !1,
              ignore: !1
            },
            d = {
              bitwise: !0,
              forin: !0,
              newcap: !0,
              plusplus: !0,
              regexp: !0,
              undef: !0,
              eqeqeq: !0,
              strict: !0
            },
            v = {
              eqeq: "eqeqeq",
              windows: "wsh",
              sloppy: "strict"
            },
            m = {
              nomen: !0,
              onevar: !0,
              passfail: !0,
              white: !0,
              gcl: !0,
              smarttabs: !0,
              trailing: !0
            },
            g, y, b = ["closure", "exception", "global", "label", "outer", "unused", "var"],
            w, E, S, x, T, N, C, k, L, A, O, M, D, P, H, B, j = [],
            F = new i.EventEmitter;
          gt("(number)", function() {
            return this
          }), gt("(string)", function() {
            return this
          }), gt("(template)", function() {
            return this
          }), f.syntax["(identifier)"] = {
            type: "(identifier)",
            lbp: 0,
            identifier: !0,
            nud: function() {
              var t = this.value,
                n = D[t],
                r, i;
              typeof n == "function" ? n = undefined : !w["(blockscope)"].current.has(t) && typeof n == "boolean" && (r = w, w = E[0], et(t, {
                type: "var"
              }), n = w, w = r), i = w["(blockscope)"].getlabel(t);
              if (w === n || i) switch (i ? i[t]["(type)"] : w[t]) {
                  case "unused":
                    i ? i[t]["(type)"] = "var" : w[t] = "var";
                    break;
                  case "unction":
                    i ? i[t]["(type)"] = "function" : w[t] = "function", this["function"] = !0;
                    break;
                  case "const":
                    Xt(w, t, {
                      unused: !1
                    });
                    break;
                  case "function":
                    this["function"] = !0;
                    break;
                  case "label":
                    K("W037", f.tokens.curr, t)
                } else if (w["(global)"]) typeof M[t] != "boolean" && (e !== "typeof" && e !== "delete" || f.tokens.next && (f.tokens.next.value === "." || f.tokens.next.value === "[")) && (w["(comparray)"].check(t) || $(w, "W117", f.tokens.curr, t)), qt(f.tokens.curr);
                else switch (w[t]) {
                  case "closure":
                  case "function":
                  case "var":
                  case "unused":
                    K("W038", f.tokens.curr, t);
                    break;
                  case "label":
                    K("W037", f.tokens.curr, t);
                    break;
                  case "outer":
                  case "global":
                    break;
                  default:
                    if (n === !0) w[t] = !0;
                    else if (n === null) K("W039", f.tokens.curr, t), qt(f.tokens.curr);
                    else if (typeof n != "object")(e !== "typeof" && e !== "delete" || f.tokens.next && (f.tokens.next.value === "." || f.tokens.next.value === "[")) && $(w, "W117", f.tokens.curr, t), w[t] = !0, qt(f.tokens.curr);
                    else switch (n[t]) {
                      case "function":
                      case "unction":
                        this["function"] = !0, n[t] = "closure", w[t] = n["(global)"] ? "global" : "outer";
                        break;
                      case "var":
                      case "unused":
                        n[t] = "closure", w[t] = n["(global)"] ? "global" : "outer";
                        break;
                      case "const":
                        Xt(n, t, {
                          unused: !1
                        });
                        break;
                      case "closure":
                        w[t] = n["(global)"] ? "global" : "outer";
                        break;
                      case "label":
                        K("W037", f.tokens.curr, t)
                    }
                }
                return this
            },
            led: function() {
              G("E033", f.tokens.next, f.tokens.next.value)
            }
          }, gt("(regexp)", function() {
            return this
          }), ht("(endline)"), ht("(begin)"), ht("(end)").reach = !0, ht("(error)").reach = !0, ht("}").reach = !0, ht(")"), ht("]"), ht('"').reach = !0, ht("'").reach = !0, ht(";"), ht(":").reach = !0, ht("#"), yt("else"), yt("case").reach = !0, yt("catch"), yt("default").reach = !0, yt("finally"), wt("arguments", function(e) {
            f.directive["use strict"] && w["(global)"] && K("E008", e)
          }), wt("eval"), wt("false"), wt("Infinity"), wt("null"), wt("this", function(e) {
            f.directive["use strict"] && !f.option.validthis && (w["(statement)"] && w["(name)"].charAt(0) > "Z" || w["(global)"]) && K("W040", e)
          }), wt("true"), wt("undefined"), kt("=", "assign", 20), kt("+=", "assignadd", 20), kt("-=", "assignsub", 20), kt("*=", "assignmult", 20), kt("/=", "assigndiv", 20).nud = function() {
            G("E014")
          }, kt("%=", "assignmod", 20), At("&=", "assignbitand", 20), At("|=", "assignbitor", 20), At("^=", "assignbitxor", 20), At("<<=", "assignshiftleft", 20), At(">>=", "assignshiftright", 20), At(">>>=", "assignshiftrightunsigned", 20), Et(",", function(e, t) {
            var n;
            t.exprs = [e];
            if (!lt({
                peek: !0
              })) return t;
            for (;;) {
              if (!(n = ot(10))) break;
              t.exprs.push(n);
              if (f.tokens.next.value !== "," || !lt()) break
            }
            return t
          }, 10, !0), Et("?", function(e, t) {
            return Qt(), t.left = e, t.right = ot(10), rt(":"), t["else"] = ot(10), t
          }, 30);
          var Rt = 40;
          Et("||", function(e, t) {
              return Qt(), t.left = e, t.right = ot(Rt), t
            }, Rt), Et("&&", "and", 50), Lt("|", "bitor", 70), Lt("^", "bitxor", 80), Lt("&", "bitand", 90), xt("==", function(e, t) {
              var n = f.option.eqnull && (e.value === "null" || t.value === "null");
              switch (!0) {
                case !n && f.option.eqeqeq:
                  this.from = this.character, K("W116", this, "===", "==");
                  break;
                case Tt(e):
                  K("W041", this, "===", e.value);
                  break;
                case Tt(t):
                  K("W041", this, "===", t.value);
                  break;
                case Nt(t, e):
                  K("W122", this, t.value);
                  break;
                case Nt(e, t):
                  K("W122", this, e.value)
              }
              return this
            }), xt("===", function(e, t) {
              return Nt(t, e) ? K("W122", this, t.value) : Nt(e, t) && K("W122", this, e.value), this
            }), xt("!=", function(e, t) {
              var n = f.option.eqnull && (e.value === "null" || t.value === "null");
              return !n && f.option.eqeqeq ? (this.from = this.character, K("W116", this, "!==", "!=")) : Tt(e) ? K("W041", this, "!==", e.value) : Tt(t) ? K("W041", this, "!==", t.value) : Nt(t, e) ? K("W122", this, t.value) : Nt(e, t) && K("W122", this, e.value), this
            }), xt("!==", function(e, t) {
              return Nt(t, e) ? K("W122", this, t.value) : Nt(e, t) && K("W122", this, e.value), this
            }), xt("<"), xt(">"), xt("<="), xt(">="), Lt("<<", "shiftleft", 120), Lt(">>", "shiftright", 120), Lt(">>>", "shiftrightunsigned", 120), Et("in", "in", 120), Et("instanceof", "instanceof", 120), Et("+", function(e, t) {
              var n = ot(130);
              return e && n && e.id === "(string)" && n.id === "(string)" ? (e.value += n.value, e.character = n.character, !f.option.scripturl && a.javascriptURL.test(e.value) && K("W050", e), e) : (t.left = e, t.right = n, t)
            }, 130), mt("+", "num"), mt("+++", function() {
              return K("W007"), this.right = ot(150), this.arity = "unary", this
            }), Et("+++", function(e) {
              return K("W007"), this.left = e, this.right = ot(130), this
            }, 130), Et("-", "sub", 130), mt("-", "neg"), mt("---", function() {
              return K("W006"), this.right = ot(150), this.arity = "unary", this
            }), Et("---", function(e) {
              return K("W006"), this.left = e, this.right = ot(130), this
            }, 130), Et("*", "mult", 140), Et("/", "div", 140), Et("%", "mod", 140), Ot("++", "postinc"), mt("++", "preinc"), f.syntax["++"].exps = !0, Ot("--", "postdec"), mt("--", "predec"), f.syntax["--"].exps = !0, mt("delete", function() {
              var e = ot(10);
              return (!e || e.id !== "." && e.id !== "[") && K("W051"), this.first = e, this
            }).exps = !0, mt("~", function() {
              return f.option.bitwise && K("W052", this, "~"), ot(150), this
            }), mt("...", function() {
              return f.option.inESNext() || K("W104", this, "spread/rest operator"), f.tokens.next.identifier || G("E030", f.tokens.next, f.tokens.next.value), ot(150), this
            }), mt("!", function() {
              return this.right = ot(150), this.arity = "unary", this.right || V("E041", this.line || 0), n[this.right.id] === !0 && K("W018", this, "!"), this
            }), mt("typeof", "typeof"), mt("new", function() {
              var e = ot(155),
                t;
              if (e && e.id !== "function")
                if (e.identifier) {
                  e["new"] = !0;
                  switch (e.value) {
                    case "Number":
                    case "String":
                    case "Boolean":
                    case "Math":
                    case "JSON":
                      K("W053", f.tokens.prev, e.value);
                      break;
                    case "Function":
                      f.option.evil || K("W054");
                      break;
                    case "Date":
                    case "RegExp":
                    case "this":
                      break;
                    default:
                      e.id !== "function" && (t = e.value.substr(0, 1), f.option.newcap && (t < "A" || t > "Z") && !r.has(S, e.value) && K("W055", f.tokens.curr))
                  }
                } else e.id !== "." && e.id !== "[" && e.id !== "(" && K("W056", f.tokens.curr);
              else f.option.supernew || K("W057", this);
              return f.tokens.next.id !== "(" && !f.option.supernew && K("W058", f.tokens.curr, f.tokens.curr.value), this.first = e, this
            }), f.syntax["new"].exps = !0, mt("void").exps = !0, Et(".", function(e, t) {
              var n = _t(!1, !0);
              return typeof n == "string" && It(n), t.left = e, t.right = n, n && n === "hasOwnProperty" && f.tokens.next.value === "=" && K("W001"), !e || e.value !== "arguments" || n !== "callee" && n !== "caller" ? !f.option.evil && e && e.value === "document" && (n === "write" || n === "writeln") && K("W060", e) : f.option.noarg ? K("W059", e, n) : f.directive["use strict"] && G("E008"), !f.option.evil && (n === "eval" || n === "execScript") && K("W061"), t
            }, 160, !0), Et("(", function(e, t) {
              f.option.immed && e && !e.immed && e.id === "function" && K("W062");
              var n = 0,
                r = [];
              e && e.type === "(identifier)" && e.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/) && "Number String Boolean Date Object Error".indexOf(e.value) === -1 && (e.value === "Math" ? K("W063", e) : f.option.newcap && K("W064", e));
              if (f.tokens.next.id !== ")")
                for (;;) {
                  r[r.length] = ot(10), n += 1;
                  if (f.tokens.next.id !== ",") break;
                  lt()
                }
              return rt(")"), typeof e == "object" && (f.option.inES3() && e.value === "parseInt" && n === 1 && K("W065", f.tokens.curr), f.option.evil || (e.value === "eval" || e.value === "Function" || e.value === "execScript" ? (K("W061", e), r[0] && [0].id === "(string)" && Z(e, r[0].value)) : !r[0] || r[0].id !== "(string)" || e.value !== "setTimeout" && e.value !== "setInterval" ? r[0] && r[0].id === "(string)" && e.value === "." && e.left.value === "window" && (e.right === "setTimeout" || e.right === "setInterval") && (K("W066", e), Z(e, r[0].value)) : (K("W066", e), Z(e, r[0].value))), !e.identifier && e.id !== "." && e.id !== "[" && e.id !== "(" && e.id !== "&&" && e.id !== "||" && e.id !== "?" && K("W067", e)), t.left = e, t
            }, 155, !0).exps = !0, mt("(", function() {
              var e, t = [],
                n, i, s = 0,
                o, u = 1;
              do n = nt(s), n.value === "(" ? u += 1 : n.value === ")" && (u -= 1), s += 1, i = nt(s); while ((u !== 0 || n.value !== ")") && i.value !== "=>" && i.value !== ";" && i.type !== "(end)");
              f.tokens.next.id === "function" && (f.tokens.next.immed = !0);
              var a = [];
              if (f.tokens.next.id !== ")")
                for (;;) {
                  if (i.value === "=>" && r.contains(["{", "["], f.tokens.next.value)) {
                    e = f.tokens.next, e.left = Yt(), t.push(e);
                    for (var l in e.left) a.push(e.left[l].token)
                  } else a.push(ot(10));
                  if (f.tokens.next.id !== ",") break;
                  lt()
                }
              rt(")", this), f.option.immed && a[0] && a[0].id === "function" && f.tokens.next.id !== "(" && (f.tokens.next.id !== "." || nt().value !== "call" && nt().value !== "apply") && K("W068", this);
              if (f.tokens.next.value === "=>") return a;
              if (!a.length) return;
              return a.length > 1 ? (o = Object.create(f.syntax[","]), o.exprs = a) : o = a[0], o && (o.paren = !0), o
            }), St("=>"), Et("[", function(e, t) {
              var n = ot(10),
                r;
              return n && n.type === "(string)" && (!f.option.evil && (n.value === "eval" || n.value === "execScript") && K("W061", t), It(n.value), !f.option.sub && a.identifier.test(n.value) && (r = f.syntax[n.value], (!r || !U(r)) && K("W069", f.tokens.prev, n.value))), rt("]", t), n && n.value === "hasOwnProperty" && f.tokens.next.value === "=" && K("W001"), t.left = e, t.right = n, t
            }, 160, !0), mt("[", function() {
              var e = on(!0);
              if (e.isCompArray) return f.option.inESNext() || K("W119", f.tokens.curr, "array comprehension"), Ut();
              e.isDestAssign && !f.option.inESNext() && K("W104", f.tokens.curr, "destructuring assignment");
              var t = f.tokens.curr.line !== f.tokens.next.line;
              this.first = [], t && (N += f.option.indent, f.tokens.next.from === N + f.option.indent && (N += f.option.indent));
              while (f.tokens.next.id !== "(end)") {
                while (f.tokens.next.id === ",") f.option.inES5() || K("W070"), rt(",");
                if (f.tokens.next.id === "]") break;
                this.first.push(ot(10));
                if (f.tokens.next.id !== ",") break;
                lt({
                  allowTrailing: !0
                });
                if (f.tokens.next.id === "]" && !f.option.inES5(!0)) {
                  K("W070", f.tokens.curr);
                  break
                }
              }
              return t && (N -= f.option.indent), rt("]", this), this
            }, 160),
            function(e) {
              e.nud = function(e) {
                function c(e, t) {
                  a[e] && r.has(a, e) ? K("W075", f.tokens.next, i) : a[e] = {}, a[e].basic = !0, a[e].basictkn = t
                }

                function h(e, t) {
                  a[e] && r.has(a, e) ? (a[e].basic || a[e].setter) && K("W075", f.tokens.next, i) : a[e] = {}, a[e].setter = !0, a[e].setterToken = t
                }

                function p(e) {
                  a[e] && r.has(a, e) ? (a[e].basic || a[e].getter) && K("W075", f.tokens.next, i) : a[e] = {}, a[e].getter = !0, a[e].getterToken = f.tokens.curr
                }
                var t, n, i, s, o, u, a = {},
                  l = "";
                t = f.tokens.curr.line !== f.tokens.next.line, t && (N += f.option.indent, f.tokens.next.from === N + f.option.indent && (N += f.option.indent));
                for (;;) {
                  if (f.tokens.next.id === "}") break;
                  e && f.tokens.next.value === "static" && (rt("static"), l = "static ");
                  if (f.tokens.next.value === "get" && nt().id !== ":") rt("get"), f.option.inES5(!e) || G("E034"), i = zt(), !i && !f.option.inESNext() && G("E035"), e && i === "constructor" && G("E049", f.tokens.next, "class getter method", i), i && p(l + i), o = f.tokens.next, n = Jt(), s = n["(params)"], i && s && K("W076", o, s[0], i);
                  else if (f.tokens.next.value === "set" && nt().id !== ":") rt("set"), f.option.inES5(!e) || G("E034"), i = zt(), !i && !f.option.inESNext() && G("E035"), e && i === "constructor" && G("E049", f.tokens.next, "class setter method", i), i && h(l + i, f.tokens.next), o = f.tokens.next, n = Jt(), s = n["(params)"], i && (!s || s.length !== 1) && K("W077", o, i);
                  else {
                    u = !1, f.tokens.next.value === "*" && f.tokens.next.type === "(punctuator)" && (f.option.inESNext() || K("W104", f.tokens.next, "generator functions"), rt("*"), u = !0), i = zt(), c(l + i, f.tokens.next);
                    if (typeof i != "string") break;
                    f.tokens.next.value === "(" ? (f.option.inESNext() || K("W104", f.tokens.curr, "concise methods"), Jt(i, undefined, u)) : e || (rt(":"), ot(10))
                  }
                  e && i === "prototype" && G("E049", f.tokens.next, "class method", i), It(i);
                  if (e) {
                    l = "";
                    continue
                  }
                  if (f.tokens.next.id !== ",") break;
                  lt({
                    allowTrailing: !0,
                    property: !0
                  }), f.tokens.next.id === "," ? K("W070", f.tokens.curr) : f.tokens.next.id === "}" && !f.option.inES5(!0) && K("W070", f.tokens.curr)
                }
                t && (N -= f.option.indent), rt("}", this);
                if (f.option.inES5())
                  for (var d in a) r.has(a, d) && a[d].setter && !a[d].getter && K("W078", a[d].setterToken);
                return this
              }, e.fud = function() {
                G("E036", f.tokens.curr)
              }
            }(ht("{"));
          var en = pt("const", function(e) {
            var t, n, i;
            f.option.inESNext() || K("W104", f.tokens.curr, "const"), this.first = [];
            for (;;) {
              var s = [];
              r.contains(["{", "["], f.tokens.next.value) ? (t = Yt(), i = !1) : (t = [{
                id: _t(),
                token: f.tokens.curr
              }], i = !0);
              for (var o in t) t.hasOwnProperty(o) && (o = t[o], w[o.id] === "const" && K("E011", null, o.id), w["(global)"] && M[o.id] === !1 && K("W079", o.token, o.id), o.id && (et(o.id, {
                token: o.token,
                type: "const",
                unused: !0
              }), s.push(o.token)));
              if (e) break;
              this.first = this.first.concat(s), f.tokens.next.id !== "=" && K("E012", f.tokens.curr, f.tokens.curr.value), f.tokens.next.id === "=" && (rt("="), f.tokens.next.id === "undefined" && K("W080", f.tokens.prev, f.tokens.prev.value), nt(0).id === "=" && f.tokens.next.identifier && K("W120", f.tokens.next, f.tokens.next.value), n = ot(10), i ? t[0].first = n : Zt(s, n));
              if (f.tokens.next.id !== ",") break;
              lt()
            }
            return this
          });
          en.exps = !0;
          var tn = pt("var", function(e) {
            var t, n, i;
            this.first = [];
            for (;;) {
              var s = [];
              r.contains(["{", "["], f.tokens.next.value) ? (t = Yt(), n = !1) : (t = [{
                id: _t(),
                token: f.tokens.curr
              }], n = !0);
              for (var o in t) t.hasOwnProperty(o) && (o = t[o], f.option.inESNext() && w[o.id] === "const" && K("E011", null, o.id), w["(global)"] && M[o.id] === !1 && K("W079", o.token, o.id), o.id && (et(o.id, {
                type: "unused",
                token: o.token
              }), s.push(o.token)));
              if (e) break;
              this.first = this.first.concat(s), f.tokens.next.id === "=" && (rt("="), f.tokens.next.id === "undefined" && K("W080", f.tokens.prev, f.tokens.prev.value), nt(0).id === "=" && f.tokens.next.identifier && K("W120", f.tokens.next, f.tokens.next.value), i = ot(10), n ? t[0].first = i : Zt(s, i));
              if (f.tokens.next.id !== ",") break;
              lt()
            }
            return this
          });
          tn.exps = !0;
          var nn = pt("let", function(e) {
            var t, n, i, s;
            f.option.inESNext() || K("W104", f.tokens.curr, "let"), f.tokens.next.value === "(" ? (f.option.inMoz(!0) || K("W118", f.tokens.next, "let block"), rt("("), w["(blockscope)"].stack(), s = !0) : w["(nolet)"] && G("E048", f.tokens.curr), this.first = [];
            for (;;) {
              var o = [];
              r.contains(["{", "["], f.tokens.next.value) ? (t = Yt(), n = !1) : (t = [{
                id: _t(),
                token: f.tokens.curr.value
              }], n = !0);
              for (var u in t) t.hasOwnProperty(u) && (u = t[u], f.option.inESNext() && w[u.id] === "const" && K("E011", null, u.id), w["(global)"] && M[u.id] === !1 && K("W079", u.token, u.id), u.id && !w["(nolet)"] && (et(u.id, {
                type: "unused",
                token: u.token,
                islet: !0
              }), o.push(u.token)));
              if (e) break;
              this.first = this.first.concat(o), f.tokens.next.id === "=" && (rt("="), f.tokens.next.id === "undefined" && K("W080", f.tokens.prev, f.tokens.prev.value), nt(0).id === "=" && f.tokens.next.identifier && K("W120", f.tokens.next, f.tokens.next.value), i = ot(10), n ? t[0].first = i : Zt(o, i));
              if (f.tokens.next.id !== ",") break;
              lt()
            }
            return s && (rt(")"), Ft(!0, !0), this.block = !0, w["(blockscope)"].unstack()), this
          });
          nn.exps = !0, dt("class", function() {
              return rn.call(this, !0)
            }), dt("function", function() {
              var e = !1;
              f.tokens.next.value === "*" && (rt("*"), f.option.inESNext(!0) ? e = !0 : K("W119", f.tokens.curr, "function*")), T && K("W082", f.tokens.curr);
              var t = _t();
              return w[t] === "const" && K("E011", null, t), et(t, {
                type: "unction",
                token: f.tokens.curr
              }), Jt(t, {
                statement: !0
              }, e), f.tokens.next.id === "(" && f.tokens.next.line === f.tokens.curr.line && G("E039"), this
            }), mt("function", function() {
              var e = !1;
              f.tokens.next.value === "*" && (f.option.inESNext() || K("W119", f.tokens.curr, "function*"), rt("*"), e = !0);
              var t = Mt();
              return Jt(t, undefined, e), !f.option.loopfunc && w["(loopage)"] && K("W083"), this
            }), dt("if", function() {
              var e = f.tokens.next;
              return Qt(), f.condition = !0, rt("("), Gt(ot(0)), rt(")", e), f.condition = !1, Ft(!0, !0), f.tokens.next.id === "else" && (rt("else"), f.tokens.next.id === "if" || f.tokens.next.id === "switch" ? Ht(!0) : Ft(!0, !0)), this
            }), dt("try", function() {
              function t() {
                var e = D,
                  t;
                rt("catch"), rt("("), D = Object.create(e), t = f.tokens.next.value, f.tokens.next.type !== "(identifier)" && (t = null, K("E030", f.tokens.next, t)), rt(), w = $t("(catch)", f.tokens.next, D, {
                  "(context)": w,
                  "(breakage)": w["(breakage)"],
                  "(loopage)": w["(loopage)"],
                  "(statement)": !1,
                  "(catch)": !0
                }), t && et(t, {
                  type: "exception"
                }), f.tokens.next.value === "if" && (f.option.inMoz(!0) || K("W118", f.tokens.curr, "catch filter"), rt("if"), ot(0)), rt(")"), f.tokens.curr.funct = w, E.push(w), Ft(!1), D = e, w["(last)"] = f.tokens.curr.line, w["(lastcharacter)"] = f.tokens.curr.character, w = w["(context)"]
              }
              var e;
              Ft(!0);
              while (f.tokens.next.id === "catch") Qt(), e && !f.option.inMoz(!0) && K("W118", f.tokens.next, "multiple catch blocks"), t(), e = !0;
              if (f.tokens.next.id === "finally") {
                rt("finally"), Ft(!0);
                return
              }
              return e || G("E021", f.tokens.next, "catch", f.tokens.next.value), this
            }), dt("while", function() {
              var e = f.tokens.next;
              return w["(breakage)"] += 1, w["(loopage)"] += 1, Qt(), rt("("), Gt(ot(0)), rt(")", e), Ft(!0, !0), w["(breakage)"] -= 1, w["(loopage)"] -= 1, this
            }).labelled = !0, dt("with", function() {
              var e = f.tokens.next;
              return f.directive["use strict"] ? G("E010", f.tokens.curr) : f.option.withstmt || K("W085", f.tokens.curr), rt("("), ot(0), rt(")", e), Ft(!0, !0), this
            }), dt("switch", function() {
              var e = f.tokens.next,
                t = !1,
                n = !1;
              w["(breakage)"] += 1, rt("("), Gt(ot(0)), rt(")", e), e = f.tokens.next, rt("{"), f.tokens.next.from === N && (n = !0), n || (N += f.option.indent), this.cases = [];
              for (;;) switch (f.tokens.next.id) {
                case "case":
                  switch (w["(verb)"]) {
                    case "yield":
                    case "break":
                    case "case":
                    case "continue":
                    case "return":
                    case "switch":
                    case "throw":
                      break;
                    default:
                      a.fallsThrough.test(f.lines[f.tokens.next.line - 2]) || K("W086", f.tokens.curr, "case")
                  }
                  rt("case"), this.cases.push(ot(0)), Qt(), t = !0, rt(":"), w["(verb)"] = "case";
                  break;
                case "default":
                  switch (w["(verb)"]) {
                    case "yield":
                    case "break":
                    case "continue":
                    case "return":
                    case "throw":
                      break;
                    default:
                      this.cases.length && (a.fallsThrough.test(f.lines[f.tokens.next.line - 2]) || K("W086", f.tokens.curr, "default"))
                  }
                  rt("default"), t = !0, rt(":");
                  break;
                case "}":
                  n || (N -= f.option.indent), rt("}", e), w["(breakage)"] -= 1, w["(verb)"] = undefined;
                  return;
                case "(end)":
                  G("E023", f.tokens.next, "}");
                  return;
                default:
                  N += f.option.indent;
                  if (t) switch (f.tokens.curr.id) {
                    case ",":
                      G("E040");
                      return;
                    case ":":
                      t = !1, Bt();
                      break;
                    default:
                      G("E025", f.tokens.curr);
                      return
                  } else {
                    if (f.tokens.curr.id !== ":") {
                      G("E021", f.tokens.next, "case", f.tokens.next.value);
                      return
                    }
                    rt(":"), G("E024", f.tokens.curr, ":"), Bt()
                  }
                  N -= f.option.indent
              }
            }).labelled = !0, pt("debugger", function() {
              return f.option.debug || K("W087", this), this
            }).exps = !0,
            function() {
              var e = pt("do", function() {
                w["(breakage)"] += 1, w["(loopage)"] += 1, Qt(), this.first = Ft(!0, !0), rt("while");
                var e = f.tokens.next;
                return rt("("), Gt(ot(0)), rt(")", e), w["(breakage)"] -= 1, w["(loopage)"] -= 1, this
              });
              e.labelled = !0, e.exps = !0
            }(), dt("for", function() {
              var e, t = f.tokens.next,
                n = !1,
                i = null;
              t.value === "each" && (i = t, rt("each"), f.option.inMoz(!0) || K("W118", f.tokens.curr, "for each")), w["(breakage)"] += 1, w["(loopage)"] += 1, Qt(), rt("(");
              var s, o = 0,
                u = ["in", "of"];
              do s = nt(o), ++o; while (!r.contains(u, s.value) && s.value !== ";" && s.type !== "(end)");
              if (r.contains(u, s.value)) {
                !f.option.inESNext() && s.value === "of" && G("W104", s, "for of");
                if (f.tokens.next.id === "var") rt("var"), f.syntax["var"].fud.call(f.syntax["var"].fud, !0);
                else if (f.tokens.next.id === "let") rt("let"), n = !0, w["(blockscope)"].stack(), f.syntax.let.fud.call(f.syntax.let.fud, !0);
                else if (!f.tokens.next.identifier) G("E030", f.tokens.next, f.tokens.next.type), rt();
                else {
                  switch (w[f.tokens.next.value]) {
                    case "unused":
                      w[f.tokens.next.value] = "var";
                      break;
                    case "var":
                      break;
                    default:
                      w["(blockscope)"].getlabel(f.tokens.next.value) || K("W088", f.tokens.next, f.tokens.next.value)
                  }
                  rt()
                }
                rt(s.value), ot(20), rt(")", t), e = Ft(!0, !0), f.option.forin && e && (e.length > 1 || typeof e[0] != "object" || e[0].value !== "if") && K("W089", this), w["(breakage)"] -= 1, w["(loopage)"] -= 1
              } else {
                i && G("E045", i);
                if (f.tokens.next.id !== ";")
                  if (f.tokens.next.id === "var") rt("var"), f.syntax["var"].fud.call(f.syntax["var"].fud);
                  else if (f.tokens.next.id === "let") rt("let"), n = !0, w["(blockscope)"].stack(), f.syntax.let.fud.call(f.syntax.let.fud);
                else
                  for (;;) {
                    ot(0, "for");
                    if (f.tokens.next.id !== ",") break;
                    lt()
                  }
                at(f.tokens.curr), rt(";"), f.tokens.next.id !== ";" && Gt(ot(0)), at(f.tokens.curr), rt(";"), f.tokens.next.id === ";" && G("E021", f.tokens.next, ")", ";");
                if (f.tokens.next.id !== ")")
                  for (;;) {
                    ot(0, "for");
                    if (f.tokens.next.id !== ",") break;
                    lt()
                  }
                rt(")", t), Ft(!0, !0), w["(breakage)"] -= 1, w["(loopage)"] -= 1
              }
              return n && w["(blockscope)"].unstack(), this
            }).labelled = !0, pt("break", function() {
              var e = f.tokens.next.value;
              return w["(breakage)"] === 0 && K("W052", f.tokens.next, this.value), f.option.asi || at(this), f.tokens.next.id !== ";" && !f.tokens.next.reach && f.tokens.curr.line === f.tokens.next.line && (w[e] !== "label" ? K("W090", f.tokens.next, e) : D[e] !== w && K("W091", f.tokens.next, e), this.first = f.tokens.next, rt()), Dt("break"), this
            }).exps = !0, pt("continue", function() {
              var e = f.tokens.next.value;
              return w["(breakage)"] === 0 && K("W052", f.tokens.next, this.value), f.option.asi || at(this), f.tokens.next.id !== ";" && !f.tokens.next.reach ? f.tokens.curr.line === f.tokens.next.line && (w[e] !== "label" ? K("W090", f.tokens.next, e) : D[e] !== w && K("W091", f.tokens.next, e), this.first = f.tokens.next, rt()) : w["(loopage)"] || K("W052", f.tokens.next, this.value), Dt("continue"), this
            }).exps = !0, pt("return", function() {
              return this.line === f.tokens.next.line ? f.tokens.next.id !== ";" && !f.tokens.next.reach && (this.first = ot(0), this.first && this.first.type === "(punctuator)" && this.first.value === "=" && !this.first.paren && !f.option.boss && Q("W093", this.first.line, this.first.character)) : f.tokens.next.type === "(punctuator)" && ["[", "{", "+", "-"].indexOf(f.tokens.next.value) > -1 && at(this), Dt("return"), this
            }).exps = !0,
            function(e) {
              e.exps = !0, e.lbp = 25
            }(mt("yield", function() {
              var e = f.tokens.prev;
              return f.option.inESNext(!0) && !w["(generator)"] ? ("(catch)" !== w["(name)"] || !w["(context)"]["(generator)"]) && G("E046", f.tokens.curr, "yield") : f.option.inESNext() || K("W104", f.tokens.curr, "yield"), w["(generator)"] = "yielded", this.line === f.tokens.next.line || !f.option.inMoz(!0) ? (f.tokens.next.id !== ";" && !f.tokens.next.reach && f.tokens.next.nud && (ut(f.tokens.curr, f.tokens.next), this.first = ot(10), this.first.type === "(punctuator)" && this.first.value === "=" && !this.first.paren && !f.option.boss && Q("W093", this.first.line, this.first.character)), f.option.inMoz(!0) && f.tokens.next.id !== ")" && (e.lbp > 30 || !e.assign && !st() || e.id === "yield") && G("E050", this)) : f.option.asi || at(this), this
            })), pt("throw", function() {
              return at(this), this.first = ot(20), Dt("throw"), this
            }).exps = !0, pt("import", function() {
              f.option.inESNext() || K("W119", f.tokens.curr, "import");
              if (f.tokens.next.type === "(string)") return rt("(string)"), this;
              if (f.tokens.next.identifier) this.name = _t(), et(this.name, {
                type: "unused",
                token: f.tokens.curr
              });
              else {
                rt("{");
                for (;;) {
                  if (f.tokens.next.value === "}") {
                    rt("}");
                    break
                  }
                  var e;
                  f.tokens.next.type === "default" ? (e = "default", rt("default")) : e = _t(), f.tokens.next.value === "as" && (rt("as"), e = _t()), et(e, {
                    type: "unused",
                    token: f.tokens.curr
                  });
                  if (f.tokens.next.value !== ",") {
                    if (f.tokens.next.value === "}") {
                      rt("}");
                      break
                    }
                    G("E024", f.tokens.next, f.tokens.next.value);
                    break
                  }
                  rt(",")
                }
              }
              return rt("from"), rt("(string)"), this
            }).exps = !0, pt("export", function() {
              f.option.inESNext() || K("W119", f.tokens.curr, "export");
              if (f.tokens.next.type === "default") {
                rt("default");
                if (f.tokens.next.id === "function" || f.tokens.next.id === "class") this.block = !0;
                return this.exportee = ot(10), this
              }
              if (f.tokens.next.value === "{") {
                rt("{");
                for (;;) {
                  y[_t()] = !0;
                  if (f.tokens.next.value !== ",") {
                    if (f.tokens.next.value === "}") {
                      rt("}");
                      break
                    }
                    G("E024", f.tokens.next, f.tokens.next.value);
                    break
                  }
                  rt(",")
                }
                return this
              }
              return f.tokens.next.id === "var" ? (rt("var"), y[f.tokens.next.value] = !0, f.syntax["var"].fud.call(f.syntax["var"].fud)) : f.tokens.next.id === "let" ? (rt("let"), y[f.tokens.next.value] = !0, f.syntax.let.fud.call(f.syntax.let.fud)) : f.tokens.next.id === "const" ? (rt("const"), y[f.tokens.next.value] = !0, f.syntax["const"].fud.call(f.syntax["const"].fud)) : f.tokens.next.id === "function" ? (this.block = !0, rt("function"), y[f.tokens.next.value] = !0, f.syntax["function"].fud()) : f.tokens.next.id === "class" ? (this.block = !0, rt("class"), y[f.tokens.next.value] = !0, f.syntax["class"].fud()) : G("E024", f.tokens.next, f.tokens.next.value), this
            }).exps = !0, bt("abstract"), bt("boolean"), bt("byte"), bt("char"), bt("class", {
              es5: !0,
              nud: rn
            }), bt("double"), bt("enum", {
              es5: !0
            }), bt("export", {
              es5: !0
            }), bt("extends", {
              es5: !0
            }), bt("final"), bt("float"), bt("goto"), bt("implements", {
              es5: !0,
              strictOnly: !0
            }), bt("import", {
              es5: !0
            }), bt("int"), bt("interface", {
              es5: !0,
              strictOnly: !0
            }), bt("long"), bt("native"), bt("package", {
              es5: !0,
              strictOnly: !0
            }), bt("private", {
              es5: !0,
              strictOnly: !0
            }), bt("protected", {
              es5: !0,
              strictOnly: !0
            }), bt("public", {
              es5: !0,
              strictOnly: !0
            }), bt("short"), bt("static", {
              es5: !0,
              strictOnly: !0
            }), bt("super", {
              es5: !0
            }), bt("synchronized"), bt("transient"), bt("volatile");
          var on = function() {
              var e, t, n = -1,
                i = 0,
                s = {};
              r.contains(["[", "{"], f.tokens.curr.value) && (i += 1);
              do {
                e = n === -1 ? f.tokens.next : nt(n), t = nt(n + 1), n += 1, r.contains(["[", "{"], e.value) ? i += 1 : r.contains(["]", "}"], e.value) && (i -= 1);
                if (e.identifier && e.value === "for" && i === 1) {
                  s.isCompArray = !0, s.notJson = !0;
                  break
                }
                if (r.contains(["}", "]"], e.value) && t.value === "=" && i === 0) {
                  s.isDestAssign = !0, s.notJson = !0;
                  break
                }
                e.value === ";" && (s.isBlock = !0, s.notJson = !0)
              } while (i > 0 && e.id !== "(end)" && n < 15);
              return s
            },
            an = function() {
              function i(e) {
                var t = n.variables.filter(function(t) {
                  if (t.value === e) return t.undef = !1, e
                }).length;
                return t !== 0
              }

              function s(e) {
                var t = n.variables.filter(function(t) {
                  if (t.value === e && !t.undef) return t.unused === !0 && (t.unused = !1), e
                }).length;
                return t === 0
              }
              var e = function() {
                  this.mode = "use", this.variables = []
                },
                t = [],
                n;
              return {
                stack: function() {
                  n = new e, t.push(n)
                },
                unstack: function() {
                  n.variables.filter(function(e) {
                    e.unused && K("W098", e.token, e.value), e.undef && $(e.funct, "W117", e.token, e.value)
                  }), t.splice(-1, 1), n = t[t.length - 1]
                },
                setState: function(e) {
                  r.contains(["use", "define", "generate", "filter"], e) && (n.mode = e)
                },
                check: function(e) {
                  if (!n) return;
                  return n && n.mode === "use" ? (s(e) && n.variables.push({
                    funct: w,
                    token: f.tokens.curr,
                    value: e,
                    undef: !0,
                    unused: !1
                  }), !0) : n && n.mode === "define" ? (i(e) || n.variables.push({
                    funct: w,
                    token: f.tokens.curr,
                    value: e,
                    undef: !1,
                    unused: !0
                  }), !0) : n && n.mode === "generate" ? ($(w, "W117", f.tokens.curr, e), !0) : n && n.mode === "filter" ? (s(e) && $(w, "W117", f.tokens.curr, e), !0) : !1
                }
              }
            },
            ln = function() {
              function n() {
                for (var t in e)
                  if (e[t]["(type)"] === "unused" && f.option.unused) {
                    var n = e[t]["(token)"],
                      r = n.line,
                      i = n.character;
                    Q("W098", r, i, t)
                  }
              }
              var e = {},
                t = [e];
              return {
                stack: function() {
                  e = {}, t.push(e)
                },
                unstack: function() {
                  n(), t.splice(t.length - 1, 1), e = r.last(t)
                },
                getlabel: function(e) {
                  for (var n = t.length - 1; n >= 0; --n)
                    if (r.has(t[n], e) && !t[n][e]["(shadowed)"]) return t[n]
                },
                shadow: function(e) {
                  for (var n = t.length - 1; n >= 0; n--) r.has(t[n], e) && (t[n][e]["(shadowed)"] = !0)
                },
                unshadow: function(e) {
                  for (var n = t.length - 1; n >= 0; n--) r.has(t[n], e) && (t[n][e]["(shadowed)"] = !1)
                },
                current: {
                  has: function(t) {
                    return r.has(e, t)
                  },
                  add: function(t, n, r) {
                    e[t] = {
                      "(type)": n,
                      "(token)": r,
                      "(shadowed)": !1
                    }
                  }
                }
              }
            },
            cn = function(e, n, i) {
              function v(e, t) {
                if (!e) return;
                !Array.isArray(e) && typeof e == "object" && (e = Object.keys(e)), e.forEach(t)
              }
              var o, a, l, h, p = {},
                d = {};
              n = r.clone(n), f.reset(), n && n.scope ? c.scope = n.scope : (c.errors = [], c.undefs = [], c.internals = [], c.blacklist = {}, c.scope = "(main)"), M = Object.create(null), W(M, s.ecmaIdentifiers), W(M, s.reservedVars), W(M, i || {}), g = Object.create(null), y = Object.create(null);
              if (n) {
                v(n.predef || null, function(e) {
                  var t, r;
                  e[0] === "-" ? (t = e.slice(1), c.blacklist[t] = t) : (r = Object.getOwnPropertyDescriptor(n.predef, e), M[e] = r ? r.value : !1)
                }), v(n.exported || null, function(e) {
                  y[e] = !0
                }), delete n.predef, delete n.exported, h = Object.keys(n);
                for (l = 0; l < h.length; l++) /^-W\d{3}$/g.test(h[l]) ? d[h[l].slice(1)] = !0 : (p[h[l]] = n[h[l]], h[l] === "newcap" && n[h[l]] === !1 && (p["(explicitNewcap)"] = !0))
              }
              f.option = p, f.ignored = d, f.option.indent = f.option.indent || 4, f.option.maxerr = f.option.maxerr || 50, N = 1, S = Object.create(M), D = S, w = $t("(global)", null, D, {
                "(global)": !0,
                "(blockscope)": ln(),
                "(comparray)": an(),
                "(metrics)": Kt(f.tokens.next)
              }), E = [w], B = [], P = null, L = {}, A = null, x = {}, T = !1, C = [], H = [];
              if (!q(e) && !Array.isArray(e)) return Y("E004", 0), !1;
              t = {get isJSON() {
                  return f.jsonMode
                },
                getOption: function(e) {
                  return f.option[e] || null
                },
                getCache: function(e) {
                  return f.cache[e]
                },
                setCache: function(e, t) {
                  f.cache[e] = t
                },
                warn: function(e, t) {
                  Q.apply(null, [e, t.line, t.char].concat(t.data))
                },
                on: function(e, t) {
                  e.split(" ").forEach(function(e) {
                    F.on(e, t)
                  }.bind(this))
                }
              }, F.removeAllListeners(), (j || []).forEach(function(e) {
                e(t)
              }), f.tokens.prev = f.tokens.curr = f.tokens.next = f.syntax["(begin)"], k = new u(e), k.on("warning", function(e) {
                Q.apply(null, [e.code, e.line, e.character].concat(e.data))
              }), k.on("error", function(e) {
                Y.apply(null, [e.code, e.line, e.character].concat(e.data))
              }), k.on("fatal", function(e) {
                V("E041", e.line, e.from)
              }), k.on("Identifier", function(e) {
                F.emit("Identifier", e)
              }), k.on("String", function(e) {
                F.emit("String", e)
              }), k.on("Number", function(e) {
                F.emit("Number", e)
              }), k.start();
              for (var m in n) r.has(n, m) && I(m, f.tokens.curr);
              X(), W(M, i || {}), lt.first = !0;
              try {
                rt();
                switch (f.tokens.next.id) {
                  case "{":
                  case "[":
                    un();
                    break;
                  default:
                    jt(), f.directive["use strict"] && !f.option.globalstrict && !f.option.node && !f.option.phantom && K("W097", f.tokens.prev), Bt()
                }
                rt(f.tokens.next && f.tokens.next.value !== "." ? "(end)" : undefined), w["(blockscope)"].unstack();
                var b = function(e, t) {
                    do {
                      if (typeof t[e] == "string") return t[e] === "unused" ? t[e] = "var" : t[e] === "unction" && (t[e] = "closure"), !0;
                      t = t["(context)"]
                    } while (t);
                    return !1
                  },
                  O = function(e, t) {
                    if (!x[e]) return;
                    var n = [];
                    for (var r = 0; r < x[e].length; r += 1) x[e][r] !== t && n.push(x[e][r]);
                    n.length === 0 ? delete x[e] : x[e] = n
                  },
                  R = function(e, t, n, r) {
                    var i = t.line,
                      s = t.character;
                    r === undefined && (r = f.option.unused), r === !0 && (r = "last-param");
                    var o = {
                      vars: ["var"],
                      "last-param": ["var", "param"],
                      strict: ["var", "param", "last-param"]
                    };
                    r && o[r] && o[r].indexOf(n) !== -1 && Q("W098", i, s, e), H.push({
                      name: e,
                      line: i,
                      character: s
                    })
                  },
                  U = function(e, t) {
                    var n = e[t],
                      i = e["(tokens)"][t];
                    if (t.charAt(0) === "(") return;
                    if (n !== "unused" && n !== "unction" && n !== "const") return;
                    if (e["(params)"] && e["(params)"].indexOf(t) !== -1) return;
                    if (e["(global)"] && r.has(y, t)) return;
                    if (n === "const" && !Vt(e, t, "unused")) return;
                    R(t, i, "var")
                  };
                for (o = 0; o < c.undefs.length; o += 1) a = c.undefs[o].slice(0), b(a[2].value, a[0]) ? O(a[2].value, a[2].line) : f.option.undef && K.apply(K, a.slice(1));
                E.forEach(function(e) {
                  if (e["(unusedOption)"] === !1) return;
                  for (var t in e) r.has(e, t) && U(e, t);
                  if (!e["(params)"]) return;
                  var n = e["(params)"].slice(),
                    i = n.pop(),
                    s, o;
                  while (i) {
                    s = e[i], o = e["(unusedOption)"] || f.option.unused, o = o === !0 ? "last-param" : o;
                    if (i === "undefined") return;
                    if (s === "unused" || s === "unction") R(i, e["(tokens)"][i], "param", e["(unusedOption)"]);
                    else if (o === "last-param") return;
                    i = n.pop()
                  }
                });
                for (var z in g) r.has(g, z) && !r.has(S, z) && !r.has(y, z) && R(z, g[z], "var")
              } catch ($) {
                if (!$ || $.name !== "JSHintError") throw $;
                var J = f.tokens.next || {};
                c.errors.push({
                  scope: "(main)",
                  raw: $.raw,
                  code: $.code,
                  reason: $.message,
                  line: $.line || J.line,
                  character: $.character || J.from
                }, null)
              }
              if (c.scope === "(main)") {
                n = n || {};
                for (o = 0; o < c.internals.length; o += 1) a = c.internals[o], n.scope = a.elem, cn(a.value, n, i)
              }
              return c.errors.length === 0
            };
          return cn.addModule = function(e) {
            j.push(e)
          }, cn.addModule(l.register), cn.data = function() {
            var e = {
                functions: [],
                options: f.option
              },
              t = [],
              n = [],
              i, s, o, u, a, l;
            cn.errors.length && (e.errors = cn.errors), f.jsonMode && (e.json = !0);
            for (a in x) r.has(x, a) && t.push({
              name: a,
              line: x[a]
            });
            t.length > 0 && (e.implieds = t), B.length > 0 && (e.urls = B), l = Object.keys(D), l.length > 0 && (e.globals = l);
            for (o = 1; o < E.length; o += 1) {
              s = E[o], i = {};
              for (u = 0; u < b.length; u += 1) i[b[u]] = [];
              for (u = 0; u < b.length; u += 1) i[b[u]].length === 0 && delete i[b[u]];
              i.name = s["(name)"], i.param = s["(params)"], i.line = s["(line)"], i.character = s["(character)"], i.last = s["(last)"], i.lastcharacter = s["(lastcharacter)"], i.metrics = {
                complexity: s["(metrics)"].ComplexityCount,
                parameters: (s["(params)"] || []).length,
                statements: s["(metrics)"].statementCount
              }, e.functions.push(i)
            }
            H.length > 0 && (e.unused = H), n = [];
            for (a in L)
              if (typeof L[a] == "number") {
                e.member = L;
                break
              }
            return e
          }, cn.jshint = cn, cn
        }();
      typeof n == "object" && n && (n.JSHINT = c)
    }, {
      "./lex.js": 4,
      "./messages.js": 5,
      "./reg.js": 6,
      "./state.js": 7,
      "./style.js": 8,
      "./vars.js": 9,
      events: 10,
      underscore: 2
    }],
    4: [function(e, t, n) {
      "use strict";

      function c() {
        var e = [];
        return {
          push: function(t) {
            e.push(t)
          },
          check: function() {
            for (var t = 0; t < e.length; ++t) e[t]();
            e.splice(0, e.length)
          }
        }
      }

      function h(e) {
        var t = e;
        typeof t == "string" && (t = t.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n")), t[0] && t[0].substr(0, 2) === "#!" && (t[0].indexOf("node") !== -1 && (o.option.node = !0), t[0] = ""), this.emitter = new i.EventEmitter, this.source = e, this.setLines(t), this.prereg = !0, this.line = 0, this.char = 1, this.from = 1, this.input = "", this.inComment = !1;
        for (var n = 0; n < o.option.indent; n += 1) o.tab += " "
      }
      var r = e("underscore"),
        i = e("events"),
        s = e("./reg.js"),
        o = e("./state.js").state,
        u = e("../data/ascii-identifier-data.js"),
        a = u.asciiIdentifierStartTable,
        f = u.asciiIdentifierPartTable,
        l = {
          Identifier: 1,
          Punctuator: 2,
          NumericLiteral: 3,
          StringLiteral: 4,
          Comment: 5,
          Keyword: 6,
          NullLiteral: 7,
          BooleanLiteral: 8,
          RegExp: 9,
          TemplateLiteral: 10
        };
      h.prototype = {
        _lines: [],
        getLines: function() {
          return this._lines = o.lines, this._lines
        },
        setLines: function(e) {
          this._lines = e, o.lines = this._lines
        },
        peek: function(e) {
          return this.input.charAt(e || 0)
        },
        skip: function(e) {
          e = e || 1, this.char += e, this.input = this.input.slice(e)
        },
        on: function(e, t) {
          e.split(" ").forEach(function(e) {
            this.emitter.on(e, t)
          }.bind(this))
        },
        trigger: function() {
          this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments))
        },
        triggerAsync: function(e, t, n, r) {
          n.push(function() {
            r() && this.trigger(e, t)
          }.bind(this))
        },
        scanPunctuator: function() {
          var e = this.peek(),
            t, n, r;
          switch (e) {
            case ".":
              if (/^[0-9]$/.test(this.peek(1))) return null;
              if (this.peek(1) === "." && this.peek(2) === ".") return {
                type: l.Punctuator,
                value: "..."
              };
            case "(":
            case ")":
            case ";":
            case ",":
            case "{":
            case "}":
            case "[":
            case "]":
            case ":":
            case "~":
            case "?":
              return {
                type: l.Punctuator,
                value: e
              };
            case "#":
              return {
                type: l.Punctuator,
                value: e
              };
            case "":
              return null
          }
          return t = this.peek(1), n = this.peek(2), r = this.peek(3), e === ">" && t === ">" && n === ">" && r === "=" ? {
            type: l.Punctuator,
            value: ">>>="
          } : e === "=" && t === "=" && n === "=" ? {
            type: l.Punctuator,
            value: "==="
          } : e === "!" && t === "=" && n === "=" ? {
            type: l.Punctuator,
            value: "!=="
          } : e === ">" && t === ">" && n === ">" ? {
            type: l.Punctuator,
            value: ">>>"
          } : e === "<" && t === "<" && n === "=" ? {
            type: l.Punctuator,
            value: "<<="
          } : e === ">" && t === ">" && n === "=" ? {
            type: l.Punctuator,
            value: ">>="
          } : e === "=" && t === ">" ? {
            type: l.Punctuator,
            value: e + t
          } : e === t && "+-<>&|".indexOf(e) >= 0 ? {
            type: l.Punctuator,
            value: e + t
          } : "<>=!+-*%&|^".indexOf(e) >= 0 ? t === "=" ? {
            type: l.Punctuator,
            value: e + t
          } : {
            type: l.Punctuator,
            value: e
          } : e === "/" ? t === "=" && /\/=(?!(\S*\/[gim]?))/.test(this.input) ? {
            type: l.Punctuator,
            value: "/="
          } : {
            type: l.Punctuator,
            value: "/"
          } : null
        },
        scanComments: function() {
          function s(e, t, n) {
            var r = ["jshint", "jslint", "members", "member", "globals", "global", "exported"],
              i = !1,
              s = e + t,
              o = "plain";
            return n = n || {}, n.isMultiline && (s += "*/"), r.forEach(function(n) {
              if (i) return;
              if (e === "//" && n !== "jshint") return;
              t.substr(0, n.length) === n && (i = !0, e += n, t = t.substr(n.length)), !i && t.charAt(0) === " " && t.substr(1, n.length) === n && (i = !0, e = e + " " + n, t = t.substr(n.length + 1));
              if (!i) return;
              switch (n) {
                case "member":
                  o = "members";
                  break;
                case "global":
                  o = "globals";
                  break;
                default:
                  o = n
              }
            }), {
              type: l.Comment,
              commentType: o,
              value: s,
              body: t,
              isSpecial: i,
              isMultiline: n.isMultiline || !1,
              isMalformed: n.isMalformed || !1
            }
          }
          var e = this.peek(),
            t = this.peek(1),
            n = this.input.substr(2),
            r = this.line,
            i = this.char;
          if (e === "*" && t === "/") return this.trigger("error", {
            code: "E018",
            line: r,
            character: i
          }), this.skip(2), null;
          if (e !== "/" || t !== "*" && t !== "/") return null;
          if (t === "/") return this.skip(this.input.length), s("//", n);
          var o = "";
          if (t === "*") {
            this.inComment = !0, this.skip(2);
            while (this.peek() !== "*" || this.peek(1) !== "/")
              if (this.peek() === "") {
                o += "\n";
                if (!this.nextLine()) return this.trigger("error", {
                  code: "E017",
                  line: r,
                  character: i
                }), this.inComment = !1, s("/*", o, {
                  isMultiline: !0,
                  isMalformed: !0
                })
              } else o += this.peek(), this.skip();
            return this.skip(2), this.inComment = !1, s("/*", o, {
              isMultiline: !0
            })
          }
        },
        scanKeyword: function() {
          var e = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),
            t = ["if", "in", "do", "var", "for", "new", "try", "let", "this", "else", "case", "void", "with", "enum", "while", "break", "catch", "throw", "const", "yield", "class", "super", "return", "typeof", "delete", "switch", "export", "import", "default", "finally", "extends", "function", "continue", "debugger", "instanceof"];
          return e && t.indexOf(e[0]) >= 0 ? {
            type: l.Keyword,
            value: e[0]
          } : null
        },
        scanIdentifier: function() {
          function i(e) {
            return e > 256
          }

          function s(e) {
            return e > 256
          }

          function o(e) {
            return /^[0-9a-fA-F]$/.test(e)
          }
          var e = "",
            t = 0,
            n, r, u = function() {
              t += 1;
              if (this.peek(t) !== "u") return null;
              var e = this.peek(t + 1),
                n = this.peek(t + 2),
                r = this.peek(t + 3),
                i = this.peek(t + 4),
                u;
              return o(e) && o(n) && o(r) && o(i) ? (u = parseInt(e + n + r + i, 16), f[u] || s(u) ? (t += 5, "\\u" + e + n + r + i) : null) : null
            }.bind(this),
            c = function() {
              var e = this.peek(t),
                n = e.charCodeAt(0);
              return n === 92 ? u() : n < 128 ? a[n] ? (t += 1, e) : null : i(n) ? (t += 1, e) : null
            }.bind(this),
            h = function() {
              var e = this.peek(t),
                n = e.charCodeAt(0);
              return n === 92 ? u() : n < 128 ? f[n] ? (t += 1, e) : null : s(n) ? (t += 1, e) : null
            }.bind(this);
          r = c();
          if (r === null) return null;
          e = r;
          for (;;) {
            r = h();
            if (r === null) break;
            e += r
          }
          switch (e) {
            case "true":
            case "false":
              n = l.BooleanLiteral;
              break;
            case "null":
              n = l.NullLiteral;
              break;
            default:
              n = l.Identifier
          }
          return {
            type: n,
            value: e
          }
        },
        scanNumericLiteral: function() {
          function s(e) {
            return /^[0-9]$/.test(e)
          }

          function o(e) {
            return /^[0-7]$/.test(e)
          }

          function u(e) {
            return /^[0-9a-fA-F]$/.test(e)
          }

          function a(e) {
            return e === "$" || e === "_" || e === "\\" || e >= "a" && e <= "z" || e >= "A" && e <= "Z"
          }
          var e = 0,
            t = "",
            n = this.input.length,
            r = this.peek(e),
            i;
          if (r !== "." && !s(r)) return null;
          if (r !== ".") {
            t = this.peek(e), e += 1, r = this.peek(e);
            if (t === "0") {
              if (r === "x" || r === "X") {
                e += 1, t += r;
                while (e < n) {
                  r = this.peek(e);
                  if (!u(r)) break;
                  t += r, e += 1
                }
                if (t.length <= 2) return {
                  type: l.NumericLiteral,
                  value: t,
                  isMalformed: !0
                };
                if (e < n) {
                  r = this.peek(e);
                  if (a(r)) return null
                }
                return {
                  type: l.NumericLiteral,
                  value: t,
                  base: 16,
                  isMalformed: !1
                }
              }
              if (o(r)) {
                e += 1, t += r, i = !1;
                while (e < n) {
                  r = this.peek(e);
                  if (s(r)) i = !0;
                  else if (!o(r)) break;
                  t += r, e += 1
                }
                if (e < n) {
                  r = this.peek(e);
                  if (a(r)) return null
                }
                return {
                  type: l.NumericLiteral,
                  value: t,
                  base: 8,
                  isMalformed: !1
                }
              }
              s(r) && (e += 1, t += r)
            }
            while (e < n) {
              r = this.peek(e);
              if (!s(r)) break;
              t += r, e += 1
            }
          }
          if (r === ".") {
            t += r, e += 1;
            while (e < n) {
              r = this.peek(e);
              if (!s(r)) break;
              t += r, e += 1
            }
          }
          if (r === "e" || r === "E") {
            t += r, e += 1, r = this.peek(e);
            if (r === "+" || r === "-") t += this.peek(e), e += 1;
            r = this.peek(e);
            if (!s(r)) return null;
            t += r, e += 1;
            while (e < n) {
              r = this.peek(e);
              if (!s(r)) break;
              t += r, e += 1
            }
          }
          if (e < n) {
            r = this.peek(e);
            if (a(r)) return null
          }
          return {
            type: l.NumericLiteral,
            value: t,
            base: 10,
            isMalformed: !isFinite(t)
          }
        },
        scanTemplateLiteral: function() {
          if (!o.option.esnext || this.peek() !== "`") return null;
          var e = this.line,
            t = this.char,
            n = 1,
            r = "";
          this.skip();
          while (this.peek() !== "`") {
            while (this.peek() === "") {
              if (!this.nextLine()) return this.trigger("error", {
                code: "E052",
                line: e,
                character: t
              }), {
                type: l.TemplateLiteral,
                value: r,
                isUnclosed: !0
              };
              r += "\n"
            }
            var i = this.peek();
            this.skip(n), r += i
          }
          return this.skip(), {
            type: l.TemplateLiteral,
            value: r,
            isUnclosed: !1
          }
        },
        scanStringLiteral: function(e) {
          var t = this.peek();
          if (t !== '"' && t !== "'") return null;
          this.triggerAsync("warning", {
            code: "W108",
            line: this.line,
            character: this.char
          }, e, function() {
            return o.jsonMode && t !== '"'
          });
          var n = "",
            r = this.line,
            i = this.char,
            s = !1;
          this.skip();
          e: while (this.peek() !== t) {
            while (this.peek() === "") {
              s ? (s = !1, this.triggerAsync("warning", {
                code: "W043",
                line: this.line,
                character: this.char
              }, e, function() {
                return !o.option.multistr
              }), this.triggerAsync("warning", {
                code: "W042",
                line: this.line,
                character: this.char
              }, e, function() {
                return o.jsonMode && o.option.multistr
              })) : this.trigger("warning", {
                code: "W112",
                line: this.line,
                character: this.char
              });
              if (!this.nextLine()) return this.trigger("error", {
                code: "E029",
                line: r,
                character: i
              }), {
                type: l.StringLiteral,
                value: n,
                isUnclosed: !0,
                quote: t
              };
              if (this.peek() == t) break e
            }
            s = !1;
            var u = this.peek(),
              a = 1;
            u < " " && this.trigger("warning", {
              code: "W113",
              line: this.line,
              character: this.char,
              data: ["<non-printable>"]
            });
            if (u === "\\") {
              this.skip(), u = this.peek();
              switch (u) {
                case "'":
                  this.triggerAsync("warning", {
                    code: "W114",
                    line: this.line,
                    character: this.char,
                    data: ["\\'"]
                  }, e, function() {
                    return o.jsonMode
                  });
                  break;
                case "b":
                  u = "\\b";
                  break;
                case "f":
                  u = "\\f";
                  break;
                case "n":
                  u = "\\n";
                  break;
                case "r":
                  u = "\\r";
                  break;
                case "t":
                  u = "\\t";
                  break;
                case "0":
                  u = "\\0";
                  var f = parseInt(this.peek(1), 10);
                  this.triggerAsync("warning", {
                    code: "W115",
                    line: this.line,
                    character: this.char
                  }, e, function() {
                    return f >= 0 && f <= 7 && o.directive["use strict"]
                  });
                  break;
                case "u":
                  u = String.fromCharCode(parseInt(this.input.substr(1, 4), 16)), a = 5;
                  break;
                case "v":
                  this.triggerAsync("warning", {
                    code: "W114",
                    line: this.line,
                    character: this.char,
                    data: ["\\v"]
                  }, e, function() {
                    return o.jsonMode
                  }), u = "";
                  break;
                case "x":
                  var c = parseInt(this.input.substr(1, 2), 16);
                  this.triggerAsync("warning", {
                    code: "W114",
                    line: this.line,
                    character: this.char,
                    data: ["\\x-"]
                  }, e, function() {
                    return o.jsonMode
                  }), u = String.fromCharCode(c), a = 3;
                  break;
                case "\\":
                  u = "\\\\";
                  break;
                case '"':
                  u = '\\"';
                  break;
                case "/":
                  break;
                case "":
                  s = !0, u = "";
                  break;
                case "!":
                  if (n.slice(n.length - 2) === "<") break;
                default:
                  this.trigger("warning", {
                    code: "W044",
                    line: this.line,
                    character: this.char
                  })
              }
            }
            n += u, this.skip(a)
          }
          return this.skip(), {
            type: l.StringLiteral,
            value: n,
            isUnclosed: !1,
            quote: t
          }
        },
        scanRegExp: function() {
          var e = 0,
            t = this.input.length,
            n = this.peek(),
            r = n,
            i = "",
            s = [],
            o = !1,
            u = !1,
            a, f = function() {
              n < " " && (o = !0, this.trigger("warning", {
                code: "W048",
                line: this.line,
                character: this.char
              })), n === "<" && (o = !0, this.trigger("warning", {
                code: "W049",
                line: this.line,
                character: this.char,
                data: [n]
              }))
            }.bind(this);
          if (!this.prereg || n !== "/") return null;
          e += 1, a = !1;
          while (e < t) {
            n = this.peek(e), r += n, i += n;
            if (u) {
              n === "]" && (this.peek(e - 1) !== "\\" || this.peek(e - 2) === "\\") && (u = !1), n === "\\" && (e += 1, n = this.peek(e), i += n, r += n, f()), e += 1;
              continue
            }
            if (n === "\\") {
              e += 1, n = this.peek(e), i += n, r += n, f();
              if (n === "/") {
                e += 1;
                continue
              }
              if (n === "[") {
                e += 1;
                continue
              }
            }
            if (n === "[") {
              u = !0, e += 1;
              continue
            }
            if (n === "/") {
              i = i.substr(0, i.length - 1), a = !0, e += 1;
              break
            }
            e += 1
          }
          if (!a) return this.trigger("error", {
            code: "E015",
            line: this.line,
            character: this.from
          }), void this.trigger("fatal", {
            line: this.line,
            from: this.from
          });
          while (e < t) {
            n = this.peek(e);
            if (!/[gim]/.test(n)) break;
            s.push(n), r += n, e += 1
          }
          try {
            new RegExp(i, s.join(""))
          } catch (c) {
            o = !0, this.trigger("error", {
              code: "E016",
              line: this.line,
              character: this.char,
              data: [c.message]
            })
          }
          return {
            type: l.RegExp,
            value: r,
            flags: s,
            isMalformed: o
          }
        },
        scanNonBreakingSpaces: function() {
          return o.option.nonbsp ? this.input.search(/(\u00A0)/) : -1
        },
        scanUnsafeChars: function() {
          return this.input.search(s.unsafeChars)
        },
        next: function(e) {
          this.from = this.char;
          var t;
          if (/\s/.test(this.peek())) {
            t = this.char;
            while (/\s/.test(this.peek())) this.from += 1, this.skip()
          }
          var n = this.scanComments() || this.scanStringLiteral(e) || this.scanTemplateLiteral();
          return n ? n : (n = this.scanRegExp() || this.scanPunctuator() || this.scanKeyword() || this.scanIdentifier() || this.scanNumericLiteral(), n ? (this.skip(n.value.length), n) : null)
        },
        nextLine: function() {
          var e;
          if (this.line >= this.getLines().length) return !1;
          this.input = this.getLines()[this.line], this.line += 1, this.char = 1, this.from = 1;
          var t = this.input.trim(),
            n = function() {
              return r.some(arguments, function(e) {
                return t.indexOf(e) === 0
              })
            },
            i = function() {
              return r.some(arguments, function(e) {
                return t.indexOf(e, t.length - e.length) !== -1
              })
            };
          o.ignoreLinterErrors === !0 && !n("/*", "//") && !i("*/") && (this.input = ""), e = this.scanNonBreakingSpaces(), e >= 0 && this.trigger("warning", {
            code: "W125",
            line: this.line,
            character: e + 1
          }), this.input = this.input.replace(/\t/g, o.tab), e = this.scanUnsafeChars(), e >= 0 && this.trigger("warning", {
            code: "W100",
            line: this.line,
            character: e
          });
          if (o.option.maxlen && o.option.maxlen < this.input.length) {
            var u = this.inComment || n.call(t, "//") || n.call(t, "/*"),
              a = !u || !s.maxlenException.test(t);
            a && this.trigger("warning", {
              code: "W101",
              line: this.line,
              character: this.input.length
            })
          }
          return !0
        },
        start: function() {
          this.nextLine()
        },
        token: function() {
          function n(e, t) {
            if (!e.reserved) return !1;
            var n = e.meta;
            if (n && n.isFutureReservedWord && o.option.inES5()) {
              if (!n.es5) return !1;
              if (n.strictOnly && !o.option.strict && !o.directive["use strict"]) return !1;
              if (t) return !1
            }
            return !0
          }
          var e = c(),
            t, i = function(t, i, s) {
              var u;
              t !== "(endline)" && t !== "(end)" && (this.prereg = !1);
              if (t === "(punctuator)") {
                switch (i) {
                  case ".":
                  case ")":
                  case "~":
                  case "#":
                  case "]":
                    this.prereg = !1;
                    break;
                  default:
                    this.prereg = !0
                }
                u = Object.create(o.syntax[i] || o.syntax["(error)"])
              }
              if (t === "(identifier)") {
                if (i === "return" || i === "case" || i === "typeof") this.prereg = !0;
                r.has(o.syntax, i) && (u = Object.create(o.syntax[i] || o.syntax["(error)"]), n(u, s && t === "(identifier)") || (u = null))
              }
              return u || (u = Object.create(o.syntax[t])), u.identifier = t === "(identifier)", u.type = u.type || t, u.value = i, u.line = this.line, u.character = this.char, u.from = this.from, s && u.identifier && (u.isProperty = s), u.check = e.check, u
            }.bind(this);
          for (;;) {
            if (!this.input.length) return i(this.nextLine() ? "(endline)" : "(end)", "");
            t = this.next(e);
            if (!t) {
              this.input.length && (this.trigger("error", {
                code: "E024",
                line: this.line,
                character: this.char,
                data: [this.peek()]
              }), this.input = "");
              continue
            }
            switch (t.type) {
              case l.StringLiteral:
                return this.triggerAsync("String", {
                  line: this.line,
                  "char": this.char,
                  from: this.from,
                  value: t.value,
                  quote: t.quote
                }, e, function() {
                  return !0
                }), i("(string)", t.value);
              case l.TemplateLiteral:
                return this.trigger("Template", {
                  line: this.line,
                  "char": this.char,
                  from: this.from,
                  value: t.value
                }), i("(template)", t.value);
              case l.Identifier:
                this.trigger("Identifier", {
                  line: this.line,
                  "char": this.char,
                  from: this.form,
                  name: t.value,
                  isProperty: o.tokens.curr.id === "."
                });
              case l.Keyword:
              case l.NullLiteral:
              case l.BooleanLiteral:
                return i("(identifier)", t.value, o.tokens.curr.id === ".");
              case l.NumericLiteral:
                return t.isMalformed && this.trigger("warning", {
                  code: "W045",
                  line: this.line,
                  character: this.char,
                  data: [t.value]
                }), this.triggerAsync("warning", {
                  code: "W114",
                  line: this.line,
                  character: this.char,
                  data: ["0x-"]
                }, e, function() {
                  return t.base === 16 && o.jsonMode
                }), this.triggerAsync("warning", {
                  code: "W115",
                  line: this.line,
                  character: this.char
                }, e, function() {
                  return o.directive["use strict"] && t.base === 8
                }), this.trigger("Number", {
                  line: this.line,
                  "char": this.char,
                  from: this.from,
                  value: t.value,
                  base: t.base,
                  isMalformed: t.malformed
                }), i("(number)", t.value);
              case l.RegExp:
                return i("(regexp)", t.value);
              case l.Comment:
                o.tokens.curr.comment = !0;
                if (t.isSpecial) return {
                  id: "(comment)",
                  value: t.value,
                  body: t.body,
                  type: t.commentType,
                  isSpecial: t.isSpecial,
                  line: this.line,
                  character: this.char,
                  from: this.from
                };
                break;
              case "":
                break;
              default:
                return i("(punctuator)", t.value)
            }
          }
        }
      }, n.Lexer = h
    }, {
      "../data/ascii-identifier-data.js": 1,
      "./reg.js": 6,
      "./state.js": 7,
      events: 10,
      underscore: 2
    }],
    5: [function(e, t, n) {
      "use strict";
      var r = e("underscore"),
        i = {
          E001: "Bad option: '{a}'.",
          E002: "Bad option value.",
          E003: "Expected a JSON value.",
          E004: "Input is neither a string nor an array of strings.",
          E005: "Input is empty.",
          E006: "Unexpected early end of program.",
          E007: 'Missing "use strict" statement.',
          E008: "Strict violation.",
          E009: "Option 'validthis' can't be used in a global scope.",
          E010: "'with' is not allowed in strict mode.",
          E011: "const '{a}' has already been declared.",
          E012: "const '{a}' is initialized to 'undefined'.",
          E013: "Attempting to override '{a}' which is a constant.",
          E014: "A regular expression literal can be confused with '/='.",
          E015: "Unclosed regular expression.",
          E016: "Invalid regular expression.",
          E017: "Unclosed comment.",
          E018: "Unbegun comment.",
          E019: "Unmatched '{a}'.",
          E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
          E021: "Expected '{a}' and instead saw '{b}'.",
          E022: "Line breaking error '{a}'.",
          E023: "Missing '{a}'.",
          E024: "Unexpected '{a}'.",
          E025: "Missing ':' on a case clause.",
          E026: "Missing '}' to match '{' from line {a}.",
          E027: "Missing ']' to match '[' from line {a}.",
          E028: "Illegal comma.",
          E029: "Unclosed string.",
          E030: "Expected an identifier and instead saw '{a}'.",
          E031: "Bad assignment.",
          E032: "Expected a small integer or 'false' and instead saw '{a}'.",
          E033: "Expected an operator and instead saw '{a}'.",
          E034: "get/set are ES5 features.",
          E035: "Missing property name.",
          E036: "Expected to see a statement and instead saw a block.",
          E037: null,
          E038: null,
          E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
          E040: "Each value should have its own case label.",
          E041: "Unrecoverable syntax error.",
          E042: "Stopping.",
          E043: "Too many errors.",
          E044: null,
          E045: "Invalid for each loop.",
          E046: "A yield statement shall be within a generator function (with syntax: `function*`)",
          E047: null,
          E048: "Let declaration not directly within block.",
          E049: "A {a} cannot be named '{b}'.",
          E050: "Mozilla requires the yield expression to be parenthesized here.",
          E051: "Regular parameters cannot come after default parameters.",
          E052: "Unclosed template literal."
        },
        s = {
          W001: "'hasOwnProperty' is a really bad name.",
          W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
          W003: "'{a}' was used before it was defined.",
          W004: "'{a}' is already defined.",
          W005: "A dot following a number can be confused with a decimal point.",
          W006: "Confusing minuses.",
          W007: "Confusing plusses.",
          W008: "A leading decimal point can be confused with a dot: '{a}'.",
          W009: "The array literal notation [] is preferable.",
          W010: "The object literal notation {} is preferable.",
          W011: null,
          W012: null,
          W013: null,
          W014: "Bad line breaking before '{a}'.",
          W015: null,
          W016: "Unexpected use of '{a}'.",
          W017: "Bad operand.",
          W018: "Confusing use of '{a}'.",
          W019: "Use the isNaN function to compare with NaN.",
          W020: "Read only.",
          W021: "'{a}' is a function.",
          W022: "Do not assign to the exception parameter.",
          W023: "Expected an identifier in an assignment and instead saw a function invocation.",
          W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
          W025: "Missing name in function declaration.",
          W026: "Inner functions should be listed at the top of the outer function.",
          W027: "Unreachable '{a}' after '{b}'.",
          W028: "Label '{a}' on {b} statement.",
          W030: "Expected an assignment or function call and instead saw an expression.",
          W031: "Do not use 'new' for side effects.",
          W032: "Unnecessary semicolon.",
          W033: "Missing semicolon.",
          W034: 'Unnecessary directive "{a}".',
          W035: "Empty block.",
          W036: "Unexpected /*member '{a}'.",
          W037: "'{a}' is a statement label.",
          W038: "'{a}' used out of scope.",
          W039: "'{a}' is not allowed.",
          W040: "Possible strict violation.",
          W041: "Use '{a}' to compare with '{b}'.",
          W042: "Avoid EOL escaping.",
          W043: "Bad escaping of EOL. Use option multistr if needed.",
          W044: "Bad or unnecessary escaping.",
          W045: "Bad number '{a}'.",
          W046: "Don't use extra leading zeros '{a}'.",
          W047: "A trailing decimal point can be confused with a dot: '{a}'.",
          W048: "Unexpected control character in regular expression.",
          W049: "Unexpected escaped character '{a}' in regular expression.",
          W050: "JavaScript URL.",
          W051: "Variables should not be deleted.",
          W052: "Unexpected '{a}'.",
          W053: "Do not use {a} as a constructor.",
          W054: "The Function constructor is a form of eval.",
          W055: "A constructor name should start with an uppercase letter.",
          W056: "Bad constructor.",
          W057: "Weird construction. Is 'new' necessary?",
          W058: "Missing '()' invoking a constructor.",
          W059: "Avoid arguments.{a}.",
          W060: "document.write can be a form of eval.",
          W061: "eval can be harmful.",
          W062: "Wrap an immediate function invocation in parens to assist the reader in understanding that the expression is the result of a function, and not the function itself.",
          W063: "Math is not a function.",
          W064: "Missing 'new' prefix when invoking a constructor.",
          W065: "Missing radix parameter.",
          W066: "Implied eval. Consider passing a function instead of a string.",
          W067: "Bad invocation.",
          W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
          W069: "['{a}'] is better written in dot notation.",
          W070: "Extra comma. (it breaks older versions of IE)",
          W071: "This function has too many statements. ({a})",
          W072: "This function has too many parameters. ({a})",
          W073: "Blocks are nested too deeply. ({a})",
          W074: "This function's cyclomatic complexity is too high. ({a})",
          W075: "Duplicate key '{a}'.",
          W076: "Unexpected parameter '{a}' in get {b} function.",
          W077: "Expected a single parameter in set {a} function.",
          W078: "Setter is defined without getter.",
          W079: "Redefinition of '{a}'.",
          W080: "It's not necessary to initialize '{a}' to 'undefined'.",
          W081: null,
          W082: "Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.",
          W083: "Don't make functions within a loop.",
          W084: "Assignment in conditional expression",
          W085: "Don't use 'with'.",
          W086: "Expected a 'break' statement before '{a}'.",
          W087: "Forgotten 'debugger' statement?",
          W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
          W089: "The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.",
          W090: "'{a}' is not a statement label.",
          W091: "'{a}' is out of scope.",
          W093: "Did you mean to return a conditional instead of an assignment?",
          W094: "Unexpected comma.",
          W095: "Expected a string and instead saw {a}.",
          W096: "The '{a}' key may produce unexpected results.",
          W097: 'Use the function form of "use strict".',
          W098: "'{a}' is defined but never used.",
          W099: null,
          W100: "This character may get silently deleted by one or more browsers.",
          W101: "Line is too long.",
          W102: null,
          W103: "The '{a}' property is deprecated.",
          W104: "'{a}' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).",
          W105: "Unexpected {a} in '{b}'.",
          W106: "Identifier '{a}' is not in camel case.",
          W107: "Script URL.",
          W108: "Strings must use doublequote.",
          W109: "Strings must use singlequote.",
          W110: "Mixed double and single quotes.",
          W112: "Unclosed string.",
          W113: "Control character in string: {a}.",
          W114: "Avoid {a}.",
          W115: "Octal literals are not allowed in strict mode.",
          W116: "Expected '{a}' and instead saw '{b}'.",
          W117: "'{a}' is not defined.",
          W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
          W119: "'{a}' is only available in ES6 (use esnext option).",
          W120: "You might be leaking a variable ({a}) here.",
          W121: "Extending prototype of native object: '{a}'.",
          W122: "Invalid typeof value '{a}'",
          W123: "'{a}' is already defined in outer scope.",
          W124: "A generator function shall contain a yield statement.",
          W125: "This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp"
        },
        o = {
          I001: "Comma warnings can be turned off with 'laxcomma'.",
          I002: null,
          I003: "ES5 option is now set per default"
        };
      n.errors = {}, n.warnings = {}, n.info = {}, r.each(i, function(e, t) {
        n.errors[t] = {
          code: t,
          desc: e
        }
      }), r.each(s, function(e, t) {
        n.warnings[t] = {
          code: t,
          desc: e
        }
      }), r.each(o, function(e, t) {
        n.info[t] = {
          code: t,
          desc: e
        }
      })
    }, {
      underscore: 2
    }],
    6: [function(e, t, n) {
      "use string";
      n.unsafeString = /@cc|<\/?|script|\]\s*\]|<\s*!|&lt/i, n.unsafeChars = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, n.needEsc = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, n.needEscGlobal = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, n.starSlash = /\*\//, n.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/, n.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i, n.fallsThrough = /^\s*\/\*\s*falls?\sthrough\s*\*\/\s*$/, n.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/
    }, {}],
    7: [function(e, t, n) {
      "use strict";
      var r = {
        syntax: {},
        reset: function() {
          this.tokens = {
            prev: null,
            next: null,
            curr: null
          }, this.option = {}, this.ignored = {}, this.directive = {}, this.jsonMode = !1, this.jsonWarnings = [], this.lines = [], this.tab = "", this.cache = {}, this.ignoredLines = {}, this.ignoreLinterErrors = !1
        }
      };
      n.state = r
    }, {}],
    8: [function(e, t, n) {
      "use strict";
      n.register = function(e) {
        e.on("Identifier", function(n) {
          if (e.getOption("proto")) return;
          n.name === "__proto__" && e.warn("W103", {
            line: n.line,
            "char": n.char,
            data: [n.name]
          })
        }), e.on("Identifier", function(n) {
          if (e.getOption("iterator")) return;
          n.name === "__iterator__" && e.warn("W104", {
            line: n.line,
            "char": n.char,
            data: [n.name]
          })
        }), e.on("Identifier", function(n) {
          if (!e.getOption("camelcase")) return;
          n.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !n.name.match(/^[A-Z0-9_]*$/) && e.warn("W106", {
            line: n.line,
            "char": n.from,
            data: [n.name]
          })
        }), e.on("String", function(n) {
          var r = e.getOption("quotmark"),
            i;
          if (!r) return;
          r === "single" && n.quote !== "'" && (i = "W109"), r === "double" && n.quote !== '"' && (i = "W108"), r === !0 && (e.getCache("quotmark") || e.setCache("quotmark", n.quote), e.getCache("quotmark") !== n.quote && (i = "W110")), i && e.warn(i, {
            line: n.line,
            "char": n.char
          })
        }), e.on("Number", function(n) {
          n.value.charAt(0) === "." && e.warn("W008", {
            line: n.line,
            "char": n.char,
            data: [n.value]
          }), n.value.substr(n.value.length - 1) === "." && e.warn("W047", {
            line: n.line,
            "char": n.char,
            data: [n.value]
          }), /^00+/.test(n.value) && e.warn("W046", {
            line: n.line,
            "char": n.char,
            data: [n.value]
          })
        }), e.on("String", function(n) {
          var r = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;
          if (e.getOption("scripturl")) return;
          r.test(n.value) && e.warn("W107", {
            line: n.line,
            "char": n.char
          })
        })
      }
    }, {}],
    9: [function(e, t, n) {
      "use strict";
      n.reservedVars = {
        arguments: !1,
        NaN: !1
      }, n.ecmaIdentifiers = {
        Array: !1,
        Boolean: !1,
        Date: !1,
        decodeURI: !1,
        decodeURIComponent: !1,
        encodeURI: !1,
        encodeURIComponent: !1,
        Error: !1,
        eval: !1,
        EvalError: !1,
        Function: !1,
        hasOwnProperty: !1,
        isFinite: !1,
        isNaN: !1,
        JSON: !1,
        Math: !1,
        Number: !1,
        Object: !1,
        parseInt: !1,
        parseFloat: !1,
        RangeError: !1,
        ReferenceError: !1,
        RegExp: !1,
        String: !1,
        SyntaxError: !1,
        TypeError: !1,
        URIError: !1
      }, n.newEcmaIdentifiers = {
        Set: !1,
        Map: !1,
        WeakMap: !1,
        WeakSet: !1,
        Proxy: !1,
        Promise: !1
      }, n.browser = {
        Audio: !1,
        Blob: !1,
        addEventListener: !1,
        applicationCache: !1,
        atob: !1,
        blur: !1,
        btoa: !1,
        CanvasGradient: !1,
        CanvasPattern: !1,
        CanvasRenderingContext2D: !1,
        clearInterval: !1,
        clearTimeout: !1,
        close: !1,
        closed: !1,
        CustomEvent: !1,
        DOMParser: !1,
        defaultStatus: !1,
        document: !1,
        Element: !1,
        ElementTimeControl: !1,
        event: !1,
        FileReader: !1,
        FormData: !1,
        focus: !1,
        frames: !1,
        getComputedStyle: !1,
        HTMLElement: !1,
        HTMLAnchorElement: !1,
        HTMLBaseElement: !1,
        HTMLBlockquoteElement: !1,
        HTMLBodyElement: !1,
        HTMLBRElement: !1,
        HTMLButtonElement: !1,
        HTMLCanvasElement: !1,
        HTMLDirectoryElement: !1,
        HTMLDivElement: !1,
        HTMLDListElement: !1,
        HTMLFieldSetElement: !1,
        HTMLFontElement: !1,
        HTMLFormElement: !1,
        HTMLFrameElement: !1,
        HTMLFrameSetElement: !1,
        HTMLHeadElement: !1,
        HTMLHeadingElement: !1,
        HTMLHRElement: !1,
        HTMLHtmlElement: !1,
        HTMLIFrameElement: !1,
        HTMLImageElement: !1,
        HTMLInputElement: !1,
        HTMLIsIndexElement: !1,
        HTMLLabelElement: !1,
        HTMLLayerElement: !1,
        HTMLLegendElement: !1,
        HTMLLIElement: !1,
        HTMLLinkElement: !1,
        HTMLMapElement: !1,
        HTMLMenuElement: !1,
        HTMLMetaElement: !1,
        HTMLModElement: !1,
        HTMLObjectElement: !1,
        HTMLOListElement: !1,
        HTMLOptGroupElement: !1,
        HTMLOptionElement: !1,
        HTMLParagraphElement: !1,
        HTMLParamElement: !1,
        HTMLPreElement: !1,
        HTMLQuoteElement: !1,
        HTMLScriptElement: !1,
        HTMLSelectElement: !1,
        HTMLStyleElement: !1,
        HTMLTableCaptionElement: !1,
        HTMLTableCellElement: !1,
        HTMLTableColElement: !1,
        HTMLTableElement: !1,
        HTMLTableRowElement: !1,
        HTMLTableSectionElement: !1,
        HTMLTextAreaElement: !1,
        HTMLTitleElement: !1,
        HTMLUListElement: !1,
        HTMLVideoElement: !1,
        history: !1,
        Image: !1,
        length: !1,
        localStorage: !1,
        location: !1,
        matchMedia: !1,
        MessageChannel: !1,
        MessageEvent: !1,
        MessagePort: !1,
        MouseEvent: !1,
        moveBy: !1,
        moveTo: !1,
        MutationObserver: !1,
        name: !1,
        Node: !1,
        NodeFilter: !1,
        NodeList: !1,
        navigator: !1,
        onbeforeunload: !0,
        onblur: !0,
        onerror: !0,
        onfocus: !0,
        onload: !0,
        onresize: !0,
        onunload: !0,
        open: !1,
        openDatabase: !1,
        opener: !1,
        Option: !1,
        parent: !1,
        print: !1,
        removeEventListener: !1,
        resizeBy: !1,
        resizeTo: !1,
        screen: !1,
        scroll: !1,
        scrollBy: !1,
        scrollTo: !1,
        sessionStorage: !1,
        setInterval: !1,
        setTimeout: !1,
        SharedWorker: !1,
        status: !1,
        SVGAElement: !1,
        SVGAltGlyphDefElement: !1,
        SVGAltGlyphElement: !1,
        SVGAltGlyphItemElement: !1,
        SVGAngle: !1,
        SVGAnimateColorElement: !1,
        SVGAnimateElement: !1,
        SVGAnimateMotionElement: !1,
        SVGAnimateTransformElement: !1,
        SVGAnimatedAngle: !1,
        SVGAnimatedBoolean: !1,
        SVGAnimatedEnumeration: !1,
        SVGAnimatedInteger: !1,
        SVGAnimatedLength: !1,
        SVGAnimatedLengthList: !1,
        SVGAnimatedNumber: !1,
        SVGAnimatedNumberList: !1,
        SVGAnimatedPathData: !1,
        SVGAnimatedPoints: !1,
        SVGAnimatedPreserveAspectRatio: !1,
        SVGAnimatedRect: !1,
        SVGAnimatedString: !1,
        SVGAnimatedTransformList: !1,
        SVGAnimationElement: !1,
        SVGCSSRule: !1,
        SVGCircleElement: !1,
        SVGClipPathElement: !1,
        SVGColor: !1,
        SVGColorProfileElement: !1,
        SVGColorProfileRule: !1,
        SVGComponentTransferFunctionElement: !1,
        SVGCursorElement: !1,
        SVGDefsElement: !1,
        SVGDescElement: !1,
        SVGDocument: !1,
        SVGElement: !1,
        SVGElementInstance: !1,
        SVGElementInstanceList: !1,
        SVGEllipseElement: !1,
        SVGExternalResourcesRequired: !1,
        SVGFEBlendElement: !1,
        SVGFEColorMatrixElement: !1,
        SVGFEComponentTransferElement: !1,
        SVGFECompositeElement: !1,
        SVGFEConvolveMatrixElement: !1,
        SVGFEDiffuseLightingElement: !1,
        SVGFEDisplacementMapElement: !1,
        SVGFEDistantLightElement: !1,
        SVGFEFloodElement: !1,
        SVGFEFuncAElement: !1,
        SVGFEFuncBElement: !1,
        SVGFEFuncGElement: !1,
        SVGFEFuncRElement: !1,
        SVGFEGaussianBlurElement: !1,
        SVGFEImageElement: !1,
        SVGFEMergeElement: !1,
        SVGFEMergeNodeElement: !1,
        SVGFEMorphologyElement: !1,
        SVGFEOffsetElement: !1,
        SVGFEPointLightElement: !1,
        SVGFESpecularLightingElement: !1,
        SVGFESpotLightElement: !1,
        SVGFETileElement: !1,
        SVGFETurbulenceElement: !1,
        SVGFilterElement: !1,
        SVGFilterPrimitiveStandardAttributes: !1,
        SVGFitToViewBox: !1,
        SVGFontElement: !1,
        SVGFontFaceElement: !1,
        SVGFontFaceFormatElement: !1,
        SVGFontFaceNameElement: !1,
        SVGFontFaceSrcElement: !1,
        SVGFontFaceUriElement: !1,
        SVGForeignObjectElement: !1,
        SVGGElement: !1,
        SVGGlyphElement: !1,
        SVGGlyphRefElement: !1,
        SVGGradientElement: !1,
        SVGHKernElement: !1,
        SVGICCColor: !1,
        SVGImageElement: !1,
        SVGLangSpace: !1,
        SVGLength: !1,
        SVGLengthList: !1,
        SVGLineElement: !1,
        SVGLinearGradientElement: !1,
        SVGLocatable: !1,
        SVGMPathElement: !1,
        SVGMarkerElement: !1,
        SVGMaskElement: !1,
        SVGMatrix: !1,
        SVGMetadataElement: !1,
        SVGMissingGlyphElement: !1,
        SVGNumber: !1,
        SVGNumberList: !1,
        SVGPaint: !1,
        SVGPathElement: !1,
        SVGPathSeg: !1,
        SVGPathSegArcAbs: !1,
        SVGPathSegArcRel: !1,
        SVGPathSegClosePath: !1,
        SVGPathSegCurvetoCubicAbs: !1,
        SVGPathSegCurvetoCubicRel: !1,
        SVGPathSegCurvetoCubicSmoothAbs: !1,
        SVGPathSegCurvetoCubicSmoothRel: !1,
        SVGPathSegCurvetoQuadraticAbs: !1,
        SVGPathSegCurvetoQuadraticRel: !1,
        SVGPathSegCurvetoQuadraticSmoothAbs: !1,
        SVGPathSegCurvetoQuadraticSmoothRel: !1,
        SVGPathSegLinetoAbs: !1,
        SVGPathSegLinetoHorizontalAbs: !1,
        SVGPathSegLinetoHorizontalRel: !1,
        SVGPathSegLinetoRel: !1,
        SVGPathSegLinetoVerticalAbs: !1,
        SVGPathSegLinetoVerticalRel: !1,
        SVGPathSegList: !1,
        SVGPathSegMovetoAbs: !1,
        SVGPathSegMovetoRel: !1,
        SVGPatternElement: !1,
        SVGPoint: !1,
        SVGPointList: !1,
        SVGPolygonElement: !1,
        SVGPolylineElement: !1,
        SVGPreserveAspectRatio: !1,
        SVGRadialGradientElement: !1,
        SVGRect: !1,
        SVGRectElement: !1,
        SVGRenderingIntent: !1,
        SVGSVGElement: !1,
        SVGScriptElement: !1,
        SVGSetElement: !1,
        SVGStopElement: !1,
        SVGStringList: !1,
        SVGStylable: !1,
        SVGStyleElement: !1,
        SVGSwitchElement: !1,
        SVGSymbolElement: !1,
        SVGTRefElement: !1,
        SVGTSpanElement: !1,
        SVGTests: !1,
        SVGTextContentElement: !1,
        SVGTextElement: !1,
        SVGTextPathElement: !1,
        SVGTextPositioningElement: !1,
        SVGTitleElement: !1,
        SVGTransform: !1,
        SVGTransformList: !1,
        SVGTransformable: !1,
        SVGURIReference: !1,
        SVGUnitTypes: !1,
        SVGUseElement: !1,
        SVGVKernElement: !1,
        SVGViewElement: !1,
        SVGViewSpec: !1,
        SVGZoomAndPan: !1,
        TimeEvent: !1,
        top: !1,
        URL: !1,
        WebSocket: !1,
        window: !1,
        Worker: !1,
        XMLHttpRequest: !1,
        XMLSerializer: !1,
        XPathEvaluator: !1,
        XPathException: !1,
        XPathExpression: !1,
        XPathNamespace: !1,
        XPathNSResolver: !1,
        XPathResult: !1
      }, n.devel = {
        alert: !1,
        confirm: !1,
        console: !1,
        Debug: !1,
        opera: !1,
        prompt: !1
      }, n.worker = {
        importScripts: !0,
        postMessage: !0,
        self: !0
      }, n.nonstandard = {
        escape: !1,
        unescape: !1
      }, n.couch = {
        require: !1,
        respond: !1,
        getRow: !1,
        emit: !1,
        send: !1,
        start: !1,
        sum: !1,
        log: !1,
        exports: !1,
        module: !1,
        provides: !1
      }, n.node = {
        __filename: !1,
        __dirname: !1,
        GLOBAL: !1,
        global: !1,
        module: !1,
        require: !1,
        Buffer: !0,
        console: !0,
        exports: !0,
        process: !0,
        setTimeout: !0,
        clearTimeout: !0,
        setInterval: !0,
        clearInterval: !0,
        setImmediate: !0,
        clearImmediate: !0
      }, n.phantom = {
        phantom: !0,
        require: !0,
        WebPage: !0,
        console: !0,
        exports: !0
      }, n.qunit = {
        asyncTest: !1,
        deepEqual: !1,
        equal: !1,
        expect: !1,
        module: !1,
        notDeepEqual: !1,
        notEqual: !1,
        notPropEqual: !1,
        notStrictEqual: !1,
        ok: !1,
        propEqual: !1,
        QUnit: !1,
        raises: !1,
        start: !1,
        stop: !1,
        strictEqual: !1,
        test: !1,
        "throws": !1
      }, n.rhino = {
        defineClass: !1,
        deserialize: !1,
        gc: !1,
        help: !1,
        importClass: !1,
        importPackage: !1,
        java: !1,
        load: !1,
        loadClass: !1,
        Packages: !1,
        print: !1,
        quit: !1,
        readFile: !1,
        readUrl: !1,
        runCommand: !1,
        seal: !1,
        serialize: !1,
        spawn: !1,
        sync: !1,
        toint32: !1,
        version: !1
      }, n.shelljs = {
        target: !1,
        echo: !1,
        exit: !1,
        cd: !1,
        pwd: !1,
        ls: !1,
        find: !1,
        cp: !1,
        rm: !1,
        mv: !1,
        mkdir: !1,
        test: !1,
        cat: !1,
        sed: !1,
        grep: !1,
        which: !1,
        dirs: !1,
        pushd: !1,
        popd: !1,
        env: !1,
        exec: !1,
        chmod: !1,
        config: !1,
        error: !1,
        tempdir: !1
      }, n.typed = {
        ArrayBuffer: !1,
        ArrayBufferView: !1,
        DataView: !1,
        Float32Array: !1,
        Float64Array: !1,
        Int16Array: !1,
        Int32Array: !1,
        Int8Array: !1,
        Uint16Array: !1,
        Uint32Array: !1,
        Uint8Array: !1,
        Uint8ClampedArray: !1
      }, n.wsh = {
        ActiveXObject: !0,
        Enumerator: !0,
        GetObject: !0,
        ScriptEngine: !0,
        ScriptEngineBuildVersion: !0,
        ScriptEngineMajorVersion: !0,
        ScriptEngineMinorVersion: !0,
        VBArray: !0,
        WSH: !0,
        WScript: !0,
        XDomainRequest: !0
      }, n.dojo = {
        dojo: !1,
        dijit: !1,
        dojox: !1,
        define: !1,
        require: !1
      }, n.jquery = {
        $: !1,
        jQuery: !1
      }, n.mootools = {
        $: !1,
        $$: !1,
        Asset: !1,
        Browser: !1,
        Chain: !1,
        Class: !1,
        Color: !1,
        Cookie: !1,
        Core: !1,
        Document: !1,
        DomReady: !1,
        DOMEvent: !1,
        DOMReady: !1,
        Drag: !1,
        Element: !1,
        Elements: !1,
        Event: !1,
        Events: !1,
        Fx: !1,
        Group: !1,
        Hash: !1,
        HtmlTable: !1,
        IFrame: !1,
        IframeShim: !1,
        InputValidator: !1,
        instanceOf: !1,
        Keyboard: !1,
        Locale: !1,
        Mask: !1,
        MooTools: !1,
        Native: !1,
        Options: !1,
        OverText: !1,
        Request: !1,
        Scroller: !1,
        Slick: !1,
        Slider: !1,
        Sortables: !1,
        Spinner: !1,
        Swiff: !1,
        Tips: !1,
        Type: !1,
        typeOf: !1,
        URI: !1,
        Window: !1
      }, n.prototypejs = {
        $: !1,
        $$: !1,
        $A: !1,
        $F: !1,
        $H: !1,
        $R: !1,
        $break: !1,
        $continue: !1,
        $w: !1,
        Abstract: !1,
        Ajax: !1,
        Class: !1,
        Enumerable: !1,
        Element: !1,
        Event: !1,
        Field: !1,
        Form: !1,
        Hash: !1,
        Insertion: !1,
        ObjectRange: !1,
        PeriodicalExecuter: !1,
        Position: !1,
        Prototype: !1,
        Selector: !1,
        Template: !1,
        Toggle: !1,
        Try: !1,
        Autocompleter: !1,
        Builder: !1,
        Control: !1,
        Draggable: !1,
        Draggables: !1,
        Droppables: !1,
        Effect: !1,
        Sortable: !1,
        SortableObserver: !1,
        Sound: !1,
        Scriptaculous: !1
      }, n.yui = {
        YUI: !1,
        Y: !1,
        YUI_config: !1
      }, n.mocha = {
        describe: !1,
        it: !1,
        before: !1,
        after: !1,
        beforeEach: !1,
        afterEach: !1,
        suite: !1,
        test: !1,
        setup: !1,
        teardown: !1
      }, n.jasmine = {
        jasmine: !1,
        describe: !1,
        it: !1,
        xit: !1,
        beforeEach: !1,
        afterEach: !1,
        setFixtures: !1,
        loadFixtures: !1,
        spyOn: !1,
        expect: !1,
        runs: !1,
        waitsFor: !1,
        waits: !1
      }
    }, {}],
    10: [function(e, t, n) {
      function r() {
        this._events = this._events || {}, this._maxListeners = this._maxListeners || undefined
      }

      function i(e) {
        return typeof e == "function"
      }

      function s(e) {
        return typeof e == "number"
      }

      function o(e) {
        return typeof e == "object" && e !== null
      }

      function u(e) {
        return e === void 0
      }
      t.exports = r, r.EventEmitter = r, r.prototype._events = undefined, r.prototype._maxListeners = undefined, r.defaultMaxListeners = 10, r.prototype.setMaxListeners = function(e) {
        if (!s(e) || e < 0 || isNaN(e)) throw TypeError("n must be a positive number");
        return this._maxListeners = e, this
      }, r.prototype.emit = function(e) {
        var t, n, r, s, a, f;
        this._events || (this._events = {});
        if (e === "error")
          if (!this._events.error || o(this._events.error) && !this._events.error.length) throw t = arguments[1], t instanceof Error ? t : TypeError('Uncaught, unspecified "error" event.');
        n = this._events[e];
        if (u(n)) return !1;
        if (i(n)) switch (arguments.length) {
          case 1:
            n.call(this);
            break;
          case 2:
            n.call(this, arguments[1]);
            break;
          case 3:
            n.call(this, arguments[1], arguments[2]);
            break;
          default:
            r = arguments.length, s = new Array(r - 1);
            for (a = 1; a < r; a++) s[a - 1] = arguments[a];
            n.apply(this, s)
        } else if (o(n)) {
          r = arguments.length, s = new Array(r - 1);
          for (a = 1; a < r; a++) s[a - 1] = arguments[a];
          f = n.slice(), r = f.length;
          for (a = 0; a < r; a++) f[a].apply(this, s)
        }
        return !0
      }, r.prototype.addListener = function(e, t) {
        var n;
        if (!i(t)) throw TypeError("listener must be a function");
        this._events || (this._events = {}), this._events.newListener && this.emit("newListener", e, i(t.listener) ? t.listener : t), this._events[e] ? o(this._events[e]) ? this._events[e].push(t) : this._events[e] = [this._events[e], t] : this._events[e] = t;
        if (o(this._events[e]) && !this._events[e].warned) {
          var n;
          u(this._maxListeners) ? n = r.defaultMaxListeners : n = this._maxListeners, n && n > 0 && this._events[e].length > n && (this._events[e].warned = !0, console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.", this._events[e].length), console.trace())
        }
        return this
      }, r.prototype.on = r.prototype.addListener, r.prototype.once = function(e, t) {
        function r() {
          this.removeListener(e, r), n || (n = !0, t.apply(this, arguments))
        }
        if (!i(t)) throw TypeError("listener must be a function");
        var n = !1;
        return r.listener = t, this.on(e, r), this
      }, r.prototype.removeListener = function(e, t) {
        var n, r, s, u;
        if (!i(t)) throw TypeError("listener must be a function");
        if (!this._events || !this._events[e]) return this;
        n = this._events[e], s = n.length, r = -1;
        if (n === t || i(n.listener) && n.listener === t) delete this._events[e], this._events.removeListener && this.emit("removeListener", e, t);
        else if (o(n)) {
          for (u = s; u-- > 0;)
            if (n[u] === t || n[u].listener && n[u].listener === t) {
              r = u;
              break
            }
          if (r < 0) return this;
          n.length === 1 ? (n.length = 0, delete this._events[e]) : n.splice(r, 1), this._events.removeListener && this.emit("removeListener", e, t)
        }
        return this
      }, r.prototype.removeAllListeners = function(e) {
        var t, n;
        if (!this._events) return this;
        if (!this._events.removeListener) return arguments.length === 0 ? this._events = {} : this._events[e] && delete this._events[e], this;
        if (arguments.length === 0) {
          for (t in this._events) {
            if (t === "removeListener") continue;
            this.removeAllListeners(t)
          }
          return this.removeAllListeners("removeListener"), this._events = {}, this
        }
        n = this._events[e];
        if (i(n)) this.removeListener(e, n);
        else
          while (n.length) this.removeListener(e, n[n.length - 1]);
        return delete this._events[e], this
      }, r.prototype.listeners = function(e) {
        var t;
        return !this._events || !this._events[e] ? t = [] : i(this._events[e]) ? t = [this._events[e]] : t = this._events[e].slice(), t
      }, r.listenerCount = function(e, t) {
        var n;
        return !e._events || !e._events[t] ? n = 0 : i(e._events[t]) ? n = 1 : n = e._events[t].length, n
      }
    }, {}]
  }, {}, [3])(3)
}), ace.define("ace/mode/javascript_worker", ["require", "exports", "module", "ace/lib/oop", "ace/worker/mirror", "ace/mode/javascript/jshint"], function(require, exports, module) {
  "use strict";

  function startRegex(e) {
    return RegExp("^(" + e.join("|") + ")")
  }
  var oop = require("../lib/oop"),
    Mirror = require("../worker/mirror").Mirror,
    lint = require("./javascript/jshint").JSHINT,
    disabledWarningsRe = startRegex(["Bad for in variable '(.+)'.", 'Missing "use strict"']),
    errorsRe = startRegex(["Unexpected", "Expected ", "Confusing (plus|minus)", "\\{a\\} unterminated regular expression", "Unclosed ", "Unmatched ", "Unbegun comment", "Bad invocation", "Missing space after", "Missing operator at"]),
    infoRe = startRegex(["Expected an assignment", "Bad escapement of EOL", "Unexpected comma", "Unexpected space", "Missing radix parameter.", "A leading decimal point can", "\\['{a}'\\] is better written in dot notation.", "'{a}' used out of scope"]),
    JavaScriptWorker = exports.JavaScriptWorker = function(e) {
      Mirror.call(this, e), this.setTimeout(500), this.setOptions()
    };
  oop.inherits(JavaScriptWorker, Mirror),
    function() {
      this.setOptions = function(e) {
        this.options = e || {
          esnext: !0,
          moz: !0,
          devel: !0,
          browser: !0,
          node: !0,
          laxcomma: !0,
          laxbreak: !0,
          lastsemic: !0,
          onevar: !1,
          passfail: !1,
          maxerr: 100,
          expr: !0,
          multistr: !0,
          globalstrict: !0
        }, this.doc.getValue() && this.deferredUpdate.schedule(100)
      }, this.changeOptions = function(e) {
        oop.mixin(this.options, e), this.doc.getValue() && this.deferredUpdate.schedule(100)
      }, this.isValidJS = function(str) {
        try {
          eval("throw 0;" + str)
        } catch (e) {
          if (e === 0) return !0
        }
        return !1
      }, this.onUpdate = function() {
        var e = this.doc.getValue();
        e = e.replace(/^#!.*\n/, "\n");
        if (!e) {
          this.sender.emit("jslint", []);
          return
        }
        var t = [],
          n = this.isValidJS(e) ? "warning" : "error";
        lint(e, this.options);
        var r = lint.errors,
          i = !1;
        for (var s = 0; s < r.length; s++) {
          var o = r[s];
          if (!o) continue;
          var u = o.raw,
            a = "warning";
          if (u == "Missing semicolon.") {
            var f = o.evidence.substr(o.character);
            f = f.charAt(f.search(/\S/)), n == "error" && f && /[\w\d{(['"]/.test(f) ? (o.reason = 'Missing ";" before statement', a = "error") : a = "info"
          } else {
            if (disabledWarningsRe.test(u)) continue;
            infoRe.test(u) ? a = "info" : errorsRe.test(u) ? (i = !0, a = n) : u == "'{a}' is not defined." ? a = "warning" : u == "'{a}' is defined but never used." && (a = "info")
          }
          t.push({
            row: o.line - 1,
            column: o.character - 1,
            text: o.reason,
            type: a,
            raw: u
          }), i
        }
        this.sender.emit("jslint", t)
      }
    }.call(JavaScriptWorker.prototype)
}), ace.define("ace/lib/es5-shim", ["require", "exports", "module"], function(e, t, n) {
  function r() {}

  function w(e) {
    try {
      return Object.defineProperty(e, "sentinel", {}), "sentinel" in e
    } catch (t) {}
  }

  function H(e) {
    return e = +e, e !== e ? e = 0 : e !== 0 && e !== 1 / 0 && e !== -1 / 0 && (e = (e > 0 || -1) * Math.floor(Math.abs(e))), e
  }

  function B(e) {
    var t = typeof e;
    return e === null || t === "undefined" || t === "boolean" || t === "number" || t === "string"
  }

  function j(e) {
    var t, n, r;
    if (B(e)) return e;
    n = e.valueOf;
    if (typeof n == "function") {
      t = n.call(e);
      if (B(t)) return t
    }
    r = e.toString;
    if (typeof r == "function") {
      t = r.call(e);
      if (B(t)) return t
    }
    throw new TypeError
  }
  Function.prototype.bind || (Function.prototype.bind = function(t) {
    var n = this;
    if (typeof n != "function") throw new TypeError("Function.prototype.bind called on incompatible " + n);
    var i = u.call(arguments, 1),
      s = function() {
        if (this instanceof s) {
          var e = n.apply(this, i.concat(u.call(arguments)));
          return Object(e) === e ? e : this
        }
        return n.apply(t, i.concat(u.call(arguments)))
      };
    return n.prototype && (r.prototype = n.prototype, s.prototype = new r, r.prototype = null), s
  });
  var i = Function.prototype.call,
    s = Array.prototype,
    o = Object.prototype,
    u = s.slice,
    a = i.bind(o.toString),
    f = i.bind(o.hasOwnProperty),
    l, c, h, p, d;
  if (d = f(o, "__defineGetter__")) l = i.bind(o.__defineGetter__), c = i.bind(o.__defineSetter__), h = i.bind(o.__lookupGetter__), p = i.bind(o.__lookupSetter__);
  if ([1, 2].splice(0).length != 2)
    if (! function() {
        function e(e) {
          var t = new Array(e + 2);
          return t[0] = t[1] = 0, t
        }
        var t = [],
          n;
        t.splice.apply(t, e(20)), t.splice.apply(t, e(26)), n = t.length, t.splice(5, 0, "XXX"), n + 1 == t.length;
        if (n + 1 == t.length) return !0
      }()) Array.prototype.splice = function(e, t) {
      var n = this.length;
      e > 0 ? e > n && (e = n) : e == void 0 ? e = 0 : e < 0 && (e = Math.max(n + e, 0)), e + t < n || (t = n - e);
      var r = this.slice(e, e + t),
        i = u.call(arguments, 2),
        s = i.length;
      if (e === n) s && this.push.apply(this, i);
      else {
        var o = Math.min(t, n - e),
          a = e + o,
          f = a + s - o,
          l = n - a,
          c = n - o;
        if (f < a)
          for (var h = 0; h < l; ++h) this[f + h] = this[a + h];
        else if (f > a)
          for (h = l; h--;) this[f + h] = this[a + h];
        if (s && e === c) this.length = c, this.push.apply(this, i);
        else {
          this.length = c + s;
          for (h = 0; h < s; ++h) this[e + h] = i[h]
        }
      }
      return r
    };
    else {
      var v = Array.prototype.splice;
      Array.prototype.splice = function(e, t) {
        return arguments.length ? v.apply(this, [e === void 0 ? 0 : e, t === void 0 ? this.length - e : t].concat(u.call(arguments, 2))) : []
      }
    }
  Array.isArray || (Array.isArray = function(t) {
    return a(t) == "[object Array]"
  });
  var m = Object("a"),
    g = m[0] != "a" || !(0 in m);
  Array.prototype.forEach || (Array.prototype.forEach = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = arguments[1],
      s = -1,
      o = r.length >>> 0;
    if (a(t) != "[object Function]") throw new TypeError;
    while (++s < o) s in r && t.call(i, r[s], s, n)
  }), Array.prototype.map || (Array.prototype.map = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0,
      s = Array(i),
      o = arguments[1];
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    for (var u = 0; u < i; u++) u in r && (s[u] = t.call(o, r[u], u, n));
    return s
  }), Array.prototype.filter || (Array.prototype.filter = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0,
      s = [],
      o, u = arguments[1];
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    for (var f = 0; f < i; f++) f in r && (o = r[f], t.call(u, o, f, n) && s.push(o));
    return s
  }), Array.prototype.every || (Array.prototype.every = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0,
      s = arguments[1];
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    for (var o = 0; o < i; o++)
      if (o in r && !t.call(s, r[o], o, n)) return !1;
    return !0
  }), Array.prototype.some || (Array.prototype.some = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0,
      s = arguments[1];
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    for (var o = 0; o < i; o++)
      if (o in r && t.call(s, r[o], o, n)) return !0;
    return !1
  }), Array.prototype.reduce || (Array.prototype.reduce = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0;
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    if (!i && arguments.length == 1) throw new TypeError("reduce of empty array with no initial value");
    var s = 0,
      o;
    if (arguments.length >= 2) o = arguments[1];
    else
      do {
        if (s in r) {
          o = r[s++];
          break
        }
        if (++s >= i) throw new TypeError("reduce of empty array with no initial value")
      } while (!0);
    for (; s < i; s++) s in r && (o = t.call(void 0, o, r[s], s, n));
    return o
  }), Array.prototype.reduceRight || (Array.prototype.reduceRight = function(t) {
    var n = F(this),
      r = g && a(this) == "[object String]" ? this.split("") : n,
      i = r.length >>> 0;
    if (a(t) != "[object Function]") throw new TypeError(t + " is not a function");
    if (!i && arguments.length == 1) throw new TypeError("reduceRight of empty array with no initial value");
    var s, o = i - 1;
    if (arguments.length >= 2) s = arguments[1];
    else
      do {
        if (o in r) {
          s = r[o--];
          break
        }
        if (--o < 0) throw new TypeError("reduceRight of empty array with no initial value")
      } while (!0);
    do o in this && (s = t.call(void 0, s, r[o], o, n)); while (o--);
    return s
  });
  if (!Array.prototype.indexOf || [0, 1].indexOf(1, 2) != -1) Array.prototype.indexOf = function(t) {
    var n = g && a(this) == "[object String]" ? this.split("") : F(this),
      r = n.length >>> 0;
    if (!r) return -1;
    var i = 0;
    arguments.length > 1 && (i = H(arguments[1])), i = i >= 0 ? i : Math.max(0, r + i);
    for (; i < r; i++)
      if (i in n && n[i] === t) return i;
    return -1
  };
  if (!Array.prototype.lastIndexOf || [0, 1].lastIndexOf(0, -3) != -1) Array.prototype.lastIndexOf = function(t) {
    var n = g && a(this) == "[object String]" ? this.split("") : F(this),
      r = n.length >>> 0;
    if (!r) return -1;
    var i = r - 1;
    arguments.length > 1 && (i = Math.min(i, H(arguments[1]))), i = i >= 0 ? i : r - Math.abs(i);
    for (; i >= 0; i--)
      if (i in n && t === n[i]) return i;
    return -1
  };
  Object.getPrototypeOf || (Object.getPrototypeOf = function(t) {
    return t.__proto__ || (t.constructor ? t.constructor.prototype : o)
  });
  if (!Object.getOwnPropertyDescriptor) {
    var y = "Object.getOwnPropertyDescriptor called on a non-object: ";
    Object.getOwnPropertyDescriptor = function(t, n) {
      if (typeof t != "object" && typeof t != "function" || t === null) throw new TypeError(y + t);
      if (!f(t, n)) return;
      var r, i, s;
      r = {
        enumerable: !0,
        configurable: !0
      };
      if (d) {
        var u = t.__proto__;
        t.__proto__ = o;
        var i = h(t, n),
          s = p(t, n);
        t.__proto__ = u;
        if (i || s) return i && (r.get = i), s && (r.set = s), r
      }
      return r.value = t[n], r
    }
  }
  Object.getOwnPropertyNames || (Object.getOwnPropertyNames = function(t) {
    return Object.keys(t)
  });
  if (!Object.create) {
    var b;
    Object.prototype.__proto__ === null ? b = function() {
      return {
        __proto__: null
      }
    } : b = function() {
      var e = {};
      for (var t in e) e[t] = null;
      return e.constructor = e.hasOwnProperty = e.propertyIsEnumerable = e.isPrototypeOf = e.toLocaleString = e.toString = e.valueOf = e.__proto__ = null, e
    }, Object.create = function(t, n) {
      var r;
      if (t === null) r = b();
      else {
        if (typeof t != "object") throw new TypeError("typeof prototype[" + typeof t + "] != 'object'");
        var i = function() {};
        i.prototype = t, r = new i, r.__proto__ = t
      }
      return n !== void 0 && Object.defineProperties(r, n), r
    }
  }
  if (Object.defineProperty) {
    var E = w({}),
      S = typeof document == "undefined" || w(document.createElement("div"));
    if (!E || !S) var x = Object.defineProperty
  }
  if (!Object.defineProperty || x) {
    var T = "Property description must be an object: ",
      N = "Object.defineProperty called on non-object: ",
      C = "getters & setters can not be defined on this javascript engine";
    Object.defineProperty = function(t, n, r) {
      if (typeof t != "object" && typeof t != "function" || t === null) throw new TypeError(N + t);
      if (typeof r != "object" && typeof r != "function" || r === null) throw new TypeError(T + r);
      if (x) try {
        return x.call(Object, t, n, r)
      } catch (i) {}
      if (f(r, "value"))
        if (d && (h(t, n) || p(t, n))) {
          var s = t.__proto__;
          t.__proto__ = o, delete t[n], t[n] = r.value, t.__proto__ = s
        } else t[n] = r.value;
      else {
        if (!d) throw new TypeError(C);
        f(r, "get") && l(t, n, r.get), f(r, "set") && c(t, n, r.set)
      }
      return t
    }
  }
  Object.defineProperties || (Object.defineProperties = function(t, n) {
    for (var r in n) f(n, r) && Object.defineProperty(t, r, n[r]);
    return t
  }), Object.seal || (Object.seal = function(t) {
    return t
  }), Object.freeze || (Object.freeze = function(t) {
    return t
  });
  try {
    Object.freeze(function() {})
  } catch (k) {
    Object.freeze = function(t) {
      return function(n) {
        return typeof n == "function" ? n : t(n)
      }
    }(Object.freeze)
  }
  Object.preventExtensions || (Object.preventExtensions = function(t) {
    return t
  }), Object.isSealed || (Object.isSealed = function(t) {
    return !1
  }), Object.isFrozen || (Object.isFrozen = function(t) {
    return !1
  }), Object.isExtensible || (Object.isExtensible = function(t) {
    if (Object(t) === t) throw new TypeError;
    var n = "";
    while (f(t, n)) n += "?";
    t[n] = !0;
    var r = f(t, n);
    return delete t[n], r
  });
  if (!Object.keys) {
    var L = !0,
      A = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"],
      O = A.length;
    for (var M in {
        toString: null
      }) L = !1;
    Object.keys = function I(e) {
      if (typeof e != "object" && typeof e != "function" || e === null) throw new TypeError("Object.keys called on a non-object");
      var I = [];
      for (var t in e) f(e, t) && I.push(t);
      if (L)
        for (var n = 0, r = O; n < r; n++) {
          var i = A[n];
          f(e, i) && I.push(i)
        }
      return I
    }
  }
  Date.now || (Date.now = function() {
    return (new Date).getTime()
  });
  var _ = "	\n\f\r \u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff";
  if (!String.prototype.trim || _.trim()) {
    _ = "[" + _ + "]";
    var D = new RegExp("^" + _ + _ + "*"),
      P = new RegExp(_ + _ + "*$");
    String.prototype.trim = function() {
      return String(this).replace(D, "").replace(P, "")
    }
  }
  var F = function(e) {
    if (e == null) throw new TypeError("can't convert " + e + " to object");
    return Object(e)
  }
})