collider2d
Version:
A 2D collision checker for modern JavaScript games.
347 lines (312 loc) • 23.3 kB
JavaScript
'use strict';
/**
* Represents a vector in two dimensions with `x` and `y` properties.
*
* Create a new Vector, optionally passing in the `x` and `y` coordinates. If a coordinate is not specified, it will be set to `0`.
*/
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var Vector = /*#__PURE__*/function () {
/**
* The x coordinate of this vector.
*
* @private
*
* @property {number}
*/
/**
* The y coordinate of this vector.
*
* @private
*
* @property {number}
*/
/**
* @param {number} [x=0] The x coordinate of this vector.
* @param {number} [y=0] The y coordinate of this vector.
*/
function Vector() {
var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
_classCallCheck(this, Vector);
_defineProperty(this, "_x", 0);
_defineProperty(this, "_y", 0);
this._x = x;
this._y = y;
}
/**
* Returns the x value of this vector.
*
* @returns {number}
*/
_createClass(Vector, [{
key: "x",
get: function get() {
return this._x;
}
/**
* Returns the y value of this vector.
*
* @returns {number}
*/
,
set:
/**
* Sets a new x value for this vector.
*
* @param {number} x The new x value for this vector.
*/
function set(x) {
this._x = x;
}
/**
* Sets a new y value for this vector.
*
* @param {number} y The new y value for this vector.
*/
}, {
key: "y",
get: function get() {
return this._y;
},
set: function set(y) {
this._y = y;
}
/**
* Copy the values of another Vector into this one.
*
* @param {Vector} other The other Vector.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "copy",
value: function copy(other) {
this._x = other.x;
this._y = other.y;
return this;
}
/**
* Create a new Vector with the same coordinates as the one.
*
* @returns {Vector} The new cloned Vector.
*/
}, {
key: "clone",
value: function clone() {
return new Vector(this.x, this.y);
}
/**
* Change this Vector to be perpendicular to what it was before.
*
* Effectively this rotates it 90 degrees in a clockwise direction.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "perp",
value: function perp() {
var x = this.x;
this._x = this.y;
this._y = -x;
return this;
}
/**
* Rotate this Vector (counter-clockwise) by the specified angle (in radians).
*
* @param {number} angle The angle to rotate (in radians).
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "rotate",
value: function rotate(angle) {
var x = this.x;
var y = this.y;
this._x = x * Math.cos(angle) - y * Math.sin(angle);
this._y = x * Math.sin(angle) + y * Math.cos(angle);
return this;
}
/**
* Reverse this Vector.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "reverse",
value: function reverse() {
this._x = -this.x;
this._y = -this.y;
return this;
}
/**
* Normalize this vector (make it have a length of `1`).
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "normalize",
value: function normalize() {
var d = this.len();
if (d > 0) {
this._x = this.x / d;
this._y = this.y / d;
}
return this;
}
/**
* Add another Vector to this one.
*
* @param {Vector} other The other Vector.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "add",
value: function add(other) {
this._x += other.x;
this._y += other.y;
return this;
}
/**
* Subtract another Vector from this one.
*
* @param {Vector} other The other Vector.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "sub",
value: function sub(other) {
this._x -= other.x;
this._y -= other.y;
return this;
}
/**
* Scale this Vector.
*
* An independent scaling factor can be provided for each axis, or a single scaling factor will scale both `x` and `y`.
*
* @param {number} x The scaling factor in the x direction.
* @param {number} [y] The scaling factor in the y direction.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "scale",
value: function scale(x, y) {
this._x *= x;
this._y *= typeof y != 'undefined' ? y : x;
return this;
}
/**
* Project this Vector onto another Vector.
*
* @param {Vector} other The Vector to project onto.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "project",
value: function project(other) {
var amt = this.dot(other) / other.len2();
this._x = amt * other.x;
this._y = amt * other.y;
return this;
}
/**
* Project this Vector onto a Vector of unit length.
*
* This is slightly more efficient than `project` when dealing with unit vectors.
*
* @param {Vector} other The unit vector to project onto.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "projectN",
value: function projectN(other) {
var amt = this.dot(other);
this._x = amt * other.x;
this._y = amt * other.y;
return this;
}
/**
* Reflect this Vector on an arbitrary axis.
*
* @param {Vector} axis The Vector representing the axis.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "reflect",
value: function reflect(axis) {
var x = this.x;
var y = this.y;
this.project(axis).scale(2);
this._x -= x;
this._y -= y;
return this;
}
/**
* Reflect this Vector on an arbitrary axis.
*
* This is slightly more efficient than `reflect` when dealing with an axis that is a unit vector.
*
* @param {Vector} axis The Vector representing the axis.
*
* @returns {Vector} Returns this for chaining.
*/
}, {
key: "reflectN",
value: function reflectN(axis) {
var x = this.x;
var y = this.y;
this.projectN(axis).scale(2);
this._x -= x;
this._y -= y;
return this;
}
/**
* Get the dot product of this Vector and another.
*
* @param {Vector} other The Vector to dot this one against.
*
* @returns {number} Returns the dot product of this vector.
*/
}, {
key: "dot",
value: function dot(other) {
return this.x * other.x + this.y * other.y;
}
/**
* Get the squared length of this Vector.
*
* @returns {number} Returns the squared length of this vector.
*/
}, {
key: "len2",
value: function len2() {
return this.dot(this);
}
/**
* Get the length of this Vector.
*
* @returns {number} Returns the length of this vector.
*/
}, {
key: "len",
value: function len() {
return Math.sqrt(this.len2());
}
}]);
return Vector;
}();
exports["default"] = Vector;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW9tZXRyeS92ZWN0b3IudHMiXSwibmFtZXMiOlsiVmVjdG9yIiwieCIsInkiLCJfeCIsIl95Iiwib3RoZXIiLCJhbmdsZSIsIk1hdGgiLCJjb3MiLCJzaW4iLCJkIiwibGVuIiwiYW10IiwiZG90IiwibGVuMiIsImF4aXMiLCJwcm9qZWN0Iiwic2NhbGUiLCJwcm9qZWN0TiIsInNxcnQiXSwibWFwcGluZ3MiOiJBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0lBQ3FCQSxNO0FBQ25CO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0Usb0JBQTBDO0FBQUEsUUFBOUJDLENBQThCLHVFQUFsQixDQUFrQjtBQUFBLFFBQWZDLENBQWUsdUVBQUgsQ0FBRzs7QUFBQTs7QUFBQSxnQ0FmckIsQ0FlcUI7O0FBQUEsZ0NBTnJCLENBTXFCOztBQUN4QyxTQUFLQyxFQUFMLEdBQVVGLENBQVY7QUFFQSxTQUFLRyxFQUFMLEdBQVVGLENBQVY7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O1NBQ0UsZUFBZ0I7QUFBRSxhQUFPLEtBQUtDLEVBQVo7QUFBaUI7QUFFbkM7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNFLGlCQUFNRixDQUFOLEVBQWlCO0FBQUUsV0FBS0UsRUFBTCxHQUFVRixDQUFWO0FBQWM7QUFFakM7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztTQWJFLGVBQWdCO0FBQUUsYUFBTyxLQUFLRyxFQUFaO0FBQWlCLEs7U0FjbkMsYUFBTUYsQ0FBTixFQUFpQjtBQUFFLFdBQUtFLEVBQUwsR0FBVUYsQ0FBVjtBQUFjO0FBRWpDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsY0FBS0csS0FBTCxFQUE0QjtBQUMxQixX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QjtBQUN6QixhQUFPLEtBQUtKLENBQUwsR0FBU0ksS0FBSyxDQUFDSixDQUFmLEdBQW1CLEtBQUtDLENBQUwsR0FBU0csS0FBSyxDQUFDSCxDQUF6QztBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLGdCQUFlO0FBQ2IsYUFBTyxLQUFLVyxHQUFMLENBQVMsSUFBVCxDQUFQO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsZUFBYztBQUNaLGFBQU9OLElBQUksQ0FBQ1ksSUFBTCxDQUFVLEtBQUtMLElBQUwsRUFBVixDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgdmVjdG9yIGluIHR3byBkaW1lbnNpb25zIHdpdGggYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICogXHJcbiAqIENyZWF0ZSBhIG5ldyBWZWN0b3IsIG9wdGlvbmFsbHkgcGFzc2luZyBpbiB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMuIElmIGEgY29vcmRpbmF0ZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHNldCB0byBgMGAuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWN0b3Ige1xyXG4gIC8qKlxyXG4gICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICogXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBcclxuICAgKiBAcHJvcGVydHkge251bWJlcn1cclxuICAgKi9cclxuICBwcml2YXRlIF94OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAqIFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogXHJcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfeTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhpcyB2ZWN0b3IuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoeDogbnVtYmVyID0gMCwgeTogbnVtYmVyID0gMCkge1xyXG4gICAgdGhpcy5feCA9IHg7XHJcblxyXG4gICAgdGhpcy5feSA9IHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICovXHJcbiAgZ2V0IHgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3g7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldCB5KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95OyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBuZXcgeCB2YWx1ZSBmb3IgdGhpcyB2ZWN0b3IuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIG5ldyB4IHZhbHVlIGZvciB0aGlzIHZlY3Rvci5cclxuICAgKi9cclxuICBzZXQgeCh4OiBudW1iZXIpIHsgdGhpcy5feCA9IHg7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBhIG5ldyB5IHZhbHVlIGZvciB0aGlzIHZlY3Rvci5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgbmV3IHkgdmFsdWUgZm9yIHRoaXMgdmVjdG9yLlxyXG4gICAqL1xyXG4gIHNldCB5KHk6IG51bWJlcikgeyB0aGlzLl95ID0geTsgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYW5vdGhlciBWZWN0b3IgaW50byB0aGlzIG9uZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1ZlY3Rvcn0gb3RoZXIgVGhlIG90aGVyIFZlY3Rvci5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7VmVjdG9yfSBSZXR1cm5zIHRoaXMgZm9yIGNoYWluaW5nLlxyXG4gICAqL1xyXG4gIGNvcHkob3RoZXI6IFZlY3Rvcik6IFZlY3RvciB7XHJcbiAgICB0aGlzLl94ID0gb3RoZXIueDtcclxuICAgIHRoaXMuX3kgPSBvdGhlci55O1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IFZlY3RvciB3aXRoIHRoZSBzYW1lIGNvb3JkaW5hdGVzIGFzIHRoZSBvbmUuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1ZlY3Rvcn0gVGhlIG5ldyBjbG9uZWQgVmVjdG9yLlxyXG4gICAqL1xyXG4gIGNsb25lKCk6IFZlY3RvciB7XHJcbiAgICByZXR1cm4gbmV3IFZlY3Rvcih0aGlzLngsIHRoaXMueSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgdGhpcyBWZWN0b3IgdG8gYmUgcGVycGVuZGljdWxhciB0byB3aGF0IGl0IHdhcyBiZWZvcmUuXHJcbiAgICogXHJcbiAgICogRWZmZWN0aXZlbHkgdGhpcyByb3RhdGVzIGl0IDkwIGRlZ3JlZXMgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtWZWN0b3J9IFJldHVybnMgdGhpcyBmb3IgY2hhaW5pbmcuXHJcbiAgICovXHJcbiAgcGVycCgpOiBWZWN0b3Ige1xyXG4gICAgY29uc3QgeDogbnVtYmVyID0gdGhpcy54O1xyXG5cclxuICAgIHRoaXMuX3ggPSB0aGlzLnk7XHJcbiAgICB0aGlzLl95ID0gLXg7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSb3RhdGUgdGhpcyBWZWN0b3IgKGNvdW50ZXItY2xvY2t3aXNlKSBieSB0aGUgc3BlY2lmaWVkIGFuZ2xlIChpbiByYWRpYW5zKS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgVGhlIGFuZ2xlIHRvIHJvdGF0ZSAoaW4gcmFkaWFucykuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1ZlY3Rvcn0gUmV0dXJucyB0aGlzIGZvciBjaGFpbmluZy5cclxuICAgKi9cclxuICByb3RhdGUoYW5nbGU6IG51bWJlcik6IFZlY3RvciB7XHJcbiAgICBjb25zdCB4OiBudW1iZXIgPSB0aGlzLng7XHJcbiAgICBjb25zdCB5OiBudW1iZXIgPSB0aGlzLnk7XHJcblxyXG4gICAgdGhpcy5feCA9IHggKiBNYXRoLmNvcyhhbmdsZSkgLSB5ICogTWF0aC5zaW4oYW5nbGUpO1xyXG4gICAgdGhpcy5feSA9IHggKiBNYXRoLnNpbihhbmdsZSkgKyB5ICogTWF0aC5jb3MoYW5nbGUpO1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV2ZXJzZSB0aGlzIFZlY3Rvci5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7VmVjdG9yfSBSZXR1cm5zIHRoaXMgZm9yIGNoYWluaW5nLlxyXG4gICAqL1xyXG4gIHJldmVyc2UoKTogVmVjdG9yIHtcclxuICAgIHRoaXMuX3ggPSAtdGhpcy54O1xyXG4gICAgdGhpcy5feSA9IC10aGlzLnk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOb3JtYWxpemUgdGhpcyB2ZWN0b3IgKG1ha2UgaXQgaGF2ZSBhIGxlbmd0aCBvZiBgMWApLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtWZWN0b3J9IFJldHVybnMgdGhpcyBmb3IgY2hhaW5pbmcuXHJcbiAgICovXHJcbiAgbm9ybWFsaXplKCk6IFZlY3RvciB7XHJcbiAgICBjb25zdCBkOiBudW1iZXIgPSB0aGlzLmxlbigpO1xyXG5cclxuICAgIGlmIChkID4gMCkge1xyXG4gICAgICB0aGlzLl94ID0gdGhpcy54IC8gZDtcclxuICAgICAgdGhpcy5feSA9IHRoaXMueSAvIGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYW5vdGhlciBWZWN0b3IgdG8gdGhpcyBvbmUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3J9IG90aGVyIFRoZSBvdGhlciBWZWN0b3IuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1ZlY3Rvcn0gUmV0dXJucyB0aGlzIGZvciBjaGFpbmluZy5cclxuICAgKi9cclxuICBhZGQob3RoZXI6IFZlY3Rvcik6IFZlY3RvciB7XHJcbiAgICB0aGlzLl94ICs9IG90aGVyLng7XHJcbiAgICB0aGlzLl95ICs9IG90aGVyLnk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdWJ0cmFjdCBhbm90aGVyIFZlY3RvciBmcm9tIHRoaXMgb25lLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VmVjdG9yfSBvdGhlciBUaGUgb3RoZXIgVmVjdG9yLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtWZWN0b3J9IFJldHVybnMgdGhpcyBmb3IgY2hhaW5pbmcuXHJcbiAgICovXHJcbiAgc3ViKG90aGVyOiBWZWN0b3IpOiBWZWN0b3Ige1xyXG4gICAgdGhpcy5feCAtPSBvdGhlci54O1xyXG4gICAgdGhpcy5feSAtPSBvdGhlci55O1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NhbGUgdGhpcyBWZWN0b3IuXHJcbiAgICogXHJcbiAgICogQW4gaW5kZXBlbmRlbnQgc2NhbGluZyBmYWN0b3IgY2FuIGJlIHByb3ZpZGVkIGZvciBlYWNoIGF4aXMsIG9yIGEgc2luZ2xlIHNjYWxpbmcgZmFjdG9yIHdpbGwgc2NhbGUgYm90aCBgeGAgYW5kIGB5YC5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gVGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7VmVjdG9yfSBSZXR1cm5zIHRoaXMgZm9yIGNoYWluaW5nLlxyXG4gICAqL1xyXG4gIHNjYWxlKHg6IG51bWJlciwgeT86IG51bWJlcik6IFZlY3RvciB7XHJcbiAgICB0aGlzLl94ICo9IHg7XHJcbiAgICB0aGlzLl95ICo9IHR5cGVvZiB5ICE9ICd1bmRlZmluZWQnID8geSA6IHg7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9qZWN0IHRoaXMgVmVjdG9yIG9udG8gYW5vdGhlciBWZWN0b3IuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3J9IG90aGVyIFRoZSBWZWN0b3IgdG8gcHJvamVjdCBvbnRvLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtWZWN0b3J9IFJldHVybnMgdGhpcyBmb3IgY2hhaW5pbmcuXHJcbiAgICovXHJcbiAgcHJvamVjdChvdGhlcjogVmVjdG9yKTogVmVjdG9yIHtcclxuICAgIGNvbnN0IGFtdDogbnVtYmVyID0gdGhpcy5kb3Qob3RoZXIpIC8gb3RoZXIubGVuMigpO1xyXG5cclxuICAgIHRoaXMuX3ggPSBhbXQgKiBvdGhlci54O1xyXG4gICAgdGhpcy5feSA9IGFtdCAqIG90aGVyLnk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9qZWN0IHRoaXMgVmVjdG9yIG9udG8gYSBWZWN0b3Igb2YgdW5pdCBsZW5ndGguXHJcbiAgICogXHJcbiAgICogVGhpcyBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIGBwcm9qZWN0YCB3aGVuIGRlYWxpbmcgd2l0aCB1bml0IHZlY3RvcnMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3J9IG90aGVyIFRoZSB1bml0IHZlY3RvciB0byBwcm9qZWN0IG9udG8uXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1ZlY3Rvcn0gUmV0dXJucyB0aGlzIGZvciBjaGFpbmluZy5cclxuICAgKi9cclxuICBwcm9qZWN0TihvdGhlcjogVmVjdG9yKTogVmVjdG9yIHtcclxuICAgIGNvbnN0IGFtdDogbnVtYmVyID0gdGhpcy5kb3Qob3RoZXIpO1xyXG5cclxuICAgIHRoaXMuX3ggPSBhbXQgKiBvdGhlci54O1xyXG4gICAgdGhpcy5feSA9IGFtdCAqIG90aGVyLnk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWZsZWN0IHRoaXMgVmVjdG9yIG9uIGFuIGFyYml0cmFyeSBheGlzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VmVjdG9yfSBheGlzIFRoZSBWZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBheGlzLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtWZWN0b3J9IFJldHVybnMgdGhpcyBmb3IgY2hhaW5pbmcuXHJcbiAgICovXHJcbiAgcmVmbGVjdChheGlzOiBWZWN0b3IpOiBWZWN0b3Ige1xyXG4gICAgY29uc3QgeDogbnVtYmVyID0gdGhpcy54O1xyXG4gICAgY29uc3QgeTogbnVtYmVyID0gdGhpcy55O1xyXG5cclxuICAgIHRoaXMucHJvamVjdChheGlzKS5zY2FsZSgyKTtcclxuXHJcbiAgICB0aGlzLl94IC09IHg7XHJcbiAgICB0aGlzLl95IC09IHk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWZsZWN0IHRoaXMgVmVjdG9yIG9uIGFuIGFyYml0cmFyeSBheGlzLlxyXG4gICAqIFxyXG4gICAqIFRoaXMgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdGhhbiBgcmVmbGVjdGAgd2hlbiBkZWFsaW5nIHdpdGggYW4gYXhpcyB0aGF0IGlzIGEgdW5pdCB2ZWN0b3IuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtWZWN0b3J9IGF4aXMgVGhlIFZlY3RvciByZXByZXNlbnRpbmcgdGhlIGF4aXMuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1ZlY3Rvcn0gUmV0dXJucyB0aGlzIGZvciBjaGFpbmluZy5cclxuICAgKi9cclxuICByZWZsZWN0TihheGlzOiBWZWN0b3IpOiBWZWN0b3Ige1xyXG4gICAgY29uc3QgeDogbnVtYmVyID0gdGhpcy54O1xyXG4gICAgY29uc3QgeTogbnVtYmVyID0gdGhpcy55O1xyXG5cclxuICAgIHRoaXMucHJvamVjdE4oYXhpcykuc2NhbGUoMik7XHJcblxyXG4gICAgdGhpcy5feCAtPSB4O1xyXG4gICAgdGhpcy5feSAtPSB5O1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIFZlY3RvciBhbmQgYW5vdGhlci5cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1ZlY3Rvcn0gb3RoZXIgVGhlIFZlY3RvciB0byBkb3QgdGhpcyBvbmUgYWdhaW5zdC5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIHZlY3Rvci5cclxuICAgKi9cclxuICBkb3Qob3RoZXI6IFZlY3Rvcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy54ICogb3RoZXIueCArIHRoaXMueSAqIG90aGVyLnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG4gICAqL1xyXG4gIGxlbjIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRvdCh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuICAgKi9cclxuICBsZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5sZW4yKCkpO1xyXG4gIH1cclxufSJdfQ==