From 92819630d5fcd2f87e6de8a33644fa9c35cade01 Mon Sep 17 00:00:00 2001 From: drawcall Date: Sun, 10 Dec 2023 19:25:55 +0800 Subject: [PATCH] feat: Some upgrades and fixes feat: Some upgrades and fixes --- build/proton.js | 204 ++++++++++++++++++------------------ build/proton.min.js | 6 +- build/proton.min.js.map | 2 +- package.json | 4 +- src/emitter/Emitter.js | 7 +- src/render/EaselRenderer.js | 4 +- src/utils/PropUtil.js | 2 + 7 files changed, 119 insertions(+), 110 deletions(-) diff --git a/build/proton.js b/build/proton.js index 790278e..e60575e 100755 --- a/build/proton.js +++ b/build/proton.js @@ -1225,6 +1225,82 @@ return Rgb; }(); + var Span = /*#__PURE__*/function () { + function Span(a, b, center) { + if (Util.isArray(a)) { + this.isArray = true; + this.a = a; + } else { + this.isArray = false; + this.a = Util.initValue(a, 1); + this.b = Util.initValue(b, this.a); + this.center = Util.initValue(center, false); + } + } + + var _proto = Span.prototype; + + _proto.getValue = function getValue(isInt) { + if (isInt === void 0) { + isInt = false; + } + + if (this.isArray) { + return Util.getRandFromArray(this.a); + } else { + if (!this.center) { + return MathUtil.randomAToB(this.a, this.b, isInt); + } else { + return MathUtil.randomFloating(this.a, this.b, isInt); + } + } + } + /** + * Returns a new Span object + * + * @memberof Proton#Proton.Util + * @method setSpanValue + * + * @todo a, b and c should be 'Mixed' or 'Number'? + * + * @param {Mixed | Span} a + * @param {Mixed} b + * @param {Mixed} c + * + * @return {Span} + */ + ; + + Span.setSpanValue = function setSpanValue(a, b, c) { + if (a instanceof Span) { + return a; + } else { + if (b === undefined) { + return new Span(a); + } else { + if (c === undefined) return new Span(a, b);else return new Span(a, b, c); + } + } + } + /** + * Returns the value from a Span, if the param is not a Span it will return the given parameter + * + * @memberof Proton#Proton.Util + * @method getValue + * + * @param {Mixed | Span} pan + * + * @return {Mixed} the value of Span OR the parameter if it is not a Span + */ + ; + + Span.getSpanValue = function getSpanValue(pan) { + return pan instanceof Span ? pan.getValue() : pan; + }; + + return Span; + }(); + var PropUtil = { hasProp: function hasProp(target, key) { if (!target) return false; @@ -1867,82 +1943,6 @@ } }; - var Span$1 = /*#__PURE__*/function () { - function Span(a, b, center) { - if (Util.isArray(a)) { - this.isArray = true; - this.a = a; - } else { - this.isArray = false; - this.a = Util.initValue(a, 1); - this.b = Util.initValue(b, this.a); - this.center = Util.initValue(center, false); - } - } - - var _proto = Span.prototype; - - _proto.getValue = function getValue(isInt) { - if (isInt === void 0) { - isInt = false; - } - - if (this.isArray) { - return Util.getRandFromArray(this.a); - } else { - if (!this.center) { - return MathUtil.randomAToB(this.a, this.b, isInt); - } else { - return MathUtil.randomFloating(this.a, this.b, isInt); - } - } - } - /** - * Returns a new Span object - * - * @memberof Proton#Proton.Util - * @method setSpanValue - * - * @todo a, b and c should be 'Mixed' or 'Number'? - * - * @param {Mixed | Span} a - * @param {Mixed} b - * @param {Mixed} c - * - * @return {Span} - */ - ; - - Span.setSpanValue = function setSpanValue(a, b, c) { - if (a instanceof Span) { - return a; - } else { - if (b === undefined) { - return new Span(a); - } else { - if (c === undefined) return new Span(a, b);else return new Span(a, b, c); - } - } - } - /** - * Returns the value from a Span, if the param is not a Span it will return the given parameter - * - * @memberof Proton#Proton.Util - * @method getValue - * - * @param {Mixed | Span} pan - * - * @return {Mixed} the value of Span OR the parameter if it is not a Span - */ - ; - - Span.getSpanValue = function getSpanValue(pan) { - return pan instanceof Span ? pan.getValue() : pan; - }; - - return Span; - }(); - var ArraySpan = /*#__PURE__*/function (_Span) { _inheritsLoose(ArraySpan, _Span); @@ -1979,7 +1979,7 @@ }; return ArraySpan; - }(Span$1); + }(Span); var Rectangle = /*#__PURE__*/function () { function Rectangle(x, y, w, h) { @@ -2013,8 +2013,8 @@ * for example: new Rate(new Span(10, 20), new Span(.1, .25)); */ function Rate(numpan, timepan) { - this.numPan = Span$1.setSpanValue(Util.initValue(numpan, 1)); - this.timePan = Span$1.setSpanValue(Util.initValue(timepan, 1)); + this.numPan = Span.setSpanValue(Util.initValue(numpan, 1)); + this.timePan = Span.setSpanValue(Util.initValue(timepan, 1)); this.startTime = 0; this.nextTime = 0; this.init(); @@ -2075,7 +2075,7 @@ var _this; _this = _Initialize.call(this) || this; - _this.lifePan = Span$1.setSpanValue(a, b, c); + _this.lifePan = Span.setSpanValue(a, b, c); _this.name = "Life"; return _this; } @@ -2174,8 +2174,8 @@ var _this; _this = _Initialize.call(this) || this; - _this.rPan = Span$1.setSpanValue(rpan); - _this.thaPan = Span$1.setSpanValue(thapan); + _this.rPan = Span.setSpanValue(rpan); + _this.thaPan = Span.setSpanValue(thapan); _this.type = Util.initValue(type, "vector"); _this.name = "Velocity"; return _this; @@ -2184,8 +2184,8 @@ var _proto = Velocity.prototype; _proto.reset = function reset(rpan, thapan, type) { - this.rPan = Span$1.setSpanValue(rpan); - this.thaPan = Span$1.setSpanValue(thapan); + this.rPan = Span.setSpanValue(rpan); + this.thaPan = Span.setSpanValue(thapan); this.type = Util.initValue(type, "vector"); }; @@ -2214,7 +2214,7 @@ var _this; _this = _Initialize.call(this) || this; - _this.massPan = Span$1.setSpanValue(a, b, c); + _this.massPan = Span.setSpanValue(a, b, c); _this.name = "Mass"; return _this; } @@ -2235,7 +2235,7 @@ var _this; _this = _Initialize.call(this) || this; - _this.radius = Span$1.setSpanValue(a, b, c); + _this.radius = Span.setSpanValue(a, b, c); _this.name = "Radius"; return _this; } @@ -2243,7 +2243,7 @@ var _proto = Radius.prototype; _proto.reset = function reset(a, b, c) { - this.radius = Span$1.setSpanValue(a, b, c); + this.radius = Span.setSpanValue(a, b, c); }; _proto.initialize = function initialize(particle) { @@ -2974,8 +2974,8 @@ _proto.reset = function reset(a, b, life, easing) { this.same = b === null || b === undefined ? true : false; - this.a = Span$1.setSpanValue(Util.initValue(a, 1)); - this.b = Span$1.setSpanValue(b); + this.a = Span.setSpanValue(Util.initValue(a, 1)); + this.b = Span.setSpanValue(b); life && _Behaviour.prototype.reset.call(this, life, easing); } /** @@ -3059,8 +3059,8 @@ _proto.reset = function reset(a, b, life, easing) { this.same = b === null || b === undefined ? true : false; - this.a = Span$1.setSpanValue(Util.initValue(a, 1)); - this.b = Span$1.setSpanValue(b); + this.a = Span.setSpanValue(Util.initValue(a, 1)); + this.b = Span.setSpanValue(b); life && _Behaviour.prototype.reset.call(this, life, easing); } /** @@ -3152,8 +3152,8 @@ _proto.reset = function reset(a, b, style, life, easing) { this.same = b === null || b === undefined ? true : false; - this.a = Span$1.setSpanValue(Util.initValue(a, "Velocity")); - this.b = Span$1.setSpanValue(Util.initValue(b, 0)); + this.a = Span.setSpanValue(Util.initValue(a, "Velocity")); + this.b = Span.setSpanValue(Util.initValue(b, 0)); this.style = Util.initValue(style, "to"); life && _Behaviour.prototype.reset.call(this, life, easing); } @@ -3340,7 +3340,7 @@ this.angle = -MathUtil.PI / 2; } else if (angle === "random") { this.angle = "random"; - } else if (angle instanceof Span$1) { + } else if (angle instanceof Span) { this.angle = "span"; this.span = angle; } else if (angle) { @@ -3853,7 +3853,11 @@ }; _proto.emitting = function emitting(time) { - if (this.totalTime === "once") { + if (this.stoped) return; + + if (this.totalTime === "none") { + this.emitTime += time; + } else if (this.totalTime === "once") { var i; var length = this.rate.getValue(99999); if (length > 0) this.emitSpeed = length; @@ -4527,7 +4531,7 @@ }; _proto.createCircle = function createCircle(particle) { - var graphics = this.pool.get(createjs.Graphics); + var graphics = this.pool.get(window.createjs.Graphics); if (this.stroke) { if (Types.isString(this.stroke)) { @@ -4538,7 +4542,7 @@ } graphics.beginFill(particle.color || "#ff0000").drawCircle(0, 0, particle.radius); - var shape = this.pool.get(createjs.Shape, [graphics]); + var shape = this.pool.get(window.createjs.Shape, [graphics]); particle.body = shape; particle.graphics = graphics; }; @@ -5470,11 +5474,11 @@ Proton.Rectangle = Rectangle; Proton.Rate = Rate; Proton.ease = ease; - Proton.Span = Span$1; + Proton.Span = Span; Proton.Mat3 = Mat3; Proton.getSpan = function (a, b, center) { - return new Span$1(a, b, center); + return new Span(a, b, center); }; Proton.createArraySpan = ArraySpan.createArraySpan; @@ -5521,4 +5525,4 @@ return Proton; }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvV2ViR0xVdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0RvbVV0aWwuanMiLCIuLi9zcmMvdXRpbHMvSW1nVXRpbC5qcyIsIi4uL3NyYy91dGlscy9VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL1B1aWQuanMiLCIuLi9zcmMvY29yZS9Qb29sLmpzIiwiLi4vc3JjL2RlYnVnL1N0YXRzLmpzIiwiLi4vc3JjL2V2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbC5qcyIsIi4uL3NyYy9tYXRoL0ludGVncmF0aW9uLmpzIiwiLi4vc3JjL2NvcmUvUHJvdG9uLmpzIiwiLi4vc3JjL3V0aWxzL1JnYi5qcyIsIi4uL3NyYy91dGlscy9Qcm9wVXRpbC5qcyIsIi4uL3NyYy9tYXRoL2Vhc2UuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyRC5qcyIsIi4uL3NyYy9jb3JlL1BhcnRpY2xlLmpzIiwiLi4vc3JjL3V0aWxzL0NvbG9yVXRpbC5qcyIsIi4uL3NyYy9tYXRoL1BvbGFyMkQuanMiLCIuLi9zcmMvbWF0aC9NYXQzLmpzIiwiLi4vc3JjL21hdGgvU3Bhbi5qcyIsIi4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyIsIi4uL3NyYy9tYXRoL1JlY3RhbmdsZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhdGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Jbml0aWFsaXplLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTGlmZS5qcyIsIi4uL3NyYy96b25lL1pvbmUuanMiLCIuLi9zcmMvem9uZS9Qb2ludFpvbmUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Qb3NpdGlvbi5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1ZlbG9jaXR5LmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTWFzcy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhZGl1cy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0JvZHkuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0JlaGF2aW91ci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0F0dHJhY3Rpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL1JhbmRvbURyaWZ0LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xsaXNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0Nyb3NzWm9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiLCIuLi9zcmMvYmVoYXZpb3VyL1NjYWxlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Sb3RhdGUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0NvbG9yLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9DeWNsb25lLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SZXB1bHNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0dyYXZpdHlXZWxsLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWwuanMiLCIuLi9zcmMvZW1pdHRlci9FbWl0dGVyLmpzIiwiLi4vc3JjL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiLCIuLi9zcmMvdXRpbHMvVHlwZXMuanMiLCIuLi9zcmMvcmVuZGVyL0Jhc2VSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ2FudmFzUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0RvbVJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9FYXNlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhpUmVuZGVyZXIuanMiLCIuLi9zcmMvdXRpbHMvTVN0YWNrLmpzIiwiLi4vc3JjL3JlbmRlci9XZWJHTFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9DdXN0b21SZW5kZXJlci5qcyIsIi4uL3NyYy96b25lL0xpbmVab25lLmpzIiwiLi4vc3JjL3pvbmUvQ2lyY2xlWm9uZS5qcyIsIi4uL3NyYy96b25lL1JlY3Rab25lLmpzIiwiLi4vc3JjL3pvbmUvSW1hZ2Vab25lLmpzIiwiLi4vc3JjL2RlYnVnL0RlYnVnLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIGlwb3RcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBsZW5ndGggZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXBvdChsZW5ndGgpIHtcbiAgICByZXR1cm4gKGxlbmd0aCAmIChsZW5ndGggLSAxKSkgPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG5ocG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgbmhwb3QobGVuZ3RoKSB7XG4gICAgLS1sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMjsgaSA8PD0gMSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgKGxlbmd0aCA+PiBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoICsgMTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVRyYW5zbGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkge1xuICAgIHJldHVybiBbMSwgMCwgMCwgMCwgMSwgMCwgdHgsIHR5LCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVJvdGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZUluUmFkaWFuc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlUm90YXRpb24oYW5nbGVJblJhZGlhbnMpIHtcbiAgICBsZXQgYyA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcbiAgICBsZXQgcyA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcblxuICAgIHJldHVybiBbYywgLXMsIDAsIHMsIGMsIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYWtlU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCB0eCwgdHkgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3ggZWl0aGVyIDAgb3IgMVxuICAgKiBAcGFyYW0ge051bWJlcn0gc3kgZWl0aGVyIDAgb3IgMVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlU2NhbGUoc3gsIHN5KSB7XG4gICAgcmV0dXJuIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYXRyaXhNdWx0aXBseVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGEsIGIgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYVxuICAgKiBAcGFyYW0ge09iamVjdH0gYlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYXRyaXhNdWx0aXBseShhLCBiKSB7XG4gICAgbGV0IGEwMCA9IGFbMCAqIDMgKyAwXTtcbiAgICBsZXQgYTAxID0gYVswICogMyArIDFdO1xuICAgIGxldCBhMDIgPSBhWzAgKiAzICsgMl07XG4gICAgbGV0IGExMCA9IGFbMSAqIDMgKyAwXTtcbiAgICBsZXQgYTExID0gYVsxICogMyArIDFdO1xuICAgIGxldCBhMTIgPSBhWzEgKiAzICsgMl07XG4gICAgbGV0IGEyMCA9IGFbMiAqIDMgKyAwXTtcbiAgICBsZXQgYTIxID0gYVsyICogMyArIDFdO1xuICAgIGxldCBhMjIgPSBhWzIgKiAzICsgMl07XG4gICAgbGV0IGIwMCA9IGJbMCAqIDMgKyAwXTtcbiAgICBsZXQgYjAxID0gYlswICogMyArIDFdO1xuICAgIGxldCBiMDIgPSBiWzAgKiAzICsgMl07XG4gICAgbGV0IGIxMCA9IGJbMSAqIDMgKyAwXTtcbiAgICBsZXQgYjExID0gYlsxICogMyArIDFdO1xuICAgIGxldCBiMTIgPSBiWzEgKiAzICsgMl07XG4gICAgbGV0IGIyMCA9IGJbMiAqIDMgKyAwXTtcbiAgICBsZXQgYjIxID0gYlsyICogMyArIDFdO1xuICAgIGxldCBiMjIgPSBiWzIgKiAzICsgMl07XG5cbiAgICByZXR1cm4gW1xuICAgICAgYTAwICogYjAwICsgYTAxICogYjEwICsgYTAyICogYjIwLFxuICAgICAgYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxLFxuICAgICAgYTAwICogYjAyICsgYTAxICogYjEyICsgYTAyICogYjIyLFxuICAgICAgYTEwICogYjAwICsgYTExICogYjEwICsgYTEyICogYjIwLFxuICAgICAgYTEwICogYjAxICsgYTExICogYjExICsgYTEyICogYjIxLFxuICAgICAgYTEwICogYjAyICsgYTExICogYjEyICsgYTEyICogYjIyLFxuICAgICAgYTIwICogYjAwICsgYTIxICogYjEwICsgYTIyICogYjIwLFxuICAgICAgYTIwICogYjAxICsgYTIxICogYjExICsgYTIyICogYjIxLFxuICAgICAgYTIwICogYjAyICsgYTIxICogYjEyICsgYTIyICogYjIyXG4gICAgXTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FudmFzLiBUaGUgb3BhY2l0eSBpcyBieSBkZWZhdWx0IHNldCB0byAwXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9ICRpZCB0aGUgY2FudmFzJyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHdpZHRoIHRoZSBjYW52YXMnIHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkaGVpZ2h0IHRoZSBjYW52YXMnIGhlaWdodFxuICAgKiBAcGFyYW0ge1N0cmluZ30gWyRwb3NpdGlvbj1hYnNvbHV0ZV0gdGhlIGNhbnZhcycgcG9zaXRpb24sIGRlZmF1bHQgaXMgJ2Fic29sdXRlJ1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgIGRvbS5pZCA9IGlkO1xuICAgIGRvbS53aWR0aCA9IHdpZHRoO1xuICAgIGRvbS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZG9tLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRvbS5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtKGRvbSwgLTUwMCwgLTUwMCwgMCwgMCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIGNyZWF0ZURpdihpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgdGhpcy5yZXNpemUoZG9tLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBkb207XG4gIH0sXG5cbiAgcmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRvbS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgZG9tLnN0eWxlLm1hcmdpbkxlZnQgPSAtd2lkdGggLyAyICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAtaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIHRyYW5zZm9ybTogdHJhbnNsYXRlKCksIHNjYWxlKCksIHJvdGF0ZSgpIHRvIGEgZ2l2ZW4gZGl2IGRvbSBmb3IgYWxsIGJyb3dzZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCB0cmFuc2Zvcm1cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkeFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRzY2FsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gJHJvdGF0ZVxuICAgKi9cbiAgdHJhbnNmb3JtKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KSBzY2FsZSgke3NjYWxlfSkgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICAgIHRoaXMuY3NzMyhkaXYsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XG4gIH0sXG5cbiAgdHJhbnNmb3JtM2QoZGl2LCB4LCB5LCBzY2FsZSwgcm90YXRlKSB7XG4gICAgZGl2LnN0eWxlLndpbGxDaGFuZ2UgPSBcInRyYW5zZm9ybVwiO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcImJhY2tmYWNlVmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIGNzczMoZGl2LCBrZXksIHZhbCkge1xuICAgIGNvbnN0IGJrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuXG4gICAgZGl2LnN0eWxlW2BXZWJraXQke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BNb3oke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BPJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgbXMke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2Ake2tleX1gXSA9IHZhbDtcbiAgfVxufTtcbiIsImltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4vV2ViR0xVdGlsXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi9Eb21VdGlsXCI7XG5cbmNvbnN0IGltZ3NDYWNoZSA9IHt9O1xuY29uc3QgY2FudmFzQ2FjaGUgPSB7fTtcbmxldCBjYW52YXNJZCA9IDA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCByZWN0LngsIHJlY3QueSk7XG4gICAgY29uc3QgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIGltYWdlZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltZ0Zyb21DYWNoZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gZGVzY3JpYmUgZnVuY1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGltZ1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gICAgIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZHJhd0NhbnZhcyAgc2V0IHRvIHRydWUgaWYgYSBjYW52YXMgc2hvdWxkIGJlIHNhdmVkIGludG8gcGFydGljbGUuZGF0YS5jYW52YXNcbiAgICogQHBhcmFtIHtCb29sZWFufSAgICAgICAgICAgICBmdW5jXG4gICAqL1xuICBnZXRJbWdGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSB0eXBlb2YgaW1nID09PSBcInN0cmluZ1wiID8gaW1nIDogaW1nLnNyYztcblxuICAgIGlmIChpbWdzQ2FjaGVbc3JjXSkge1xuICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICBpbWdzQ2FjaGVbc3JjXSA9IGUudGFyZ2V0O1xuICAgICAgICBjYWxsYmFjayhpbWdzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuICAgICAgfTtcblxuICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgIH1cbiAgfSxcblxuICBnZXRDYW52YXNGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xuXG4gICAgaWYgKCFjYW52YXNDYWNoZVtzcmNdKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChpbWcud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KGltZy5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhgcHJvdG9uX2NhbnZhc19jYWNoZV8keysrY2FudmFzSWR9YCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgICAgY2FudmFzQ2FjaGVbc3JjXSA9IGNhbnZhcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjYW52YXNDYWNoZVtzcmNdLCBwYXJhbSk7XG5cbiAgICByZXR1cm4gY2FudmFzQ2FjaGVbc3JjXTtcbiAgfVxufTtcbiIsImltcG9ydCBJbWdVdGlsIGZyb20gXCIuL0ltZ1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGluaXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBhIHNwZWNpZmljIHZhbHVlLCBjb3VsZCBiZSBldmVyeXRoaW5nIGJ1dCBudWxsIG9yIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSBkZWZhdWx0cyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIGluaXRWYWx1ZSh2YWx1ZSwgZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHRzO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpc0FycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEFueSBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFueSBhcnJheVxuICAgKi9cbiAgZW1wdHlBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyKSBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICB0b0FycmF5KGFycikge1xuICAgIHJldHVybiB0aGlzLmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xuICB9LFxuXG4gIHNsaWNlQXJyYXkoYXJyMSwgaW5kZXgsIGFycjIpIHtcbiAgICB0aGlzLmVtcHR5QXJyYXkoYXJyMik7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyMi5wdXNoKGFycjFbaV0pO1xuICAgIH1cbiAgfSxcblxuICBnZXRSYW5kRnJvbUFycmF5KGFycikge1xuICAgIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJyW01hdGguZmxvb3IoYXJyLmxlbmd0aCAqIE1hdGgucmFuZG9tKCkpXTtcbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveWVzIHRoZSBnaXZlbiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGVtcHR5T2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW55IG9iamVjdFxuICAgKi9cbiAgZW1wdHlPYmplY3Qob2JqLCBpZ25vcmUgPSBudWxsKSB7XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgaWYgKGlnbm9yZSAmJiBpZ25vcmUuaW5kZXhPZihrZXkpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWFrZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBhbmQgYmluZHMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBjbGFzc0FwcGx5XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIEEgY2xhc3MgdG8gbWFrZSBhbiBpbnN0YW5jZSBmcm9tXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcmdzXSBBbnkgYXJyYXkgdG8gYmluZCBpdCB0byB0aGUgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgaW5zdGFuY2Ugb2YgY29uc3RydWN0b3IsIG9wdGlvbmFsbHkgYmluZCB3aXRoIGFyZ3NcbiAgICovXG4gIGNsYXNzQXBwbHkoY29uc3RydWN0b3IsIGFyZ3MgPSBudWxsKSB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm4gbmV3IGNvbnN0cnVjdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IEZhY3RvcnlGdW5jID0gY29uc3RydWN0b3IuYmluZC5hcHBseShjb25zdHJ1Y3RvciwgW251bGxdLmNvbmNhdChhcmdzKSk7XG4gICAgICByZXR1cm4gbmV3IEZhY3RvcnlGdW5jKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBpbWFnZSBkYXRhLiBJdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgUHJvdG9uLlpvbmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRJbWFnZURhdGFcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gICBjb250ZXh0IGFueSBjYW52YXMsIG11c3QgYmUgYSAyZENvbnRleHQgJ2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpJ1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgIGltYWdlICAgY291bGQgYmUgYW55IGRvbSBpbWFnZSwgZS5nLiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhpc0lzQW5JbWdUYWcnKTtcbiAgICogQHBhcmFtIHtQcm90b24uUmVjdGFuZ2xlfSAgICByZWN0XG4gICAqL1xuICBnZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpIHtcbiAgICByZXR1cm4gSW1nVXRpbC5nZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpO1xuICB9LFxuXG4gIGRlc3Ryb3lBbGwoYXJyLCBwYXJhbSA9IG51bGwpIHtcbiAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJbaV0uZGVzdHJveShwYXJhbSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICBkZWxldGUgYXJyW2ldO1xuICAgIH1cblxuICAgIGFyci5sZW5ndGggPSAwO1xuICB9LFxuXG4gIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICB9XG59O1xuIiwiY29uc3QgaWRzTWFwID0ge307XG5cbmNvbnN0IFB1aWQgPSB7XG4gIF9pbmRleDogMCxcbiAgX2NhY2hlOiB7fSxcblxuICBpZCh0eXBlKSB7XG4gICAgaWYgKGlkc01hcFt0eXBlXSA9PT0gdW5kZWZpbmVkIHx8IGlkc01hcFt0eXBlXSA9PT0gbnVsbCkgaWRzTWFwW3R5cGVdID0gMDtcbiAgICByZXR1cm4gYCR7dHlwZX1fJHtpZHNNYXBbdHlwZV0rK31gO1xuICB9LFxuXG4gIGdldElkKHRhcmdldCkge1xuICAgIGxldCB1aWQgPSB0aGlzLmdldElkRnJvbUNhY2hlKHRhcmdldCk7XG4gICAgaWYgKHVpZCkgcmV0dXJuIHVpZDtcblxuICAgIHVpZCA9IGBQVUlEXyR7dGhpcy5faW5kZXgrK31gO1xuICAgIHRoaXMuX2NhY2hlW3VpZF0gPSB0YXJnZXQ7XG4gICAgcmV0dXJuIHVpZDtcbiAgfSxcblxuICBnZXRJZEZyb21DYWNoZSh0YXJnZXQpIHtcbiAgICBsZXQgb2JqLCBpZDtcblxuICAgIGZvciAoaWQgaW4gdGhpcy5fY2FjaGUpIHtcbiAgICAgIG9iaiA9IHRoaXMuX2NhY2hlW2lkXTtcblxuICAgICAgaWYgKG9iaiA9PT0gdGFyZ2V0KSByZXR1cm4gaWQ7XG4gICAgICBpZiAodGhpcy5pc0JvZHkob2JqLCB0YXJnZXQpICYmIG9iai5zcmMgPT09IHRhcmdldC5zcmMpIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICBpc0JvZHkob2JqLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIG9iai5pc0lubmVyICYmIHRhcmdldC5pc0lubmVyO1xuICB9LFxuXG4gIGdldFRhcmdldCh1aWQpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVbdWlkXTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVpZDtcbiIsIi8qKlxuICogUG9vbCBpcyB0aGUgY2FjaGUgcG9vbCBvZiB0aGUgcHJvdG9uIGVuZ2luZSwgaXQgaXMgdmVyeSBpbXBvcnRhbnQuXG4gKlxuICogZ2V0KHRhcmdldCwgcGFyYW1zLCB1aWQpXG4gKiAgQ2xhc3NcbiAqICAgIHVpZCA9IFB1aWQuZ2V0SWQgLT4gUHVpZCBzYXZlIHRhcmdldCBjYWNoZVxuICogICAgdGFyZ2V0Ll9fcHVpZCA9IHVpZFxuICpcbiAqICBib2R5XG4gKiAgICB1aWQgPSBQdWlkLmdldElkIC0+IFB1aWQgc2F2ZSB0YXJnZXQgY2FjaGVcbiAqXG4gKlxuICogZXhwaXJlKHRhcmdldClcbiAqICBjYWNoZVt0YXJnZXQuX19wdWlkXSBwdXNoIHRhcmdldFxuICpcbiAqL1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQdWlkIGZyb20gXCIuLi91dGlscy9QdWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvb2wge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBvZiBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0b3RhbFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY2FjaGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKG51bSkge1xuICAgIHRoaXMudG90YWwgPSAwO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldCh0YXJnZXQsIHBhcmFtcywgdWlkKSB7XG4gICAgbGV0IHA7XG4gICAgdWlkID0gdWlkIHx8IHRhcmdldC5fX3B1aWQgfHwgUHVpZC5nZXRJZCh0YXJnZXQpO1xuXG4gICAgaWYgKHRoaXMuY2FjaGVbdWlkXSAmJiB0aGlzLmNhY2hlW3VpZF0ubGVuZ3RoID4gMCkge1xuICAgICAgcCA9IHRoaXMuY2FjaGVbdWlkXS5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcCA9IHRoaXMuY3JlYXRlT3JDbG9uZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcC5fX3B1aWQgPSB0YXJnZXQuX19wdWlkIHx8IHVpZDtcbiAgICByZXR1cm4gcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGV4cGlyZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWNoZSh0YXJnZXQuX19wdWlkKS5wdXNoKHRhcmdldCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgbW9yZSBkb2N1bWVudGF0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldCBhbnkgT2JqZWN0IG9yIEZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGNyZWF0ZU9yQ2xvbmUodGFyZ2V0LCBwYXJhbXMpIHtcbiAgICB0aGlzLnRvdGFsKys7XG5cbiAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBVdGlsLmNsYXNzQXBwbHkodGFyZ2V0LCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiAtIHdoYXQgaXMgaW4gdGhlIGNhY2hlP1xuICAgKlxuICAgKiBAbWV0aG9kIGdldENvdW50XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0Q291bnQoKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmNhY2hlKSBjb3VudCArPSB0aGlzLmNhY2hlW2lkXS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveWVzIGFsbCBpdGVtcyBmcm9tIFBvb2wuY2FjaGVcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgZm9yIChsZXQgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgdGhpcy5jYWNoZVtpZF0ubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBQb29sLmNhY2hlXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q2FjaGVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKiBAcHJpdmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gdWlkIHRoZSB1bmlxdWUgaWRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0Q2FjaGUodWlkID0gXCJkZWZhdWx0XCIpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVbdWlkXSkgdGhpcy5jYWNoZVt1aWRdID0gW107XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVbdWlkXTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHMge1xuICBjb25zdHJ1Y3Rvcihwcm90b24pIHtcbiAgICB0aGlzLnByb3RvbiA9IHByb3RvbjtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gMTtcblxuICAgIHRoaXMuZW1pdHRlckluZGV4ID0gMDtcbiAgICB0aGlzLnJlbmRlcmVySW5kZXggPSAwO1xuICB9XG5cbiAgdXBkYXRlKHN0eWxlLCBib2R5KSB7XG4gICAgdGhpcy5hZGQoc3R5bGUsIGJvZHkpO1xuXG4gICAgY29uc3QgZW1pdHRlciA9IHRoaXMuZ2V0RW1pdHRlcigpO1xuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5nZXRSZW5kZXJlcigpO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgc3RyICs9IFwiZW1pdHRlcjpcIiArIHRoaXMucHJvdG9uLmVtaXR0ZXJzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiZW0gc3BlZWQ6XCIgKyBlbWl0dGVyLmVtaXRTcGVlZCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwicG9zOlwiICsgdGhpcy5nZXRFbWl0dGVyUG9zKGVtaXR0ZXIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiaW5pdGlhbGl6ZXM6XCIgKyBlbWl0dGVyLmluaXRpYWxpemVzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcilcbiAgICAgICAgICBzdHIgKz0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+JyArIHRoaXMuY29uY2F0QXJyKGVtaXR0ZXIuaW5pdGlhbGl6ZXMpICsgXCI8L3NwYW4+PGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiYmVoYXZpb3VyczpcIiArIGVtaXR0ZXIuYmVoYXZpb3Vycy5sZW5ndGggKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztcIj4nICsgdGhpcy5jb25jYXRBcnIoZW1pdHRlci5iZWhhdmlvdXJzKSArIFwiPC9zcGFuPjxicj5cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKHJlbmRlcmVyKSBzdHIgKz0gcmVuZGVyZXIubmFtZSArIFwiPGJyPlwiO1xuICAgICAgICBpZiAocmVuZGVyZXIpIHN0ciArPSBcImJvZHk6XCIgKyB0aGlzLmdldENyZWF0ZWROdW1iZXIocmVuZGVyZXIpICsgXCI8YnI+XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdHIgKz0gXCJwYXJ0aWNsZXM6XCIgKyB0aGlzLnByb3Rvbi5nZXRDb3VudCgpICsgXCI8YnI+XCI7XG4gICAgICAgIHN0ciArPSBcInBvb2w6XCIgKyB0aGlzLnByb3Rvbi5wb29sLmdldENvdW50KCkgKyBcIjxicj5cIjtcbiAgICAgICAgc3RyICs9IFwidG90YWw6XCIgKyB0aGlzLnByb3Rvbi5wb29sLnRvdGFsO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IHN0cjtcbiAgfVxuXG4gIGFkZChzdHlsZSwgYm9keSkge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMudHlwZSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBbXG4gICAgICAgIFwicG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjBweDtsZWZ0OjA7Y3Vyc29yOnBvaW50ZXI7XCIsXG4gICAgICAgIFwib3BhY2l0eTowLjk7ei1pbmRleDoxMDAwMDtwYWRkaW5nOjEwcHg7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7XCIsXG4gICAgICAgIFwid2lkdGg6MTIwcHg7aGVpZ2h0OjUwcHg7YmFja2dyb3VuZC1jb2xvcjojMDAyO2NvbG9yOiMwZmY7XCJcbiAgICAgIF0uam9pbihcIlwiKTtcblxuICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICBlID0+IHtcbiAgICAgICAgICB0aGlzLnR5cGUrKztcbiAgICAgICAgICBpZiAodGhpcy50eXBlID4gNCkgdGhpcy50eXBlID0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIGxldCBiZywgY29sb3I7XG4gICAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBiZyA9IFwiIzIwMVwiO1xuICAgICAgICAgIGNvbG9yID0gXCIjZjA4XCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGJnID0gXCIjMDIwXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZjBcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJnID0gXCIjMDAyXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZmZcIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdID0gYmc7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZVtcImNvbG9yXCJdID0gY29sb3I7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICBib2R5ID0gYm9keSB8fCB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9uLmVtaXR0ZXJzW3RoaXMuZW1pdHRlckluZGV4XTtcbiAgfVxuXG4gIGdldFJlbmRlcmVyKCkge1xuICAgIHJldHVybiB0aGlzLnByb3Rvbi5yZW5kZXJlcnNbdGhpcy5yZW5kZXJlckluZGV4XTtcbiAgfVxuXG4gIGNvbmNhdEFycihhcnIpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoIWFyciB8fCAhYXJyLmxlbmd0aCkgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gKGFycltpXS5uYW1lIHx8IFwiXCIpLnN1YnN0cigwLCAxKSArIFwiLlwiO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRDcmVhdGVkTnVtYmVyKHJlbmRlcmVyKSB7XG4gICAgcmV0dXJuIHJlbmRlcmVyLnBvb2wudG90YWwgfHwgKHJlbmRlcmVyLmNwb29sICYmIHJlbmRlcmVyLmNwb29sLnRvdGFsKSB8fCAwO1xuICB9XG5cbiAgZ2V0RW1pdHRlclBvcyhlKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoZS5wLngpICsgXCIsXCIgKyBNYXRoLnJvdW5kKGUucC55KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMucHJvdG9uID0gbnVsbDtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gIH1cbn1cbiIsIi8qXG4gKiBFdmVudERpc3BhdGNoZXJcbiAqIFRoaXMgY29kZSByZWZlcmVuY2Ugc2luY2UgaHR0cDovL2NyZWF0ZWpzLmNvbS8uXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGJpbmQodGFyZ2V0KSB7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50O1xuICAgIHRhcmdldC5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gW107XG4gICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGxpc3RlbmVyO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHJldHVybjtcblxuICAgIGNvbnN0IGFyciA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGxvd3MgZm9yIGZhc3RlciBjaGVja3MuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGxFdmVudExpc3RlbmVycyh0eXBlKSB7XG4gICAgaWYgKCF0eXBlKSB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIGVsc2UgaWYgKHRoaXMuX2xpc3RlbmVycykgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQodHlwZSwgYXJncykge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cbiAgICBpZiAodHlwZSAmJiBsaXN0ZW5lcnMpIHtcbiAgICAgIGxldCBhcnIgPSBsaXN0ZW5lcnNbdHlwZV07XG4gICAgICBpZiAoIWFycikgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgLy8gYXJyID0gYXJyLnNsaWNlKCk7XG4gICAgICAvLyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBpdGVtcyBiZWluZyByZW1vdmVkIG9yIGFkZGVkIGR1cmluZyB0aGUgZGlzcGF0Y2hcblxuICAgICAgbGV0IGhhbmRsZXI7XG4gICAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGhhbmRsZXIgPSBhcnJbaV07XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCBoYW5kbGVyKGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAhIXJlc3VsdDtcbiAgfVxuXG4gIGhhc0V2ZW50TGlzdGVuZXIodHlwZSkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVyc1t0eXBlXSk7XG4gIH1cbn1cbiIsImNvbnN0IFBJID0gMy4xNDE1OTI2O1xuY29uc3QgSU5GSU5JVFkgPSBJbmZpbml0eTtcblxuY29uc3QgTWF0aFV0aWwgPSB7XG4gIFBJOiBQSSxcbiAgUEl4MjogUEkgKiAyLFxuICBQSV8yOiBQSSAvIDIsXG4gIFBJXzE4MDogUEkgLyAxODAsXG4gIE4xODBfUEk6IDE4MCAvIFBJLFxuICBJbmZpbml0eTogLTk5OSxcblxuICBpc0luZmluaXR5KG51bSkge1xuICAgIHJldHVybiBudW0gPT09IHRoaXMuSW5maW5pdHkgfHwgbnVtID09PSBJTkZJTklUWTtcbiAgfSxcblxuICByYW5kb21BVG9CKGEsIGIsIGlzSW50ID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzSW50KSByZXR1cm4gYSArIE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpO1xuICAgIGVsc2UgcmV0dXJuICgoTWF0aC5yYW5kb20oKSAqIChiIC0gYSkpID4+IDApICsgYTtcbiAgfSxcblxuICByYW5kb21GbG9hdGluZyhjZW50ZXIsIGYsIGlzSW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQVRvQihjZW50ZXIgLSBmLCBjZW50ZXIgKyBmLCBpc0ludCk7XG4gIH0sXG5cbiAgcmFuZG9tQ29sb3IoKSB7XG4gICAgcmV0dXJuIFwiI1wiICsgKFwiMDAwMDBcIiArICgoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCkgPDwgMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7XG4gIH0sXG5cbiAgcmFuZG9tWm9uZShkaXNwbGF5KSB7fSxcblxuICBmbG9vcihudW0sIGsgPSA0KSB7XG4gICAgY29uc3QgZGlnaXRzID0gTWF0aC5wb3coMTAsIGspO1xuICAgIHJldHVybiBNYXRoLmZsb29yKG51bSAqIGRpZ2l0cykgLyBkaWdpdHM7XG4gIH0sXG5cbiAgZGVncmVlVHJhbnNmb3JtKGEpIHtcbiAgICByZXR1cm4gKGEgKiBQSSkgLyAxODA7XG4gIH0sXG5cbiAgdG9Db2xvcjE2KG51bSkge1xuICAgIHJldHVybiBgIyR7bnVtLnRvU3RyaW5nKDE2KX1gO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRoVXRpbDtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVncmF0aW9uIHtcbiAgY29uc3RydWN0b3IodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBjYWxjdWxhdGUocGFydGljbGVzLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgdGhpcy5ldWxlckludGVncmF0ZShwYXJ0aWNsZXMsIHRpbWUsIGRhbXBpbmcpO1xuICB9XG5cbiAgLy8gRXVsZXIgSW50ZWdyYXRlXG4gIC8vIGh0dHBzOi8vcm9zZXR0YWNvZGUub3JnL3dpa2kvRXVsZXJfbWV0aG9kXG4gIGV1bGVySW50ZWdyYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgaWYgKCFwYXJ0aWNsZS5zbGVlcCkge1xuICAgICAgcGFydGljbGUub2xkLnAuY29weShwYXJ0aWNsZS5wKTtcbiAgICAgIHBhcnRpY2xlLm9sZC52LmNvcHkocGFydGljbGUudik7XG5cbiAgICAgIHBhcnRpY2xlLmEubXVsdGlwbHlTY2FsYXIoMSAvIHBhcnRpY2xlLm1hc3MpO1xuICAgICAgcGFydGljbGUudi5hZGQocGFydGljbGUuYS5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChwYXJ0aWNsZS5vbGQudi5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG5cbiAgICAgIGlmIChkYW1waW5nKSBwYXJ0aWNsZS52Lm11bHRpcGx5U2NhbGFyKGRhbXBpbmcpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUG9vbCBmcm9tIFwiLi9Qb29sXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFN0YXRzIGZyb20gXCIuLi9kZWJ1Zy9TdGF0c1wiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgSW50ZWdyYXRpb24gZnJvbSBcIi4uL21hdGgvSW50ZWdyYXRpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvdG9uIHtcbiAgc3RhdGljIFVTRV9DTE9DSyA9IGZhbHNlO1xuXG4gIC8vIG1lYXN1cmUgMToxMDBcbiAgc3RhdGljIE1FQVNVUkUgPSAxMDA7XG4gIHN0YXRpYyBFVUxFUiA9IFwiZXVsZXJcIjtcbiAgc3RhdGljIFJLMiA9IFwicnVuZ2Uta3V0dGEyXCI7XG5cbiAgLy8gZXZlbnQgbmFtZVxuICBzdGF0aWMgUEFSVElDTEVfQ1JFQVRFRCA9IFwiUEFSVElDTEVfQ1JFQVRFRFwiO1xuICBzdGF0aWMgUEFSVElDTEVfVVBEQVRFID0gXCJQQVJUSUNMRV9VUERBVEVcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX1NMRUVQID0gXCJQQVJUSUNMRV9TTEVFUFwiO1xuICBzdGF0aWMgUEFSVElDTEVfREVBRCA9IFwiUEFSVElDTEVfREVBRFwiO1xuXG4gIHN0YXRpYyBFTUlUVEVSX0FEREVEID0gXCJFTUlUVEVSX0FEREVEXCI7XG4gIHN0YXRpYyBFTUlUVEVSX1JFTU9WRUQgPSBcIkVNSVRURVJfUkVNT1ZFRFwiO1xuXG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFID0gXCJQUk9UT05fVVBEQVRFXCI7XG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFX0FGVEVSID0gXCJQUk9UT05fVVBEQVRFX0FGVEVSXCI7XG4gIHN0YXRpYyBERUZBVUxUX0lOVEVSVkFMID0gMC4wMTY3O1xuXG4gIHN0YXRpYyBhbWVuZENoYW5nZVRhYnNCdWcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3IgdG8gYWRkIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvciBQcm90b25cbiAgICpcbiAgICogQHRvZG8gcHJvUGFydGljbGVDb3VudCBpcyBub3QgaW4gdXNlXG4gICAqIEB0b2RvIGFkZCBtb3JlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNpbmdsZSBwcm9wZXJ0aWVzIGFuZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcHJvUGFydGljbGVDb3VudF0gbm90IGluIHVzZT9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbnRlZ3JhdGlvblR5cGU9UHJvdG9uLkVVTEVSXVxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2ludGVncmF0aW9uVHlwZT1Qcm90b24uRVVMRVJdXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGVtaXR0ZXJzICAgQWxsIGFkZGVkIGVtaXR0ZXJcbiAgICogQHByb3BlcnR5IHtBcnJheX0gcmVuZGVyZXJzICBBbGwgYWRkZWQgcmVuZGVyZXJcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbWUgICAgICBUaGUgYWN0aXZlIHRpbWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IG9sZHRpbWUgICBUaGUgb2xkIHRpbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGludGVncmF0aW9uVHlwZSkge1xuICAgIHRoaXMuZW1pdHRlcnMgPSBbXTtcbiAgICB0aGlzLnJlbmRlcmVycyA9IFtdO1xuXG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5vdyA9IDA7XG4gICAgdGhpcy50aGVuID0gMDtcbiAgICB0aGlzLmVsYXBzZWQgPSAwO1xuXG4gICAgdGhpcy5zdGF0cyA9IG5ldyBTdGF0cyh0aGlzKTtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCg4MCk7XG5cbiAgICB0aGlzLmludGVncmF0aW9uVHlwZSA9IFV0aWwuaW5pdFZhbHVlKGludGVncmF0aW9uVHlwZSwgUHJvdG9uLkVVTEVSKTtcbiAgICB0aGlzLmludGVncmF0b3IgPSBuZXcgSW50ZWdyYXRpb24odGhpcy5pbnRlZ3JhdGlvblR5cGUpO1xuXG4gICAgdGhpcy5fZnBzID0gXCJhdXRvXCI7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBQcm90b24uREVGQVVMVF9JTlRFUlZBTDtcbiAgfVxuXG4gIHNldCBmcHMoZnBzKSB7XG4gICAgdGhpcy5fZnBzID0gZnBzO1xuICAgIHRoaXMuX2ludGVydmFsID0gZnBzID09PSBcImF1dG9cIiA/IFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMIDogTWF0aFV0aWwuZmxvb3IoMSAvIGZwcywgNyk7XG4gIH1cblxuICBnZXQgZnBzKCkge1xuICAgIHJldHVybiB0aGlzLl9mcHM7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGEgdHlwZSBvZiBSZW5kZXJlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZFJlbmRlcmVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlclxuICAgKi9cbiAgYWRkUmVuZGVyZXIocmVuZGVyKSB7XG4gICAgcmVuZGVyLmluaXQodGhpcyk7XG4gICAgdGhpcy5yZW5kZXJlcnMucHVzaChyZW5kZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGFkZCBhIHR5cGUgb2YgUmVuZGVyZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRSZW5kZXJlclxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJcbiAgICovXG4gIHJlbW92ZVJlbmRlcmVyKHJlbmRlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZW5kZXJlcnMuaW5kZXhPZihyZW5kZXIpO1xuICAgIHRoaXMucmVuZGVyZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmVuZGVyLnJlbW92ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdGhlIEVtaXR0ZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRFbWl0dGVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7RW1pdHRlcn0gZW1pdHRlclxuICAgKi9cbiAgYWRkRW1pdHRlcihlbWl0dGVyKSB7XG4gICAgdGhpcy5lbWl0dGVycy5wdXNoKGVtaXR0ZXIpO1xuICAgIGVtaXR0ZXIucGFyZW50ID0gdGhpcztcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uRU1JVFRFUl9BRERFRCwgZW1pdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBFbWl0dGVyXG4gICAqXG4gICAqIEBtZXRob2QgcmVtb3ZlRW1pdHRlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBlbWl0dGVyXG4gICAqL1xuICByZW1vdmVFbWl0dGVyKGVtaXR0ZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZW1pdHRlcnMuaW5kZXhPZihlbWl0dGVyKTtcbiAgICB0aGlzLmVtaXR0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgZW1pdHRlci5wYXJlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5FTUlUVEVSX1JFTU9WRUQsIGVtaXR0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYWxsIGFkZGVkIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgLy8gJ2F1dG8nIGlzIHRoZSBkZWZhdWx0IGJyb3dzZXIgcmVmcmVzaCByYXRlLCB0aGUgdmFzdCBtYWpvcml0eSBpcyA2MGZwc1xuICAgIGlmICh0aGlzLl9mcHMgPT09IFwiYXV0b1wiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEUpO1xuXG4gICAgICBpZiAoUHJvdG9uLlVTRV9DTE9DSykge1xuICAgICAgICBpZiAoIXRoaXMudGhlbikgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMubm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZWxhcHNlZCA9ICh0aGlzLm5vdyAtIHRoaXMudGhlbikgKiAwLjAwMTtcbiAgICAgICAgLy8gRml4IGJ1Z3Mgc3VjaCBhcyBjaHJvbWUgYnJvd3NlciBzd2l0Y2hpbmcgdGFicyBjYXVzaW5nIGV4Y2Vzc2l2ZSB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAgdGhpcy5hbWVuZENoYW5nZVRhYnNCdWcoKTtcblxuICAgICAgICBpZiAodGhpcy5lbGFwc2VkID4gMCkgdGhpcy5lbWl0dGVyc1VwZGF0ZSh0aGlzLmVsYXBzZWQpO1xuICAgICAgICB0aGlzLnRoZW4gPSB0aGlzLm5vdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcnNVcGRhdGUoUHJvdG9uLkRFRkFVTFRfSU5URVJWQUwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEVfQUZURVIpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBmcHMgZnJhbWUgcmF0ZSBpcyBzZXRcbiAgICBlbHNlIHtcbiAgICAgIGlmICghdGhpcy50aGVuKSB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMubm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLmVsYXBzZWQgPSAodGhpcy5ub3cgLSB0aGlzLnRoZW4pICogMC4wMDE7XG5cbiAgICAgIGlmICh0aGlzLmVsYXBzZWQgPiB0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEUpO1xuICAgICAgICB0aGlzLmVtaXR0ZXJzVXBkYXRlKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3NjQwMTgvY29udHJvbGxpbmctZnBzLXdpdGgtcmVxdWVzdGFuaW1hdGlvbmZyYW1lXG4gICAgICAgIHRoaXMudGhlbiA9IHRoaXMubm93IC0gKHRoaXMuZWxhcHNlZCAlIHRoaXMuX2ludGVydmFsKSAqIDEwMDA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURV9BRlRFUik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW1pdHRlcnNVcGRhdGUoZWxhcHNlZCkge1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5lbWl0dGVyc1tpXS51cGRhdGUoZWxhcHNlZCk7XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgYW1lbmRDaGFuZ2VUYWJzQnVnXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBhbWVuZENoYW5nZVRhYnNCdWcoKSB7XG4gICAgaWYgKCFQcm90b24uYW1lbmRDaGFuZ2VUYWJzQnVnKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZWxhcHNlZCA+IDAuNSkge1xuICAgICAgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLmVsYXBzZWQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIHBhcnRpY2xlcyBmcm9tIGFsbCBlbWl0dGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIGdldENvdW50XG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBnZXRDb3VudCgpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB0b3RhbCArPSB0aGlzLmVtaXR0ZXJzW2ldLnBhcnRpY2xlcy5sZW5ndGg7XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgZ2V0QWxsUGFydGljbGVzKCkge1xuICAgIGxldCBwYXJ0aWNsZXMgPSBbXTtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkgcGFydGljbGVzID0gcGFydGljbGVzLmNvbmNhdCh0aGlzLmVtaXR0ZXJzW2ldLnBhcnRpY2xlcyk7XG4gICAgcmV0dXJuIHBhcnRpY2xlcztcbiAgfVxuXG4gIGRlc3Ryb3lBbGxFbWl0dGVycygpIHtcbiAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5lbWl0dGVycyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIHRoaXMgUHJvdG9uIGluc3RhbmNlLiBUaGlzIGluY2x1ZGVzIGFsbCBlbWl0dGVycywgYW5kIGFsbCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZGVzdHJveShyZW1vdmUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRlc3Ryb3lPdGhlciA9ICgpID0+IHtcbiAgICAgIHRoaXMudGltZSA9IDA7XG4gICAgICB0aGlzLnRoZW4gPSAwO1xuICAgICAgdGhpcy5wb29sLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc3RhdHMuZGVzdHJveSgpO1xuXG4gICAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5lbWl0dGVycyk7XG4gICAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5yZW5kZXJlcnMsIHRoaXMuZ2V0QWxsUGFydGljbGVzKCkpO1xuXG4gICAgICB0aGlzLmludGVncmF0b3IgPSBudWxsO1xuICAgICAgdGhpcy5yZW5kZXJlcnMgPSBudWxsO1xuICAgICAgdGhpcy5lbWl0dGVycyA9IG51bGw7XG4gICAgICB0aGlzLnN0YXRzID0gbnVsbDtcbiAgICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgfTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoZGVzdHJveU90aGVyLCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0cm95T3RoZXIoKTtcbiAgICB9XG4gIH1cbn1cblxuRXZlbnREaXNwYXRjaGVyLmJpbmQoUHJvdG9uKTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJnYiB7XG4gIGNvbnN0cnVjdG9yKHIgPSAyNTUsIGcgPSAyNTUsIGIgPSAyNTUpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHRoaXMuZyA9IGc7XG4gICAgdGhpcy5iID0gYjtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuciA9IDI1NTtcbiAgICB0aGlzLmcgPSAyNTU7XG4gICAgdGhpcy5iID0gMjU1O1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGhhc1Byb3AodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgfSxcblxuICAvKipcbiAgICogc2V0IHRoZSBwcm90b3R5cGUgaW4gYSBnaXZlbiBwcm90b3R5cGVPYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHNldFByb3BcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgdGFyZ2V0YFxuICAgKiBAdG9kbyB0cmFuc2xhdGUgZGVzcmlwdGlvbiBmcm9tIGNoaW5lc2UgdG8gZW5nbGlzaFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGVPYmplY3QgQW4gb2JqZWN0IG9mIHNpbmdsZSBwcm90b3R5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gdGFyZ2V0XG4gICAqL1xuICBzZXRQcm9wKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IFNwYW4uZ2V0U3BhblZhbHVlKHByb3BzW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0VmVjdG9yVmFsXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgcGFyYW0gYHRhcmdldGBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBwYXJhbSBgY29uZmBcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mXG4gICAqL1xuICBzZXRWZWN0b3JWYWwocGFydGljbGUsIGNvbmYgPSBudWxsKSB7XG4gICAgaWYgKCFjb25mKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwieFwiKSkgcGFydGljbGUucC54ID0gY29uZltcInhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInlcIikpIHBhcnRpY2xlLnAueSA9IGNvbmZbXCJ5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ4XCIpKSBwYXJ0aWNsZS52LnggPSBjb25mW1widnhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZ5XCIpKSBwYXJ0aWNsZS52LnkgPSBjb25mW1widnlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXhcIikpIHBhcnRpY2xlLmEueCA9IGNvbmZbXCJheFwiXTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYXlcIikpIHBhcnRpY2xlLmEueSA9IGNvbmZbXCJheVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJwXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2XCIpKSBwYXJ0aWNsZS52LmNvcHkoY29uZltcInZcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFcIl0pO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInBvc2l0aW9uXCIpKSBwYXJ0aWNsZS5wLmNvcHkoY29uZltcInBvc2l0aW9uXCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidmVsb2NpdHlcIikpIHBhcnRpY2xlLnYuY29weShjb25mW1widmVsb2NpdHlcIl0pO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJhY2NlbGVyYXRlXCIpKSBwYXJ0aWNsZS5hLmNvcHkoY29uZltcImFjY2VsZXJhdGVcIl0pO1xuICB9XG59O1xuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZWFzZUxpbmVhcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBlYXNlSW5RdWFkKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCAyKTtcbiAgfSxcblxuICBlYXNlT3V0UXVhZCh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGgucG93KHZhbHVlIC0gMSwgMikgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5PdXRRdWFkKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCAyKTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIHZhbHVlIC0gMik7XG4gIH0sXG5cbiAgZWFzZUluQ3ViaWModmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDMpO1xuICB9LFxuXG4gIGVhc2VPdXRDdWJpYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSAtIDEsIDMpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRDdWJpYyh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdyh2YWx1ZSwgMyk7XG5cbiAgICByZXR1cm4gMC41ICogKE1hdGgucG93KHZhbHVlIC0gMiwgMykgKyAyKTtcbiAgfSxcblxuICBlYXNlSW5RdWFydCh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgNCk7XG4gIH0sXG5cbiAgZWFzZU91dFF1YXJ0KHZhbHVlKSB7XG4gICAgcmV0dXJuIC0oTWF0aC5wb3codmFsdWUgLSAxLCA0KSAtIDEpO1xuICB9LFxuXG4gIGVhc2VJbk91dFF1YXJ0KHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqIE1hdGgucG93KHZhbHVlLCA0KTtcblxuICAgIHJldHVybiAtMC41ICogKCh2YWx1ZSAtPSAyKSAqIE1hdGgucG93KHZhbHVlLCAzKSAtIDIpO1xuICB9LFxuXG4gIGVhc2VJblNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gLU1hdGguY29zKHZhbHVlICogTWF0aFV0aWwuUElfMikgKyAxO1xuICB9LFxuXG4gIGVhc2VPdXRTaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguc2luKHZhbHVlICogTWF0aFV0aWwuUElfMik7XG4gIH0sXG5cbiAgZWFzZUluT3V0U2luZSh2YWx1ZSkge1xuICAgIHJldHVybiAtMC41ICogKE1hdGguY29zKE1hdGguUEkgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5FeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gMCA6IE1hdGgucG93KDIsIDEwICogKHZhbHVlIC0gMSkpO1xuICB9LFxuXG4gIGVhc2VPdXRFeHBvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAxID8gMSA6IC1NYXRoLnBvdygyLCAtMTAgKiB2YWx1ZSkgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEV4cG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiAwO1xuXG4gICAgaWYgKHZhbHVlID09PSAxKSByZXR1cm4gMTtcblxuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh2YWx1ZSAtIDEpKTtcblxuICAgIHJldHVybiAwLjUgKiAoLU1hdGgucG93KDIsIC0xMCAqIC0tdmFsdWUpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluQ2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGguc3FydCgxIC0gdmFsdWUgKiB2YWx1ZSkgLSAxKTtcbiAgfSxcblxuICBlYXNlT3V0Q2lyYyh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIE1hdGgucG93KHZhbHVlIC0gMSwgMikpO1xuICB9LFxuXG4gIGVhc2VJbk91dENpcmModmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHZhbHVlICogdmFsdWUpIC0gMSk7XG4gICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh2YWx1ZSAtPSAyKSAqIHZhbHVlKSArIDEpO1xuICB9LFxuXG4gIGVhc2VJbkJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuIHZhbHVlICogdmFsdWUgKiAoKHMgKyAxKSAqIHZhbHVlIC0gcyk7XG4gIH0sXG5cbiAgZWFzZU91dEJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgcmV0dXJuICh2YWx1ZSA9IHZhbHVlIC0gMSkgKiB2YWx1ZSAqICgocyArIDEpICogdmFsdWUgKyBzKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0QmFjayh2YWx1ZSkge1xuICAgIGxldCBzID0gMS43MDE1ODtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogKHZhbHVlICogdmFsdWUgKiAoKChzICo9IDEuNTI1KSArIDEpICogdmFsdWUgLSBzKSk7XG4gICAgcmV0dXJuIDAuNSAqICgodmFsdWUgLT0gMikgKiB2YWx1ZSAqICgoKHMgKj0gMS41MjUpICsgMSkgKiB2YWx1ZSArIHMpICsgMik7XG4gIH0sXG5cbiAgZ2V0RWFzaW5nKGVhc2UpIHtcbiAgICBpZiAodHlwZW9mIGVhc2UgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGVhc2U7XG4gICAgZWxzZSByZXR1cm4gdGhpc1tlYXNlXSB8fCB0aGlzLmVhc2VMaW5lYXI7XG4gIH1cbn07XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVjdG9yMkQge1xuICBjb25zdHJ1Y3Rvcih4LCB5KSB7XG4gICAgdGhpcy54ID0geCB8fCAwO1xuICAgIHRoaXMueSA9IHkgfHwgMDtcbiAgfVxuXG4gIHNldCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0WCh4KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFkoeSkge1xuICAgIHRoaXMueSA9IHk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRHcmFkaWVudCgpIHtcbiAgICBpZiAodGhpcy54ICE9PSAwKSByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgZWxzZSBpZiAodGhpcy55ID4gMCkgcmV0dXJuIE1hdGhVdGlsLlBJXzI7XG4gICAgZWxzZSBpZiAodGhpcy55IDwgMCkgcmV0dXJuIC1NYXRoVXRpbC5QSV8yO1xuICB9XG5cbiAgY29weSh2KSB7XG4gICAgdGhpcy54ID0gdi54O1xuICAgIHRoaXMueSA9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkKHYsIHcpIHtcbiAgICBpZiAodyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRWZWN0b3JzKHYsIHcpO1xuICAgIH1cblxuICAgIHRoaXMueCArPSB2Lng7XG4gICAgdGhpcy55ICs9IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkWFkoYSwgYikge1xuICAgIHRoaXMueCArPSBhO1xuICAgIHRoaXMueSArPSBiO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRWZWN0b3JzKGEsIGIpIHtcbiAgICB0aGlzLnggPSBhLnggKyBiLng7XG4gICAgdGhpcy55ID0gYS55ICsgYi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdWIodiwgdykge1xuICAgIGlmICh3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YlZlY3RvcnModiwgdyk7XG4gICAgfVxuXG4gICAgdGhpcy54IC09IHYueDtcbiAgICB0aGlzLnkgLT0gdi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdWJWZWN0b3JzKGEsIGIpIHtcbiAgICB0aGlzLnggPSBhLnggLSBiLng7XG4gICAgdGhpcy55ID0gYS55IC0gYi55O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkaXZpZGVTY2FsYXIocykge1xuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICB0aGlzLnggLz0gcztcbiAgICAgIHRoaXMueSAvPSBzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldCgwLCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bHRpcGx5U2NhbGFyKHMpIHtcbiAgICB0aGlzLnggKj0gcztcbiAgICB0aGlzLnkgKj0gcztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbmVnYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKC0xKTtcbiAgfVxuXG4gIGRvdCh2KSB7XG4gICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcbiAgfVxuXG4gIGxlbmd0aFNxKCkge1xuICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpKTtcbiAgfVxuXG4gIGRpc3RhbmNlVG8odikge1xuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh2KSk7XG4gIH1cblxuICByb3RhdGUodGhhKSB7XG4gICAgY29uc3QgeCA9IHRoaXMueDtcbiAgICBjb25zdCB5ID0gdGhpcy55O1xuXG4gICAgdGhpcy54ID0geCAqIE1hdGguY29zKHRoYSkgKyB5ICogTWF0aC5zaW4odGhhKTtcbiAgICB0aGlzLnkgPSAteCAqIE1hdGguc2luKHRoYSkgKyB5ICogTWF0aC5jb3ModGhhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGlzdGFuY2VUb1NxdWFyZWQodikge1xuICAgIGNvbnN0IGR4ID0gdGhpcy54IC0gdi54O1xuICAgIGNvbnN0IGR5ID0gdGhpcy55IC0gdi55O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICB9XG5cbiAgbGVycCh2LCBhbHBoYSkge1xuICAgIHRoaXMueCArPSAodi54IC0gdGhpcy54KSAqIGFscGhhO1xuICAgIHRoaXMueSArPSAodi55IC0gdGhpcy55KSAqIGFscGhhO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnggPT09IHRoaXMueCAmJiB2LnkgPT09IHRoaXMueTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMueCA9IDAuMDtcbiAgICB0aGlzLnkgPSAwLjA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMueCwgdGhpcy55KTtcbiAgfVxufVxuIiwiLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2JlaGF2aW91ci9CZWhhdmlvdXInKX0gQmVoYXZpb3VyICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi4vbWF0aC9WZWN0b3IyRCcpfSBWZWN0b3IyRCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL3V0aWxzL1JnYicpfSBSZ2IgKi9cbmltcG9ydCBSZ2IgZnJvbSBcIi4uL3V0aWxzL1JnYlwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHJvcFV0aWwgZnJvbSBcIi4uL3V0aWxzL1Byb3BVdGlsXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi4vbWF0aC9lYXNlXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJ0aWNsZSB7XG4gIC8qKiBAdHlwZSBzdHJpbmcgKi9cbiAgaWQgPSBcIlwiO1xuXG4gIC8qKiBAdHlwZSB7e3A6VmVjdG9yMkQsdjpWZWN0b3IyRCxhOlZlY3RvcjJEfX0gKi9cbiAgb2xkID0gbnVsbDtcblxuICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgZGF0YSA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtCZWhhdmlvdXJbXX0gKi9cbiAgYmVoYXZpb3VycyA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gKi9cbiAgcCA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gKi9cbiAgdiA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtWZWN0b3IyRH0gKi9cbiAgYSA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtSZ2J9ICovXG4gIHJnYiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHRoZSBQYXJ0aWNsZSBjbGFzc1xuICAgKlxuICAgKiBAY2xhc3MgUHJvdG9uLlBhcnRpY2xlXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcE9iaiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqIGZvciBleGFtcGxlIHtsaWZlOjMsZGVhZDpmYWxzZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljbGUncyBpZDtcbiAgICAgKiBAcHJvcGVydHkgaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IFwiUGFydGljbGVcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICAgIHRoaXMub2xkID0ge307XG4gICAgdGhpcy5kYXRhID0ge307XG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG5cbiAgICB0aGlzLnAgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLnYgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmEgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC5wID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQudiA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLmEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIHRoaXMucmdiID0gbmV3IFJnYigpO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBjb25mICYmIFByb3BVdGlsLnNldFByb3AodGhpcywgY29uZik7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy52LngsIC10aGlzLnYueSkgKiBNYXRoVXRpbC5OMTgwX1BJO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5saWZlID0gSW5maW5pdHk7XG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgdGhpcy5kZWFkID0gZmFsc2U7XG4gICAgdGhpcy5zbGVlcCA9IGZhbHNlO1xuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5zcHJpdGUgPSBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcblxuICAgIHRoaXMuZW5lcmd5ID0gMTsgLy8gRW5lcmd5IExvc3NcbiAgICB0aGlzLm1hc3MgPSAxO1xuICAgIHRoaXMucmFkaXVzID0gMTA7XG4gICAgdGhpcy5hbHBoYSA9IDE7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jb2xvciA9IG51bGw7XG5cbiAgICB0aGlzLnAuc2V0KDAsIDApO1xuICAgIHRoaXMudi5zZXQoMCwgMCk7XG4gICAgdGhpcy5hLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5wLnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC52LnNldCgwLCAwKTtcbiAgICB0aGlzLm9sZC5hLnNldCgwLCAwKTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZWFzZUxpbmVhcjtcblxuICAgIHRoaXMucmdiLnJlc2V0KCk7XG4gICAgVXRpbC5lbXB0eU9iamVjdCh0aGlzLmRhdGEpO1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGUodGltZSwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMuc2xlZXApIHtcbiAgICAgIHRoaXMuYWdlICs9IHRpbWU7XG4gICAgICB0aGlzLmFwcGx5QmVoYXZpb3Vycyh0aW1lLCBpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWdlIDwgdGhpcy5saWZlKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZWFzaW5nKHRoaXMuYWdlIC8gdGhpcy5saWZlKTtcbiAgICAgIHRoaXMuZW5lcmd5ID0gTWF0aC5tYXgoMSAtIHNjYWxlLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlCZWhhdmlvdXJzKHRpbWUsIGluZGV4KSB7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWhhdmlvdXJzLmxlbmd0aDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5iZWhhdmlvdXJzW2ldICYmIHRoaXMuYmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXJcbiAgICovXG4gIGFkZEJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGJlaGF2aW91ci5oYXNPd25Qcm9wZXJ0eShcInBhcmVudHNcIikpIGJlaGF2aW91ci5wYXJlbnRzLnB1c2godGhpcyk7XG4gICAgYmVoYXZpb3VyLmluaXRpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJbXX0gYmVoYXZpb3Vyc1xuICAgKi9cbiAgYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQmVoYXZpb3VyKGJlaGF2aW91cnNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgYmVoYXZpb3VyID0gdGhpcy5iZWhhdmlvdXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5iZWhhdmlvdXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgcGFydGljbGVcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlQWxsQmVoYXZpb3VycygpO1xuICAgIHRoaXMuZW5lcmd5ID0gMDtcbiAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogQHR5cGVkZWYgIHtPYmplY3R9IHJnYk9iamVjdFxuICAgKiBAcHJvcGVydHkge051bWJlcn0gciByZWQgdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGcgZ3JlZW4gdmFsdWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGIgYmx1ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIGNvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgcmdiIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgaGV4VG9SZ2JcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGggYW55IGhleCB2YWx1ZSwgZS5nLiAjMDAwMDAwIG9yIDAwMDAwMCBmb3IgYmxhY2tcbiAgICpcbiAgICogQHJldHVybiB7cmdiT2JqZWN0fVxuICAgKi9cbiAgaGV4VG9SZ2IoaCkge1xuICAgIGNvbnN0IGhleDE2ID0gaC5jaGFyQXQoMCkgPT09IFwiI1wiID8gaC5zdWJzdHJpbmcoMSwgNykgOiBoO1xuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoMCwgMiksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xuXG4gICAgcmV0dXJuIHsgciwgZywgYiB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBhIHJnYiB2YWx1ZSB0byBhIHJnYiBzdHJpbmdcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHJnYlRvSGV4XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0IHwgUHJvdG9uLmhleFRvUmdifSByZ2IgYSByZ2Igb2JqZWN0IGxpa2UgaW4ge0BsaW5rIFByb3RvbiNQcm90b24ufVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHJnYigpXG4gICAqL1xuICByZ2JUb0hleChyYmcpIHtcbiAgICByZXR1cm4gYHJnYigke3JiZy5yfSwgJHtyYmcuZ30sICR7cmJnLmJ9KWA7XG4gIH0sXG5cbiAgZ2V0SGV4MTZGcm9tUGFydGljbGUocCkge1xuICAgIHJldHVybiBOdW1iZXIocC5yZ2IucikgKiA2NTUzNiArIE51bWJlcihwLnJnYi5nKSAqIDI1NiArIE51bWJlcihwLnJnYi5iKTtcbiAgfVxufTtcbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi9WZWN0b3IyRFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2xhcjJEIHtcbiAgY29uc3RydWN0b3IociwgdGhhKSB7XG4gICAgdGhpcy5yID0gTWF0aC5hYnMocikgfHwgMDtcbiAgICB0aGlzLnRoYSA9IHRoYSB8fCAwO1xuICB9XG5cbiAgc2V0KHIsIHRoYSkge1xuICAgIHRoaXMuciA9IHI7XG4gICAgdGhpcy50aGEgPSB0aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRSKHIpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0VGhhKHRoYSkge1xuICAgIHRoaXMudGhhID0gdGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29weShwKSB7XG4gICAgdGhpcy5yID0gcC5yO1xuICAgIHRoaXMudGhhID0gcC50aGE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1ZlY3RvcigpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvcjJEKHRoaXMuZ2V0WCgpLCB0aGlzLmdldFkoKSk7XG4gIH1cblxuICBnZXRYKCkge1xuICAgIHJldHVybiB0aGlzLnIgKiBNYXRoLnNpbih0aGlzLnRoYSk7XG4gIH1cblxuICBnZXRZKCkge1xuICAgIHJldHVybiAtdGhpcy5yICogTWF0aC5jb3ModGhpcy50aGEpO1xuICB9XG5cbiAgbm9ybWFsaXplKCkge1xuICAgIHRoaXMuciA9IDE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlcXVhbHModikge1xuICAgIHJldHVybiB2LnIgPT09IHRoaXMuciAmJiB2LnRoYSA9PT0gdGhpcy50aGE7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnIgPSAwLjA7XG4gICAgdGhpcy50aGEgPSAwLjA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFBvbGFyMkQodGhpcy5yLCB0aGlzLnRoYSk7XG4gIH1cbn1cbiIsImNvbnN0IE1hdDMgPSB7XG4gIGNyZWF0ZShtYXQzKSB7XG4gICAgY29uc3QgbWF0ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICBpZiAobWF0MykgdGhpcy5zZXQobWF0MywgbWF0KTtcblxuICAgIHJldHVybiBtYXQ7XG4gIH0sXG5cbiAgc2V0KG1hdDEsIG1hdDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykgbWF0MltpXSA9IG1hdDFbaV07XG5cbiAgICByZXR1cm4gbWF0MjtcbiAgfSxcblxuICBtdWx0aXBseShtYXQsIG1hdDIsIG1hdDMpIHtcbiAgICBsZXQgYTAwID0gbWF0WzBdLFxuICAgICAgYTAxID0gbWF0WzFdLFxuICAgICAgYTAyID0gbWF0WzJdLFxuICAgICAgYTEwID0gbWF0WzNdLFxuICAgICAgYTExID0gbWF0WzRdLFxuICAgICAgYTIwID0gbWF0WzZdLFxuICAgICAgYTIxID0gbWF0WzddLFxuICAgICAgYjAwID0gbWF0MlswXSxcbiAgICAgIGIwMSA9IG1hdDJbMV0sXG4gICAgICBiMDIgPSBtYXQyWzJdLFxuICAgICAgYjEwID0gbWF0MlszXSxcbiAgICAgIGIxMSA9IG1hdDJbNF0sXG4gICAgICBiMjAgPSBtYXQyWzZdLFxuICAgICAgYjIxID0gbWF0Mls3XTtcblxuICAgIG1hdDNbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTA7XG4gICAgbWF0M1sxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMTtcbiAgICBtYXQzWzJdID0gYTAyICogYjAyO1xuICAgIG1hdDNbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTA7XG4gICAgbWF0M1s0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMTtcbiAgICBtYXQzWzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYTIwO1xuICAgIG1hdDNbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBhMjE7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBpbnZlcnNlKG1hdCwgbWF0Mykge1xuICAgIGxldCBhMDAgPSBtYXRbMF0sXG4gICAgICBhMDEgPSBtYXRbMV0sXG4gICAgICBhMTAgPSBtYXRbM10sXG4gICAgICBhMTEgPSBtYXRbNF0sXG4gICAgICBhMjAgPSBtYXRbNl0sXG4gICAgICBhMjEgPSBtYXRbN10sXG4gICAgICBiMDEgPSBhMTEsXG4gICAgICBiMTEgPSAtYTEwLFxuICAgICAgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwLFxuICAgICAgZCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSxcbiAgICAgIGlkO1xuXG4gICAgaWQgPSAxIC8gZDtcbiAgICBtYXQzWzBdID0gYjAxICogaWQ7XG4gICAgbWF0M1sxXSA9IC1hMDEgKiBpZDtcbiAgICBtYXQzWzNdID0gYjExICogaWQ7XG4gICAgbWF0M1s0XSA9IGEwMCAqIGlkO1xuICAgIG1hdDNbNl0gPSBiMjEgKiBpZDtcbiAgICBtYXQzWzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogaWQ7XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfSxcblxuICBtdWx0aXBseVZlYzIobSwgdmVjLCBtYXQzKSB7XG4gICAgbGV0IHggPSB2ZWNbMF0sXG4gICAgICB5ID0gdmVjWzFdO1xuXG4gICAgbWF0M1swXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyBtWzZdO1xuICAgIG1hdDNbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgbVs3XTtcblxuICAgIHJldHVybiBtYXQzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXQzO1xuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGFuIHtcbiAgY29uc3RydWN0b3IoYSwgYiwgY2VudGVyKSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShhKSkge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuYSA9IGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IGZhbHNlO1xuICAgICAgdGhpcy5hID0gVXRpbC5pbml0VmFsdWUoYSwgMSk7XG4gICAgICB0aGlzLmIgPSBVdGlsLmluaXRWYWx1ZShiLCB0aGlzLmEpO1xuICAgICAgdGhpcy5jZW50ZXIgPSBVdGlsLmluaXRWYWx1ZShjZW50ZXIsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBnZXRWYWx1ZShpc0ludCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBcnJheSkge1xuICAgICAgcmV0dXJuIFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLmEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2VudGVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoVXRpbC5yYW5kb21BVG9CKHRoaXMuYSwgdGhpcy5iLCBpc0ludCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aFV0aWwucmFuZG9tRmxvYXRpbmcodGhpcy5hLCB0aGlzLmIsIGlzSW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBTcGFuIG9iamVjdFxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2Qgc2V0U3BhblZhbHVlXG4gICAqXG4gICAqIEB0b2RvIGEsIGIgYW5kIGMgc2hvdWxkIGJlICdNaXhlZCcgb3IgJ051bWJlcic/XG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWQgfCBTcGFufSBhXG4gICAqIEBwYXJhbSB7TWl4ZWR9ICAgICAgICAgICAgICAgYlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGNcbiAgICpcbiAgICogQHJldHVybiB7U3Bhbn1cbiAgICovXG4gIHN0YXRpYyBzZXRTcGFuVmFsdWUoYSwgYiwgYykge1xuICAgIGlmIChhIGluc3RhbmNlb2YgU3Bhbikge1xuICAgICAgcmV0dXJuIGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTcGFuKGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBTcGFuKGEsIGIpO1xuICAgICAgICBlbHNlIHJldHVybiBuZXcgU3BhbihhLCBiLCBjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgZnJvbSBhIFNwYW4sIGlmIHRoZSBwYXJhbSBpcyBub3QgYSBTcGFuIGl0IHdpbGwgcmV0dXJuIHRoZSBnaXZlbiBwYXJhbWV0ZXJcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldFZhbHVlXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWQgfCBTcGFufSBwYW5cbiAgICpcbiAgICogQHJldHVybiB7TWl4ZWR9IHRoZSB2YWx1ZSBvZiBTcGFuIE9SIHRoZSBwYXJhbWV0ZXIgaWYgaXQgaXMgbm90IGEgU3BhblxuICAgKi9cbiAgc3RhdGljIGdldFNwYW5WYWx1ZShwYW4pIHtcbiAgICByZXR1cm4gcGFuIGluc3RhbmNlb2YgU3BhbiA/IHBhbi5nZXRWYWx1ZSgpIDogcGFuO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycmF5U3BhbiBleHRlbmRzIFNwYW4ge1xuICBjb25zdHJ1Y3Rvcihjb2xvcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fYXJyID0gVXRpbC50b0FycmF5KGNvbG9yKTtcbiAgfVxuXG4gIGdldFZhbHVlKCkge1xuICAgIGNvbnN0IHZhbCA9IFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLl9hcnIpO1xuICAgIHJldHVybiB2YWwgPT09IFwicmFuZG9tXCIgfHwgdmFsID09PSBcIlJhbmRvbVwiID8gTWF0aFV0aWwucmFuZG9tQ29sb3IoKSA6IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29sb3IgaXMgYW4gaW5zdGFuY2Ugb2YgUHJvdG9uLkFycmF5U3BhbiwgaWYgbm90IGl0IG1ha2VzIGEgbmV3IGluc3RhbmNlXG4gICAqXG4gICAqIEBtZXRob2Qgc2V0U3BhblZhbHVlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBcnJheVNwYW4oYXJyKSB7XG4gICAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGFyciBpbnN0YW5jZW9mIEFycmF5U3BhbikgcmV0dXJuIGFycjtcbiAgICBlbHNlIHJldHVybiBuZXcgQXJyYXlTcGFuKGFycik7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3RhbmdsZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHcsIGgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICB0aGlzLndpZHRoID0gdztcbiAgICB0aGlzLmhlaWdodCA9IGg7XG5cbiAgICB0aGlzLmJvdHRvbSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG5cbiAgY29udGFpbnMoeCwgeSkge1xuICAgIGlmICh4IDw9IHRoaXMucmlnaHQgJiYgeCA+PSB0aGlzLnggJiYgeSA8PSB0aGlzLmJvdHRvbSAmJiB5ID49IHRoaXMueSkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhdGUge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgcGVyIHNlY29uZCBlbWlzc2lvbiAoYSBbcGFydGljbGVdL2IgW3NdKTtcbiAgICogQG5hbWVzcGFjZVxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBSYXRlXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBOdW1iZXIgfCBTcGFufSBudW1wYW4gdGhlIG51bWJlciBvZiBlYWNoIGVtaXNzaW9uO1xuICAgKiBAcGFyYW0ge0FycmF5IHwgTnVtYmVyIHwgU3Bhbn0gdGltZXBhbiB0aGUgdGltZSBvZiBlYWNoIGVtaXNzaW9uO1xuICAgKiBmb3IgZXhhbXBsZTogbmV3IFJhdGUobmV3IFNwYW4oMTAsIDIwKSwgbmV3IFNwYW4oLjEsIC4yNSkpO1xuICAgKi9cbiAgY29uc3RydWN0b3IobnVtcGFuLCB0aW1lcGFuKSB7XG4gICAgdGhpcy5udW1QYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShudW1wYW4sIDEpKTtcbiAgICB0aGlzLnRpbWVQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZSh0aW1lcGFuLCAxKSk7XG5cbiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5uZXh0VGltZSA9IDA7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLm5leHRUaW1lID0gdGhpcy50aW1lUGFuLmdldFZhbHVlKCk7XG4gIH1cblxuICBnZXRWYWx1ZSh0aW1lKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgKz0gdGltZTtcblxuICAgIGlmICh0aGlzLnN0YXJ0VGltZSA+PSB0aGlzLm5leHRUaW1lKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgICB0aGlzLm5leHRUaW1lID0gdGhpcy50aW1lUGFuLmdldFZhbHVlKCk7XG5cbiAgICAgIGlmICh0aGlzLm51bVBhbi5iID09PSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm51bVBhbi5nZXRWYWx1ZShmYWxzZSkgPiAwLjUpIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtUGFuLmdldFZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbml0aWFsaXplIHtcbiAgcmVzZXQoKSB7fVxuXG4gIGluaXQoZW1pdHRlciwgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZShwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZShlbWl0dGVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdWIgY2xhc3MgaW5pdFxuICBpbml0aWFsaXplKHRhcmdldCkge31cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZSBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubGlmZVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTGlmZVwiO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy5saWZlUGFuLmEgPT09IEluZmluaXR5KSB0YXJnZXQubGlmZSA9IEluZmluaXR5O1xuICAgIGVsc2UgdGFyZ2V0LmxpZmUgPSB0aGlzLmxpZmVQYW4uZ2V0VmFsdWUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlY3RvciA9IG5ldyBWZWN0b3IyRCgwLCAwKTtcbiAgICB0aGlzLnJhbmRvbSA9IDA7XG4gICAgdGhpcy5jcm9zc1R5cGUgPSBcImRlYWRcIjtcbiAgICB0aGlzLmFsZXJ0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge31cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge31cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudmVjdG9yID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2ludFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54O1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiU29ycnksIFBvaW50Wm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzaW5nIG1ldGhvZCFcIik7XG4gICAgICB0aGlzLmFsZXJ0ID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9zaXRpb24gZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3Ioem9uZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgICB0aGlzLm5hbWUgPSBcIlBvc2l0aW9uXCI7XG4gIH1cblxuICByZXNldCh6b25lKSB7XG4gICAgdGhpcy56b25lID0gVXRpbC5pbml0VmFsdWUoem9uZSwgbmV3IFBvaW50Wm9uZSgpKTtcbiAgfVxuXG4gIGluaXRpYWxpemUodGFyZ2V0KSB7XG4gICAgdGhpcy56b25lLmdldFBvc2l0aW9uKCk7XG5cbiAgICB0YXJnZXQucC54ID0gdGhpcy56b25lLnZlY3Rvci54O1xuICAgIHRhcmdldC5wLnkgPSB0aGlzLnpvbmUudmVjdG9yLnk7XG4gIH1cbn1cbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4uL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IFBvbGFyMkQgZnJvbSBcIi4uL21hdGgvUG9sYXIyRFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaXR5IGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKHJwYW4sIHRoYXBhbiwgdHlwZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnJQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShycGFuKTtcbiAgICB0aGlzLnRoYVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHRoYXBhbik7XG4gICAgdGhpcy50eXBlID0gVXRpbC5pbml0VmFsdWUodHlwZSwgXCJ2ZWN0b3JcIik7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlZlbG9jaXR5XCI7XG4gIH1cblxuICByZXNldChycGFuLCB0aGFwYW4sIHR5cGUpIHtcbiAgICB0aGlzLnJQYW4gPSBTcGFuLnNldFNwYW5WYWx1ZShycGFuKTtcbiAgICB0aGlzLnRoYVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHRoYXBhbik7XG4gICAgdGhpcy50eXBlID0gVXRpbC5pbml0VmFsdWUodHlwZSwgXCJ2ZWN0b3JcIik7XG4gIH1cblxuICBub3JtYWxpemVWZWxvY2l0eSh2cikge1xuICAgIHJldHVybiB2ciAqIFByb3Rvbi5NRUFTVVJFO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBcInBcIiB8fCB0aGlzLnR5cGUgPT09IFwiUFwiIHx8IHRoaXMudHlwZSA9PT0gXCJwb2xhclwiKSB7XG4gICAgICBjb25zdCBwb2xhcjJkID0gbmV3IFBvbGFyMkQoXG4gICAgICAgIHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy5yUGFuLmdldFZhbHVlKCkpLFxuICAgICAgICB0aGlzLnRoYVBhbi5nZXRWYWx1ZSgpICogTWF0aFV0aWwuUElfMTgwXG4gICAgICApO1xuXG4gICAgICB0YXJnZXQudi54ID0gcG9sYXIyZC5nZXRYKCk7XG4gICAgICB0YXJnZXQudi55ID0gcG9sYXIyZC5nZXRZKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC52LnggPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMuclBhbi5nZXRWYWx1ZSgpKTtcbiAgICAgIHRhcmdldC52LnkgPSB0aGlzLm5vcm1hbGl6ZVZlbG9jaXR5KHRoaXMudGhhUGFuLmdldFZhbHVlKCkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNzIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGEsIGIsIGMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWFzc1BhbiA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICAgIHRoaXMubmFtZSA9IFwiTWFzc1wiO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICB0YXJnZXQubWFzcyA9IHRoaXMubWFzc1Bhbi5nZXRWYWx1ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhZGl1cyBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJSYWRpdXNcIjtcbiAgfVxuXG4gIHJlc2V0KGEsIGIsIGMpIHtcbiAgICB0aGlzLnJhZGl1cyA9IFNwYW4uc2V0U3BhblZhbHVlKGEsIGIsIGMpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHRoaXMucmFkaXVzLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRSYWRpdXMgPSBwYXJ0aWNsZS5yYWRpdXM7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2R5IGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGltYWdlLCB3LCBoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuaW1hZ2UgPSB0aGlzLnNldFNwYW5WYWx1ZShpbWFnZSk7XG4gICAgdGhpcy53ID0gVXRpbC5pbml0VmFsdWUodywgMjApO1xuICAgIHRoaXMuaCA9IFV0aWwuaW5pdFZhbHVlKGgsIHRoaXMudyk7XG4gICAgdGhpcy5uYW1lID0gXCJCb2R5XCI7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgaW1hZ2VUYXJnZXQgPSB0aGlzLmltYWdlLmdldFZhbHVlKCk7XG5cbiAgICBpZiAodHlwZW9mIGltYWdlVGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0ge1xuICAgICAgICB3aWR0aDogdGhpcy53LFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaCxcbiAgICAgICAgc3JjOiBpbWFnZVRhcmdldCxcbiAgICAgICAgaXNJbm5lcjogdHJ1ZSxcbiAgICAgICAgaW5uZXI6IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBpbWFnZVRhcmdldDtcbiAgICB9XG4gIH1cblxuICBzZXRTcGFuVmFsdWUoaW1hZ2UpIHtcbiAgICByZXR1cm4gaW1hZ2UgaW5zdGFuY2VvZiBBcnJheVNwYW4gPyBpbWFnZSA6IG5ldyBBcnJheVNwYW4oaW1hZ2UpO1xuICB9XG59XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuLi9tYXRoL2Vhc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmVoYXZpb3VyIHtcbiAgc3RhdGljIGlkID0gMDtcblxuICAvKipcbiAgICogVGhlIEJlaGF2aW91ciBjbGFzcyBpcyB0aGUgYmFzZSBmb3IgdGhlIG90aGVyIEJlaGF2aW91clxuICAgKlxuICAgKiBAbWVtYmVyb2YhIC1cbiAgICogQGludGVyZmFjZVxuICAgKiBAYWxpYXMgUHJvdG9uLkJlaGF2aW91clxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbGlmZSBcdHRoZSBiZWhhdmlvdXJzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVhc2luZyBcdFRoZSBiZWhhdmlvdXIncyBkZWNheWluZyB0cmVuZCwgZm9yIGV4YW1wbGUgZWFzZS5lYXNlT3V0UXVhcnRcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9ICBpZCBcdFx0VGhlIGJlaGF2aW91cnMgaWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9ICBhZ2U9MCBcdEhvdyBsb25nIHRoZSBwYXJ0aWNsZSBzaG91bGQgYmUgJ2FsaWZlJ1xuICAgKiBAcHJvcGVydHkge051bWJlcn0gIGVuZXJneT0xXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gZGVhZD1mYWxzZSBUaGUgcGFydGljbGUgaXMgZGVhZCBhdCBmaXJzdFxuICAgKiBAcHJvcGVydHkge0FycmF5fSAgIHBhcmVudHMgXHRUaGUgYmVoYXZpb3VyJ3MgcGFyZW50cyBhcnJheVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gIG5hbWUgXHRUaGUgYmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMubGlmZSA9IFV0aWwuaW5pdFZhbHVlKGxpZmUsIEluZmluaXR5KTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZ2V0RWFzaW5nKGVhc2luZyk7XG5cbiAgICB0aGlzLmFnZSA9IDA7XG4gICAgdGhpcy5lbmVyZ3kgPSAxO1xuICAgIHRoaXMuZGVhZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyZW50cyA9IFtdO1xuXG4gICAgdGhpcy5pZCA9IGBCZWhhdmlvdXJfJHtCZWhhdmlvdXIuaWQrK31gO1xuICAgIHRoaXMubmFtZSA9IFwiQmVoYXZpb3VyXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmxpZmUgPSBVdGlsLmluaXRWYWx1ZShsaWZlLCBJbmZpbml0eSk7XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmdldEVhc2luZyhlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIGZvcmNlIGJ5IDE6MTAwO1xuICAgKlxuICAgKiBAbWV0aG9kIG5vcm1hbGl6ZUZvcmNlXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gZm9yY2VcbiAgICovXG4gIG5vcm1hbGl6ZUZvcmNlKGZvcmNlKSB7XG4gICAgcmV0dXJuIGZvcmNlLm11bHRpcGx5U2NhbGFyKFByb3Rvbi5NRUFTVVJFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSB2YWx1ZSBieSAxOjEwMDtcbiAgICpcbiAgICogQG1ldGhvZCBub3JtYWxpemVWYWx1ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqL1xuICBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAqIFByb3Rvbi5NRUFTVVJFO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9XG5cbiAgLyoqXG4gICAqIGNvbXB1dGluZyBsaWZlIGN5Y2xlXG4gICAqXG4gICAqIEBtZXRob2QgY2FsY3VsYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuYWdlICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5hZ2UgPj0gdGhpcy5saWZlIHx8IHRoaXMuZGVhZCkge1xuICAgICAgdGhpcy5lbmVyZ3kgPSAwO1xuICAgICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZWFzaW5nKHBhcnRpY2xlLmFnZSAvIHBhcnRpY2xlLmxpZmUpO1xuICAgICAgdGhpcy5lbmVyZ3kgPSBNYXRoLm1heCgxIC0gc2NhbGUsIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgYmVoYXZpb3VyXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgbGV0IGkgPSB0aGlzLnBhcmVudHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMucGFyZW50c1tpXS5yZW1vdmVCZWhhdmlvdXIodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnRzLmxlbmd0aCA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9yY2UgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkZvcmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeFxuICAgKiBAcGFyYW0ge051bWJlcn0gZnlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZngsIGZ5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5mb3JjZSA9IHRoaXMubm9ybWFsaXplRm9yY2UobmV3IFZlY3RvcjJEKGZ4LCBmeSkpO1xuICAgIHRoaXMubmFtZSA9IFwiRm9yY2VcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGZ4LCBmeSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5mb3JjZSA9IHRoaXMubm9ybWFsaXplRm9yY2UobmV3IFZlY3RvcjJEKGZ4LCBmeSkpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLmEuYWRkKHRoaXMuZm9yY2UpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdHRyYWN0aW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIFRoaXMgYmVoYXZpb3VyIGxldCB0aGUgcGFydGljbGVzIGZvbGxvdyBvbmUgc3BlY2lmaWMgUHJvdG9uLlZlY3RvcjJEXG4gICAqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5BdHRyYWN0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2ZvcmNlJyBhbmQgJ3JhZGl1cydcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMDAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb25cbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJhZGl1c1xuICAgKiBAcHJvcGVydHkge051bWJlcn0gZm9yY2VcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJhZGl1c1NxXG4gICAqIEBwcm9wZXJ0eSB7UHJvdG9uLlZlY3RvcjJEfSBhdHRyYWN0aW9uRm9yY2VcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGxlbmd0aFNxXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnRhcmdldFBvc2l0aW9uID0gVXRpbC5pbml0VmFsdWUodGFyZ2V0UG9zaXRpb24sIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLnJhZGl1cyA9IFV0aWwuaW5pdFZhbHVlKHJhZGl1cywgMTAwMCk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgdGhpcy5yYWRpdXNTcSA9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmxlbmd0aFNxID0gMDtcblxuICAgIHRoaXMubmFtZSA9IFwiQXR0cmFjdGlvblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkF0dHJhY3Rpb25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2ZvcmNlJyBhbmQgJ3JhZGl1cydcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMDAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMudGFyZ2V0UG9zaXRpb24gPSBVdGlsLmluaXRWYWx1ZSh0YXJnZXRQb3NpdGlvbiwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMucmFkaXVzID0gVXRpbC5pbml0VmFsdWUocmFkaXVzLCAxMDAwKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLnJhZGl1c1NxID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZSA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMubGVuZ3RoU3EgPSAwO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQXR0cmFjdGlvblxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLmNvcHkodGhpcy50YXJnZXRQb3NpdGlvbik7XG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2Uuc3ViKHBhcnRpY2xlLnApO1xuICAgIHRoaXMubGVuZ3RoU3EgPSB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5sZW5ndGhTcSgpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoU3EgPiAwLjAwMDA0ICYmIHRoaXMubGVuZ3RoU3EgPCB0aGlzLnJhZGl1c1NxKSB7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5ub3JtYWxpemUoKTtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm11bHRpcGx5U2NhbGFyKDEgLSB0aGlzLmxlbmd0aFNxIC8gdGhpcy5yYWRpdXNTcSk7XG4gICAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5tdWx0aXBseVNjYWxhcih0aGlzLmZvcmNlKTtcblxuICAgICAgcGFydGljbGUuYS5hZGQodGhpcy5hdHRyYWN0aW9uRm9yY2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmRvbURyaWZ0IGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUmFuZG9tRHJpZnRcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WCBcdFx0XHRcdFggdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRZICBcdFx0XHRcdFkgdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsYXkgXHRcdFx0XHRIb3cgbXVjaCBkZWxheSB0aGUgZHJpZnQgc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbWUgVGhlIHRpbWUgb2YgdGhlIGRyaWZ0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZHJpZnRYLCBkcmlmdFksIGRlbGF5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChkcmlmdFgsIGRyaWZ0WSwgZGVsYXkpO1xuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5uYW1lID0gXCJSYW5kb21EcmlmdFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUmFuZG9tRHJpZnRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFggXHRcdFx0XHRYIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WSAgXHRcdFx0XHRZIHZhbHVlIG9mIHRoZSBuZXcgVmVjdG9yMkRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbGF5IFx0XHRcdFx0SG93IG11Y2ggZGVsYXkgdGhlIGRyaWZ0IHNob3VsZCBoYXZlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChkcmlmdFgsIGRyaWZ0WSwgZGVsYXksIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMucGFuRm9jZSA9IG5ldyBWZWN0b3IyRChkcmlmdFgsIGRyaWZ0WSk7XG4gICAgdGhpcy5wYW5Gb2NlID0gdGhpcy5ub3JtYWxpemVGb3JjZSh0aGlzLnBhbkZvY2UpO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnRpbWUgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1JhbmRvbURyaWZ0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLmRhdGEudGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHBhcnRpY2xlLmRhdGEudGltZSA+PSB0aGlzLmRlbGF5KSB7XG4gICAgICBwYXJ0aWNsZS5hLmFkZFhZKFxuICAgICAgICBNYXRoVXRpbC5yYW5kb21BVG9CKC10aGlzLnBhbkZvY2UueCwgdGhpcy5wYW5Gb2NlLngpLFxuICAgICAgICBNYXRoVXRpbC5yYW5kb21BVG9CKC10aGlzLnBhbkZvY2UueSwgdGhpcy5wYW5Gb2NlLnkpXG4gICAgICApO1xuXG4gICAgICBwYXJ0aWNsZS5kYXRhLnRpbWUgPSAwO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEZvcmNlIGZyb20gXCIuL0ZvcmNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXZpdHkgZXh0ZW5kcyBGb3JjZSB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3RvbiNQcm90b24uRm9yY2VcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uR3Jhdml0eVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZyBcdFx0XHRcdFx0XHRcdEdyYXZpdHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihnLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcigwLCBnLCBsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMubmFtZSA9IFwiR3Jhdml0eVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkdyYXZpdHlcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBnIFx0XHRcdFx0XHRcdFx0R3Jhdml0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIucmVzZXQoMCwgZywgbGlmZSwgZWFzaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGlzaW9uIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBhZnRlciBjb2xsaXNpb25cbiAgICpcbiAgICogQGNhbGxiYWNrIENhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJpdGNsZX0gb3RoZXJQYXJ0aWNsZVxuICAgKi9cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Db2xsaXNpb25cbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIHRvIG1hc3NcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uRW1pdHRlcn0gXHRbZW1pdHRlcj1udWxsXSBcdFx0dGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBcdFx0W21hc3M9dHJ1ZV1cbiAgICogQHBhcmFtIHtDYWxsYmFja31cdCBcdFtjYWxsYmFjaz1udWxsXVx0XHR0aGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIGNvbGxpc2lvblxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVtaXR0ZXIsIG1hc3MsIGNhbGxiYWNrLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuICAgIHRoaXMucmVzZXQoZW1pdHRlciwgbWFzcywgY2FsbGJhY2spO1xuICAgIHRoaXMubmV3UG9vbCA9IFtdO1xuICAgIHRoaXMucG9vbCA9IFtdO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sbGlzaW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChlbWl0dGVyLCBtYXNzLCBjYWxsYmFjaywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5lbWl0dGVyID0gVXRpbC5pbml0VmFsdWUoZW1pdHRlciwgbnVsbCk7XG4gICAgdGhpcy5tYXNzID0gVXRpbC5pbml0VmFsdWUobWFzcywgdHJ1ZSk7XG4gICAgdGhpcy5jYWxsYmFjayA9IFV0aWwuaW5pdFZhbHVlKGNhbGxiYWNrLCBudWxsKTtcblxuICAgIHRoaXMuY29sbGlzaW9uUG9vbCA9IFtdO1xuICAgIHRoaXMuZGVsdGEgPSBuZXcgVmVjdG9yMkQoKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbGxpc2lvblxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZW1pdHRlcikge1xuICAgICAgVXRpbC5zbGljZUFycmF5KHRoaXMuZW1pdHRlci5wYXJ0aWNsZXMsIGluZGV4LCB0aGlzLm5ld1Bvb2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICBVdGlsLnNsaWNlQXJyYXkodGhpcy5wb29sLCBpbmRleCwgdGhpcy5uZXdQb29sKTtcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLm5ld1Bvb2wubGVuZ3RoO1xuICAgIGxldCBvdGhlclBhcnRpY2xlO1xuICAgIGxldCBsZW5ndGhTcTtcbiAgICBsZXQgb3ZlcmxhcDtcbiAgICBsZXQgdG90YWxNYXNzO1xuICAgIGxldCBhdmVyYWdlTWFzczEsIGF2ZXJhZ2VNYXNzMjtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgb3RoZXJQYXJ0aWNsZSA9IHRoaXMubmV3UG9vbFtpXTtcblxuICAgICAgaWYgKG90aGVyUGFydGljbGUgIT09IHBhcnRpY2xlKSB7XG4gICAgICAgIHRoaXMuZGVsdGEuY29weShvdGhlclBhcnRpY2xlLnApO1xuICAgICAgICB0aGlzLmRlbHRhLnN1YihwYXJ0aWNsZS5wKTtcblxuICAgICAgICBsZW5ndGhTcSA9IHRoaXMuZGVsdGEubGVuZ3RoU3EoKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBwYXJ0aWNsZS5yYWRpdXMgKyBvdGhlclBhcnRpY2xlLnJhZGl1cztcblxuICAgICAgICBpZiAobGVuZ3RoU3EgPD0gZGlzdGFuY2UgKiBkaXN0YW5jZSkge1xuICAgICAgICAgIG92ZXJsYXAgPSBkaXN0YW5jZSAtIE1hdGguc3FydChsZW5ndGhTcSk7XG4gICAgICAgICAgb3ZlcmxhcCArPSAwLjU7XG5cbiAgICAgICAgICB0b3RhbE1hc3MgPSBwYXJ0aWNsZS5tYXNzICsgb3RoZXJQYXJ0aWNsZS5tYXNzO1xuICAgICAgICAgIGF2ZXJhZ2VNYXNzMSA9IHRoaXMubWFzcyA/IG90aGVyUGFydGljbGUubWFzcyAvIHRvdGFsTWFzcyA6IDAuNTtcbiAgICAgICAgICBhdmVyYWdlTWFzczIgPSB0aGlzLm1hc3MgPyBwYXJ0aWNsZS5tYXNzIC8gdG90YWxNYXNzIDogMC41O1xuXG4gICAgICAgICAgcGFydGljbGUucC5hZGQoXG4gICAgICAgICAgICB0aGlzLmRlbHRhXG4gICAgICAgICAgICAgIC5jbG9uZSgpXG4gICAgICAgICAgICAgIC5ub3JtYWxpemUoKVxuICAgICAgICAgICAgICAubXVsdGlwbHlTY2FsYXIob3ZlcmxhcCAqIC1hdmVyYWdlTWFzczEpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvdGhlclBhcnRpY2xlLnAuYWRkKHRoaXMuZGVsdGEubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIob3ZlcmxhcCAqIGF2ZXJhZ2VNYXNzMikpO1xuXG4gICAgICAgICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHBhcnRpY2xlLCBvdGhlclBhcnRpY2xlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyb3NzWm9uZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIGNvbWUgdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIHpvbmVcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNyb3NzWm9uZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5ab25lfSB6b25lIFx0XHRcdFx0XHRcdGNhbiBiZSBhbnkgUHJvdG9uLlpvbmUgLSBlLmcuIFByb3Rvbi5SZWN0Wm9uZSgpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Nyb3NzVHlwZT1kZWFkXSBcdFx0XHR3aGF0IGhhcHBlbnMgaWYgdGhlIHBhcnRpY2xlcyBwYXNzIHRoZSB6b25lIC0gYWxsb3dlZCBzdHJpbmdzOiBkZWFkIHwgYm91bmQgfCBjcm9zc1xuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHpvbmUsIGNyb3NzVHlwZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoem9uZSwgY3Jvc3NUeXBlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNyb3NzWm9uZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNyb3NzWm9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uWm9uZX0gem9uZSBcdFx0XHRcdGNhbiBiZSBhbnkgUHJvdG9uLlpvbmUgLSBlLmcuIFByb3Rvbi5SZWN0Wm9uZSgpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Nyb3NzVHlwZT1kZWFkXSBcdHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIHBhc3MgdGhlIHpvbmUgLSBhbGxvd2VkIHN0cmluZ3M6IGRlYWQgfCBib3VuZCB8IGNyb3NzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0W2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBcdFx0W2Vhc2luZz1lYXNlTGluZWFyXVx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KHpvbmUsIGNyb3NzVHlwZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy56b25lID0gem9uZTtcbiAgICB0aGlzLnpvbmUuY3Jvc3NUeXBlID0gVXRpbC5pbml0VmFsdWUoY3Jvc3NUeXBlLCBcImRlYWRcIik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNyb3NzWm9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHRoaXMuem9uZS5jcm9zc2luZyhwYXJ0aWNsZSk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbHBoYSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQWxwaGFcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScgYW5kICdiJ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGEsIGIpO1xuICAgIHRoaXMubmFtZSA9IFwiQWxwaGFcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BbHBoYVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScgYW5kICdiJ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5zYW1lID0gYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgMSkpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKGIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBhbHBoYSB2YWx1ZSBvZiB0aGUgcGFydGljbGVcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkFscGhhXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGUgQSBzaW5nbGUgUHJvdG9uIGdlbmVyYXRlZCBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEuYWxwaGFBID0gdGhpcy5hLmdldFZhbHVlKCk7XG5cbiAgICBpZiAodGhpcy5zYW1lKSBwYXJ0aWNsZS5kYXRhLmFscGhhQiA9IHBhcnRpY2xlLmRhdGEuYWxwaGFBO1xuICAgIGVsc2UgcGFydGljbGUuZGF0YS5hbHBoYUIgPSB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkFscGhhXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIHBhcnRpY2xlLmFscGhhID0gcGFydGljbGUuZGF0YS5hbHBoYUIgKyAocGFydGljbGUuZGF0YS5hbHBoYUEgLSBwYXJ0aWNsZS5kYXRhLmFscGhhQikgKiB0aGlzLmVuZXJneTtcblxuICAgIGlmIChwYXJ0aWNsZS5hbHBoYSA8IDAuMDAxKSBwYXJ0aWNsZS5hbHBoYSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2FsZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScgYW5kICdiJ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGEsIGIpO1xuICAgIHRoaXMubmFtZSA9IFwiU2NhbGVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5TY2FsZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIDEpKTtcbiAgICB0aGlzLmIgPSBTcGFuLnNldFNwYW5WYWx1ZShiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhbGwgcGFydGljbGVzXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5TY2FsZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS5zY2FsZUEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFJhZGl1cyA9IHBhcnRpY2xlLnJhZGl1cztcbiAgICBwYXJ0aWNsZS5kYXRhLnNjYWxlQiA9IHRoaXMuc2FtZSA/IHBhcnRpY2xlLmRhdGEuc2NhbGVBIDogdGhpcy5iLmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlNjYWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcbiAgICBwYXJ0aWNsZS5zY2FsZSA9IHBhcnRpY2xlLmRhdGEuc2NhbGVCICsgKHBhcnRpY2xlLmRhdGEuc2NhbGVBIC0gcGFydGljbGUuZGF0YS5zY2FsZUIpICogdGhpcy5lbmVyZ3k7XG5cbiAgICBpZiAocGFydGljbGUuc2NhbGUgPCAwLjAwMDEpIHBhcnRpY2xlLnNjYWxlID0gMDtcbiAgICBwYXJ0aWNsZS5yYWRpdXMgPSBwYXJ0aWNsZS5kYXRhLm9sZFJhZGl1cyAqIHBhcnRpY2xlLnNjYWxlO1xuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm90YXRlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Sb3RhdGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScsICdiJyBhbmQgJ3N0eWxlJ1xuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2luZmx1ZW5jZT1WZWxvY2l0eV0gVGhlIHJvdGF0aW9uJ3MgaW5mbHVlbmNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbc3R5bGU9dG9dXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5mbHVlbmNlLCBiLCBzdHlsZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoaW5mbHVlbmNlLCBiLCBzdHlsZSk7XG4gICAgdGhpcy5uYW1lID0gXCJSb3RhdGVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Sb3RhdGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2EnLCAnYicgYW5kICdzdHlsZSdcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtzdHlsZT10b11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGEsIGIsIHN0eWxlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcblxuICAgIHRoaXMuYSA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGEsIFwiVmVsb2NpdHlcIikpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKGIsIDApKTtcbiAgICB0aGlzLnN0eWxlID0gVXRpbC5pbml0VmFsdWUoc3R5bGUsIFwidG9cIik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYWxsIHBhcnRpY2xlc1xuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUm90YXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5yb3RhdGlvbiA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEucm90YXRpb25BID0gdGhpcy5hLmdldFZhbHVlKCk7XG5cbiAgICBpZiAoIXRoaXMuc2FtZSkgcGFydGljbGUuZGF0YS5yb3RhdGlvbkIgPSB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUm90YXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdHRpbWUgdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IFx0XHRcdGluZGV4IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIGlmICghdGhpcy5zYW1lKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZSA9PT0gXCJ0b1wiIHx8IHRoaXMuc3R5bGUgPT09IFwiVE9cIiB8fCB0aGlzLnN0eWxlID09PSBcIl9cIikge1xuICAgICAgICBwYXJ0aWNsZS5yb3RhdGlvbiArPVxuICAgICAgICAgIHBhcnRpY2xlLmRhdGEucm90YXRpb25CICsgKHBhcnRpY2xlLmRhdGEucm90YXRpb25BIC0gcGFydGljbGUuZGF0YS5yb3RhdGlvbkIpICogdGhpcy5lbmVyZ3k7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWNsZS5yb3RhdGlvbiArPSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYS5hID09PSBcIlZcIiB8fCB0aGlzLmEuYSA9PT0gXCJWZWxvY2l0eVwiIHx8IHRoaXMuYS5hID09PSBcInZcIikge1xuICAgICAgLy8gYmV0YS4uLlxuICAgICAgcGFydGljbGUucm90YXRpb24gPSBwYXJ0aWNsZS5nZXREaXJlY3Rpb24oKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IEFycmF5U3BhbiBmcm9tIFwiLi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbG9yIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5Db2xvclxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGEgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5BcnJheVNwYW4gfCBTdHJpbmd9IGIgdGhlIHN0cmluZyBzaG91bGQgYmUgYSBoZXggZS5nLiAjMDAwMDAwIGZvciBibGFja1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChhLCBiKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNvbG9yXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYSB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYiB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5hID0gQXJyYXlTcGFuLmNyZWF0ZUFycmF5U3BhbihhKTtcbiAgICB0aGlzLmIgPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuKGIpO1xuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhbGwgcGFydGljbGVzXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuY29sb3IgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLmNvbG9yQSA9IENvbG9yVXRpbC5oZXhUb1JnYihwYXJ0aWNsZS5jb2xvcik7XG5cbiAgICBpZiAodGhpcy5iKSBwYXJ0aWNsZS5kYXRhLmNvbG9yQiA9IENvbG9yVXRpbC5oZXhUb1JnYih0aGlzLmIuZ2V0VmFsdWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIGlmICh0aGlzLmIpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUuZGF0YS5jb2xvckIuciArIChwYXJ0aWNsZS5kYXRhLmNvbG9yQS5yIC0gcGFydGljbGUuZGF0YS5jb2xvckIucikgKiB0aGlzLmVuZXJneTtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUuZGF0YS5jb2xvckIuZyArIChwYXJ0aWNsZS5kYXRhLmNvbG9yQS5nIC0gcGFydGljbGUuZGF0YS5jb2xvckIuZykgKiB0aGlzLmVuZXJneTtcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUuZGF0YS5jb2xvckIuYiArIChwYXJ0aWNsZS5kYXRhLmNvbG9yQS5iIC0gcGFydGljbGUuZGF0YS5jb2xvckIuYikgKiB0aGlzLmVuZXJneTtcblxuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5yZ2IuciA8PCAwO1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5yZ2IuZyA8PCAwO1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5yZ2IuYiA8PCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLmRhdGEuY29sb3JBLnI7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLmRhdGEuY29sb3JBLmc7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLmRhdGEuY29sb3JBLmI7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuY29uc3QgQ0hBTkdJTkcgPSBcImNoYW5naW5nXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5Y2xvbmUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkN5Y2xvbmVcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhbmdsZSwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5zZXRBbmdsZUFuZEZvcmNlKGFuZ2xlLCBmb3JjZSk7XG4gICAgdGhpcy5uYW1lID0gXCJDeWNsb25lXCI7XG4gIH1cblxuICBzZXRBbmdsZUFuZEZvcmNlKGFuZ2xlLCBmb3JjZSkge1xuICAgIHRoaXMuZm9yY2UgPSBDSEFOR0lORztcbiAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEkgLyAyO1xuXG4gICAgaWYgKGFuZ2xlID09PSBcInJpZ2h0XCIpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSAtTWF0aFV0aWwuUEkgLyAyO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPT09IFwicmFuZG9tXCIpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBcInJhbmRvbVwiO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgaW5zdGFuY2VvZiBTcGFuKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gXCJzcGFuXCI7XG4gICAgICB0aGlzLnNwYW4gPSBhbmdsZTtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlKSB7XG4gICAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImNoYW5naW5nXCIgfHxcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJjaGFuZ1wiIHx8XG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiYXV0b1wiXG4gICAgKSB7XG4gICAgICB0aGlzLmZvcmNlID0gQ0hBTkdJTkc7XG4gICAgfSBlbHNlIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5DeWNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYW5nbGUsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEkgLyAyO1xuICAgIHRoaXMuc2V0QW5nbGVBbmRGb3JjZShhbmdsZSwgZm9yY2UpO1xuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5hbmdsZSA9PT0gXCJyYW5kb21cIikge1xuICAgICAgcGFydGljbGUuZGF0YS5jYW5nbGUgPSBNYXRoVXRpbC5yYW5kb21BVG9CKC1NYXRoVXRpbC5QSSwgTWF0aFV0aWwuUEkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbmdsZSA9PT0gXCJzcGFuXCIpIHtcbiAgICAgIHBhcnRpY2xlLmRhdGEuY2FuZ2xlID0gdGhpcy5zcGFuLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lID0gbmV3IFZlY3RvcjJEKDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5DeWNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGxldCBncmFkaWVudCA9IHBhcnRpY2xlLnYuZ2V0R3JhZGllbnQoKTtcbiAgICBpZiAodGhpcy5hbmdsZSA9PT0gXCJyYW5kb21cIiB8fCB0aGlzLmFuZ2xlID09PSBcInNwYW5cIikge1xuICAgICAgZ3JhZGllbnQgKz0gcGFydGljbGUuZGF0YS5jYW5nbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyYWRpZW50ICs9IHRoaXMuYW5nbGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9yY2UgPT09IENIQU5HSU5HKSB7XG4gICAgICBsZW5ndGggPSBwYXJ0aWNsZS52Lmxlbmd0aCgpIC8gMTAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLmZvcmNlO1xuICAgIH1cblxuICAgIHBhcnRpY2xlLmRhdGEuY3ljbG9uZS54ID0gbGVuZ3RoICogTWF0aC5jb3MoZ3JhZGllbnQpO1xuICAgIHBhcnRpY2xlLmRhdGEuY3ljbG9uZS55ID0gbGVuZ3RoICogTWF0aC5zaW4oZ3JhZGllbnQpO1xuICAgIHBhcnRpY2xlLmRhdGEuY3ljbG9uZSA9IHRoaXMubm9ybWFsaXplRm9yY2UocGFydGljbGUuZGF0YS5jeWNsb25lKTtcbiAgICBwYXJ0aWNsZS5hLmFkZChwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUpO1xuICB9XG59XG4iLCJpbXBvcnQgQXR0cmFjdGlvbiBmcm9tIFwiLi9BdHRyYWN0aW9uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcHVsc2lvbiBleHRlbmRzIEF0dHJhY3Rpb24ge1xuICAvKipcbiAgICogVGhlIG9wcGlzaXRlIG9mIFByb3Rvbi5BdHRyYWN0aW9uIC0gdHVybnMgdGhlIGZvcmNlXG4gICAqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uI1Byb3Rvbi5BdHRyYWN0aW9uXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlJlcHVsc2lvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdmb3JjZScgYW5kICdyYWRpdXMnXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiB0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTAwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5mb3JjZSAqPSAtMTtcbiAgICB0aGlzLm5hbWUgPSBcIlJlcHVsc2lvblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlJlcHVsc2lvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIucmVzZXQodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5mb3JjZSAqPSAtMTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi4vbWF0aC9WZWN0b3IyRFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3Jhdml0eVdlbGwgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBCZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBHcmF2aXR5V2VsbFxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJEfSBbY2VudGVyUG9pbnQ9bmV3IFZlY3RvcjJEXSBUaGUgcG9pbnQgaW4gdGhlIGNlbnRlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cdFx0XHRcdFx0VGhlIGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV1cdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXVx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjZW50ZXJQb2ludCwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmRpc3RhbmNlVmVjID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5jZW50ZXJQb2ludCA9IFV0aWwuaW5pdFZhbHVlKGNlbnRlclBvaW50LCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgdGhpcy5uYW1lID0gXCJHcmF2aXR5V2VsbFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jR3Jhdml0eVdlbGxcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFtjZW50ZXJQb2ludD1uZXcgVmVjdG9yMkRdIFRoZSBwb2ludCBpbiB0aGUgY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVx0XHRcdFx0XHRUaGUgZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XVx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoY2VudGVyUG9pbnQsIGZvcmNlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmRpc3RhbmNlVmVjID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5jZW50ZXJQb2ludCA9IFV0aWwuaW5pdFZhbHVlKGNlbnRlclBvaW50LCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5mb3JjZSA9IFV0aWwuaW5pdFZhbHVlKHRoaXMubm9ybWFsaXplVmFsdWUoZm9yY2UpLCAxMDApO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7fVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNHcmF2aXR5V2VsbFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuZGlzdGFuY2VWZWMuc2V0KHRoaXMuY2VudGVyUG9pbnQueCAtIHBhcnRpY2xlLnAueCwgdGhpcy5jZW50ZXJQb2ludC55IC0gcGFydGljbGUucC55KTtcbiAgICBjb25zdCBkaXN0YW5jZVNxID0gdGhpcy5kaXN0YW5jZVZlYy5sZW5ndGhTcSgpO1xuXG4gICAgaWYgKGRpc3RhbmNlU3EgIT09IDApIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZVZlYy5sZW5ndGgoKTtcbiAgICAgIGNvbnN0IGZhY3RvciA9ICh0aGlzLmZvcmNlICogdGltZSkgLyAoZGlzdGFuY2VTcSAqIGRpc3RhbmNlKTtcblxuICAgICAgcGFydGljbGUudi54ICs9IGZhY3RvciAqIHRoaXMuZGlzdGFuY2VWZWMueDtcbiAgICAgIHBhcnRpY2xlLnYueSArPSBmYWN0b3IgKiB0aGlzLmRpc3RhbmNlVmVjLnk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUHJvcFV0aWwgZnJvbSBcIi4uL3V0aWxzL1Byb3BVdGlsXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0aWFsaXplKGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplcykge1xuICAgIGNvbnN0IGxlbmd0aCA9IGluaXRpYWxpemVzLmxlbmd0aDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluaXRpYWxpemVzW2ldIGluc3RhbmNlb2YgSW5pdGlhbGl6ZSkge1xuICAgICAgICBpbml0aWFsaXplc1tpXS5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYmluZEVtaXR0ZXIoZW1pdHRlciwgcGFydGljbGUpO1xuICB9LFxuXG4gIC8vIGluaXRcbiAgaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSwgaW5pdGlhbGl6ZSkge1xuICAgIFByb3BVdGlsLnNldFByb3AocGFydGljbGUsIGluaXRpYWxpemUpO1xuICAgIFByb3BVdGlsLnNldFZlY3RvclZhbChwYXJ0aWNsZSwgaW5pdGlhbGl6ZSk7XG4gIH0sXG5cbiAgYmluZEVtaXR0ZXIoZW1pdHRlciwgcGFydGljbGUpIHtcbiAgICBpZiAoZW1pdHRlci5iaW5kRW1pdHRlcikge1xuICAgICAgcGFydGljbGUucC5hZGQoZW1pdHRlci5wKTtcbiAgICAgIHBhcnRpY2xlLnYuYWRkKGVtaXR0ZXIudik7XG4gICAgICBwYXJ0aWNsZS5hLmFkZChlbWl0dGVyLmEpO1xuICAgICAgcGFydGljbGUudi5yb3RhdGUoTWF0aFV0aWwuZGVncmVlVHJhbnNmb3JtKGVtaXR0ZXIucm90YXRpb24pKTtcbiAgICB9XG4gIH1cbn07XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFB1aWQgZnJvbSBcIi4uL3V0aWxzL1B1aWRcIjtcbmltcG9ydCBQYXJ0aWNsZSBmcm9tIFwiLi4vY29yZS9QYXJ0aWNsZVwiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuXG5pbXBvcnQgUmF0ZSBmcm9tIFwiLi4vaW5pdGlhbGl6ZS9SYXRlXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZVV0aWwgZnJvbSBcIi4uL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1pdHRlciBleHRlbmRzIFBhcnRpY2xlIHtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZW1pdCBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEl0IHdpbGwgZGlzcGF0Y2ggZm9sbG93IGV2ZW50czpcbiAgICogUEFSVElDTEVfQ1JFQVRFRFxuICAgKiBQQVJUSUNMRV9VUERBVEFcbiAgICogUEFSVElDTEVfREVBRFxuICAgKlxuICAgKiBAY2xhc3MgRW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmYgdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKiBmb3IgZXhhbXBsZSB7ZGFtcGluZzowLjAxLGJpbmRFbWl0dGVyOmZhbHNlfVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZiA9IHt9KSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuICAgIHRoaXMuaW5pdGlhbGl6ZXMgPSBbXTtcblxuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMuZW1pdFNwZWVkID0gMDtcbiAgICB0aGlzLnRvdGFsVGltZSA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZyaWN0aW9uIGNvZWZmaWNpZW50IGZvciBhbGwgcGFydGljbGUgZW1pdCBieSBUaGlzO1xuICAgICAqIEBwcm9wZXJ0eSBkYW1waW5nXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwLjAwNlxuICAgICAqL1xuICAgIHRoaXMuZGFtcGluZyA9IDAuMDA2O1xuXG4gICAgLyoqXG4gICAgICogSWYgYmluZEVtaXR0ZXIgdGhlIHBhcnRpY2xlcyBjYW4gYmluZCB0aGlzIGVtaXR0ZXIncyBwcm9wZXJ0eTtcbiAgICAgKiBAcHJvcGVydHkgYmluZEVtaXR0ZXJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlciA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBwZXIgc2Vjb25kIGVtaXQgKGEgW3BhcnRpY2xlXS9iIFtzXSk7XG4gICAgICogQHByb3BlcnR5IHJhdGVcbiAgICAgKiBAdHlwZSB7UmF0ZX1cbiAgICAgKiBAZGVmYXVsdCBSYXRlKDEsIC4xKVxuICAgICAqL1xuICAgIHRoaXMucmF0ZSA9IG5ldyBSYXRlKDEsIDAuMSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkVtaXR0ZXJcIjtcbiAgICB0aGlzLmlkID0gUHVpZC5pZCh0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IGVtaXQgcGFydGljbGVcbiAgICogQG1ldGhvZCBlbWl0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBlbWl0VGltZSBiZWdpbiBlbWl0IHRpbWU7XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsaWZlIHRoZSBsaWZlIG9mIHRoaXMgZW1pdHRlclxuICAgKi9cbiAgZW1pdCh0b3RhbFRpbWUsIGxpZmUpIHtcbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gVXRpbC5pbml0VmFsdWUodG90YWxUaW1lLCBJbmZpbml0eSk7XG5cbiAgICBpZiAobGlmZSA9PT0gdHJ1ZSB8fCBsaWZlID09PSBcImxpZmVcIiB8fCBsaWZlID09PSBcImRlc3Ryb3lcIikge1xuICAgICAgdGhpcy5saWZlID0gdG90YWxUaW1lID09PSBcIm9uY2VcIiA/IDEgOiB0aGlzLnRvdGFsVGltZTtcbiAgICB9IGVsc2UgaWYgKCFpc05hTihsaWZlKSkge1xuICAgICAgdGhpcy5saWZlID0gbGlmZTtcbiAgICB9XG5cbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy50b3RhbFRpbWUgPSAtMTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnN0b3BlZCA9IHRydWU7XG4gIH1cblxuICBwcmVFbWl0KHRpbWUpIHtcbiAgICBsZXQgb2xkU3RvcGVkID0gdGhpcy5zdG9wZWQ7XG4gICAgbGV0IG9sZEVtaXRUaW1lID0gdGhpcy5lbWl0VGltZTtcbiAgICBsZXQgb2xkVG90YWxUaW1lID0gdGhpcy50b3RhbFRpbWU7XG5cbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gdGltZTtcbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuXG4gICAgY29uc3Qgc3RlcCA9IDAuMDE2NztcbiAgICB3aGlsZSAodGltZSA+IHN0ZXApIHtcbiAgICAgIHRpbWUgLT0gc3RlcDtcbiAgICAgIHRoaXMudXBkYXRlKHN0ZXApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcGVkID0gb2xkU3RvcGVkO1xuICAgIHRoaXMuZW1pdFRpbWUgPSBvbGRFbWl0VGltZSArIE1hdGgubWF4KHRpbWUsIDApO1xuICAgIHRoaXMudG90YWxUaW1lID0gb2xkVG90YWxUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBjdXJyZW50IGFsbCBwYXJ0aWNsZXNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIHJlbW92ZUFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLnBhcnRpY2xlc1tpXS5kZWFkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgaW5pdGlhbGl6ZSB0byB0aGlzIGVtaXR0ZXJcbiAgICogQG1ldGhvZCBhZGRTZWxmSW5pdGlhbGl6ZVxuICAgKi9cbiAgYWRkU2VsZkluaXRpYWxpemUoaW5pdGlhbGl6ZSkge1xuICAgIGlmIChpbml0aWFsaXplW1wiaW5pdFwiXSkge1xuICAgICAgaW5pdGlhbGl6ZS5pbml0KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmluaXRBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBJbml0aWFsaXplIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgaW5pdGlhbGl6ZXMgYXJyYXk6Zm9yIGV4YW1wbGUgZW1pdHRlci5hZGRJbml0aWFsaXplKGluaXRpYWxpemUxLGluaXRpYWxpemUyLGluaXRpYWxpemUzKTtcbiAgICogQG1ldGhvZCBhZGRJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBsaWtlIHRoaXMgbmV3IFJhZGl1cygxLCAxMilcbiAgICovXG4gIGFkZEluaXRpYWxpemUoLi4ucmVzdCkge1xuICAgIGxldCBpID0gcmVzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5pbml0aWFsaXplcy5wdXNoKHJlc3RbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgSW5pdGlhbGl6ZVxuICAgKiBAbWV0aG9kIHJlbW92ZUluaXRpYWxpemVcbiAgICogQHBhcmFtIHtJbml0aWFsaXplfSBpbml0aWFsaXplIGEgaW5pdGlhbGl6ZVxuICAgKi9cbiAgcmVtb3ZlSW5pdGlhbGl6ZShpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcy5pbmRleE9mKGluaXRpYWxpemVyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5pbml0aWFsaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgSW5pdGlhbGl6ZXNcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplcnNcbiAgICovXG4gIHJlbW92ZUFsbEluaXRpYWxpemVycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5pbml0aWFsaXplcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gcGFydGljbGVzO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkQmVoYXZpb3VyKEJlaGF2aW91cjEsQmVoYXZpb3VyMixCZWhhdmlvdXIzKTtcbiAgICogQG1ldGhvZCBhZGRCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IENvbG9yKCdyYW5kb20nKVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IGJlaGF2aW91ciA9IHJlc3RbaV07XG4gICAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgaWYgKGJlaGF2aW91ci5wYXJlbnRzKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEJlaGF2aW91clxuICAgKiBAbWV0aG9kIHJlbW92ZUJlaGF2aW91clxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcbiAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykge1xuICAgICAgaW5kZXggPSBiZWhhdmlvdXIucGFyZW50cy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIGJlaGF2aW91cnNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxCZWhhdmlvdXJzXG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZW1wdHlBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuICB9XG5cbiAgLy8gZW1pdHRlciB1cGRhdGVcbiAgdXBkYXRlKHRpbWUpIHtcbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB0aGlzLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuZW1pdHRpbmcodGltZSk7XG4gICAgdGhpcy5pbnRlZ3JhdGUodGltZSk7XG4gIH1cblxuICBpbnRlZ3JhdGUodGltZSkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGRhbXBpbmcgPSAxIC0gdGhpcy5kYW1waW5nO1xuICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHRoaXMsIHRpbWUsIGRhbXBpbmcpO1xuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIGxldCBpLCBwYXJ0aWNsZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2ldO1xuXG4gICAgICAvLyBwYXJ0aWNsZSB1cGRhdGVcbiAgICAgIHBhcnRpY2xlLnVwZGF0ZSh0aW1lLCBpKTtcbiAgICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9VUERBVEVcIiwgcGFydGljbGUpO1xuXG4gICAgICAvLyBjaGVjayBkZWFkXG4gICAgICBpZiAocGFydGljbGUuZGVhZCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfREVBRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQucG9vbC5leHBpcmUocGFydGljbGUpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCkge1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7XG4gICAgdGhpcy5iaW5kRXZlbnQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgZW1pdHRpbmcodGltZSkge1xuICAgIGlmICh0aGlzLnRvdGFsVGltZSA9PT0gXCJvbmNlXCIpIHtcbiAgICAgIGxldCBpO1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKDk5OTk5KTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDApIHRoaXMuZW1pdFNwZWVkID0gbGVuZ3RoO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB0aGlzLnRvdGFsVGltZSA9IFwibm9uZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRUaW1lICs9IHRpbWU7XG5cbiAgICAgIGlmICh0aGlzLmVtaXRUaW1lIDwgdGhpcy50b3RhbFRpbWUpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKHRpbWUpO1xuICAgICAgICBsZXQgaTtcblxuICAgICAgICBpZiAobGVuZ3RoID4gMCkgdGhpcy5lbWl0U3BlZWQgPSBsZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgc2luZ2xlIHBhcnRpY2xlO1xuICAgKlxuICAgKiBjYW4gdXNlIGVtaXQoe3g6MTB9LG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KSBvciBlbWl0KFt7eDoxMH0sbmV3IEluaXRpYWxpemVdLG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KVxuICAgKiBAbWV0aG9kIHJlbW92ZUFsbFBhcnRpY2xlc1xuICAgKi9cbiAgY3JlYXRlUGFydGljbGUoaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcmVudC5wb29sLmdldChQYXJ0aWNsZSk7XG4gICAgdGhpcy5zZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbml0aWFsaXplLCBiZWhhdmlvdXIpO1xuICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHBhcnRpY2xlKTtcblxuICAgIHJldHVybiBwYXJ0aWNsZTtcbiAgfVxuXG4gIHNldHVwUGFydGljbGUocGFydGljbGUsIGluaXRpYWxpemUsIGJlaGF2aW91cikge1xuICAgIGxldCBpbml0aWFsaXplcyA9IHRoaXMuaW5pdGlhbGl6ZXM7XG4gICAgbGV0IGJlaGF2aW91cnMgPSB0aGlzLmJlaGF2aW91cnM7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZSkgaW5pdGlhbGl6ZXMgPSBVdGlsLnRvQXJyYXkoaW5pdGlhbGl6ZSk7XG4gICAgaWYgKGJlaGF2aW91cikgYmVoYXZpb3VycyA9IFV0aWwudG9BcnJheShiZWhhdmlvdXIpO1xuXG4gICAgcGFydGljbGUucmVzZXQoKTtcbiAgICBJbml0aWFsaXplVXRpbC5pbml0aWFsaXplKHRoaXMsIHBhcnRpY2xlLCBpbml0aWFsaXplcyk7XG4gICAgcGFydGljbGUuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTtcbiAgICBwYXJ0aWNsZS5wYXJlbnQgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwYXJ0aWNsZSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgVXRpbC5kZXN0cm95QWxsKHRoaXMucGFydGljbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgRW1pdHRlclxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMucmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG4gICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQucmVtb3ZlRW1pdHRlcih0aGlzKTtcblxuICAgIHRoaXMucmF0ZSA9IG51bGw7XG4gICAgdGhpcy5vbGQgPSBudWxsO1xuICAgIHRoaXMucmdiID0gbnVsbDtcbiAgICB0aGlzLnYgPSBudWxsO1xuICAgIHRoaXMuYSA9IG51bGw7XG4gICAgdGhpcy5wID0gbnVsbDtcbiAgfVxufVxuXG5FdmVudERpc3BhdGNoZXIuYmluZChFbWl0dGVyKTtcbiIsImltcG9ydCBFbWl0dGVyIGZyb20gXCIuL0VtaXR0ZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmVoYXZpb3VyRW1pdHRlciBleHRlbmRzIEVtaXR0ZXIge1xuICAvKipcbiAgICogVGhlIEJlaGF2aW91ckVtaXR0ZXIgY2xhc3MgaW5oZXJpdHMgZnJvbSBQcm90b24uRW1pdHRlclxuICAgKlxuICAgKiB1c2UgdGhlIEJlaGF2aW91ckVtaXR0ZXIgeW91IGNhbiBhZGQgYmVoYXZpb3VycyB0byBzZWxmO1xuICAgKiBAY2xhc3MgUHJvdG9uLkJlaGF2aW91ckVtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYpIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMuc2VsZkJlaGF2aW91cnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdGhlIEJlaGF2aW91ciB0byBlbWl0dGVyO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkU2VsZkJlaGF2aW91cihCZWhhdmlvdXIxLEJlaGF2aW91cjIsQmVoYXZpb3VyMyk7XG4gICAqIEBtZXRob2QgYWRkU2VsZkJlaGF2aW91clxuICAgKiBAcGFyYW0ge1Byb3Rvbi5CZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IFByb3Rvbi5Db2xvcigncmFuZG9tJylcbiAgICovXG4gIGFkZFNlbGZCZWhhdmlvdXIoLi4ucmVzdCkge1xuICAgIGxldCBpLFxuICAgICAgbGVuZ3RoID0gcmVzdC5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBiZWhhdmlvdXIgPSByZXN0W2ldO1xuICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIHRoZSBCZWhhdmlvdXIgZm9yIHNlbGZcbiAgICogQG1ldGhvZCByZW1vdmVTZWxmQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7UHJvdG9uLkJlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVTZWxmQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxmQmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuc2VsZkJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgc3VwZXIudXBkYXRlKHRpbWUpO1xuXG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnNlbGZCZWhhdmlvdXJzLmxlbmd0aDtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9FbWl0dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbGxvd0VtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBGb2xsb3dFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gUHJvdG9uLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBGb2xsb3dFbWl0dGVyIHdpbGwgZW1pdCBwYXJ0aWNsZSB3aGVuIG1vdXNlbW92aW5nXG4gICAqXG4gICAqIEBjbGFzcyBQcm90b24uRm9sbG93RW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtb3VzZVRhcmdldCBtb3VzZWV2ZW50J3MgdGFyZ2V0O1xuICAgKiBAcGFyYW0ge051bWJlcn0gZWFzZSB0aGUgZWFzaW5nIG9mIGZvbGxvd2luZyBzcGVlZDtcbiAgICogQGRlZmF1bHQgMC43XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vdXNlVGFyZ2V0LCBlYXNlLCBjb25mKSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLm1vdXNlVGFyZ2V0ID0gVXRpbC5pbml0VmFsdWUobW91c2VUYXJnZXQsIHdpbmRvdyk7XG4gICAgdGhpcy5lYXNlID0gVXRpbC5pbml0VmFsdWUoZWFzZSwgMC43KTtcblxuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRFdmVudEhhbmRsZXIoKTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5tb3VzZW1vdmVIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNlbW92ZS5jYWxsKHRoaXMsIGUpO1xuICAgIHRoaXMubW91c2Vkb3duSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZWRvd24uY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNldXBIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNldXAuY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNlVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmVIYW5kbGVyLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgZW1pdCBwYXJ0aWNsZVxuICAgKiBAbWV0aG9kIGVtaXRcbiAgICovXG4gIGVtaXQoKSB7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogc3RvcCBlbWl0aW5nXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gZmFsc2U7XG4gIH1cblxuICBtb3VzZW1vdmUoZSkge1xuICAgIGlmIChlLmxheWVyWCB8fCBlLmxheWVyWCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUubGF5ZXJYIC0gdGhpcy5wLngpICogdGhpcy5lYXNlO1xuICAgICAgdGhpcy5wLnkgKz0gKGUubGF5ZXJZIC0gdGhpcy5wLnkpICogdGhpcy5lYXNlO1xuICAgIH0gZWxzZSBpZiAoZS5vZmZzZXRYIHx8IGUub2Zmc2V0WCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUub2Zmc2V0WCAtIHRoaXMucC54KSAqIHRoaXMuZWFzZTtcbiAgICAgIHRoaXMucC55ICs9IChlLm9mZnNldFkgLSB0aGlzLnAueSkgKiB0aGlzLmVhc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93RW1pdHRpbmcpIHN1cGVyLmVtaXQoXCJvbmNlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBFbWl0dGVyXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5tb3VzZVRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlSGFuZGxlciwgZmFsc2UpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHBpY3R1cmUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIG9yIG5vXG4gICAqL1xuICBpc0ltYWdlKG9iaikge1xuICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9iai5fX2lzSW1hZ2UpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFnTmFtZSA9IGAke29iai50YWdOYW1lfWAudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBub2RlTmFtZSA9IGAke29iai5ub2RlTmFtZX1gLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcIklNR1wiIHx8IHRhZ05hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgIG9iai5fX2lzSW1hZ2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHN0cmluZyBvYmplY3RcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgb3Igbm9cbiAgICovXG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiO1xuICB9XG59O1xuIiwiaW1wb3J0IFBvb2wgZnJvbSBcIi4uL2NvcmUvUG9vbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCgpO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jaXJjbGVDb25mID0geyBpc0NpcmNsZTogdHJ1ZSB9O1xuXG4gICAgdGhpcy5pbml0RXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5uYW1lID0gXCJCYXNlUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFN0cm9rZShjb2xvciA9IFwiIzAwMDAwMFwiLCB0aGlua25lc3MgPSAxKSB7XG4gICAgdGhpcy5zdHJva2UgPSB7IGNvbG9yLCB0aGlua25lc3MgfTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Qcm90b25VcGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblByb3RvblVwZGF0ZUFmdGVyLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIgPSBlbWl0dGVyID0+IHtcbiAgICAgIHRoaXMub25FbWl0dGVyQWRkZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyID0gZW1pdHRlciA9PiB7XG4gICAgICB0aGlzLm9uRW1pdHRlclJlbW92ZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZUNyZWF0ZWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZVVwZGF0ZS5jYWxsKHRoaXMsIHBhcnRpY2xlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZURlYWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwcm90b247XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlcik7XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfQURERURcIiwgdGhpcy5fZW1pdHRlckFkZGVkSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX1VQREFURVwiLCB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnBvb2wuZGVzdHJveSgpO1xuICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cblxuICByZW1vdmUocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX0FEREVEXCIsIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9VUERBVEVcIiwgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cbiAgb25Qcm90b25VcGRhdGVBZnRlcigpIHt9XG5cbiAgb25FbWl0dGVyQWRkZWQoZW1pdHRlcikge31cbiAgb25FbWl0dGVyUmVtb3ZlZChlbWl0dGVyKSB7fVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmJ1ZmZlckNhY2hlID0ge307XG4gICAgdGhpcy5uYW1lID0gXCJDYW52YXNSZW5kZXJlclwiO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5jb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgaWYgKFR5cGVzLmlzSW1hZ2UocGFydGljbGUuYm9keSkpIHtcbiAgICAgICAgdGhpcy5kcmF3SW1hZ2UocGFydGljbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdDaXJjbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IGltZztcbiAgfVxuXG4gIC8vIHByaXZhdGUgZHJhd0ltYWdlIG1ldGhvZFxuICBkcmF3SW1hZ2UocGFydGljbGUpIHtcbiAgICBjb25zdCB3ID0gKHBhcnRpY2xlLmJvZHkud2lkdGggKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IGggPSAocGFydGljbGUuYm9keS5oZWlnaHQgKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IHggPSBwYXJ0aWNsZS5wLnggLSB3IC8gMjtcbiAgICBjb25zdCB5ID0gcGFydGljbGUucC55IC0gaCAvIDI7XG5cbiAgICBpZiAoISFwYXJ0aWNsZS5jb2xvcikge1xuICAgICAgaWYgKCFwYXJ0aWNsZS5kYXRhW1wiYnVmZmVyXCJdKSBwYXJ0aWNsZS5kYXRhLmJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgICBjb25zdCBidWZDb250ZXh0ID0gcGFydGljbGUuZGF0YS5idWZmZXIuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgYnVmQ29udGV4dC5jbGVhclJlY3QoMCwgMCwgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCk7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbEFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICBidWZDb250ZXh0LmRyYXdJbWFnZShwYXJ0aWNsZS5ib2R5LCAwLCAwKTtcblxuICAgICAgYnVmQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1hdG9wXCI7XG4gICAgICBidWZDb250ZXh0LmZpbGxTdHlsZSA9IENvbG9yVXRpbC5yZ2JUb0hleChwYXJ0aWNsZS5yZ2IpO1xuICAgICAgYnVmQ29udGV4dC5maWxsUmVjdCgwLCAwLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCwgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0KTtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCxcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3LFxuICAgICAgICBoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpO1xuICAgICAgdGhpcy5jb250ZXh0LnJvdGF0ZShNYXRoVXRpbC5kZWdyZWVUcmFuc2Zvcm0ocGFydGljbGUucm90YXRpb24pKTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUoLXBhcnRpY2xlLnAueCwgLXBhcnRpY2xlLnAueSk7XG4gICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHBhcnRpY2xlLmJvZHksIDAsIDAsIHBhcnRpY2xlLmJvZHkud2lkdGgsIHBhcnRpY2xlLmJvZHkuaGVpZ2h0LCB4LCB5LCB3LCBoKTtcblxuICAgICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBkcmF3Q2lyY2xlIC0tXG4gIGRyYXdDaXJjbGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUucmdiKSB7XG4gICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gYHJnYmEoJHtwYXJ0aWNsZS5yZ2Iucn0sJHtwYXJ0aWNsZS5yZ2IuZ30sJHtwYXJ0aWNsZS5yZ2IuYn0sJHtwYXJ0aWNsZS5hbHBoYX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHBhcnRpY2xlLmNvbG9yO1xuICAgIH1cblxuICAgIC8vIGRyYXcgY2lyY2xlXG4gICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5hcmMocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSB0aGlzLnN0cm9rZS50aGlua25lc3M7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5maWxsKCk7XG4gIH1cblxuICAvLyBwcml2YXRlIGNyZWF0ZUJ1ZmZlclxuICBjcmVhdGVCdWZmZXIoaW1hZ2UpIHtcbiAgICBpZiAoVHlwZXMuaXNJbWFnZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBpbWFnZS53aWR0aCArIFwiX1wiICsgaW1hZ2UuaGVpZ2h0O1xuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuYnVmZmVyQ2FjaGVbc2l6ZV07XG5cbiAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgICB0aGlzLmJ1ZmZlckNhY2hlW3NpemVdID0gY2FudmFzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2FudmFzO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuYnVmZmVyQ2FjaGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMudHJhbnNmb3JtM2QgPSBmYWxzZTtcbiAgICB0aGlzLnBvb2wuY3JlYXRlID0gKGJvZHksIHBhcnRpY2xlKSA9PiB0aGlzLmNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkRvbVJlbmRlcmVyXCI7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5ib2R5UmVhZHkocGFydGljbGUpKSB7XG4gICAgICBpZiAodGhpcy50cmFuc2Zvcm0zZCkge1xuICAgICAgICBEb21VdGlsLnRyYW5zZm9ybTNkKHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5zY2FsZSwgcGFydGljbGUucm90YXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRG9tVXRpbC50cmFuc2Zvcm0ocGFydGljbGUuYm9keSwgcGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnNjYWxlLCBwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuc3R5bGUub3BhY2l0eSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgICBpZiAocGFydGljbGUuYm9keS5pc0NpcmNsZSkge1xuICAgICAgICBwYXJ0aWNsZS5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYm9keVJlYWR5KHBhcnRpY2xlKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGJvZHlSZWFkeShwYXJ0aWNsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFydGljbGUuYm9keSA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0aWNsZS5ib2R5ICYmICFwYXJ0aWNsZS5ib2R5LmlzSW5uZXI7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRlYWQpIHJldHVybjtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChpbWcsIHBhcnRpY2xlKTtcbiAgICBEb21VdGlsLnJlc2l6ZShwYXJ0aWNsZS5ib2R5LCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGlmIChib2R5LmlzQ2lyY2xlKSByZXR1cm4gdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5LCBwYXJ0aWNsZSk7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZHNcbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIDIgKiBwYXJ0aWNsZS5yYWRpdXMsIDIgKiBwYXJ0aWNsZS5yYWRpdXMpO1xuICAgIGRvbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgJHtwYXJ0aWNsZS5yYWRpdXN9cHhgO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBkb20uc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIGRvbS5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke3RoaXMuc3Ryb2tlLnRoaW5rbmVzc31weGA7XG4gICAgfVxuICAgIGRvbS5pc0NpcmNsZSA9IHRydWU7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9XG5cbiAgY3JlYXRlU3ByaXRlKGJvZHksIHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgPyBib2R5IDogYm9keS5zcmM7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIGJvZHkud2lkdGgsIGJvZHkuaGVpZ2h0KTtcbiAgICBkb20uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3VybH0pYDtcblxuICAgIHJldHVybiBkb207XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc2VsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMubmFtZSA9IFwiRWFzZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgdGhpcy5jcmVhdGVTcHJpdGUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnggPSBwYXJ0aWNsZS5wLng7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnkgPSBwYXJ0aWNsZS5wLnk7XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuYWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHBhcnRpY2xlLmJvZHkuc2NhbGVYID0gcGFydGljbGUuYm9keS5zY2FsZVkgPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICAgIHBhcnRpY2xlLmJvZHkucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnBhcmVudCAmJiBwYXJ0aWNsZS5ib2R5LnBhcmVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGFydGljbGUuZ3JhcGhpY3MpIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuZ3JhcGhpY3MpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBjcmVhdGVTcHJpdGUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5KTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5LnBhcmVudCkgcmV0dXJuO1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5W1wiaW1hZ2VcIl0pIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkucmVnWCA9IHBhcnRpY2xlLmJvZHkuaW1hZ2Uud2lkdGggLyAyO1xuICAgICAgcGFydGljbGUuYm9keS5yZWdZID0gcGFydGljbGUuYm9keS5pbWFnZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gdGhpcy5wb29sLmdldChjcmVhdGVqcy5HcmFwaGljcyk7XG5cbiAgICBpZiAodGhpcy5zdHJva2UpIHtcbiAgICAgIGlmIChUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkpIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UodGhpcy5zdHJva2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2UoXCIjMDAwMDAwXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgXCIjZmYwMDAwXCIpLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBjb25zdCBzaGFwZSA9IHRoaXMucG9vbC5nZXQoY3JlYXRlanMuU2hhcGUsIFtncmFwaGljc10pO1xuXG4gICAgcGFydGljbGUuYm9keSA9IHNoYXBlO1xuICAgIHBhcnRpY2xlLmdyYXBoaWNzID0gZ3JhcGhpY3M7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBSZWN0YW5nbGUgZnJvbSBcIi4uL21hdGgvUmVjdGFuZ2xlXCI7XG5pbXBvcnQgQmFzZVJlbmRlcmVyIGZyb20gXCIuL0Jhc2VSZW5kZXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaXhlbFJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgcmVjdGFuZ2xlKSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gbnVsbDtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHJlY3RhbmdsZTtcbiAgICB0aGlzLmNyZWF0ZUltYWdlRGF0YShyZWN0YW5nbGUpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJQaXhlbFJlbmRlcmVyXCI7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuZWxlbWVudC53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuZWxlbWVudC5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBjcmVhdGVJbWFnZURhdGEocmVjdGFuZ2xlKSB7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSByZWN0YW5nbGUgPyByZWN0YW5nbGUgOiBuZXcgUmVjdGFuZ2xlKDAsIDAsIHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gICAgdGhpcy5pbWFnZURhdGEgPSB0aGlzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHRoaXMucmVjdGFuZ2xlLndpZHRoLCB0aGlzLnJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIHRoaXMuY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5pbWFnZURhdGEsIHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnkpO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCh0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55LCB0aGlzLnJlY3RhbmdsZS53aWR0aCwgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IHRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgICB0aGlzLnJlY3RhbmdsZS54LFxuICAgICAgdGhpcy5yZWN0YW5nbGUueSxcbiAgICAgIHRoaXMucmVjdGFuZ2xlLndpZHRoLFxuICAgICAgdGhpcy5yZWN0YW5nbGUuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlQWZ0ZXIoKSB7XG4gICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLmltYWdlRGF0YSwgdGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSk7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge31cblxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VEYXRhKSB7XG4gICAgICB0aGlzLnNldFBpeGVsKFxuICAgICAgICB0aGlzLmltYWdlRGF0YSxcbiAgICAgICAgKHBhcnRpY2xlLnAueCAtIHRoaXMucmVjdGFuZ2xlLngpID4+IDAsXG4gICAgICAgIChwYXJ0aWNsZS5wLnkgLSB0aGlzLnJlY3RhbmdsZS55KSA+PiAwLFxuICAgICAgICBwYXJ0aWNsZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXRQaXhlbChpbWFnZWRhdGEsIHgsIHksIHBhcnRpY2xlKSB7XG4gICAgY29uc3QgcmdiID0gcGFydGljbGUucmdiO1xuICAgIGlmICh4IDwgMCB8fCB4ID4gdGhpcy5lbGVtZW50LndpZHRoIHx8IHkgPCAwIHx8IHkgPiB0aGlzLmVsZW1lbnQuaGVpZ2h0KSByZXR1cm47XG5cbiAgICBjb25zdCBpID0gKCh5ID4+IDApICogaW1hZ2VkYXRhLndpZHRoICsgKHggPj4gMCkpICogNDtcbiAgICBpbWFnZWRhdGEuZGF0YVtpXSA9IHJnYi5yO1xuICAgIGltYWdlZGF0YS5kYXRhW2kgKyAxXSA9IHJnYi5nO1xuICAgIGltYWdlZGF0YS5kYXRhW2kgKyAyXSA9IHJnYi5iO1xuICAgIGltYWdlZGF0YS5kYXRhW2kgKyAzXSA9IHBhcnRpY2xlLmFscGhhICogMjU1O1xuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMuY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICAgIHRoaXMucmVjdGFuZ2xlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFR5cGVzIGZyb20gXCIuLi91dGlscy9UeXBlc1wiO1xuaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmxldCBQSVhJQ2xhc3M7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaXhpUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMuY29sb3IgPSBmYWxzZTtcbiAgICB0aGlzLnNldENvbG9yID0gZmFsc2U7XG4gICAgdGhpcy5ibGVuZE1vZGUgPSBudWxsO1xuICAgIHRoaXMucG9vbC5jcmVhdGUgPSAoYm9keSwgcGFydGljbGUpID0+IHRoaXMuY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSk7XG4gICAgdGhpcy5zZXRQSVhJKHdpbmRvdy5QSVhJKTtcblxuICAgIHRoaXMubmFtZSA9IFwiUGl4aVJlbmRlcmVyXCI7XG4gIH1cblxuICBzZXRQSVhJKFBJWEkpIHtcbiAgICB0cnkge1xuICAgICAgUElYSUNsYXNzID0gUElYSSB8fCB7IFNwcml0ZToge30gfTtcbiAgICAgIHRoaXMuY3JlYXRlRnJvbUltYWdlID0gUElYSUNsYXNzLlNwcml0ZS5mcm9tIHx8IFBJWElDbGFzcy5TcHJpdGUuZnJvbUltYWdlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJ0aWNsZVxuICAgKi9cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgcGFydGljbGUuYm9keSA9IHRoaXMucG9vbC5nZXQocGFydGljbGUuYm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldCh0aGlzLmNpcmNsZUNvbmYsIHBhcnRpY2xlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ibGVuZE1vZGUpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkuYmxlbmRNb2RlID0gdGhpcy5ibGVuZE1vZGU7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJ0aWNsZVxuICAgKi9cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIHRoaXMudHJhbnNmb3JtKHBhcnRpY2xlLCBwYXJ0aWNsZS5ib2R5KTtcblxuICAgIGlmICh0aGlzLnNldENvbG9yID09PSB0cnVlIHx8IHRoaXMuY29sb3IgPT09IHRydWUpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkudGludCA9IENvbG9yVXRpbC5nZXRIZXgxNkZyb21QYXJ0aWNsZShwYXJ0aWNsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJ0aWNsZVxuICAgKi9cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ib2R5KTtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgfVxuXG4gIHRyYW5zZm9ybShwYXJ0aWNsZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0LnggPSBwYXJ0aWNsZS5wLng7XG4gICAgdGFyZ2V0LnkgPSBwYXJ0aWNsZS5wLnk7XG5cbiAgICB0YXJnZXQuYWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcblxuICAgIHRhcmdldC5zY2FsZS54ID0gcGFydGljbGUuc2NhbGU7XG4gICAgdGFyZ2V0LnNjYWxlLnkgPSBwYXJ0aWNsZS5zY2FsZTtcblxuICAgIC8vIHVzaW5nIGNhY2hlZCB2ZXJzaW9uIG9mIE1hdGhVdGlsLlBJXzE4MCBmb3Igc2xpZ2h0IHBlcmZvcm1hbmNlIGluY3JlYXNlLlxuICAgIHRhcmdldC5yb3RhdGlvbiA9IHBhcnRpY2xlLnJvdGF0aW9uICogTWF0aFV0aWwuUElfMTgwOyAvLyBNYXRoVXRpbC5QSV8xODA7XG4gIH1cblxuICBjcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKSB7XG4gICAgaWYgKGJvZHkuaXNDaXJjbGUpIHJldHVybiB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgZWxzZSByZXR1cm4gdGhpcy5jcmVhdGVTcHJpdGUoYm9keSk7XG4gIH1cblxuICBjcmVhdGVTcHJpdGUoYm9keSkge1xuICAgIGNvbnN0IHNwcml0ZSA9IGJvZHkuaXNJbm5lciA/IHRoaXMuY3JlYXRlRnJvbUltYWdlKGJvZHkuc3JjKSA6IG5ldyBQSVhJQ2xhc3MuU3ByaXRlKGJvZHkpO1xuXG4gICAgc3ByaXRlLmFuY2hvci54ID0gMC41O1xuICAgIHNwcml0ZS5hbmNob3IueSA9IDAuNTtcblxuICAgIHJldHVybiBzcHJpdGU7XG4gIH1cblxuICBjcmVhdGVDaXJjbGUocGFydGljbGUpIHtcbiAgICBjb25zdCBncmFwaGljcyA9IG5ldyBQSVhJQ2xhc3MuR3JhcGhpY3MoKTtcblxuICAgIGlmICh0aGlzLnN0cm9rZSkge1xuICAgICAgY29uc3Qgc3Ryb2tlID0gVHlwZXMuaXNTdHJpbmcodGhpcy5zdHJva2UpID8gdGhpcy5zdHJva2UgOiAweDAwMDAwMDtcbiAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKHN0cm9rZSk7XG4gICAgfVxuXG4gICAgZ3JhcGhpY3MuYmVnaW5GaWxsKHBhcnRpY2xlLmNvbG9yIHx8IDB4MDA4Y2VkKTtcbiAgICBncmFwaGljcy5kcmF3Q2lyY2xlKDAsIDAsIHBhcnRpY2xlLnJhZGl1cyk7XG4gICAgZ3JhcGhpY3MuZW5kRmlsbCgpO1xuXG4gICAgcmV0dXJuIGdyYXBoaWNzO1xuICB9XG5cbiAgZGVzdHJveShwYXJ0aWNsZXMpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG5cbiAgICBsZXQgaSA9IHBhcnRpY2xlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IHBhcnRpY2xlID0gcGFydGljbGVzW2ldO1xuICAgICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IE1hdDMgZnJvbSBcIi4uL21hdGgvTWF0M1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNU3RhY2sge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hdHMgPSBbXTtcbiAgICB0aGlzLnNpemUgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB0aGlzLm1hdHMucHVzaChNYXQzLmNyZWF0ZShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pKTtcbiAgfVxuXG4gIHNldChtLCBpKSB7XG4gICAgaWYgKGkgPT09IDApIE1hdDMuc2V0KG0sIHRoaXMubWF0c1swXSk7XG4gICAgZWxzZSBNYXQzLm11bHRpcGx5KHRoaXMubWF0c1tpIC0gMV0sIG0sIHRoaXMubWF0c1tpXSk7XG5cbiAgICB0aGlzLnNpemUgPSBNYXRoLm1heCh0aGlzLnNpemUsIGkgKyAxKTtcbiAgfVxuXG4gIHB1c2gobSkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IDApIE1hdDMuc2V0KG0sIHRoaXMubWF0c1swXSk7XG4gICAgZWxzZSBNYXQzLm11bHRpcGx5KHRoaXMubWF0c1t0aGlzLnNpemUgLSAxXSwgbSwgdGhpcy5tYXRzW3RoaXMuc2l6ZV0pO1xuXG4gICAgdGhpcy5zaXplKys7XG4gIH1cblxuICBwb3AoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA+IDApIHRoaXMuc2l6ZS0tO1xuICB9XG5cbiAgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLm1hdHNbdGhpcy5zaXplIC0gMV07XG4gIH1cbn1cbiIsImltcG9ydCBNYXQzIGZyb20gXCIuLi9tYXRoL01hdDNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgSW1nVXRpbCBmcm9tIFwiLi4vdXRpbHMvSW1nVXRpbFwiO1xuaW1wb3J0IE1TdGFjayBmcm9tIFwiLi4vdXRpbHMvTVN0YWNrXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IFdlYkdMVXRpbCBmcm9tIFwiLi4vdXRpbHMvV2ViR0xVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViR0xSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuZ2wgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLCB7IGFudGlhbGlhczogdHJ1ZSwgc3RlbmNpbDogZmFsc2UsIGRlcHRoOiBmYWxzZSB9KTtcbiAgICBpZiAoIXRoaXMuZ2wpIGFsZXJ0KFwiU29ycnkgeW91ciBicm93c2VyIGRvIG5vdCBzdXBwZXN0IFdlYkdMIVwiKTtcblxuICAgIHRoaXMuaW5pdFZhcigpO1xuICAgIHRoaXMuc2V0TWF4UmFkaXVzKCk7XG4gICAgdGhpcy5pbml0U2hhZGVycygpO1xuICAgIHRoaXMuaW5pdEJ1ZmZlcnMoKTtcblxuICAgIHRoaXMuZ2wuYmxlbmRFcXVhdGlvbih0aGlzLmdsLkZVTkNfQUREKTtcbiAgICB0aGlzLmdsLmJsZW5kRnVuYyh0aGlzLmdsLlNSQ19BTFBIQSwgdGhpcy5nbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICB0aGlzLmdsLmVuYWJsZSh0aGlzLmdsLkJMRU5EKTtcbiAgICB0aGlzLmFkZEltZzJCb2R5ID0gdGhpcy5hZGRJbWcyQm9keS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJXZWJHTFJlbmRlcmVyXCI7XG4gIH1cblxuICBpbml0KHByb3Rvbikge1xuICAgIHN1cGVyLmluaXQocHJvdG9uKTtcbiAgICB0aGlzLnJlc2l6ZSh0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLnVtYXRbNF0gPSAtMjtcbiAgICB0aGlzLnVtYXRbN10gPSAxO1xuXG4gICAgdGhpcy5zbWF0WzBdID0gMSAvIHdpZHRoO1xuICAgIHRoaXMuc21hdFs0XSA9IDEgLyBoZWlnaHQ7XG5cbiAgICB0aGlzLm1zdGFjay5zZXQodGhpcy51bWF0LCAwKTtcbiAgICB0aGlzLm1zdGFjay5zZXQodGhpcy5zbWF0LCAxKTtcblxuICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5lbGVtZW50LndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5lbGVtZW50LmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIHNldE1heFJhZGl1cyhyYWRpdXMpIHtcbiAgICB0aGlzLmNpcmNsZUNhbnZhc1VSTCA9IHRoaXMuY3JlYXRlQ2lyY2xlKHJhZGl1cyk7XG4gIH1cblxuICBnZXRWZXJ0ZXhTaGFkZXIoKSB7XG4gICAgY29uc3QgdnNTb3VyY2UgPSBbXG4gICAgICBcInVuaWZvcm0gdmVjMiB2aWV3cG9ydDtcIixcbiAgICAgIFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1wiLFxuICAgICAgXCJhdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ1bmlmb3JtIG1hdDMgdE1hdDtcIixcbiAgICAgIFwidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInZhcnlpbmcgZmxvYXQgYWxwaGE7XCIsXG4gICAgICBcInZvaWQgbWFpbigpIHtcIixcbiAgICAgIFwidmVjMyB2ID0gdE1hdCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uLCAxLjApO1wiLFxuICAgICAgXCJnbF9Qb3NpdGlvbiA9IHZlYzQodi54LCB2LnksIDAsIDEpO1wiLFxuICAgICAgXCJ2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDtcIixcbiAgICAgIFwiYWxwaGEgPSB0TWF0WzBdWzJdO1wiLFxuICAgICAgXCJ9XCJcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIHZzU291cmNlO1xuICB9XG5cbiAgZ2V0RnJhZ21lbnRTaGFkZXIoKSB7XG4gICAgY29uc3QgZnNTb3VyY2UgPSBbXG4gICAgICBcInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1wiLFxuICAgICAgXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidmFyeWluZyBmbG9hdCBhbHBoYTtcIixcbiAgICAgIFwidW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XCIsXG4gICAgICBcInVuaWZvcm0gdmVjNCBjb2xvcjtcIixcbiAgICAgIFwidW5pZm9ybSBib29sIHVzZVRleHR1cmU7XCIsXG4gICAgICBcInVuaWZvcm0gdmVjMyB1Q29sb3I7XCIsXG4gICAgICBcInZvaWQgbWFpbigpIHtcIixcbiAgICAgIFwidmVjNCB0ZXh0dXJlQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1wiLFxuICAgICAgXCJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ29sb3IgKiB2ZWM0KHVDb2xvciwgMS4wKTtcIixcbiAgICAgIFwiZ2xfRnJhZ0NvbG9yLncgKj0gYWxwaGE7XCIsXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gZnNTb3VyY2U7XG4gIH1cblxuICBpbml0VmFyKCkge1xuICAgIHRoaXMubXN0YWNrID0gbmV3IE1TdGFjaygpO1xuICAgIHRoaXMudW1hdCA9IE1hdDMuY3JlYXRlKFsyLCAwLCAxLCAwLCAtMiwgMCwgLTEsIDEsIDFdKTtcbiAgICB0aGlzLnNtYXQgPSBNYXQzLmNyZWF0ZShbMSAvIDEwMCwgMCwgMSwgMCwgMSAvIDEwMCwgMCwgMCwgMCwgMV0pO1xuICAgIHRoaXMudGV4dHVyZWJ1ZmZlcnMgPSB7fTtcbiAgfVxuXG4gIGJsZW5kRXF1YXRpb24oQSkge1xuICAgIHRoaXMuZ2wuYmxlbmRFcXVhdGlvbih0aGlzLmdsW0FdKTtcbiAgfVxuXG4gIGJsZW5kRnVuYyhBLCBCKSB7XG4gICAgdGhpcy5nbC5ibGVuZEZ1bmModGhpcy5nbFtBXSwgdGhpcy5nbFtCXSk7XG4gIH1cblxuICBnZXRTaGFkZXIoZ2wsIHN0ciwgZnMpIHtcbiAgICBjb25zdCBzaGFkZXIgPSBmcyA/IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpIDogZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc3RyKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgYWxlcnQoZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBzaGFkZXI7XG4gIH1cblxuICBpbml0U2hhZGVycygpIHtcbiAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IHRoaXMuZ2V0U2hhZGVyKHRoaXMuZ2wsIHRoaXMuZ2V0RnJhZ21lbnRTaGFkZXIoKSwgdHJ1ZSk7XG4gICAgY29uc3QgdmVydGV4U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIodGhpcy5nbCwgdGhpcy5nZXRWZXJ0ZXhTaGFkZXIoKSwgZmFsc2UpO1xuXG4gICAgdGhpcy5zcHJvZ3JhbSA9IHRoaXMuZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHRoaXMuc3Byb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5zcHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuICAgIHRoaXMuZ2wubGlua1Byb2dyYW0odGhpcy5zcHJvZ3JhbSk7XG5cbiAgICBpZiAoIXRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnNwcm9ncmFtLCB0aGlzLmdsLkxJTktfU1RBVFVTKSkgYWxlcnQoXCJDb3VsZCBub3QgaW5pdGlhbGlzZSBzaGFkZXJzXCIpO1xuXG4gICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMuc3Byb2dyYW0pO1xuICAgIHRoaXMuc3Byb2dyYW0udnBhID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcImFWZXJ0ZXhQb3NpdGlvblwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnRjYSA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJhVGV4dHVyZUNvb3JkXCIpO1xuICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5zcHJvZ3JhbS50Y2EpO1xuICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5zcHJvZ3JhbS52cGEpO1xuXG4gICAgdGhpcy5zcHJvZ3JhbS50TWF0VW5pZm9ybSA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidE1hdFwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnNhbXBsZXJVbmlmb3JtID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1U2FtcGxlclwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLnVzZVRleCA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwidXNlVGV4dHVyZVwiKTtcbiAgICB0aGlzLnNwcm9ncmFtLmNvbG9yID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1Q29sb3JcIik7XG4gICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5zcHJvZ3JhbS51c2VUZXgsIDEpO1xuICB9XG5cbiAgaW5pdEJ1ZmZlcnMoKSB7XG4gICAgY29uc3QgdnMgPSBbMCwgMywgMSwgMCwgMiwgM107XG4gICAgbGV0IGlkeDtcblxuICAgIHRoaXMudW5pdElCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbmV3IFVpbnQxNkFycmF5KHZzKSwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG5cbiAgICBsZXQgaTtcbiAgICBsZXQgaWRzID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSBpZHMucHVzaChpKTtcbiAgICBpZHggPSBuZXcgVWludDE2QXJyYXkoaWRzKTtcblxuICAgIHRoaXMudW5pdEkzMyA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdEkzMyk7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlkeCwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG5cbiAgICBpZHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIGlkcy5wdXNoKGksIGkgKyAxLCBpICsgMik7XG4gICAgaWR4ID0gbmV3IFVpbnQxNkFycmF5KGlkcyk7XG5cbiAgICB0aGlzLnN0cmlwQnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5zdHJpcEJ1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGlkeCwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG4gIH1cblxuICBjcmVhdGVDaXJjbGUocmFpZHVzKSB7XG4gICAgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgPSBXZWJHTFV0aWwubmhwb3QoVXRpbC5pbml0VmFsdWUocmFpZHVzLCAzMikpO1xuICAgIGNvbnN0IGNhbnZhcyA9IERvbVV0aWwuY3JlYXRlQ2FudmFzKFwiY2lyY2xlX2NhbnZhc1wiLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyAqIDIsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzICogMik7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuYXJjKHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCIjRkZGXCI7XG4gICAgY29udGV4dC5maWxsKCk7XG5cbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xuICB9XG5cbiAgZHJhd0ltZzJDYW52YXMocGFydGljbGUpIHtcbiAgICBjb25zdCBfdyA9IHBhcnRpY2xlLmJvZHkud2lkdGg7XG4gICAgY29uc3QgX2ggPSBwYXJ0aWNsZS5ib2R5LmhlaWdodDtcblxuICAgIGNvbnN0IF93aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChwYXJ0aWNsZS5ib2R5LndpZHRoKTtcbiAgICBjb25zdCBfaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KHBhcnRpY2xlLmJvZHkuaGVpZ2h0KTtcblxuICAgIGNvbnN0IF9zY2FsZVggPSBwYXJ0aWNsZS5ib2R5LndpZHRoIC8gX3dpZHRoO1xuICAgIGNvbnN0IF9zY2FsZVkgPSBwYXJ0aWNsZS5ib2R5LmhlaWdodCAvIF9oZWlnaHQ7XG5cbiAgICBpZiAoIXRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdKVxuICAgICAgdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY10gPSBbXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlVGV4dHVyZSgpLFxuICAgICAgICB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpLFxuICAgICAgICB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpXG4gICAgICBdO1xuXG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMF07XG4gICAgcGFydGljbGUuZGF0YS52Y0J1ZmZlciA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzFdO1xuICAgIHBhcnRpY2xlLmRhdGEudGNCdWZmZXIgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVsyXTtcblxuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS50Y0J1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKFxuICAgICAgdGhpcy5nbC5BUlJBWV9CVUZGRVIsXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgX3NjYWxlWCwgMC4wLCAwLjAsIF9zY2FsZVksIF9zY2FsZVksIF9zY2FsZVldKSxcbiAgICAgIHRoaXMuZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS52Y0J1ZmZlcik7XG4gICAgdGhpcy5nbC5idWZmZXJEYXRhKFxuICAgICAgdGhpcy5nbC5BUlJBWV9CVUZGRVIsXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgX3csIDAuMCwgMC4wLCBfaCwgX3csIF9oXSksXG4gICAgICB0aGlzLmdsLlNUQVRJQ19EUkFXXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYXJ0aWNsZS5kYXRhLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3QgZGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIF93aWR0aCwgX2hlaWdodCk7XG5cbiAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgcGFydGljbGUuZGF0YS50ZXh0dXJlKTtcbiAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5VTlNJR05FRF9CWVRFLCBkYXRhKTtcbiAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdGhpcy5nbC5MSU5FQVIpO1xuICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB0aGlzLmdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgdGhpcy5nbC5nZW5lcmF0ZU1pcG1hcCh0aGlzLmdsLlRFWFRVUkVfMkQpO1xuXG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkID0gdHJ1ZTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVXaWR0aCA9IF93O1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZUhlaWdodCA9IF9oO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgLy8gdGhpcy5nbC5jbGVhckNvbG9yKDAsIDAsIDAsIDEpO1xuICAgIC8vIHRoaXMuZ2wuY2xlYXIodGhpcy5nbC5DT0xPUl9CVUZGRVJfQklUIHwgdGhpcy5nbC5ERVBUSF9CVUZGRVJfQklUKTtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkID0gZmFsc2U7XG4gICAgcGFydGljbGUuZGF0YS50bWF0ID0gTWF0My5jcmVhdGUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRtYXRbOF0gPSAxO1xuICAgIHBhcnRpY2xlLmRhdGEuaW1hdCA9IE1hdDMuY3JlYXRlKCk7XG4gICAgcGFydGljbGUuZGF0YS5pbWF0WzhdID0gMTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHRoaXMuY2lyY2xlQ2FudmFzVVJMLCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgICBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlID0gcGFydGljbGUucmFkaXVzIC8gdGhpcy5jaXJjbGVDYW52YXNSYWRpdXM7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRlYWQpIHJldHVybjtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gaW1nO1xuICAgIHBhcnRpY2xlLmRhdGEuc3JjID0gaW1nLnNyYztcbiAgICBwYXJ0aWNsZS5kYXRhLmNhbnZhcyA9IEltZ1V0aWwuZ2V0Q2FudmFzRnJvbUNhY2hlKGltZyk7XG4gICAgcGFydGljbGUuZGF0YS5vbGRTY2FsZSA9IDE7XG5cbiAgICB0aGlzLmRyYXdJbWcyQ2FudmFzKHBhcnRpY2xlKTtcbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGF0YS50ZXh0dXJlTG9hZGVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hdHJpeChwYXJ0aWNsZSk7XG5cbiAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMuc3Byb2dyYW0uY29sb3IsIHBhcnRpY2xlLnJnYi5yIC8gMjU1LCBwYXJ0aWNsZS5yZ2IuZyAvIDI1NSwgcGFydGljbGUucmdiLmIgLyAyNTUpO1xuICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuc3Byb2dyYW0udE1hdFVuaWZvcm0sIGZhbHNlLCB0aGlzLm1zdGFjay50b3AoKSk7XG5cbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS52Y0J1ZmZlcik7XG4gICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5zcHJvZ3JhbS52cGEsIDIsIHRoaXMuZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgcGFydGljbGUuZGF0YS50Y0J1ZmZlcik7XG4gICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGhpcy5zcHJvZ3JhbS50Y2EsIDIsIHRoaXMuZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCBwYXJ0aWNsZS5kYXRhLnRleHR1cmUpO1xuICAgICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5zcHJvZ3JhbS5zYW1wbGVyVW5pZm9ybSwgMCk7XG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0SUJ1ZmZlcik7XG5cbiAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZ2wuVFJJQU5HTEVTLCA2LCB0aGlzLmdsLlVOU0lHTkVEX1NIT1JULCAwKTtcbiAgICAgIHRoaXMubXN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7fVxuXG4gIHVwZGF0ZU1hdHJpeChwYXJ0aWNsZSkge1xuICAgIGNvbnN0IG1vdmVPcmlnaW5NYXRyaXggPSBXZWJHTFV0aWwubWFrZVRyYW5zbGF0aW9uKFxuICAgICAgLXBhcnRpY2xlLmRhdGEudGV4dHVyZVdpZHRoIC8gMixcbiAgICAgIC1wYXJ0aWNsZS5kYXRhLnRleHR1cmVIZWlnaHQgLyAyXG4gICAgKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlVHJhbnNsYXRpb24ocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpO1xuXG4gICAgY29uc3QgYW5nZWwgPSBwYXJ0aWNsZS5yb3RhdGlvbiAqIE1hdGhVdGlsLlBJXzE4MDtcbiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlUm90YXRpb24oYW5nZWwpO1xuXG4gICAgY29uc3Qgc2NhbGUgPSBwYXJ0aWNsZS5zY2FsZSAqIHBhcnRpY2xlLmRhdGEub2xkU2NhbGU7XG4gICAgY29uc3Qgc2NhbGVNYXRyaXggPSBXZWJHTFV0aWwubWFrZVNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgbGV0IG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtb3ZlT3JpZ2luTWF0cml4LCBzY2FsZU1hdHJpeCk7XG5cbiAgICBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobWF0cml4LCByb3RhdGlvbk1hdHJpeCk7XG4gICAgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1hdHJpeCwgdHJhbnNsYXRpb25NYXRyaXgpO1xuXG4gICAgTWF0My5pbnZlcnNlKG1hdHJpeCwgcGFydGljbGUuZGF0YS5pbWF0KTtcbiAgICBtYXRyaXhbMl0gPSBwYXJ0aWNsZS5hbHBoYTtcblxuICAgIHRoaXMubXN0YWNrLnB1c2gobWF0cml4KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgIHRoaXMubXN0YWNrID0gbnVsbDtcbiAgICB0aGlzLnVtYXQgPSBudWxsO1xuICAgIHRoaXMuc21hdCA9IG51bGw7XG4gICAgdGhpcy50ZXh0dXJlYnVmZmVycyA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJDdXN0b21SZW5kZXJlclwiO1xuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgxLCB5MSwgeDIsIHkyLCBkaXJlY3Rpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHgyIC0geDEgPj0gMCkge1xuICAgICAgdGhpcy54MSA9IHgxO1xuICAgICAgdGhpcy55MSA9IHkxO1xuICAgICAgdGhpcy54MiA9IHgyO1xuICAgICAgdGhpcy55MiA9IHkyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLngxID0geDI7XG4gICAgICB0aGlzLnkxID0geTI7XG4gICAgICB0aGlzLngyID0geDE7XG4gICAgICB0aGlzLnkyID0geTE7XG4gICAgfVxuXG4gICAgdGhpcy5keCA9IHRoaXMueDIgLSB0aGlzLngxO1xuICAgIHRoaXMuZHkgPSB0aGlzLnkyIC0gdGhpcy55MTtcblxuICAgIHRoaXMubWlueCA9IE1hdGgubWluKHRoaXMueDEsIHRoaXMueDIpO1xuICAgIHRoaXMubWlueSA9IE1hdGgubWluKHRoaXMueTEsIHRoaXMueTIpO1xuICAgIHRoaXMubWF4eCA9IE1hdGgubWF4KHRoaXMueDEsIHRoaXMueDIpO1xuICAgIHRoaXMubWF4eSA9IE1hdGgubWF4KHRoaXMueTEsIHRoaXMueTIpO1xuXG4gICAgdGhpcy5kb3QgPSB0aGlzLngyICogdGhpcy55MSAtIHRoaXMueDEgKiB0aGlzLnkyO1xuICAgIHRoaXMueHh5eSA9IHRoaXMuZHggKiB0aGlzLmR4ICsgdGhpcy5keSAqIHRoaXMuZHk7XG5cbiAgICB0aGlzLmdyYWRpZW50ID0gdGhpcy5nZXRHcmFkaWVudCgpO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTtcbiAgICB0aGlzLmRpcmVjdGlvbiA9IFV0aWwuaW5pdFZhbHVlKGRpcmVjdGlvbiwgXCI+XCIpO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgdGhpcy5yYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLngxICsgdGhpcy5yYW5kb20gKiB0aGlzLmxlbmd0aCAqIE1hdGguY29zKHRoaXMuZ3JhZGllbnQpO1xuICAgIHRoaXMudmVjdG9yLnkgPSB0aGlzLnkxICsgdGhpcy5yYW5kb20gKiB0aGlzLmxlbmd0aCAqIE1hdGguc2luKHRoaXMuZ3JhZGllbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgZ2V0RGlyZWN0aW9uKHgsIHkpIHtcbiAgICBjb25zdCBBID0gdGhpcy5keTtcbiAgICBjb25zdCBCID0gLXRoaXMuZHg7XG4gICAgY29uc3QgQyA9IHRoaXMuZG90O1xuICAgIGNvbnN0IEQgPSBCID09PSAwID8gMSA6IEI7XG5cbiAgICBpZiAoKEEgKiB4ICsgQiAqIHkgKyBDKSAqIEQgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERpc3RhbmNlKHgsIHkpIHtcbiAgICBjb25zdCBBID0gdGhpcy5keTtcbiAgICBjb25zdCBCID0gLXRoaXMuZHg7XG4gICAgY29uc3QgQyA9IHRoaXMuZG90O1xuICAgIGNvbnN0IEQgPSBBICogeCArIEIgKiB5ICsgQztcblxuICAgIHJldHVybiBEIC8gTWF0aC5zcXJ0KHRoaXMueHh5eSk7XG4gIH1cblxuICBnZXRTeW1tZXRyaWModikge1xuICAgIGNvbnN0IHRoYTIgPSB2LmdldEdyYWRpZW50KCk7XG4gICAgY29uc3QgdGhhMSA9IHRoaXMuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGEgPSAyICogKHRoYTEgLSB0aGEyKTtcblxuICAgIGNvbnN0IG9sZHggPSB2Lng7XG4gICAgY29uc3Qgb2xkeSA9IHYueTtcblxuICAgIHYueCA9IG9sZHggKiBNYXRoLmNvcyh0aGEpIC0gb2xkeSAqIE1hdGguc2luKHRoYSk7XG4gICAgdi55ID0gb2xkeCAqIE1hdGguc2luKHRoYSkgKyBvbGR5ICogTWF0aC5jb3ModGhhKTtcblxuICAgIHJldHVybiB2O1xuICB9XG5cbiAgZ2V0R3JhZGllbnQoKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy5keSwgdGhpcy5keCk7XG4gIH1cblxuICByYW5nZU91dChwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5hYnModGhpcy5nZXRHcmFkaWVudCgpKTtcblxuICAgIGlmIChhbmdsZSA8PSBNYXRoVXRpbC5QSSAvIDQpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggPD0gdGhpcy5tYXh4ICYmIHBhcnRpY2xlLnAueCA+PSB0aGlzLm1pbngpIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFydGljbGUucC55IDw9IHRoaXMubWF4eSAmJiBwYXJ0aWNsZS5wLnkgPj0gdGhpcy5taW55KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmR4ICogdGhpcy5keCArIHRoaXMuZHkgKiB0aGlzLmR5KTtcbiAgfVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSBcIj5cIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJSXCIgfHwgdGhpcy5kaXJlY3Rpb24gPT09IFwicmlnaHRcIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJkb3duXCIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5nZXREaXJlY3Rpb24ocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5yYW5nZU91dChwYXJ0aWNsZSkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmdldERpcmVjdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5nZXREaXN0YW5jZShwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkgPD0gcGFydGljbGUucmFkaXVzKSB7XG4gICAgICAgIGlmICh0aGlzLmR4ID09PSAwKSB7XG4gICAgICAgICAgcGFydGljbGUudi54ICo9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHkgPT09IDApIHtcbiAgICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nZXRTeW1tZXRyaWMocGFydGljbGUudik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgTGluZVpvbmUgZG9lcyBub3Qgc3VwcG9ydCBjcm9zcyBtZXRob2QhXCIpO1xuICAgICAgICB0aGlzLmFsZXJ0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY2xlWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih4LCB5LCByYWRpdXMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xuICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgIHRoaXMuY2VudGVyID0geyB4LCB5IH07XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLmFuZ2xlID0gTWF0aFV0aWwuUEl4MiAqIE1hdGgucmFuZG9tKCk7XG4gICAgdGhpcy5yYW5kb21SYWRpdXMgPSBNYXRoLnJhbmRvbSgpICogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueCArIHRoaXMucmFuZG9tUmFkaXVzICogTWF0aC5jb3ModGhpcy5hbmdsZSk7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueSArIHRoaXMucmFuZG9tUmFkaXVzICogTWF0aC5zaW4odGhpcy5hbmdsZSk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBzZXRDZW50ZXIoeCwgeSkge1xuICAgIHRoaXMuY2VudGVyLnggPSB4O1xuICAgIHRoaXMuY2VudGVyLnkgPSB5O1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBjb25zdCBkID0gcGFydGljbGUucC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKTtcblxuICAgIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJkZWFkXCIpIHtcbiAgICAgIGlmIChkIC0gcGFydGljbGUucmFkaXVzID4gdGhpcy5yYWRpdXMpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKGQgKyBwYXJ0aWNsZS5yYWRpdXMgPj0gdGhpcy5yYWRpdXMpIHRoaXMuZ2V0U3ltbWV0cmljKHBhcnRpY2xlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmICh0aGlzLmFsZXJ0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgQ2lyY2xlWm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzIG1ldGhvZCFcIik7XG4gICAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRTeW1tZXRyaWMocGFydGljbGUpIHtcbiAgICBjb25zdCB0aGEyID0gcGFydGljbGUudi5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYTEgPSB0aGlzLmdldEdyYWRpZW50KHBhcnRpY2xlKTtcblxuICAgIGNvbnN0IHRoYSA9IDIgKiAodGhhMSAtIHRoYTIpO1xuICAgIGNvbnN0IG9sZHggPSBwYXJ0aWNsZS52Lng7XG4gICAgY29uc3Qgb2xkeSA9IHBhcnRpY2xlLnYueTtcblxuICAgIHBhcnRpY2xlLnYueCA9IG9sZHggKiBNYXRoLmNvcyh0aGEpIC0gb2xkeSAqIE1hdGguc2luKHRoYSk7XG4gICAgcGFydGljbGUudi55ID0gb2xkeCAqIE1hdGguc2luKHRoYSkgKyBvbGR5ICogTWF0aC5jb3ModGhhKTtcbiAgfVxuXG4gIGdldEdyYWRpZW50KHBhcnRpY2xlKSB7XG4gICAgcmV0dXJuIC1NYXRoVXRpbC5QSV8yICsgTWF0aC5hdGFuMihwYXJ0aWNsZS5wLnkgLSB0aGlzLmNlbnRlci55LCBwYXJ0aWNsZS5wLnggLSB0aGlzLmNlbnRlci54KTtcbiAgfVxufVxuIiwiaW1wb3J0IFpvbmUgZnJvbSBcIi4vWm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWN0Wm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54ICsgTWF0aC5yYW5kb20oKSAqIHRoaXMud2lkdGg7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueSArIE1hdGgucmFuZG9tKCkgKiB0aGlzLmhlaWdodDtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgLy8gcGFydGljbGUgZGVhZCB6b25lXG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJ0aWNsZS5wLnggLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnggKyB0aGlzLndpZHRoKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcblxuICAgICAgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcGFydGljbGUgYm91bmQgem9uZVxuICAgIGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImJvdW5kXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggLSBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLngpIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueCArIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGgpIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgdGhpcy53aWR0aCAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi54ICo9IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydGljbGUucC55IC0gcGFydGljbGUucmFkaXVzIDwgdGhpcy55KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi55ICo9IC0xO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgKyB0aGlzLmhlaWdodCAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgICAgcGFydGljbGUudi55ICo9IC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnRpY2xlIGNyb3NzIHpvbmVcbiAgICBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJjcm9zc1wiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy54ICYmIHBhcnRpY2xlLnYueCA8PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueCA9IHRoaXMueCArIHRoaXMud2lkdGggKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGggJiYgcGFydGljbGUudi54ID49IDApIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy55ICYmIHBhcnRpY2xlLnYueSA8PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnkgKyB0aGlzLmhlaWdodCAmJiBwYXJ0aWNsZS52LnkgPj0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnkgPSB0aGlzLnkgLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoaW1hZ2VEYXRhLCB4LCB5LCBkKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc2V0KGltYWdlRGF0YSwgeCwgeSwgZCk7XG4gIH1cblxuICByZXNldChpbWFnZURhdGEsIHgsIHksIGQpIHtcbiAgICB0aGlzLmltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICB0aGlzLnggPSBVdGlsLmluaXRWYWx1ZSh4LCAwKTtcbiAgICB0aGlzLnkgPSBVdGlsLmluaXRWYWx1ZSh5LCAwKTtcbiAgICB0aGlzLmQgPSBVdGlsLmluaXRWYWx1ZShkLCAyKTtcblxuICAgIHRoaXMudmVjdG9ycyA9IFtdO1xuICAgIHRoaXMuc2V0VmVjdG9ycygpO1xuICB9XG5cbiAgc2V0VmVjdG9ycygpIHtcbiAgICBsZXQgaSwgajtcbiAgICBjb25zdCBsZW5ndGgxID0gdGhpcy5pbWFnZURhdGEud2lkdGg7XG4gICAgY29uc3QgbGVuZ3RoMiA9IHRoaXMuaW1hZ2VEYXRhLmhlaWdodDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGgxOyBpICs9IHRoaXMuZCkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDI7IGogKz0gdGhpcy5kKSB7XG4gICAgICAgIGxldCBpbmRleCA9ICgoaiA+PiAwKSAqIGxlbmd0aDEgKyAoaSA+PiAwKSkgKiA0O1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlRGF0YS5kYXRhW2luZGV4ICsgM10gPiAwKSB7XG4gICAgICAgICAgdGhpcy52ZWN0b3JzLnB1c2goeyB4OiBpICsgdGhpcy54LCB5OiBqICsgdGhpcy55IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgZ2V0Qm91bmQoeCwgeSkge1xuICAgIGNvbnN0IGluZGV4ID0gKCh5ID4+IDApICogdGhpcy5pbWFnZURhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuICAgIGlmICh0aGlzLmltYWdlRGF0YS5kYXRhW2luZGV4ICsgM10gPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHZlY3RvciA9IFV0aWwuZ2V0UmFuZEZyb21BcnJheSh0aGlzLnZlY3RvcnMpO1xuICAgIHJldHVybiB0aGlzLnZlY3Rvci5jb3B5KHZlY3Rvcik7XG4gIH1cblxuICBnZXRDb2xvcih4LCB5KSB7XG4gICAgeCAtPSB0aGlzLng7XG4gICAgeSAtPSB0aGlzLnk7XG4gICAgY29uc3QgaSA9ICgoeSA+PiAwKSAqIHRoaXMuaW1hZ2VEYXRhLndpZHRoICsgKHggPj4gMCkpICogNDtcblxuICAgIHJldHVybiB7XG4gICAgICByOiB0aGlzLmltYWdlRGF0YS5kYXRhW2ldLFxuICAgICAgZzogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgMV0sXG4gICAgICBiOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAyXSxcbiAgICAgIGE6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDNdXG4gICAgfTtcbiAgfVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKHRoaXMuZ2V0Qm91bmQocGFydGljbGUucC54IC0gdGhpcy54LCBwYXJ0aWNsZS5wLnkgLSB0aGlzLnkpKSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgcGFydGljbGUuZGVhZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKCF0aGlzLmdldEJvdW5kKHBhcnRpY2xlLnAueCAtIHRoaXMueCwgcGFydGljbGUucC55IC0gdGhpcy55KSkgcGFydGljbGUudi5uZWdhdGUoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4uL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IENpcmNsZVpvbmUgZnJvbSBcIi4uL3pvbmUvQ2lyY2xlWm9uZVwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBMaW5lWm9uZSBmcm9tIFwiLi4vem9uZS9MaW5lWm9uZVwiO1xuaW1wb3J0IFJlY3Rab25lIGZyb20gXCIuLi96b25lL1JlY3Rab25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sIGZ1bmMpIHtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgKCkgPT4gZnVuYygpKTtcbiAgfSxcblxuICBnZXRTdHlsZShjb2xvciA9IFwiI2ZmMDAwMFwiKSB7XG4gICAgY29uc3QgcmdiID0gQ29sb3JVdGlsLmhleFRvUmdiKGNvbG9yKTtcbiAgICByZXR1cm4gYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgMC41KWA7XG4gIH0sXG5cbiAgZHJhd1pvbmUocHJvdG9uLCBjYW52YXMsIHpvbmUsIGNsZWFyKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCAoKSA9PiB7XG4gICAgICBpZiAoY2xlYXIpIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICAgIGlmICh6b25lIGluc3RhbmNlb2YgUG9pbnRab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuYXJjKHpvbmUueCwgem9uZS55LCAxMCwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIExpbmVab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oem9uZS54MSwgem9uZS55MSk7XG4gICAgICAgIGNvbnRleHQubGluZVRvKHpvbmUueDIsIHpvbmUueTIpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgUmVjdFpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmRyYXdSZWN0KHpvbmUueCwgem9uZS55LCB6b25lLndpZHRoLCB6b25lLmhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBDaXJjbGVab25lKSB7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5hcmMoem9uZS54LCB6b25lLnksIHpvbmUucmFkaXVzLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG5cbiAgZHJhd0VtaXR0ZXIocHJvdG9uLCBjYW52YXMsIGVtaXR0ZXIsIGNsZWFyKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlKCk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIocHJvdG9uLCAoKSA9PiB7XG4gICAgICBpZiAoY2xlYXIpIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHN0eWxlO1xuICAgICAgY29udGV4dC5hcmMoZW1pdHRlci5wLngsIGVtaXR0ZXIucC55LCAxMCwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IFByb3RvbiBmcm9tIFwiLi9jb3JlL1Byb3RvblwiO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gXCIuL2NvcmUvUGFydGljbGVcIjtcbmltcG9ydCBQb29sIGZyb20gXCIuL2NvcmUvUG9vbFwiO1xuXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuL3V0aWxzL0NvbG9yVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuL21hdGgvTWF0aFV0aWxcIjtcbmltcG9ydCBWZWN0b3IyRCBmcm9tIFwiLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgUG9sYXIyRCBmcm9tIFwiLi9tYXRoL1BvbGFyMkRcIjtcbmltcG9ydCBNYXQzIGZyb20gXCIuL21hdGgvTWF0M1wiO1xuaW1wb3J0IFNwYW4gZnJvbSBcIi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuL21hdGgvQXJyYXlTcGFuXCI7XG5pbXBvcnQgUmVjdGFuZ2xlIGZyb20gXCIuL21hdGgvUmVjdGFuZ2xlXCI7XG5pbXBvcnQgZWFzZSBmcm9tIFwiLi9tYXRoL2Vhc2VcIjtcblxuaW1wb3J0IFJhdGUgZnJvbSBcIi4vaW5pdGlhbGl6ZS9SYXRlXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9pbml0aWFsaXplL0luaXRpYWxpemVcIjtcbmltcG9ydCBMaWZlIGZyb20gXCIuL2luaXRpYWxpemUvTGlmZVwiO1xuaW1wb3J0IFBvc2l0aW9uIGZyb20gXCIuL2luaXRpYWxpemUvUG9zaXRpb25cIjtcbmltcG9ydCBWZWxvY2l0eSBmcm9tIFwiLi9pbml0aWFsaXplL1ZlbG9jaXR5XCI7XG5pbXBvcnQgTWFzcyBmcm9tIFwiLi9pbml0aWFsaXplL01hc3NcIjtcbmltcG9ydCBSYWRpdXMgZnJvbSBcIi4vaW5pdGlhbGl6ZS9SYWRpdXNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuL2luaXRpYWxpemUvQm9keVwiO1xuXG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL2JlaGF2aW91ci9CZWhhdmlvdXJcIjtcbmltcG9ydCBGb3JjZSBmcm9tIFwiLi9iZWhhdmlvdXIvRm9yY2VcIjtcbmltcG9ydCBBdHRyYWN0aW9uIGZyb20gXCIuL2JlaGF2aW91ci9BdHRyYWN0aW9uXCI7XG5pbXBvcnQgUmFuZG9tRHJpZnQgZnJvbSBcIi4vYmVoYXZpb3VyL1JhbmRvbURyaWZ0XCI7XG5pbXBvcnQgR3Jhdml0eSBmcm9tIFwiLi9iZWhhdmlvdXIvR3Jhdml0eVwiO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tIFwiLi9iZWhhdmlvdXIvQ29sbGlzaW9uXCI7XG5pbXBvcnQgQ3Jvc3Nab25lIGZyb20gXCIuL2JlaGF2aW91ci9Dcm9zc1pvbmVcIjtcbmltcG9ydCBBbHBoYSBmcm9tIFwiLi9iZWhhdmlvdXIvQWxwaGFcIjtcbmltcG9ydCBTY2FsZSBmcm9tIFwiLi9iZWhhdmlvdXIvU2NhbGVcIjtcbmltcG9ydCBSb3RhdGUgZnJvbSBcIi4vYmVoYXZpb3VyL1JvdGF0ZVwiO1xuaW1wb3J0IENvbG9yIGZyb20gXCIuL2JlaGF2aW91ci9Db2xvclwiO1xuaW1wb3J0IEN5Y2xvbmUgZnJvbSBcIi4vYmVoYXZpb3VyL0N5Y2xvbmVcIjtcbmltcG9ydCBSZXB1bHNpb24gZnJvbSBcIi4vYmVoYXZpb3VyL1JlcHVsc2lvblwiO1xuaW1wb3J0IEdyYXZpdHlXZWxsIGZyb20gXCIuL2JlaGF2aW91ci9HcmF2aXR5V2VsbFwiO1xuXG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyL0VtaXR0ZXJcIjtcbmltcG9ydCBCZWhhdmlvdXJFbWl0dGVyIGZyb20gXCIuL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlclwiO1xuaW1wb3J0IEZvbGxvd0VtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlci9Gb2xsb3dFbWl0dGVyXCI7XG5cbmltcG9ydCBDYW52YXNSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvQ2FudmFzUmVuZGVyZXJcIjtcbmltcG9ydCBEb21SZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvRG9tUmVuZGVyZXJcIjtcbmltcG9ydCBFYXNlbFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9FYXNlbFJlbmRlcmVyXCI7XG5pbXBvcnQgUGl4ZWxSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvUGl4ZWxSZW5kZXJlclwiO1xuaW1wb3J0IFBpeGlSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvUGl4aVJlbmRlcmVyXCI7XG5pbXBvcnQgV2ViR0xSZW5kZXJlciBmcm9tIFwiLi9yZW5kZXIvV2ViR0xSZW5kZXJlclwiO1xuaW1wb3J0IEN1c3RvbVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9DdXN0b21SZW5kZXJlclwiO1xuXG5pbXBvcnQgWm9uZSBmcm9tIFwiLi96b25lL1pvbmVcIjtcbmltcG9ydCBMaW5lWm9uZSBmcm9tIFwiLi96b25lL0xpbmVab25lXCI7XG5pbXBvcnQgQ2lyY2xlWm9uZSBmcm9tIFwiLi96b25lL0NpcmNsZVpvbmVcIjtcbmltcG9ydCBQb2ludFpvbmUgZnJvbSBcIi4vem9uZS9Qb2ludFpvbmVcIjtcbmltcG9ydCBSZWN0Wm9uZSBmcm9tIFwiLi96b25lL1JlY3Rab25lXCI7XG5pbXBvcnQgSW1hZ2Vab25lIGZyb20gXCIuL3pvbmUvSW1hZ2Vab25lXCI7XG5cbmltcG9ydCBEZWJ1ZyBmcm9tIFwiLi9kZWJ1Zy9EZWJ1Z1wiO1xuXG4vLyBuYW1lc3BhY2VcblByb3Rvbi5QYXJ0aWNsZSA9IFBhcnRpY2xlO1xuUHJvdG9uLlBvb2wgPSBQb29sO1xuXG5Qcm90b24uVXRpbCA9IFV0aWw7XG5Qcm90b24uQ29sb3JVdGlsID0gQ29sb3JVdGlsO1xuUHJvdG9uLk1hdGhVdGlsID0gTWF0aFV0aWw7XG5Qcm90b24uVmVjdG9yMkQgPSBQcm90b24uVmVjdG9yID0gVmVjdG9yMkQ7XG5Qcm90b24uUG9sYXIyRCA9IFByb3Rvbi5Qb2xhciA9IFBvbGFyMkQ7XG5Qcm90b24uQXJyYXlTcGFuID0gQXJyYXlTcGFuO1xuUHJvdG9uLlJlY3RhbmdsZSA9IFJlY3RhbmdsZTtcblByb3Rvbi5SYXRlID0gUmF0ZTtcblByb3Rvbi5lYXNlID0gZWFzZTtcblByb3Rvbi5TcGFuID0gU3BhbjtcblByb3Rvbi5NYXQzID0gTWF0MztcblByb3Rvbi5nZXRTcGFuID0gKGEsIGIsIGNlbnRlcikgPT4gbmV3IFNwYW4oYSwgYiwgY2VudGVyKTtcblByb3Rvbi5jcmVhdGVBcnJheVNwYW4gPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuO1xuXG5Qcm90b24uSW5pdGlhbGl6ZSA9IFByb3Rvbi5Jbml0ID0gSW5pdGlhbGl6ZTtcblByb3Rvbi5MaWZlID0gUHJvdG9uLkwgPSBMaWZlO1xuUHJvdG9uLlBvc2l0aW9uID0gUHJvdG9uLlAgPSBQb3NpdGlvbjtcblByb3Rvbi5WZWxvY2l0eSA9IFByb3Rvbi5WID0gVmVsb2NpdHk7XG5Qcm90b24uTWFzcyA9IFByb3Rvbi5NID0gTWFzcztcblByb3Rvbi5SYWRpdXMgPSBQcm90b24uUiA9IFJhZGl1cztcblByb3Rvbi5Cb2R5ID0gUHJvdG9uLkIgPSBCb2R5O1xuXG5Qcm90b24uQmVoYXZpb3VyID0gQmVoYXZpb3VyO1xuUHJvdG9uLkZvcmNlID0gUHJvdG9uLkYgPSBGb3JjZTtcblByb3Rvbi5BdHRyYWN0aW9uID0gUHJvdG9uLkEgPSBBdHRyYWN0aW9uO1xuUHJvdG9uLlJhbmRvbURyaWZ0ID0gUHJvdG9uLlJEID0gUmFuZG9tRHJpZnQ7XG5Qcm90b24uR3Jhdml0eSA9IFByb3Rvbi5HID0gR3Jhdml0eTtcblByb3Rvbi5Db2xsaXNpb24gPSBDb2xsaXNpb247XG5Qcm90b24uQ3Jvc3Nab25lID0gQ3Jvc3Nab25lO1xuUHJvdG9uLkFscGhhID0gQWxwaGE7XG5Qcm90b24uU2NhbGUgPSBQcm90b24uUyA9IFNjYWxlO1xuUHJvdG9uLlJvdGF0ZSA9IFJvdGF0ZTtcblByb3Rvbi5Db2xvciA9IENvbG9yO1xuUHJvdG9uLlJlcHVsc2lvbiA9IFJlcHVsc2lvbjtcblByb3Rvbi5DeWNsb25lID0gQ3ljbG9uZTtcblByb3Rvbi5HcmF2aXR5V2VsbCA9IEdyYXZpdHlXZWxsO1xuXG5Qcm90b24uRW1pdHRlciA9IEVtaXR0ZXI7XG5Qcm90b24uQmVoYXZpb3VyRW1pdHRlciA9IEJlaGF2aW91ckVtaXR0ZXI7XG5Qcm90b24uRm9sbG93RW1pdHRlciA9IEZvbGxvd0VtaXR0ZXI7XG5cblByb3Rvbi5ab25lID0gWm9uZTtcblByb3Rvbi5MaW5lWm9uZSA9IExpbmVab25lO1xuUHJvdG9uLkNpcmNsZVpvbmUgPSBDaXJjbGVab25lO1xuUHJvdG9uLlBvaW50Wm9uZSA9IFBvaW50Wm9uZTtcblByb3Rvbi5SZWN0Wm9uZSA9IFJlY3Rab25lO1xuUHJvdG9uLkltYWdlWm9uZSA9IEltYWdlWm9uZTtcblxuUHJvdG9uLkNhbnZhc1JlbmRlcmVyID0gQ2FudmFzUmVuZGVyZXI7XG5Qcm90b24uRG9tUmVuZGVyZXIgPSBEb21SZW5kZXJlcjtcblByb3Rvbi5FYXNlbFJlbmRlcmVyID0gRWFzZWxSZW5kZXJlcjtcblByb3Rvbi5QaXhpUmVuZGVyZXIgPSBQaXhpUmVuZGVyZXI7XG5Qcm90b24uUGl4ZWxSZW5kZXJlciA9IFBpeGVsUmVuZGVyZXI7XG5Qcm90b24uV2ViR0xSZW5kZXJlciA9IFByb3Rvbi5XZWJHbFJlbmRlcmVyID0gV2ViR0xSZW5kZXJlcjtcblByb3Rvbi5DdXN0b21SZW5kZXJlciA9IEN1c3RvbVJlbmRlcmVyO1xuXG5Qcm90b24uRGVidWcgPSBEZWJ1ZztcblV0aWwuYXNzaWduKFByb3RvbiwgZWFzZSk7XG5cbi8vIGV4cG9ydFxuZXhwb3J0IGRlZmF1bHQgUHJvdG9uO1xuIl0sIm5hbWVzIjpbImlwb3QiLCJsZW5ndGgiLCJuaHBvdCIsImkiLCJtYWtlVHJhbnNsYXRpb24iLCJ0eCIsInR5IiwibWFrZVJvdGF0aW9uIiwiYW5nbGVJblJhZGlhbnMiLCJjIiwiTWF0aCIsImNvcyIsInMiLCJzaW4iLCJtYWtlU2NhbGUiLCJzeCIsInN5IiwibWF0cml4TXVsdGlwbHkiLCJhIiwiYiIsImEwMCIsImEwMSIsImEwMiIsImExMCIsImExMSIsImExMiIsImEyMCIsImEyMSIsImEyMiIsImIwMCIsImIwMSIsImIwMiIsImIxMCIsImIxMSIsImIxMiIsImIyMCIsImIyMSIsImIyMiIsImNyZWF0ZUNhbnZhcyIsImlkIiwid2lkdGgiLCJoZWlnaHQiLCJwb3NpdGlvbiIsImRvbSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwib3BhY2l0eSIsInRyYW5zZm9ybSIsImNyZWF0ZURpdiIsInJlc2l6ZSIsIm1hcmdpbkxlZnQiLCJtYXJnaW5Ub3AiLCJkaXYiLCJ4IiwieSIsInNjYWxlIiwicm90YXRlIiwid2lsbENoYW5nZSIsImNzczMiLCJ0cmFuc2Zvcm0zZCIsImtleSIsInZhbCIsImJrZXkiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsImltZ3NDYWNoZSIsImNhbnZhc0NhY2hlIiwiY2FudmFzSWQiLCJnZXRJbWFnZURhdGEiLCJjb250ZXh0IiwiaW1hZ2UiLCJyZWN0IiwiZHJhd0ltYWdlIiwiaW1hZ2VkYXRhIiwiY2xlYXJSZWN0IiwiZ2V0SW1nRnJvbUNhY2hlIiwiaW1nIiwiY2FsbGJhY2siLCJwYXJhbSIsInNyYyIsIkltYWdlIiwib25sb2FkIiwiZSIsInRhcmdldCIsImdldENhbnZhc0Zyb21DYWNoZSIsIldlYkdMVXRpbCIsImNhbnZhcyIsIkRvbVV0aWwiLCJnZXRDb250ZXh0IiwiaW5pdFZhbHVlIiwidmFsdWUiLCJkZWZhdWx0cyIsInVuZGVmaW5lZCIsImlzQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJlbXB0eUFycmF5IiwiYXJyIiwidG9BcnJheSIsInNsaWNlQXJyYXkiLCJhcnIxIiwiaW5kZXgiLCJhcnIyIiwicHVzaCIsImdldFJhbmRGcm9tQXJyYXkiLCJmbG9vciIsInJhbmRvbSIsImVtcHR5T2JqZWN0Iiwib2JqIiwiaWdub3JlIiwiaW5kZXhPZiIsImNsYXNzQXBwbHkiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJGYWN0b3J5RnVuYyIsImJpbmQiLCJhcHBseSIsImNvbmNhdCIsIkltZ1V0aWwiLCJkZXN0cm95QWxsIiwiZGVzdHJveSIsImFzc2lnbiIsInNvdXJjZSIsImhhc093blByb3BlcnR5IiwiaWRzTWFwIiwiUHVpZCIsIl9pbmRleCIsIl9jYWNoZSIsInR5cGUiLCJnZXRJZCIsInVpZCIsImdldElkRnJvbUNhY2hlIiwiaXNCb2R5IiwiaXNJbm5lciIsImdldFRhcmdldCIsIlBvb2wiLCJudW0iLCJ0b3RhbCIsImNhY2hlIiwiZ2V0IiwicGFyYW1zIiwicCIsIl9fcHVpZCIsInBvcCIsImNyZWF0ZU9yQ2xvbmUiLCJleHBpcmUiLCJnZXRDYWNoZSIsImNyZWF0ZSIsIlV0aWwiLCJjbG9uZSIsImdldENvdW50IiwiY291bnQiLCJTdGF0cyIsInByb3RvbiIsImNvbnRhaW5lciIsImVtaXR0ZXJJbmRleCIsInJlbmRlcmVySW5kZXgiLCJ1cGRhdGUiLCJib2R5IiwiYWRkIiwiZW1pdHRlciIsImdldEVtaXR0ZXIiLCJyZW5kZXJlciIsImdldFJlbmRlcmVyIiwic3RyIiwiZW1pdHRlcnMiLCJlbWl0U3BlZWQiLCJnZXRFbWl0dGVyUG9zIiwiaW5pdGlhbGl6ZXMiLCJjb25jYXRBcnIiLCJiZWhhdmlvdXJzIiwibmFtZSIsImdldENyZWF0ZWROdW1iZXIiLCJwb29sIiwiaW5uZXJIVE1MIiwiY3NzVGV4dCIsImpvaW4iLCJhZGRFdmVudExpc3RlbmVyIiwiYmciLCJjb2xvciIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsInJlbmRlcmVycyIsInJlc3VsdCIsImNwb29sIiwicm91bmQiLCJyZW1vdmVDaGlsZCIsIkV2ZW50RGlzcGF0Y2hlciIsIl9saXN0ZW5lcnMiLCJkaXNwYXRjaEV2ZW50IiwiaGFzRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBbGxFdmVudExpc3RlbmVycyIsImxpc3RlbmVyIiwic3BsaWNlIiwibGlzdGVuZXJzIiwiaGFuZGxlciIsIlBJIiwiSU5GSU5JVFkiLCJJbmZpbml0eSIsIk1hdGhVdGlsIiwiUEl4MiIsIlBJXzIiLCJQSV8xODAiLCJOMTgwX1BJIiwiaXNJbmZpbml0eSIsInJhbmRvbUFUb0IiLCJpc0ludCIsInJhbmRvbUZsb2F0aW5nIiwiY2VudGVyIiwiZiIsInJhbmRvbUNvbG9yIiwic2xpY2UiLCJyYW5kb21ab25lIiwiZGlzcGxheSIsImsiLCJkaWdpdHMiLCJwb3ciLCJkZWdyZWVUcmFuc2Zvcm0iLCJ0b0NvbG9yMTYiLCJJbnRlZ3JhdGlvbiIsImNhbGN1bGF0ZSIsInBhcnRpY2xlcyIsInRpbWUiLCJkYW1waW5nIiwiZXVsZXJJbnRlZ3JhdGUiLCJwYXJ0aWNsZSIsInNsZWVwIiwib2xkIiwiY29weSIsInYiLCJtdWx0aXBseVNjYWxhciIsIm1hc3MiLCJjbGVhciIsIlByb3RvbiIsImludGVncmF0aW9uVHlwZSIsIm5vdyIsInRoZW4iLCJlbGFwc2VkIiwic3RhdHMiLCJFVUxFUiIsImludGVncmF0b3IiLCJfZnBzIiwiX2ludGVydmFsIiwiREVGQVVMVF9JTlRFUlZBTCIsImFkZFJlbmRlcmVyIiwicmVuZGVyIiwiaW5pdCIsInJlbW92ZVJlbmRlcmVyIiwicmVtb3ZlIiwiYWRkRW1pdHRlciIsInBhcmVudCIsIkVNSVRURVJfQURERUQiLCJyZW1vdmVFbWl0dGVyIiwiRU1JVFRFUl9SRU1PVkVEIiwiUFJPVE9OX1VQREFURSIsIlVTRV9DTE9DSyIsIkRhdGUiLCJnZXRUaW1lIiwiYW1lbmRDaGFuZ2VUYWJzQnVnIiwiZW1pdHRlcnNVcGRhdGUiLCJQUk9UT05fVVBEQVRFX0FGVEVSIiwiZ2V0QWxsUGFydGljbGVzIiwiZGVzdHJveUFsbEVtaXR0ZXJzIiwiZGVzdHJveU90aGVyIiwic2V0VGltZW91dCIsImZwcyIsIk1FQVNVUkUiLCJSSzIiLCJQQVJUSUNMRV9DUkVBVEVEIiwiUEFSVElDTEVfVVBEQVRFIiwiUEFSVElDTEVfU0xFRVAiLCJQQVJUSUNMRV9ERUFEIiwiUmdiIiwiciIsImciLCJyZXNldCIsImhhc1Byb3AiLCJzZXRQcm9wIiwicHJvcHMiLCJwcm9wIiwiU3BhbiIsImdldFNwYW5WYWx1ZSIsInNldFZlY3RvclZhbCIsImNvbmYiLCJlYXNlTGluZWFyIiwiZWFzZUluUXVhZCIsImVhc2VPdXRRdWFkIiwiZWFzZUluT3V0UXVhZCIsImVhc2VJbkN1YmljIiwiZWFzZU91dEN1YmljIiwiZWFzZUluT3V0Q3ViaWMiLCJlYXNlSW5RdWFydCIsImVhc2VPdXRRdWFydCIsImVhc2VJbk91dFF1YXJ0IiwiZWFzZUluU2luZSIsImVhc2VPdXRTaW5lIiwiZWFzZUluT3V0U2luZSIsImVhc2VJbkV4cG8iLCJlYXNlT3V0RXhwbyIsImVhc2VJbk91dEV4cG8iLCJlYXNlSW5DaXJjIiwic3FydCIsImVhc2VPdXRDaXJjIiwiZWFzZUluT3V0Q2lyYyIsImVhc2VJbkJhY2siLCJlYXNlT3V0QmFjayIsImVhc2VJbk91dEJhY2siLCJnZXRFYXNpbmciLCJlYXNlIiwiVmVjdG9yMkQiLCJzZXQiLCJzZXRYIiwic2V0WSIsImdldEdyYWRpZW50IiwiYXRhbjIiLCJ3IiwiYWRkVmVjdG9ycyIsImFkZFhZIiwic3ViIiwic3ViVmVjdG9ycyIsImRpdmlkZVNjYWxhciIsIm5lZ2F0ZSIsImRvdCIsImxlbmd0aFNxIiwibm9ybWFsaXplIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwidGhhIiwiZHgiLCJkeSIsImxlcnAiLCJhbHBoYSIsImVxdWFscyIsIlBhcnRpY2xlIiwiZGF0YSIsInJnYiIsIlByb3BVdGlsIiwiZ2V0RGlyZWN0aW9uIiwibGlmZSIsImFnZSIsImRlYWQiLCJzcHJpdGUiLCJlbmVyZ3kiLCJyYWRpdXMiLCJyb3RhdGlvbiIsImVhc2luZyIsInJlbW92ZUFsbEJlaGF2aW91cnMiLCJhcHBseUJlaGF2aW91cnMiLCJtYXgiLCJhcHBseUJlaGF2aW91ciIsImFkZEJlaGF2aW91ciIsImJlaGF2aW91ciIsInBhcmVudHMiLCJpbml0aWFsaXplIiwiYWRkQmVoYXZpb3VycyIsInJlbW92ZUJlaGF2aW91ciIsImhleFRvUmdiIiwiaCIsImhleDE2Iiwic3Vic3RyaW5nIiwicGFyc2VJbnQiLCJyZ2JUb0hleCIsInJiZyIsImdldEhleDE2RnJvbVBhcnRpY2xlIiwiTnVtYmVyIiwiUG9sYXIyRCIsImFicyIsInNldFIiLCJzZXRUaGEiLCJ0b1ZlY3RvciIsImdldFgiLCJnZXRZIiwiTWF0MyIsIm1hdDMiLCJtYXQiLCJGbG9hdDMyQXJyYXkiLCJtYXQxIiwibWF0MiIsIm11bHRpcGx5IiwiaW52ZXJzZSIsImQiLCJtdWx0aXBseVZlYzIiLCJtIiwidmVjIiwiZ2V0VmFsdWUiLCJzZXRTcGFuVmFsdWUiLCJwYW4iLCJBcnJheVNwYW4iLCJfYXJyIiwiY3JlYXRlQXJyYXlTcGFuIiwiUmVjdGFuZ2xlIiwiYm90dG9tIiwicmlnaHQiLCJjb250YWlucyIsIlJhdGUiLCJudW1wYW4iLCJ0aW1lcGFuIiwibnVtUGFuIiwidGltZVBhbiIsInN0YXJ0VGltZSIsIm5leHRUaW1lIiwiSW5pdGlhbGl6ZSIsIkxpZmUiLCJsaWZlUGFuIiwiWm9uZSIsInZlY3RvciIsImNyb3NzVHlwZSIsImFsZXJ0IiwiZ2V0UG9zaXRpb24iLCJjcm9zc2luZyIsIlBvaW50Wm9uZSIsImNvbnNvbGUiLCJlcnJvciIsIlBvc2l0aW9uIiwiem9uZSIsIlZlbG9jaXR5IiwicnBhbiIsInRoYXBhbiIsInJQYW4iLCJ0aGFQYW4iLCJub3JtYWxpemVWZWxvY2l0eSIsInZyIiwicG9sYXIyZCIsIk1hc3MiLCJtYXNzUGFuIiwiUmFkaXVzIiwib2xkUmFkaXVzIiwiQm9keSIsImltYWdlVGFyZ2V0IiwiaW5uZXIiLCJCZWhhdmlvdXIiLCJub3JtYWxpemVGb3JjZSIsImZvcmNlIiwibm9ybWFsaXplVmFsdWUiLCJGb3JjZSIsImZ4IiwiZnkiLCJBdHRyYWN0aW9uIiwidGFyZ2V0UG9zaXRpb24iLCJyYWRpdXNTcSIsImF0dHJhY3Rpb25Gb3JjZSIsIlJhbmRvbURyaWZ0IiwiZHJpZnRYIiwiZHJpZnRZIiwiZGVsYXkiLCJwYW5Gb2NlIiwiR3Jhdml0eSIsIkNvbGxpc2lvbiIsIm5ld1Bvb2wiLCJjb2xsaXNpb25Qb29sIiwiZGVsdGEiLCJvdGhlclBhcnRpY2xlIiwib3ZlcmxhcCIsInRvdGFsTWFzcyIsImF2ZXJhZ2VNYXNzMSIsImF2ZXJhZ2VNYXNzMiIsImRpc3RhbmNlIiwiQ3Jvc3Nab25lIiwiQWxwaGEiLCJzYW1lIiwiYWxwaGFBIiwiYWxwaGFCIiwiU2NhbGUiLCJzY2FsZUEiLCJzY2FsZUIiLCJSb3RhdGUiLCJpbmZsdWVuY2UiLCJyb3RhdGlvbkEiLCJyb3RhdGlvbkIiLCJDb2xvciIsImNvbG9yQSIsIkNvbG9yVXRpbCIsImNvbG9yQiIsIkNIQU5HSU5HIiwiQ3ljbG9uZSIsImFuZ2xlIiwic2V0QW5nbGVBbmRGb3JjZSIsInNwYW4iLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImNhbmdsZSIsImN5Y2xvbmUiLCJncmFkaWVudCIsIlJlcHVsc2lvbiIsIkdyYXZpdHlXZWxsIiwiY2VudGVyUG9pbnQiLCJkaXN0YW5jZVZlYyIsImRpc3RhbmNlU3EiLCJmYWN0b3IiLCJiaW5kRW1pdHRlciIsIkVtaXR0ZXIiLCJlbWl0VGltZSIsInRvdGFsVGltZSIsInJhdGUiLCJlbWl0Iiwic3RvcGVkIiwiaXNOYU4iLCJzdG9wIiwicHJlRW1pdCIsIm9sZFN0b3BlZCIsIm9sZEVtaXRUaW1lIiwib2xkVG90YWxUaW1lIiwic3RlcCIsInJlbW92ZUFsbFBhcnRpY2xlcyIsImFkZFNlbGZJbml0aWFsaXplIiwiYWRkSW5pdGlhbGl6ZSIsInJlc3QiLCJyZW1vdmVJbml0aWFsaXplIiwiaW5pdGlhbGl6ZXIiLCJyZW1vdmVBbGxJbml0aWFsaXplcnMiLCJhcmd1bWVudHMiLCJlbWl0dGluZyIsImludGVncmF0ZSIsImRpc3BhdGNoIiwiZXZlbnQiLCJiaW5kRXZlbnQiLCJjcmVhdGVQYXJ0aWNsZSIsInNldHVwUGFydGljbGUiLCJJbml0aWFsaXplVXRpbCIsIkJlaGF2aW91ckVtaXR0ZXIiLCJzZWxmQmVoYXZpb3VycyIsImFkZFNlbGZCZWhhdmlvdXIiLCJyZW1vdmVTZWxmQmVoYXZpb3VyIiwiRm9sbG93RW1pdHRlciIsIm1vdXNlVGFyZ2V0Iiwid2luZG93IiwiX2FsbG93RW1pdHRpbmciLCJpbml0RXZlbnRIYW5kbGVyIiwibW91c2Vtb3ZlSGFuZGxlciIsIm1vdXNlbW92ZSIsIm1vdXNlZG93bkhhbmRsZXIiLCJtb3VzZWRvd24iLCJtb3VzZXVwSGFuZGxlciIsIm1vdXNldXAiLCJsYXllclgiLCJsYXllclkiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImlzSW1hZ2UiLCJfX2lzSW1hZ2UiLCJ0YWdOYW1lIiwibm9kZU5hbWUiLCJpc1N0cmluZyIsIkJhc2VSZW5kZXJlciIsImVsZW1lbnQiLCJzdHJva2UiLCJjaXJjbGVDb25mIiwiaXNDaXJjbGUiLCJzZXRTdHJva2UiLCJ0aGlua25lc3MiLCJfcHJvdG9uVXBkYXRlSGFuZGxlciIsIm9uUHJvdG9uVXBkYXRlIiwiX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlciIsIm9uUHJvdG9uVXBkYXRlQWZ0ZXIiLCJfZW1pdHRlckFkZGVkSGFuZGxlciIsIm9uRW1pdHRlckFkZGVkIiwiX2VtaXR0ZXJSZW1vdmVkSGFuZGxlciIsIm9uRW1pdHRlclJlbW92ZWQiLCJfcGFydGljbGVDcmVhdGVkSGFuZGxlciIsIm9uUGFydGljbGVDcmVhdGVkIiwiX3BhcnRpY2xlVXBkYXRlSGFuZGxlciIsIm9uUGFydGljbGVVcGRhdGUiLCJfcGFydGljbGVEZWFkSGFuZGxlciIsIm9uUGFydGljbGVEZWFkIiwiQ2FudmFzUmVuZGVyZXIiLCJidWZmZXJDYWNoZSIsImFkZEltZzJCb2R5IiwiVHlwZXMiLCJkcmF3Q2lyY2xlIiwiYnVmZmVyIiwiY3JlYXRlQnVmZmVyIiwiYnVmQ29udGV4dCIsImdsb2JhbEFscGhhIiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJzYXZlIiwidHJhbnNsYXRlIiwicmVzdG9yZSIsImJlZ2luUGF0aCIsImFyYyIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwiY2xvc2VQYXRoIiwiZmlsbCIsInNpemUiLCJEb21SZW5kZXJlciIsImNyZWF0ZUJvZHkiLCJib2R5UmVhZHkiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjcmVhdGVDaXJjbGUiLCJjcmVhdGVTcHJpdGUiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJDb2xvciIsImJvcmRlcldpZHRoIiwidXJsIiwiYmFja2dyb3VuZEltYWdlIiwiRWFzZWxSZW5kZXJlciIsImFkZENoaWxkIiwic2NhbGVYIiwic2NhbGVZIiwiZ3JhcGhpY3MiLCJyZWdYIiwicmVnWSIsImNyZWF0ZWpzIiwiR3JhcGhpY3MiLCJiZWdpblN0cm9rZSIsImJlZ2luRmlsbCIsInNoYXBlIiwiU2hhcGUiLCJQaXhlbFJlbmRlcmVyIiwicmVjdGFuZ2xlIiwiaW1hZ2VEYXRhIiwiY3JlYXRlSW1hZ2VEYXRhIiwicHV0SW1hZ2VEYXRhIiwic2V0UGl4ZWwiLCJQSVhJQ2xhc3MiLCJQaXhpUmVuZGVyZXIiLCJzZXRDb2xvciIsImJsZW5kTW9kZSIsInNldFBJWEkiLCJQSVhJIiwiU3ByaXRlIiwiY3JlYXRlRnJvbUltYWdlIiwiZnJvbSIsImZyb21JbWFnZSIsInRpbnQiLCJhbmNob3IiLCJlbmRGaWxsIiwiTVN0YWNrIiwibWF0cyIsInRvcCIsIldlYkdMUmVuZGVyZXIiLCJnbCIsImFudGlhbGlhcyIsInN0ZW5jaWwiLCJkZXB0aCIsImluaXRWYXIiLCJzZXRNYXhSYWRpdXMiLCJpbml0U2hhZGVycyIsImluaXRCdWZmZXJzIiwiYmxlbmRFcXVhdGlvbiIsIkZVTkNfQUREIiwiYmxlbmRGdW5jIiwiU1JDX0FMUEhBIiwiT05FX01JTlVTX1NSQ19BTFBIQSIsImVuYWJsZSIsIkJMRU5EIiwidW1hdCIsInNtYXQiLCJtc3RhY2siLCJ2aWV3cG9ydCIsImNpcmNsZUNhbnZhc1VSTCIsImdldFZlcnRleFNoYWRlciIsInZzU291cmNlIiwiZ2V0RnJhZ21lbnRTaGFkZXIiLCJmc1NvdXJjZSIsInRleHR1cmVidWZmZXJzIiwiQSIsIkIiLCJnZXRTaGFkZXIiLCJmcyIsInNoYWRlciIsImNyZWF0ZVNoYWRlciIsIkZSQUdNRU5UX1NIQURFUiIsIlZFUlRFWF9TSEFERVIiLCJzaGFkZXJTb3VyY2UiLCJjb21waWxlU2hhZGVyIiwiZ2V0U2hhZGVyUGFyYW1ldGVyIiwiQ09NUElMRV9TVEFUVVMiLCJnZXRTaGFkZXJJbmZvTG9nIiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJzcHJvZ3JhbSIsImNyZWF0ZVByb2dyYW0iLCJhdHRhY2hTaGFkZXIiLCJsaW5rUHJvZ3JhbSIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJMSU5LX1NUQVRVUyIsInVzZVByb2dyYW0iLCJ2cGEiLCJnZXRBdHRyaWJMb2NhdGlvbiIsInRjYSIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwidE1hdFVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJzYW1wbGVyVW5pZm9ybSIsInVzZVRleCIsInVuaWZvcm0xaSIsInZzIiwiaWR4IiwidW5pdElCdWZmZXIiLCJiaW5kQnVmZmVyIiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJidWZmZXJEYXRhIiwiVWludDE2QXJyYXkiLCJTVEFUSUNfRFJBVyIsImlkcyIsInVuaXRJMzMiLCJzdHJpcEJ1ZmZlciIsInJhaWR1cyIsImNpcmNsZUNhbnZhc1JhZGl1cyIsInRvRGF0YVVSTCIsImRyYXdJbWcyQ2FudmFzIiwiX3ciLCJfaCIsIl93aWR0aCIsIl9oZWlnaHQiLCJfc2NhbGVYIiwiX3NjYWxlWSIsImNyZWF0ZVRleHR1cmUiLCJ0ZXh0dXJlIiwidmNCdWZmZXIiLCJ0Y0J1ZmZlciIsIkFSUkFZX0JVRkZFUiIsImJpbmRUZXh0dXJlIiwiVEVYVFVSRV8yRCIsInRleEltYWdlMkQiLCJSR0JBIiwiVU5TSUdORURfQllURSIsInRleFBhcmFtZXRlcmkiLCJURVhUVVJFX01BR19GSUxURVIiLCJMSU5FQVIiLCJURVhUVVJFX01JTl9GSUxURVIiLCJMSU5FQVJfTUlQTUFQX05FQVJFU1QiLCJnZW5lcmF0ZU1pcG1hcCIsInRleHR1cmVMb2FkZWQiLCJ0ZXh0dXJlV2lkdGgiLCJ0ZXh0dXJlSGVpZ2h0IiwidG1hdCIsImltYXQiLCJvbGRTY2FsZSIsInVwZGF0ZU1hdHJpeCIsInVuaWZvcm0zZiIsInVuaWZvcm1NYXRyaXgzZnYiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiRkxPQVQiLCJkcmF3RWxlbWVudHMiLCJUUklBTkdMRVMiLCJVTlNJR05FRF9TSE9SVCIsIm1vdmVPcmlnaW5NYXRyaXgiLCJ0cmFuc2xhdGlvbk1hdHJpeCIsImFuZ2VsIiwicm90YXRpb25NYXRyaXgiLCJzY2FsZU1hdHJpeCIsIm1hdHJpeCIsIkN1c3RvbVJlbmRlcmVyIiwiTGluZVpvbmUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsImRpcmVjdGlvbiIsIm1pbngiLCJtaW4iLCJtaW55IiwibWF4eCIsIm1heHkiLCJ4eHl5IiwiZ2V0TGVuZ3RoIiwiQyIsIkQiLCJnZXREaXN0YW5jZSIsImdldFN5bW1ldHJpYyIsInRoYTIiLCJ0aGExIiwib2xkeCIsIm9sZHkiLCJyYW5nZU91dCIsIkNpcmNsZVpvbmUiLCJyYW5kb21SYWRpdXMiLCJzZXRDZW50ZXIiLCJSZWN0Wm9uZSIsIkltYWdlWm9uZSIsInZlY3RvcnMiLCJzZXRWZWN0b3JzIiwiaiIsImxlbmd0aDEiLCJsZW5ndGgyIiwiZ2V0Qm91bmQiLCJnZXRDb2xvciIsImZ1bmMiLCJnZXRTdHlsZSIsImRyYXdab25lIiwibW92ZVRvIiwibGluZVRvIiwiZHJhd1JlY3QiLCJkcmF3RW1pdHRlciIsIlZlY3RvciIsIlBvbGFyIiwiZ2V0U3BhbiIsIkluaXQiLCJMIiwiUCIsIlYiLCJNIiwiUiIsIkYiLCJSRCIsIkciLCJTIiwiV2ViR2xSZW5kZXJlciIsIkRlYnVnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQWU7RUFDYjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0VBLEVBQUFBLElBWmEsZ0JBWVJDLE1BWlEsRUFZQTtFQUNYLFdBQU8sQ0FBQ0EsTUFBTSxHQUFJQSxNQUFNLEdBQUcsQ0FBcEIsTUFBNEIsQ0FBbkM7RUFDRCxHQWRZOztFQWdCYjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0VDLEVBQUFBLEtBM0JhLGlCQTJCUEQsTUEzQk8sRUEyQkM7RUFDWixNQUFFQSxNQUFGOztFQUNBLFNBQUssSUFBSUUsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBRyxFQUFwQixFQUF3QkEsQ0FBQyxLQUFLLENBQTlCLEVBQWlDO0VBQy9CRixNQUFBQSxNQUFNLEdBQUdBLE1BQU0sR0FBSUEsTUFBTSxJQUFJRSxDQUE3QjtFQUNEOztF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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvV2ViR0xVdGlsLmpzIiwiLi4vc3JjL3V0aWxzL0RvbVV0aWwuanMiLCIuLi9zcmMvdXRpbHMvSW1nVXRpbC5qcyIsIi4uL3NyYy91dGlscy9VdGlsLmpzIiwiLi4vc3JjL3V0aWxzL1B1aWQuanMiLCIuLi9zcmMvY29yZS9Qb29sLmpzIiwiLi4vc3JjL2RlYnVnL1N0YXRzLmpzIiwiLi4vc3JjL2V2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbC5qcyIsIi4uL3NyYy9tYXRoL0ludGVncmF0aW9uLmpzIiwiLi4vc3JjL2NvcmUvUHJvdG9uLmpzIiwiLi4vc3JjL3V0aWxzL1JnYi5qcyIsIi4uL3NyYy9tYXRoL1NwYW4uanMiLCIuLi9zcmMvdXRpbHMvUHJvcFV0aWwuanMiLCIuLi9zcmMvbWF0aC9lYXNlLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMkQuanMiLCIuLi9zcmMvY29yZS9QYXJ0aWNsZS5qcyIsIi4uL3NyYy91dGlscy9Db2xvclV0aWwuanMiLCIuLi9zcmMvbWF0aC9Qb2xhcjJELmpzIiwiLi4vc3JjL21hdGgvTWF0My5qcyIsIi4uL3NyYy9tYXRoL0FycmF5U3Bhbi5qcyIsIi4uL3NyYy9tYXRoL1JlY3RhbmdsZS5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhdGUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Jbml0aWFsaXplLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTGlmZS5qcyIsIi4uL3NyYy96b25lL1pvbmUuanMiLCIuLi9zcmMvem9uZS9Qb2ludFpvbmUuanMiLCIuLi9zcmMvaW5pdGlhbGl6ZS9Qb3NpdGlvbi5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1ZlbG9jaXR5LmpzIiwiLi4vc3JjL2luaXRpYWxpemUvTWFzcy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL1JhZGl1cy5qcyIsIi4uL3NyYy9pbml0aWFsaXplL0JvZHkuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0JlaGF2aW91ci5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvRm9yY2UuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0F0dHJhY3Rpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL1JhbmRvbURyaWZ0LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9HcmF2aXR5LmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Db2xsaXNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0Nyb3NzWm9uZS5qcyIsIi4uL3NyYy9iZWhhdmlvdXIvQWxwaGEuanMiLCIuLi9zcmMvYmVoYXZpb3VyL1NjYWxlLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9Sb3RhdGUuanMiLCIuLi9zcmMvYmVoYXZpb3VyL0NvbG9yLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9DeWNsb25lLmpzIiwiLi4vc3JjL2JlaGF2aW91ci9SZXB1bHNpb24uanMiLCIuLi9zcmMvYmVoYXZpb3VyL0dyYXZpdHlXZWxsLmpzIiwiLi4vc3JjL2luaXRpYWxpemUvSW5pdGlhbGl6ZVV0aWwuanMiLCIuLi9zcmMvZW1pdHRlci9FbWl0dGVyLmpzIiwiLi4vc3JjL2VtaXR0ZXIvQmVoYXZpb3VyRW1pdHRlci5qcyIsIi4uL3NyYy9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXIuanMiLCIuLi9zcmMvdXRpbHMvVHlwZXMuanMiLCIuLi9zcmMvcmVuZGVyL0Jhc2VSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXIvQ2FudmFzUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyL0RvbVJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9FYXNlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhlbFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9QaXhpUmVuZGVyZXIuanMiLCIuLi9zcmMvdXRpbHMvTVN0YWNrLmpzIiwiLi4vc3JjL3JlbmRlci9XZWJHTFJlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlci9DdXN0b21SZW5kZXJlci5qcyIsIi4uL3NyYy96b25lL0xpbmVab25lLmpzIiwiLi4vc3JjL3pvbmUvQ2lyY2xlWm9uZS5qcyIsIi4uL3NyYy96b25lL1JlY3Rab25lLmpzIiwiLi4vc3JjL3pvbmUvSW1hZ2Vab25lLmpzIiwiLi4vc3JjL2RlYnVnL0RlYnVnLmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIGlwb3RcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBsZW5ndGggZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXBvdChsZW5ndGgpIHtcbiAgICByZXR1cm4gKGxlbmd0aCAmIChsZW5ndGggLSAxKSkgPT09IDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLldlYkdMVXRpbFxuICAgKiBAbWV0aG9kIG5ocG90XG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgbGVuZ3RoIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgbmhwb3QobGVuZ3RoKSB7XG4gICAgLS1sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMjsgaSA8PD0gMSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgKGxlbmd0aCA+PiBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoICsgMTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVRyYW5zbGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgdHgsIHR5IGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCByZXR1cm4gZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR4IGVpdGhlciAwIG9yIDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHR5IGVpdGhlciAwIG9yIDFcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgbWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkge1xuICAgIHJldHVybiBbMSwgMCwgMCwgMCwgMSwgMCwgdHgsIHR5LCAxXTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uV2ViR0xVdGlsXG4gICAqIEBtZXRob2QgbWFrZVJvdGF0aW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvblxuICAgKiBAdG9kbyBhZGQgcmV0dXJuIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZUluUmFkaWFuc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlUm90YXRpb24oYW5nbGVJblJhZGlhbnMpIHtcbiAgICBsZXQgYyA9IE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKTtcbiAgICBsZXQgcyA9IE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKTtcblxuICAgIHJldHVybiBbYywgLXMsIDAsIHMsIGMsIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYWtlU2NhbGVcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCB0eCwgdHkgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3ggZWl0aGVyIDAgb3IgMVxuICAgKiBAcGFyYW0ge051bWJlcn0gc3kgZWl0aGVyIDAgb3IgMVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYWtlU2NhbGUoc3gsIHN5KSB7XG4gICAgcmV0dXJuIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIDFdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5XZWJHTFV0aWxcbiAgICogQG1ldGhvZCBtYXRyaXhNdWx0aXBseVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIGEsIGIgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gYWRkIHJldHVybiBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYVxuICAgKiBAcGFyYW0ge09iamVjdH0gYlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBtYXRyaXhNdWx0aXBseShhLCBiKSB7XG4gICAgbGV0IGEwMCA9IGFbMCAqIDMgKyAwXTtcbiAgICBsZXQgYTAxID0gYVswICogMyArIDFdO1xuICAgIGxldCBhMDIgPSBhWzAgKiAzICsgMl07XG4gICAgbGV0IGExMCA9IGFbMSAqIDMgKyAwXTtcbiAgICBsZXQgYTExID0gYVsxICogMyArIDFdO1xuICAgIGxldCBhMTIgPSBhWzEgKiAzICsgMl07XG4gICAgbGV0IGEyMCA9IGFbMiAqIDMgKyAwXTtcbiAgICBsZXQgYTIxID0gYVsyICogMyArIDFdO1xuICAgIGxldCBhMjIgPSBhWzIgKiAzICsgMl07XG4gICAgbGV0IGIwMCA9IGJbMCAqIDMgKyAwXTtcbiAgICBsZXQgYjAxID0gYlswICogMyArIDFdO1xuICAgIGxldCBiMDIgPSBiWzAgKiAzICsgMl07XG4gICAgbGV0IGIxMCA9IGJbMSAqIDMgKyAwXTtcbiAgICBsZXQgYjExID0gYlsxICogMyArIDFdO1xuICAgIGxldCBiMTIgPSBiWzEgKiAzICsgMl07XG4gICAgbGV0IGIyMCA9IGJbMiAqIDMgKyAwXTtcbiAgICBsZXQgYjIxID0gYlsyICogMyArIDFdO1xuICAgIGxldCBiMjIgPSBiWzIgKiAzICsgMl07XG5cbiAgICByZXR1cm4gW1xuICAgICAgYTAwICogYjAwICsgYTAxICogYjEwICsgYTAyICogYjIwLFxuICAgICAgYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxLFxuICAgICAgYTAwICogYjAyICsgYTAxICogYjEyICsgYTAyICogYjIyLFxuICAgICAgYTEwICogYjAwICsgYTExICogYjEwICsgYTEyICogYjIwLFxuICAgICAgYTEwICogYjAxICsgYTExICogYjExICsgYTEyICogYjIxLFxuICAgICAgYTEwICogYjAyICsgYTExICogYjEyICsgYTEyICogYjIyLFxuICAgICAgYTIwICogYjAwICsgYTIxICogYjEwICsgYTIyICogYjIwLFxuICAgICAgYTIwICogYjAxICsgYTIxICogYjExICsgYTIyICogYjIxLFxuICAgICAgYTIwICogYjAyICsgYTIxICogYjEyICsgYTIyICogYjIyXG4gICAgXTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2FudmFzLiBUaGUgb3BhY2l0eSBpcyBieSBkZWZhdWx0IHNldCB0byAwXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCBjcmVhdGVDYW52YXNcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9ICRpZCB0aGUgY2FudmFzJyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHdpZHRoIHRoZSBjYW52YXMnIHdpZHRoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkaGVpZ2h0IHRoZSBjYW52YXMnIGhlaWdodFxuICAgKiBAcGFyYW0ge1N0cmluZ30gWyRwb3NpdGlvbj1hYnNvbHV0ZV0gdGhlIGNhbnZhcycgcG9zaXRpb24sIGRlZmF1bHQgaXMgJ2Fic29sdXRlJ1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBjcmVhdGVDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgIGRvbS5pZCA9IGlkO1xuICAgIGRvbS53aWR0aCA9IHdpZHRoO1xuICAgIGRvbS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZG9tLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRvbS5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtKGRvbSwgLTUwMCwgLTUwMCwgMCwgMCk7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9LFxuXG4gIGNyZWF0ZURpdihpZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICBkb20uaWQgPSBpZDtcbiAgICBkb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgdGhpcy5yZXNpemUoZG9tLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBkb207XG4gIH0sXG5cbiAgcmVzaXplKGRvbSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRvbS5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG4gICAgZG9tLnN0eWxlLm1hcmdpbkxlZnQgPSAtd2lkdGggLyAyICsgXCJweFwiO1xuICAgIGRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAtaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIHRyYW5zZm9ybTogdHJhbnNsYXRlKCksIHNjYWxlKCksIHJvdGF0ZSgpIHRvIGEgZ2l2ZW4gZGl2IGRvbSBmb3IgYWxsIGJyb3dzZXJzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkRvbVV0aWxcbiAgICogQG1ldGhvZCB0cmFuc2Zvcm1cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7TnVtYmVyfSAkeFxuICAgKiBAcGFyYW0ge051bWJlcn0gJHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9ICRzY2FsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gJHJvdGF0ZVxuICAgKi9cbiAgdHJhbnNmb3JtKGRpdiwgeCwgeSwgc2NhbGUsIHJvdGF0ZSkge1xuICAgIGRpdi5zdHlsZS53aWxsQ2hhbmdlID0gXCJ0cmFuc2Zvcm1cIjtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KSBzY2FsZSgke3NjYWxlfSkgcm90YXRlKCR7cm90YXRlfWRlZylgO1xuICAgIHRoaXMuY3NzMyhkaXYsIFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XG4gIH0sXG5cbiAgdHJhbnNmb3JtM2QoZGl2LCB4LCB5LCBzY2FsZSwgcm90YXRlKSB7XG4gICAgZGl2LnN0eWxlLndpbGxDaGFuZ2UgPSBcInRyYW5zZm9ybVwiO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMCkgc2NhbGUoJHtzY2FsZX0pIHJvdGF0ZSgke3JvdGF0ZX1kZWcpYDtcbiAgICB0aGlzLmNzczMoZGl2LCBcImJhY2tmYWNlVmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB0aGlzLmNzczMoZGl2LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xuICB9LFxuXG4gIGNzczMoZGl2LCBrZXksIHZhbCkge1xuICAgIGNvbnN0IGJrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuXG4gICAgZGl2LnN0eWxlW2BXZWJraXQke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BNb3oke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2BPJHtia2V5fWBdID0gdmFsO1xuICAgIGRpdi5zdHlsZVtgbXMke2JrZXl9YF0gPSB2YWw7XG4gICAgZGl2LnN0eWxlW2Ake2tleX1gXSA9IHZhbDtcbiAgfVxufTtcbiIsImltcG9ydCBXZWJHTFV0aWwgZnJvbSBcIi4vV2ViR0xVdGlsXCI7XG5pbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi9Eb21VdGlsXCI7XG5cbmNvbnN0IGltZ3NDYWNoZSA9IHt9O1xuY29uc3QgY2FudmFzQ2FjaGUgPSB7fTtcbmxldCBjYW52YXNJZCA9IDA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBnZXQgdGhlIGltYWdlIGRhdGEuIEl0IGNvdWxkIGJlIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBQcm90b24uWm9uZS5cbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltYWdlRGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSAgIGNvbnRleHQgYW55IGNhbnZhcywgbXVzdCBiZSBhIDJkQ29udGV4dCAnY2FudmFzLmdldENvbnRleHQoJzJkJyknXG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgICAgICAgICAgICAgaW1hZ2UgICBjb3VsZCBiZSBhbnkgZG9tIGltYWdlLCBlLmcuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzSXNBbkltZ1RhZycpO1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5SZWN0YW5nbGV9ICAgIHJlY3RcbiAgICovXG4gIGdldEltYWdlRGF0YShjb250ZXh0LCBpbWFnZSwgcmVjdCkge1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCByZWN0LngsIHJlY3QueSk7XG4gICAgY29uc3QgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdChyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgcmV0dXJuIGltYWdlZGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGdldEltZ0Zyb21DYWNoZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICogQHRvZG8gZGVzY3JpYmUgZnVuY1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSAgICAgICAgICAgICAgIGltZ1xuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gICAgIHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgICAgICAgICAgZHJhd0NhbnZhcyAgc2V0IHRvIHRydWUgaWYgYSBjYW52YXMgc2hvdWxkIGJlIHNhdmVkIGludG8gcGFydGljbGUuZGF0YS5jYW52YXNcbiAgICogQHBhcmFtIHtCb29sZWFufSAgICAgICAgICAgICBmdW5jXG4gICAqL1xuICBnZXRJbWdGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSB0eXBlb2YgaW1nID09PSBcInN0cmluZ1wiID8gaW1nIDogaW1nLnNyYztcblxuICAgIGlmIChpbWdzQ2FjaGVbc3JjXSkge1xuICAgICAgY2FsbGJhY2soaW1nc0NhY2hlW3NyY10sIHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICBpbWdzQ2FjaGVbc3JjXSA9IGUudGFyZ2V0O1xuICAgICAgICBjYWxsYmFjayhpbWdzQ2FjaGVbc3JjXSwgcGFyYW0pO1xuICAgICAgfTtcblxuICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgIH1cbiAgfSxcblxuICBnZXRDYW52YXNGcm9tQ2FjaGUoaW1nLCBjYWxsYmFjaywgcGFyYW0pIHtcbiAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xuXG4gICAgaWYgKCFjYW52YXNDYWNoZVtzcmNdKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IFdlYkdMVXRpbC5uaHBvdChpbWcud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gV2ViR0xVdGlsLm5ocG90KGltZy5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBEb21VdGlsLmNyZWF0ZUNhbnZhcyhgcHJvdG9uX2NhbnZhc19jYWNoZV8keysrY2FudmFzSWR9YCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcblxuICAgICAgY2FudmFzQ2FjaGVbc3JjXSA9IGNhbnZhcztcbiAgICB9XG5cbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjYW52YXNDYWNoZVtzcmNdLCBwYXJhbSk7XG5cbiAgICByZXR1cm4gY2FudmFzQ2FjaGVbc3JjXTtcbiAgfVxufTtcbiIsImltcG9ydCBJbWdVdGlsIGZyb20gXCIuL0ltZ1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGluaXRWYWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBhIHNwZWNpZmljIHZhbHVlLCBjb3VsZCBiZSBldmVyeXRoaW5nIGJ1dCBudWxsIG9yIHVuZGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSBkZWZhdWx0cyB0aGUgZGVmYXVsdCBpZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIGluaXRWYWx1ZSh2YWx1ZSwgZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHRzO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBpc0FycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIEFueSBhcnJheVxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICovXG4gIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95ZXMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBlbXB0eUFycmF5XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IEFueSBhcnJheVxuICAgKi9cbiAgZW1wdHlBcnJheShhcnIpIHtcbiAgICBpZiAoYXJyKSBhcnIubGVuZ3RoID0gMDtcbiAgfSxcblxuICB0b0FycmF5KGFycikge1xuICAgIHJldHVybiB0aGlzLmlzQXJyYXkoYXJyKSA/IGFyciA6IFthcnJdO1xuICB9LFxuXG4gIHNsaWNlQXJyYXkoYXJyMSwgaW5kZXgsIGFycjIpIHtcbiAgICB0aGlzLmVtcHR5QXJyYXkoYXJyMik7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyMi5wdXNoKGFycjFbaV0pO1xuICAgIH1cbiAgfSxcblxuICBnZXRSYW5kRnJvbUFycmF5KGFycikge1xuICAgIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJyW01hdGguZmxvb3IoYXJyLmxlbmd0aCAqIE1hdGgucmFuZG9tKCkpXTtcbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveWVzIHRoZSBnaXZlbiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGVtcHR5T2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW55IG9iamVjdFxuICAgKi9cbiAgZW1wdHlPYmplY3Qob2JqLCBpZ25vcmUgPSBudWxsKSB7XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgaWYgKGlnbm9yZSAmJiBpZ25vcmUuaW5kZXhPZihrZXkpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWFrZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBhbmQgYmluZHMgdGhlIGdpdmVuIGFycmF5XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBjbGFzc0FwcGx5XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIEEgY2xhc3MgdG8gbWFrZSBhbiBpbnN0YW5jZSBmcm9tXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcmdzXSBBbnkgYXJyYXkgdG8gYmluZCBpdCB0byB0aGUgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgaW5zdGFuY2Ugb2YgY29uc3RydWN0b3IsIG9wdGlvbmFsbHkgYmluZCB3aXRoIGFyZ3NcbiAgICovXG4gIGNsYXNzQXBwbHkoY29uc3RydWN0b3IsIGFyZ3MgPSBudWxsKSB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm4gbmV3IGNvbnN0cnVjdG9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IEZhY3RvcnlGdW5jID0gY29uc3RydWN0b3IuYmluZC5hcHBseShjb25zdHJ1Y3RvciwgW251bGxdLmNvbmNhdChhcmdzKSk7XG4gICAgICByZXR1cm4gbmV3IEZhY3RvcnlGdW5jKCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBpbWFnZSBkYXRhLiBJdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgUHJvdG9uLlpvbmUuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBnZXRJbWFnZURhdGFcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gICBjb250ZXh0IGFueSBjYW52YXMsIG11c3QgYmUgYSAyZENvbnRleHQgJ2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpJ1xuICAgKiBAcGFyYW0ge09iamVjdH0gICAgICAgICAgICAgIGltYWdlICAgY291bGQgYmUgYW55IGRvbSBpbWFnZSwgZS5nLiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhpc0lzQW5JbWdUYWcnKTtcbiAgICogQHBhcmFtIHtQcm90b24uUmVjdGFuZ2xlfSAgICByZWN0XG4gICAqL1xuICBnZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpIHtcbiAgICByZXR1cm4gSW1nVXRpbC5nZXRJbWFnZURhdGEoY29udGV4dCwgaW1hZ2UsIHJlY3QpO1xuICB9LFxuXG4gIGRlc3Ryb3lBbGwoYXJyLCBwYXJhbSA9IG51bGwpIHtcbiAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJbaV0uZGVzdHJveShwYXJhbSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICBkZWxldGUgYXJyW2ldO1xuICAgIH1cblxuICAgIGFyci5sZW5ndGggPSAwO1xuICB9LFxuXG4gIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICB9XG59O1xuIiwiY29uc3QgaWRzTWFwID0ge307XG5cbmNvbnN0IFB1aWQgPSB7XG4gIF9pbmRleDogMCxcbiAgX2NhY2hlOiB7fSxcblxuICBpZCh0eXBlKSB7XG4gICAgaWYgKGlkc01hcFt0eXBlXSA9PT0gdW5kZWZpbmVkIHx8IGlkc01hcFt0eXBlXSA9PT0gbnVsbCkgaWRzTWFwW3R5cGVdID0gMDtcbiAgICByZXR1cm4gYCR7dHlwZX1fJHtpZHNNYXBbdHlwZV0rK31gO1xuICB9LFxuXG4gIGdldElkKHRhcmdldCkge1xuICAgIGxldCB1aWQgPSB0aGlzLmdldElkRnJvbUNhY2hlKHRhcmdldCk7XG4gICAgaWYgKHVpZCkgcmV0dXJuIHVpZDtcblxuICAgIHVpZCA9IGBQVUlEXyR7dGhpcy5faW5kZXgrK31gO1xuICAgIHRoaXMuX2NhY2hlW3VpZF0gPSB0YXJnZXQ7XG4gICAgcmV0dXJuIHVpZDtcbiAgfSxcblxuICBnZXRJZEZyb21DYWNoZSh0YXJnZXQpIHtcbiAgICBsZXQgb2JqLCBpZDtcblxuICAgIGZvciAoaWQgaW4gdGhpcy5fY2FjaGUpIHtcbiAgICAgIG9iaiA9IHRoaXMuX2NhY2hlW2lkXTtcblxuICAgICAgaWYgKG9iaiA9PT0gdGFyZ2V0KSByZXR1cm4gaWQ7XG4gICAgICBpZiAodGhpcy5pc0JvZHkob2JqLCB0YXJnZXQpICYmIG9iai5zcmMgPT09IHRhcmdldC5zcmMpIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICBpc0JvZHkob2JqLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIG9iai5pc0lubmVyICYmIHRhcmdldC5pc0lubmVyO1xuICB9LFxuXG4gIGdldFRhcmdldCh1aWQpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVbdWlkXTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHVpZDtcbiIsIi8qKlxuICogUG9vbCBpcyB0aGUgY2FjaGUgcG9vbCBvZiB0aGUgcHJvdG9uIGVuZ2luZSwgaXQgaXMgdmVyeSBpbXBvcnRhbnQuXG4gKlxuICogZ2V0KHRhcmdldCwgcGFyYW1zLCB1aWQpXG4gKiAgQ2xhc3NcbiAqICAgIHVpZCA9IFB1aWQuZ2V0SWQgLT4gUHVpZCBzYXZlIHRhcmdldCBjYWNoZVxuICogICAgdGFyZ2V0Ll9fcHVpZCA9IHVpZFxuICpcbiAqICBib2R5XG4gKiAgICB1aWQgPSBQdWlkLmdldElkIC0+IFB1aWQgc2F2ZSB0YXJnZXQgY2FjaGVcbiAqXG4gKlxuICogZXhwaXJlKHRhcmdldClcbiAqICBjYWNoZVt0YXJnZXQuX19wdWlkXSBwdXNoIHRhcmdldFxuICpcbiAqL1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBQdWlkIGZyb20gXCIuLi91dGlscy9QdWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvb2wge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBvZiBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB0b3RhbFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gY2FjaGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKG51bSkge1xuICAgIHRoaXMudG90YWwgPSAwO1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldCh0YXJnZXQsIHBhcmFtcywgdWlkKSB7XG4gICAgbGV0IHA7XG4gICAgdWlkID0gdWlkIHx8IHRhcmdldC5fX3B1aWQgfHwgUHVpZC5nZXRJZCh0YXJnZXQpO1xuXG4gICAgaWYgKHRoaXMuY2FjaGVbdWlkXSAmJiB0aGlzLmNhY2hlW3VpZF0ubGVuZ3RoID4gMCkge1xuICAgICAgcCA9IHRoaXMuY2FjaGVbdWlkXS5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcCA9IHRoaXMuY3JlYXRlT3JDbG9uZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcC5fX3B1aWQgPSB0YXJnZXQuX19wdWlkIHx8IHVpZDtcbiAgICByZXR1cm4gcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGV4cGlyZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDYWNoZSh0YXJnZXQuX19wdWlkKS5wdXNoKHRhcmdldCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgbW9yZSBkb2N1bWVudGF0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldCBhbnkgT2JqZWN0IG9yIEZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBqdXN0IGFkZCBpZiBgdGFyZ2V0YCBpcyBhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGNyZWF0ZU9yQ2xvbmUodGFyZ2V0LCBwYXJhbXMpIHtcbiAgICB0aGlzLnRvdGFsKys7XG5cbiAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0YXJnZXQsIHBhcmFtcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBVdGlsLmNsYXNzQXBwbHkodGFyZ2V0LCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LmNsb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiAtIHdoYXQgaXMgaW4gdGhlIGNhY2hlP1xuICAgKlxuICAgKiBAbWV0aG9kIGdldENvdW50XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0Q291bnQoKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLmNhY2hlKSBjb3VudCArPSB0aGlzLmNhY2hlW2lkXS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveWVzIGFsbCBpdGVtcyBmcm9tIFBvb2wuY2FjaGVcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlBvb2xcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgZm9yIChsZXQgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgdGhpcy5jYWNoZVtpZF0ubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBQb29sLmNhY2hlXG4gICAqXG4gICAqIEBtZXRob2QgZ2V0Q2FjaGVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUG9vbFxuICAgKiBAcHJpdmF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gdWlkIHRoZSB1bmlxdWUgaWRcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0Q2FjaGUodWlkID0gXCJkZWZhdWx0XCIpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVbdWlkXSkgdGhpcy5jYWNoZVt1aWRdID0gW107XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVbdWlkXTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHMge1xuICBjb25zdHJ1Y3Rvcihwcm90b24pIHtcbiAgICB0aGlzLnByb3RvbiA9IHByb3RvbjtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gMTtcblxuICAgIHRoaXMuZW1pdHRlckluZGV4ID0gMDtcbiAgICB0aGlzLnJlbmRlcmVySW5kZXggPSAwO1xuICB9XG5cbiAgdXBkYXRlKHN0eWxlLCBib2R5KSB7XG4gICAgdGhpcy5hZGQoc3R5bGUsIGJvZHkpO1xuXG4gICAgY29uc3QgZW1pdHRlciA9IHRoaXMuZ2V0RW1pdHRlcigpO1xuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5nZXRSZW5kZXJlcigpO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgc3RyICs9IFwiZW1pdHRlcjpcIiArIHRoaXMucHJvdG9uLmVtaXR0ZXJzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiZW0gc3BlZWQ6XCIgKyBlbWl0dGVyLmVtaXRTcGVlZCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwicG9zOlwiICsgdGhpcy5nZXRFbWl0dGVyUG9zKGVtaXR0ZXIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiaW5pdGlhbGl6ZXM6XCIgKyBlbWl0dGVyLmluaXRpYWxpemVzLmxlbmd0aCArIFwiPGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcilcbiAgICAgICAgICBzdHIgKz0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2s7XCI+JyArIHRoaXMuY29uY2F0QXJyKGVtaXR0ZXIuaW5pdGlhbGl6ZXMpICsgXCI8L3NwYW4+PGJyPlwiO1xuICAgICAgICBpZiAoZW1pdHRlcikgc3RyICs9IFwiYmVoYXZpb3VyczpcIiArIGVtaXR0ZXIuYmVoYXZpb3Vycy5sZW5ndGggKyBcIjxicj5cIjtcbiAgICAgICAgaWYgKGVtaXR0ZXIpIHN0ciArPSAnPHNwYW4gc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jaztcIj4nICsgdGhpcy5jb25jYXRBcnIoZW1pdHRlci5iZWhhdmlvdXJzKSArIFwiPC9zcGFuPjxicj5cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKHJlbmRlcmVyKSBzdHIgKz0gcmVuZGVyZXIubmFtZSArIFwiPGJyPlwiO1xuICAgICAgICBpZiAocmVuZGVyZXIpIHN0ciArPSBcImJvZHk6XCIgKyB0aGlzLmdldENyZWF0ZWROdW1iZXIocmVuZGVyZXIpICsgXCI8YnI+XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdHIgKz0gXCJwYXJ0aWNsZXM6XCIgKyB0aGlzLnByb3Rvbi5nZXRDb3VudCgpICsgXCI8YnI+XCI7XG4gICAgICAgIHN0ciArPSBcInBvb2w6XCIgKyB0aGlzLnByb3Rvbi5wb29sLmdldENvdW50KCkgKyBcIjxicj5cIjtcbiAgICAgICAgc3RyICs9IFwidG90YWw6XCIgKyB0aGlzLnByb3Rvbi5wb29sLnRvdGFsO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IHN0cjtcbiAgfVxuXG4gIGFkZChzdHlsZSwgYm9keSkge1xuICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMudHlwZSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBbXG4gICAgICAgIFwicG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjBweDtsZWZ0OjA7Y3Vyc29yOnBvaW50ZXI7XCIsXG4gICAgICAgIFwib3BhY2l0eTowLjk7ei1pbmRleDoxMDAwMDtwYWRkaW5nOjEwcHg7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7XCIsXG4gICAgICAgIFwid2lkdGg6MTIwcHg7aGVpZ2h0OjUwcHg7YmFja2dyb3VuZC1jb2xvcjojMDAyO2NvbG9yOiMwZmY7XCJcbiAgICAgIF0uam9pbihcIlwiKTtcblxuICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICBlID0+IHtcbiAgICAgICAgICB0aGlzLnR5cGUrKztcbiAgICAgICAgICBpZiAodGhpcy50eXBlID4gNCkgdGhpcy50eXBlID0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIGxldCBiZywgY29sb3I7XG4gICAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBiZyA9IFwiIzIwMVwiO1xuICAgICAgICAgIGNvbG9yID0gXCIjZjA4XCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGJnID0gXCIjMDIwXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZjBcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJnID0gXCIjMDAyXCI7XG4gICAgICAgICAgY29sb3IgPSBcIiMwZmZcIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250YWluZXIuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdID0gYmc7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZVtcImNvbG9yXCJdID0gY29sb3I7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICBib2R5ID0gYm9keSB8fCB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9uLmVtaXR0ZXJzW3RoaXMuZW1pdHRlckluZGV4XTtcbiAgfVxuXG4gIGdldFJlbmRlcmVyKCkge1xuICAgIHJldHVybiB0aGlzLnByb3Rvbi5yZW5kZXJlcnNbdGhpcy5yZW5kZXJlckluZGV4XTtcbiAgfVxuXG4gIGNvbmNhdEFycihhcnIpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoIWFyciB8fCAhYXJyLmxlbmd0aCkgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gKGFycltpXS5uYW1lIHx8IFwiXCIpLnN1YnN0cigwLCAxKSArIFwiLlwiO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRDcmVhdGVkTnVtYmVyKHJlbmRlcmVyKSB7XG4gICAgcmV0dXJuIHJlbmRlcmVyLnBvb2wudG90YWwgfHwgKHJlbmRlcmVyLmNwb29sICYmIHJlbmRlcmVyLmNwb29sLnRvdGFsKSB8fCAwO1xuICB9XG5cbiAgZ2V0RW1pdHRlclBvcyhlKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoZS5wLngpICsgXCIsXCIgKyBNYXRoLnJvdW5kKGUucC55KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmJvZHkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMucHJvdG9uID0gbnVsbDtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gIH1cbn1cbiIsIi8qXG4gKiBFdmVudERpc3BhdGNoZXJcbiAqIFRoaXMgY29kZSByZWZlcmVuY2Ugc2luY2UgaHR0cDovL2NyZWF0ZWpzLmNvbS8uXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERpc3BhdGNoZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICB9XG5cbiAgc3RhdGljIGJpbmQodGFyZ2V0KSB7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50O1xuICAgIHRhcmdldC5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lciA9IEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUuaGFzRXZlbnRMaXN0ZW5lcjtcbiAgICB0YXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIHRhcmdldC5wcm90b3R5cGUucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gW107XG4gICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGxpc3RlbmVyO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHJldHVybjtcblxuICAgIGNvbnN0IGFyciA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbdHlwZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbGxvd3MgZm9yIGZhc3RlciBjaGVja3MuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGxFdmVudExpc3RlbmVycyh0eXBlKSB7XG4gICAgaWYgKCF0eXBlKSB0aGlzLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIGVsc2UgaWYgKHRoaXMuX2xpc3RlbmVycykgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQodHlwZSwgYXJncykge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cbiAgICBpZiAodHlwZSAmJiBsaXN0ZW5lcnMpIHtcbiAgICAgIGxldCBhcnIgPSBsaXN0ZW5lcnNbdHlwZV07XG4gICAgICBpZiAoIWFycikgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgLy8gYXJyID0gYXJyLnNsaWNlKCk7XG4gICAgICAvLyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBpdGVtcyBiZWluZyByZW1vdmVkIG9yIGFkZGVkIGR1cmluZyB0aGUgZGlzcGF0Y2hcblxuICAgICAgbGV0IGhhbmRsZXI7XG4gICAgICBsZXQgaSA9IGFyci5sZW5ndGg7XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGhhbmRsZXIgPSBhcnJbaV07XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCBoYW5kbGVyKGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAhIXJlc3VsdDtcbiAgfVxuXG4gIGhhc0V2ZW50TGlzdGVuZXIodHlwZSkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICByZXR1cm4gISEobGlzdGVuZXJzICYmIGxpc3RlbmVyc1t0eXBlXSk7XG4gIH1cbn1cbiIsImNvbnN0IFBJID0gMy4xNDE1OTI2O1xuY29uc3QgSU5GSU5JVFkgPSBJbmZpbml0eTtcblxuY29uc3QgTWF0aFV0aWwgPSB7XG4gIFBJOiBQSSxcbiAgUEl4MjogUEkgKiAyLFxuICBQSV8yOiBQSSAvIDIsXG4gIFBJXzE4MDogUEkgLyAxODAsXG4gIE4xODBfUEk6IDE4MCAvIFBJLFxuICBJbmZpbml0eTogLTk5OSxcblxuICBpc0luZmluaXR5KG51bSkge1xuICAgIHJldHVybiBudW0gPT09IHRoaXMuSW5maW5pdHkgfHwgbnVtID09PSBJTkZJTklUWTtcbiAgfSxcblxuICByYW5kb21BVG9CKGEsIGIsIGlzSW50ID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzSW50KSByZXR1cm4gYSArIE1hdGgucmFuZG9tKCkgKiAoYiAtIGEpO1xuICAgIGVsc2UgcmV0dXJuICgoTWF0aC5yYW5kb20oKSAqIChiIC0gYSkpID4+IDApICsgYTtcbiAgfSxcblxuICByYW5kb21GbG9hdGluZyhjZW50ZXIsIGYsIGlzSW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQVRvQihjZW50ZXIgLSBmLCBjZW50ZXIgKyBmLCBpc0ludCk7XG4gIH0sXG5cbiAgcmFuZG9tQ29sb3IoKSB7XG4gICAgcmV0dXJuIFwiI1wiICsgKFwiMDAwMDBcIiArICgoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCkgPDwgMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNik7XG4gIH0sXG5cbiAgcmFuZG9tWm9uZShkaXNwbGF5KSB7fSxcblxuICBmbG9vcihudW0sIGsgPSA0KSB7XG4gICAgY29uc3QgZGlnaXRzID0gTWF0aC5wb3coMTAsIGspO1xuICAgIHJldHVybiBNYXRoLmZsb29yKG51bSAqIGRpZ2l0cykgLyBkaWdpdHM7XG4gIH0sXG5cbiAgZGVncmVlVHJhbnNmb3JtKGEpIHtcbiAgICByZXR1cm4gKGEgKiBQSSkgLyAxODA7XG4gIH0sXG5cbiAgdG9Db2xvcjE2KG51bSkge1xuICAgIHJldHVybiBgIyR7bnVtLnRvU3RyaW5nKDE2KX1gO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRoVXRpbDtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVncmF0aW9uIHtcbiAgY29uc3RydWN0b3IodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBjYWxjdWxhdGUocGFydGljbGVzLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgdGhpcy5ldWxlckludGVncmF0ZShwYXJ0aWNsZXMsIHRpbWUsIGRhbXBpbmcpO1xuICB9XG5cbiAgLy8gRXVsZXIgSW50ZWdyYXRlXG4gIC8vIGh0dHBzOi8vcm9zZXR0YWNvZGUub3JnL3dpa2kvRXVsZXJfbWV0aG9kXG4gIGV1bGVySW50ZWdyYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKSB7XG4gICAgaWYgKCFwYXJ0aWNsZS5zbGVlcCkge1xuICAgICAgcGFydGljbGUub2xkLnAuY29weShwYXJ0aWNsZS5wKTtcbiAgICAgIHBhcnRpY2xlLm9sZC52LmNvcHkocGFydGljbGUudik7XG5cbiAgICAgIHBhcnRpY2xlLmEubXVsdGlwbHlTY2FsYXIoMSAvIHBhcnRpY2xlLm1hc3MpO1xuICAgICAgcGFydGljbGUudi5hZGQocGFydGljbGUuYS5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChwYXJ0aWNsZS5vbGQudi5tdWx0aXBseVNjYWxhcih0aW1lKSk7XG5cbiAgICAgIGlmIChkYW1waW5nKSBwYXJ0aWNsZS52Lm11bHRpcGx5U2NhbGFyKGRhbXBpbmcpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUG9vbCBmcm9tIFwiLi9Qb29sXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFN0YXRzIGZyb20gXCIuLi9kZWJ1Zy9TdGF0c1wiO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlciBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5pbXBvcnQgSW50ZWdyYXRpb24gZnJvbSBcIi4uL21hdGgvSW50ZWdyYXRpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvdG9uIHtcbiAgc3RhdGljIFVTRV9DTE9DSyA9IGZhbHNlO1xuXG4gIC8vIG1lYXN1cmUgMToxMDBcbiAgc3RhdGljIE1FQVNVUkUgPSAxMDA7XG4gIHN0YXRpYyBFVUxFUiA9IFwiZXVsZXJcIjtcbiAgc3RhdGljIFJLMiA9IFwicnVuZ2Uta3V0dGEyXCI7XG5cbiAgLy8gZXZlbnQgbmFtZVxuICBzdGF0aWMgUEFSVElDTEVfQ1JFQVRFRCA9IFwiUEFSVElDTEVfQ1JFQVRFRFwiO1xuICBzdGF0aWMgUEFSVElDTEVfVVBEQVRFID0gXCJQQVJUSUNMRV9VUERBVEVcIjtcbiAgc3RhdGljIFBBUlRJQ0xFX1NMRUVQID0gXCJQQVJUSUNMRV9TTEVFUFwiO1xuICBzdGF0aWMgUEFSVElDTEVfREVBRCA9IFwiUEFSVElDTEVfREVBRFwiO1xuXG4gIHN0YXRpYyBFTUlUVEVSX0FEREVEID0gXCJFTUlUVEVSX0FEREVEXCI7XG4gIHN0YXRpYyBFTUlUVEVSX1JFTU9WRUQgPSBcIkVNSVRURVJfUkVNT1ZFRFwiO1xuXG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFID0gXCJQUk9UT05fVVBEQVRFXCI7XG4gIHN0YXRpYyBQUk9UT05fVVBEQVRFX0FGVEVSID0gXCJQUk9UT05fVVBEQVRFX0FGVEVSXCI7XG4gIHN0YXRpYyBERUZBVUxUX0lOVEVSVkFMID0gMC4wMTY3O1xuXG4gIHN0YXRpYyBhbWVuZENoYW5nZVRhYnNCdWcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3IgdG8gYWRkIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvciBQcm90b25cbiAgICpcbiAgICogQHRvZG8gcHJvUGFydGljbGVDb3VudCBpcyBub3QgaW4gdXNlXG4gICAqIEB0b2RvIGFkZCBtb3JlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNpbmdsZSBwcm9wZXJ0aWVzIGFuZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcHJvUGFydGljbGVDb3VudF0gbm90IGluIHVzZT9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbnRlZ3JhdGlvblR5cGU9UHJvdG9uLkVVTEVSXVxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2ludGVncmF0aW9uVHlwZT1Qcm90b24uRVVMRVJdXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGVtaXR0ZXJzICAgQWxsIGFkZGVkIGVtaXR0ZXJcbiAgICogQHByb3BlcnR5IHtBcnJheX0gcmVuZGVyZXJzICBBbGwgYWRkZWQgcmVuZGVyZXJcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRpbWUgICAgICBUaGUgYWN0aXZlIHRpbWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IG9sZHRpbWUgICBUaGUgb2xkIHRpbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGludGVncmF0aW9uVHlwZSkge1xuICAgIHRoaXMuZW1pdHRlcnMgPSBbXTtcbiAgICB0aGlzLnJlbmRlcmVycyA9IFtdO1xuXG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5vdyA9IDA7XG4gICAgdGhpcy50aGVuID0gMDtcbiAgICB0aGlzLmVsYXBzZWQgPSAwO1xuXG4gICAgdGhpcy5zdGF0cyA9IG5ldyBTdGF0cyh0aGlzKTtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCg4MCk7XG5cbiAgICB0aGlzLmludGVncmF0aW9uVHlwZSA9IFV0aWwuaW5pdFZhbHVlKGludGVncmF0aW9uVHlwZSwgUHJvdG9uLkVVTEVSKTtcbiAgICB0aGlzLmludGVncmF0b3IgPSBuZXcgSW50ZWdyYXRpb24odGhpcy5pbnRlZ3JhdGlvblR5cGUpO1xuXG4gICAgdGhpcy5fZnBzID0gXCJhdXRvXCI7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBQcm90b24uREVGQVVMVF9JTlRFUlZBTDtcbiAgfVxuXG4gIHNldCBmcHMoZnBzKSB7XG4gICAgdGhpcy5fZnBzID0gZnBzO1xuICAgIHRoaXMuX2ludGVydmFsID0gZnBzID09PSBcImF1dG9cIiA/IFByb3Rvbi5ERUZBVUxUX0lOVEVSVkFMIDogTWF0aFV0aWwuZmxvb3IoMSAvIGZwcywgNyk7XG4gIH1cblxuICBnZXQgZnBzKCkge1xuICAgIHJldHVybiB0aGlzLl9mcHM7XG4gIH1cblxuICAvKipcbiAgICogYWRkIGEgdHlwZSBvZiBSZW5kZXJlclxuICAgKlxuICAgKiBAbWV0aG9kIGFkZFJlbmRlcmVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlclxuICAgKi9cbiAgYWRkUmVuZGVyZXIocmVuZGVyKSB7XG4gICAgcmVuZGVyLmluaXQodGhpcyk7XG4gICAgdGhpcy5yZW5kZXJlcnMucHVzaChyZW5kZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuYW1lIGFkZCBhIHR5cGUgb2YgUmVuZGVyZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRSZW5kZXJlclxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJcbiAgICovXG4gIHJlbW92ZVJlbmRlcmVyKHJlbmRlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZW5kZXJlcnMuaW5kZXhPZihyZW5kZXIpO1xuICAgIHRoaXMucmVuZGVyZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmVuZGVyLnJlbW92ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdGhlIEVtaXR0ZXJcbiAgICpcbiAgICogQG1ldGhvZCBhZGRFbWl0dGVyXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7RW1pdHRlcn0gZW1pdHRlclxuICAgKi9cbiAgYWRkRW1pdHRlcihlbWl0dGVyKSB7XG4gICAgdGhpcy5lbWl0dGVycy5wdXNoKGVtaXR0ZXIpO1xuICAgIGVtaXR0ZXIucGFyZW50ID0gdGhpcztcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uRU1JVFRFUl9BRERFRCwgZW1pdHRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBFbWl0dGVyXG4gICAqXG4gICAqIEBtZXRob2QgcmVtb3ZlRW1pdHRlclxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBlbWl0dGVyXG4gICAqL1xuICByZW1vdmVFbWl0dGVyKGVtaXR0ZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZW1pdHRlcnMuaW5kZXhPZihlbWl0dGVyKTtcbiAgICB0aGlzLmVtaXR0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgZW1pdHRlci5wYXJlbnQgPSBudWxsO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFByb3Rvbi5FTUlUVEVSX1JFTU9WRUQsIGVtaXR0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYWxsIGFkZGVkIGVtaXR0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgLy8gJ2F1dG8nIGlzIHRoZSBkZWZhdWx0IGJyb3dzZXIgcmVmcmVzaCByYXRlLCB0aGUgdmFzdCBtYWpvcml0eSBpcyA2MGZwc1xuICAgIGlmICh0aGlzLl9mcHMgPT09IFwiYXV0b1wiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEUpO1xuXG4gICAgICBpZiAoUHJvdG9uLlVTRV9DTE9DSykge1xuICAgICAgICBpZiAoIXRoaXMudGhlbikgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMubm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZWxhcHNlZCA9ICh0aGlzLm5vdyAtIHRoaXMudGhlbikgKiAwLjAwMTtcbiAgICAgICAgLy8gRml4IGJ1Z3Mgc3VjaCBhcyBjaHJvbWUgYnJvd3NlciBzd2l0Y2hpbmcgdGFicyBjYXVzaW5nIGV4Y2Vzc2l2ZSB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAgdGhpcy5hbWVuZENoYW5nZVRhYnNCdWcoKTtcblxuICAgICAgICBpZiAodGhpcy5lbGFwc2VkID4gMCkgdGhpcy5lbWl0dGVyc1VwZGF0ZSh0aGlzLmVsYXBzZWQpO1xuICAgICAgICB0aGlzLnRoZW4gPSB0aGlzLm5vdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcnNVcGRhdGUoUHJvdG9uLkRFRkFVTFRfSU5URVJWQUwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEVfQUZURVIpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBmcHMgZnJhbWUgcmF0ZSBpcyBzZXRcbiAgICBlbHNlIHtcbiAgICAgIGlmICghdGhpcy50aGVuKSB0aGlzLnRoZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHRoaXMubm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLmVsYXBzZWQgPSAodGhpcy5ub3cgLSB0aGlzLnRoZW4pICogMC4wMDE7XG5cbiAgICAgIGlmICh0aGlzLmVsYXBzZWQgPiB0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoUHJvdG9uLlBST1RPTl9VUERBVEUpO1xuICAgICAgICB0aGlzLmVtaXR0ZXJzVXBkYXRlKHRoaXMuX2ludGVydmFsKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3NjQwMTgvY29udHJvbGxpbmctZnBzLXdpdGgtcmVxdWVzdGFuaW1hdGlvbmZyYW1lXG4gICAgICAgIHRoaXMudGhlbiA9IHRoaXMubm93IC0gKHRoaXMuZWxhcHNlZCAlIHRoaXMuX2ludGVydmFsKSAqIDEwMDA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChQcm90b24uUFJPVE9OX1VQREFURV9BRlRFUik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW1pdHRlcnNVcGRhdGUoZWxhcHNlZCkge1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5lbWl0dGVyc1tpXS51cGRhdGUoZWxhcHNlZCk7XG4gIH1cblxuICAvKipcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBtZXRob2QgYW1lbmRDaGFuZ2VUYWJzQnVnXG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBhbWVuZENoYW5nZVRhYnNCdWcoKSB7XG4gICAgaWYgKCFQcm90b24uYW1lbmRDaGFuZ2VUYWJzQnVnKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZWxhcHNlZCA+IDAuNSkge1xuICAgICAgdGhpcy50aGVuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB0aGlzLmVsYXBzZWQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIHBhcnRpY2xlcyBmcm9tIGFsbCBlbWl0dGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIGdldENvdW50XG4gICAqIEBtZW1iZXJvZiBQcm90b25cbiAgICogQGluc3RhbmNlXG4gICAqL1xuICBnZXRDb3VudCgpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBpID0gdGhpcy5lbWl0dGVycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB0b3RhbCArPSB0aGlzLmVtaXR0ZXJzW2ldLnBhcnRpY2xlcy5sZW5ndGg7XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgZ2V0QWxsUGFydGljbGVzKCkge1xuICAgIGxldCBwYXJ0aWNsZXMgPSBbXTtcbiAgICBsZXQgaSA9IHRoaXMuZW1pdHRlcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkgcGFydGljbGVzID0gcGFydGljbGVzLmNvbmNhdCh0aGlzLmVtaXR0ZXJzW2ldLnBhcnRpY2xlcyk7XG4gICAgcmV0dXJuIHBhcnRpY2xlcztcbiAgfVxuXG4gIGRlc3Ryb3lBbGxFbWl0dGVycygpIHtcbiAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5lbWl0dGVycyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIHRoaXMgUHJvdG9uIGluc3RhbmNlLiBUaGlzIGluY2x1ZGVzIGFsbCBlbWl0dGVycywgYW5kIGFsbCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZGVzdHJveShyZW1vdmUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRlc3Ryb3lPdGhlciA9ICgpID0+IHtcbiAgICAgIHRoaXMudGltZSA9IDA7XG4gICAgICB0aGlzLnRoZW4gPSAwO1xuICAgICAgdGhpcy5wb29sLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc3RhdHMuZGVzdHJveSgpO1xuXG4gICAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5lbWl0dGVycyk7XG4gICAgICBVdGlsLmRlc3Ryb3lBbGwodGhpcy5yZW5kZXJlcnMsIHRoaXMuZ2V0QWxsUGFydGljbGVzKCkpO1xuXG4gICAgICB0aGlzLmludGVncmF0b3IgPSBudWxsO1xuICAgICAgdGhpcy5yZW5kZXJlcnMgPSBudWxsO1xuICAgICAgdGhpcy5lbWl0dGVycyA9IG51bGw7XG4gICAgICB0aGlzLnN0YXRzID0gbnVsbDtcbiAgICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgfTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoZGVzdHJveU90aGVyLCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0cm95T3RoZXIoKTtcbiAgICB9XG4gIH1cbn1cblxuRXZlbnREaXNwYXRjaGVyLmJpbmQoUHJvdG9uKTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJnYiB7XG4gIGNvbnN0cnVjdG9yKHIgPSAyNTUsIGcgPSAyNTUsIGIgPSAyNTUpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHRoaXMuZyA9IGc7XG4gICAgdGhpcy5iID0gYjtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuciA9IDI1NTtcbiAgICB0aGlzLmcgPSAyNTU7XG4gICAgdGhpcy5iID0gMjU1O1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwYW4ge1xuICBjb25zdHJ1Y3RvcihhLCBiLCBjZW50ZXIpIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KGEpKSB7XG4gICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlO1xuICAgICAgdGhpcy5hID0gYTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0FycmF5ID0gZmFsc2U7XG4gICAgICB0aGlzLmEgPSBVdGlsLmluaXRWYWx1ZShhLCAxKTtcbiAgICAgIHRoaXMuYiA9IFV0aWwuaW5pdFZhbHVlKGIsIHRoaXMuYSk7XG4gICAgICB0aGlzLmNlbnRlciA9IFV0aWwuaW5pdFZhbHVlKGNlbnRlciwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlKGlzSW50ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgICByZXR1cm4gVXRpbC5nZXRSYW5kRnJvbUFycmF5KHRoaXMuYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5jZW50ZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGhVdGlsLnJhbmRvbUFUb0IodGhpcy5hLCB0aGlzLmIsIGlzSW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoVXRpbC5yYW5kb21GbG9hdGluZyh0aGlzLmEsIHRoaXMuYiwgaXNJbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IFNwYW4gb2JqZWN0XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBzZXRTcGFuVmFsdWVcbiAgICpcbiAgICogQHRvZG8gYSwgYiBhbmQgYyBzaG91bGQgYmUgJ01peGVkJyBvciAnTnVtYmVyJz9cbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZCB8IFNwYW59IGFcbiAgICogQHBhcmFtIHtNaXhlZH0gICAgICAgICAgICAgICBiXG4gICAqIEBwYXJhbSB7TWl4ZWR9ICAgICAgICAgICAgICAgY1xuICAgKlxuICAgKiBAcmV0dXJuIHtTcGFufVxuICAgKi9cbiAgc3RhdGljIHNldFNwYW5WYWx1ZShhLCBiLCBjKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBTcGFuKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNwYW4oYSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IFNwYW4oYSwgYik7XG4gICAgICAgIGVsc2UgcmV0dXJuIG5ldyBTcGFuKGEsIGIsIGMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIGEgU3BhbiwgaWYgdGhlIHBhcmFtIGlzIG5vdCBhIFNwYW4gaXQgd2lsbCByZXR1cm4gdGhlIGdpdmVuIHBhcmFtZXRlclxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5VdGlsXG4gICAqIEBtZXRob2QgZ2V0VmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZCB8IFNwYW59IHBhblxuICAgKlxuICAgKiBAcmV0dXJuIHtNaXhlZH0gdGhlIHZhbHVlIG9mIFNwYW4gT1IgdGhlIHBhcmFtZXRlciBpZiBpdCBpcyBub3QgYSBTcGFuXG4gICAqL1xuICBzdGF0aWMgZ2V0U3BhblZhbHVlKHBhbikge1xuICAgIHJldHVybiBwYW4gaW5zdGFuY2VvZiBTcGFuID8gcGFuLmdldFZhbHVlKCkgOiBwYW47XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBoYXNQcm9wKHRhcmdldCwga2V5KSB7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KGtleSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCB0aGUgcHJvdG90eXBlIGluIGEgZ2l2ZW4gcHJvdG90eXBlT2JqZWN0XG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCBzZXRQcm9wXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgcGFyYW0gYHRhcmdldGBcbiAgICogQHRvZG8gdHJhbnNsYXRlIGRlc3JpcHRpb24gZnJvbSBjaGluZXNlIHRvIGVuZ2xpc2hcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlT2JqZWN0IEFuIG9iamVjdCBvZiBzaW5nbGUgcHJvdG90eXBlc1xuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHRhcmdldFxuICAgKi9cbiAgc2V0UHJvcCh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykge1xuICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSBTcGFuLmdldFNwYW5WYWx1ZShwcm9wc1twcm9wXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfSxcblxuICAvKipcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIHNldFZlY3RvclZhbFxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yIHBhcmFtIGB0YXJnZXRgXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgcGFyYW0gYGNvbmZgXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZlxuICAgKi9cbiAgc2V0VmVjdG9yVmFsKHBhcnRpY2xlLCBjb25mID0gbnVsbCkge1xuICAgIGlmICghY29uZikgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInhcIikpIHBhcnRpY2xlLnAueCA9IGNvbmZbXCJ4XCJdO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ5XCIpKSBwYXJ0aWNsZS5wLnkgPSBjb25mW1wieVwiXTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2eFwiKSkgcGFydGljbGUudi54ID0gY29uZltcInZ4XCJdO1xuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJ2eVwiKSkgcGFydGljbGUudi55ID0gY29uZltcInZ5XCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImF4XCIpKSBwYXJ0aWNsZS5hLnggPSBjb25mW1wiYXhcIl07XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcImF5XCIpKSBwYXJ0aWNsZS5hLnkgPSBjb25mW1wiYXlcIl07XG5cbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwicFwiKSkgcGFydGljbGUucC5jb3B5KGNvbmZbXCJwXCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwidlwiKSkgcGFydGljbGUudi5jb3B5KGNvbmZbXCJ2XCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYVwiKSkgcGFydGljbGUuYS5jb3B5KGNvbmZbXCJhXCJdKTtcblxuICAgIGlmICh0aGlzLmhhc1Byb3AoY29uZiwgXCJwb3NpdGlvblwiKSkgcGFydGljbGUucC5jb3B5KGNvbmZbXCJwb3NpdGlvblwiXSk7XG4gICAgaWYgKHRoaXMuaGFzUHJvcChjb25mLCBcInZlbG9jaXR5XCIpKSBwYXJ0aWNsZS52LmNvcHkoY29uZltcInZlbG9jaXR5XCJdKTtcbiAgICBpZiAodGhpcy5oYXNQcm9wKGNvbmYsIFwiYWNjZWxlcmF0ZVwiKSkgcGFydGljbGUuYS5jb3B5KGNvbmZbXCJhY2NlbGVyYXRlXCJdKTtcbiAgfVxufTtcbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVhc2VMaW5lYXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgZWFzZUluUXVhZCh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyh2YWx1ZSwgMik7XG4gIH0sXG5cbiAgZWFzZU91dFF1YWQodmFsdWUpIHtcbiAgICByZXR1cm4gLShNYXRoLnBvdyh2YWx1ZSAtIDEsIDIpIC0gMSk7XG4gIH0sXG5cbiAgZWFzZUluT3V0UXVhZCh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdyh2YWx1ZSwgMik7XG5cbiAgICByZXR1cm4gLTAuNSAqICgodmFsdWUgLT0gMikgKiB2YWx1ZSAtIDIpO1xuICB9LFxuXG4gIGVhc2VJbkN1YmljKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHZhbHVlLCAzKTtcbiAgfSxcblxuICBlYXNlT3V0Q3ViaWModmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUgLSAxLCAzKSArIDE7XG4gIH0sXG5cbiAgZWFzZUluT3V0Q3ViaWModmFsdWUpIHtcbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3codmFsdWUsIDMpO1xuXG4gICAgcmV0dXJuIDAuNSAqIChNYXRoLnBvdyh2YWx1ZSAtIDIsIDMpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluUXVhcnQodmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDQpO1xuICB9LFxuXG4gIGVhc2VPdXRRdWFydCh2YWx1ZSkge1xuICAgIHJldHVybiAtKE1hdGgucG93KHZhbHVlIC0gMSwgNCkgLSAxKTtcbiAgfSxcblxuICBlYXNlSW5PdXRRdWFydCh2YWx1ZSkge1xuICAgIGlmICgodmFsdWUgLz0gMC41KSA8IDEpIHJldHVybiAwLjUgKiBNYXRoLnBvdyh2YWx1ZSwgNCk7XG5cbiAgICByZXR1cm4gLTAuNSAqICgodmFsdWUgLT0gMikgKiBNYXRoLnBvdyh2YWx1ZSwgMykgLSAyKTtcbiAgfSxcblxuICBlYXNlSW5TaW5lKHZhbHVlKSB7XG4gICAgcmV0dXJuIC1NYXRoLmNvcyh2YWx1ZSAqIE1hdGhVdGlsLlBJXzIpICsgMTtcbiAgfSxcblxuICBlYXNlT3V0U2luZSh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnNpbih2YWx1ZSAqIE1hdGhVdGlsLlBJXzIpO1xuICB9LFxuXG4gIGVhc2VJbk91dFNpbmUodmFsdWUpIHtcbiAgICByZXR1cm4gLTAuNSAqIChNYXRoLmNvcyhNYXRoLlBJICogdmFsdWUpIC0gMSk7XG4gIH0sXG5cbiAgZWFzZUluRXhwbyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IDAgOiBNYXRoLnBvdygyLCAxMCAqICh2YWx1ZSAtIDEpKTtcbiAgfSxcblxuICBlYXNlT3V0RXhwbyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMSA/IDEgOiAtTWF0aC5wb3coMiwgLTEwICogdmFsdWUpICsgMTtcbiAgfSxcblxuICBlYXNlSW5PdXRFeHBvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIDE7XG5cbiAgICBpZiAoKHZhbHVlIC89IDAuNSkgPCAxKSByZXR1cm4gMC41ICogTWF0aC5wb3coMiwgMTAgKiAodmFsdWUgLSAxKSk7XG5cbiAgICByZXR1cm4gMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAtLXZhbHVlKSArIDIpO1xuICB9LFxuXG4gIGVhc2VJbkNpcmModmFsdWUpIHtcbiAgICByZXR1cm4gLShNYXRoLnNxcnQoMSAtIHZhbHVlICogdmFsdWUpIC0gMSk7XG4gIH0sXG5cbiAgZWFzZU91dENpcmModmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KDEgLSBNYXRoLnBvdyh2YWx1ZSAtIDEsIDIpKTtcbiAgfSxcblxuICBlYXNlSW5PdXRDaXJjKHZhbHVlKSB7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIC0wLjUgKiAoTWF0aC5zcXJ0KDEgLSB2YWx1ZSAqIHZhbHVlKSAtIDEpO1xuICAgIHJldHVybiAwLjUgKiAoTWF0aC5zcXJ0KDEgLSAodmFsdWUgLT0gMikgKiB2YWx1ZSkgKyAxKTtcbiAgfSxcblxuICBlYXNlSW5CYWNrKHZhbHVlKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIHJldHVybiB2YWx1ZSAqIHZhbHVlICogKChzICsgMSkgKiB2YWx1ZSAtIHMpO1xuICB9LFxuXG4gIGVhc2VPdXRCYWNrKHZhbHVlKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIHJldHVybiAodmFsdWUgPSB2YWx1ZSAtIDEpICogdmFsdWUgKiAoKHMgKyAxKSAqIHZhbHVlICsgcykgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEJhY2sodmFsdWUpIHtcbiAgICBsZXQgcyA9IDEuNzAxNTg7XG4gICAgaWYgKCh2YWx1ZSAvPSAwLjUpIDwgMSkgcmV0dXJuIDAuNSAqICh2YWx1ZSAqIHZhbHVlICogKCgocyAqPSAxLjUyNSkgKyAxKSAqIHZhbHVlIC0gcykpO1xuICAgIHJldHVybiAwLjUgKiAoKHZhbHVlIC09IDIpICogdmFsdWUgKiAoKChzICo9IDEuNTI1KSArIDEpICogdmFsdWUgKyBzKSArIDIpO1xuICB9LFxuXG4gIGdldEVhc2luZyhlYXNlKSB7XG4gICAgaWYgKHR5cGVvZiBlYXNlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlYXNlO1xuICAgIGVsc2UgcmV0dXJuIHRoaXNbZWFzZV0gfHwgdGhpcy5lYXNlTGluZWFyO1xuICB9XG59O1xuIiwiaW1wb3J0IE1hdGhVdGlsIGZyb20gXCIuLi9tYXRoL01hdGhVdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlY3RvcjJEIHtcbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHRoaXMueCA9IHggfHwgMDtcbiAgICB0aGlzLnkgPSB5IHx8IDA7XG4gIH1cblxuICBzZXQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFgoeCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRZKHkpIHtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0R3JhZGllbnQoKSB7XG4gICAgaWYgKHRoaXMueCAhPT0gMCkgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIGVsc2UgaWYgKHRoaXMueSA+IDApIHJldHVybiBNYXRoVXRpbC5QSV8yO1xuICAgIGVsc2UgaWYgKHRoaXMueSA8IDApIHJldHVybiAtTWF0aFV0aWwuUElfMjtcbiAgfVxuXG4gIGNvcHkodikge1xuICAgIHRoaXMueCA9IHYueDtcbiAgICB0aGlzLnkgPSB2Lnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZCh2LCB3KSB7XG4gICAgaWYgKHcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkVmVjdG9ycyh2LCB3KTtcbiAgICB9XG5cbiAgICB0aGlzLnggKz0gdi54O1xuICAgIHRoaXMueSArPSB2Lnk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFhZKGEsIGIpIHtcbiAgICB0aGlzLnggKz0gYTtcbiAgICB0aGlzLnkgKz0gYjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkVmVjdG9ycyhhLCBiKSB7XG4gICAgdGhpcy54ID0gYS54ICsgYi54O1xuICAgIHRoaXMueSA9IGEueSArIGIueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3ViKHYsIHcpIHtcbiAgICBpZiAodyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJWZWN0b3JzKHYsIHcpO1xuICAgIH1cblxuICAgIHRoaXMueCAtPSB2Lng7XG4gICAgdGhpcy55IC09IHYueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3ViVmVjdG9ycyhhLCBiKSB7XG4gICAgdGhpcy54ID0gYS54IC0gYi54O1xuICAgIHRoaXMueSA9IGEueSAtIGIueTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGl2aWRlU2NhbGFyKHMpIHtcbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgdGhpcy54IC89IHM7XG4gICAgICB0aGlzLnkgLz0gcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXQoMCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBtdWx0aXBseVNjYWxhcihzKSB7XG4gICAgdGhpcy54ICo9IHM7XG4gICAgdGhpcy55ICo9IHM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG5lZ2F0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigtMSk7XG4gIH1cblxuICBkb3Qodikge1xuICAgIHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG4gIH1cblxuICBsZW5ndGhTcSgpIHtcbiAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgfVxuXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKSk7XG4gIH1cblxuICBkaXN0YW5jZVRvKHYpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodikpO1xuICB9XG5cbiAgcm90YXRlKHRoYSkge1xuICAgIGNvbnN0IHggPSB0aGlzLng7XG4gICAgY29uc3QgeSA9IHRoaXMueTtcblxuICAgIHRoaXMueCA9IHggKiBNYXRoLmNvcyh0aGEpICsgeSAqIE1hdGguc2luKHRoYSk7XG4gICAgdGhpcy55ID0gLXggKiBNYXRoLnNpbih0aGEpICsgeSAqIE1hdGguY29zKHRoYSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRpc3RhbmNlVG9TcXVhcmVkKHYpIHtcbiAgICBjb25zdCBkeCA9IHRoaXMueCAtIHYueDtcbiAgICBjb25zdCBkeSA9IHRoaXMueSAtIHYueTtcblxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgfVxuXG4gIGxlcnAodiwgYWxwaGEpIHtcbiAgICB0aGlzLnggKz0gKHYueCAtIHRoaXMueCkgKiBhbHBoYTtcbiAgICB0aGlzLnkgKz0gKHYueSAtIHRoaXMueSkgKiBhbHBoYTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZXF1YWxzKHYpIHtcbiAgICByZXR1cm4gdi54ID09PSB0aGlzLnggJiYgdi55ID09PSB0aGlzLnk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnggPSAwLjA7XG4gICAgdGhpcy55ID0gMC4wO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyRCh0aGlzLngsIHRoaXMueSk7XG4gIH1cbn1cbiIsIi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9iZWhhdmlvdXIvQmVoYXZpb3VyJyl9IEJlaGF2aW91ciAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL21hdGgvVmVjdG9yMkQnKX0gVmVjdG9yMkQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi91dGlscy9SZ2InKX0gUmdiICovXG5pbXBvcnQgUmdiIGZyb20gXCIuLi91dGlscy9SZ2JcIjtcbmltcG9ydCBQdWlkIGZyb20gXCIuLi91dGlscy9QdWlkXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFByb3BVdGlsIGZyb20gXCIuLi91dGlscy9Qcm9wVXRpbFwiO1xuaW1wb3J0IGVhc2UgZnJvbSBcIi4uL21hdGgvZWFzZVwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFydGljbGUge1xuICAvKiogQHR5cGUgc3RyaW5nICovXG4gIGlkID0gXCJcIjtcblxuICAvKiogQHR5cGUge3twOlZlY3RvcjJELHY6VmVjdG9yMkQsYTpWZWN0b3IyRH19ICovXG4gIG9sZCA9IG51bGw7XG5cbiAgLyoqIEB0eXBlIHtvYmplY3R9ICovXG4gIGRhdGEgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7QmVoYXZpb3VyW119ICovXG4gIGJlaGF2aW91cnMgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9ICovXG4gIHAgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9ICovXG4gIHYgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7VmVjdG9yMkR9ICovXG4gIGEgPSBudWxsO1xuXG4gIC8qKiBAdHlwZSB7UmdifSAqL1xuICByZ2IgPSBudWxsO1xuXG4gIC8qKlxuICAgKiB0aGUgUGFydGljbGUgY2xhc3NcbiAgICpcbiAgICogQGNsYXNzIFByb3Rvbi5QYXJ0aWNsZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHBPYmogdGhlIHBhcmFtZXRlcnMgb2JqZWN0O1xuICAgKiBmb3IgZXhhbXBsZSB7bGlmZTozLGRlYWQ6ZmFsc2V9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY2xlJ3MgaWQ7XG4gICAgICogQHByb3BlcnR5IGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBcIlBhcnRpY2xlXCI7XG4gICAgdGhpcy5pZCA9IFB1aWQuaWQodGhpcy5uYW1lKTtcbiAgICB0aGlzLm9sZCA9IHt9O1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IFtdO1xuXG4gICAgdGhpcy5wID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy52ID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5hID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5vbGQucCA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMub2xkLnYgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLm9sZC5hID0gbmV3IFZlY3RvcjJEKCk7XG5cbiAgICB0aGlzLnJnYiA9IG5ldyBSZ2IoKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgY29uZiAmJiBQcm9wVXRpbC5zZXRQcm9wKHRoaXMsIGNvbmYpO1xuICB9XG5cbiAgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMudi54LCAtdGhpcy52LnkpICogTWF0aFV0aWwuTjE4MF9QSTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMubGlmZSA9IEluZmluaXR5O1xuICAgIHRoaXMuYWdlID0gMDtcblxuICAgIHRoaXMuZGVhZCA9IGZhbHNlO1xuICAgIHRoaXMuc2xlZXAgPSBmYWxzZTtcbiAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgIHRoaXMuc3ByaXRlID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG5cbiAgICB0aGlzLmVuZXJneSA9IDE7IC8vIEVuZXJneSBMb3NzXG4gICAgdGhpcy5tYXNzID0gMTtcbiAgICB0aGlzLnJhZGl1cyA9IDEwO1xuICAgIHRoaXMuYWxwaGEgPSAxO1xuICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgIHRoaXMucm90YXRpb24gPSAwO1xuICAgIHRoaXMuY29sb3IgPSBudWxsO1xuXG4gICAgdGhpcy5wLnNldCgwLCAwKTtcbiAgICB0aGlzLnYuc2V0KDAsIDApO1xuICAgIHRoaXMuYS5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQucC5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQudi5zZXQoMCwgMCk7XG4gICAgdGhpcy5vbGQuYS5zZXQoMCwgMCk7XG4gICAgdGhpcy5lYXNpbmcgPSBlYXNlLmVhc2VMaW5lYXI7XG5cbiAgICB0aGlzLnJnYi5yZXNldCgpO1xuICAgIFV0aWwuZW1wdHlPYmplY3QodGhpcy5kYXRhKTtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlKHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgICAgdGhpcy5hcHBseUJlaGF2aW91cnModGltZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFnZSA8IHRoaXMubGlmZSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmVhc2luZyh0aGlzLmFnZSAvIHRoaXMubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5QmVoYXZpb3Vycyh0aW1lLCBpbmRleCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVoYXZpb3Vycy5sZW5ndGg7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYmVoYXZpb3Vyc1tpXSAmJiB0aGlzLmJlaGF2aW91cnNbaV0uYXBwbHlCZWhhdmlvdXIodGhpcywgdGltZSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyXG4gICAqL1xuICBhZGRCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgdGhpcy5iZWhhdmlvdXJzLnB1c2goYmVoYXZpb3VyKTtcblxuICAgIGlmIChiZWhhdmlvdXIuaGFzT3duUHJvcGVydHkoXCJwYXJlbnRzXCIpKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIGJlaGF2aW91ci5pbml0aWFsaXplKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyW119IGJlaGF2aW91cnNcbiAgICovXG4gIGFkZEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIGNvbnN0IGxlbmd0aCA9IGJlaGF2aW91cnMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IGJlaGF2aW91ciA9IHRoaXMuYmVoYXZpb3Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgYmVoYXZpb3VyLnBhcmVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUFsbEJlaGF2aW91cnMoKSB7XG4gICAgVXRpbC5lbXB0eUFycmF5KHRoaXMuYmVoYXZpb3Vycyk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSB0aGlzIHBhcnRpY2xlXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEB0eXBlZGVmICB7T2JqZWN0fSByZ2JPYmplY3RcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHIgcmVkIHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBnIGdyZWVuIHZhbHVlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBiIGJsdWUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIHJnYiBvYmplY3RcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uVXRpbFxuICAgKiBAbWV0aG9kIGhleFRvUmdiXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBoIGFueSBoZXggdmFsdWUsIGUuZy4gIzAwMDAwMCBvciAwMDAwMDAgZm9yIGJsYWNrXG4gICAqXG4gICAqIEByZXR1cm4ge3JnYk9iamVjdH1cbiAgICovXG4gIGhleFRvUmdiKGgpIHtcbiAgICBjb25zdCBoZXgxNiA9IGguY2hhckF0KDApID09PSBcIiNcIiA/IGguc3Vic3RyaW5nKDEsIDcpIDogaDtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4MTYuc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGhleDE2LnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXgxNi5zdWJzdHJpbmcoNCwgNiksIDE2KTtcblxuICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgfSxcblxuICAvKipcbiAgICogY29udmVydHMgYSByZ2IgdmFsdWUgdG8gYSByZ2Igc3RyaW5nXG4gICAqXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlV0aWxcbiAgICogQG1ldGhvZCByZ2JUb0hleFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IFByb3Rvbi5oZXhUb1JnYn0gcmdiIGEgcmdiIG9iamVjdCBsaWtlIGluIHtAbGluayBQcm90b24jUHJvdG9uLn1cbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSByZ2IoKVxuICAgKi9cbiAgcmdiVG9IZXgocmJnKSB7XG4gICAgcmV0dXJuIGByZ2IoJHtyYmcucn0sICR7cmJnLmd9LCAke3JiZy5ifSlgO1xuICB9LFxuXG4gIGdldEhleDE2RnJvbVBhcnRpY2xlKHApIHtcbiAgICByZXR1cm4gTnVtYmVyKHAucmdiLnIpICogNjU1MzYgKyBOdW1iZXIocC5yZ2IuZykgKiAyNTYgKyBOdW1iZXIocC5yZ2IuYik7XG4gIH1cbn07XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4vVmVjdG9yMkRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9sYXIyRCB7XG4gIGNvbnN0cnVjdG9yKHIsIHRoYSkge1xuICAgIHRoaXMuciA9IE1hdGguYWJzKHIpIHx8IDA7XG4gICAgdGhpcy50aGEgPSB0aGEgfHwgMDtcbiAgfVxuXG4gIHNldChyLCB0aGEpIHtcbiAgICB0aGlzLnIgPSByO1xuICAgIHRoaXMudGhhID0gdGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UihyKSB7XG4gICAgdGhpcy5yID0gcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRoYSh0aGEpIHtcbiAgICB0aGlzLnRoYSA9IHRoYTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvcHkocCkge1xuICAgIHRoaXMuciA9IHAucjtcbiAgICB0aGlzLnRoYSA9IHAudGhhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9WZWN0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyRCh0aGlzLmdldFgoKSwgdGhpcy5nZXRZKCkpO1xuICB9XG5cbiAgZ2V0WCgpIHtcbiAgICByZXR1cm4gdGhpcy5yICogTWF0aC5zaW4odGhpcy50aGEpO1xuICB9XG5cbiAgZ2V0WSgpIHtcbiAgICByZXR1cm4gLXRoaXMuciAqIE1hdGguY29zKHRoaXMudGhhKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICB0aGlzLnIgPSAxO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZXF1YWxzKHYpIHtcbiAgICByZXR1cm4gdi5yID09PSB0aGlzLnIgJiYgdi50aGEgPT09IHRoaXMudGhhO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5yID0gMC4wO1xuICAgIHRoaXMudGhhID0gMC4wO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQb2xhcjJEKHRoaXMuciwgdGhpcy50aGEpO1xuICB9XG59XG4iLCJjb25zdCBNYXQzID0ge1xuICBjcmVhdGUobWF0Mykge1xuICAgIGNvbnN0IG1hdCA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgaWYgKG1hdDMpIHRoaXMuc2V0KG1hdDMsIG1hdCk7XG5cbiAgICByZXR1cm4gbWF0O1xuICB9LFxuXG4gIHNldChtYXQxLCBtYXQyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIG1hdDJbaV0gPSBtYXQxW2ldO1xuXG4gICAgcmV0dXJuIG1hdDI7XG4gIH0sXG5cbiAgbXVsdGlwbHkobWF0LCBtYXQyLCBtYXQzKSB7XG4gICAgbGV0IGEwMCA9IG1hdFswXSxcbiAgICAgIGEwMSA9IG1hdFsxXSxcbiAgICAgIGEwMiA9IG1hdFsyXSxcbiAgICAgIGExMCA9IG1hdFszXSxcbiAgICAgIGExMSA9IG1hdFs0XSxcbiAgICAgIGEyMCA9IG1hdFs2XSxcbiAgICAgIGEyMSA9IG1hdFs3XSxcbiAgICAgIGIwMCA9IG1hdDJbMF0sXG4gICAgICBiMDEgPSBtYXQyWzFdLFxuICAgICAgYjAyID0gbWF0MlsyXSxcbiAgICAgIGIxMCA9IG1hdDJbM10sXG4gICAgICBiMTEgPSBtYXQyWzRdLFxuICAgICAgYjIwID0gbWF0Mls2XSxcbiAgICAgIGIyMSA9IG1hdDJbN107XG5cbiAgICBtYXQzWzBdID0gYjAwICogYTAwICsgYjAxICogYTEwO1xuICAgIG1hdDNbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTE7XG4gICAgbWF0M1syXSA9IGEwMiAqIGIwMjtcbiAgICBtYXQzWzNdID0gYjEwICogYTAwICsgYjExICogYTEwO1xuICAgIG1hdDNbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTE7XG4gICAgbWF0M1s2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGEyMDtcbiAgICBtYXQzWzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYTIxO1xuXG4gICAgcmV0dXJuIG1hdDM7XG4gIH0sXG5cbiAgaW52ZXJzZShtYXQsIG1hdDMpIHtcbiAgICBsZXQgYTAwID0gbWF0WzBdLFxuICAgICAgYTAxID0gbWF0WzFdLFxuICAgICAgYTEwID0gbWF0WzNdLFxuICAgICAgYTExID0gbWF0WzRdLFxuICAgICAgYTIwID0gbWF0WzZdLFxuICAgICAgYTIxID0gbWF0WzddLFxuICAgICAgYjAxID0gYTExLFxuICAgICAgYjExID0gLWExMCxcbiAgICAgIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMCxcbiAgICAgIGQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEsXG4gICAgICBpZDtcblxuICAgIGlkID0gMSAvIGQ7XG4gICAgbWF0M1swXSA9IGIwMSAqIGlkO1xuICAgIG1hdDNbMV0gPSAtYTAxICogaWQ7XG4gICAgbWF0M1szXSA9IGIxMSAqIGlkO1xuICAgIG1hdDNbNF0gPSBhMDAgKiBpZDtcbiAgICBtYXQzWzZdID0gYjIxICogaWQ7XG4gICAgbWF0M1s3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGlkO1xuXG4gICAgcmV0dXJuIG1hdDM7XG4gIH0sXG5cbiAgbXVsdGlwbHlWZWMyKG0sIHZlYywgbWF0Mykge1xuICAgIGxldCB4ID0gdmVjWzBdLFxuICAgICAgeSA9IHZlY1sxXTtcblxuICAgIG1hdDNbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgbVs2XTtcbiAgICBtYXQzWzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIG1bN107XG5cbiAgICByZXR1cm4gbWF0MztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWF0MztcbiIsImltcG9ydCBTcGFuIGZyb20gXCIuL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4vTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlTcGFuIGV4dGVuZHMgU3BhbiB7XG4gIGNvbnN0cnVjdG9yKGNvbG9yKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9hcnIgPSBVdGlsLnRvQXJyYXkoY29sb3IpO1xuICB9XG5cbiAgZ2V0VmFsdWUoKSB7XG4gICAgY29uc3QgdmFsID0gVXRpbC5nZXRSYW5kRnJvbUFycmF5KHRoaXMuX2Fycik7XG4gICAgcmV0dXJuIHZhbCA9PT0gXCJyYW5kb21cIiB8fCB2YWwgPT09IFwiUmFuZG9tXCIgPyBNYXRoVXRpbC5yYW5kb21Db2xvcigpIDogdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb2xvciBpcyBhbiBpbnN0YW5jZSBvZiBQcm90b24uQXJyYXlTcGFuLCBpZiBub3QgaXQgbWFrZXMgYSBuZXcgaW5zdGFuY2VcbiAgICpcbiAgICogQG1ldGhvZCBzZXRTcGFuVmFsdWVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUFycmF5U3BhbihhcnIpIHtcbiAgICBpZiAoIWFycikgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoYXJyIGluc3RhbmNlb2YgQXJyYXlTcGFuKSByZXR1cm4gYXJyO1xuICAgIGVsc2UgcmV0dXJuIG5ldyBBcnJheVNwYW4oYXJyKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjdGFuZ2xlIHtcbiAgY29uc3RydWN0b3IoeCwgeSwgdywgaCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIHRoaXMud2lkdGggPSB3O1xuICAgIHRoaXMuaGVpZ2h0ID0gaDtcblxuICAgIHRoaXMuYm90dG9tID0gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG4gICAgdGhpcy5yaWdodCA9IHRoaXMueCArIHRoaXMud2lkdGg7XG4gIH1cblxuICBjb250YWlucyh4LCB5KSB7XG4gICAgaWYgKHggPD0gdGhpcy5yaWdodCAmJiB4ID49IHRoaXMueCAmJiB5IDw9IHRoaXMuYm90dG9tICYmIHkgPj0gdGhpcy55KSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBwZXIgc2Vjb25kIGVtaXNzaW9uIChhIFtwYXJ0aWNsZV0vYiBbc10pO1xuICAgKiBAbmFtZXNwYWNlXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFJhdGVcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheSB8IE51bWJlciB8IFNwYW59IG51bXBhbiB0aGUgbnVtYmVyIG9mIGVhY2ggZW1pc3Npb247XG4gICAqIEBwYXJhbSB7QXJyYXkgfCBOdW1iZXIgfCBTcGFufSB0aW1lcGFuIHRoZSB0aW1lIG9mIGVhY2ggZW1pc3Npb247XG4gICAqIGZvciBleGFtcGxlOiBuZXcgUmF0ZShuZXcgU3BhbigxMCwgMjApLCBuZXcgU3BhbiguMSwgLjI1KSk7XG4gICAqL1xuICBjb25zdHJ1Y3RvcihudW1wYW4sIHRpbWVwYW4pIHtcbiAgICB0aGlzLm51bVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKG51bXBhbiwgMSkpO1xuICAgIHRoaXMudGltZVBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKFV0aWwuaW5pdFZhbHVlKHRpbWVwYW4sIDEpKTtcblxuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLm5leHRUaW1lID0gMDtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMubmV4dFRpbWUgPSB0aGlzLnRpbWVQYW4uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldFZhbHVlKHRpbWUpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuc3RhcnRUaW1lID49IHRoaXMubmV4dFRpbWUpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICAgIHRoaXMubmV4dFRpbWUgPSB0aGlzLnRpbWVQYW4uZ2V0VmFsdWUoKTtcblxuICAgICAgaWYgKHRoaXMubnVtUGFuLmIgPT09IDEpIHtcbiAgICAgICAgaWYgKHRoaXMubnVtUGFuLmdldFZhbHVlKGZhbHNlKSA+IDAuNSkgcmV0dXJuIDE7XG4gICAgICAgIGVsc2UgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1QYW4uZ2V0VmFsdWUodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEluaXRpYWxpemUge1xuICByZXNldCgpIHt9XG5cbiAgaW5pdChlbWl0dGVyLCBwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplKHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0aWFsaXplKGVtaXR0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN1YiBjbGFzcyBpbml0XG4gIGluaXRpYWxpemUodGFyZ2V0KSB7fVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGEsIGIsIGMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5saWZlUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoYSwgYiwgYyk7XG4gICAgdGhpcy5uYW1lID0gXCJMaWZlXCI7XG4gIH1cblxuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIGlmICh0aGlzLmxpZmVQYW4uYSA9PT0gSW5maW5pdHkpIHRhcmdldC5saWZlID0gSW5maW5pdHk7XG4gICAgZWxzZSB0YXJnZXQubGlmZSA9IHRoaXMubGlmZVBhbi5nZXRWYWx1ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmVjdG9yID0gbmV3IFZlY3RvcjJEKDAsIDApO1xuICAgIHRoaXMucmFuZG9tID0gMDtcbiAgICB0aGlzLmNyb3NzVHlwZSA9IFwiZGVhZFwiO1xuICAgIHRoaXMuYWxlcnQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7fVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy52ZWN0b3IgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50Wm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih4LCB5KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLng7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIGNyb3NzaW5nKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb3JyeSwgUG9pbnRab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3NpbmcgbWV0aG9kIVwiKTtcbiAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUG9pbnRab25lIGZyb20gXCIuLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IEluaXRpYWxpemUgZnJvbSBcIi4vSW5pdGlhbGl6ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb3NpdGlvbiBleHRlbmRzIEluaXRpYWxpemUge1xuICBjb25zdHJ1Y3Rvcih6b25lKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnpvbmUgPSBVdGlsLmluaXRWYWx1ZSh6b25lLCBuZXcgUG9pbnRab25lKCkpO1xuICAgIHRoaXMubmFtZSA9IFwiUG9zaXRpb25cIjtcbiAgfVxuXG4gIHJlc2V0KHpvbmUpIHtcbiAgICB0aGlzLnpvbmUgPSBVdGlsLmluaXRWYWx1ZSh6b25lLCBuZXcgUG9pbnRab25lKCkpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSh0YXJnZXQpIHtcbiAgICB0aGlzLnpvbmUuZ2V0UG9zaXRpb24oKTtcblxuICAgIHRhcmdldC5wLnggPSB0aGlzLnpvbmUudmVjdG9yLng7XG4gICAgdGFyZ2V0LnAueSA9IHRoaXMuem9uZS52ZWN0b3IueTtcbiAgfVxufVxuIiwiaW1wb3J0IFByb3RvbiBmcm9tIFwiLi4vY29yZS9Qcm90b25cIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5pbXBvcnQgUG9sYXIyRCBmcm9tIFwiLi4vbWF0aC9Qb2xhcjJEXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2NpdHkgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3IocnBhbiwgdGhhcGFuLCB0eXBlKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuclBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHJwYW4pO1xuICAgIHRoaXMudGhhUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUodGhhcGFuKTtcbiAgICB0aGlzLnR5cGUgPSBVdGlsLmluaXRWYWx1ZSh0eXBlLCBcInZlY3RvclwiKTtcblxuICAgIHRoaXMubmFtZSA9IFwiVmVsb2NpdHlcIjtcbiAgfVxuXG4gIHJlc2V0KHJwYW4sIHRoYXBhbiwgdHlwZSkge1xuICAgIHRoaXMuclBhbiA9IFNwYW4uc2V0U3BhblZhbHVlKHJwYW4pO1xuICAgIHRoaXMudGhhUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUodGhhcGFuKTtcbiAgICB0aGlzLnR5cGUgPSBVdGlsLmluaXRWYWx1ZSh0eXBlLCBcInZlY3RvclwiKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZVZlbG9jaXR5KHZyKSB7XG4gICAgcmV0dXJuIHZyICogUHJvdG9uLk1FQVNVUkU7XG4gIH1cblxuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IFwicFwiIHx8IHRoaXMudHlwZSA9PT0gXCJQXCIgfHwgdGhpcy50eXBlID09PSBcInBvbGFyXCIpIHtcbiAgICAgIGNvbnN0IHBvbGFyMmQgPSBuZXcgUG9sYXIyRChcbiAgICAgICAgdGhpcy5ub3JtYWxpemVWZWxvY2l0eSh0aGlzLnJQYW4uZ2V0VmFsdWUoKSksXG4gICAgICAgIHRoaXMudGhhUGFuLmdldFZhbHVlKCkgKiBNYXRoVXRpbC5QSV8xODBcbiAgICAgICk7XG5cbiAgICAgIHRhcmdldC52LnggPSBwb2xhcjJkLmdldFgoKTtcbiAgICAgIHRhcmdldC52LnkgPSBwb2xhcjJkLmdldFkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnYueCA9IHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy5yUGFuLmdldFZhbHVlKCkpO1xuICAgICAgdGFyZ2V0LnYueSA9IHRoaXMubm9ybWFsaXplVmVsb2NpdHkodGhpcy50aGFQYW4uZ2V0VmFsdWUoKSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hc3MgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3IoYSwgYiwgYykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tYXNzUGFuID0gU3Bhbi5zZXRTcGFuVmFsdWUoYSwgYiwgYyk7XG4gICAgdGhpcy5uYW1lID0gXCJNYXNzXCI7XG4gIH1cblxuICBpbml0aWFsaXplKHRhcmdldCkge1xuICAgIHRhcmdldC5tYXNzID0gdGhpcy5tYXNzUGFuLmdldFZhbHVlKCk7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaXVzIGV4dGVuZHMgSW5pdGlhbGl6ZSB7XG4gIGNvbnN0cnVjdG9yKGEsIGIsIGMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmFkaXVzID0gU3Bhbi5zZXRTcGFuVmFsdWUoYSwgYiwgYyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlJhZGl1c1wiO1xuICB9XG5cbiAgcmVzZXQoYSwgYiwgYykge1xuICAgIHRoaXMucmFkaXVzID0gU3Bhbi5zZXRTcGFuVmFsdWUoYSwgYiwgYyk7XG4gIH1cblxuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUucmFkaXVzID0gdGhpcy5yYWRpdXMuZ2V0VmFsdWUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFJhZGl1cyA9IHBhcnRpY2xlLnJhZGl1cztcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBBcnJheVNwYW4gZnJvbSBcIi4uL21hdGgvQXJyYXlTcGFuXCI7XG5pbXBvcnQgSW5pdGlhbGl6ZSBmcm9tIFwiLi9Jbml0aWFsaXplXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvZHkgZXh0ZW5kcyBJbml0aWFsaXplIHtcbiAgY29uc3RydWN0b3IoaW1hZ2UsIHcsIGgpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5pbWFnZSA9IHRoaXMuc2V0U3BhblZhbHVlKGltYWdlKTtcbiAgICB0aGlzLncgPSBVdGlsLmluaXRWYWx1ZSh3LCAyMCk7XG4gICAgdGhpcy5oID0gVXRpbC5pbml0VmFsdWUoaCwgdGhpcy53KTtcbiAgICB0aGlzLm5hbWUgPSBcIkJvZHlcIjtcbiAgfVxuXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBjb25zdCBpbWFnZVRhcmdldCA9IHRoaXMuaW1hZ2UuZ2V0VmFsdWUoKTtcblxuICAgIGlmICh0eXBlb2YgaW1hZ2VUYXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB7XG4gICAgICAgIHdpZHRoOiB0aGlzLncsXG4gICAgICAgIGhlaWdodDogdGhpcy5oLFxuICAgICAgICBzcmM6IGltYWdlVGFyZ2V0LFxuICAgICAgICBpc0lubmVyOiB0cnVlLFxuICAgICAgICBpbm5lcjogdHJ1ZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGljbGUuYm9keSA9IGltYWdlVGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIHNldFNwYW5WYWx1ZShpbWFnZSkge1xuICAgIHJldHVybiBpbWFnZSBpbnN0YW5jZW9mIEFycmF5U3BhbiA/IGltYWdlIDogbmV3IEFycmF5U3BhbihpbWFnZSk7XG4gIH1cbn1cbiIsImltcG9ydCBQcm90b24gZnJvbSBcIi4uL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IGVhc2UgZnJvbSBcIi4uL21hdGgvZWFzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWhhdmlvdXIge1xuICBzdGF0aWMgaWQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgQmVoYXZpb3VyIGNsYXNzIGlzIHRoZSBiYXNlIGZvciB0aGUgb3RoZXIgQmVoYXZpb3VyXG4gICAqXG4gICAqIEBtZW1iZXJvZiEgLVxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEBhbGlhcyBQcm90b24uQmVoYXZpb3VyXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsaWZlIFx0dGhlIGJlaGF2aW91cnMgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZWFzaW5nIFx0VGhlIGJlaGF2aW91cidzIGRlY2F5aW5nIHRyZW5kLCBmb3IgZXhhbXBsZSBlYXNlLmVhc2VPdXRRdWFydFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gIGlkIFx0XHRUaGUgYmVoYXZpb3VycyBpZFxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKiBAcHJvcGVydHkge051bWJlcn0gIGFnZT0wIFx0SG93IGxvbmcgdGhlIHBhcnRpY2xlIHNob3VsZCBiZSAnYWxpZmUnXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSAgZW5lcmd5PTFcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBkZWFkPWZhbHNlIFRoZSBwYXJ0aWNsZSBpcyBkZWFkIGF0IGZpcnN0XG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9ICAgcGFyZW50cyBcdFRoZSBiZWhhdmlvdXIncyBwYXJlbnRzIGFycmF5XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSAgbmFtZSBcdFRoZSBiZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IobGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5saWZlID0gVXRpbC5pbml0VmFsdWUobGlmZSwgSW5maW5pdHkpO1xuICAgIHRoaXMuZWFzaW5nID0gZWFzZS5nZXRFYXNpbmcoZWFzaW5nKTtcblxuICAgIHRoaXMuYWdlID0gMDtcbiAgICB0aGlzLmVuZXJneSA9IDE7XG4gICAgdGhpcy5kZWFkID0gZmFsc2U7XG4gICAgdGhpcy5wYXJlbnRzID0gW107XG5cbiAgICB0aGlzLmlkID0gYEJlaGF2aW91cl8ke0JlaGF2aW91ci5pZCsrfWA7XG4gICAgdGhpcy5uYW1lID0gXCJCZWhhdmlvdXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMubGlmZSA9IFV0aWwuaW5pdFZhbHVlKGxpZmUsIEluZmluaXR5KTtcbiAgICB0aGlzLmVhc2luZyA9IGVhc2UuZ2V0RWFzaW5nKGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgZm9yY2UgYnkgMToxMDA7XG4gICAqXG4gICAqIEBtZXRob2Qgbm9ybWFsaXplRm9yY2VcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSBmb3JjZVxuICAgKi9cbiAgbm9ybWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICByZXR1cm4gZm9yY2UubXVsdGlwbHlTY2FsYXIoUHJvdG9uLk1FQVNVUkUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIHZhbHVlIGJ5IDE6MTAwO1xuICAgKlxuICAgKiBAbWV0aG9kIG5vcm1hbGl6ZVZhbHVlXG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcbiAgICovXG4gIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICogUHJvdG9uLk1FQVNVUkU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYmVoYXZpb3VyJ3MgcGFyYW1ldGVycyBmb3IgYWxsIHBhcnRpY2xlc1xuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge31cblxuICAvKipcbiAgICogY29tcHV0aW5nIGxpZmUgY3ljbGVcbiAgICpcbiAgICogQG1ldGhvZCBjYWxjdWxhdGVcbiAgICogQG1lbWJlcm9mIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBjYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5hZ2UgKz0gdGltZTtcblxuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB7XG4gICAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgICB0aGlzLmRlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5lYXNpbmcocGFydGljbGUuYWdlIC8gcGFydGljbGUubGlmZSk7XG4gICAgICB0aGlzLmVuZXJneSA9IE1hdGgubWF4KDEgLSBzY2FsZSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBiZWhhdmlvdXJcbiAgICpcbiAgICogQG1ldGhvZCBkZXN0cm95XG4gICAqIEBtZW1iZXJvZiBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBpbnN0YW5jZVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFyZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5wYXJlbnRzW2ldLnJlbW92ZUJlaGF2aW91cih0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudHMubGVuZ3RoID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JjZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uRm9yY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ4XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmeVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmeCwgZnksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG4gICAgdGhpcy5uYW1lID0gXCJGb3JjZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZnhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoZngsIGZ5LCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmZvcmNlID0gdGhpcy5ub3JtYWxpemVGb3JjZShuZXcgVmVjdG9yMkQoZngsIGZ5KSk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkZvcmNlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuYS5hZGQodGhpcy5mb3JjZSk7XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF0dHJhY3Rpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogVGhpcyBiZWhhdmlvdXIgbGV0IHRoZSBwYXJ0aWNsZXMgZm9sbG93IG9uZSBzcGVjaWZpYyBQcm90b24uVmVjdG9yMkRcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkF0dHJhY3Rpb25cbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvblxuICAgKiBAcHJvcGVydHkge051bWJlcn0gcmFkaXVzXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBmb3JjZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gcmFkaXVzU3FcbiAgICogQHByb3BlcnR5IHtQcm90b24uVmVjdG9yMkR9IGF0dHJhY3Rpb25Gb3JjZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gbGVuZ3RoU3FcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMudGFyZ2V0UG9zaXRpb24gPSBVdGlsLmluaXRWYWx1ZSh0YXJnZXRQb3NpdGlvbiwgbmV3IFZlY3RvcjJEKCkpO1xuICAgIHRoaXMucmFkaXVzID0gVXRpbC5pbml0VmFsdWUocmFkaXVzLCAxMDAwKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLnJhZGl1c1NxID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZSA9IG5ldyBWZWN0b3IyRCgpO1xuICAgIHRoaXMubGVuZ3RoU3EgPSAwO1xuXG4gICAgdGhpcy5uYW1lID0gXCJBdHRyYWN0aW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQXR0cmFjdGlvblxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnZm9yY2UnIGFuZCAncmFkaXVzJ1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5WZWN0b3IyRH0gdGFyZ2V0UG9zaXRpb24gdGhlIGF0dHJhY3Rpb24gcG9pbnQgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcmFkaXVzPTEwMDBdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy50YXJnZXRQb3NpdGlvbiA9IFV0aWwuaW5pdFZhbHVlKHRhcmdldFBvc2l0aW9uLCBuZXcgVmVjdG9yMkQoKSk7XG4gICAgdGhpcy5yYWRpdXMgPSBVdGlsLmluaXRWYWx1ZShyYWRpdXMsIDEwMDApO1xuICAgIHRoaXMuZm9yY2UgPSBVdGlsLmluaXRWYWx1ZSh0aGlzLm5vcm1hbGl6ZVZhbHVlKGZvcmNlKSwgMTAwKTtcblxuICAgIHRoaXMucmFkaXVzU3EgPSB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzO1xuICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlID0gbmV3IFZlY3RvcjJEKCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IDA7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5BdHRyYWN0aW9uXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UuY29weSh0aGlzLnRhcmdldFBvc2l0aW9uKTtcbiAgICB0aGlzLmF0dHJhY3Rpb25Gb3JjZS5zdWIocGFydGljbGUucCk7XG4gICAgdGhpcy5sZW5ndGhTcSA9IHRoaXMuYXR0cmFjdGlvbkZvcmNlLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGhTcSA+IDAuMDAwMDQgJiYgdGhpcy5sZW5ndGhTcSA8IHRoaXMucmFkaXVzU3EpIHtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm5vcm1hbGl6ZSgpO1xuICAgICAgdGhpcy5hdHRyYWN0aW9uRm9yY2UubXVsdGlwbHlTY2FsYXIoMSAtIHRoaXMubGVuZ3RoU3EgLyB0aGlzLnJhZGl1c1NxKTtcbiAgICAgIHRoaXMuYXR0cmFjdGlvbkZvcmNlLm11bHRpcGx5U2NhbGFyKHRoaXMuZm9yY2UpO1xuXG4gICAgICBwYXJ0aWNsZS5hLmFkZCh0aGlzLmF0dHJhY3Rpb25Gb3JjZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVmVjdG9yMkQgZnJvbSBcIi4uL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZG9tRHJpZnQgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBCZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBSYW5kb21EcmlmdFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRYIFx0XHRcdFx0WCB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkcmlmdFkgIFx0XHRcdFx0WSB2YWx1ZSBvZiB0aGUgbmV3IFZlY3RvcjJEXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSBcdFx0XHRcdEhvdyBtdWNoIGRlbGF5IHRoZSBkcmlmdCBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdGltZSBUaGUgdGltZSBvZiB0aGUgZHJpZnRcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkcmlmdFgsIGRyaWZ0WSwgZGVsYXksIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLm5hbWUgPSBcIlJhbmRvbURyaWZ0XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNSYW5kb21EcmlmdFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRyaWZ0WCBcdFx0XHRcdFggdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZHJpZnRZICBcdFx0XHRcdFkgdmFsdWUgb2YgdGhlIG5ldyBWZWN0b3IyRFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsYXkgXHRcdFx0XHRIb3cgbXVjaCBkZWxheSB0aGUgZHJpZnQgc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGRyaWZ0WCwgZHJpZnRZLCBkZWxheSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5wYW5Gb2NlID0gbmV3IFZlY3RvcjJEKGRyaWZ0WCwgZHJpZnRZKTtcbiAgICB0aGlzLnBhbkZvY2UgPSB0aGlzLm5vcm1hbGl6ZUZvcmNlKHRoaXMucGFuRm9jZSk7XG4gICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUmFuZG9tRHJpZnRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0XHR0aW1lIHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSBcdFx0XHRpbmRleCB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgcGFydGljbGUuZGF0YS50aW1lICs9IHRpbWU7XG5cbiAgICBpZiAocGFydGljbGUuZGF0YS50aW1lID49IHRoaXMuZGVsYXkpIHtcbiAgICAgIHBhcnRpY2xlLmEuYWRkWFkoXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS54LCB0aGlzLnBhbkZvY2UueCksXG4gICAgICAgIE1hdGhVdGlsLnJhbmRvbUFUb0IoLXRoaXMucGFuRm9jZS55LCB0aGlzLnBhbkZvY2UueSlcbiAgICAgICk7XG5cbiAgICAgIHBhcnRpY2xlLmRhdGEudGltZSA9IDA7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRm9yY2UgZnJvbSBcIi4vRm9yY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3Jhdml0eSBleHRlbmRzIEZvcmNlIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uI1Byb3Rvbi5Gb3JjZVxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5HcmF2aXR5XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBnIFx0XHRcdFx0XHRcdFx0R3Jhdml0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGcsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKDAsIGcsIGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5uYW1lID0gXCJHcmF2aXR5XCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uR3Jhdml0eVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGcgXHRcdFx0XHRcdFx0XHRHcmF2aXR5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChnLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCgwLCBnLCBsaWZlLCBlYXNpbmcpO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsaXNpb24gZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGFmdGVyIGNvbGxpc2lvblxuICAgKlxuICAgKiBAY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uUGFydGljbGV9IHBhcnRpY2xlXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcml0Y2xlfSBvdGhlclBhcnRpY2xlXG4gICAqL1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNvbGxpc2lvblxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gdG8gbWFzc1xuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5FbWl0dGVyfSBcdFtlbWl0dGVyPW51bGxdIFx0XHR0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFx0XHRbbWFzcz10cnVlXVxuICAgKiBAcGFyYW0ge0NhbGxiYWNrfVx0IFx0W2NhbGxiYWNrPW51bGxdXHRcdHRoZSBjYWxsYmFjayBhZnRlciB0aGUgY29sbGlzaW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZW1pdHRlciwgbWFzcywgY2FsbGJhY2ssIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG4gICAgdGhpcy5yZXNldChlbWl0dGVyLCBtYXNzLCBjYWxsYmFjayk7XG4gICAgdGhpcy5uZXdQb29sID0gW107XG4gICAgdGhpcy5wb29sID0gW107XG4gICAgdGhpcy5uYW1lID0gXCJDb2xsaXNpb25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sbGlzaW9uXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiB0byBtYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkVtaXR0ZXJ9IFx0W2VtaXR0ZXI9bnVsbF0gXHRcdHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gXHRcdFttYXNzPXRydWVdXG4gICAqIEBwYXJhbSB7Q2FsbGJhY2t9XHQgXHRbY2FsbGJhY2s9bnVsbF1cdFx0dGhlIGNhbGxiYWNrIGFmdGVyIHRoZSBjb2xsaXNpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRcdFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KGVtaXR0ZXIsIG1hc3MsIGNhbGxiYWNrLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmVtaXR0ZXIgPSBVdGlsLmluaXRWYWx1ZShlbWl0dGVyLCBudWxsKTtcbiAgICB0aGlzLm1hc3MgPSBVdGlsLmluaXRWYWx1ZShtYXNzLCB0cnVlKTtcbiAgICB0aGlzLmNhbGxiYWNrID0gVXRpbC5pbml0VmFsdWUoY2FsbGJhY2ssIG51bGwpO1xuXG4gICAgdGhpcy5jb2xsaXNpb25Qb29sID0gW107XG4gICAgdGhpcy5kZWx0YSA9IG5ldyBWZWN0b3IyRCgpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sbGlzaW9uXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICBpZiAodGhpcy5lbWl0dGVyKSB7XG4gICAgICBVdGlsLnNsaWNlQXJyYXkodGhpcy5lbWl0dGVyLnBhcnRpY2xlcywgaW5kZXgsIHRoaXMubmV3UG9vbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFV0aWwuc2xpY2VBcnJheSh0aGlzLnBvb2wsIGluZGV4LCB0aGlzLm5ld1Bvb2wpO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubmV3UG9vbC5sZW5ndGg7XG4gICAgbGV0IG90aGVyUGFydGljbGU7XG4gICAgbGV0IGxlbmd0aFNxO1xuICAgIGxldCBvdmVybGFwO1xuICAgIGxldCB0b3RhbE1hc3M7XG4gICAgbGV0IGF2ZXJhZ2VNYXNzMSwgYXZlcmFnZU1hc3MyO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBvdGhlclBhcnRpY2xlID0gdGhpcy5uZXdQb29sW2ldO1xuXG4gICAgICBpZiAob3RoZXJQYXJ0aWNsZSAhPT0gcGFydGljbGUpIHtcbiAgICAgICAgdGhpcy5kZWx0YS5jb3B5KG90aGVyUGFydGljbGUucCk7XG4gICAgICAgIHRoaXMuZGVsdGEuc3ViKHBhcnRpY2xlLnApO1xuXG4gICAgICAgIGxlbmd0aFNxID0gdGhpcy5kZWx0YS5sZW5ndGhTcSgpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHBhcnRpY2xlLnJhZGl1cyArIG90aGVyUGFydGljbGUucmFkaXVzO1xuXG4gICAgICAgIGlmIChsZW5ndGhTcSA8PSBkaXN0YW5jZSAqIGRpc3RhbmNlKSB7XG4gICAgICAgICAgb3ZlcmxhcCA9IGRpc3RhbmNlIC0gTWF0aC5zcXJ0KGxlbmd0aFNxKTtcbiAgICAgICAgICBvdmVybGFwICs9IDAuNTtcblxuICAgICAgICAgIHRvdGFsTWFzcyA9IHBhcnRpY2xlLm1hc3MgKyBvdGhlclBhcnRpY2xlLm1hc3M7XG4gICAgICAgICAgYXZlcmFnZU1hc3MxID0gdGhpcy5tYXNzID8gb3RoZXJQYXJ0aWNsZS5tYXNzIC8gdG90YWxNYXNzIDogMC41O1xuICAgICAgICAgIGF2ZXJhZ2VNYXNzMiA9IHRoaXMubWFzcyA/IHBhcnRpY2xlLm1hc3MgLyB0b3RhbE1hc3MgOiAwLjU7XG5cbiAgICAgICAgICBwYXJ0aWNsZS5wLmFkZChcbiAgICAgICAgICAgIHRoaXMuZGVsdGFcbiAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgpXG4gICAgICAgICAgICAgIC5tdWx0aXBseVNjYWxhcihvdmVybGFwICogLWF2ZXJhZ2VNYXNzMSlcbiAgICAgICAgICApO1xuICAgICAgICAgIG90aGVyUGFydGljbGUucC5hZGQodGhpcy5kZWx0YS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihvdmVybGFwICogYXZlcmFnZU1hc3MyKSk7XG5cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2socGFydGljbGUsIG90aGVyUGFydGljbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jvc3Nab25lIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgY29tZSB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgem9uZVxuICAgKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3Jvc3Nab25lXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlpvbmV9IHpvbmUgXHRcdFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0XHRcdHdoYXQgaGFwcGVucyBpZiB0aGUgcGFydGljbGVzIHBhc3MgdGhlIHpvbmUgLSBhbGxvd2VkIHN0cmluZ3M6IGRlYWQgfCBib3VuZCB8IGNyb3NzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBcdFx0W2xpZmU9SW5maW5pdHldIFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gXHRcdFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3Ioem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldCh6b25lLCBjcm9zc1R5cGUpO1xuICAgIHRoaXMubmFtZSA9IFwiQ3Jvc3Nab25lXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5ab25lfSB6b25lIFx0XHRcdFx0Y2FuIGJlIGFueSBQcm90b24uWm9uZSAtIGUuZy4gUHJvdG9uLlJlY3Rab25lKClcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbY3Jvc3NUeXBlPWRlYWRdIFx0d2hhdCBoYXBwZW5zIGlmIHRoZSBwYXJ0aWNsZXMgcGFzcyB0aGUgem9uZSAtIGFsbG93ZWQgc3RyaW5nczogZGVhZCB8IGJvdW5kIHwgY3Jvc3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFx0XHRbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFx0XHRbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoem9uZSwgY3Jvc3NUeXBlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIHRoaXMuem9uZS5jcm9zc1R5cGUgPSBVdGlsLmluaXRWYWx1ZShjcm9zc1R5cGUsIFwiZGVhZFwiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ3Jvc3Nab25lXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBpbnRlZ3JhdGUgdGltZSAxL21zXG4gICAqIEBwYXJhbSB7SW50fSB0aGUgcGFydGljbGUgaW5kZXhcbiAgICovXG4gIGFwcGx5QmVoYXZpb3VyKHBhcnRpY2xlLCB0aW1lLCBpbmRleCkge1xuICAgIHRoaXMuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBpbmRleCk7XG4gICAgdGhpcy56b25lLmNyb3NzaW5nKHBhcnRpY2xlKTtcbiAgfVxufVxuIiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFscGhhIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5BbHBoYVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJBbHBoYVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkFscGhhXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLnNhbWUgPSBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLmEgPSBTcGFuLnNldFNwYW5WYWx1ZShVdGlsLmluaXRWYWx1ZShhLCAxKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoYik7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IGFscGhhIHZhbHVlIG9mIHRoZSBwYXJ0aWNsZVxuICAgKlxuICAgKiBAbWV0aG9kIGluaXRpYWxpemVcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQWxwaGFcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZSBBIHNpbmdsZSBQcm90b24gZ2VuZXJhdGVkIHBhcnRpY2xlXG4gICAqL1xuICBpbml0aWFsaXplKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuZGF0YS5hbHBoYUEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICh0aGlzLnNhbWUpIHBhcnRpY2xlLmRhdGEuYWxwaGFCID0gcGFydGljbGUuZGF0YS5hbHBoYUE7XG4gICAgZWxzZSBwYXJ0aWNsZS5kYXRhLmFscGhhQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQWxwaGFcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgcGFydGljbGUuYWxwaGEgPSBwYXJ0aWNsZS5kYXRhLmFscGhhQiArIChwYXJ0aWNsZS5kYXRhLmFscGhhQSAtIHBhcnRpY2xlLmRhdGEuYWxwaGFCKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgaWYgKHBhcnRpY2xlLmFscGhhIDwgMC4wMDEpIHBhcnRpY2xlLmFscGhhID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IFNwYW4gZnJvbSBcIi4uL21hdGgvU3BhblwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vQmVoYXZpb3VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjYWxlIGV4dGVuZHMgQmVoYXZpb3VyIHtcbiAgLyoqXG4gICAqIEBtZW1iZXJvZiEgUHJvdG9uI1xuICAgKiBAYXVnbWVudHMgUHJvdG9uLkJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIFByb3Rvbi5TY2FsZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJyBhbmQgJ2InXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFRoZSBCZWhhdmlvdXIgbmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMucmVzZXQoYSwgYik7XG4gICAgdGhpcy5uYW1lID0gXCJTY2FsZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlNjYWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgbGlmZSwgZWFzaW5nKSB7XG4gICAgdGhpcy5zYW1lID0gYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgMSkpO1xuICAgIHRoaXMuYiA9IFNwYW4uc2V0U3BhblZhbHVlKGIpO1xuXG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlNjYWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnNjYWxlQSA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzID0gcGFydGljbGUucmFkaXVzO1xuICAgIHBhcnRpY2xlLmRhdGEuc2NhbGVCID0gdGhpcy5zYW1lID8gcGFydGljbGUuZGF0YS5zY2FsZUEgOiB0aGlzLmIuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uU2NhbGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuICAgIHBhcnRpY2xlLnNjYWxlID0gcGFydGljbGUuZGF0YS5zY2FsZUIgKyAocGFydGljbGUuZGF0YS5zY2FsZUEgLSBwYXJ0aWNsZS5kYXRhLnNjYWxlQikgKiB0aGlzLmVuZXJneTtcblxuICAgIGlmIChwYXJ0aWNsZS5zY2FsZSA8IDAuMDAwMSkgcGFydGljbGUuc2NhbGUgPSAwO1xuICAgIHBhcnRpY2xlLnJhZGl1cyA9IHBhcnRpY2xlLmRhdGEub2xkUmFkaXVzICogcGFydGljbGUuc2NhbGU7XG4gIH1cbn1cbiIsImltcG9ydCBTcGFuIGZyb20gXCIuLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3RhdGUgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLlJvdGF0ZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdhJywgJ2InIGFuZCAnc3R5bGUnXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbaW5mbHVlbmNlPVZlbG9jaXR5XSBUaGUgcm90YXRpb24ncyBpbmZsdWVuY2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtzdHlsZT10b11cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpbmZsdWVuY2UsIGIsIHN0eWxlLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlcihsaWZlLCBlYXNpbmcpO1xuXG4gICAgdGhpcy5yZXNldChpbmZsdWVuY2UsIGIsIHN0eWxlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlJvdGF0ZVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLlJvdGF0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHRvZG8gYWRkIGRlc2NyaXB0aW9uIGZvciAnYScsICdiJyBhbmQgJ3N0eWxlJ1xuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3N0eWxlPXRvXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKi9cbiAgcmVzZXQoYSwgYiwgc3R5bGUsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuc2FtZSA9IGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgdGhpcy5hID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYSwgXCJWZWxvY2l0eVwiKSk7XG4gICAgdGhpcy5iID0gU3Bhbi5zZXRTcGFuVmFsdWUoVXRpbC5pbml0VmFsdWUoYiwgMCkpO1xuICAgIHRoaXMuc3R5bGUgPSBVdGlsLmluaXRWYWx1ZShzdHlsZSwgXCJ0b1wiKTtcblxuICAgIGxpZmUgJiYgc3VwZXIucmVzZXQobGlmZSwgZWFzaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzIGZvciBhbGwgcGFydGljbGVzXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Sb3RhdGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIHBhcnRpY2xlLnJvdGF0aW9uID0gdGhpcy5hLmdldFZhbHVlKCk7XG4gICAgcGFydGljbGUuZGF0YS5yb3RhdGlvbkEgPSB0aGlzLmEuZ2V0VmFsdWUoKTtcblxuICAgIGlmICghdGhpcy5zYW1lKSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQiA9IHRoaXMuYi5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Sb3RhdGVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gXHRcdFx0dGltZSB0aGUgaW50ZWdyYXRlIHRpbWUgMS9tc1xuICAgKiBAcGFyYW0ge0ludH0gXHRcdFx0aW5kZXggdGhlIHBhcnRpY2xlIGluZGV4XG4gICAqL1xuICBhcHBseUJlaGF2aW91cihwYXJ0aWNsZSwgdGltZSwgaW5kZXgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZShwYXJ0aWNsZSwgdGltZSwgaW5kZXgpO1xuXG4gICAgaWYgKCF0aGlzLnNhbWUpIHtcbiAgICAgIGlmICh0aGlzLnN0eWxlID09PSBcInRvXCIgfHwgdGhpcy5zdHlsZSA9PT0gXCJUT1wiIHx8IHRoaXMuc3R5bGUgPT09IFwiX1wiKSB7XG4gICAgICAgIHBhcnRpY2xlLnJvdGF0aW9uICs9XG4gICAgICAgICAgcGFydGljbGUuZGF0YS5yb3RhdGlvbkIgKyAocGFydGljbGUuZGF0YS5yb3RhdGlvbkEgLSBwYXJ0aWNsZS5kYXRhLnJvdGF0aW9uQikgKiB0aGlzLmVuZXJneTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRpY2xlLnJvdGF0aW9uICs9IHBhcnRpY2xlLmRhdGEucm90YXRpb25CO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5hLmEgPT09IFwiVlwiIHx8IHRoaXMuYS5hID09PSBcIlZlbG9jaXR5XCIgfHwgdGhpcy5hLmEgPT09IFwidlwiKSB7XG4gICAgICAvLyBiZXRhLi4uXG4gICAgICBwYXJ0aWNsZS5yb3RhdGlvbiA9IHBhcnRpY2xlLmdldERpcmVjdGlvbigpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgQXJyYXlTcGFuIGZyb20gXCIuLi9tYXRoL0FycmF5U3BhblwiO1xuaW1wb3J0IEJlaGF2aW91ciBmcm9tIFwiLi9CZWhhdmlvdXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sb3IgZXh0ZW5kcyBCZWhhdmlvdXIge1xuICAvKipcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24uQmVoYXZpb3VyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAYWxpYXMgUHJvdG9uLkNvbG9yXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYSB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7UHJvdG9uLkFycmF5U3BhbiB8IFN0cmluZ30gYiB0aGUgc3RyaW5nIHNob3VsZCBiZSBhIGhleCBlLmcuICMwMDAwMDAgZm9yIGJsYWNrXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGEsIGIsIGxpZmUsIGVhc2luZykge1xuICAgIHN1cGVyKGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLnJlc2V0KGEsIGIpO1xuICAgIHRoaXMubmFtZSA9IFwiQ29sb3JcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGlzIGJlaGF2aW91cidzIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI1Byb3Rvbi5Db2xvclxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBhIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtQcm90b24uQXJyYXlTcGFuIHwgU3RyaW5nfSBiIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGEgaGV4IGUuZy4gIzAwMDAwMCBmb3IgYmxhY2tcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhLCBiLCBsaWZlLCBlYXNpbmcpIHtcbiAgICB0aGlzLmEgPSBBcnJheVNwYW4uY3JlYXRlQXJyYXlTcGFuKGEpO1xuICAgIHRoaXMuYiA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW4oYik7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJlaGF2aW91cidzIHBhcmFtZXRlcnMgZm9yIGFsbCBwYXJ0aWNsZXNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0aWFsaXplXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkNvbG9yXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1Byb3Rvbi5QYXJ0aWNsZX0gcGFydGljbGVcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5jb2xvciA9IHRoaXMuYS5nZXRWYWx1ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEuY29sb3JBID0gQ29sb3JVdGlsLmhleFRvUmdiKHBhcnRpY2xlLmNvbG9yKTtcblxuICAgIGlmICh0aGlzLmIpIHBhcnRpY2xlLmRhdGEuY29sb3JCID0gQ29sb3JVdGlsLmhleFRvUmdiKHRoaXMuYi5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGlzIGJlaGF2aW91ciBmb3IgYWxsIHBhcnRpY2xlcyBldmVyeSB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgYXBwbHlCZWhhdmlvdXJcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uQ29sb3JcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuYikge1xuICAgICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgICAgcGFydGljbGUucmdiLnIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLnIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5yKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmcgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmcgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5nKSAqIHRoaXMuZW5lcmd5O1xuICAgICAgcGFydGljbGUucmdiLmIgPSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iICsgKHBhcnRpY2xlLmRhdGEuY29sb3JBLmIgLSBwYXJ0aWNsZS5kYXRhLmNvbG9yQi5iKSAqIHRoaXMuZW5lcmd5O1xuXG4gICAgICBwYXJ0aWNsZS5yZ2IuciA9IHBhcnRpY2xlLnJnYi5yIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuZyA9IHBhcnRpY2xlLnJnYi5nIDw8IDA7XG4gICAgICBwYXJ0aWNsZS5yZ2IuYiA9IHBhcnRpY2xlLnJnYi5iIDw8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLnJnYi5yID0gcGFydGljbGUuZGF0YS5jb2xvckEucjtcbiAgICAgIHBhcnRpY2xlLnJnYi5nID0gcGFydGljbGUuZGF0YS5jb2xvckEuZztcbiAgICAgIHBhcnRpY2xlLnJnYi5iID0gcGFydGljbGUuZGF0YS5jb2xvckEuYjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi4vbWF0aC9TcGFuXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5jb25zdCBDSEFOR0lORyA9IFwiY2hhbmdpbmdcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3ljbG9uZSBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIFByb3Rvbi5CZWhhdmlvdXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uQ3ljbG9uZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGZvcmNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gXHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFuZ2xlLCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLnNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkN5Y2xvbmVcIjtcbiAgfVxuXG4gIHNldEFuZ2xlQW5kRm9yY2UoYW5nbGUsIGZvcmNlKSB7XG4gICAgdGhpcy5mb3JjZSA9IENIQU5HSU5HO1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG5cbiAgICBpZiAoYW5nbGUgPT09IFwicmlnaHRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IE1hdGhVdGlsLlBJIC8gMjtcbiAgICB9IGVsc2UgaWYgKGFuZ2xlID09PSBcImxlZnRcIikge1xuICAgICAgdGhpcy5hbmdsZSA9IC1NYXRoVXRpbC5QSSAvIDI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA9PT0gXCJyYW5kb21cIikge1xuICAgICAgdGhpcy5hbmdsZSA9IFwicmFuZG9tXCI7XG4gICAgfSBlbHNlIGlmIChhbmdsZSBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBcInNwYW5cIjtcbiAgICAgIHRoaXMuc3BhbiA9IGFuZ2xlO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUpIHtcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBTdHJpbmcoZm9yY2UpLnRvTG93ZXJDYXNlKCkgPT09IFwiY2hhbmdpbmdcIiB8fFxuICAgICAgU3RyaW5nKGZvcmNlKS50b0xvd2VyQ2FzZSgpID09PSBcImNoYW5nXCIgfHxcbiAgICAgIFN0cmluZyhmb3JjZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJhdXRvXCJcbiAgICApIHtcbiAgICAgIHRoaXMuZm9yY2UgPSBDSEFOR0lORztcbiAgICB9IGVsc2UgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLmZvcmNlID0gZm9yY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoaXMgYmVoYXZpb3VyJ3MgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZS5lYXNlTGluZWFyXSBcdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChhbmdsZSwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSSAvIDI7XG4gICAgdGhpcy5zZXRBbmdsZUFuZEZvcmNlKGFuZ2xlLCBmb3JjZSk7XG4gICAgbGlmZSAmJiBzdXBlci5yZXNldChsaWZlLCBlYXNpbmcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZShwYXJ0aWNsZSkge1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiKSB7XG4gICAgICBwYXJ0aWNsZS5kYXRhLmNhbmdsZSA9IE1hdGhVdGlsLnJhbmRvbUFUb0IoLU1hdGhVdGlsLlBJLCBNYXRoVXRpbC5QSSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFuZ2xlID09PSBcInNwYW5cIikge1xuICAgICAgcGFydGljbGUuZGF0YS5jYW5nbGUgPSB0aGlzLnNwYW4uZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUgPSBuZXcgVmVjdG9yMkQoMCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhpcyBiZWhhdmlvdXIgZm9yIGFsbCBwYXJ0aWNsZXMgZXZlcnkgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIGFwcGx5QmVoYXZpb3VyXG4gICAqIEBtZW1iZXJvZiBQcm90b24jUHJvdG9uLkN5Y2xvbmVcbiAgICogQGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5jYWxjdWxhdGUocGFydGljbGUsIHRpbWUsIGluZGV4KTtcblxuICAgIGxldCBsZW5ndGg7XG4gICAgbGV0IGdyYWRpZW50ID0gcGFydGljbGUudi5nZXRHcmFkaWVudCgpO1xuICAgIGlmICh0aGlzLmFuZ2xlID09PSBcInJhbmRvbVwiIHx8IHRoaXMuYW5nbGUgPT09IFwic3BhblwiKSB7XG4gICAgICBncmFkaWVudCArPSBwYXJ0aWNsZS5kYXRhLmNhbmdsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JhZGllbnQgKz0gdGhpcy5hbmdsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JjZSA9PT0gQ0hBTkdJTkcpIHtcbiAgICAgIGxlbmd0aCA9IHBhcnRpY2xlLnYubGVuZ3RoKCkgLyAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZm9yY2U7XG4gICAgfVxuXG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnggPSBsZW5ndGggKiBNYXRoLmNvcyhncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lLnkgPSBsZW5ndGggKiBNYXRoLnNpbihncmFkaWVudCk7XG4gICAgcGFydGljbGUuZGF0YS5jeWNsb25lID0gdGhpcy5ub3JtYWxpemVGb3JjZShwYXJ0aWNsZS5kYXRhLmN5Y2xvbmUpO1xuICAgIHBhcnRpY2xlLmEuYWRkKHBhcnRpY2xlLmRhdGEuY3ljbG9uZSk7XG4gIH1cbn1cbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gXCIuL0F0dHJhY3Rpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwdWxzaW9uIGV4dGVuZHMgQXR0cmFjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgb3BwaXNpdGUgb2YgUHJvdG9uLkF0dHJhY3Rpb24gLSB0dXJucyB0aGUgZm9yY2VcbiAgICpcbiAgICogQG1lbWJlcm9mISBQcm90b24jXG4gICAqIEBhdWdtZW50cyBQcm90b24jUHJvdG9uLkF0dHJhY3Rpb25cbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBhbGlhcyBQcm90b24uUmVwdWxzaW9uXG4gICAqXG4gICAqIEB0b2RvIGFkZCBkZXNjcmlwdGlvbiBmb3IgJ2ZvcmNlJyBhbmQgJ3JhZGl1cydcbiAgICpcbiAgICogQHBhcmFtIHtQcm90b24uVmVjdG9yMkR9IHRhcmdldFBvc2l0aW9uIHRoZSBhdHRyYWN0aW9uIHBvaW50IGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3JhZGl1cz0xMDAwXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldIFx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2UuZWFzZUxpbmVhcl0gXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge051bWJlcn0gZm9yY2VcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgVGhlIEJlaGF2aW91ciBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIodGFyZ2V0UG9zaXRpb24sIGZvcmNlLCByYWRpdXMsIGxpZmUsIGVhc2luZyk7XG5cbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICAgIHRoaXMubmFtZSA9IFwiUmVwdWxzaW9uXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNQcm90b24uUmVwdWxzaW9uXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAdG9kbyBhZGQgZGVzY3JpcHRpb24gZm9yICdmb3JjZScgYW5kICdyYWRpdXMnXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvdG9uLlZlY3RvcjJEfSB0YXJnZXRQb3NpdGlvbiB0aGUgYXR0cmFjdGlvbiBwb2ludCBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW2ZvcmNlPTEwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtyYWRpdXM9MTAwMF1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XSBcdFx0XHRcdHRoaXMgYmVoYXZpb3VyJ3MgbGlmZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW2Vhc2luZz1lYXNlLmVhc2VMaW5lYXJdIFx0dGhpcyBiZWhhdmlvdXIncyBlYXNpbmdcbiAgICovXG4gIHJlc2V0KHRhcmdldFBvc2l0aW9uLCBmb3JjZSwgcmFkaXVzLCBsaWZlLCBlYXNpbmcpIHtcbiAgICBzdXBlci5yZXNldCh0YXJnZXRQb3NpdGlvbiwgZm9yY2UsIHJhZGl1cywgbGlmZSwgZWFzaW5nKTtcbiAgICB0aGlzLmZvcmNlICo9IC0xO1xuICB9XG59XG4iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbHMvVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuLi9tYXRoL1ZlY3RvcjJEXCI7XG5pbXBvcnQgQmVoYXZpb3VyIGZyb20gXCIuL0JlaGF2aW91clwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmF2aXR5V2VsbCBleHRlbmRzIEJlaGF2aW91ciB7XG4gIC8qKlxuICAgKiBAbWVtYmVyb2YhIFByb3RvbiNcbiAgICogQGF1Z21lbnRzIEJlaGF2aW91clxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGFsaWFzIEdyYXZpdHlXZWxsXG4gICAqXG4gICAqIEBwYXJhbSB7VmVjdG9yMkR9IFtjZW50ZXJQb2ludD1uZXcgVmVjdG9yMkRdIFRoZSBwb2ludCBpbiB0aGUgY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZm9yY2U9MTAwXVx0XHRcdFx0XHRUaGUgZm9yY2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtsaWZlPUluZmluaXR5XVx0XHRcdFx0dGhpcyBiZWhhdmlvdXIncyBsaWZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbZWFzaW5nPWVhc2VMaW5lYXJdXHR0aGlzIGJlaGF2aW91cidzIGVhc2luZ1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBUaGUgQmVoYXZpb3VyIG5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNlbnRlclBvaW50LCBmb3JjZSwgbGlmZSwgZWFzaW5nKSB7XG4gICAgc3VwZXIobGlmZSwgZWFzaW5nKTtcblxuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkdyYXZpdHlXZWxsXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBiZWhhdmlvdXIncyBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICogQG1lbWJlcm9mIFByb3RvbiNHcmF2aXR5V2VsbFxuICAgKiBAaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3IyRH0gW2NlbnRlclBvaW50PW5ldyBWZWN0b3IyRF0gVGhlIHBvaW50IGluIHRoZSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtmb3JjZT0xMDBdXHRcdFx0XHRcdFRoZSBmb3JjZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW2xpZmU9SW5maW5pdHldXHRcdFx0XHR0aGlzIGJlaGF2aW91cidzIGxpZmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtlYXNpbmc9ZWFzZUxpbmVhcl1cdHRoaXMgYmVoYXZpb3VyJ3MgZWFzaW5nXG4gICAqL1xuICByZXNldChjZW50ZXJQb2ludCwgZm9yY2UsIGxpZmUsIGVhc2luZykge1xuICAgIHRoaXMuZGlzdGFuY2VWZWMgPSBuZXcgVmVjdG9yMkQoKTtcbiAgICB0aGlzLmNlbnRlclBvaW50ID0gVXRpbC5pbml0VmFsdWUoY2VudGVyUG9pbnQsIG5ldyBWZWN0b3IyRCgpKTtcbiAgICB0aGlzLmZvcmNlID0gVXRpbC5pbml0VmFsdWUodGhpcy5ub3JtYWxpemVWYWx1ZShmb3JjZSksIDEwMCk7XG5cbiAgICBsaWZlICYmIHN1cGVyLnJlc2V0KGxpZmUsIGVhc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGluaXRpYWxpemUocGFydGljbGUpIHt9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoaXMgYmVoYXZpb3VyIGZvciBhbGwgcGFydGljbGVzIGV2ZXJ5IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBhcHBseUJlaGF2aW91clxuICAgKiBAbWVtYmVyb2YgUHJvdG9uI0dyYXZpdHlXZWxsXG4gICAqIEBpbnN0YW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnRpY2xlfSBwYXJ0aWNsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhlIGludGVncmF0ZSB0aW1lIDEvbXNcbiAgICogQHBhcmFtIHtJbnR9IHRoZSBwYXJ0aWNsZSBpbmRleFxuICAgKi9cbiAgYXBwbHlCZWhhdmlvdXIocGFydGljbGUsIHRpbWUsIGluZGV4KSB7XG4gICAgdGhpcy5kaXN0YW5jZVZlYy5zZXQodGhpcy5jZW50ZXJQb2ludC54IC0gcGFydGljbGUucC54LCB0aGlzLmNlbnRlclBvaW50LnkgLSBwYXJ0aWNsZS5wLnkpO1xuICAgIGNvbnN0IGRpc3RhbmNlU3EgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aFNxKCk7XG5cbiAgICBpZiAoZGlzdGFuY2VTcSAhPT0gMCkge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlVmVjLmxlbmd0aCgpO1xuICAgICAgY29uc3QgZmFjdG9yID0gKHRoaXMuZm9yY2UgKiB0aW1lKSAvIChkaXN0YW5jZVNxICogZGlzdGFuY2UpO1xuXG4gICAgICBwYXJ0aWNsZS52LnggKz0gZmFjdG9yICogdGhpcy5kaXN0YW5jZVZlYy54O1xuICAgICAgcGFydGljbGUudi55ICs9IGZhY3RvciAqIHRoaXMuZGlzdGFuY2VWZWMueTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBQcm9wVXRpbCBmcm9tIFwiLi4vdXRpbHMvUHJvcFV0aWxcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL0luaXRpYWxpemVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXRpYWxpemUoZW1pdHRlciwgcGFydGljbGUsIGluaXRpYWxpemVzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gaW5pdGlhbGl6ZXMubGVuZ3RoO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5pdGlhbGl6ZXNbaV0gaW5zdGFuY2VvZiBJbml0aWFsaXplKSB7XG4gICAgICAgIGluaXRpYWxpemVzW2ldLmluaXQoZW1pdHRlciwgcGFydGljbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSk7XG4gIH0sXG5cbiAgLy8gaW5pdFxuICBpbml0KGVtaXR0ZXIsIHBhcnRpY2xlLCBpbml0aWFsaXplKSB7XG4gICAgUHJvcFV0aWwuc2V0UHJvcChwYXJ0aWNsZSwgaW5pdGlhbGl6ZSk7XG4gICAgUHJvcFV0aWwuc2V0VmVjdG9yVmFsKHBhcnRpY2xlLCBpbml0aWFsaXplKTtcbiAgfSxcblxuICBiaW5kRW1pdHRlcihlbWl0dGVyLCBwYXJ0aWNsZSkge1xuICAgIGlmIChlbWl0dGVyLmJpbmRFbWl0dGVyKSB7XG4gICAgICBwYXJ0aWNsZS5wLmFkZChlbWl0dGVyLnApO1xuICAgICAgcGFydGljbGUudi5hZGQoZW1pdHRlci52KTtcbiAgICAgIHBhcnRpY2xlLmEuYWRkKGVtaXR0ZXIuYSk7XG4gICAgICBwYXJ0aWNsZS52LnJvdGF0ZShNYXRoVXRpbC5kZWdyZWVUcmFuc2Zvcm0oZW1pdHRlci5yb3RhdGlvbikpO1xuICAgIH1cbiAgfVxufTtcbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgUHVpZCBmcm9tIFwiLi4vdXRpbHMvUHVpZFwiO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gXCIuLi9jb3JlL1BhcnRpY2xlXCI7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyIGZyb20gXCIuLi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCI7XG5cbmltcG9ydCBSYXRlIGZyb20gXCIuLi9pbml0aWFsaXplL1JhdGVcIjtcbmltcG9ydCBJbml0aWFsaXplVXRpbCBmcm9tIFwiLi4vaW5pdGlhbGl6ZS9Jbml0aWFsaXplVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgUGFydGljbGUge1xuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyBlbWl0IHBhcnRpY2xlcy5cbiAgICpcbiAgICogSXQgd2lsbCBkaXNwYXRjaCBmb2xsb3cgZXZlbnRzOlxuICAgKiBQQVJUSUNMRV9DUkVBVEVEXG4gICAqIFBBUlRJQ0xFX1VQREFUQVxuICAgKiBQQVJUSUNMRV9ERUFEXG4gICAqXG4gICAqIEBjbGFzcyBFbWl0dGVyXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZiB0aGUgcGFyYW1ldGVycyBvYmplY3Q7XG4gICAqIGZvciBleGFtcGxlIHtkYW1waW5nOjAuMDEsYmluZEVtaXR0ZXI6ZmFsc2V9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25mID0ge30pIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG4gICAgdGhpcy5pbml0aWFsaXplcyA9IFtdO1xuXG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy5lbWl0U3BlZWQgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnJpY3Rpb24gY29lZmZpY2llbnQgZm9yIGFsbCBwYXJ0aWNsZSBlbWl0IGJ5IFRoaXM7XG4gICAgICogQHByb3BlcnR5IGRhbXBpbmdcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDAuMDA2XG4gICAgICovXG4gICAgdGhpcy5kYW1waW5nID0gMC4wMDY7XG5cbiAgICAvKipcbiAgICAgKiBJZiBiaW5kRW1pdHRlciB0aGUgcGFydGljbGVzIGNhbiBiaW5kIHRoaXMgZW1pdHRlcidzIHByb3BlcnR5O1xuICAgICAqIEBwcm9wZXJ0eSBiaW5kRW1pdHRlclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICB0aGlzLmJpbmRFbWl0dGVyID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHBlciBzZWNvbmQgZW1pdCAoYSBbcGFydGljbGVdL2IgW3NdKTtcbiAgICAgKiBAcHJvcGVydHkgcmF0ZVxuICAgICAqIEB0eXBlIHtSYXRlfVxuICAgICAqIEBkZWZhdWx0IFJhdGUoMSwgLjEpXG4gICAgICovXG4gICAgdGhpcy5yYXRlID0gbmV3IFJhdGUoMSwgMC4xKTtcblxuICAgIHRoaXMubmFtZSA9IFwiRW1pdHRlclwiO1xuICAgIHRoaXMuaWQgPSBQdWlkLmlkKHRoaXMubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgZW1pdCBwYXJ0aWNsZVxuICAgKiBAbWV0aG9kIGVtaXRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGVtaXRUaW1lIGJlZ2luIGVtaXQgdGltZTtcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxpZmUgdGhlIGxpZmUgb2YgdGhpcyBlbWl0dGVyXG4gICAqL1xuICBlbWl0KHRvdGFsVGltZSwgbGlmZSkge1xuICAgIHRoaXMuc3RvcGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0VGltZSA9IDA7XG4gICAgdGhpcy50b3RhbFRpbWUgPSBVdGlsLmluaXRWYWx1ZSh0b3RhbFRpbWUsIEluZmluaXR5KTtcblxuICAgIGlmIChsaWZlID09PSB0cnVlIHx8IGxpZmUgPT09IFwibGlmZVwiIHx8IGxpZmUgPT09IFwiZGVzdHJveVwiKSB7XG4gICAgICB0aGlzLmxpZmUgPSB0b3RhbFRpbWUgPT09IFwib25jZVwiID8gMSA6IHRoaXMudG90YWxUaW1lO1xuICAgIH0gZWxzZSBpZiAoIWlzTmFOKGxpZmUpKSB7XG4gICAgICB0aGlzLmxpZmUgPSBsaWZlO1xuICAgIH1cbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0b3AgZW1pdGluZ1xuICAgKiBAbWV0aG9kIHN0b3BcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy50b3RhbFRpbWUgPSAtMTtcbiAgICB0aGlzLmVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnN0b3BlZCA9IHRydWU7XG4gIH1cblxuICBwcmVFbWl0KHRpbWUpIHtcbiAgICBsZXQgb2xkU3RvcGVkID0gdGhpcy5zdG9wZWQ7XG4gICAgbGV0IG9sZEVtaXRUaW1lID0gdGhpcy5lbWl0VGltZTtcbiAgICBsZXQgb2xkVG90YWxUaW1lID0gdGhpcy50b3RhbFRpbWU7XG5cbiAgICB0aGlzLnN0b3BlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdFRpbWUgPSAwO1xuICAgIHRoaXMudG90YWxUaW1lID0gdGltZTtcbiAgICB0aGlzLnJhdGUuaW5pdCgpO1xuXG4gICAgY29uc3Qgc3RlcCA9IDAuMDE2NztcbiAgICB3aGlsZSAodGltZSA+IHN0ZXApIHtcbiAgICAgIHRpbWUgLT0gc3RlcDtcbiAgICAgIHRoaXMudXBkYXRlKHN0ZXApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcGVkID0gb2xkU3RvcGVkO1xuICAgIHRoaXMuZW1pdFRpbWUgPSBvbGRFbWl0VGltZSArIE1hdGgubWF4KHRpbWUsIDApO1xuICAgIHRoaXMudG90YWxUaW1lID0gb2xkVG90YWxUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBjdXJyZW50IGFsbCBwYXJ0aWNsZXNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxQYXJ0aWNsZXNcbiAgICovXG4gIHJlbW92ZUFsbFBhcnRpY2xlcygpIHtcbiAgICBsZXQgaSA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB0aGlzLnBhcnRpY2xlc1tpXS5kZWFkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgaW5pdGlhbGl6ZSB0byB0aGlzIGVtaXR0ZXJcbiAgICogQG1ldGhvZCBhZGRTZWxmSW5pdGlhbGl6ZVxuICAgKi9cbiAgYWRkU2VsZkluaXRpYWxpemUoaW5pdGlhbGl6ZSkge1xuICAgIGlmIChpbml0aWFsaXplW1wiaW5pdFwiXSkge1xuICAgICAgaW5pdGlhbGl6ZS5pbml0KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmluaXRBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBJbml0aWFsaXplIHRvIHBhcnRpY2xlcztcbiAgICpcbiAgICogeW91IGNhbiB1c2UgaW5pdGlhbGl6ZXMgYXJyYXk6Zm9yIGV4YW1wbGUgZW1pdHRlci5hZGRJbml0aWFsaXplKGluaXRpYWxpemUxLGluaXRpYWxpemUyLGluaXRpYWxpemUzKTtcbiAgICogQG1ldGhvZCBhZGRJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZX0gaW5pdGlhbGl6ZSBsaWtlIHRoaXMgbmV3IFJhZGl1cygxLCAxMilcbiAgICovXG4gIGFkZEluaXRpYWxpemUoLi4ucmVzdCkge1xuICAgIGxldCBpID0gcmVzdC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgdGhpcy5pbml0aWFsaXplcy5wdXNoKHJlc3RbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgSW5pdGlhbGl6ZVxuICAgKiBAbWV0aG9kIHJlbW92ZUluaXRpYWxpemVcbiAgICogQHBhcmFtIHtJbml0aWFsaXplfSBpbml0aWFsaXplIGEgaW5pdGlhbGl6ZVxuICAgKi9cbiAgcmVtb3ZlSW5pdGlhbGl6ZShpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcy5pbmRleE9mKGluaXRpYWxpemVyKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5pbml0aWFsaXplcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgSW5pdGlhbGl6ZXNcbiAgICogQG1ldGhvZCByZW1vdmVJbml0aWFsaXplcnNcbiAgICovXG4gIHJlbW92ZUFsbEluaXRpYWxpemVycygpIHtcbiAgICBVdGlsLmVtcHR5QXJyYXkodGhpcy5pbml0aWFsaXplcyk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIHRoZSBCZWhhdmlvdXIgdG8gcGFydGljbGVzO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkQmVoYXZpb3VyKEJlaGF2aW91cjEsQmVoYXZpb3VyMixCZWhhdmlvdXIzKTtcbiAgICogQG1ldGhvZCBhZGRCZWhhdmlvdXJcbiAgICogQHBhcmFtIHtCZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IENvbG9yKCdyYW5kb20nKVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKC4uLnJlc3QpIHtcbiAgICBsZXQgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IGJlaGF2aW91ciA9IHJlc3RbaV07XG4gICAgICB0aGlzLmJlaGF2aW91cnMucHVzaChiZWhhdmlvdXIpO1xuICAgICAgaWYgKGJlaGF2aW91ci5wYXJlbnRzKSBiZWhhdmlvdXIucGFyZW50cy5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIEJlaGF2aW91clxuICAgKiBAbWV0aG9kIHJlbW92ZUJlaGF2aW91clxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcbiAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIGlmIChiZWhhdmlvdXIucGFyZW50cykge1xuICAgICAgaW5kZXggPSBiZWhhdmlvdXIucGFyZW50cy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIucGFyZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIGJlaGF2aW91cnNcbiAgICogQG1ldGhvZCByZW1vdmVBbGxCZWhhdmlvdXJzXG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZW1wdHlBcnJheSh0aGlzLmJlaGF2aW91cnMpO1xuICB9XG5cbiAgLy8gZW1pdHRlciB1cGRhdGVcbiAgdXBkYXRlKHRpbWUpIHtcbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuICAgIGlmICh0aGlzLmFnZSA+PSB0aGlzLmxpZmUgfHwgdGhpcy5kZWFkKSB0aGlzLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuZW1pdHRpbmcodGltZSk7XG4gICAgdGhpcy5pbnRlZ3JhdGUodGltZSk7XG4gIH1cblxuICBpbnRlZ3JhdGUodGltZSkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IGRhbXBpbmcgPSAxIC0gdGhpcy5kYW1waW5nO1xuICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHRoaXMsIHRpbWUsIGRhbXBpbmcpO1xuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuICAgIGxldCBpLCBwYXJ0aWNsZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2ldO1xuXG4gICAgICAvLyBwYXJ0aWNsZSB1cGRhdGVcbiAgICAgIHBhcnRpY2xlLnVwZGF0ZSh0aW1lLCBpKTtcbiAgICAgIHRoaXMucGFyZW50LmludGVncmF0b3IuY2FsY3VsYXRlKHBhcnRpY2xlLCB0aW1lLCBkYW1waW5nKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9VUERBVEVcIiwgcGFydGljbGUpO1xuXG4gICAgICAvLyBjaGVjayBkZWFkXG4gICAgICBpZiAocGFydGljbGUuZGVhZCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKFwiUEFSVElDTEVfREVBRFwiLCBwYXJ0aWNsZSk7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQucG9vbC5leHBpcmUocGFydGljbGUpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCkge1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQsIHRhcmdldCk7XG4gICAgdGhpcy5iaW5kRXZlbnQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgZW1pdHRpbmcodGltZSkge1xuICAgIGlmKHRoaXMuc3RvcGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy50b3RhbFRpbWUgPT09IFwibm9uZVwiKSB7XG4gICAgICB0aGlzLmVtaXRUaW1lICs9IHRpbWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRvdGFsVGltZSA9PT0gXCJvbmNlXCIpIHtcbiAgICAgIGxldCBpO1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKDk5OTk5KTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDApIHRoaXMuZW1pdFNwZWVkID0gbGVuZ3RoO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB0aGlzLnRvdGFsVGltZSA9IFwibm9uZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRUaW1lICs9IHRpbWU7XG5cbiAgICAgIGlmICh0aGlzLmVtaXRUaW1lIDwgdGhpcy50b3RhbFRpbWUpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yYXRlLmdldFZhbHVlKHRpbWUpO1xuICAgICAgICBsZXQgaTtcblxuICAgICAgICBpZiAobGVuZ3RoID4gMCkgdGhpcy5lbWl0U3BlZWQgPSBsZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgc2luZ2xlIHBhcnRpY2xlO1xuICAgKlxuICAgKiBjYW4gdXNlIGVtaXQoe3g6MTB9LG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KSBvciBlbWl0KFt7eDoxMH0sbmV3IEluaXRpYWxpemVdLG5ldyBHcmF2aXR5KDEwKSx7J3BhcnRpY2xlVXBkYXRlJyxmdW59KVxuICAgKiBAbWV0aG9kIHJlbW92ZUFsbFBhcnRpY2xlc1xuICAgKi9cbiAgY3JlYXRlUGFydGljbGUoaW5pdGlhbGl6ZSwgYmVoYXZpb3VyKSB7XG4gICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcmVudC5wb29sLmdldChQYXJ0aWNsZSk7XG4gICAgdGhpcy5zZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbml0aWFsaXplLCBiZWhhdmlvdXIpO1xuICAgIHRoaXMuZGlzcGF0Y2goXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHBhcnRpY2xlKTtcblxuICAgIHJldHVybiBwYXJ0aWNsZTtcbiAgfVxuXG4gIHNldHVwUGFydGljbGUocGFydGljbGUsIGluaXRpYWxpemUsIGJlaGF2aW91cikge1xuICAgIGxldCBpbml0aWFsaXplcyA9IHRoaXMuaW5pdGlhbGl6ZXM7XG4gICAgbGV0IGJlaGF2aW91cnMgPSB0aGlzLmJlaGF2aW91cnM7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZSkgaW5pdGlhbGl6ZXMgPSBVdGlsLnRvQXJyYXkoaW5pdGlhbGl6ZSk7XG4gICAgaWYgKGJlaGF2aW91cikgYmVoYXZpb3VycyA9IFV0aWwudG9BcnJheShiZWhhdmlvdXIpO1xuXG4gICAgcGFydGljbGUucmVzZXQoKTtcbiAgICBJbml0aWFsaXplVXRpbC5pbml0aWFsaXplKHRoaXMsIHBhcnRpY2xlLCBpbml0aWFsaXplcyk7XG4gICAgcGFydGljbGUuYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKTtcbiAgICBwYXJ0aWNsZS5wYXJlbnQgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwYXJ0aWNsZSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgVXRpbC5kZXN0cm95QWxsKHRoaXMucGFydGljbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IHRoaXMgRW1pdHRlclxuICAgKiBAbWV0aG9kIGRlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICAgIHRoaXMucmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVBbGxCZWhhdmlvdXJzKCk7XG4gICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQucmVtb3ZlRW1pdHRlcih0aGlzKTtcblxuICAgIHRoaXMucmF0ZSA9IG51bGw7XG4gICAgdGhpcy5vbGQgPSBudWxsO1xuICAgIHRoaXMucmdiID0gbnVsbDtcbiAgICB0aGlzLnYgPSBudWxsO1xuICAgIHRoaXMuYSA9IG51bGw7XG4gICAgdGhpcy5wID0gbnVsbDtcbiAgfVxufVxuXG5FdmVudERpc3BhdGNoZXIuYmluZChFbWl0dGVyKTtcbiIsImltcG9ydCBFbWl0dGVyIGZyb20gXCIuL0VtaXR0ZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmVoYXZpb3VyRW1pdHRlciBleHRlbmRzIEVtaXR0ZXIge1xuICAvKipcbiAgICogVGhlIEJlaGF2aW91ckVtaXR0ZXIgY2xhc3MgaW5oZXJpdHMgZnJvbSBQcm90b24uRW1pdHRlclxuICAgKlxuICAgKiB1c2UgdGhlIEJlaGF2aW91ckVtaXR0ZXIgeW91IGNhbiBhZGQgYmVoYXZpb3VycyB0byBzZWxmO1xuICAgKiBAY2xhc3MgUHJvdG9uLkJlaGF2aW91ckVtaXR0ZXJcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmYpIHtcbiAgICBzdXBlcihjb25mKTtcblxuICAgIHRoaXMuc2VsZkJlaGF2aW91cnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgdGhlIEJlaGF2aW91ciB0byBlbWl0dGVyO1xuICAgKlxuICAgKiB5b3UgY2FuIHVzZSBCZWhhdmlvdXJzIGFycmF5OmVtaXR0ZXIuYWRkU2VsZkJlaGF2aW91cihCZWhhdmlvdXIxLEJlaGF2aW91cjIsQmVoYXZpb3VyMyk7XG4gICAqIEBtZXRob2QgYWRkU2VsZkJlaGF2aW91clxuICAgKiBAcGFyYW0ge1Byb3Rvbi5CZWhhdmlvdXJ9IGJlaGF2aW91ciBsaWtlIHRoaXMgbmV3IFByb3Rvbi5Db2xvcigncmFuZG9tJylcbiAgICovXG4gIGFkZFNlbGZCZWhhdmlvdXIoLi4ucmVzdCkge1xuICAgIGxldCBpLFxuICAgICAgbGVuZ3RoID0gcmVzdC5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBiZWhhdmlvdXIgPSByZXN0W2ldO1xuICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG4gICAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIHRoZSBCZWhhdmlvdXIgZm9yIHNlbGZcbiAgICogQG1ldGhvZCByZW1vdmVTZWxmQmVoYXZpb3VyXG4gICAqIEBwYXJhbSB7UHJvdG9uLkJlaGF2aW91cn0gYmVoYXZpb3VyIGEgYmVoYXZpb3VyXG4gICAqL1xuICByZW1vdmVTZWxmQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxmQmVoYXZpb3Vycy5pbmRleE9mKGJlaGF2aW91cik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuc2VsZkJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHVwZGF0ZSh0aW1lKSB7XG4gICAgc3VwZXIudXBkYXRlKHRpbWUpO1xuXG4gICAgaWYgKCF0aGlzLnNsZWVwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnNlbGZCZWhhdmlvdXJzLmxlbmd0aDtcbiAgICAgIGxldCBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxmQmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgRW1pdHRlciBmcm9tIFwiLi9FbWl0dGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbGxvd0VtaXR0ZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIFRoZSBGb2xsb3dFbWl0dGVyIGNsYXNzIGluaGVyaXRzIGZyb20gUHJvdG9uLkVtaXR0ZXJcbiAgICpcbiAgICogdXNlIHRoZSBGb2xsb3dFbWl0dGVyIHdpbGwgZW1pdCBwYXJ0aWNsZSB3aGVuIG1vdXNlbW92aW5nXG4gICAqXG4gICAqIEBjbGFzcyBQcm90b24uRm9sbG93RW1pdHRlclxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtb3VzZVRhcmdldCBtb3VzZWV2ZW50J3MgdGFyZ2V0O1xuICAgKiBAcGFyYW0ge051bWJlcn0gZWFzZSB0aGUgZWFzaW5nIG9mIGZvbGxvd2luZyBzcGVlZDtcbiAgICogQGRlZmF1bHQgMC43XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25mIHRoZSBwYXJhbWV0ZXJzIG9iamVjdDtcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vdXNlVGFyZ2V0LCBlYXNlLCBjb25mKSB7XG4gICAgc3VwZXIoY29uZik7XG5cbiAgICB0aGlzLm1vdXNlVGFyZ2V0ID0gVXRpbC5pbml0VmFsdWUobW91c2VUYXJnZXQsIHdpbmRvdyk7XG4gICAgdGhpcy5lYXNlID0gVXRpbC5pbml0VmFsdWUoZWFzZSwgMC43KTtcblxuICAgIHRoaXMuX2FsbG93RW1pdHRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRFdmVudEhhbmRsZXIoKTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5tb3VzZW1vdmVIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNlbW92ZS5jYWxsKHRoaXMsIGUpO1xuICAgIHRoaXMubW91c2Vkb3duSGFuZGxlciA9IGUgPT4gdGhpcy5tb3VzZWRvd24uY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNldXBIYW5kbGVyID0gZSA9PiB0aGlzLm1vdXNldXAuY2FsbCh0aGlzLCBlKTtcbiAgICB0aGlzLm1vdXNlVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmVIYW5kbGVyLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgZW1pdCBwYXJ0aWNsZVxuICAgKiBAbWV0aG9kIGVtaXRcbiAgICovXG4gIGVtaXQoKSB7XG4gICAgdGhpcy5fYWxsb3dFbWl0dGluZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogc3RvcCBlbWl0aW5nXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKi9cbiAgc3RvcCgpIHtcbiAgICB0aGlzLl9hbGxvd0VtaXR0aW5nID0gZmFsc2U7XG4gIH1cblxuICBtb3VzZW1vdmUoZSkge1xuICAgIGlmIChlLmxheWVyWCB8fCBlLmxheWVyWCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUubGF5ZXJYIC0gdGhpcy5wLngpICogdGhpcy5lYXNlO1xuICAgICAgdGhpcy5wLnkgKz0gKGUubGF5ZXJZIC0gdGhpcy5wLnkpICogdGhpcy5lYXNlO1xuICAgIH0gZWxzZSBpZiAoZS5vZmZzZXRYIHx8IGUub2Zmc2V0WCA9PT0gMCkge1xuICAgICAgdGhpcy5wLnggKz0gKGUub2Zmc2V0WCAtIHRoaXMucC54KSAqIHRoaXMuZWFzZTtcbiAgICAgIHRoaXMucC55ICs9IChlLm9mZnNldFkgLSB0aGlzLnAueSkgKiB0aGlzLmVhc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93RW1pdHRpbmcpIHN1cGVyLmVtaXQoXCJvbmNlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgdGhpcyBFbWl0dGVyXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5tb3VzZVRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlSGFuZGxlciwgZmFsc2UpO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHBpY3R1cmUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IGlzIG9yIG5vXG4gICAqL1xuICBpc0ltYWdlKG9iaikge1xuICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9iai5fX2lzSW1hZ2UpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgdGFnTmFtZSA9IGAke29iai50YWdOYW1lfWAudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBub2RlTmFtZSA9IGAke29iai5ub2RlTmFtZX1gLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcIklNR1wiIHx8IHRhZ05hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgIG9iai5fX2lzSW1hZ2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgd2hldGhlciBpdCBpcyBhIHN0cmluZyBvYmplY3RcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaXMgb3Igbm9cbiAgICovXG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiO1xuICB9XG59O1xuIiwiaW1wb3J0IFBvb2wgZnJvbSBcIi4uL2NvcmUvUG9vbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbCgpO1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jaXJjbGVDb25mID0geyBpc0NpcmNsZTogdHJ1ZSB9O1xuXG4gICAgdGhpcy5pbml0RXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5uYW1lID0gXCJCYXNlUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFN0cm9rZShjb2xvciA9IFwiIzAwMDAwMFwiLCB0aGlua25lc3MgPSAxKSB7XG4gICAgdGhpcy5zdHJva2UgPSB7IGNvbG9yLCB0aGlua25lc3MgfTtcbiAgfVxuXG4gIGluaXRFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Qcm90b25VcGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblByb3RvblVwZGF0ZUFmdGVyLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIgPSBlbWl0dGVyID0+IHtcbiAgICAgIHRoaXMub25FbWl0dGVyQWRkZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyID0gZW1pdHRlciA9PiB7XG4gICAgICB0aGlzLm9uRW1pdHRlclJlbW92ZWQuY2FsbCh0aGlzLCBlbWl0dGVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVDcmVhdGVkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZUNyZWF0ZWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX3BhcnRpY2xlVXBkYXRlSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZVVwZGF0ZS5jYWxsKHRoaXMsIHBhcnRpY2xlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fcGFydGljbGVEZWFkSGFuZGxlciA9IHBhcnRpY2xlID0+IHtcbiAgICAgIHRoaXMub25QYXJ0aWNsZURlYWQuY2FsbCh0aGlzLCBwYXJ0aWNsZSk7XG4gICAgfTtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwcm90b247XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJQUk9UT05fVVBEQVRFX0FGVEVSXCIsIHRoaXMuX3Byb3RvblVwZGF0ZUFmdGVySGFuZGxlcik7XG5cbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIkVNSVRURVJfQURERURcIiwgdGhpcy5fZW1pdHRlckFkZGVkSGFuZGxlcik7XG4gICAgcHJvdG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfQ1JFQVRFRFwiLCB0aGlzLl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyKTtcbiAgICBwcm90b24uYWRkRXZlbnRMaXN0ZW5lcihcIlBBUlRJQ0xFX1VQREFURVwiLCB0aGlzLl9wYXJ0aWNsZVVwZGF0ZUhhbmRsZXIpO1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7fVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0aGlzLnBvb2wuZGVzdHJveSgpO1xuICAgIHRoaXMucG9vbCA9IG51bGw7XG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cblxuICByZW1vdmUocHJvdG9uKSB7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVcIiwgdGhpcy5fcHJvdG9uVXBkYXRlSGFuZGxlcik7XG4gICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIlBST1RPTl9VUERBVEVfQUZURVJcIiwgdGhpcy5fcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX0FEREVEXCIsIHRoaXMuX2VtaXR0ZXJBZGRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJFTUlUVEVSX1JFTU9WRURcIiwgdGhpcy5fZW1pdHRlclJlbW92ZWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9DUkVBVEVEXCIsIHRoaXMuX3BhcnRpY2xlQ3JlYXRlZEhhbmRsZXIpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJQQVJUSUNMRV9VUERBVEVcIiwgdGhpcy5fcGFydGljbGVVcGRhdGVIYW5kbGVyKTtcbiAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiUEFSVElDTEVfREVBRFwiLCB0aGlzLl9wYXJ0aWNsZURlYWRIYW5kbGVyKTtcblxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cbiAgb25Qcm90b25VcGRhdGVBZnRlcigpIHt9XG5cbiAgb25FbWl0dGVyQWRkZWQoZW1pdHRlcikge31cbiAgb25FbWl0dGVyUmVtb3ZlZChlbWl0dGVyKSB7fVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7fVxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICB0aGlzLmJ1ZmZlckNhY2hlID0ge307XG4gICAgdGhpcy5uYW1lID0gXCJDYW52YXNSZW5kZXJlclwiO1xuICB9XG5cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGUoKSB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmVsZW1lbnQud2lkdGgsIHRoaXMuZWxlbWVudC5oZWlnaHQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUocGFydGljbGUuYm9keSwgdGhpcy5hZGRJbWcyQm9keSwgcGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWNsZS5jb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgaWYgKFR5cGVzLmlzSW1hZ2UocGFydGljbGUuYm9keSkpIHtcbiAgICAgICAgdGhpcy5kcmF3SW1hZ2UocGFydGljbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdDaXJjbGUocGFydGljbGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IG51bGw7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgcGFydGljbGUuYm9keSA9IGltZztcbiAgfVxuXG4gIC8vIHByaXZhdGUgZHJhd0ltYWdlIG1ldGhvZFxuICBkcmF3SW1hZ2UocGFydGljbGUpIHtcbiAgICBjb25zdCB3ID0gKHBhcnRpY2xlLmJvZHkud2lkdGggKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IGggPSAocGFydGljbGUuYm9keS5oZWlnaHQgKiBwYXJ0aWNsZS5zY2FsZSkgfCAwO1xuICAgIGNvbnN0IHggPSBwYXJ0aWNsZS5wLnggLSB3IC8gMjtcbiAgICBjb25zdCB5ID0gcGFydGljbGUucC55IC0gaCAvIDI7XG5cbiAgICBpZiAoISFwYXJ0aWNsZS5jb2xvcikge1xuICAgICAgaWYgKCFwYXJ0aWNsZS5kYXRhW1wiYnVmZmVyXCJdKSBwYXJ0aWNsZS5kYXRhLmJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgICBjb25zdCBidWZDb250ZXh0ID0gcGFydGljbGUuZGF0YS5idWZmZXIuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgYnVmQ29udGV4dC5jbGVhclJlY3QoMCwgMCwgcGFydGljbGUuZGF0YS5idWZmZXIud2lkdGgsIHBhcnRpY2xlLmRhdGEuYnVmZmVyLmhlaWdodCk7XG4gICAgICBidWZDb250ZXh0Lmdsb2JhbEFscGhhID0gcGFydGljbGUuYWxwaGE7XG4gICAgICBidWZDb250ZXh0LmRyYXdJbWFnZShwYXJ0aWNsZS5ib2R5LCAwLCAwKTtcblxuICAgICAgYnVmQ29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1hdG9wXCI7XG4gICAgICBidWZDb250ZXh0LmZpbGxTdHlsZSA9IENvbG9yVXRpbC5yZ2JUb0hleChwYXJ0aWNsZS5yZ2IpO1xuICAgICAgYnVmQ29udGV4dC5maWxsUmVjdCgwLCAwLCBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCwgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0KTtcbiAgICAgIGJ1ZkNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgYnVmQ29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG5cbiAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHBhcnRpY2xlLmRhdGEuYnVmZmVyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICBwYXJ0aWNsZS5kYXRhLmJ1ZmZlci53aWR0aCxcbiAgICAgICAgcGFydGljbGUuZGF0YS5idWZmZXIuaGVpZ2h0LFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3LFxuICAgICAgICBoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICB0aGlzLmNvbnRleHQuZ2xvYmFsQWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnkpO1xuICAgICAgdGhpcy5jb250ZXh0LnJvdGF0ZShNYXRoVXRpbC5kZWdyZWVUcmFuc2Zvcm0ocGFydGljbGUucm90YXRpb24pKTtcbiAgICAgIHRoaXMuY29udGV4dC50cmFuc2xhdGUoLXBhcnRpY2xlLnAueCwgLXBhcnRpY2xlLnAueSk7XG4gICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHBhcnRpY2xlLmJvZHksIDAsIDAsIHBhcnRpY2xlLmJvZHkud2lkdGgsIHBhcnRpY2xlLmJvZHkuaGVpZ2h0LCB4LCB5LCB3LCBoKTtcblxuICAgICAgdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBkcmF3Q2lyY2xlIC0tXG4gIGRyYXdDaXJjbGUocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUucmdiKSB7XG4gICAgICB0aGlzLmNvbnRleHQuZmlsbFN0eWxlID0gYHJnYmEoJHtwYXJ0aWNsZS5yZ2Iucn0sJHtwYXJ0aWNsZS5yZ2IuZ30sJHtwYXJ0aWNsZS5yZ2IuYn0sJHtwYXJ0aWNsZS5hbHBoYX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IHBhcnRpY2xlLmNvbG9yO1xuICAgIH1cblxuICAgIC8vIGRyYXcgY2lyY2xlXG4gICAgdGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5hcmMocGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnJhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSB0aGlzLnN0cm9rZS50aGlua25lc3M7XG4gICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29udGV4dC5maWxsKCk7XG4gIH1cblxuICAvLyBwcml2YXRlIGNyZWF0ZUJ1ZmZlclxuICBjcmVhdGVCdWZmZXIoaW1hZ2UpIHtcbiAgICBpZiAoVHlwZXMuaXNJbWFnZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBpbWFnZS53aWR0aCArIFwiX1wiICsgaW1hZ2UuaGVpZ2h0O1xuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuYnVmZmVyQ2FjaGVbc2l6ZV07XG5cbiAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgICB0aGlzLmJ1ZmZlckNhY2hlW3NpemVdID0gY2FudmFzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2FudmFzO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuYnVmZmVyQ2FjaGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgRG9tVXRpbCBmcm9tIFwiLi4vdXRpbHMvRG9tVXRpbFwiO1xuaW1wb3J0IEltZ1V0aWwgZnJvbSBcIi4uL3V0aWxzL0ltZ1V0aWxcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbVJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBudWxsO1xuICAgIHRoaXMudHJhbnNmb3JtM2QgPSBmYWxzZTtcbiAgICB0aGlzLnBvb2wuY3JlYXRlID0gKGJvZHksIHBhcnRpY2xlKSA9PiB0aGlzLmNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkRvbVJlbmRlcmVyXCI7XG4gIH1cblxuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBJbWdVdGlsLmdldEltZ0Zyb21DYWNoZShwYXJ0aWNsZS5ib2R5LCB0aGlzLmFkZEltZzJCb2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5ib2R5UmVhZHkocGFydGljbGUpKSB7XG4gICAgICBpZiAodGhpcy50cmFuc2Zvcm0zZCkge1xuICAgICAgICBEb21VdGlsLnRyYW5zZm9ybTNkKHBhcnRpY2xlLmJvZHksIHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55LCBwYXJ0aWNsZS5zY2FsZSwgcGFydGljbGUucm90YXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRG9tVXRpbC50cmFuc2Zvcm0ocGFydGljbGUuYm9keSwgcGFydGljbGUucC54LCBwYXJ0aWNsZS5wLnksIHBhcnRpY2xlLnNjYWxlLCBwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuc3R5bGUub3BhY2l0eSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgICBpZiAocGFydGljbGUuYm9keS5pc0NpcmNsZSkge1xuICAgICAgICBwYXJ0aWNsZS5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUGFydGljbGVEZWFkKHBhcnRpY2xlKSB7XG4gICAgaWYgKHRoaXMuYm9keVJlYWR5KHBhcnRpY2xlKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICAgICAgdGhpcy5wb29sLmV4cGlyZShwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGJvZHlSZWFkeShwYXJ0aWNsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFydGljbGUuYm9keSA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0aWNsZS5ib2R5ICYmICFwYXJ0aWNsZS5ib2R5LmlzSW5uZXI7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZFxuICBhZGRJbWcyQm9keShpbWcsIHBhcnRpY2xlKSB7XG4gICAgaWYgKHBhcnRpY2xlLmRlYWQpIHJldHVybjtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChpbWcsIHBhcnRpY2xlKTtcbiAgICBEb21VdGlsLnJlc2l6ZShwYXJ0aWNsZS5ib2R5LCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgY3JlYXRlQm9keShib2R5LCBwYXJ0aWNsZSkge1xuICAgIGlmIChib2R5LmlzQ2lyY2xlKSByZXR1cm4gdGhpcy5jcmVhdGVDaXJjbGUocGFydGljbGUpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5LCBwYXJ0aWNsZSk7XG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZHNcbiAgY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKSB7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIDIgKiBwYXJ0aWNsZS5yYWRpdXMsIDIgKiBwYXJ0aWNsZS5yYWRpdXMpO1xuICAgIGRvbS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgJHtwYXJ0aWNsZS5yYWRpdXN9cHhgO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBkb20uc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnN0cm9rZS5jb2xvcjtcbiAgICAgIGRvbS5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke3RoaXMuc3Ryb2tlLnRoaW5rbmVzc31weGA7XG4gICAgfVxuICAgIGRvbS5pc0NpcmNsZSA9IHRydWU7XG5cbiAgICByZXR1cm4gZG9tO1xuICB9XG5cbiAgY3JlYXRlU3ByaXRlKGJvZHksIHBhcnRpY2xlKSB7XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgPyBib2R5IDogYm9keS5zcmM7XG4gICAgY29uc3QgZG9tID0gRG9tVXRpbC5jcmVhdGVEaXYoYCR7cGFydGljbGUuaWR9X2RvbWAsIGJvZHkud2lkdGgsIGJvZHkuaGVpZ2h0KTtcbiAgICBkb20uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3VybH0pYDtcblxuICAgIHJldHVybiBkb207XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCBUeXBlcyBmcm9tIFwiLi4vdXRpbHMvVHlwZXNcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc2VsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHJva2UpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuc3Ryb2tlID0gc3Ryb2tlO1xuICAgIHRoaXMubmFtZSA9IFwiRWFzZWxSZW5kZXJlclwiO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgdGhpcy5jcmVhdGVTcHJpdGUocGFydGljbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUNpcmNsZShwYXJ0aWNsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZENoaWxkKHBhcnRpY2xlLmJvZHkpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnggPSBwYXJ0aWNsZS5wLng7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnkgPSBwYXJ0aWNsZS5wLnk7XG5cbiAgICAgIHBhcnRpY2xlLmJvZHkuYWxwaGEgPSBwYXJ0aWNsZS5hbHBoYTtcbiAgICAgIHBhcnRpY2xlLmJvZHkuc2NhbGVYID0gcGFydGljbGUuYm9keS5zY2FsZVkgPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICAgIHBhcnRpY2xlLmJvZHkucm90YXRpb24gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICB9XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5LnBhcmVudCAmJiBwYXJ0aWNsZS5ib2R5LnBhcmVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICAgIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuYm9keSk7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGFydGljbGUuZ3JhcGhpY3MpIHRoaXMucG9vbC5leHBpcmUocGFydGljbGUuZ3JhcGhpY3MpO1xuICB9XG5cbiAgLy8gcHJpdmF0ZVxuICBjcmVhdGVTcHJpdGUocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5KTtcblxuICAgIGlmIChwYXJ0aWNsZS5ib2R5LnBhcmVudCkgcmV0dXJuO1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5W1wiaW1hZ2VcIl0pIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkucmVnWCA9IHBhcnRpY2xlLmJvZHkuaW1hZ2Uud2lkdGggLyAyO1xuICAgICAgcGFydGljbGUuYm9keS5yZWdZID0gcGFydGljbGUuYm9keS5pbWFnZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gdGhpcy5wb29sLmdldCh3aW5kb3cuY3JlYXRlanMuR3JhcGhpY3MpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBpZiAoVHlwZXMuaXNTdHJpbmcodGhpcy5zdHJva2UpKSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKHRoaXMuc3Ryb2tlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luU3Ryb2tlKFwiIzAwMDAwMFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ3JhcGhpY3MuYmVnaW5GaWxsKHBhcnRpY2xlLmNvbG9yIHx8IFwiI2ZmMDAwMFwiKS5kcmF3Q2lyY2xlKDAsIDAsIHBhcnRpY2xlLnJhZGl1cyk7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLnBvb2wuZ2V0KHdpbmRvdy5jcmVhdGVqcy5TaGFwZSwgW2dyYXBoaWNzXSk7XG5cbiAgICBwYXJ0aWNsZS5ib2R5ID0gc2hhcGU7XG4gICAgcGFydGljbGUuZ3JhcGhpY3MgPSBncmFwaGljcztcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Ryb2tlID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IFJlY3RhbmdsZSBmcm9tIFwiLi4vbWF0aC9SZWN0YW5nbGVcIjtcbmltcG9ydCBCYXNlUmVuZGVyZXIgZnJvbSBcIi4vQmFzZVJlbmRlcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpeGVsUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCByZWN0YW5nbGUpIHtcbiAgICBzdXBlcihlbGVtZW50KTtcblxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgdGhpcy5pbWFnZURhdGEgPSBudWxsO1xuICAgIHRoaXMucmVjdGFuZ2xlID0gcmVjdGFuZ2xlO1xuICAgIHRoaXMuY3JlYXRlSW1hZ2VEYXRhKHJlY3RhbmdsZSk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIlBpeGVsUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5lbGVtZW50LndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5lbGVtZW50LmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIGNyZWF0ZUltYWdlRGF0YShyZWN0YW5nbGUpIHtcbiAgICB0aGlzLnJlY3RhbmdsZSA9IHJlY3RhbmdsZSA/IHJlY3RhbmdsZSA6IG5ldyBSZWN0YW5nbGUoMCwgMCwgdGhpcy5lbGVtZW50LndpZHRoLCB0aGlzLmVsZW1lbnQuaGVpZ2h0KTtcbiAgICB0aGlzLmltYWdlRGF0YSA9IHRoaXMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodGhpcy5yZWN0YW5nbGUud2lkdGgsIHRoaXMucmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLmltYWdlRGF0YSwgdGhpcy5yZWN0YW5nbGUueCwgdGhpcy5yZWN0YW5nbGUueSk7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KHRoaXMucmVjdGFuZ2xlLngsIHRoaXMucmVjdGFuZ2xlLnksIHRoaXMucmVjdGFuZ2xlLndpZHRoLCB0aGlzLnJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmdldEltYWdlRGF0YShcbiAgICAgIHRoaXMucmVjdGFuZ2xlLngsXG4gICAgICB0aGlzLnJlY3RhbmdsZS55LFxuICAgICAgdGhpcy5yZWN0YW5nbGUud2lkdGgsXG4gICAgICB0aGlzLnJlY3RhbmdsZS5oZWlnaHRcbiAgICApO1xuICB9XG5cbiAgb25Qcm90b25VcGRhdGVBZnRlcigpIHtcbiAgICB0aGlzLmNvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLCB0aGlzLnJlY3RhbmdsZS54LCB0aGlzLnJlY3RhbmdsZS55KTtcbiAgfVxuXG4gIG9uUGFydGljbGVDcmVhdGVkKHBhcnRpY2xlKSB7fVxuXG4gIG9uUGFydGljbGVVcGRhdGUocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5pbWFnZURhdGEpIHtcbiAgICAgIHRoaXMuc2V0UGl4ZWwoXG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhLFxuICAgICAgICAocGFydGljbGUucC54IC0gdGhpcy5yZWN0YW5nbGUueCkgPj4gMCxcbiAgICAgICAgKHBhcnRpY2xlLnAueSAtIHRoaXMucmVjdGFuZ2xlLnkpID4+IDAsXG4gICAgICAgIHBhcnRpY2xlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldFBpeGVsKGltYWdlZGF0YSwgeCwgeSwgcGFydGljbGUpIHtcbiAgICBjb25zdCByZ2IgPSBwYXJ0aWNsZS5yZ2I7XG4gICAgaWYgKHggPCAwIHx8IHggPiB0aGlzLmVsZW1lbnQud2lkdGggfHwgeSA8IDAgfHwgeSA+IHRoaXMuZWxlbWVudC5oZWlnaHQpIHJldHVybjtcblxuICAgIGNvbnN0IGkgPSAoKHkgPj4gMCkgKiBpbWFnZWRhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuICAgIGltYWdlZGF0YS5kYXRhW2ldID0gcmdiLnI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDFdID0gcmdiLmc7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDJdID0gcmdiLmI7XG4gICAgaW1hZ2VkYXRhLmRhdGFbaSArIDNdID0gcGFydGljbGUuYWxwaGEgKiAyNTU7XG4gIH1cblxuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge31cblxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnN0cm9rZSA9IG51bGw7XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XG4gICAgdGhpcy5yZWN0YW5nbGUgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgVHlwZXMgZnJvbSBcIi4uL3V0aWxzL1R5cGVzXCI7XG5pbXBvcnQgQ29sb3JVdGlsIGZyb20gXCIuLi91dGlscy9Db2xvclV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxubGV0IFBJWElDbGFzcztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpeGlSZW5kZXJlciBleHRlbmRzIEJhc2VSZW5kZXJlciB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN0cm9rZSkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdHJva2UgPSBzdHJva2U7XG4gICAgdGhpcy5jb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q29sb3IgPSBmYWxzZTtcbiAgICB0aGlzLmJsZW5kTW9kZSA9IG51bGw7XG4gICAgdGhpcy5wb29sLmNyZWF0ZSA9IChib2R5LCBwYXJ0aWNsZSkgPT4gdGhpcy5jcmVhdGVCb2R5KGJvZHksIHBhcnRpY2xlKTtcbiAgICB0aGlzLnNldFBJWEkod2luZG93LlBJWEkpO1xuXG4gICAgdGhpcy5uYW1lID0gXCJQaXhpUmVuZGVyZXJcIjtcbiAgfVxuXG4gIHNldFBJWEkoUElYSSkge1xuICAgIHRyeSB7XG4gICAgICBQSVhJQ2xhc3MgPSBQSVhJIHx8IHsgU3ByaXRlOiB7fSB9O1xuICAgICAgdGhpcy5jcmVhdGVGcm9tSW1hZ2UgPSBQSVhJQ2xhc3MuU3ByaXRlLmZyb20gfHwgUElYSUNsYXNzLlNwcml0ZS5mcm9tSW1hZ2U7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIG9uUHJvdG9uVXBkYXRlKCkge31cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlQ3JlYXRlZChwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5ib2R5KSB7XG4gICAgICBwYXJ0aWNsZS5ib2R5ID0gdGhpcy5wb29sLmdldChwYXJ0aWNsZS5ib2R5LCBwYXJ0aWNsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRpY2xlLmJvZHkgPSB0aGlzLnBvb2wuZ2V0KHRoaXMuY2lyY2xlQ29uZiwgcGFydGljbGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJsZW5kTW9kZSkge1xuICAgICAgcGFydGljbGUuYm9keS5ibGVuZE1vZGUgPSB0aGlzLmJsZW5kTW9kZTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2hpbGQocGFydGljbGUuYm9keSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlVXBkYXRlKHBhcnRpY2xlKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0ocGFydGljbGUsIHBhcnRpY2xlLmJvZHkpO1xuXG4gICAgaWYgKHRoaXMuc2V0Q29sb3IgPT09IHRydWUgfHwgdGhpcy5jb2xvciA9PT0gdHJ1ZSkge1xuICAgICAgcGFydGljbGUuYm9keS50aW50ID0gQ29sb3JVdGlsLmdldEhleDE2RnJvbVBhcnRpY2xlKHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcnRpY2xlXG4gICAqL1xuICBvblBhcnRpY2xlRGVhZChwYXJ0aWNsZSkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZChwYXJ0aWNsZS5ib2R5KTtcbiAgICB0aGlzLnBvb2wuZXhwaXJlKHBhcnRpY2xlLmJvZHkpO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBudWxsO1xuICB9XG5cbiAgdHJhbnNmb3JtKHBhcnRpY2xlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQueCA9IHBhcnRpY2xlLnAueDtcbiAgICB0YXJnZXQueSA9IHBhcnRpY2xlLnAueTtcblxuICAgIHRhcmdldC5hbHBoYSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGFyZ2V0LnNjYWxlLnggPSBwYXJ0aWNsZS5zY2FsZTtcbiAgICB0YXJnZXQuc2NhbGUueSA9IHBhcnRpY2xlLnNjYWxlO1xuXG4gICAgLy8gdXNpbmcgY2FjaGVkIHZlcnNpb24gb2YgTWF0aFV0aWwuUElfMTgwIGZvciBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UuXG4gICAgdGFyZ2V0LnJvdGF0aW9uID0gcGFydGljbGUucm90YXRpb24gKiBNYXRoVXRpbC5QSV8xODA7IC8vIE1hdGhVdGlsLlBJXzE4MDtcbiAgfVxuXG4gIGNyZWF0ZUJvZHkoYm9keSwgcGFydGljbGUpIHtcbiAgICBpZiAoYm9keS5pc0NpcmNsZSkgcmV0dXJuIHRoaXMuY3JlYXRlQ2lyY2xlKHBhcnRpY2xlKTtcbiAgICBlbHNlIHJldHVybiB0aGlzLmNyZWF0ZVNwcml0ZShib2R5KTtcbiAgfVxuXG4gIGNyZWF0ZVNwcml0ZShib2R5KSB7XG4gICAgY29uc3Qgc3ByaXRlID0gYm9keS5pc0lubmVyID8gdGhpcy5jcmVhdGVGcm9tSW1hZ2UoYm9keS5zcmMpIDogbmV3IFBJWElDbGFzcy5TcHJpdGUoYm9keSk7XG5cbiAgICBzcHJpdGUuYW5jaG9yLnggPSAwLjU7XG4gICAgc3ByaXRlLmFuY2hvci55ID0gMC41O1xuXG4gICAgcmV0dXJuIHNwcml0ZTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGdyYXBoaWNzID0gbmV3IFBJWElDbGFzcy5HcmFwaGljcygpO1xuXG4gICAgaWYgKHRoaXMuc3Ryb2tlKSB7XG4gICAgICBjb25zdCBzdHJva2UgPSBUeXBlcy5pc1N0cmluZyh0aGlzLnN0cm9rZSkgPyB0aGlzLnN0cm9rZSA6IDB4MDAwMDAwO1xuICAgICAgZ3JhcGhpY3MuYmVnaW5TdHJva2Uoc3Ryb2tlKTtcbiAgICB9XG5cbiAgICBncmFwaGljcy5iZWdpbkZpbGwocGFydGljbGUuY29sb3IgfHwgMHgwMDhjZWQpO1xuICAgIGdyYXBoaWNzLmRyYXdDaXJjbGUoMCwgMCwgcGFydGljbGUucmFkaXVzKTtcbiAgICBncmFwaGljcy5lbmRGaWxsKCk7XG5cbiAgICByZXR1cm4gZ3JhcGhpY3M7XG4gIH1cblxuICBkZXN0cm95KHBhcnRpY2xlcykge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcblxuICAgIGxldCBpID0gcGFydGljbGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBsZXQgcGFydGljbGUgPSBwYXJ0aWNsZXNbaV07XG4gICAgICBpZiAocGFydGljbGUuYm9keSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQocGFydGljbGUuYm9keSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTWF0MyBmcm9tIFwiLi4vbWF0aC9NYXQzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1TdGFjayB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWF0cyA9IFtdO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHRoaXMubWF0cy5wdXNoKE1hdDMuY3JlYXRlKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSkpO1xuICB9XG5cbiAgc2V0KG0sIGkpIHtcbiAgICBpZiAoaSA9PT0gMCkgTWF0My5zZXQobSwgdGhpcy5tYXRzWzBdKTtcbiAgICBlbHNlIE1hdDMubXVsdGlwbHkodGhpcy5tYXRzW2kgLSAxXSwgbSwgdGhpcy5tYXRzW2ldKTtcblxuICAgIHRoaXMuc2l6ZSA9IE1hdGgubWF4KHRoaXMuc2l6ZSwgaSArIDEpO1xuICB9XG5cbiAgcHVzaChtKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkgTWF0My5zZXQobSwgdGhpcy5tYXRzWzBdKTtcbiAgICBlbHNlIE1hdDMubXVsdGlwbHkodGhpcy5tYXRzW3RoaXMuc2l6ZSAtIDFdLCBtLCB0aGlzLm1hdHNbdGhpcy5zaXplXSk7XG5cbiAgICB0aGlzLnNpemUrKztcbiAgfVxuXG4gIHBvcCgpIHtcbiAgICBpZiAodGhpcy5zaXplID4gMCkgdGhpcy5zaXplLS07XG4gIH1cblxuICB0b3AoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0c1t0aGlzLnNpemUgLSAxXTtcbiAgfVxufVxuIiwiaW1wb3J0IE1hdDMgZnJvbSBcIi4uL21hdGgvTWF0M1wiO1xuaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4uL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBJbWdVdGlsIGZyb20gXCIuLi91dGlscy9JbWdVdGlsXCI7XG5pbXBvcnQgTVN0YWNrIGZyb20gXCIuLi91dGlscy9NU3RhY2tcIjtcbmltcG9ydCBEb21VdGlsIGZyb20gXCIuLi91dGlscy9Eb21VdGlsXCI7XG5pbXBvcnQgV2ViR0xVdGlsIGZyb20gXCIuLi91dGlscy9XZWJHTFV0aWxcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJHTFJlbmRlcmVyIGV4dGVuZHMgQmFzZVJlbmRlcmVyIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHN1cGVyKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5nbCA9IHRoaXMuZWxlbWVudC5nZXRDb250ZXh0KFwiZXhwZXJpbWVudGFsLXdlYmdsXCIsIHsgYW50aWFsaWFzOiB0cnVlLCBzdGVuY2lsOiBmYWxzZSwgZGVwdGg6IGZhbHNlIH0pO1xuICAgIGlmICghdGhpcy5nbCkgYWxlcnQoXCJTb3JyeSB5b3VyIGJyb3dzZXIgZG8gbm90IHN1cHBlc3QgV2ViR0whXCIpO1xuXG4gICAgdGhpcy5pbml0VmFyKCk7XG4gICAgdGhpcy5zZXRNYXhSYWRpdXMoKTtcbiAgICB0aGlzLmluaXRTaGFkZXJzKCk7XG4gICAgdGhpcy5pbml0QnVmZmVycygpO1xuXG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2wuRlVOQ19BREQpO1xuICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHRoaXMuZ2wuU1JDX0FMUEhBLCB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xuICAgIHRoaXMuZ2wuZW5hYmxlKHRoaXMuZ2wuQkxFTkQpO1xuICAgIHRoaXMuYWRkSW1nMkJvZHkgPSB0aGlzLmFkZEltZzJCb2R5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIldlYkdMUmVuZGVyZXJcIjtcbiAgfVxuXG4gIGluaXQocHJvdG9uKSB7XG4gICAgc3VwZXIuaW5pdChwcm90b24pO1xuICAgIHRoaXMucmVzaXplKHRoaXMuZWxlbWVudC53aWR0aCwgdGhpcy5lbGVtZW50LmhlaWdodCk7XG4gIH1cblxuICByZXNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMudW1hdFs0XSA9IC0yO1xuICAgIHRoaXMudW1hdFs3XSA9IDE7XG5cbiAgICB0aGlzLnNtYXRbMF0gPSAxIC8gd2lkdGg7XG4gICAgdGhpcy5zbWF0WzRdID0gMSAvIGhlaWdodDtcblxuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnVtYXQsIDApO1xuICAgIHRoaXMubXN0YWNrLnNldCh0aGlzLnNtYXQsIDEpO1xuXG4gICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmVsZW1lbnQud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgc2V0TWF4UmFkaXVzKHJhZGl1cykge1xuICAgIHRoaXMuY2lyY2xlQ2FudmFzVVJMID0gdGhpcy5jcmVhdGVDaXJjbGUocmFkaXVzKTtcbiAgfVxuXG4gIGdldFZlcnRleFNoYWRlcigpIHtcbiAgICBjb25zdCB2c1NvdXJjZSA9IFtcbiAgICAgIFwidW5pZm9ybSB2ZWMyIHZpZXdwb3J0O1wiLFxuICAgICAgXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XCIsXG4gICAgICBcImF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XCIsXG4gICAgICBcInVuaWZvcm0gbWF0MyB0TWF0O1wiLFxuICAgICAgXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcIixcbiAgICAgIFwidmFyeWluZyBmbG9hdCBhbHBoYTtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWMzIHYgPSB0TWF0ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCk7XCIsXG4gICAgICBcImdsX1Bvc2l0aW9uID0gdmVjNCh2LngsIHYueSwgMCwgMSk7XCIsXG4gICAgICBcInZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJhbHBoYSA9IHRNYXRbMF1bMl07XCIsXG4gICAgICBcIn1cIlxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gdnNTb3VyY2U7XG4gIH1cblxuICBnZXRGcmFnbWVudFNoYWRlcigpIHtcbiAgICBjb25zdCBmc1NvdXJjZSA9IFtcbiAgICAgIFwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XCIsXG4gICAgICBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1wiLFxuICAgICAgXCJ2YXJ5aW5nIGZsb2F0IGFscGhhO1wiLFxuICAgICAgXCJ1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWM0IGNvbG9yO1wiLFxuICAgICAgXCJ1bmlmb3JtIGJvb2wgdXNlVGV4dHVyZTtcIixcbiAgICAgIFwidW5pZm9ybSB2ZWMzIHVDb2xvcjtcIixcbiAgICAgIFwidm9pZCBtYWluKCkge1wiLFxuICAgICAgXCJ2ZWM0IHRleHR1cmVDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XCIsXG4gICAgICBcImdsX0ZyYWdDb2xvciA9IHRleHR1cmVDb2xvciAqIHZlYzQodUNvbG9yLCAxLjApO1wiLFxuICAgICAgXCJnbF9GcmFnQ29sb3IudyAqPSBhbHBoYTtcIixcbiAgICAgIFwifVwiXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBmc1NvdXJjZTtcbiAgfVxuXG4gIGluaXRWYXIoKSB7XG4gICAgdGhpcy5tc3RhY2sgPSBuZXcgTVN0YWNrKCk7XG4gICAgdGhpcy51bWF0ID0gTWF0My5jcmVhdGUoWzIsIDAsIDEsIDAsIC0yLCAwLCAtMSwgMSwgMV0pO1xuICAgIHRoaXMuc21hdCA9IE1hdDMuY3JlYXRlKFsxIC8gMTAwLCAwLCAxLCAwLCAxIC8gMTAwLCAwLCAwLCAwLCAxXSk7XG4gICAgdGhpcy50ZXh0dXJlYnVmZmVycyA9IHt9O1xuICB9XG5cbiAgYmxlbmRFcXVhdGlvbihBKSB7XG4gICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHRoaXMuZ2xbQV0pO1xuICB9XG5cbiAgYmxlbmRGdW5jKEEsIEIpIHtcbiAgICB0aGlzLmdsLmJsZW5kRnVuYyh0aGlzLmdsW0FdLCB0aGlzLmdsW0JdKTtcbiAgfVxuXG4gIGdldFNoYWRlcihnbCwgc3RyLCBmcykge1xuICAgIGNvbnN0IHNoYWRlciA9IGZzID8gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUikgOiBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzdHIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICBhbGVydChnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYWRlcjtcbiAgfVxuXG4gIGluaXRTaGFkZXJzKCkge1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXRTaGFkZXIodGhpcy5nbCwgdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpLCB0cnVlKTtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdldFNoYWRlcih0aGlzLmdsLCB0aGlzLmdldFZlcnRleFNoYWRlcigpLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIodGhpcy5zcHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgICB0aGlzLmdsLmF0dGFjaFNoYWRlcih0aGlzLnNwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gICAgdGhpcy5nbC5saW5rUHJvZ3JhbSh0aGlzLnNwcm9ncmFtKTtcblxuICAgIGlmICghdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuc3Byb2dyYW0sIHRoaXMuZ2wuTElOS19TVEFUVVMpKSBhbGVydChcIkNvdWxkIG5vdCBpbml0aWFsaXNlIHNoYWRlcnNcIik7XG5cbiAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5zcHJvZ3JhbSk7XG4gICAgdGhpcy5zcHJvZ3JhbS52cGEgPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMuc3Byb2dyYW0sIFwiYVZlcnRleFBvc2l0aW9uXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udGNhID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcImFUZXh0dXJlQ29vcmRcIik7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnRjYSk7XG4gICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnNwcm9ncmFtLnZwYSk7XG5cbiAgICB0aGlzLnNwcm9ncmFtLnRNYXRVbmlmb3JtID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ0TWF0XCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uc2FtcGxlclVuaWZvcm0gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVTYW1wbGVyXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0udXNlVGV4ID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5zcHJvZ3JhbSwgXCJ1c2VUZXh0dXJlXCIpO1xuICAgIHRoaXMuc3Byb2dyYW0uY29sb3IgPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnNwcm9ncmFtLCBcInVDb2xvclwiKTtcbiAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnVzZVRleCwgMSk7XG4gIH1cblxuICBpbml0QnVmZmVycygpIHtcbiAgICBjb25zdCB2cyA9IFswLCAzLCAxLCAwLCAyLCAzXTtcbiAgICBsZXQgaWR4O1xuXG4gICAgdGhpcy51bml0SUJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMudW5pdElCdWZmZXIpO1xuICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBuZXcgVWludDE2QXJyYXkodnMpLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGxldCBpO1xuICAgIGxldCBpZHMgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIGlkcy5wdXNoKGkpO1xuICAgIGlkeCA9IG5ldyBVaW50MTZBcnJheShpZHMpO1xuXG4gICAgdGhpcy51bml0STMzID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy51bml0STMzKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcblxuICAgIGlkcyA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgaWRzLnB1c2goaSwgaSArIDEsIGkgKyAyKTtcbiAgICBpZHggPSBuZXcgVWludDE2QXJyYXkoaWRzKTtcblxuICAgIHRoaXMuc3RyaXBCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnN0cmlwQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaWR4LCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgfVxuXG4gIGNyZWF0ZUNpcmNsZShyYWlkdXMpIHtcbiAgICB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cyA9IFdlYkdMVXRpbC5uaHBvdChVdGlsLmluaXRWYWx1ZShyYWlkdXMsIDMyKSk7XG4gICAgY29uc3QgY2FudmFzID0gRG9tVXRpbC5jcmVhdGVDYW52YXMoXCJjaXJjbGVfY2FudmFzXCIsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzICogMiwgdGhpcy5jaXJjbGVDYW52YXNSYWRpdXMgKiAyKTtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmModGhpcy5jaXJjbGVDYW52YXNSYWRpdXMsIHRoaXMuY2lyY2xlQ2FudmFzUmFkaXVzLCB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cywgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcIiNGRkZcIjtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gIH1cblxuICBkcmF3SW1nMkNhbnZhcyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IF93ID0gcGFydGljbGUuYm9keS53aWR0aDtcbiAgICBjb25zdCBfaCA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0O1xuXG4gICAgY29uc3QgX3dpZHRoID0gV2ViR0xVdGlsLm5ocG90KHBhcnRpY2xlLmJvZHkud2lkdGgpO1xuICAgIGNvbnN0IF9oZWlnaHQgPSBXZWJHTFV0aWwubmhwb3QocGFydGljbGUuYm9keS5oZWlnaHQpO1xuXG4gICAgY29uc3QgX3NjYWxlWCA9IHBhcnRpY2xlLmJvZHkud2lkdGggLyBfd2lkdGg7XG4gICAgY29uc3QgX3NjYWxlWSA9IHBhcnRpY2xlLmJvZHkuaGVpZ2h0IC8gX2hlaWdodDtcblxuICAgIGlmICghdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY10pXG4gICAgICB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXSA9IFtcbiAgICAgICAgdGhpcy5nbC5jcmVhdGVUZXh0dXJlKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCksXG4gICAgICAgIHRoaXMuZ2wuY3JlYXRlQnVmZmVyKClcbiAgICAgIF07XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmUgPSB0aGlzLnRleHR1cmVidWZmZXJzW3BhcnRpY2xlLmRhdGEuc3JjXVswXTtcbiAgICBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyID0gdGhpcy50ZXh0dXJlYnVmZmVyc1twYXJ0aWNsZS5kYXRhLnNyY11bMV07XG4gICAgcGFydGljbGUuZGF0YS50Y0J1ZmZlciA9IHRoaXMudGV4dHVyZWJ1ZmZlcnNbcGFydGljbGUuZGF0YS5zcmNdWzJdO1xuXG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfc2NhbGVYLCAwLjAsIDAuMCwgX3NjYWxlWSwgX3NjYWxlWSwgX3NjYWxlWV0pLFxuICAgICAgdGhpcy5nbC5TVEFUSUNfRFJBV1xuICAgICk7XG4gICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wLCBfdywgMC4wLCAwLjAsIF9oLCBfdywgX2hdKSxcbiAgICAgIHRoaXMuZ2wuU1RBVElDX0RSQVdcbiAgICApO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhcnRpY2xlLmRhdGEuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgX3dpZHRoLCBfaGVpZ2h0KTtcblxuICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCBwYXJ0aWNsZS5kYXRhLnRleHR1cmUpO1xuICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIGRhdGEpO1xuICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0aGlzLmdsLkxJTkVBUik7XG4gICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsIHRoaXMuZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICB0aGlzLmdsLmdlbmVyYXRlTWlwbWFwKHRoaXMuZ2wuVEVYVFVSRV8yRCk7XG5cbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSB0cnVlO1xuICAgIHBhcnRpY2xlLmRhdGEudGV4dHVyZVdpZHRoID0gX3c7XG4gICAgcGFydGljbGUuZGF0YS50ZXh0dXJlSGVpZ2h0ID0gX2g7XG4gIH1cblxuICBvblByb3RvblVwZGF0ZSgpIHtcbiAgICAvLyB0aGlzLmdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMSk7XG4gICAgLy8gdGhpcy5nbC5jbGVhcih0aGlzLmdsLkNPTE9SX0JVRkZFUl9CSVQgfCB0aGlzLmdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICB9XG5cbiAgb25QYXJ0aWNsZUNyZWF0ZWQocGFydGljbGUpIHtcbiAgICBwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQgPSBmYWxzZTtcbiAgICBwYXJ0aWNsZS5kYXRhLnRtYXQgPSBNYXQzLmNyZWF0ZSgpO1xuICAgIHBhcnRpY2xlLmRhdGEudG1hdFs4XSA9IDE7XG4gICAgcGFydGljbGUuZGF0YS5pbWF0ID0gTWF0My5jcmVhdGUoKTtcbiAgICBwYXJ0aWNsZS5kYXRhLmltYXRbOF0gPSAxO1xuXG4gICAgaWYgKHBhcnRpY2xlLmJvZHkpIHtcbiAgICAgIEltZ1V0aWwuZ2V0SW1nRnJvbUNhY2hlKHBhcnRpY2xlLmJvZHksIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSW1nVXRpbC5nZXRJbWdGcm9tQ2FjaGUodGhpcy5jaXJjbGVDYW52YXNVUkwsIHRoaXMuYWRkSW1nMkJvZHksIHBhcnRpY2xlKTtcbiAgICAgIHBhcnRpY2xlLmRhdGEub2xkU2NhbGUgPSBwYXJ0aWNsZS5yYWRpdXMgLyB0aGlzLmNpcmNsZUNhbnZhc1JhZGl1cztcbiAgICB9XG4gIH1cblxuICAvLyBwcml2YXRlXG4gIGFkZEltZzJCb2R5KGltZywgcGFydGljbGUpIHtcbiAgICBpZiAocGFydGljbGUuZGVhZCkgcmV0dXJuO1xuICAgIHBhcnRpY2xlLmJvZHkgPSBpbWc7XG4gICAgcGFydGljbGUuZGF0YS5zcmMgPSBpbWcuc3JjO1xuICAgIHBhcnRpY2xlLmRhdGEuY2FudmFzID0gSW1nVXRpbC5nZXRDYW52YXNGcm9tQ2FjaGUoaW1nKTtcbiAgICBwYXJ0aWNsZS5kYXRhLm9sZFNjYWxlID0gMTtcblxuICAgIHRoaXMuZHJhd0ltZzJDYW52YXMocGFydGljbGUpO1xuICB9XG5cbiAgb25QYXJ0aWNsZVVwZGF0ZShwYXJ0aWNsZSkge1xuICAgIGlmIChwYXJ0aWNsZS5kYXRhLnRleHR1cmVMb2FkZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWF0cml4KHBhcnRpY2xlKTtcblxuICAgICAgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5zcHJvZ3JhbS5jb2xvciwgcGFydGljbGUucmdiLnIgLyAyNTUsIHBhcnRpY2xlLnJnYi5nIC8gMjU1LCBwYXJ0aWNsZS5yZ2IuYiAvIDI1NSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5zcHJvZ3JhbS50TWF0VW5pZm9ybSwgZmFsc2UsIHRoaXMubXN0YWNrLnRvcCgpKTtcblxuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnZjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnZwYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBwYXJ0aWNsZS5kYXRhLnRjQnVmZmVyKTtcbiAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnNwcm9ncmFtLnRjYSwgMiwgdGhpcy5nbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHBhcnRpY2xlLmRhdGEudGV4dHVyZSk7XG4gICAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLnNwcm9ncmFtLnNhbXBsZXJVbmlmb3JtLCAwKTtcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLnVuaXRJQnVmZmVyKTtcblxuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHModGhpcy5nbC5UUklBTkdMRVMsIDYsIHRoaXMuZ2wuVU5TSUdORURfU0hPUlQsIDApO1xuICAgICAgdGhpcy5tc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgb25QYXJ0aWNsZURlYWQocGFydGljbGUpIHt9XG5cbiAgdXBkYXRlTWF0cml4KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgbW92ZU9yaWdpbk1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlVHJhbnNsYXRpb24oXG4gICAgICAtcGFydGljbGUuZGF0YS50ZXh0dXJlV2lkdGggLyAyLFxuICAgICAgLXBhcnRpY2xlLmRhdGEudGV4dHVyZUhlaWdodCAvIDJcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VUcmFuc2xhdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSk7XG5cbiAgICBjb25zdCBhbmdlbCA9IHBhcnRpY2xlLnJvdGF0aW9uICogTWF0aFV0aWwuUElfMTgwO1xuICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gV2ViR0xVdGlsLm1ha2VSb3RhdGlvbihhbmdlbCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IHBhcnRpY2xlLnNjYWxlICogcGFydGljbGUuZGF0YS5vbGRTY2FsZTtcbiAgICBjb25zdCBzY2FsZU1hdHJpeCA9IFdlYkdMVXRpbC5tYWtlU2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICBsZXQgbWF0cml4ID0gV2ViR0xVdGlsLm1hdHJpeE11bHRpcGx5KG1vdmVPcmlnaW5NYXRyaXgsIHNjYWxlTWF0cml4KTtcblxuICAgIG1hdHJpeCA9IFdlYkdMVXRpbC5tYXRyaXhNdWx0aXBseShtYXRyaXgsIHJvdGF0aW9uTWF0cml4KTtcbiAgICBtYXRyaXggPSBXZWJHTFV0aWwubWF0cml4TXVsdGlwbHkobWF0cml4LCB0cmFuc2xhdGlvbk1hdHJpeCk7XG5cbiAgICBNYXQzLmludmVyc2UobWF0cml4LCBwYXJ0aWNsZS5kYXRhLmltYXQpO1xuICAgIG1hdHJpeFsyXSA9IHBhcnRpY2xlLmFscGhhO1xuXG4gICAgdGhpcy5tc3RhY2sucHVzaChtYXRyaXgpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgdGhpcy5nbCA9IG51bGw7XG4gICAgdGhpcy5tc3RhY2sgPSBudWxsO1xuICAgIHRoaXMudW1hdCA9IG51bGw7XG4gICAgdGhpcy5zbWF0ID0gbnVsbDtcbiAgICB0aGlzLnRleHR1cmVidWZmZXJzID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IEJhc2VSZW5kZXJlciBmcm9tIFwiLi9CYXNlUmVuZGVyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VzdG9tUmVuZGVyZXIgZXh0ZW5kcyBCYXNlUmVuZGVyZXIge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG5cbiAgICB0aGlzLm5hbWUgPSBcIkN1c3RvbVJlbmRlcmVyXCI7XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4uL21hdGgvTWF0aFV0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgY29uc3RydWN0b3IoeDEsIHkxLCB4MiwgeTIsIGRpcmVjdGlvbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAoeDIgLSB4MSA+PSAwKSB7XG4gICAgICB0aGlzLngxID0geDE7XG4gICAgICB0aGlzLnkxID0geTE7XG4gICAgICB0aGlzLngyID0geDI7XG4gICAgICB0aGlzLnkyID0geTI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueDEgPSB4MjtcbiAgICAgIHRoaXMueTEgPSB5MjtcbiAgICAgIHRoaXMueDIgPSB4MTtcbiAgICAgIHRoaXMueTIgPSB5MTtcbiAgICB9XG5cbiAgICB0aGlzLmR4ID0gdGhpcy54MiAtIHRoaXMueDE7XG4gICAgdGhpcy5keSA9IHRoaXMueTIgLSB0aGlzLnkxO1xuXG4gICAgdGhpcy5taW54ID0gTWF0aC5taW4odGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5taW55ID0gTWF0aC5taW4odGhpcy55MSwgdGhpcy55Mik7XG4gICAgdGhpcy5tYXh4ID0gTWF0aC5tYXgodGhpcy54MSwgdGhpcy54Mik7XG4gICAgdGhpcy5tYXh5ID0gTWF0aC5tYXgodGhpcy55MSwgdGhpcy55Mik7XG5cbiAgICB0aGlzLmRvdCA9IHRoaXMueDIgKiB0aGlzLnkxIC0gdGhpcy54MSAqIHRoaXMueTI7XG4gICAgdGhpcy54eHl5ID0gdGhpcy5keCAqIHRoaXMuZHggKyB0aGlzLmR5ICogdGhpcy5keTtcblxuICAgIHRoaXMuZ3JhZGllbnQgPSB0aGlzLmdldEdyYWRpZW50KCk7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmdldExlbmd0aCgpO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gVXRpbC5pbml0VmFsdWUoZGlyZWN0aW9uLCBcIj5cIik7XG4gIH1cblxuICBnZXRQb3NpdGlvbigpIHtcbiAgICB0aGlzLnJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgdGhpcy52ZWN0b3IueCA9IHRoaXMueDEgKyB0aGlzLnJhbmRvbSAqIHRoaXMubGVuZ3RoICogTWF0aC5jb3ModGhpcy5ncmFkaWVudCk7XG4gICAgdGhpcy52ZWN0b3IueSA9IHRoaXMueTEgKyB0aGlzLnJhbmRvbSAqIHRoaXMubGVuZ3RoICogTWF0aC5zaW4odGhpcy5ncmFkaWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEIgPT09IDAgPyAxIDogQjtcblxuICAgIGlmICgoQSAqIHggKyBCICogeSArIEMpICogRCA+IDApIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RGlzdGFuY2UoeCwgeSkge1xuICAgIGNvbnN0IEEgPSB0aGlzLmR5O1xuICAgIGNvbnN0IEIgPSAtdGhpcy5keDtcbiAgICBjb25zdCBDID0gdGhpcy5kb3Q7XG4gICAgY29uc3QgRCA9IEEgKiB4ICsgQiAqIHkgKyBDO1xuXG4gICAgcmV0dXJuIEQgLyBNYXRoLnNxcnQodGhpcy54eHl5KTtcbiAgfVxuXG4gIGdldFN5bW1ldHJpYyh2KSB7XG4gICAgY29uc3QgdGhhMiA9IHYuZ2V0R3JhZGllbnQoKTtcbiAgICBjb25zdCB0aGExID0gdGhpcy5nZXRHcmFkaWVudCgpO1xuICAgIGNvbnN0IHRoYSA9IDIgKiAodGhhMSAtIHRoYTIpO1xuXG4gICAgY29uc3Qgb2xkeCA9IHYueDtcbiAgICBjb25zdCBvbGR5ID0gdi55O1xuXG4gICAgdi54ID0gb2xkeCAqIE1hdGguY29zKHRoYSkgLSBvbGR5ICogTWF0aC5zaW4odGhhKTtcbiAgICB2LnkgPSBvbGR4ICogTWF0aC5zaW4odGhhKSArIG9sZHkgKiBNYXRoLmNvcyh0aGEpO1xuXG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBnZXRHcmFkaWVudCgpIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLmR5LCB0aGlzLmR4KTtcbiAgfVxuXG4gIHJhbmdlT3V0KHBhcnRpY2xlKSB7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmFicyh0aGlzLmdldEdyYWRpZW50KCkpO1xuXG4gICAgaWYgKGFuZ2xlIDw9IE1hdGhVdGlsLlBJIC8gNCkge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCA8PSB0aGlzLm1heHggJiYgcGFydGljbGUucC54ID49IHRoaXMubWlueCkgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgPD0gdGhpcy5tYXh5ICYmIHBhcnRpY2xlLnAueSA+PSB0aGlzLm1pbnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldExlbmd0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZHggKiB0aGlzLmR4ICsgdGhpcy5keSAqIHRoaXMuZHkpO1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09IFwiPlwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcIlJcIiB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiIHx8IHRoaXMuZGlyZWN0aW9uID09PSBcImRvd25cIikge1xuICAgICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmdldERpcmVjdGlvbihwYXJ0aWNsZS5wLngsIHBhcnRpY2xlLnAueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlT3V0KHBhcnRpY2xlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0RGlyZWN0aW9uKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSkgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VPdXQocGFydGljbGUpKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLmdldERpc3RhbmNlKHBhcnRpY2xlLnAueCwgcGFydGljbGUucC55KSA8PSBwYXJ0aWNsZS5yYWRpdXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZHggPT09IDApIHtcbiAgICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5keSA9PT0gMCkge1xuICAgICAgICAgIHBhcnRpY2xlLnYueSAqPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdldFN5bW1ldHJpYyhwYXJ0aWNsZS52KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBMaW5lWm9uZSBkb2VzIG5vdCBzdXBwb3J0IGNyb3NzIG1ldGhvZCFcIik7XG4gICAgICAgIHRoaXMuYWxlcnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBNYXRoVXRpbCBmcm9tIFwiLi4vbWF0aC9NYXRoVXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjbGVab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHJhZGl1cykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5yYWRpdXMgPSByYWRpdXM7XG4gICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgdGhpcy5jZW50ZXIgPSB7IHgsIHkgfTtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMuYW5nbGUgPSBNYXRoVXRpbC5QSXgyICogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmRvbVJhZGl1cyA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLnZlY3Rvci54ID0gdGhpcy54ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLmNvcyh0aGlzLmFuZ2xlKTtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgdGhpcy5yYW5kb21SYWRpdXMgKiBNYXRoLnNpbih0aGlzLmFuZ2xlKTtcblxuICAgIHJldHVybiB0aGlzLnZlY3RvcjtcbiAgfVxuXG4gIHNldENlbnRlcih4LCB5KSB7XG4gICAgdGhpcy5jZW50ZXIueCA9IHg7XG4gICAgdGhpcy5jZW50ZXIueSA9IHk7XG4gIH1cblxuICBjcm9zc2luZyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IGQgPSBwYXJ0aWNsZS5wLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpO1xuXG4gICAgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImRlYWRcIikge1xuICAgICAgaWYgKGQgLSBwYXJ0aWNsZS5yYWRpdXMgPiB0aGlzLnJhZGl1cykgcGFydGljbGUuZGVhZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoZCArIHBhcnRpY2xlLnJhZGl1cyA+PSB0aGlzLnJhZGl1cykgdGhpcy5nZXRTeW1tZXRyaWMocGFydGljbGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiY3Jvc3NcIikge1xuICAgICAgaWYgKHRoaXMuYWxlcnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNvcnJ5LCBDaXJjbGVab25lIGRvZXMgbm90IHN1cHBvcnQgY3Jvc3MgbWV0aG9kIVwiKTtcbiAgICAgICAgdGhpcy5hbGVydCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFN5bW1ldHJpYyhwYXJ0aWNsZSkge1xuICAgIGNvbnN0IHRoYTIgPSBwYXJ0aWNsZS52LmdldEdyYWRpZW50KCk7XG4gICAgY29uc3QgdGhhMSA9IHRoaXMuZ2V0R3JhZGllbnQocGFydGljbGUpO1xuXG4gICAgY29uc3QgdGhhID0gMiAqICh0aGExIC0gdGhhMik7XG4gICAgY29uc3Qgb2xkeCA9IHBhcnRpY2xlLnYueDtcbiAgICBjb25zdCBvbGR5ID0gcGFydGljbGUudi55O1xuXG4gICAgcGFydGljbGUudi54ID0gb2xkeCAqIE1hdGguY29zKHRoYSkgLSBvbGR5ICogTWF0aC5zaW4odGhhKTtcbiAgICBwYXJ0aWNsZS52LnkgPSBvbGR4ICogTWF0aC5zaW4odGhhKSArIG9sZHkgKiBNYXRoLmNvcyh0aGEpO1xuICB9XG5cbiAgZ2V0R3JhZGllbnQocGFydGljbGUpIHtcbiAgICByZXR1cm4gLU1hdGhVdGlsLlBJXzIgKyBNYXRoLmF0YW4yKHBhcnRpY2xlLnAueSAtIHRoaXMuY2VudGVyLnksIHBhcnRpY2xlLnAueCAtIHRoaXMuY2VudGVyLngpO1xuICB9XG59XG4iLCJpbXBvcnQgWm9uZSBmcm9tIFwiLi9ab25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY3Rab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMudmVjdG9yLnggPSB0aGlzLnggKyBNYXRoLnJhbmRvbSgpICogdGhpcy53aWR0aDtcbiAgICB0aGlzLnZlY3Rvci55ID0gdGhpcy55ICsgTWF0aC5yYW5kb20oKSAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHRoaXMudmVjdG9yO1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICAvLyBwYXJ0aWNsZSBkZWFkIHpvbmVcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy54KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueCArIHRoaXMud2lkdGgpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuXG4gICAgICBpZiAocGFydGljbGUucC55ICsgcGFydGljbGUucmFkaXVzIDwgdGhpcy55KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSBwYXJ0aWNsZS5kZWFkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwYXJ0aWNsZSBib3VuZCB6b25lXG4gICAgZWxzZSBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiYm91bmRcIikge1xuICAgICAgaWYgKHBhcnRpY2xlLnAueCAtIHBhcnRpY2xlLnJhZGl1cyA8IHRoaXMueCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICAgIHBhcnRpY2xlLnYueCAqPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54ICsgcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggKyB0aGlzLndpZHRoIC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnggKj0gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgLSBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkpIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSArIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0IC0gcGFydGljbGUucmFkaXVzO1xuICAgICAgICBwYXJ0aWNsZS52LnkgKj0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcGFydGljbGUgY3Jvc3Mgem9uZVxuICAgIGVsc2UgaWYgKHRoaXMuY3Jvc3NUeXBlID09PSBcImNyb3NzXCIpIHtcbiAgICAgIGlmIChwYXJ0aWNsZS5wLnggKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnggJiYgcGFydGljbGUudi54IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC54ID0gdGhpcy54ICsgdGhpcy53aWR0aCArIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAocGFydGljbGUucC54IC0gcGFydGljbGUucmFkaXVzID4gdGhpcy54ICsgdGhpcy53aWR0aCAmJiBwYXJ0aWNsZS52LnggPj0gMCkge1xuICAgICAgICBwYXJ0aWNsZS5wLnggPSB0aGlzLnggLSBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWNsZS5wLnkgKyBwYXJ0aWNsZS5yYWRpdXMgPCB0aGlzLnkgJiYgcGFydGljbGUudi55IDw9IDApIHtcbiAgICAgICAgcGFydGljbGUucC55ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQgKyBwYXJ0aWNsZS5yYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHBhcnRpY2xlLnAueSAtIHBhcnRpY2xlLnJhZGl1cyA+IHRoaXMueSArIHRoaXMuaGVpZ2h0ICYmIHBhcnRpY2xlLnYueSA+PSAwKSB7XG4gICAgICAgIHBhcnRpY2xlLnAueSA9IHRoaXMueSAtIHBhcnRpY2xlLnJhZGl1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBab25lIGZyb20gXCIuL1pvbmVcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi91dGlscy9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3RvcihpbWFnZURhdGEsIHgsIHksIGQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzZXQoaW1hZ2VEYXRhLCB4LCB5LCBkKTtcbiAgfVxuXG4gIHJlc2V0KGltYWdlRGF0YSwgeCwgeSwgZCkge1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMueCA9IFV0aWwuaW5pdFZhbHVlKHgsIDApO1xuICAgIHRoaXMueSA9IFV0aWwuaW5pdFZhbHVlKHksIDApO1xuICAgIHRoaXMuZCA9IFV0aWwuaW5pdFZhbHVlKGQsIDIpO1xuXG4gICAgdGhpcy52ZWN0b3JzID0gW107XG4gICAgdGhpcy5zZXRWZWN0b3JzKCk7XG4gIH1cblxuICBzZXRWZWN0b3JzKCkge1xuICAgIGxldCBpLCBqO1xuICAgIGNvbnN0IGxlbmd0aDEgPSB0aGlzLmltYWdlRGF0YS53aWR0aDtcbiAgICBjb25zdCBsZW5ndGgyID0gdGhpcy5pbWFnZURhdGEuaGVpZ2h0O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDE7IGkgKz0gdGhpcy5kKSB7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoMjsgaiArPSB0aGlzLmQpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKChqID4+IDApICogbGVuZ3RoMSArIChpID4+IDApKSAqIDQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHtcbiAgICAgICAgICB0aGlzLnZlY3RvcnMucHVzaCh7IHg6IGkgKyB0aGlzLngsIHk6IGogKyB0aGlzLnkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52ZWN0b3I7XG4gIH1cblxuICBnZXRCb3VuZCh4LCB5KSB7XG4gICAgY29uc3QgaW5kZXggPSAoKHkgPj4gMCkgKiB0aGlzLmltYWdlRGF0YS53aWR0aCArICh4ID4+IDApKSAqIDQ7XG4gICAgaWYgKHRoaXMuaW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA+IDApIHJldHVybiB0cnVlO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24oKSB7XG4gICAgY29uc3QgdmVjdG9yID0gVXRpbC5nZXRSYW5kRnJvbUFycmF5KHRoaXMudmVjdG9ycyk7XG4gICAgcmV0dXJuIHRoaXMudmVjdG9yLmNvcHkodmVjdG9yKTtcbiAgfVxuXG4gIGdldENvbG9yKHgsIHkpIHtcbiAgICB4IC09IHRoaXMueDtcbiAgICB5IC09IHRoaXMueTtcbiAgICBjb25zdCBpID0gKCh5ID4+IDApICogdGhpcy5pbWFnZURhdGEud2lkdGggKyAoeCA+PiAwKSkgKiA0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaV0sXG4gICAgICBnOiB0aGlzLmltYWdlRGF0YS5kYXRhW2kgKyAxXSxcbiAgICAgIGI6IHRoaXMuaW1hZ2VEYXRhLmRhdGFbaSArIDJdLFxuICAgICAgYTogdGhpcy5pbWFnZURhdGEuZGF0YVtpICsgM11cbiAgICB9O1xuICB9XG5cbiAgY3Jvc3NpbmcocGFydGljbGUpIHtcbiAgICBpZiAodGhpcy5jcm9zc1R5cGUgPT09IFwiZGVhZFwiKSB7XG4gICAgICBpZiAodGhpcy5nZXRCb3VuZChwYXJ0aWNsZS5wLnggLSB0aGlzLngsIHBhcnRpY2xlLnAueSAtIHRoaXMueSkpIHBhcnRpY2xlLmRlYWQgPSB0cnVlO1xuICAgICAgZWxzZSBwYXJ0aWNsZS5kZWFkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzVHlwZSA9PT0gXCJib3VuZFwiKSB7XG4gICAgICBpZiAoIXRoaXMuZ2V0Qm91bmQocGFydGljbGUucC54IC0gdGhpcy54LCBwYXJ0aWNsZS5wLnkgLSB0aGlzLnkpKSBwYXJ0aWNsZS52Lm5lZ2F0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IENvbG9yVXRpbCBmcm9tIFwiLi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgQ2lyY2xlWm9uZSBmcm9tIFwiLi4vem9uZS9DaXJjbGVab25lXCI7XG5pbXBvcnQgUG9pbnRab25lIGZyb20gXCIuLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IExpbmVab25lIGZyb20gXCIuLi96b25lL0xpbmVab25lXCI7XG5pbXBvcnQgUmVjdFpvbmUgZnJvbSBcIi4uL3pvbmUvUmVjdFpvbmVcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhZGRFdmVudExpc3RlbmVyKHByb3RvbiwgZnVuYykge1xuICAgIHByb3Rvbi5hZGRFdmVudExpc3RlbmVyKFwiUFJPVE9OX1VQREFURV9BRlRFUlwiLCAoKSA9PiBmdW5jKCkpO1xuICB9LFxuXG4gIGdldFN0eWxlKGNvbG9yID0gXCIjZmYwMDAwXCIpIHtcbiAgICBjb25zdCByZ2IgPSBDb2xvclV0aWwuaGV4VG9SZ2IoY29sb3IpO1xuICAgIHJldHVybiBgcmdiYSgke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9LCAwLjUpYDtcbiAgfSxcblxuICBkcmF3Wm9uZShwcm90b24sIGNhbnZhcywgem9uZSwgY2xlYXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0U3R5bGUoKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sICgpID0+IHtcbiAgICAgIGlmIChjbGVhcikgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgaWYgKHpvbmUgaW5zdGFuY2VvZiBQb2ludFpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgY29udGV4dC5hcmMoem9uZS54LCB6b25lLnksIDEwLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIGlmICh6b25lIGluc3RhbmNlb2YgTGluZVpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyh6b25lLngxLCB6b25lLnkxKTtcbiAgICAgICAgY29udGV4dC5saW5lVG8oem9uZS54Miwgem9uZS55Mik7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUgaW5zdGFuY2VvZiBSZWN0Wm9uZSkge1xuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGU7XG4gICAgICAgIGNvbnRleHQuZHJhd1JlY3Qoem9uZS54LCB6b25lLnksIHpvbmUud2lkdGgsIHpvbmUuaGVpZ2h0KTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAoem9uZSBpbnN0YW5jZW9mIENpcmNsZVpvbmUpIHtcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0eWxlO1xuICAgICAgICBjb250ZXh0LmFyYyh6b25lLngsIHpvbmUueSwgem9uZS5yYWRpdXMsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICBkcmF3RW1pdHRlcihwcm90b24sIGNhbnZhcywgZW1pdHRlciwgY2xlYXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0U3R5bGUoKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihwcm90b24sICgpID0+IHtcbiAgICAgIGlmIChjbGVhcikgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gc3R5bGU7XG4gICAgICBjb250ZXh0LmFyYyhlbWl0dGVyLnAueCwgZW1pdHRlci5wLnksIDEwLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUHJvdG9uIGZyb20gXCIuL2NvcmUvUHJvdG9uXCI7XG5pbXBvcnQgUGFydGljbGUgZnJvbSBcIi4vY29yZS9QYXJ0aWNsZVwiO1xuaW1wb3J0IFBvb2wgZnJvbSBcIi4vY29yZS9Qb29sXCI7XG5cbmltcG9ydCBVdGlsIGZyb20gXCIuL3V0aWxzL1V0aWxcIjtcbmltcG9ydCBDb2xvclV0aWwgZnJvbSBcIi4vdXRpbHMvQ29sb3JVdGlsXCI7XG5pbXBvcnQgTWF0aFV0aWwgZnJvbSBcIi4vbWF0aC9NYXRoVXRpbFwiO1xuaW1wb3J0IFZlY3RvcjJEIGZyb20gXCIuL21hdGgvVmVjdG9yMkRcIjtcbmltcG9ydCBQb2xhcjJEIGZyb20gXCIuL21hdGgvUG9sYXIyRFwiO1xuaW1wb3J0IE1hdDMgZnJvbSBcIi4vbWF0aC9NYXQzXCI7XG5pbXBvcnQgU3BhbiBmcm9tIFwiLi9tYXRoL1NwYW5cIjtcbmltcG9ydCBBcnJheVNwYW4gZnJvbSBcIi4vbWF0aC9BcnJheVNwYW5cIjtcbmltcG9ydCBSZWN0YW5nbGUgZnJvbSBcIi4vbWF0aC9SZWN0YW5nbGVcIjtcbmltcG9ydCBlYXNlIGZyb20gXCIuL21hdGgvZWFzZVwiO1xuXG5pbXBvcnQgUmF0ZSBmcm9tIFwiLi9pbml0aWFsaXplL1JhdGVcIjtcbmltcG9ydCBJbml0aWFsaXplIGZyb20gXCIuL2luaXRpYWxpemUvSW5pdGlhbGl6ZVwiO1xuaW1wb3J0IExpZmUgZnJvbSBcIi4vaW5pdGlhbGl6ZS9MaWZlXCI7XG5pbXBvcnQgUG9zaXRpb24gZnJvbSBcIi4vaW5pdGlhbGl6ZS9Qb3NpdGlvblwiO1xuaW1wb3J0IFZlbG9jaXR5IGZyb20gXCIuL2luaXRpYWxpemUvVmVsb2NpdHlcIjtcbmltcG9ydCBNYXNzIGZyb20gXCIuL2luaXRpYWxpemUvTWFzc1wiO1xuaW1wb3J0IFJhZGl1cyBmcm9tIFwiLi9pbml0aWFsaXplL1JhZGl1c1wiO1xuaW1wb3J0IEJvZHkgZnJvbSBcIi4vaW5pdGlhbGl6ZS9Cb2R5XCI7XG5cbmltcG9ydCBCZWhhdmlvdXIgZnJvbSBcIi4vYmVoYXZpb3VyL0JlaGF2aW91clwiO1xuaW1wb3J0IEZvcmNlIGZyb20gXCIuL2JlaGF2aW91ci9Gb3JjZVwiO1xuaW1wb3J0IEF0dHJhY3Rpb24gZnJvbSBcIi4vYmVoYXZpb3VyL0F0dHJhY3Rpb25cIjtcbmltcG9ydCBSYW5kb21EcmlmdCBmcm9tIFwiLi9iZWhhdmlvdXIvUmFuZG9tRHJpZnRcIjtcbmltcG9ydCBHcmF2aXR5IGZyb20gXCIuL2JlaGF2aW91ci9HcmF2aXR5XCI7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gXCIuL2JlaGF2aW91ci9Db2xsaXNpb25cIjtcbmltcG9ydCBDcm9zc1pvbmUgZnJvbSBcIi4vYmVoYXZpb3VyL0Nyb3NzWm9uZVwiO1xuaW1wb3J0IEFscGhhIGZyb20gXCIuL2JlaGF2aW91ci9BbHBoYVwiO1xuaW1wb3J0IFNjYWxlIGZyb20gXCIuL2JlaGF2aW91ci9TY2FsZVwiO1xuaW1wb3J0IFJvdGF0ZSBmcm9tIFwiLi9iZWhhdmlvdXIvUm90YXRlXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIi4vYmVoYXZpb3VyL0NvbG9yXCI7XG5pbXBvcnQgQ3ljbG9uZSBmcm9tIFwiLi9iZWhhdmlvdXIvQ3ljbG9uZVwiO1xuaW1wb3J0IFJlcHVsc2lvbiBmcm9tIFwiLi9iZWhhdmlvdXIvUmVwdWxzaW9uXCI7XG5pbXBvcnQgR3Jhdml0eVdlbGwgZnJvbSBcIi4vYmVoYXZpb3VyL0dyYXZpdHlXZWxsXCI7XG5cbmltcG9ydCBFbWl0dGVyIGZyb20gXCIuL2VtaXR0ZXIvRW1pdHRlclwiO1xuaW1wb3J0IEJlaGF2aW91ckVtaXR0ZXIgZnJvbSBcIi4vZW1pdHRlci9CZWhhdmlvdXJFbWl0dGVyXCI7XG5pbXBvcnQgRm9sbG93RW1pdHRlciBmcm9tIFwiLi9lbWl0dGVyL0ZvbGxvd0VtaXR0ZXJcIjtcblxuaW1wb3J0IENhbnZhc1JlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9DYW52YXNSZW5kZXJlclwiO1xuaW1wb3J0IERvbVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9Eb21SZW5kZXJlclwiO1xuaW1wb3J0IEVhc2VsUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0Vhc2VsUmVuZGVyZXJcIjtcbmltcG9ydCBQaXhlbFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9QaXhlbFJlbmRlcmVyXCI7XG5pbXBvcnQgUGl4aVJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9QaXhpUmVuZGVyZXJcIjtcbmltcG9ydCBXZWJHTFJlbmRlcmVyIGZyb20gXCIuL3JlbmRlci9XZWJHTFJlbmRlcmVyXCI7XG5pbXBvcnQgQ3VzdG9tUmVuZGVyZXIgZnJvbSBcIi4vcmVuZGVyL0N1c3RvbVJlbmRlcmVyXCI7XG5cbmltcG9ydCBab25lIGZyb20gXCIuL3pvbmUvWm9uZVwiO1xuaW1wb3J0IExpbmVab25lIGZyb20gXCIuL3pvbmUvTGluZVpvbmVcIjtcbmltcG9ydCBDaXJjbGVab25lIGZyb20gXCIuL3pvbmUvQ2lyY2xlWm9uZVwiO1xuaW1wb3J0IFBvaW50Wm9uZSBmcm9tIFwiLi96b25lL1BvaW50Wm9uZVwiO1xuaW1wb3J0IFJlY3Rab25lIGZyb20gXCIuL3pvbmUvUmVjdFpvbmVcIjtcbmltcG9ydCBJbWFnZVpvbmUgZnJvbSBcIi4vem9uZS9JbWFnZVpvbmVcIjtcblxuaW1wb3J0IERlYnVnIGZyb20gXCIuL2RlYnVnL0RlYnVnXCI7XG5cbi8vIG5hbWVzcGFjZVxuUHJvdG9uLlBhcnRpY2xlID0gUGFydGljbGU7XG5Qcm90b24uUG9vbCA9IFBvb2w7XG5cblByb3Rvbi5VdGlsID0gVXRpbDtcblByb3Rvbi5Db2xvclV0aWwgPSBDb2xvclV0aWw7XG5Qcm90b24uTWF0aFV0aWwgPSBNYXRoVXRpbDtcblByb3Rvbi5WZWN0b3IyRCA9IFByb3Rvbi5WZWN0b3IgPSBWZWN0b3IyRDtcblByb3Rvbi5Qb2xhcjJEID0gUHJvdG9uLlBvbGFyID0gUG9sYXIyRDtcblByb3Rvbi5BcnJheVNwYW4gPSBBcnJheVNwYW47XG5Qcm90b24uUmVjdGFuZ2xlID0gUmVjdGFuZ2xlO1xuUHJvdG9uLlJhdGUgPSBSYXRlO1xuUHJvdG9uLmVhc2UgPSBlYXNlO1xuUHJvdG9uLlNwYW4gPSBTcGFuO1xuUHJvdG9uLk1hdDMgPSBNYXQzO1xuUHJvdG9uLmdldFNwYW4gPSAoYSwgYiwgY2VudGVyKSA9PiBuZXcgU3BhbihhLCBiLCBjZW50ZXIpO1xuUHJvdG9uLmNyZWF0ZUFycmF5U3BhbiA9IEFycmF5U3Bhbi5jcmVhdGVBcnJheVNwYW47XG5cblByb3Rvbi5Jbml0aWFsaXplID0gUHJvdG9uLkluaXQgPSBJbml0aWFsaXplO1xuUHJvdG9uLkxpZmUgPSBQcm90b24uTCA9IExpZmU7XG5Qcm90b24uUG9zaXRpb24gPSBQcm90b24uUCA9IFBvc2l0aW9uO1xuUHJvdG9uLlZlbG9jaXR5ID0gUHJvdG9uLlYgPSBWZWxvY2l0eTtcblByb3Rvbi5NYXNzID0gUHJvdG9uLk0gPSBNYXNzO1xuUHJvdG9uLlJhZGl1cyA9IFByb3Rvbi5SID0gUmFkaXVzO1xuUHJvdG9uLkJvZHkgPSBQcm90b24uQiA9IEJvZHk7XG5cblByb3Rvbi5CZWhhdmlvdXIgPSBCZWhhdmlvdXI7XG5Qcm90b24uRm9yY2UgPSBQcm90b24uRiA9IEZvcmNlO1xuUHJvdG9uLkF0dHJhY3Rpb24gPSBQcm90b24uQSA9IEF0dHJhY3Rpb247XG5Qcm90b24uUmFuZG9tRHJpZnQgPSBQcm90b24uUkQgPSBSYW5kb21EcmlmdDtcblByb3Rvbi5HcmF2aXR5ID0gUHJvdG9uLkcgPSBHcmF2aXR5O1xuUHJvdG9uLkNvbGxpc2lvbiA9IENvbGxpc2lvbjtcblByb3Rvbi5Dcm9zc1pvbmUgPSBDcm9zc1pvbmU7XG5Qcm90b24uQWxwaGEgPSBBbHBoYTtcblByb3Rvbi5TY2FsZSA9IFByb3Rvbi5TID0gU2NhbGU7XG5Qcm90b24uUm90YXRlID0gUm90YXRlO1xuUHJvdG9uLkNvbG9yID0gQ29sb3I7XG5Qcm90b24uUmVwdWxzaW9uID0gUmVwdWxzaW9uO1xuUHJvdG9uLkN5Y2xvbmUgPSBDeWNsb25lO1xuUHJvdG9uLkdyYXZpdHlXZWxsID0gR3Jhdml0eVdlbGw7XG5cblByb3Rvbi5FbWl0dGVyID0gRW1pdHRlcjtcblByb3Rvbi5CZWhhdmlvdXJFbWl0dGVyID0gQmVoYXZpb3VyRW1pdHRlcjtcblByb3Rvbi5Gb2xsb3dFbWl0dGVyID0gRm9sbG93RW1pdHRlcjtcblxuUHJvdG9uLlpvbmUgPSBab25lO1xuUHJvdG9uLkxpbmVab25lID0gTGluZVpvbmU7XG5Qcm90b24uQ2lyY2xlWm9uZSA9IENpcmNsZVpvbmU7XG5Qcm90b24uUG9pbnRab25lID0gUG9pbnRab25lO1xuUHJvdG9uLlJlY3Rab25lID0gUmVjdFpvbmU7XG5Qcm90b24uSW1hZ2Vab25lID0gSW1hZ2Vab25lO1xuXG5Qcm90b24uQ2FudmFzUmVuZGVyZXIgPSBDYW52YXNSZW5kZXJlcjtcblByb3Rvbi5Eb21SZW5kZXJlciA9IERvbVJlbmRlcmVyO1xuUHJvdG9uLkVhc2VsUmVuZGVyZXIgPSBFYXNlbFJlbmRlcmVyO1xuUHJvdG9uLlBpeGlSZW5kZXJlciA9IFBpeGlSZW5kZXJlcjtcblByb3Rvbi5QaXhlbFJlbmRlcmVyID0gUGl4ZWxSZW5kZXJlcjtcblByb3Rvbi5XZWJHTFJlbmRlcmVyID0gUHJvdG9uLldlYkdsUmVuZGVyZXIgPSBXZWJHTFJlbmRlcmVyO1xuUHJvdG9uLkN1c3RvbVJlbmRlcmVyID0gQ3VzdG9tUmVuZGVyZXI7XG5cblByb3Rvbi5EZWJ1ZyA9IERlYnVnO1xuVXRpbC5hc3NpZ24oUHJvdG9uLCBlYXNlKTtcblxuLy8gZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBQcm90b247XG4iXSwibmFtZXMiOlsiaXBvdCIsImxlbmd0aCIsIm5ocG90IiwiaSIsIm1ha2VUcmFuc2xhdGlvbiIsInR4IiwidHkiLCJtYWtlUm90YXRpb24iLCJhbmdsZUluUmFkaWFucyIsImMiLCJNYXRoIiwiY29zIiwicyIsInNpbiIsIm1ha2VTY2FsZSIsInN4Iiwic3kiLCJtYXRyaXhNdWx0aXBseSIsImEiLCJiIiwiYTAwIiwiYTAxIiwiYTAyIiwiYTEwIiwiYTExIiwiYTEyIiwiYTIwIiwiYTIxIiwiYTIyIiwiYjAwIiwiYjAxIiwiYjAyIiwiYjEwIiwiYjExIiwiYjEyIiwiYjIwIiwiYjIxIiwiYjIyIiwiY3JlYXRlQ2FudmFzIiwiaWQiLCJ3aWR0aCIsImhlaWdodCIsInBvc2l0aW9uIiwiZG9tIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwiY3JlYXRlRGl2IiwicmVzaXplIiwibWFyZ2luTGVmdCIsIm1hcmdpblRvcCIsImRpdiIsIngiLCJ5Iiwic2NhbGUiLCJyb3RhdGUiLCJ3aWxsQ2hhbmdlIiwiY3NzMyIsInRyYW5zZm9ybTNkIiwia2V5IiwidmFsIiwiYmtleSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic3Vic3RyIiwiaW1nc0NhY2hlIiwiY2FudmFzQ2FjaGUiLCJjYW52YXNJZCIsImdldEltYWdlRGF0YSIsImNvbnRleHQiLCJpbWFnZSIsInJlY3QiLCJkcmF3SW1hZ2UiLCJpbWFnZWRhdGEiLCJjbGVhclJlY3QiLCJnZXRJbWdGcm9tQ2FjaGUiLCJpbWciLCJjYWxsYmFjayIsInBhcmFtIiwic3JjIiwiSW1hZ2UiLCJvbmxvYWQiLCJlIiwidGFyZ2V0IiwiZ2V0Q2FudmFzRnJvbUNhY2hlIiwiV2ViR0xVdGlsIiwiY2FudmFzIiwiRG9tVXRpbCIsImdldENvbnRleHQiLCJpbml0VmFsdWUiLCJ2YWx1ZSIsImRlZmF1bHRzIiwidW5kZWZpbmVkIiwiaXNBcnJheSIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImVtcHR5QXJyYXkiLCJhcnIiLCJ0b0FycmF5Iiwic2xpY2VBcnJheSIsImFycjEiLCJpbmRleCIsImFycjIiLCJwdXNoIiwiZ2V0UmFuZEZyb21BcnJheSIsImZsb29yIiwicmFuZG9tIiwiZW1wdHlPYmplY3QiLCJvYmoiLCJpZ25vcmUiLCJpbmRleE9mIiwiY2xhc3NBcHBseSIsImNvbnN0cnVjdG9yIiwiYXJncyIsIkZhY3RvcnlGdW5jIiwiYmluZCIsImFwcGx5IiwiY29uY2F0IiwiSW1nVXRpbCIsImRlc3Ryb3lBbGwiLCJkZXN0cm95IiwiYXNzaWduIiwic291cmNlIiwiaGFzT3duUHJvcGVydHkiLCJpZHNNYXAiLCJQdWlkIiwiX2luZGV4IiwiX2NhY2hlIiwidHlwZSIsImdldElkIiwidWlkIiwiZ2V0SWRGcm9tQ2FjaGUiLCJpc0JvZHkiLCJpc0lubmVyIiwiZ2V0VGFyZ2V0IiwiUG9vbCIsIm51bSIsInRvdGFsIiwiY2FjaGUiLCJnZXQiLCJwYXJhbXMiLCJwIiwiX19wdWlkIiwicG9wIiwiY3JlYXRlT3JDbG9uZSIsImV4cGlyZSIsImdldENhY2hlIiwiY3JlYXRlIiwiVXRpbCIsImNsb25lIiwiZ2V0Q291bnQiLCJjb3VudCIsIlN0YXRzIiwicHJvdG9uIiwiY29udGFpbmVyIiwiZW1pdHRlckluZGV4IiwicmVuZGVyZXJJbmRleCIsInVwZGF0ZSIsImJvZHkiLCJhZGQiLCJlbWl0dGVyIiwiZ2V0RW1pdHRlciIsInJlbmRlcmVyIiwiZ2V0UmVuZGVyZXIiLCJzdHIiLCJlbWl0dGVycyIsImVtaXRTcGVlZCIsImdldEVtaXR0ZXJQb3MiLCJpbml0aWFsaXplcyIsImNvbmNhdEFyciIsImJlaGF2aW91cnMiLCJuYW1lIiwiZ2V0Q3JlYXRlZE51bWJlciIsInBvb2wiLCJpbm5lckhUTUwiLCJjc3NUZXh0Iiwiam9pbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJiZyIsImNvbG9yIiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwicmVuZGVyZXJzIiwicmVzdWx0IiwiY3Bvb2wiLCJyb3VuZCIsInJlbW92ZUNoaWxkIiwiRXZlbnREaXNwYXRjaGVyIiwiX2xpc3RlbmVycyIsImRpc3BhdGNoRXZlbnQiLCJoYXNFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIiwibGlzdGVuZXIiLCJzcGxpY2UiLCJsaXN0ZW5lcnMiLCJoYW5kbGVyIiwiUEkiLCJJTkZJTklUWSIsIkluZmluaXR5IiwiTWF0aFV0aWwiLCJQSXgyIiwiUElfMiIsIlBJXzE4MCIsIk4xODBfUEkiLCJpc0luZmluaXR5IiwicmFuZG9tQVRvQiIsImlzSW50IiwicmFuZG9tRmxvYXRpbmciLCJjZW50ZXIiLCJmIiwicmFuZG9tQ29sb3IiLCJzbGljZSIsInJhbmRvbVpvbmUiLCJkaXNwbGF5IiwiayIsImRpZ2l0cyIsInBvdyIsImRlZ3JlZVRyYW5zZm9ybSIsInRvQ29sb3IxNiIsIkludGVncmF0aW9uIiwiY2FsY3VsYXRlIiwicGFydGljbGVzIiwidGltZSIsImRhbXBpbmciLCJldWxlckludGVncmF0ZSIsInBhcnRpY2xlIiwic2xlZXAiLCJvbGQiLCJjb3B5IiwidiIsIm11bHRpcGx5U2NhbGFyIiwibWFzcyIsImNsZWFyIiwiUHJvdG9uIiwiaW50ZWdyYXRpb25UeXBlIiwibm93IiwidGhlbiIsImVsYXBzZWQiLCJzdGF0cyIsIkVVTEVSIiwiaW50ZWdyYXRvciIsIl9mcHMiLCJfaW50ZXJ2YWwiLCJERUZBVUxUX0lOVEVSVkFMIiwiYWRkUmVuZGVyZXIiLCJyZW5kZXIiLCJpbml0IiwicmVtb3ZlUmVuZGVyZXIiLCJyZW1vdmUiLCJhZGRFbWl0dGVyIiwicGFyZW50IiwiRU1JVFRFUl9BRERFRCIsInJlbW92ZUVtaXR0ZXIiLCJFTUlUVEVSX1JFTU9WRUQiLCJQUk9UT05fVVBEQVRFIiwiVVNFX0NMT0NLIiwiRGF0ZSIsImdldFRpbWUiLCJhbWVuZENoYW5nZVRhYnNCdWciLCJlbWl0dGVyc1VwZGF0ZSIsIlBST1RPTl9VUERBVEVfQUZURVIiLCJnZXRBbGxQYXJ0aWNsZXMiLCJkZXN0cm95QWxsRW1pdHRlcnMiLCJkZXN0cm95T3RoZXIiLCJzZXRUaW1lb3V0IiwiZnBzIiwiTUVBU1VSRSIsIlJLMiIsIlBBUlRJQ0xFX0NSRUFURUQiLCJQQVJUSUNMRV9VUERBVEUiLCJQQVJUSUNMRV9TTEVFUCIsIlBBUlRJQ0xFX0RFQUQiLCJSZ2IiLCJyIiwiZyIsInJlc2V0IiwiU3BhbiIsImdldFZhbHVlIiwic2V0U3BhblZhbHVlIiwiZ2V0U3BhblZhbHVlIiwicGFuIiwiaGFzUHJvcCIsInNldFByb3AiLCJwcm9wcyIsInByb3AiLCJzZXRWZWN0b3JWYWwiLCJjb25mIiwiZWFzZUxpbmVhciIsImVhc2VJblF1YWQiLCJlYXNlT3V0UXVhZCIsImVhc2VJbk91dFF1YWQiLCJlYXNlSW5DdWJpYyIsImVhc2VPdXRDdWJpYyIsImVhc2VJbk91dEN1YmljIiwiZWFzZUluUXVhcnQiLCJlYXNlT3V0UXVhcnQiLCJlYXNlSW5PdXRRdWFydCIsImVhc2VJblNpbmUiLCJlYXNlT3V0U2luZSIsImVhc2VJbk91dFNpbmUiLCJlYXNlSW5FeHBvIiwiZWFzZU91dEV4cG8iLCJlYXNlSW5PdXRFeHBvIiwiZWFzZUluQ2lyYyIsInNxcnQiLCJlYXNlT3V0Q2lyYyIsImVhc2VJbk91dENpcmMiLCJlYXNlSW5CYWNrIiwiZWFzZU91dEJhY2siLCJlYXNlSW5PdXRCYWNrIiwiZ2V0RWFzaW5nIiwiZWFzZSIsIlZlY3RvcjJEIiwic2V0Iiwic2V0WCIsInNldFkiLCJnZXRHcmFkaWVudCIsImF0YW4yIiwidyIsImFkZFZlY3RvcnMiLCJhZGRYWSIsInN1YiIsInN1YlZlY3RvcnMiLCJkaXZpZGVTY2FsYXIiLCJuZWdhdGUiLCJkb3QiLCJsZW5ndGhTcSIsIm5vcm1hbGl6ZSIsImRpc3RhbmNlVG8iLCJkaXN0YW5jZVRvU3F1YXJlZCIsInRoYSIsImR4IiwiZHkiLCJsZXJwIiwiYWxwaGEiLCJlcXVhbHMiLCJQYXJ0aWNsZSIsImRhdGEiLCJyZ2IiLCJQcm9wVXRpbCIsImdldERpcmVjdGlvbiIsImxpZmUiLCJhZ2UiLCJkZWFkIiwic3ByaXRlIiwiZW5lcmd5IiwicmFkaXVzIiwicm90YXRpb24iLCJlYXNpbmciLCJyZW1vdmVBbGxCZWhhdmlvdXJzIiwiYXBwbHlCZWhhdmlvdXJzIiwibWF4IiwiYXBwbHlCZWhhdmlvdXIiLCJhZGRCZWhhdmlvdXIiLCJiZWhhdmlvdXIiLCJwYXJlbnRzIiwiaW5pdGlhbGl6ZSIsImFkZEJlaGF2aW91cnMiLCJyZW1vdmVCZWhhdmlvdXIiLCJoZXhUb1JnYiIsImgiLCJoZXgxNiIsInN1YnN0cmluZyIsInBhcnNlSW50IiwicmdiVG9IZXgiLCJyYmciLCJnZXRIZXgxNkZyb21QYXJ0aWNsZSIsIk51bWJlciIsIlBvbGFyMkQiLCJhYnMiLCJzZXRSIiwic2V0VGhhIiwidG9WZWN0b3IiLCJnZXRYIiwiZ2V0WSIsIk1hdDMiLCJtYXQzIiwibWF0IiwiRmxvYXQzMkFycmF5IiwibWF0MSIsIm1hdDIiLCJtdWx0aXBseSIsImludmVyc2UiLCJkIiwibXVsdGlwbHlWZWMyIiwibSIsInZlYyIsIkFycmF5U3BhbiIsIl9hcnIiLCJjcmVhdGVBcnJheVNwYW4iLCJSZWN0YW5nbGUiLCJib3R0b20iLCJyaWdodCIsImNvbnRhaW5zIiwiUmF0ZSIsIm51bXBhbiIsInRpbWVwYW4iLCJudW1QYW4iLCJ0aW1lUGFuIiwic3RhcnRUaW1lIiwibmV4dFRpbWUiLCJJbml0aWFsaXplIiwiTGlmZSIsImxpZmVQYW4iLCJab25lIiwidmVjdG9yIiwiY3Jvc3NUeXBlIiwiYWxlcnQiLCJnZXRQb3NpdGlvbiIsImNyb3NzaW5nIiwiUG9pbnRab25lIiwiY29uc29sZSIsImVycm9yIiwiUG9zaXRpb24iLCJ6b25lIiwiVmVsb2NpdHkiLCJycGFuIiwidGhhcGFuIiwiclBhbiIsInRoYVBhbiIsIm5vcm1hbGl6ZVZlbG9jaXR5IiwidnIiLCJwb2xhcjJkIiwiTWFzcyIsIm1hc3NQYW4iLCJSYWRpdXMiLCJvbGRSYWRpdXMiLCJCb2R5IiwiaW1hZ2VUYXJnZXQiLCJpbm5lciIsIkJlaGF2aW91ciIsIm5vcm1hbGl6ZUZvcmNlIiwiZm9yY2UiLCJub3JtYWxpemVWYWx1ZSIsIkZvcmNlIiwiZngiLCJmeSIsIkF0dHJhY3Rpb24iLCJ0YXJnZXRQb3NpdGlvbiIsInJhZGl1c1NxIiwiYXR0cmFjdGlvbkZvcmNlIiwiUmFuZG9tRHJpZnQiLCJkcmlmdFgiLCJkcmlmdFkiLCJkZWxheSIsInBhbkZvY2UiLCJHcmF2aXR5IiwiQ29sbGlzaW9uIiwibmV3UG9vbCIsImNvbGxpc2lvblBvb2wiLCJkZWx0YSIsIm90aGVyUGFydGljbGUiLCJvdmVybGFwIiwidG90YWxNYXNzIiwiYXZlcmFnZU1hc3MxIiwiYXZlcmFnZU1hc3MyIiwiZGlzdGFuY2UiLCJDcm9zc1pvbmUiLCJBbHBoYSIsInNhbWUiLCJhbHBoYUEiLCJhbHBoYUIiLCJTY2FsZSIsInNjYWxlQSIsInNjYWxlQiIsIlJvdGF0ZSIsImluZmx1ZW5jZSIsInJvdGF0aW9uQSIsInJvdGF0aW9uQiIsIkNvbG9yIiwiY29sb3JBIiwiQ29sb3JVdGlsIiwiY29sb3JCIiwiQ0hBTkdJTkciLCJDeWNsb25lIiwiYW5nbGUiLCJzZXRBbmdsZUFuZEZvcmNlIiwic3BhbiIsIlN0cmluZyIsInRvTG93ZXJDYXNlIiwiY2FuZ2xlIiwiY3ljbG9uZSIsImdyYWRpZW50IiwiUmVwdWxzaW9uIiwiR3Jhdml0eVdlbGwiLCJjZW50ZXJQb2ludCIsImRpc3RhbmNlVmVjIiwiZGlzdGFuY2VTcSIsImZhY3RvciIsImJpbmRFbWl0dGVyIiwiRW1pdHRlciIsImVtaXRUaW1lIiwidG90YWxUaW1lIiwicmF0ZSIsImVtaXQiLCJzdG9wZWQiLCJpc05hTiIsInN0b3AiLCJwcmVFbWl0Iiwib2xkU3RvcGVkIiwib2xkRW1pdFRpbWUiLCJvbGRUb3RhbFRpbWUiLCJzdGVwIiwicmVtb3ZlQWxsUGFydGljbGVzIiwiYWRkU2VsZkluaXRpYWxpemUiLCJhZGRJbml0aWFsaXplIiwicmVzdCIsInJlbW92ZUluaXRpYWxpemUiLCJpbml0aWFsaXplciIsInJlbW92ZUFsbEluaXRpYWxpemVycyIsImFyZ3VtZW50cyIsImVtaXR0aW5nIiwiaW50ZWdyYXRlIiwiZGlzcGF0Y2giLCJldmVudCIsImJpbmRFdmVudCIsImNyZWF0ZVBhcnRpY2xlIiwic2V0dXBQYXJ0aWNsZSIsIkluaXRpYWxpemVVdGlsIiwiQmVoYXZpb3VyRW1pdHRlciIsInNlbGZCZWhhdmlvdXJzIiwiYWRkU2VsZkJlaGF2aW91ciIsInJlbW92ZVNlbGZCZWhhdmlvdXIiLCJGb2xsb3dFbWl0dGVyIiwibW91c2VUYXJnZXQiLCJ3aW5kb3ciLCJfYWxsb3dFbWl0dGluZyIsImluaXRFdmVudEhhbmRsZXIiLCJtb3VzZW1vdmVIYW5kbGVyIiwibW91c2Vtb3ZlIiwibW91c2Vkb3duSGFuZGxlciIsIm1vdXNlZG93biIsIm1vdXNldXBIYW5kbGVyIiwibW91c2V1cCIsImxheWVyWCIsImxheWVyWSIsIm9mZnNldFgiLCJvZmZzZXRZIiwiaXNJbWFnZSIsIl9faXNJbWFnZSIsInRhZ05hbWUiLCJub2RlTmFtZSIsImlzU3RyaW5nIiwiQmFzZVJlbmRlcmVyIiwiZWxlbWVudCIsInN0cm9rZSIsImNpcmNsZUNvbmYiLCJpc0NpcmNsZSIsInNldFN0cm9rZSIsInRoaW5rbmVzcyIsIl9wcm90b25VcGRhdGVIYW5kbGVyIiwib25Qcm90b25VcGRhdGUiLCJfcHJvdG9uVXBkYXRlQWZ0ZXJIYW5kbGVyIiwib25Qcm90b25VcGRhdGVBZnRlciIsIl9lbWl0dGVyQWRkZWRIYW5kbGVyIiwib25FbWl0dGVyQWRkZWQiLCJfZW1pdHRlclJlbW92ZWRIYW5kbGVyIiwib25FbWl0dGVyUmVtb3ZlZCIsIl9wYXJ0aWNsZUNyZWF0ZWRIYW5kbGVyIiwib25QYXJ0aWNsZUNyZWF0ZWQiLCJfcGFydGljbGVVcGRhdGVIYW5kbGVyIiwib25QYXJ0aWNsZVVwZGF0ZSIsIl9wYXJ0aWNsZURlYWRIYW5kbGVyIiwib25QYXJ0aWNsZURlYWQiLCJDYW52YXNSZW5kZXJlciIsImJ1ZmZlckNhY2hlIiwiYWRkSW1nMkJvZHkiLCJUeXBlcyIsImRyYXdDaXJjbGUiLCJidWZmZXIiLCJjcmVhdGVCdWZmZXIiLCJidWZDb250ZXh0IiwiZ2xvYmFsQWxwaGEiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsInNhdmUiLCJ0cmFuc2xhdGUiLCJyZXN0b3JlIiwiYmVnaW5QYXRoIiwiYXJjIiwic3Ryb2tlU3R5bGUiLCJsaW5lV2lkdGgiLCJjbG9zZVBhdGgiLCJmaWxsIiwic2l6ZSIsIkRvbVJlbmRlcmVyIiwiY3JlYXRlQm9keSIsImJvZHlSZWFkeSIsImJhY2tncm91bmRDb2xvciIsImNyZWF0ZUNpcmNsZSIsImNyZWF0ZVNwcml0ZSIsImJvcmRlclJhZGl1cyIsImJvcmRlckNvbG9yIiwiYm9yZGVyV2lkdGgiLCJ1cmwiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJFYXNlbFJlbmRlcmVyIiwiYWRkQ2hpbGQiLCJzY2FsZVgiLCJzY2FsZVkiLCJncmFwaGljcyIsInJlZ1giLCJyZWdZIiwiY3JlYXRlanMiLCJHcmFwaGljcyIsImJlZ2luU3Ryb2tlIiwiYmVnaW5GaWxsIiwic2hhcGUiLCJTaGFwZSIsIlBpeGVsUmVuZGVyZXIiLCJyZWN0YW5nbGUiLCJpbWFnZURhdGEiLCJjcmVhdGVJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJzZXRQaXhlbCIsIlBJWElDbGFzcyIsIlBpeGlSZW5kZXJlciIsInNldENvbG9yIiwiYmxlbmRNb2RlIiwic2V0UElYSSIsIlBJWEkiLCJTcHJpdGUiLCJjcmVhdGVGcm9tSW1hZ2UiLCJmcm9tIiwiZnJvbUltYWdlIiwidGludCIsImFuY2hvciIsImVuZEZpbGwiLCJNU3RhY2siLCJtYXRzIiwidG9wIiwiV2ViR0xSZW5kZXJlciIsImdsIiwiYW50aWFsaWFzIiwic3RlbmNpbCIsImRlcHRoIiwiaW5pdFZhciIsInNldE1heFJhZGl1cyIsImluaXRTaGFkZXJzIiwiaW5pdEJ1ZmZlcnMiLCJibGVuZEVxdWF0aW9uIiwiRlVOQ19BREQiLCJibGVuZEZ1bmMiLCJTUkNfQUxQSEEiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiZW5hYmxlIiwiQkxFTkQiLCJ1bWF0Iiwic21hdCIsIm1zdGFjayIsInZpZXdwb3J0IiwiY2lyY2xlQ2FudmFzVVJMIiwiZ2V0VmVydGV4U2hhZGVyIiwidnNTb3VyY2UiLCJnZXRGcmFnbWVudFNoYWRlciIsImZzU291cmNlIiwidGV4dHVyZWJ1ZmZlcnMiLCJBIiwiQiIsImdldFNoYWRlciIsImZzIiwic2hhZGVyIiwiY3JlYXRlU2hhZGVyIiwiRlJBR01FTlRfU0hBREVSIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJmcmFnbWVudFNoYWRlciIsInZlcnRleFNoYWRlciIsInNwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsImF0dGFjaFNoYWRlciIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwidXNlUHJvZ3JhbSIsInZwYSIsImdldEF0dHJpYkxvY2F0aW9uIiwidGNhIiwiZW5hYmxlVmVydGV4QXR0cmliQXJyYXkiLCJ0TWF0VW5pZm9ybSIsImdldFVuaWZvcm1Mb2NhdGlvbiIsInNhbXBsZXJVbmlmb3JtIiwidXNlVGV4IiwidW5pZm9ybTFpIiwidnMiLCJpZHgiLCJ1bml0SUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsImJ1ZmZlckRhdGEiLCJVaW50MTZBcnJheSIsIlNUQVRJQ19EUkFXIiwiaWRzIiwidW5pdEkzMyIsInN0cmlwQnVmZmVyIiwicmFpZHVzIiwiY2lyY2xlQ2FudmFzUmFkaXVzIiwidG9EYXRhVVJMIiwiZHJhd0ltZzJDYW52YXMiLCJfdyIsIl9oIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9zY2FsZVgiLCJfc2NhbGVZIiwiY3JlYXRlVGV4dHVyZSIsInRleHR1cmUiLCJ2Y0J1ZmZlciIsInRjQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwiYmluZFRleHR1cmUiLCJURVhUVVJFXzJEIiwidGV4SW1hZ2UyRCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIkxJTkVBUiIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsImdlbmVyYXRlTWlwbWFwIiwidGV4dHVyZUxvYWRlZCIsInRleHR1cmVXaWR0aCIsInRleHR1cmVIZWlnaHQiLCJ0bWF0IiwiaW1hdCIsIm9sZFNjYWxlIiwidXBkYXRlTWF0cml4IiwidW5pZm9ybTNmIiwidW5pZm9ybU1hdHJpeDNmdiIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsImRyYXdFbGVtZW50cyIsIlRSSUFOR0xFUyIsIlVOU0lHTkVEX1NIT1JUIiwibW92ZU9yaWdpbk1hdHJpeCIsInRyYW5zbGF0aW9uTWF0cml4IiwiYW5nZWwiLCJyb3RhdGlvbk1hdHJpeCIsInNjYWxlTWF0cml4IiwibWF0cml4IiwiQ3VzdG9tUmVuZGVyZXIiLCJMaW5lWm9uZSIsIngxIiwieTEiLCJ4MiIsInkyIiwiZGlyZWN0aW9uIiwibWlueCIsIm1pbiIsIm1pbnkiLCJtYXh4IiwibWF4eSIsInh4eXkiLCJnZXRMZW5ndGgiLCJDIiwiRCIsImdldERpc3RhbmNlIiwiZ2V0U3ltbWV0cmljIiwidGhhMiIsInRoYTEiLCJvbGR4Iiwib2xkeSIsInJhbmdlT3V0IiwiQ2lyY2xlWm9uZSIsInJhbmRvbVJhZGl1cyIsInNldENlbnRlciIsIlJlY3Rab25lIiwiSW1hZ2Vab25lIiwidmVjdG9ycyIsInNldFZlY3RvcnMiLCJqIiwibGVuZ3RoMSIsImxlbmd0aDIiLCJnZXRCb3VuZCIsImdldENvbG9yIiwiZnVuYyIsImdldFN0eWxlIiwiZHJhd1pvbmUiLCJtb3ZlVG8iLCJsaW5lVG8iLCJkcmF3UmVjdCIsImRyYXdFbWl0dGVyIiwiVmVjdG9yIiwiUG9sYXIiLCJnZXRTcGFuIiwiSW5pdCIsIkwiLCJQIiwiViIsIk0iLCJSIiwiRiIsIlJEIiwiRyIsIlMiLCJXZWJHbFJlbmRlcmVyIiwiRGVidWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZTtFQUNiO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRUEsRUFBQUEsSUFaYSxnQkFZUkMsTUFaUSxFQVlBO0VBQ1gsV0FBTyxDQUFDQSxNQUFNLEdBQUlBLE1BQU0sR0FBRyxDQUFwQixNQUE0QixDQUFuQztFQUNELEdBZFk7O0VBZ0JiO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRUMsRUFBQUEsS0EzQmEsaUJBMkJQRCxNQTNCTyxFQTJCQztF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 diff --git a/build/proton.min.js b/build/proton.min.js index 87b0c8b..b06daa5 100755 --- a/build/proton.min.js +++ b/build/proton.min.js @@ -1,11 +1,11 @@ /*! -* Proton v5.4.5 +* Proton v6.0.1 * https://github.com/drawcall/Proton * -* Copyright 2013-2022, drawcall +* Copyright 2013-2023, drawcall * Licensed under the MIT license * http://www.opensource.org/licenses/mit-license * */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Proton=e()}(this,(function(){"use strict";function t(t,e){for(var i=0;i>e;return t+1},a=function(t,e){return[1,0,0,0,1,0,t,e,1]},s=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},o=function(t,e){return[t,0,0,0,e,0,0,0,1]},h=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},l={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},c={},u={},d=0,p=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},f=function(t,e,i){var n="string"==typeof t?t:t.src;if(c[n])e(c[n],i);else{var r=new Image;r.onload=function(t){c[n]=t.target,e(c[n],i)},r.src=n}},g=function(t,e,i){var n=t.src;if(!u[n]){var a=r(t.width),s=r(t.height),o=l.createCanvas("proton_canvas_cache_"+ ++d,a,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),u[n]=o}return e&&e(u[n],i),u[n]},y={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},sliceArray:function(t,e,i){this.emptyArray(i);for(var n=e;n-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return p(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},m={},v={_index:0,_cache:{},id:function(t){return void 0!==m[t]&&null!==m[t]||(m[t]=0),t+"_"+m[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},b=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||v.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?y.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),x=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i>0)+t:t+Math.random()*(e-t)},randomFloating:function(t,e,i){return this.randomAToB(t-e,t+e,i)},randomColor:function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)},randomZone:function(t){},floor:function(t,e){void 0===e&&(e=4);var i=Math.pow(10,e);return Math.floor(t*i)/i},degreeTransform:function(t){return t*A/180},toColor16:function(t){return"#"+t.toString(16)}},T=function(){function t(t){this.type=t}var e=t.prototype;return e.calculate=function(t,e,i){this.eulerIntegrate(t,e,i)},e.eulerIntegrate=function(t,e,i){t.sleep||(t.old.p.copy(t.p),t.old.v.copy(t.v),t.a.multiplyScalar(1/t.mass),t.v.add(t.a.multiplyScalar(e)),t.p.add(t.old.v.multiplyScalar(e)),i&&t.v.multiplyScalar(i),t.a.clear())},t}(),R=function(){function e(t){this.emitters=[],this.renderers=[],this.time=0,this.now=0,this.then=0,this.elapsed=0,this.stats=new x(this),this.pool=new b(80),this.integrationType=y.initValue(t,e.EULER),this.integrator=new T(this.integrationType),this._fps="auto",this._interval=e.DEFAULT_INTERVAL}var i,n,r,a=e.prototype;return a.addRenderer=function(t){t.init(this),this.renderers.push(t)},a.removeRenderer=function(t){var e=this.renderers.indexOf(t);this.renderers.splice(e,1),t.remove(this)},a.addEmitter=function(t){this.emitters.push(t),t.parent=this,this.dispatchEvent(e.EMITTER_ADDED,t)},a.removeEmitter=function(t){var i=this.emitters.indexOf(t);this.emitters.splice(i,1),t.parent=null,this.dispatchEvent(e.EMITTER_REMOVED,t)},a.update=function(){"auto"===this._fps?(this.dispatchEvent(e.PROTON_UPDATE),e.USE_CLOCK?(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.amendChangeTabsBug(),this.elapsed>0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(e.DEFAULT_INTERVAL),this.dispatchEvent(e.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(e.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(e.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){e.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){y.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),e.stats.destroy(),y.destroyAll(e.emitters),y.destroyAll(e.renderers,e.getAllParticles()),e.integrator=null,e.renderers=null,e.emitters=null,e.stats=null,e.pool=null};t?setTimeout(i,200):i()},i=e,(n=[{key:"fps",get:function(){return this._fps},set:function(t){this._fps=t,this._interval="auto"===t?e.DEFAULT_INTERVAL:P.floor(1/t,7)}}])&&t(i.prototype,n),r&&t(i,r),e}();R.USE_CLOCK=!1,R.MEASURE=100,R.EULER="euler",R.RK2="runge-kutta2",R.PARTICLE_CREATED="PARTICLE_CREATED",R.PARTICLE_UPDATE="PARTICLE_UPDATE",R.PARTICLE_SLEEP="PARTICLE_SLEEP",R.PARTICLE_DEAD="PARTICLE_DEAD",R.EMITTER_ADDED="EMITTER_ADDED",R.EMITTER_REMOVED="EMITTER_REMOVED",R.PROTON_UPDATE="PROTON_UPDATE",R.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",R.DEFAULT_INTERVAL=.0167,R.amendChangeTabsBug=!0,E.bind(R);var _=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),w={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=Span.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},C={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*P.PI_2)},easeOutSine:function(t){return Math.sin(t*P.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},I=function(){function t(t,e){this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?P.PI_2:this.y<0?-P.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),S=function(){function t(t){this.id="",this.old=null,this.data=null,this.behaviours=null,this.p=null,this.v=null,this.a=null,this.rgb=null,this.name="Particle",this.id=v.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new I,this.v=new I,this.a=new I,this.old.p=new I,this.old.v=new I,this.old.a=new I,this.rgb=new _,this.reset(),t&&w.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*P.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=C.easeLinear,this.rgb.reset(),y.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){y.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),D={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},V=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new I(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),M={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},B=function(){function t(t,e,i){y.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=y.initValue(t,1),this.b=y.initValue(e,this.a),this.center=y.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?y.getRandFromArray(this.a):this.center?P.randomFloating(this.a,this.b,t):P.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),L=function(t){function i(e){var i;return(i=t.call(this)||this)._arr=y.toArray(e),i}return e(i,t),i.prototype.getValue=function(){var t=y.getRandFromArray(this._arr);return"random"===t||"Random"===t?P.randomColor():t},i.createArraySpan=function(t){return t?t instanceof i?t:new i(t):null},i}(B),U=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),F=function(){function t(t,e){this.numPan=B.setSpanValue(y.initValue(t,1)),this.timePan=B.setSpanValue(y.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),z=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),O=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).lifePan=B.setSpanValue(e,i,n),r.name="Life",r}return e(i,t),i.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},i}(z),k=function(){function t(){this.vector=new I(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),N=function(t){function i(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},i}(k),H=function(t){function i(e){var i;return(i=t.call(this)||this).zone=y.initValue(e,new N),i.name="Position",i}e(i,t);var n=i.prototype;return n.reset=function(t){this.zone=y.initValue(t,new N)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},i}(z),q=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).rPan=B.setSpanValue(e),r.thaPan=B.setSpanValue(i),r.type=y.initValue(n,"vector"),r.name="Velocity",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.rPan=B.setSpanValue(t),this.thaPan=B.setSpanValue(e),this.type=y.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*R.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new V(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*P.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},i}(z),G=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).massPan=B.setSpanValue(e,i,n),r.name="Mass",r}return e(i,t),i.prototype.initialize=function(t){t.mass=this.massPan.getValue()},i}(z),X=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).radius=B.setSpanValue(e,i,n),r.name="Radius",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.radius=B.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},i}(z),Y=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).image=r.setSpanValue(e),r.w=y.initValue(i,20),r.h=y.initValue(n,r.w),r.name="Body",r}e(i,t);var n=i.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof L?t:new L(t)},i}(z),j=function(){function t(e,i){this.life=y.initValue(e,1/0),this.easing=C.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=y.initValue(t,1/0),this.easing=C.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(R.MEASURE)},e.normalizeValue=function(t){return t*R.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.applyBehaviour=function(t,e,i){this.calculate(t,e,i)},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();j.id=0;var W=function(t){function i(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new I(e,i)),a.name="Force",a}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new I(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},i}(j),Z=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=y.initValue(e,new I),s.radius=y.initValue(n,1e3),s.force=y.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new I,s.lengthSq=0,s.name="Attraction",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=y.initValue(e,new I),this.radius=y.initValue(n,1e3),this.force=y.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new I,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(P.randomAToB(-this.panFoce.x,this.panFoce.x),P.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},i}(j),K=function(t){function i(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return e(i,t),i.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},i}(W),J=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.newPool=[],s.pool=[],s.name="Collision",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.emitter=y.initValue(e,null),this.mass=y.initValue(i,!0),this.callback=y.initValue(n,null),this.collisionPool=[],this.delta=new I,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.emitter?y.sliceArray(this.emitter.particles,i,this.newPool):y.sliceArray(this.pool,i,this.newPool);var n,r,a,s,o,h,l,c=this.newPool.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init&&t.init(this)},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){y.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;i>0,t.p.y-this.rectangle.y>>0,t)},n.setPixel=function(t,e,i,n){var r=n.rgb;if(!(e<0||e>this.element.width||i<0||i>this.element.height)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},i}(gt),xt=function(t){function i(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}e(i,t);var n=i.prototype;return n.setPIXI=function(t){try{ct=t||{Sprite:{}},this.createFromImage=ct.Sprite.from||ct.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=D.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*P.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new ct.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new ct.Graphics;if(this.stroke){var i=ft(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},i}(gt),Et=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(M.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?M.set(t,this.mats[0]):M.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?M.set(t,this.mats[0]):M.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),At=function(t){function i(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(n(i)),i.name="WebGLRenderer",i}e(i,t);var c=i.prototype;return c.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},c.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},c.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},c.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},c.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},c.initVar=function(){this.mstack=new Et,this.umat=M.create([2,0,1,0,-2,0,-1,1,1]),this.smat=M.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},c.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},c.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},c.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},c.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},c.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},c.createCircle=function(t){this.circleCanvasRadius=r(y.initValue(t,32));var e=l.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},c.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=r(t.body.width),a=r(t.body.height),s=t.body.width/n,o=t.body.height/a;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,a);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},c.onProtonUpdate=function(){},c.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=M.create(),t.data.tmat[8]=1,t.data.imat=M.create(),t.data.imat[8]=1,t.body?f(t.body,this.addImg2Body,t):(f(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},c.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=g(t),e.data.oldScale=1,this.drawImg2Canvas(e))},c.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},c.onParticleDead=function(t){},c.updateMatrix=function(t){var e=a(-t.data.textureWidth/2,-t.data.textureHeight/2),i=a(t.p.x,t.p.y),n=t.rotation*P.PI_180,r=s(n),l=t.scale*t.data.oldScale,c=o(l,l),u=h(e,c);u=h(u,r),u=h(u,i),M.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},c.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},i}(gt),Pt=function(t){function i(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return e(i,t),i}(gt),Tt=function(t){function i(e,i,n,r,a){var s;return s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=y.initValue(a,">"),s}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=P.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},i}(k),Rt=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.angle=P.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-P.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},i}(k),_t=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},i}(k),wt=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}e(i,t);var n=i.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=y.initValue(e,0),this.y=y.initValue(i,0),this.d=y.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t>0)*i+(t>>0));this.imageData.data[r+3]>0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e>>0)*this.imageData.width+(t>>0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=y.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)>>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},i}(k),Ct={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=D.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof N?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof Tt?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof _t?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof Rt&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};return R.Particle=S,R.Pool=b,R.Util=y,R.ColorUtil=D,R.MathUtil=P,R.Vector2D=R.Vector=I,R.Polar2D=R.Polar=V,R.ArraySpan=L,R.Rectangle=U,R.Rate=F,R.ease=C,R.Span=B,R.Mat3=M,R.getSpan=function(t,e,i){return new B(t,e,i)},R.createArraySpan=L.createArraySpan,R.Initialize=R.Init=z,R.Life=R.L=O,R.Position=R.P=H,R.Velocity=R.V=q,R.Mass=R.M=G,R.Radius=R.R=X,R.Body=R.B=Y,R.Behaviour=j,R.Force=R.F=W,R.Attraction=R.A=Z,R.RandomDrift=R.RD=Q,R.Gravity=R.G=K,R.Collision=J,R.CrossZone=$,R.Alpha=tt,R.Scale=R.S=et,R.Rotate=it,R.Color=nt,R.Repulsion=st,R.Cyclone=at,R.GravityWell=ot,R.Emitter=lt,R.BehaviourEmitter=ut,R.FollowEmitter=dt,R.Zone=k,R.LineZone=Tt,R.CircleZone=Rt,R.PointZone=N,R.RectZone=_t,R.ImageZone=wt,R.CanvasRenderer=yt,R.DomRenderer=mt,R.EaselRenderer=vt,R.PixiRenderer=xt,R.PixelRenderer=bt,R.WebGLRenderer=R.WebGlRenderer=At,R.CustomRenderer=Pt,R.Debug=Ct,y.assign(R,C),R})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Proton=e()}(this,(function(){"use strict";function t(t,e){for(var i=0;i>e;return t+1},a=function(t,e){return[1,0,0,0,1,0,t,e,1]},s=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},o=function(t,e){return[t,0,0,0,e,0,0,0,1]},h=function(t,e){var i=t[0],n=t[1],r=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],c=t[8],u=e[0],d=e[1],p=e[2],f=e[3],g=e[4],y=e[5],m=e[6],v=e[7],b=e[8];return[i*u+n*f+r*m,i*d+n*g+r*v,i*p+n*y+r*b,a*u+s*f+o*m,a*d+s*g+o*v,a*p+s*y+o*b,h*u+l*f+c*m,h*d+l*g+c*v,h*p+l*y+c*b]},l={createCanvas:function(t,e,i,n){void 0===n&&(n="absolute");var r=document.createElement("canvas");return r.id=t,r.width=e,r.height=i,r.style.opacity=0,r.style.position=n,this.transform(r,-500,-500,0,0),r},createDiv:function(t,e,i){var n=document.createElement("div");return n.id=t,n.style.position="absolute",this.resize(n,e,i),n},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,n,r){t.style.willChange="transform";var a="translate("+e+"px, "+i+"px) scale("+n+") rotate("+r+"deg)";this.css3(t,"transform",a)},transform3d:function(t,e,i,n,r){t.style.willChange="transform";var a="translate3d("+e+"px, "+i+"px, 0) scale("+n+") rotate("+r+"deg)";this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var n=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+n]=i,t.style["Moz"+n]=i,t.style["O"+n]=i,t.style["ms"+n]=i,t.style[""+e]=i}},c={},u={},d=0,p=function(t,e,i){t.drawImage(e,i.x,i.y);var n=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),n},f=function(t,e,i){var n="string"==typeof t?t:t.src;if(c[n])e(c[n],i);else{var r=new Image;r.onload=function(t){c[n]=t.target,e(c[n],i)},r.src=n}},g=function(t,e,i){var n=t.src;if(!u[n]){var a=r(t.width),s=r(t.height),o=l.createCanvas("proton_canvas_cache_"+ ++d,a,s);o.getContext("2d").drawImage(t,0,0,t.width,t.height),u[n]=o}return e&&e(u[n],i),u[n]},y={initValue:function(t,e){return t=null!=t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyArray:function(t){t&&(t.length=0)},toArray:function(t){return this.isArray(t)?t:[t]},sliceArray:function(t,e,i){this.emptyArray(i);for(var n=e;n-1||delete t[i]},classApply:function(t,e){return void 0===e&&(e=null),e?new(t.bind.apply(t,[null].concat(e))):new t},getImageData:function(t,e,i){return p(t,e,i)},destroyAll:function(t,e){void 0===e&&(e=null);for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0},assign:function(t,e){if("function"!=typeof Object.assign){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t}return Object.assign(t,e)}},m={},v={_index:0,_cache:{},id:function(t){return void 0!==m[t]&&null!==m[t]||(m[t]=0),t+"_"+m[t]++},getId:function(t){var e=this.getIdFromCache(t);return e||(e="PUID_"+this._index++,this._cache[e]=t,e)},getIdFromCache:function(t){var e,i;for(i in this._cache){if((e=this._cache[i])===t)return i;if(this.isBody(e,t)&&e.src===t.src)return i}return null},isBody:function(t,e){return"object"==typeof t&&"object"==typeof e&&t.isInner&&e.isInner},getTarget:function(t){return this._cache[t]}},b=function(){function t(t){this.total=0,this.cache={}}var e=t.prototype;return e.get=function(t,e,i){var n;return i=i||t.__puid||v.getId(t),(n=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,n},e.expire=function(t){return this.getCache(t.__puid).push(t)},e.createOrClone=function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?y.classApply(t,e):t.clone()},e.getCount=function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++},e.destroy=function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]},e.getCache=function(t){return void 0===t&&(t="default"),this.cache[t]||(this.cache[t]=[]),this.cache[t]},t}(),x=function(){function t(t){this.proton=t,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}var e=t.prototype;return e.update=function(t,e){this.add(t,e);var i=this.getEmitter(),n=this.getRenderer(),r="";switch(this.type){case 2:r+="emitter:"+this.proton.emitters.length+"
",i&&(r+="em speed:"+i.emitSpeed+"
"),i&&(r+="pos:"+this.getEmitterPos(i));break;case 3:i&&(r+="initializes:"+i.initializes.length+"
"),i&&(r+=''+this.concatArr(i.initializes)+"
"),i&&(r+="behaviours:"+i.behaviours.length+"
"),i&&(r+=''+this.concatArr(i.behaviours)+"
");break;case 4:n&&(r+=n.name+"
"),n&&(r+="body:"+this.getCreatedNumber(n)+"
");break;default:r+="particles:"+this.proton.getCount()+"
",r+="pool:"+this.proton.pool.getCount()+"
",r+="total:"+this.proton.pool.total}this.container.innerHTML=r},e.add=function(t,e){var i=this;if(!this.container){var n,r;switch(this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",(function(t){i.type++,i.type>4&&(i.type=1)}),!1),t){case 2:n="#201",r="#f08";break;case 3:n="#020",r="#0f0";break;default:n="#002",r="#0ff"}this.container.style["background-color"]=n,this.container.style.color=r}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)},e.getEmitter=function(){return this.proton.emitters[this.emitterIndex]},e.getRenderer=function(){return this.proton.renderers[this.rendererIndex]},e.concatArr=function(t){var e="";if(!t||!t.length)return e;for(var i=0;i>0)+t:t+Math.random()*(e-t)},randomFloating:function(t,e,i){return this.randomAToB(t-e,t+e,i)},randomColor:function(){return"#"+("00000"+(16777216*Math.random()<<0).toString(16)).slice(-6)},randomZone:function(t){},floor:function(t,e){void 0===e&&(e=4);var i=Math.pow(10,e);return Math.floor(t*i)/i},degreeTransform:function(t){return t*A/180},toColor16:function(t){return"#"+t.toString(16)}},T=function(){function t(t){this.type=t}var e=t.prototype;return e.calculate=function(t,e,i){this.eulerIntegrate(t,e,i)},e.eulerIntegrate=function(t,e,i){t.sleep||(t.old.p.copy(t.p),t.old.v.copy(t.v),t.a.multiplyScalar(1/t.mass),t.v.add(t.a.multiplyScalar(e)),t.p.add(t.old.v.multiplyScalar(e)),i&&t.v.multiplyScalar(i),t.a.clear())},t}(),R=function(){function e(t){this.emitters=[],this.renderers=[],this.time=0,this.now=0,this.then=0,this.elapsed=0,this.stats=new x(this),this.pool=new b(80),this.integrationType=y.initValue(t,e.EULER),this.integrator=new T(this.integrationType),this._fps="auto",this._interval=e.DEFAULT_INTERVAL}var i,n,r,a=e.prototype;return a.addRenderer=function(t){t.init(this),this.renderers.push(t)},a.removeRenderer=function(t){var e=this.renderers.indexOf(t);this.renderers.splice(e,1),t.remove(this)},a.addEmitter=function(t){this.emitters.push(t),t.parent=this,this.dispatchEvent(e.EMITTER_ADDED,t)},a.removeEmitter=function(t){var i=this.emitters.indexOf(t);this.emitters.splice(i,1),t.parent=null,this.dispatchEvent(e.EMITTER_REMOVED,t)},a.update=function(){"auto"===this._fps?(this.dispatchEvent(e.PROTON_UPDATE),e.USE_CLOCK?(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.amendChangeTabsBug(),this.elapsed>0&&this.emittersUpdate(this.elapsed),this.then=this.now):this.emittersUpdate(e.DEFAULT_INTERVAL),this.dispatchEvent(e.PROTON_UPDATE_AFTER)):(this.then||(this.then=(new Date).getTime()),this.now=(new Date).getTime(),this.elapsed=.001*(this.now-this.then),this.elapsed>this._interval&&(this.dispatchEvent(e.PROTON_UPDATE),this.emittersUpdate(this._interval),this.then=this.now-this.elapsed%this._interval*1e3,this.dispatchEvent(e.PROTON_UPDATE_AFTER)))},a.emittersUpdate=function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)},a.amendChangeTabsBug=function(){e.amendChangeTabsBug&&this.elapsed>.5&&(this.then=(new Date).getTime(),this.elapsed=0)},a.getCount=function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t},a.getAllParticles=function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t},a.destroyAllEmitters=function(){y.destroyAll(this.emitters)},a.destroy=function(t){var e=this;void 0===t&&(t=!1);var i=function(){e.time=0,e.then=0,e.pool.destroy(),e.stats.destroy(),y.destroyAll(e.emitters),y.destroyAll(e.renderers,e.getAllParticles()),e.integrator=null,e.renderers=null,e.emitters=null,e.stats=null,e.pool=null};t?setTimeout(i,200):i()},i=e,(n=[{key:"fps",get:function(){return this._fps},set:function(t){this._fps=t,this._interval="auto"===t?e.DEFAULT_INTERVAL:P.floor(1/t,7)}}])&&t(i.prototype,n),r&&t(i,r),e}();R.USE_CLOCK=!1,R.MEASURE=100,R.EULER="euler",R.RK2="runge-kutta2",R.PARTICLE_CREATED="PARTICLE_CREATED",R.PARTICLE_UPDATE="PARTICLE_UPDATE",R.PARTICLE_SLEEP="PARTICLE_SLEEP",R.PARTICLE_DEAD="PARTICLE_DEAD",R.EMITTER_ADDED="EMITTER_ADDED",R.EMITTER_REMOVED="EMITTER_REMOVED",R.PROTON_UPDATE="PROTON_UPDATE",R.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",R.DEFAULT_INTERVAL=.0167,R.amendChangeTabsBug=!0,E.bind(R);var _=function(){function t(t,e,i){void 0===t&&(t=255),void 0===e&&(e=255),void 0===i&&(i=255),this.r=t,this.g=e,this.b=i}return t.prototype.reset=function(){this.r=255,this.g=255,this.b=255},t}(),w=function(){function t(t,e,i){y.isArray(t)?(this.isArray=!0,this.a=t):(this.isArray=!1,this.a=y.initValue(t,1),this.b=y.initValue(e,this.a),this.center=y.initValue(i,!1))}return t.prototype.getValue=function(t){return void 0===t&&(t=!1),this.isArray?y.getRandFromArray(this.a):this.center?P.randomFloating(this.a,this.b,t):P.randomAToB(this.a,this.b,t)},t.setSpanValue=function(e,i,n){return e instanceof t?e:void 0===i?new t(e):void 0===n?new t(e,i):new t(e,i,n)},t.getSpanValue=function(e){return e instanceof t?e.getValue():e},t}(),C={hasProp:function(t,e){return!!t&&void 0!==t[e]},setProp:function(t,e){for(var i in e)t.hasOwnProperty(i)&&(t[i]=w.getSpanValue(e[i]));return t},setVectorVal:function(t,e){void 0===e&&(e=null),e&&(this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&t.p.copy(e.p),this.hasProp(e,"v")&&t.v.copy(e.v),this.hasProp(e,"a")&&t.a.copy(e.a),this.hasProp(e,"position")&&t.p.copy(e.position),this.hasProp(e,"velocity")&&t.v.copy(e.velocity),this.hasProp(e,"accelerate")&&t.a.copy(e.accelerate))}},I={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*P.PI_2)},easeOutSine:function(t){return Math.sin(t*P.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},S=function(){function t(t,e){this.x=t||0,this.y=e||0}var e=t.prototype;return e.set=function(t,e){return this.x=t,this.y=e,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.getGradient=function(){return 0!==this.x?Math.atan2(this.y,this.x):this.y>0?P.PI_2:this.y<0?-P.PI_2:void 0},e.copy=function(t){return this.x=t.x,this.y=t.y,this},e.add=function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)},e.addXY=function(t,e){return this.x+=t,this.y+=e,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},e.sub=function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},e.divideScalar=function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this},e.negate=function(){return this.multiplyScalar(-1)},e.dot=function(t){return this.x*t.x+this.y*t.y},e.lengthSq=function(){return this.x*this.x+this.y*this.y},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.normalize=function(){return this.divideScalar(this.length())},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.rotate=function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this},e.distanceToSquared=function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},e.equals=function(t){return t.x===this.x&&t.y===this.y},e.clear=function(){return this.x=0,this.y=0,this},e.clone=function(){return new t(this.x,this.y)},t}(),D=function(){function t(t){this.id="",this.old=null,this.data=null,this.behaviours=null,this.p=null,this.v=null,this.a=null,this.rgb=null,this.name="Particle",this.id=v.id(this.name),this.old={},this.data={},this.behaviours=[],this.p=new S,this.v=new S,this.a=new S,this.old.p=new S,this.old.v=new S,this.old.a=new S,this.rgb=new _,this.reset(),t&&C.setProp(this,t)}var e=t.prototype;return e.getDirection=function(){return Math.atan2(this.v.x,-this.v.y)*P.N180_PI},e.reset=function(){return this.life=1/0,this.age=0,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.energy=1,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.easing=I.easeLinear,this.rgb.reset(),y.emptyObject(this.data),this.removeAllBehaviours(),this},e.update=function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)},e.removeAllBehaviours=function(){y.emptyArray(this.behaviours)},e.destroy=function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null},t}(),V={hexToRgb:function(t){var e="#"===t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.rgb.r)+256*Number(t.rgb.g)+Number(t.rgb.b)}},M=function(){function t(t,e){this.r=Math.abs(t)||0,this.tha=e||0}var e=t.prototype;return e.set=function(t,e){return this.r=t,this.tha=e,this},e.setR=function(t){return this.r=t,this},e.setTha=function(t){return this.tha=t,this},e.copy=function(t){return this.r=t.r,this.tha=t.tha,this},e.toVector=function(){return new S(this.getX(),this.getY())},e.getX=function(){return this.r*Math.sin(this.tha)},e.getY=function(){return-this.r*Math.cos(this.tha)},e.normalize=function(){return this.r=1,this},e.equals=function(t){return t.r===this.r&&t.tha===this.tha},e.clear=function(){return this.r=0,this.tha=0,this},e.clone=function(){return new t(this.r,this.tha)},t}(),B={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var n=t[0],r=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],c=e[0],u=e[1],d=e[2],p=e[3],f=e[4],g=e[6],y=e[7];return i[0]=c*n+u*s,i[1]=c*r+u*o,i[2]=a*d,i[3]=p*n+f*s,i[4]=p*r+f*o,i[6]=g*n+y*s+h,i[7]=g*r+y*o+l,i},inverse:function(t,e){var i,n=t[0],r=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,c=-a,u=h*a-s*o;return i=1/(n*l+r*c),e[0]=l*i,e[1]=-r*i,e[3]=c*i,e[4]=n*i,e[6]=u*i,e[7]=(-h*n+r*o)*i,e},multiplyVec2:function(t,e,i){var n=e[0],r=e[1];return i[0]=n*t[0]+r*t[3]+t[6],i[1]=n*t[1]+r*t[4]+t[7],i}},L=function(t){function i(e){var i;return(i=t.call(this)||this)._arr=y.toArray(e),i}return e(i,t),i.prototype.getValue=function(){var t=y.getRandFromArray(this._arr);return"random"===t||"Random"===t?P.randomColor():t},i.createArraySpan=function(t){return t?t instanceof i?t:new i(t):null},i}(w),U=function(){function t(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n,this.bottom=this.y+this.height,this.right=this.x+this.width}return t.prototype.contains=function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y},t}(),F=function(){function t(t,e){this.numPan=w.setSpanValue(y.initValue(t,1)),this.timePan=w.setSpanValue(y.initValue(e,1)),this.startTime=0,this.nextTime=0,this.init()}var e=t.prototype;return e.init=function(){this.startTime=0,this.nextTime=this.timePan.getValue()},e.getValue=function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1===this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0},t}(),z=function(){function t(){}var e=t.prototype;return e.reset=function(){},e.init=function(t,e){e?this.initialize(e):this.initialize(t)},e.initialize=function(t){},t}(),O=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).lifePan=w.setSpanValue(e,i,n),r.name="Life",r}return e(i,t),i.prototype.initialize=function(t){this.lifePan.a===1/0?t.life=1/0:t.life=this.lifePan.getValue()},i}(z),k=function(){function t(){this.vector=new S(0,0),this.random=0,this.crossType="dead",this.alert=!0}var e=t.prototype;return e.getPosition=function(){},e.crossing=function(t){},e.destroy=function(){this.vector=null},t}(),N=function(t){function i(e,i){var n;return(n=t.call(this)||this).x=e,n.y=i,n}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector},n.crossing=function(t){this.alert&&(console.error("Sorry, PointZone does not support crossing method!"),this.alert=!1)},i}(k),H=function(t){function i(e){var i;return(i=t.call(this)||this).zone=y.initValue(e,new N),i.name="Position",i}e(i,t);var n=i.prototype;return n.reset=function(t){this.zone=y.initValue(t,new N)},n.initialize=function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y},i}(z),q=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).rPan=w.setSpanValue(e),r.thaPan=w.setSpanValue(i),r.type=y.initValue(n,"vector"),r.name="Velocity",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.rPan=w.setSpanValue(t),this.thaPan=w.setSpanValue(e),this.type=y.initValue(i,"vector")},n.normalizeVelocity=function(t){return t*R.MEASURE},n.initialize=function(t){if("p"===this.type||"P"===this.type||"polar"===this.type){var e=new M(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*P.PI_180);t.v.x=e.getX(),t.v.y=e.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())},i}(z),G=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).massPan=w.setSpanValue(e,i,n),r.name="Mass",r}return e(i,t),i.prototype.initialize=function(t){t.mass=this.massPan.getValue()},i}(z),X=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).radius=w.setSpanValue(e,i,n),r.name="Radius",r}e(i,t);var n=i.prototype;return n.reset=function(t,e,i){this.radius=w.setSpanValue(t,e,i)},n.initialize=function(t){t.radius=this.radius.getValue(),t.data.oldRadius=t.radius},i}(z),Y=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).image=r.setSpanValue(e),r.w=y.initValue(i,20),r.h=y.initValue(n,r.w),r.name="Body",r}e(i,t);var n=i.prototype;return n.initialize=function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e},n.setSpanValue=function(t){return t instanceof L?t:new L(t)},i}(z),j=function(){function t(e,i){this.life=y.initValue(e,1/0),this.easing=I.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}var e=t.prototype;return e.reset=function(t,e){this.life=y.initValue(t,1/0),this.easing=I.getEasing(e)},e.normalizeForce=function(t){return t.multiplyScalar(R.MEASURE)},e.normalizeValue=function(t){return t*R.MEASURE},e.initialize=function(t){},e.calculate=function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var n=this.easing(t.age/t.life);this.energy=Math.max(1-n,0)}},e.applyBehaviour=function(t,e,i){this.calculate(t,e,i)},e.destroy=function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0},t}();j.id=0;var W=function(t){function i(e,i,n,r){var a;return(a=t.call(this,n,r)||this).force=a.normalizeForce(new S(e,i)),a.name="Force",a}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r){this.force=this.normalizeForce(new S(e,i)),n&&t.prototype.reset.call(this,n,r)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)},i}(j),Z=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).targetPosition=y.initValue(e,new S),s.radius=y.initValue(n,1e3),s.force=y.initValue(s.normalizeValue(i),100),s.radiusSq=s.radius*s.radius,s.attractionForce=new S,s.lengthSq=0,s.name="Attraction",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.targetPosition=y.initValue(e,new S),this.radius=y.initValue(n,1e3),this.force=y.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new S,this.lengthSq=0,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-5&&this.lengthSq=this.delay&&(t.a.addXY(P.randomAToB(-this.panFoce.x,this.panFoce.x),P.randomAToB(-this.panFoce.y,this.panFoce.y)),t.data.time=0)},i}(j),K=function(t){function i(e,i,n){var r;return(r=t.call(this,0,e,i,n)||this).name="Gravity",r}return e(i,t),i.prototype.reset=function(e,i,n){t.prototype.reset.call(this,0,e,i,n)},i}(W),J=function(t){function i(e,i,n,r,a){var s;return(s=t.call(this,r,a)||this).reset(e,i,n),s.newPool=[],s.pool=[],s.name="Collision",s}e(i,t);var n=i.prototype;return n.reset=function(e,i,n,r,a){this.emitter=y.initValue(e,null),this.mass=y.initValue(i,!0),this.callback=y.initValue(n,null),this.collisionPool=[],this.delta=new S,r&&t.prototype.reset.call(this,r,a)},n.applyBehaviour=function(t,e,i){this.emitter?y.sliceArray(this.emitter.particles,i,this.newPool):y.sliceArray(this.pool,i,this.newPool);var n,r,a,s,o,h,l,c=this.newPool.length;for(l=0;lr;)t-=r,this.update(r);this.stoped=e,this.emitTime=i+Math.max(t,0),this.totalTime=n},n.removeAllParticles=function(){for(var t=this.particles.length;t--;)this.particles[t].dead=!0},n.addSelfInitialize=function(t){t.init&&t.init(this)},n.addInitialize=function(){for(var t=arguments.length,e=new Array(t),i=0;i-1&&this.initializes.splice(e,1)},n.removeAllInitializers=function(){y.emptyArray(this.initializes)},n.addBehaviour=function(){for(var t=arguments.length,e=new Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)},n.integrate=function(t){if(this.parent){var e,i,n=1-this.damping;for(this.parent.integrator.calculate(this,t,n),e=this.particles.length-1;e>=0;e--)(i=this.particles[e]).update(t,e),this.parent.integrator.calculate(i,t,n),this.dispatch("PARTICLE_UPDATE",i),i.dead&&(this.dispatch("PARTICLE_DEAD",i),this.parent.pool.expire(i),this.particles.splice(e,1))}},n.dispatch=function(t,e){this.parent&&this.parent.dispatchEvent(t,e),this.bindEvent&&this.dispatchEvent(t,e)},n.emitting=function(t){if(!this.stoped)if("none"===this.totalTime)this.emitTime+=t;else if("once"===this.totalTime){var e,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)},n.update=function(e){if(t.prototype.update.call(this,e),!this.sleep){var i,n=this.selfBehaviours.length;for(i=0;i>0,t.p.y-this.rectangle.y>>0,t)},n.setPixel=function(t,e,i,n){var r=n.rgb;if(!(e<0||e>this.element.width||i<0||i>this.element.height)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=r.r,t.data[a+1]=r.g,t.data[a+2]=r.b,t.data[a+3]=255*n.alpha}},n.onParticleDead=function(t){},n.destroy=function(){t.prototype.destroy.call(this),this.stroke=null,this.context=null,this.imageData=null,this.rectangle=null},i}(gt),xt=function(t){function i(e,i){var n;return(n=t.call(this,e)||this).stroke=i,n.color=!1,n.setColor=!1,n.blendMode=null,n.pool.create=function(t,e){return n.createBody(t,e)},n.setPIXI(window.PIXI),n.name="PixiRenderer",n}e(i,t);var n=i.prototype;return n.setPIXI=function(t){try{ct=t||{Sprite:{}},this.createFromImage=ct.Sprite.from||ct.Sprite.fromImage}catch(t){}},n.onProtonUpdate=function(){},n.onParticleCreated=function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.blendMode&&(t.body.blendMode=this.blendMode),this.element.addChild(t.body)},n.onParticleUpdate=function(t){this.transform(t,t.body),!0!==this.setColor&&!0!==this.color||(t.body.tint=V.getHex16FromParticle(t))},n.onParticleDead=function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null},n.transform=function(t,e){e.x=t.p.x,e.y=t.p.y,e.alpha=t.alpha,e.scale.x=t.scale,e.scale.y=t.scale,e.rotation=t.rotation*P.PI_180},n.createBody=function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)},n.createSprite=function(t){var e=t.isInner?this.createFromImage(t.src):new ct.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e},n.createCircle=function(t){var e=new ct.Graphics;if(this.stroke){var i=ft(this.stroke)?this.stroke:0;e.beginStroke(i)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e},n.destroy=function(e){t.prototype.destroy.call(this);for(var i=e.length;i--;){var n=e[i];n.body&&this.element.removeChild(n.body)}},i}(gt),Et=function(){function t(){this.mats=[],this.size=0;for(var t=0;t<20;t++)this.mats.push(B.create([0,0,0,0,0,0,0,0,0]))}var e=t.prototype;return e.set=function(t,e){0===e?B.set(t,this.mats[0]):B.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)},e.push=function(t){0===this.size?B.set(t,this.mats[0]):B.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++},e.pop=function(){this.size>0&&this.size--},e.top=function(){return this.mats[this.size-1]},t}(),At=function(t){function i(e){var i;return(i=t.call(this,e)||this).gl=i.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),i.gl||alert("Sorry your browser do not suppest WebGL!"),i.initVar(),i.setMaxRadius(),i.initShaders(),i.initBuffers(),i.gl.blendEquation(i.gl.FUNC_ADD),i.gl.blendFunc(i.gl.SRC_ALPHA,i.gl.ONE_MINUS_SRC_ALPHA),i.gl.enable(i.gl.BLEND),i.addImg2Body=i.addImg2Body.bind(n(i)),i.name="WebGLRenderer",i}e(i,t);var c=i.prototype;return c.init=function(e){t.prototype.init.call(this,e),this.resize(this.element.width,this.element.height)},c.resize=function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e},c.setMaxRadius=function(t){this.circleCanvasURL=this.createCircle(t)},c.getVertexShader=function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")},c.getFragmentShader=function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")},c.initVar=function(){this.mstack=new Et,this.umat=B.create([2,0,1,0,-2,0,-1,1,1]),this.smat=B.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},c.blendEquation=function(t){this.gl.blendEquation(this.gl[t])},c.blendFunc=function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])},c.getShader=function(t,e,i){var n=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(n,e),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)?n:(alert(t.getShaderInfoLog(n)),null)},c.initShaders=function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},c.initBuffers=function(){var t,e;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)},c.createCircle=function(t){this.circleCanvasRadius=r(y.initValue(t,32));var e=l.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()},c.drawImg2Canvas=function(t){var e=t.body.width,i=t.body.height,n=r(t.body.width),a=r(t.body.height),s=t.body.width/n,o=t.body.height/a;this.texturebuffers[t.data.src]||(this.texturebuffers[t.data.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.data.texture=this.texturebuffers[t.data.src][0],t.data.vcBuffer=this.texturebuffers[t.data.src][1],t.data.tcBuffer=this.texturebuffers[t.data.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,s,0,0,o,o,o]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var h=t.data.canvas.getContext("2d").getImageData(0,0,n,a);this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,h),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.data.textureLoaded=!0,t.data.textureWidth=e,t.data.textureHeight=i},c.onProtonUpdate=function(){},c.onParticleCreated=function(t){t.data.textureLoaded=!1,t.data.tmat=B.create(),t.data.tmat[8]=1,t.data.imat=B.create(),t.data.imat[8]=1,t.body?f(t.body,this.addImg2Body,t):(f(this.circleCanvasURL,this.addImg2Body,t),t.data.oldScale=t.radius/this.circleCanvasRadius)},c.addImg2Body=function(t,e){e.dead||(e.body=t,e.data.src=t.src,e.data.canvas=g(t),e.data.oldScale=1,this.drawImg2Canvas(e))},c.onParticleUpdate=function(t){t.data.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.rgb.r/255,t.rgb.g/255,t.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.data.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.data.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},c.onParticleDead=function(t){},c.updateMatrix=function(t){var e=a(-t.data.textureWidth/2,-t.data.textureHeight/2),i=a(t.p.x,t.p.y),n=t.rotation*P.PI_180,r=s(n),l=t.scale*t.data.oldScale,c=o(l,l),u=h(e,c);u=h(u,r),u=h(u,i),B.inverse(u,t.data.imat),u[2]=t.alpha,this.mstack.push(u)},c.destroy=function(){t.prototype.destroy.call(this),this.gl=null,this.mstack=null,this.umat=null,this.smat=null,this.texturebuffers=null},i}(gt),Pt=function(t){function i(e){var i;return(i=t.call(this,e)||this).name="CustomRenderer",i}return e(i,t),i}(gt),Tt=function(t){function i(e,i,n,r,a){var s;return s=t.call(this)||this,n-e>=0?(s.x1=e,s.y1=i,s.x2=n,s.y2=r):(s.x1=n,s.y1=r,s.x2=e,s.y2=i),s.dx=s.x2-s.x1,s.dy=s.y2-s.y1,s.minx=Math.min(s.x1,s.x2),s.miny=Math.min(s.y1,s.y2),s.maxx=Math.max(s.x1,s.x2),s.maxy=Math.max(s.y1,s.y2),s.dot=s.x2*s.y1-s.x1*s.y2,s.xxyy=s.dx*s.dx+s.dy*s.dy,s.gradient=s.getGradient(),s.length=s.getLength(),s.direction=y.initValue(a,">"),s}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector},n.getDirection=function(t,e){var i=this.dy,n=-this.dx;return(i*t+n*e+this.dot)*(0===n?1:n)>0},n.getDistance=function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)},n.getSymmetric=function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),n=t.x,r=t.y;return t.x=n*Math.cos(i)-r*Math.sin(i),t.y=n*Math.sin(i)+r*Math.cos(i),t},n.getGradient=function(){return Math.atan2(this.dy,this.dx)},n.rangeOut=function(t){if(Math.abs(this.getGradient())<=P.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1},n.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},n.crossing=function(t){if("dead"===this.crossType)if(">"===this.direction||"R"===this.direction||"right"===this.direction||"down"===this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"===this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0===this.dx?t.v.x*=-1:0===this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"===this.crossType&&this.alert&&(console.error("Sorry, LineZone does not support cross method!"),this.alert=!1)},i}(k),Rt=function(t){function i(e,i,n){var r;return(r=t.call(this)||this).x=e,r.y=i,r.radius=n,r.angle=0,r.center={x:e,y:i},r}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.angle=P.PIx2*Math.random(),this.randomRadius=Math.random()*this.radius,this.vector.x=this.x+this.randomRadius*Math.cos(this.angle),this.vector.y=this.y+this.randomRadius*Math.sin(this.angle),this.vector},n.setCenter=function(t,e){this.center.x=t,this.center.y=e},n.crossing=function(t){var e=t.p.distanceTo(this.center);"dead"===this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"===this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"===this.crossType&&this.alert&&(console.error("Sorry, CircleZone does not support cross method!"),this.alert=!1)},n.getSymmetric=function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),n=t.v.x,r=t.v.y;t.v.x=n*Math.cos(i)-r*Math.sin(i),t.v.y=n*Math.sin(i)+r*Math.cos(i)},n.getGradient=function(t){return-P.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)},i}(k),_t=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).x=e,a.y=i,a.width=n,a.height=r,a}e(i,t);var n=i.prototype;return n.getPosition=function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector},n.crossing=function(t){"dead"===this.crossType?((t.p.x+t.radiusthis.x+this.width)&&(t.dead=!0),(t.p.y+t.radiusthis.y+this.height)&&(t.dead=!0)):"bound"===this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"===this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))},i}(k),wt=function(t){function i(e,i,n,r){var a;return(a=t.call(this)||this).reset(e,i,n,r),a}e(i,t);var n=i.prototype;return n.reset=function(t,e,i,n){this.imageData=t,this.x=y.initValue(e,0),this.y=y.initValue(i,0),this.d=y.initValue(n,2),this.vectors=[],this.setVectors()},n.setVectors=function(){var t,e,i=this.imageData.width,n=this.imageData.height;for(t=0;t>0)*i+(t>>0));this.imageData.data[r+3]>0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector},n.getBound=function(t,e){var i=4*((e>>0)*this.imageData.width+(t>>0));return this.imageData.data[i+3]>0},n.getPosition=function(){var t=y.getRandFromArray(this.vectors);return this.vector.copy(t)},n.getColor=function(t,e){t-=this.x;var i=4*(((e-=this.y)>>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}},n.crossing=function(t){"dead"===this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"===this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())},n.destroy=function(){t.prototype.destroy.call(this),this.imageData=null},i}(k),Ct={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",(function(){return e()}))},getStyle:function(t){void 0===t&&(t="#ff0000");var e=V.hexToRgb(t);return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),i instanceof N?(r.beginPath(),r.fillStyle=a,r.arc(i.x,i.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()):i instanceof Tt?(r.beginPath(),r.strokeStyle=a,r.moveTo(i.x1,i.y1),r.lineTo(i.x2,i.y2),r.stroke(),r.closePath()):i instanceof _t?(r.beginPath(),r.strokeStyle=a,r.drawRect(i.x,i.y,i.width,i.height),r.stroke(),r.closePath()):i instanceof Rt&&(r.beginPath(),r.strokeStyle=a,r.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),r.stroke(),r.closePath())}))},drawEmitter:function(t,e,i,n){var r=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,(function(){n&&r.clearRect(0,0,e.width,e.height),r.beginPath(),r.fillStyle=a,r.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),r.fill(),r.closePath()}))}};return R.Particle=D,R.Pool=b,R.Util=y,R.ColorUtil=V,R.MathUtil=P,R.Vector2D=R.Vector=S,R.Polar2D=R.Polar=M,R.ArraySpan=L,R.Rectangle=U,R.Rate=F,R.ease=I,R.Span=w,R.Mat3=B,R.getSpan=function(t,e,i){return new w(t,e,i)},R.createArraySpan=L.createArraySpan,R.Initialize=R.Init=z,R.Life=R.L=O,R.Position=R.P=H,R.Velocity=R.V=q,R.Mass=R.M=G,R.Radius=R.R=X,R.Body=R.B=Y,R.Behaviour=j,R.Force=R.F=W,R.Attraction=R.A=Z,R.RandomDrift=R.RD=Q,R.Gravity=R.G=K,R.Collision=J,R.CrossZone=$,R.Alpha=tt,R.Scale=R.S=et,R.Rotate=it,R.Color=nt,R.Repulsion=st,R.Cyclone=at,R.GravityWell=ot,R.Emitter=lt,R.BehaviourEmitter=ut,R.FollowEmitter=dt,R.Zone=k,R.LineZone=Tt,R.CircleZone=Rt,R.PointZone=N,R.RectZone=_t,R.ImageZone=wt,R.CanvasRenderer=yt,R.DomRenderer=mt,R.EaselRenderer=vt,R.PixiRenderer=xt,R.PixelRenderer=bt,R.WebGLRenderer=R.WebGlRenderer=At,R.CustomRenderer=Pt,R.Debug=Ct,y.assign(R,I),R})); //# sourceMappingURL=proton.min.js.map diff --git a/build/proton.min.js.map b/build/proton.min.js.map index 43e6271..0d2da8c 100755 --- a/build/proton.min.js.map +++ b/build/proton.min.js.map @@ -1 +1 @@ -{"version":3,"file":"proton.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/Span.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/render/PixiRenderer.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/index.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n sliceArray(arr1, index, arr2) {\n this.emptyArray(arr2);\n for (let i = index; i < arr1.length; i++) {\n arr2.push(arr1[i]);\n }\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n\n destroy() {\n if (this.container && this.container.parentNode) {\n const body = this.body || document.body;\n body.removeChild(this.container);\n }\n\n this.proton = null;\n this.container = null;\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n this.stats.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n\n this.integrator = null;\n this.renderers = null;\n this.emitters = null;\n this.stats = null;\n this.pool = null;\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","export default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setX(x) {\n this.x = x;\n return this;\n }\n\n setY(y) {\n this.y = y;\n return this;\n }\n\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","/** @typedef {import('../behaviour/Behaviour')} Behaviour */\n/** @typedef {import('../math/Vector2D')} Vector2D */\n/** @typedef {import('../utils/Rgb')} Rgb */\nimport Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Particle {\n /** @type string */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} */\n old = null;\n\n /** @type {object} */\n data = null;\n\n /** @type {Behaviour[]} */\n behaviours = null;\n\n /** @type {Vector2D} */\n p = null;\n\n /** @type {Vector2D} */\n v = null;\n\n /** @type {Vector2D} */\n a = null;\n\n /** @type {Rgb} */\n rgb = null;\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(conf) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * @param {Behaviour} behaviour\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * @param {Behaviour[]} behaviours\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Span {\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\nexport default class ArraySpan extends Span {\n constructor(color) {\n super();\n this._arr = Util.toArray(color);\n }\n\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\nexport default class Rate {\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @namespace\n * @memberof! Proton#\n * @constructor\n * @alias Rate\n *\n * @param {Array | Number | Span} numpan the number of each emission;\n * @param {Array | Number | Span} timepan the time of each emission;\n * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Life extends Initialize {\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class PointZone extends Zone {\n constructor(x, y) {\n super();\n\n this.x = x;\n this.y = y;\n }\n\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\nexport default class Position extends Initialize {\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Velocity extends Initialize {\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Mass extends Initialize {\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Radius extends Initialize {\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n\n this.name = \"Radius\";\n }\n\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\nexport default class Body extends Initialize {\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * computing life cycle\n *\n * @method calculate\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Attraction extends Behaviour {\n /**\n * This behaviour let the particles follow one specific Proton.Vector2D\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Attraction\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Proton.Vector2D} targetPosition\n * @property {Number} radius\n * @property {Number} force\n * @property {Number} radiusSq\n * @property {Proton.Vector2D} attractionForce\n * @property {Number} lengthSq\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n this.name = \"Attraction\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Attraction\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Attraction\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n this.reset(emitter, mass, callback);\n this.newPool = [];\n this.pool = [];\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.emitter) {\n Util.sliceArray(this.emitter.particles, index, this.newPool);\n } else {\n Util.sliceArray(this.pool, index, this.newPool);\n }\n\n const length = this.newPool.length;\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = this.newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Alpha extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Alpha\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Sets the new alpha value of the particle\n *\n * @method initialize\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle A single Proton generated particle\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * @method applyBehaviour\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Scale extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Scale\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Rotate extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Rotate\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} [influence=Velocity] The rotation's influence\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} a\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\nexport default class Repulsion extends Attraction {\n /**\n * The oppisite of Proton.Attraction - turns the force\n *\n * @memberof! Proton#\n * @augments Proton#Proton.Attraction\n * @constructor\n * @alias Proton.Repulsion\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Number} force\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n this.force *= -1;\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Repulsion\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} emitTime begin emit time;\n * @param {String} life the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n // this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * create single particle;\n *\n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method removeAllParticles\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n\n this.rate = null;\n this.old = null;\n this.rgb = null;\n this.v = null;\n this.a = null;\n this.p = null;\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\nexport default class PixiRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n if (obj.__isImage) return true;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") {\n obj.__isImage = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class CanvasRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n // private method\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawImage method\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class DomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class PixelRenderer extends BaseRenderer {\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class WebGLRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\nexport default class CustomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class LineZone extends Zone {\n constructor(x1, y1, x2, y2, direction) {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class CircleZone extends Zone {\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class RectZone extends Zone {\n constructor(x, y, width, height) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n\n return this.vector;\n }\n\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\nexport default class ImageZone extends Zone {\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n if (this.imageData.data[index + 3] > 0) return true;\n else return false;\n }\n\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;\n else particle.dead = false;\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n","import Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtil from \"./math/MathUtil\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Cyclone from \"./behaviour/Cyclone\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\n\n// namespace\nProton.Particle = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtil = MathUtil;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.Cyclone = Cyclone;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\nUtil.assign(Proton, ease);\n\n// export\nexport default Proton;\n"],"names":["length","i","tx","ty","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","getContext","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","this","sliceArray","arr1","index","arr2","push","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","ImgUtil","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","get","params","p","__puid","pop","createOrClone","expire","getCache","create","Util","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","bg","color","cssText","join","addEventListener","_this","parentNode","appendChild","renderers","result","cpool","round","removeChild","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","MathUtil","PIx2","PI_2","PI_180","N180_PI","Infinity","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","hasProp","setProp","props","prop","Span","getSpanValue","setVectorVal","conf","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","ease","Vector2D","set","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","PropUtil","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","getValue","setSpanValue","pan","ArraySpan","_arr","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","Collision","newPool","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","ColorUtil","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","Emitter","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","addInitialize","rest","removeInitialize","initializer","removeAllInitializers","arguments","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","InitializeUtil","PIXIClass","BehaviourEmitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","_Emitter","__isImage","tagName","nodeName","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","Types","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter","Vector","Polar","getSpan","Init","L","P","V","M","R","F","RD","G","S","WebGlRenderer","Debug"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proton.min.js","sources":["../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/Puid.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/MathUtil.js","../src/math/Integration.js","../src/core/Proton.js","../src/utils/Rgb.js","../src/math/Span.js","../src/utils/PropUtil.js","../src/math/ease.js","../src/math/Vector2D.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Cyclone.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/render/PixiRenderer.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/utils/Types.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/index.js"],"sourcesContent":["export default {\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) === 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | (length >> i);\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n};\n","export default {\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute'\n *\n * @return {Object}\n */\n createCanvas(id, width, height, position = \"absolute\") {\n const dom = document.createElement(\"canvas\");\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = \"absolute\";\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + \"px\";\n dom.style.height = height + \"px\";\n dom.style.marginLeft = -width / 2 + \"px\";\n dom.style.marginTop = -height / 2 + \"px\";\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div\n * @param {Number} $x\n * @param {Number} $y\n * @param {Number} $scale\n * @param {Number} $rotate\n */\n transform(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"transform\", transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n div.style.willChange = \"transform\";\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n this.css3(div, \"backfaceVisibility\", \"hidden\");\n this.css3(div, \"transform\", transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n};\n","import WebGLUtil from \"./WebGLUtil\";\nimport DomUtil from \"./DomUtil\";\n\nconst imgsCache = {};\nconst canvasCache = {};\nlet canvasId = 0;\n\nexport default {\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.data.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof img === \"string\" ? img : img.src;\n\n if (imgsCache[src]) {\n callback(imgsCache[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n imgsCache[src] = e.target;\n callback(imgsCache[src], param);\n };\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!canvasCache[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`proton_canvas_cache_${++canvasId}`, width, height);\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, img.width, img.height);\n\n canvasCache[src] = canvas;\n }\n\n callback && callback(canvasCache[src], param);\n\n return canvasCache[src];\n }\n};\n","import ImgUtil from \"./ImgUtil\";\n\nexport default {\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = value !== null && value !== undefined ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean}\n */\n isArray(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\";\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method emptyArray\n *\n * @param {Array} array Any array\n */\n emptyArray(arr) {\n if (arr) arr.length = 0;\n },\n\n toArray(arr) {\n return this.isArray(arr) ? arr : [arr];\n },\n\n sliceArray(arr1, index, arr2) {\n this.emptyArray(arr2);\n for (let i = index; i < arr1.length; i++) {\n arr2.push(arr1[i]);\n }\n },\n\n getRandFromArray(arr) {\n if (!arr) return null;\n return arr[Math.floor(arr.length * Math.random())];\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method emptyObject\n *\n * @param {Object} obj Any object\n */\n emptyObject(obj, ignore = null) {\n for (let key in obj) {\n if (ignore && ignore.indexOf(key) > -1) continue;\n delete obj[key];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args = null) {\n if (!args) {\n return new constructor();\n } else {\n const FactoryFunc = constructor.bind.apply(constructor, [null].concat(args));\n return new FactoryFunc();\n }\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroyAll(arr, param = null) {\n let i = arr.length;\n\n while (i--) {\n try {\n arr[i].destroy(param);\n } catch (e) {}\n\n delete arr[i];\n }\n\n arr.length = 0;\n },\n\n assign(target, source) {\n if (typeof Object.assign !== \"function\") {\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n\n return target;\n } else {\n return Object.assign(target, source);\n }\n }\n};\n","const idsMap = {};\n\nconst Puid = {\n _index: 0,\n _cache: {},\n\n id(type) {\n if (idsMap[type] === undefined || idsMap[type] === null) idsMap[type] = 0;\n return `${type}_${idsMap[type]++}`;\n },\n\n getId(target) {\n let uid = this.getIdFromCache(target);\n if (uid) return uid;\n\n uid = `PUID_${this._index++}`;\n this._cache[uid] = target;\n return uid;\n },\n\n getIdFromCache(target) {\n let obj, id;\n\n for (id in this._cache) {\n obj = this._cache[id];\n\n if (obj === target) return id;\n if (this.isBody(obj, target) && obj.src === target.src) return id;\n }\n\n return null;\n },\n\n isBody(obj, target) {\n return typeof obj === \"object\" && typeof target === \"object\" && obj.isInner && target.isInner;\n },\n\n getTarget(uid) {\n return this._cache[uid];\n }\n};\n\nexport default Puid;\n","/**\n * Pool is the cache pool of the proton engine, it is very important.\n *\n * get(target, params, uid)\n * Class\n * uid = Puid.getId -> Puid save target cache\n * target.__puid = uid\n *\n * body\n * uid = Puid.getId -> Puid save target cache\n *\n *\n * expire(target)\n * cache[target.__puid] push target\n *\n */\nimport Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\n\nexport default class Pool {\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || Puid.getId(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0) {\n p = this.cache[uid].pop();\n } else {\n p = this.createOrClone(target, params);\n }\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation\n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target === \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n for (let id in this.cache) count += this.cache[id].length;\n return count++;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid = \"default\") {\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}\n","export default class Stats {\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter)\n str += '' + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += '' + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = [\n \"position:absolute;bottom:0px;left:0;cursor:pointer;\",\n \"opacity:0.9;z-index:10000;padding:10px;font-size:12px;font-family:Helvetica,Arial,sans-serif;\",\n \"width:120px;height:50px;background-color:#002;color:#0ff;\"\n ].join(\"\");\n\n this.container.addEventListener(\n \"click\",\n e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n },\n false\n );\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = \"\";\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || \"\").substr(0, 1) + \".\";\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n\n destroy() {\n if (this.container && this.container.parentNode) {\n const body = this.body || document.body;\n body.removeChild(this.container);\n }\n\n this.proton = null;\n this.container = null;\n }\n}\n","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n constructor() {\n this._listeners = null;\n }\n\n static bind(target) {\n target.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n target.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n target.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n target.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n target.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0; i < length; i++) {\n if (arr[i] === listener) {\n if (length === 1) {\n delete this._listeners[type];\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type) this._listeners = null;\n else if (this._listeners) delete this._listeners[type];\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n // arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n}\n","const PI = 3.1415926;\nconst INFINITY = Infinity;\n\nconst MathUtil = {\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n Infinity: -999,\n\n isInfinity(num) {\n return num === this.Infinity || num === INFINITY;\n },\n\n randomAToB(a, b, isInt = false) {\n if (!isInt) return a + Math.random() * (b - a);\n else return ((Math.random() * (b - a)) >> 0) + a;\n },\n\n randomFloating(center, f, isInt) {\n return this.randomAToB(center - f, center + f, isInt);\n },\n\n randomColor() {\n return \"#\" + (\"00000\" + ((Math.random() * 0x1000000) << 0).toString(16)).slice(-6);\n },\n\n randomZone(display) {},\n\n floor(num, k = 4) {\n const digits = Math.pow(10, k);\n return Math.floor(num * digits) / digits;\n },\n\n degreeTransform(a) {\n return (a * PI) / 180;\n },\n\n toColor16(num) {\n return `#${num.toString(16)}`;\n }\n};\n\nexport default MathUtil;\n","export default class Integration {\n constructor(type) {\n this.type = type;\n }\n\n calculate(particles, time, damping) {\n this.eulerIntegrate(particles, time, damping);\n }\n\n // Euler Integrate\n // https://rosettacode.org/wiki/Euler_method\n eulerIntegrate(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n\n particle.a.multiplyScalar(1 / particle.mass);\n particle.v.add(particle.a.multiplyScalar(time));\n particle.p.add(particle.old.v.multiplyScalar(time));\n\n if (damping) particle.v.multiplyScalar(damping);\n\n particle.a.clear();\n }\n }\n}\n","import Pool from \"./Pool\";\nimport Util from \"../utils/Util\";\nimport Stats from \"../debug/Stats\";\nimport EventDispatcher from \"../events/EventDispatcher\";\nimport MathUtil from \"../math/MathUtil\";\nimport Integration from \"../math/Integration\";\n\nexport default class Proton {\n static USE_CLOCK = false;\n\n // measure 1:100\n static MEASURE = 100;\n static EULER = \"euler\";\n static RK2 = \"runge-kutta2\";\n\n // event name\n static PARTICLE_CREATED = \"PARTICLE_CREATED\";\n static PARTICLE_UPDATE = \"PARTICLE_UPDATE\";\n static PARTICLE_SLEEP = \"PARTICLE_SLEEP\";\n static PARTICLE_DEAD = \"PARTICLE_DEAD\";\n\n static EMITTER_ADDED = \"EMITTER_ADDED\";\n static EMITTER_REMOVED = \"EMITTER_REMOVED\";\n\n static PROTON_UPDATE = \"PROTON_UPDATE\";\n static PROTON_UPDATE_AFTER = \"PROTON_UPDATE_AFTER\";\n static DEFAULT_INTERVAL = 0.0167;\n\n static amendChangeTabsBug = true;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.now = 0;\n this.then = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n\n this._fps = \"auto\";\n this._interval = Proton.DEFAULT_INTERVAL;\n }\n\n set fps(fps) {\n this._fps = fps;\n this._interval = fps === \"auto\" ? Proton.DEFAULT_INTERVAL : MathUtil.floor(1 / fps, 7);\n }\n\n get fps() {\n return this._fps;\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n // 'auto' is the default browser refresh rate, the vast majority is 60fps\n if (this._fps === \"auto\") {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n // Fix bugs such as chrome browser switching tabs causing excessive time difference\n this.amendChangeTabsBug();\n\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n this.then = this.now;\n } else {\n this.emittersUpdate(Proton.DEFAULT_INTERVAL);\n }\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n // If the fps frame rate is set\n else {\n if (!this.then) this.then = new Date().getTime();\n this.now = new Date().getTime();\n this.elapsed = (this.now - this.then) * 0.001;\n\n if (this.elapsed > this._interval) {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n this.emittersUpdate(this._interval);\n // https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe\n this.then = this.now - (this.elapsed % this._interval) * 1000;\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n }\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (!Proton.amendChangeTabsBug) return;\n if (this.elapsed > 0.5) {\n this.then = new Date().getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n destroyAllEmitters() {\n Util.destroyAll(this.emitters);\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy(remove = false) {\n const destroyOther = () => {\n this.time = 0;\n this.then = 0;\n this.pool.destroy();\n this.stats.destroy();\n\n Util.destroyAll(this.emitters);\n Util.destroyAll(this.renderers, this.getAllParticles());\n\n this.integrator = null;\n this.renderers = null;\n this.emitters = null;\n this.stats = null;\n this.pool = null;\n };\n\n if (remove) {\n setTimeout(destroyOther, 200);\n } else {\n destroyOther();\n }\n }\n}\n\nEventDispatcher.bind(Proton);\n","export default class Rgb {\n constructor(r = 255, g = 255, b = 255) {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n reset() {\n this.r = 255;\n this.g = 255;\n this.b = 255;\n }\n}\n","import Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Span {\n constructor(a, b, center) {\n if (Util.isArray(a)) {\n this.isArray = true;\n this.a = a;\n } else {\n this.isArray = false;\n this.a = Util.initValue(a, 1);\n this.b = Util.initValue(b, this.a);\n this.center = Util.initValue(center, false);\n }\n }\n\n getValue(isInt = false) {\n if (this.isArray) {\n return Util.getRandFromArray(this.a);\n } else {\n if (!this.center) {\n return MathUtil.randomAToB(this.a, this.b, isInt);\n } else {\n return MathUtil.randomFloating(this.a, this.b, isInt);\n }\n }\n }\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n static setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined) return new Span(a, b);\n else return new Span(a, b, c);\n }\n }\n }\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n static getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n }\n}\n","import Span from \"../math/Span\";\n\nexport default {\n hasProp(target, key) {\n if (!target) return false;\n return target[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setProp\n *\n * @todo add description for param `target`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n *\n * @return {Object} target\n */\n setProp(target, props) {\n for (let prop in props) {\n if (target.hasOwnProperty(prop)) {\n target[prop] = Span.getSpanValue(props[prop]);\n }\n }\n\n return target;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVectorVal\n *\n * @todo add description for param `target`\n * @todo add description for param `conf`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} conf\n */\n setVectorVal(particle, conf = null) {\n if (!conf) return;\n\n if (this.hasProp(conf, \"x\")) particle.p.x = conf[\"x\"];\n if (this.hasProp(conf, \"y\")) particle.p.y = conf[\"y\"];\n\n if (this.hasProp(conf, \"vx\")) particle.v.x = conf[\"vx\"];\n if (this.hasProp(conf, \"vy\")) particle.v.y = conf[\"vy\"];\n\n if (this.hasProp(conf, \"ax\")) particle.a.x = conf[\"ax\"];\n if (this.hasProp(conf, \"ay\")) particle.a.y = conf[\"ay\"];\n\n if (this.hasProp(conf, \"p\")) particle.p.copy(conf[\"p\"]);\n if (this.hasProp(conf, \"v\")) particle.v.copy(conf[\"v\"]);\n if (this.hasProp(conf, \"a\")) particle.a.copy(conf[\"a\"]);\n\n if (this.hasProp(conf, \"position\")) particle.p.copy(conf[\"position\"]);\n if (this.hasProp(conf, \"velocity\")) particle.v.copy(conf[\"velocity\"]);\n if (this.hasProp(conf, \"accelerate\")) particle.a.copy(conf[\"accelerate\"]);\n }\n};\n","import MathUtil from \"./MathUtil\";\n\nexport default {\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow(value - 1, 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return Math.pow(value - 1, 3) + 1;\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow(value - 2, 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow(value - 1, 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * MathUtil.PI_2) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * MathUtil.PI_2);\n },\n\n easeInOutSine(value) {\n return -0.5 * (Math.cos(Math.PI * value) - 1);\n },\n\n easeInExpo(value) {\n return value === 0 ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0) return 0;\n\n if (value === 1) return 1;\n\n if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - value * value) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow(value - 1, 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return value * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === \"function\") return ease;\n else return this[ease] || this.easeLinear;\n }\n};\n","import MathUtil from \"../math/MathUtil\";\n\nexport default class Vector2D {\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setX(x) {\n this.x = x;\n return this;\n }\n\n setY(y) {\n this.y = y;\n return this;\n }\n\n getGradient() {\n if (this.x !== 0) return Math.atan2(this.y, this.x);\n else if (this.y > 0) return MathUtil.PI_2;\n else if (this.y < 0) return -MathUtil.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}\n","/** @typedef {import('../behaviour/Behaviour')} Behaviour */\n/** @typedef {import('../math/Vector2D')} Vector2D */\n/** @typedef {import('../utils/Rgb')} Rgb */\nimport Rgb from \"../utils/Rgb\";\nimport Puid from \"../utils/Puid\";\nimport Util from \"../utils/Util\";\nimport PropUtil from \"../utils/PropUtil\";\nimport ease from \"../math/ease\";\nimport Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Particle {\n /** @type string */\n id = \"\";\n\n /** @type {{p:Vector2D,v:Vector2D,a:Vector2D}} */\n old = null;\n\n /** @type {object} */\n data = null;\n\n /** @type {Behaviour[]} */\n behaviours = null;\n\n /** @type {Vector2D} */\n p = null;\n\n /** @type {Vector2D} */\n v = null;\n\n /** @type {Vector2D} */\n a = null;\n\n /** @type {Rgb} */\n rgb = null;\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(conf) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.name = \"Particle\";\n this.id = Puid.id(this.name);\n this.old = {};\n this.data = {};\n this.behaviours = [];\n\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n this.old.p = new Vector2D();\n this.old.v = new Vector2D();\n this.old.a = new Vector2D();\n\n this.rgb = new Rgb();\n this.reset();\n conf && PropUtil.setProp(this, conf);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtil.N180_PI;\n }\n\n reset() {\n this.life = Infinity;\n this.age = 0;\n\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.energy = 1; // Energy Loss\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n this.easing = ease.easeLinear;\n\n this.rgb.reset();\n Util.emptyObject(this.data);\n this.removeAllBehaviours();\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index);\n }\n }\n\n /**\n * @param {Behaviour} behaviour\n */\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty(\"parents\")) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n /**\n * @param {Behaviour[]} behaviours\n */\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n}\n","export default {\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRgb\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRgb(h) {\n const hex16 = h.charAt(0) === \"#\" ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRgb} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.rgb.r) * 65536 + Number(p.rgb.g) * 256 + Number(p.rgb.b);\n }\n};\n","import Vector2D from \"./Vector2D\";\n\nexport default class Polar2D {\n constructor(r, tha) {\n this.r = Math.abs(r) || 0;\n this.tha = tha || 0;\n }\n\n set(r, tha) {\n this.r = r;\n this.tha = tha;\n return this;\n }\n\n setR(r) {\n this.r = r;\n return this;\n }\n\n setTha(tha) {\n this.tha = tha;\n return this;\n }\n\n copy(p) {\n this.r = p.r;\n this.tha = p.tha;\n return this;\n }\n\n toVector() {\n return new Vector2D(this.getX(), this.getY());\n }\n\n getX() {\n return this.r * Math.sin(this.tha);\n }\n\n getY() {\n return -this.r * Math.cos(this.tha);\n }\n\n normalize() {\n this.r = 1;\n return this;\n }\n\n equals(v) {\n return v.r === this.r && v.tha === this.tha;\n }\n\n clear() {\n this.r = 0.0;\n this.tha = 0.0;\n return this;\n }\n\n clone() {\n return new Polar2D(this.r, this.tha);\n }\n}\n","const Mat3 = {\n create(mat3) {\n const mat = new Float32Array(9);\n if (mat3) this.set(mat3, mat);\n\n return mat;\n },\n\n set(mat1, mat2) {\n for (let i = 0; i < 9; i++) mat2[i] = mat1[i];\n\n return mat2;\n },\n\n multiply(mat, mat2, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a02 = mat[2],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b00 = mat2[0],\n b01 = mat2[1],\n b02 = mat2[2],\n b10 = mat2[3],\n b11 = mat2[4],\n b20 = mat2[6],\n b21 = mat2[7];\n\n mat3[0] = b00 * a00 + b01 * a10;\n mat3[1] = b00 * a01 + b01 * a11;\n mat3[2] = a02 * b02;\n mat3[3] = b10 * a00 + b11 * a10;\n mat3[4] = b10 * a01 + b11 * a11;\n mat3[6] = b20 * a00 + b21 * a10 + a20;\n mat3[7] = b20 * a01 + b21 * a11 + a21;\n\n return mat3;\n },\n\n inverse(mat, mat3) {\n let a00 = mat[0],\n a01 = mat[1],\n a10 = mat[3],\n a11 = mat[4],\n a20 = mat[6],\n a21 = mat[7],\n b01 = a11,\n b11 = -a10,\n b21 = a21 * a10 - a11 * a20,\n d = a00 * b01 + a01 * b11,\n id;\n\n id = 1 / d;\n mat3[0] = b01 * id;\n mat3[1] = -a01 * id;\n mat3[3] = b11 * id;\n mat3[4] = a00 * id;\n mat3[6] = b21 * id;\n mat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n return mat3;\n },\n\n multiplyVec2(m, vec, mat3) {\n let x = vec[0],\n y = vec[1];\n\n mat3[0] = x * m[0] + y * m[3] + m[6];\n mat3[1] = x * m[1] + y * m[4] + m[7];\n\n return mat3;\n }\n};\n\nexport default Mat3;\n","import Span from \"./Span\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"./MathUtil\";\n\nexport default class ArraySpan extends Span {\n constructor(color) {\n super();\n this._arr = Util.toArray(color);\n }\n\n getValue() {\n const val = Util.getRandFromArray(this._arr);\n return val === \"random\" || val === \"Random\" ? MathUtil.randomColor() : val;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan) return arr;\n else return new ArraySpan(arr);\n }\n}\n","export default class Rectangle {\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n\n this.width = w;\n this.height = h;\n\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n }\n\n contains(x, y) {\n if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;\n else return false;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\n\nexport default class Rate {\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @namespace\n * @memberof! Proton#\n * @constructor\n * @alias Rate\n *\n * @param {Array | Number | Span} numpan the number of each emission;\n * @param {Array | Number | Span} timepan the time of each emission;\n * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n */\n constructor(numpan, timepan) {\n this.numPan = Span.setSpanValue(Util.initValue(numpan, 1));\n this.timePan = Span.setSpanValue(Util.initValue(timepan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n init() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n }\n\n getValue(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n\n if (this.numPan.b === 1) {\n if (this.numPan.getValue(false) > 0.5) return 1;\n else return 0;\n } else {\n return this.numPan.getValue(true);\n }\n }\n\n return 0;\n }\n}\n","export default class Initialize {\n reset() {}\n\n init(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n }\n\n // sub class init\n initialize(target) {}\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Life extends Initialize {\n constructor(a, b, c) {\n super();\n\n this.lifePan = Span.setSpanValue(a, b, c);\n this.name = \"Life\";\n }\n\n initialize(target) {\n if (this.lifePan.a === Infinity) target.life = Infinity;\n else target.life = this.lifePan.getValue();\n }\n}\n","import Vector2D from \"../math/Vector2D\";\n\nexport default class Zone {\n constructor() {\n this.vector = new Vector2D(0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.alert = true;\n }\n\n getPosition() {}\n\n crossing(particle) {}\n\n destroy() {\n this.vector = null;\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class PointZone extends Zone {\n constructor(x, y) {\n super();\n\n this.x = x;\n this.y = y;\n }\n\n getPosition() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n\n return this.vector;\n }\n\n crossing(particle) {\n if (this.alert) {\n console.error(\"Sorry, PointZone does not support crossing method!\");\n this.alert = false;\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport PointZone from \"../zone/PointZone\";\nimport Initialize from \"./Initialize\";\n\nexport default class Position extends Initialize {\n constructor(zone) {\n super();\n this.zone = Util.initValue(zone, new PointZone());\n this.name = \"Position\";\n }\n\n reset(zone) {\n this.zone = Util.initValue(zone, new PointZone());\n }\n\n initialize(target) {\n this.zone.getPosition();\n\n target.p.x = this.zone.vector.x;\n target.p.y = this.zone.vector.y;\n }\n}\n","import Proton from \"../core/Proton\";\nimport Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Initialize from \"./Initialize\";\nimport Polar2D from \"../math/Polar2D\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class Velocity extends Initialize {\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n\n this.name = \"Velocity\";\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Span.setSpanValue(rpan);\n this.thaPan = Span.setSpanValue(thapan);\n this.type = Util.initValue(type, \"vector\");\n }\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type === \"p\" || this.type === \"P\" || this.type === \"polar\") {\n const polar2d = new Polar2D(\n this.normalizeVelocity(this.rPan.getValue()),\n this.thaPan.getValue() * MathUtil.PI_180\n );\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Mass extends Initialize {\n constructor(a, b, c) {\n super();\n this.massPan = Span.setSpanValue(a, b, c);\n this.name = \"Mass\";\n }\n\n initialize(target) {\n target.mass = this.massPan.getValue();\n }\n}\n","import Span from \"../math/Span\";\nimport Initialize from \"./Initialize\";\n\nexport default class Radius extends Initialize {\n constructor(a, b, c) {\n super();\n this.radius = Span.setSpanValue(a, b, c);\n\n this.name = \"Radius\";\n }\n\n reset(a, b, c) {\n this.radius = Span.setSpanValue(a, b, c);\n }\n\n initialize(particle) {\n particle.radius = this.radius.getValue();\n particle.data.oldRadius = particle.radius;\n }\n}\n","import Util from \"../utils/Util\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Initialize from \"./Initialize\";\n\nexport default class Body extends Initialize {\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = \"Body\";\n }\n\n initialize(particle) {\n const imageTarget = this.image.getValue();\n\n if (typeof imageTarget === \"string\") {\n particle.body = {\n width: this.w,\n height: this.h,\n src: imageTarget,\n isInner: true,\n inner: true\n };\n } else {\n particle.body = imageTarget;\n }\n }\n\n setSpanValue(image) {\n return image instanceof ArraySpan ? image : new ArraySpan(image);\n }\n}\n","import Proton from \"../core/Proton\";\nimport Util from \"../utils/Util\";\nimport ease from \"../math/ease\";\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = \"Behaviour\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force\n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * computing life cycle\n *\n * @method calculate\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Force extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Force\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(fx, fy, life, easing) {\n super(life, easing);\n\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n this.name = \"Force\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Number} fx\n * @param {Number} fy\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(fx, fy, life, easing) {\n this.force = this.normalizeForce(new Vector2D(fx, fy));\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Force\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.a.add(this.force);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Attraction extends Behaviour {\n /**\n * This behaviour let the particles follow one specific Proton.Vector2D\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Attraction\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Proton.Vector2D} targetPosition\n * @property {Number} radius\n * @property {Number} force\n * @property {Number} radiusSq\n * @property {Proton.Vector2D} attractionForce\n * @property {Number} lengthSq\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(life, easing);\n\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n this.name = \"Attraction\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Attraction\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n this.targetPosition = Util.initValue(targetPosition, new Vector2D());\n this.radius = Util.initValue(radius, 1000);\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.radiusSq = this.radius * this.radius;\n this.attractionForce = new Vector2D();\n this.lengthSq = 0;\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Attraction\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n this.attractionForce.copy(this.targetPosition);\n this.attractionForce.sub(particle.p);\n this.lengthSq = this.attractionForce.lengthSq();\n\n if (this.lengthSq > 0.00004 && this.lengthSq < this.radiusSq) {\n this.attractionForce.normalize();\n this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n this.attractionForce.multiplyScalar(this.force);\n\n particle.a.add(this.attractionForce);\n }\n }\n}\n","import Vector2D from \"../math/Vector2D\";\nimport MathUtil from \"../math/MathUtil\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class RandomDrift extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias RandomDrift\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {Number} time The time of the drift\n * @property {String} name The Behaviour name\n */\n constructor(driftX, driftY, delay, life, easing) {\n super(life, easing);\n\n this.reset(driftX, driftY, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n * @param {Number} delay \t\t\t\tHow much delay the drift should have\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(driftX, driftY, delay, life, easing) {\n this.panFoce = new Vector2D(driftX, driftY);\n this.panFoce = this.normalizeForce(this.panFoce);\n this.delay = delay;\n\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n particle.data.time = 0;\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#RandomDrift\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.data.time += time;\n\n if (particle.data.time >= this.delay) {\n particle.a.addXY(\n MathUtil.randomAToB(-this.panFoce.x, this.panFoce.x),\n MathUtil.randomAToB(-this.panFoce.y, this.panFoce.y)\n );\n\n particle.data.time = 0;\n }\n }\n}\n","import Force from \"./Force\";\n\nexport default class Gravity extends Force {\n /**\n * @memberof! Proton#\n * @augments Proton#Proton.Force\n * @constructor\n * @alias Proton.Gravity\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(g, life, easing) {\n super(0, g, life, easing);\n this.name = \"Gravity\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Gravity\n * @instance\n *\n * @param {Number} g \t\t\t\t\t\t\tGravity\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(g, life, easing) {\n super.reset(0, g, life, easing);\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Collision extends Behaviour {\n /**\n * The callback after collision\n *\n * @callback Callback\n *\n * @param {Proton.Particle} particle\n * @param {Proton.Paritcle} otherParticle\n */\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Collision\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(emitter, mass, callback, life, easing) {\n super(life, easing);\n this.reset(emitter, mass, callback);\n this.newPool = [];\n this.pool = [];\n this.name = \"Collision\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @memberof Proton#Proton.Collision\n * @method reset\n * @instance\n *\n * @todo add description to mass\n *\n * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n * @param {Boolean} \t\t[mass=true]\n * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(emitter, mass, callback, life, easing) {\n this.emitter = Util.initValue(emitter, null);\n this.mass = Util.initValue(mass, true);\n this.callback = Util.initValue(callback, null);\n\n this.collisionPool = [];\n this.delta = new Vector2D();\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @memberof Proton#Proton.Collision\n * @method applyBehaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.emitter) {\n Util.sliceArray(this.emitter.particles, index, this.newPool);\n } else {\n Util.sliceArray(this.pool, index, this.newPool);\n }\n\n const length = this.newPool.length;\n let otherParticle;\n let lengthSq;\n let overlap;\n let totalMass;\n let averageMass1, averageMass2;\n let i;\n\n for (i = 0; i < length; i++) {\n otherParticle = this.newPool[i];\n\n if (otherParticle !== particle) {\n this.delta.copy(otherParticle.p);\n this.delta.sub(particle.p);\n\n lengthSq = this.delta.lengthSq();\n const distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n totalMass = particle.mass + otherParticle.mass;\n averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n averageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\n particle.p.add(\n this.delta\n .clone()\n .normalize()\n .multiplyScalar(overlap * -averageMass1)\n );\n otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class CrossZone extends Behaviour {\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n }\n}\n","import Util from \"../utils/Util\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Alpha extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Alpha\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Alpha\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Sets the new alpha value of the particle\n *\n * @method initialize\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle A single Proton generated particle\n */\n initialize(particle) {\n particle.data.alphaA = this.a.getValue();\n\n if (this.same) particle.data.alphaB = particle.data.alphaA;\n else particle.data.alphaB = this.b.getValue();\n }\n\n /**\n * @method applyBehaviour\n * @memberof Proton#Proton.Alpha\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n particle.alpha = particle.data.alphaB + (particle.data.alphaA - particle.data.alphaB) * this.energy;\n\n if (particle.alpha < 0.001) particle.alpha = 0;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Scale extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Scale\n *\n * @todo add description for 'a' and 'b'\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Number} a\n * @param {String} b\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n this.a = Span.setSpanValue(Util.initValue(a, 1));\n this.b = Span.setSpanValue(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.data.scaleA = this.a.getValue();\n particle.data.oldRadius = particle.radius;\n particle.data.scaleB = this.same ? particle.data.scaleA : this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Scale\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n particle.scale = particle.data.scaleB + (particle.data.scaleA - particle.data.scaleB) * this.energy;\n\n if (particle.scale < 0.0001) particle.scale = 0;\n particle.radius = particle.data.oldRadius * particle.scale;\n }\n}\n","import Span from \"../math/Span\";\nimport Util from \"../utils/Util\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Rotate extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Rotate\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} [influence=Velocity] The rotation's influence\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(influence, b, style, life, easing) {\n super(life, easing);\n\n this.reset(influence, b, style);\n this.name = \"Rotate\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @todo add description for 'a', 'b' and 'style'\n *\n * @param {String} a\n * @param {String} b\n * @param {String} [style=to]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(a, b, style, life, easing) {\n this.same = b === null || b === undefined ? true : false;\n\n this.a = Span.setSpanValue(Util.initValue(a, \"Velocity\"));\n this.b = Span.setSpanValue(Util.initValue(b, 0));\n this.style = Util.initValue(style, \"to\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.rotation = this.a.getValue();\n particle.data.rotationA = this.a.getValue();\n\n if (!this.same) particle.data.rotationB = this.b.getValue();\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Rotate\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n if (!this.same) {\n if (this.style === \"to\" || this.style === \"TO\" || this.style === \"_\") {\n particle.rotation +=\n particle.data.rotationB + (particle.data.rotationA - particle.data.rotationB) * this.energy;\n } else {\n particle.rotation += particle.data.rotationB;\n }\n } else if (this.a.a === \"V\" || this.a.a === \"Velocity\" || this.a.a === \"v\") {\n // beta...\n particle.rotation = particle.getDirection();\n }\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport ArraySpan from \"../math/ArraySpan\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class Color extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.data.colorA = ColorUtil.hexToRgb(particle.color);\n\n if (this.b) particle.data.colorB = ColorUtil.hexToRgb(this.b.getValue());\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.rgb.r = particle.data.colorB.r + (particle.data.colorA.r - particle.data.colorB.r) * this.energy;\n particle.rgb.g = particle.data.colorB.g + (particle.data.colorA.g - particle.data.colorB.g) * this.energy;\n particle.rgb.b = particle.data.colorB.b + (particle.data.colorA.b - particle.data.colorB.b) * this.energy;\n\n particle.rgb.r = particle.rgb.r << 0;\n particle.rgb.g = particle.rgb.g << 0;\n particle.rgb.b = particle.rgb.b << 0;\n } else {\n particle.rgb.r = particle.data.colorA.r;\n particle.rgb.g = particle.data.colorA.g;\n particle.rgb.b = particle.data.colorA.b;\n }\n }\n}\n","import MathUtil from \"../math/MathUtil\";\nimport Vector2D from \"../math/Vector2D\";\nimport Span from \"../math/Span\";\nimport Behaviour from \"./Behaviour\";\n\nconst CHANGING = \"changing\";\n\nexport default class Cyclone extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Cyclone\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(angle, force, life, easing) {\n super(life, easing);\n this.setAngleAndForce(angle, force);\n this.name = \"Cyclone\";\n }\n\n setAngleAndForce(angle, force) {\n this.force = CHANGING;\n this.angle = MathUtil.PI / 2;\n\n if (angle === \"right\") {\n this.angle = MathUtil.PI / 2;\n } else if (angle === \"left\") {\n this.angle = -MathUtil.PI / 2;\n } else if (angle === \"random\") {\n this.angle = \"random\";\n } else if (angle instanceof Span) {\n this.angle = \"span\";\n this.span = angle;\n } else if (angle) {\n this.angle = angle;\n }\n\n if (\n String(force).toLowerCase() === \"changing\" ||\n String(force).toLowerCase() === \"chang\" ||\n String(force).toLowerCase() === \"auto\"\n ) {\n this.force = CHANGING;\n } else if (force) {\n this.force = force;\n }\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Number} angle\n * @param {Number} force\n * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(angle, force, life, easing) {\n this.angle = MathUtil.PI / 2;\n this.setAngleAndForce(angle, force);\n life && super.reset(life, easing);\n }\n\n initialize(particle) {\n if (this.angle === \"random\") {\n particle.data.cangle = MathUtil.randomAToB(-MathUtil.PI, MathUtil.PI);\n } else if (this.angle === \"span\") {\n particle.data.cangle = this.span.getValue();\n }\n\n particle.data.cyclone = new Vector2D(0, 0);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Cyclone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n\n let length;\n let gradient = particle.v.getGradient();\n if (this.angle === \"random\" || this.angle === \"span\") {\n gradient += particle.data.cangle;\n } else {\n gradient += this.angle;\n }\n\n if (this.force === CHANGING) {\n length = particle.v.length() / 100;\n } else {\n length = this.force;\n }\n\n particle.data.cyclone.x = length * Math.cos(gradient);\n particle.data.cyclone.y = length * Math.sin(gradient);\n particle.data.cyclone = this.normalizeForce(particle.data.cyclone);\n particle.a.add(particle.data.cyclone);\n }\n}\n","import Attraction from \"./Attraction\";\n\nexport default class Repulsion extends Attraction {\n /**\n * The oppisite of Proton.Attraction - turns the force\n *\n * @memberof! Proton#\n * @augments Proton#Proton.Attraction\n * @constructor\n * @alias Proton.Repulsion\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {Number} force\n * @property {String} name The Behaviour name\n */\n constructor(targetPosition, force, radius, life, easing) {\n super(targetPosition, force, radius, life, easing);\n\n this.force *= -1;\n this.name = \"Repulsion\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Repulsion\n * @instance\n *\n * @todo add description for 'force' and 'radius'\n *\n * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n * @param {Number} [force=100]\n * @param {Number} [radius=1000]\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n */\n reset(targetPosition, force, radius, life, easing) {\n super.reset(targetPosition, force, radius, life, easing);\n this.force *= -1;\n }\n}\n","import Util from \"../utils/Util\";\nimport Vector2D from \"../math/Vector2D\";\nimport Behaviour from \"./Behaviour\";\n\nexport default class GravityWell extends Behaviour {\n /**\n * @memberof! Proton#\n * @augments Behaviour\n * @constructor\n * @alias GravityWell\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(centerPoint, force, life, easing) {\n super(life, easing);\n\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n this.name = \"GravityWell\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n * @param {Number} [force=100]\t\t\t\t\tThe force\n * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n * @param {String} [easing=easeLinear]\tthis behaviour's easing\n */\n reset(centerPoint, force, life, easing) {\n this.distanceVec = new Vector2D();\n this.centerPoint = Util.initValue(centerPoint, new Vector2D());\n this.force = Util.initValue(this.normalizeValue(force), 100);\n\n life && super.reset(life, easing);\n }\n\n /**\n * @inheritdoc\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#GravityWell\n * @instance\n *\n * @param {Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n const distanceSq = this.distanceVec.lengthSq();\n\n if (distanceSq !== 0) {\n const distance = this.distanceVec.length();\n const factor = (this.force * time) / (distanceSq * distance);\n\n particle.v.x += factor * this.distanceVec.x;\n particle.v.y += factor * this.distanceVec.y;\n }\n }\n}\n","import PropUtil from \"../utils/PropUtil\";\nimport Initialize from \"./Initialize\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default {\n initialize(emitter, particle, initializes) {\n const length = initializes.length;\n let i;\n\n for (i = 0; i < length; i++) {\n if (initializes[i] instanceof Initialize) {\n initializes[i].init(emitter, particle);\n } else {\n this.init(emitter, particle, initializes[i]);\n }\n }\n\n this.bindEmitter(emitter, particle);\n },\n\n // init\n init(emitter, particle, initialize) {\n PropUtil.setProp(particle, initialize);\n PropUtil.setVectorVal(particle, initialize);\n },\n\n bindEmitter(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.rotate(MathUtil.degreeTransform(emitter.rotation));\n }\n }\n};\n","import Util from \"../utils/Util\";\nimport Puid from \"../utils/Puid\";\nimport Particle from \"../core/Particle\";\nimport EventDispatcher from \"../events/EventDispatcher\";\n\nimport Rate from \"../initialize/Rate\";\nimport InitializeUtil from \"../initialize/InitializeUtil\";\n\nexport default class Emitter extends Particle {\n /**\n * You can use this emit particles.\n *\n * It will dispatch follow events:\n * PARTICLE_CREATED\n * PARTICLE_UPDATA\n * PARTICLE_DEAD\n *\n * @class Emitter\n * @constructor\n * @param {Object} conf the parameters object;\n * for example {damping:0.01,bindEmitter:false}\n */\n constructor(conf = {}) {\n super(conf);\n\n this.particles = [];\n this.behaviours = [];\n this.initializes = [];\n\n this.emitTime = 0;\n this.emitSpeed = 0;\n this.totalTime = -1;\n\n /**\n * The friction coefficient for all particle emit by This;\n * @property damping\n * @type {Number}\n * @default 0.006\n */\n this.damping = 0.006;\n\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Rate(1, 0.1);\n\n this.name = \"Emitter\";\n this.id = Puid.id(this.name);\n }\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} emitTime begin emit time;\n * @param {String} life the life of this emitter\n */\n emit(totalTime, life) {\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = Util.initValue(totalTime, Infinity);\n\n if (life === true || life === \"life\" || life === \"destroy\") {\n this.life = totalTime === \"once\" ? 1 : this.totalTime;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n this.rate.init();\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this.totalTime = -1;\n this.emitTime = 0;\n this.stoped = true;\n }\n\n preEmit(time) {\n let oldStoped = this.stoped;\n let oldEmitTime = this.emitTime;\n let oldTotalTime = this.totalTime;\n\n this.stoped = false;\n this.emitTime = 0;\n this.totalTime = time;\n this.rate.init();\n\n const step = 0.0167;\n while (time > step) {\n time -= step;\n this.update(step);\n }\n\n this.stoped = oldStoped;\n this.emitTime = oldEmitTime + Math.max(time, 0);\n this.totalTime = oldTotalTime;\n }\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n removeAllParticles() {\n let i = this.particles.length;\n while (i--) this.particles[i].dead = true;\n }\n\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n addSelfInitialize(initialize) {\n if (initialize[\"init\"]) {\n initialize.init(this);\n } else {\n // this.initAll();\n }\n }\n\n /**\n * add the Initialize to particles;\n *\n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n addInitialize(...rest) {\n let i = rest.length;\n while (i--) this.initializes.push(rest[i]);\n }\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n removeInitialize(initializer) {\n const index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n }\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n removeAllInitializers() {\n Util.emptyArray(this.initializes);\n }\n\n /**\n * add the Behaviour to particles;\n *\n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n addBehaviour(...rest) {\n let i = arguments.length;\n while (i--) {\n let behaviour = rest[i];\n this.behaviours.push(behaviour);\n if (behaviour.parents) behaviour.parents.push(this);\n }\n }\n\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n removeBehaviour(behaviour) {\n let index = this.behaviours.indexOf(behaviour);\n this.behaviours.splice(index, 1);\n\n if (behaviour.parents) {\n index = behaviour.parents.indexOf(behaviour);\n behaviour.parents.splice(index, 1);\n }\n\n return index;\n }\n\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n removeAllBehaviours() {\n Util.emptyArray(this.behaviours);\n }\n\n // emitter update\n update(time) {\n this.age += time;\n if (this.age >= this.life || this.dead) this.destroy();\n\n this.emitting(time);\n this.integrate(time);\n }\n\n integrate(time) {\n if (!this.parent) return;\n\n const damping = 1 - this.damping;\n this.parent.integrator.calculate(this, time, damping);\n\n const length = this.particles.length;\n let i, particle;\n\n for (i = length - 1; i >= 0; i--) {\n particle = this.particles[i];\n\n // particle update\n particle.update(time, i);\n this.parent.integrator.calculate(particle, time, damping);\n this.dispatch(\"PARTICLE_UPDATE\", particle);\n\n // check dead\n if (particle.dead) {\n this.dispatch(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle);\n this.particles.splice(i, 1);\n }\n }\n }\n\n dispatch(event, target) {\n this.parent && this.parent.dispatchEvent(event, target);\n this.bindEvent && this.dispatchEvent(event, target);\n }\n\n emitting(time) {\n if (this.stoped) return;\n\n if (this.totalTime === \"none\") {\n this.emitTime += time;\n } else if (this.totalTime === \"once\") {\n let i;\n const length = this.rate.getValue(99999);\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n this.totalTime = \"none\";\n } else {\n this.emitTime += time;\n\n if (this.emitTime < this.totalTime) {\n const length = this.rate.getValue(time);\n let i;\n\n if (length > 0) this.emitSpeed = length;\n for (i = 0; i < length; i++) this.createParticle();\n }\n }\n }\n\n /**\n * create single particle;\n *\n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method removeAllParticles\n */\n createParticle(initialize, behaviour) {\n const particle = this.parent.pool.get(Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.dispatch(\"PARTICLE_CREATED\", particle);\n\n return particle;\n }\n\n setupParticle(particle, initialize, behaviour) {\n let initializes = this.initializes;\n let behaviours = this.behaviours;\n\n if (initialize) initializes = Util.toArray(initialize);\n if (behaviour) behaviours = Util.toArray(behaviour);\n\n particle.reset();\n InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n\n this.particles.push(particle);\n }\n\n remove() {\n this.stop();\n Util.destroyAll(this.particles);\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n this.dead = true;\n this.remove();\n this.removeAllInitializers();\n this.removeAllBehaviours();\n this.parent && this.parent.removeEmitter(this);\n\n this.rate = null;\n this.old = null;\n this.rgb = null;\n this.v = null;\n this.a = null;\n this.p = null;\n }\n}\n\nEventDispatcher.bind(Emitter);\n","import Types from \"../utils/Types\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nlet PIXIClass;\nexport default class PixiRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.color = false;\n this.setColor = false;\n this.blendMode = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.setPIXI(window.PIXI);\n\n this.name = \"PixiRenderer\";\n }\n\n setPIXI(PIXI) {\n try {\n PIXIClass = PIXI || { Sprite: {} };\n this.createFromImage = PIXIClass.Sprite.from || PIXIClass.Sprite.fromImage;\n } catch (e) {}\n }\n\n onProtonUpdate() {}\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n if (this.blendMode) {\n particle.body.blendMode = this.blendMode;\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n\n if (this.setColor === true || this.color === true) {\n particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtil.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtil.PI_180; // MathUtil.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n else return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? this.createFromImage(body.src) : new PIXIClass.Sprite(body);\n\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXIClass.Graphics();\n\n if (this.stroke) {\n const stroke = Types.isString(this.stroke) ? this.stroke : 0x000000;\n graphics.beginStroke(stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n\n destroy(particles) {\n super.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n}\n","import Emitter from \"./Emitter\";\n\nexport default class BehaviourEmitter extends Emitter {\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} conf the parameters object;\n */\n constructor(conf) {\n super(conf);\n\n this.selfBehaviours = [];\n }\n\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n addSelfBehaviour(...rest) {\n let i,\n length = rest.length;\n\n for (i = 0; i < length; i++) {\n let behaviour = rest[i];\n this.selfBehaviours.push(behaviour);\n behaviour.initialize(this);\n }\n }\n\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n removeSelfBehaviour(behaviour) {\n const index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n }\n\n update(time) {\n super.update(time);\n\n if (!this.sleep) {\n const length = this.selfBehaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i);\n }\n }\n }\n}\n","import Util from \"../utils/Util\";\nimport Emitter from \"./Emitter\";\n\nexport default class FollowEmitter extends Emitter {\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} conf the parameters object;\n */\n constructor(mouseTarget, ease, conf) {\n super(conf);\n\n this.mouseTarget = Util.initValue(mouseTarget, window);\n this.ease = Util.initValue(ease, 0.7);\n\n this._allowEmitting = false;\n this.initEventHandler();\n }\n\n initEventHandler() {\n this.mousemoveHandler = e => this.mousemove.call(this, e);\n this.mousedownHandler = e => this.mousedown.call(this, e);\n this.mouseupHandler = e => this.mouseup.call(this, e);\n this.mouseTarget.addEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n emit() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stop\n */\n stop() {\n this._allowEmitting = false;\n }\n\n mousemove(e) {\n if (e.layerX || e.layerX === 0) {\n this.p.x += (e.layerX - this.p.x) * this.ease;\n this.p.y += (e.layerY - this.p.y) * this.ease;\n } else if (e.offsetX || e.offsetX === 0) {\n this.p.x += (e.offsetX - this.p.x) * this.ease;\n this.p.y += (e.offsetY - this.p.y) * this.ease;\n }\n\n if (this._allowEmitting) super.emit(\"once\");\n }\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n destroy() {\n super.destroy();\n this.mouseTarget.removeEventListener(\"mousemove\", this.mousemoveHandler, false);\n }\n}\n","export default {\n /**\n * Determine whether it is a picture object\n *\n * @return {boolean} is or no\n */\n isImage(obj) {\n if (!obj) return false;\n if (obj.__isImage) return true;\n\n const tagName = `${obj.tagName}`.toUpperCase();\n const nodeName = `${obj.nodeName}`.toUpperCase();\n if (nodeName === \"IMG\" || tagName === \"IMG\") {\n obj.__isImage = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Determine whether it is a string object\n *\n * @return {boolean} is or no\n */\n isString(obj) {\n return typeof obj === \"string\";\n }\n};\n","import Pool from \"../core/Pool\";\n\nexport default class BaseRenderer {\n constructor(element, stroke) {\n this.pool = new Pool();\n this.element = element;\n this.stroke = stroke;\n this.circleConf = { isCircle: true };\n\n this.initEventHandler();\n this.name = \"BaseRenderer\";\n }\n\n setStroke(color = \"#000000\", thinkness = 1) {\n this.stroke = { color, thinkness };\n }\n\n initEventHandler() {\n this._protonUpdateHandler = () => {\n this.onProtonUpdate.call(this);\n };\n\n this._protonUpdateAfterHandler = () => {\n this.onProtonUpdateAfter.call(this);\n };\n\n this._emitterAddedHandler = emitter => {\n this.onEmitterAdded.call(this, emitter);\n };\n\n this._emitterRemovedHandler = emitter => {\n this.onEmitterRemoved.call(this, emitter);\n };\n\n this._particleCreatedHandler = particle => {\n this.onParticleCreated.call(this, particle);\n };\n\n this._particleUpdateHandler = particle => {\n this.onParticleUpdate.call(this, particle);\n };\n\n this._particleDeadHandler = particle => {\n this.onParticleDead.call(this, particle);\n };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n proton.addEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n proton.addEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n proton.addEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n proton.addEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n proton.addEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n destroy() {\n this.remove();\n this.pool.destroy();\n this.pool = null;\n this.element = null;\n this.stroke = null;\n }\n\n remove(proton) {\n this.parent.removeEventListener(\"PROTON_UPDATE\", this._protonUpdateHandler);\n this.parent.removeEventListener(\"PROTON_UPDATE_AFTER\", this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(\"EMITTER_ADDED\", this._emitterAddedHandler);\n this.parent.removeEventListener(\"EMITTER_REMOVED\", this._emitterRemovedHandler);\n\n this.parent.removeEventListener(\"PARTICLE_CREATED\", this._particleCreatedHandler);\n this.parent.removeEventListener(\"PARTICLE_UPDATE\", this._particleUpdateHandler);\n this.parent.removeEventListener(\"PARTICLE_DEAD\", this._particleDeadHandler);\n\n this.parent = null;\n }\n\n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}\n","import Types from \"../utils/Types\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport ColorUtil from \"../utils/ColorUtil\";\nimport MathUtil from \"../math/MathUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class CanvasRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n this.name = \"CanvasRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.color = particle.color || \"#ff0000\";\n }\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (Types.isImage(particle.body)) {\n this.drawImage(particle);\n }\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n // private method\n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawImage method\n drawImage(particle) {\n const w = (particle.body.width * particle.scale) | 0;\n const h = (particle.body.height * particle.scale) | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.data[\"buffer\"]) particle.data.buffer = this.createBuffer(particle.body);\n\n const bufContext = particle.data.buffer.getContext(\"2d\");\n bufContext.clearRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalAlpha = particle.alpha;\n bufContext.drawImage(particle.body, 0, 0);\n\n bufContext.globalCompositeOperation = \"source-atop\";\n bufContext.fillStyle = ColorUtil.rgbToHex(particle.rgb);\n bufContext.fillRect(0, 0, particle.data.buffer.width, particle.data.buffer.height);\n bufContext.globalCompositeOperation = \"source-over\";\n bufContext.globalAlpha = 1;\n\n this.context.drawImage(\n particle.data.buffer,\n 0,\n 0,\n particle.data.buffer.width,\n particle.data.buffer.height,\n x,\n y,\n w,\n h\n );\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtil.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.rgb) {\n this.context.fillStyle = `rgba(${particle.rgb.r},${particle.rgb.g},${particle.rgb.b},${particle.alpha})`;\n } else {\n this.context.fillStyle = particle.color;\n }\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer\n createBuffer(image) {\n if (Types.isImage(image)) {\n const size = image.width + \"_\" + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.bufferCache = null;\n }\n}\n","import DomUtil from \"../utils/DomUtil\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class DomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.transform3d = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"DomRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d) {\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n } else {\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n }\n\n particle.body.style.opacity = particle.alpha;\n\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || \"#ff0000\";\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === \"object\" && particle.body && !particle.body.isInner;\n }\n\n // private method\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle) return this.createCircle(particle);\n return this.createSprite(body, particle);\n }\n\n // private methods\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === \"string\" ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Types from \"../utils/Types\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class EaselRenderer extends BaseRenderer {\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = \"EaselRenderer\";\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body[\"image\"]) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(window.createjs.Graphics);\n\n if (this.stroke) {\n if (Types.isString(this.stroke)) {\n graphics.beginStroke(this.stroke);\n } else {\n graphics.beginStroke(\"#000000\");\n }\n }\n graphics.beginFill(particle.color || \"#ff0000\").drawCircle(0, 0, particle.radius);\n const shape = this.pool.get(window.createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n destroy() {\n super.destroy();\n this.stroke = null;\n }\n}\n","import Rectangle from \"../math/Rectangle\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nexport default class PixelRenderer extends BaseRenderer {\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext(\"2d\");\n this.imageData = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = \"PixelRenderer\";\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(\n this.rectangle.x,\n this.rectangle.y,\n this.rectangle.width,\n this.rectangle.height\n );\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(\n this.imageData,\n (particle.p.x - this.rectangle.x) >> 0,\n (particle.p.y - this.rectangle.y) >> 0,\n particle\n );\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.rgb;\n if (x < 0 || x > this.element.width || y < 0 || y > this.element.height) return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {}\n\n destroy() {\n super.destroy();\n this.stroke = null;\n this.context = null;\n this.imageData = null;\n this.rectangle = null;\n }\n}\n","import Mat3 from \"../math/Mat3\";\n\nexport default class MStack {\n constructor() {\n this.mats = [];\n this.size = 0;\n\n for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n }\n\n set(m, i) {\n if (i === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n this.size = Math.max(this.size, i + 1);\n }\n\n push(m) {\n if (this.size === 0) Mat3.set(m, this.mats[0]);\n else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n this.size++;\n }\n\n pop() {\n if (this.size > 0) this.size--;\n }\n\n top() {\n return this.mats[this.size - 1];\n }\n}\n","import Mat3 from \"../math/Mat3\";\nimport BaseRenderer from \"./BaseRenderer\";\n\nimport Util from \"../utils/Util\";\nimport ImgUtil from \"../utils/ImgUtil\";\nimport MStack from \"../utils/MStack\";\nimport DomUtil from \"../utils/DomUtil\";\nimport WebGLUtil from \"../utils/WebGLUtil\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class WebGLRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext(\"experimental-webgl\", { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = \"WebGLRenderer\";\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\n \"uniform vec2 viewport;\",\n \"attribute vec2 aVertexPosition;\",\n \"attribute vec2 aTextureCoord;\",\n \"uniform mat3 tMat;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"void main() {\",\n \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\",\n \"gl_Position = vec4(v.x, v.y, 0, 1);\",\n \"vTextureCoord = aTextureCoord;\",\n \"alpha = tMat[0][2];\",\n \"}\"\n ].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\n \"precision mediump float;\",\n \"varying vec2 vTextureCoord;\",\n \"varying float alpha;\",\n \"uniform sampler2D uSampler;\",\n \"uniform vec4 color;\",\n \"uniform bool useTexture;\",\n \"uniform vec3 uColor;\",\n \"void main() {\",\n \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\",\n \"gl_FragColor = textureColor * vec4(uColor, 1.0);\",\n \"gl_FragColor.w *= alpha;\",\n \"}\"\n ].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n }\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n }\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas(\"circle_canvas\", this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext(\"2d\");\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = \"#FFF\";\n context.fill();\n\n return canvas.toDataURL();\n }\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.data.src])\n this.texturebuffers[particle.data.src] = [\n this.gl.createTexture(),\n this.gl.createBuffer(),\n this.gl.createBuffer()\n ];\n\n particle.data.texture = this.texturebuffers[particle.data.src][0];\n particle.data.vcBuffer = this.texturebuffers[particle.data.src][1];\n particle.data.tcBuffer = this.texturebuffers[particle.data.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]),\n this.gl.STATIC_DRAW\n );\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.bufferData(\n this.gl.ARRAY_BUFFER,\n new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]),\n this.gl.STATIC_DRAW\n );\n\n const context = particle.data.canvas.getContext(\"2d\");\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.data.textureLoaded = true;\n particle.data.textureWidth = _w;\n particle.data.textureHeight = _h;\n }\n\n onProtonUpdate() {\n // this.gl.clearColor(0, 0, 0, 1);\n // this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.data.textureLoaded = false;\n particle.data.tmat = Mat3.create();\n particle.data.tmat[8] = 1;\n particle.data.imat = Mat3.create();\n particle.data.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.data.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private\n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = img;\n particle.data.src = img.src;\n particle.data.canvas = ImgUtil.getCanvasFromCache(img);\n particle.data.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.data.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.rgb.r / 255, particle.rgb.g / 255, particle.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.data.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.data.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) {}\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(\n -particle.data.textureWidth / 2,\n -particle.data.textureHeight / 2\n );\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * MathUtil.PI_180;\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.data.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.data.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n\n destroy() {\n super.destroy();\n this.gl = null;\n this.mstack = null;\n this.umat = null;\n this.smat = null;\n this.texturebuffers = null;\n }\n}\n","import BaseRenderer from \"./BaseRenderer\";\n\nexport default class CustomRenderer extends BaseRenderer {\n constructor(element) {\n super(element);\n\n this.name = \"CustomRenderer\";\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class LineZone extends Zone {\n constructor(x1, y1, x2, y2, direction) {\n super();\n\n if (x2 - x1 >= 0) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n } else {\n this.x1 = x2;\n this.y1 = y2;\n this.x2 = x1;\n this.y2 = y1;\n }\n\n this.dx = this.x2 - this.x1;\n this.dy = this.y2 - this.y1;\n\n this.minx = Math.min(this.x1, this.x2);\n this.miny = Math.min(this.y1, this.y2);\n this.maxx = Math.max(this.x1, this.x2);\n this.maxy = Math.max(this.y1, this.y2);\n\n this.dot = this.x2 * this.y1 - this.x1 * this.y2;\n this.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n this.gradient = this.getGradient();\n this.length = this.getLength();\n this.direction = Util.initValue(direction, \">\");\n }\n\n getPosition() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n return this.vector;\n }\n\n getDirection(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = B === 0 ? 1 : B;\n\n if ((A * x + B * y + C) * D > 0) return true;\n else return false;\n }\n\n getDistance(x, y) {\n const A = this.dy;\n const B = -this.dx;\n const C = this.dot;\n const D = A * x + B * y + C;\n\n return D / Math.sqrt(this.xxyy);\n }\n\n getSymmetric(v) {\n const tha2 = v.getGradient();\n const tha1 = this.getGradient();\n const tha = 2 * (tha1 - tha2);\n\n const oldx = v.x;\n const oldy = v.y;\n\n v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n return v;\n }\n\n getGradient() {\n return Math.atan2(this.dy, this.dx);\n }\n\n rangeOut(particle) {\n const angle = Math.abs(this.getGradient());\n\n if (angle <= MathUtil.PI / 4) {\n if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n } else {\n if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n }\n\n return false;\n }\n\n getLength() {\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.direction === \">\" || this.direction === \"R\" || this.direction === \"right\" || this.direction === \"down\") {\n if (!this.rangeOut(particle)) return;\n if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n } else {\n if (!this.rangeOut(particle)) return;\n if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n }\n } else if (this.crossType === \"bound\") {\n if (!this.rangeOut(particle)) return;\n\n if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n if (this.dx === 0) {\n particle.v.x *= -1;\n } else if (this.dy === 0) {\n particle.v.y *= -1;\n } else {\n this.getSymmetric(particle.v);\n }\n }\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, LineZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport MathUtil from \"../math/MathUtil\";\n\nexport default class CircleZone extends Zone {\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.angle = MathUtil.PIx2 * Math.random();\n this.randomRadius = Math.random() * this.radius;\n this.vector.x = this.x + this.randomRadius * Math.cos(this.angle);\n this.vector.y = this.y + this.randomRadius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType === \"dead\") {\n if (d - particle.radius > this.radius) particle.dead = true;\n } else if (this.crossType === \"bound\") {\n if (d + particle.radius >= this.radius) this.getSymmetric(particle);\n } else if (this.crossType === \"cross\") {\n if (this.alert) {\n console.error(\"Sorry, CircleZone does not support cross method!\");\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n const tha2 = particle.v.getGradient();\n const tha1 = this.getGradient(particle);\n\n const tha = 2 * (tha1 - tha2);\n const oldx = particle.v.x;\n const oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtil.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}\n","import Zone from \"./Zone\";\n\nexport default class RectZone extends Zone {\n constructor(x, y, width, height) {\n super();\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n getPosition() {\n this.vector.x = this.x + Math.random() * this.width;\n this.vector.y = this.y + Math.random() * this.height;\n\n return this.vector;\n }\n\n crossing(particle) {\n // particle dead zone\n if (this.crossType === \"dead\") {\n if (particle.p.x + particle.radius < this.x) particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y) particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true;\n }\n\n // particle bound zone\n else if (this.crossType === \"bound\") {\n if (particle.p.x - particle.radius < this.x) {\n particle.p.x = this.x + particle.radius;\n particle.v.x *= -1;\n } else if (particle.p.x + particle.radius > this.x + this.width) {\n particle.p.x = this.x + this.width - particle.radius;\n particle.v.x *= -1;\n }\n\n if (particle.p.y - particle.radius < this.y) {\n particle.p.y = this.y + particle.radius;\n particle.v.y *= -1;\n } else if (particle.p.y + particle.radius > this.y + this.height) {\n particle.p.y = this.y + this.height - particle.radius;\n particle.v.y *= -1;\n }\n }\n\n // particle cross zone\n else if (this.crossType === \"cross\") {\n if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) {\n particle.p.x = this.x + this.width + particle.radius;\n } else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) {\n particle.p.x = this.x - particle.radius;\n }\n\n if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) {\n particle.p.y = this.y + this.height + particle.radius;\n } else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) {\n particle.p.y = this.y - particle.radius;\n }\n }\n }\n}\n","import Zone from \"./Zone\";\nimport Util from \"../utils/Util\";\n\nexport default class ImageZone extends Zone {\n constructor(imageData, x, y, d) {\n super();\n this.reset(imageData, x, y, d);\n }\n\n reset(imageData, x, y, d) {\n this.imageData = imageData;\n this.x = Util.initValue(x, 0);\n this.y = Util.initValue(y, 0);\n this.d = Util.initValue(d, 2);\n\n this.vectors = [];\n this.setVectors();\n }\n\n setVectors() {\n let i, j;\n const length1 = this.imageData.width;\n const length2 = this.imageData.height;\n\n for (i = 0; i < length1; i += this.d) {\n for (j = 0; j < length2; j += this.d) {\n let index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n if (this.imageData.data[index + 3] > 0) {\n this.vectors.push({ x: i + this.x, y: j + this.y });\n }\n }\n }\n\n return this.vector;\n }\n\n getBound(x, y) {\n const index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n if (this.imageData.data[index + 3] > 0) return true;\n else return false;\n }\n\n getPosition() {\n const vector = Util.getRandFromArray(this.vectors);\n return this.vector.copy(vector);\n }\n\n getColor(x, y) {\n x -= this.x;\n y -= this.y;\n const i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n return {\n r: this.imageData.data[i],\n g: this.imageData.data[i + 1],\n b: this.imageData.data[i + 2],\n a: this.imageData.data[i + 3]\n };\n }\n\n crossing(particle) {\n if (this.crossType === \"dead\") {\n if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;\n else particle.dead = false;\n } else if (this.crossType === \"bound\") {\n if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate();\n }\n }\n\n destroy() {\n super.destroy();\n this.imageData = null;\n }\n}\n","import ColorUtil from \"../utils/ColorUtil\";\nimport CircleZone from \"../zone/CircleZone\";\nimport PointZone from \"../zone/PointZone\";\nimport LineZone from \"../zone/LineZone\";\nimport RectZone from \"../zone/RectZone\";\n\nexport default {\n addEventListener(proton, func) {\n proton.addEventListener(\"PROTON_UPDATE_AFTER\", () => func());\n },\n\n getStyle(color = \"#ff0000\") {\n const rgb = ColorUtil.hexToRgb(color);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n },\n\n drawZone(proton, canvas, zone, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (zone instanceof PointZone) {\n context.beginPath();\n context.fillStyle = style;\n context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n } else if (zone instanceof LineZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.moveTo(zone.x1, zone.y1);\n context.lineTo(zone.x2, zone.y2);\n context.stroke();\n context.closePath();\n } else if (zone instanceof RectZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.drawRect(zone.x, zone.y, zone.width, zone.height);\n context.stroke();\n context.closePath();\n } else if (zone instanceof CircleZone) {\n context.beginPath();\n context.strokeStyle = style;\n context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n context.stroke();\n context.closePath();\n }\n });\n },\n\n drawEmitter(proton, canvas, emitter, clear) {\n const context = canvas.getContext(\"2d\");\n const style = this.getStyle();\n\n this.addEventListener(proton, () => {\n if (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\n context.beginPath();\n context.fillStyle = style;\n context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n context.fill();\n context.closePath();\n });\n }\n};\n","import Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtil from \"./math/MathUtil\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Cyclone from \"./behaviour/Cyclone\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\n\n// namespace\nProton.Particle = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtil = MathUtil;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.Cyclone = Cyclone;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\nUtil.assign(Proton, ease);\n\n// export\nexport default Proton;\n"],"names":["length","i","tx","ty","angleInRadians","c","Math","cos","s","sin","sx","sy","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","createCanvas","id","width","height","position","dom","document","createElement","style","opacity","transform","createDiv","resize","marginLeft","marginTop","div","x","y","scale","rotate","willChange","css3","transform3d","key","val","bkey","charAt","toUpperCase","substr","imgsCache","canvasCache","canvasId","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","getContext","initValue","value","defaults","isArray","Object","prototype","toString","call","emptyArray","arr","toArray","this","sliceArray","arr1","index","arr2","push","getRandFromArray","floor","random","emptyObject","obj","ignore","indexOf","classApply","constructor","args","bind","apply","concat","ImgUtil","destroyAll","destroy","assign","source","hasOwnProperty","idsMap","Puid","_index","_cache","type","undefined","getId","uid","getIdFromCache","isBody","isInner","getTarget","Pool","num","total","cache","get","params","p","__puid","pop","createOrClone","expire","getCache","create","Util","clone","getCount","count","Stats","proton","container","emitterIndex","rendererIndex","update","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","pool","innerHTML","bg","color","cssText","join","addEventListener","_this","parentNode","appendChild","renderers","result","cpool","round","removeChild","EventDispatcher","_listeners","dispatchEvent","hasEventListener","removeEventListener","removeAllEventListeners","listener","splice","listeners","handler","PI","MathUtil","PIx2","PI_2","PI_180","N180_PI","Infinity","isInfinity","randomAToB","isInt","randomFloating","center","f","randomColor","slice","randomZone","display","k","digits","pow","degreeTransform","toColor16","Integration","calculate","particles","time","damping","eulerIntegrate","particle","sleep","old","copy","v","multiplyScalar","mass","clear","Proton","integrationType","now","then","elapsed","stats","EULER","integrator","_fps","_interval","DEFAULT_INTERVAL","addRenderer","render","init","removeRenderer","remove","addEmitter","parent","EMITTER_ADDED","removeEmitter","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","getAllParticles","destroyAllEmitters","destroyOther","setTimeout","fps","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","Rgb","r","g","reset","Span","getValue","setSpanValue","getSpanValue","pan","hasProp","setProp","props","prop","setVectorVal","conf","easeLinear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","getEasing","ease","Vector2D","set","setX","setY","getGradient","atan2","w","addVectors","addXY","sub","subVectors","divideScalar","negate","dot","lengthSq","normalize","distanceTo","distanceToSquared","tha","dx","dy","lerp","alpha","equals","Particle","data","rgb","PropUtil","getDirection","life","age","dead","sprite","energy","radius","rotation","easing","removeAllBehaviours","applyBehaviours","max","applyBehaviour","addBehaviour","behaviour","parents","initialize","addBehaviours","removeBehaviour","hexToRgb","h","hex16","substring","parseInt","rgbToHex","rbg","getHex16FromParticle","Number","Polar2D","abs","setR","setTha","toVector","getX","getY","Mat3","mat3","mat","Float32Array","mat1","mat2","multiply","inverse","multiplyVec2","m","vec","ArraySpan","_arr","createArraySpan","Rectangle","bottom","right","contains","Rate","numpan","timepan","numPan","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","getPosition","crossing","PointZone","console","error","Position","zone","Velocity","rpan","thapan","rPan","thaPan","normalizeVelocity","vr","polar2d","Mass","massPan","Radius","oldRadius","Body","imageTarget","inner","Behaviour","normalizeForce","force","normalizeValue","Force","fx","fy","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","delay","panFoce","Gravity","Collision","newPool","collisionPool","delta","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","influence","rotationA","rotationB","Color","colorA","ColorUtil","colorB","CHANGING","Cyclone","angle","setAngleAndForce","span","String","toLowerCase","cangle","cyclone","gradient","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","Emitter","emitTime","totalTime","rate","emit","stoped","isNaN","stop","preEmit","oldStoped","oldEmitTime","oldTotalTime","step","removeAllParticles","addSelfInitialize","addInitialize","rest","removeInitialize","initializer","removeAllInitializers","arguments","emitting","integrate","dispatch","event","bindEvent","createParticle","setupParticle","InitializeUtil","PIXIClass","BehaviourEmitter","selfBehaviours","addSelfBehaviour","removeSelfBehaviour","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","_Emitter","__isImage","tagName","nodeName","BaseRenderer","element","stroke","circleConf","isCircle","setStroke","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","Types","drawCircle","buffer","createBuffer","bufContext","globalAlpha","globalCompositeOperation","fillStyle","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","bodyReady","backgroundColor","createCircle","createSprite","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","PixiRenderer","setColor","blendMode","setPIXI","PIXI","Sprite","createFromImage","from","fromImage","tint","anchor","endFill","MStack","mats","top","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","getVertexShader","getFragmentShader","texturebuffers","A","B","getShader","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","vertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","drawImg2Canvas","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","updateMatrix","uniform3f","uniformMatrix3fv","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","CustomRenderer","LineZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","xxyy","getLength","getDistance","getSymmetric","tha2","oldx","oldy","rangeOut","CircleZone","randomRadius","setCenter","d","RectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","getColor","func","getStyle","drawZone","moveTo","lineTo","drawRect","drawEmitter","Vector","Polar","getSpan","Init","L","P","V","M","R","F","RD","G","S","WebGlRenderer","Debug"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 13baf41..ac09449 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proton-engine", - "version": "5.4.5", + "version": "6.0.1", "description": "Proton is a simple and powerful javascript particle animation engine.", "keywords": [ "particle", @@ -23,7 +23,7 @@ "url": "https://github.com/drawcall/Proton.git" }, "authors": [ - "anonymous namespace " + "drawcall " ], "license": "MIT", "bugs": { diff --git a/src/emitter/Emitter.js b/src/emitter/Emitter.js index 9fa649b..2b94fb9 100755 --- a/src/emitter/Emitter.js +++ b/src/emitter/Emitter.js @@ -75,7 +75,6 @@ export default class Emitter extends Particle { } else if (!isNaN(life)) { this.life = life; } - this.rate.init(); } @@ -244,7 +243,11 @@ export default class Emitter extends Particle { } emitting(time) { - if (this.totalTime === "once") { + if (this.stoped) return; + + if (this.totalTime === "none") { + this.emitTime += time; + } else if (this.totalTime === "once") { let i; const length = this.rate.getValue(99999); diff --git a/src/render/EaselRenderer.js b/src/render/EaselRenderer.js index 85802c1..4f550c2 100755 --- a/src/render/EaselRenderer.js +++ b/src/render/EaselRenderer.js @@ -52,7 +52,7 @@ export default class EaselRenderer extends BaseRenderer { } createCircle(particle) { - const graphics = this.pool.get(createjs.Graphics); + const graphics = this.pool.get(window.createjs.Graphics); if (this.stroke) { if (Types.isString(this.stroke)) { @@ -62,7 +62,7 @@ export default class EaselRenderer extends BaseRenderer { } } graphics.beginFill(particle.color || "#ff0000").drawCircle(0, 0, particle.radius); - const shape = this.pool.get(createjs.Shape, [graphics]); + const shape = this.pool.get(window.createjs.Shape, [graphics]); particle.body = shape; particle.graphics = graphics; diff --git a/src/utils/PropUtil.js b/src/utils/PropUtil.js index 8f66078..3db351c 100644 --- a/src/utils/PropUtil.js +++ b/src/utils/PropUtil.js @@ -1,3 +1,5 @@ +import Span from "../math/Span"; + export default { hasProp(target, key) { if (!target) return false;