UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

371 lines 35 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * Spine Runtimes License Agreement * Last updated May 1, 2019. Replaces all prior versions. * * Copyright (c) 2013-2019, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Pool } from "../core/Utils"; var Input = /** @class */ (function () { function Input(element) { this.lastX = 0; this.lastY = 0; this.buttonDown = false; this.currTouch = null; this.touchesPool = new Pool((/** * @return {?} */ function () { return new Touch(0, 0, 0); })); this.listeners = new Array(); this.element = element; this.setupCallbacks(element); } /** * @private * @param {?} element * @return {?} */ Input.prototype.setupCallbacks = /** * @private * @param {?} element * @return {?} */ function (element) { var _this = this; /** @type {?} */ var mouseDown = (/** * @param {?} ev * @return {?} */ function (ev) { if (ev instanceof MouseEvent) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = ev.clientX - rect.left; /** @type {?} */ var y = ev.clientY - rect.top; /** @type {?} */ var listeners = _this.listeners; for (var i = 0; i < listeners.length; i++) { listeners[i].down(x, y); } _this.lastX = x; _this.lastY = y; _this.buttonDown = true; document.addEventListener("mousemove", mouseMove); document.addEventListener("mouseup", mouseUp); } }); /** @type {?} */ var mouseMove = (/** * @param {?} ev * @return {?} */ function (ev) { if (ev instanceof MouseEvent) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = ev.clientX - rect.left; /** @type {?} */ var y = ev.clientY - rect.top; /** @type {?} */ var listeners = _this.listeners; for (var i = 0; i < listeners.length; i++) { if (_this.buttonDown) { listeners[i].dragged(x, y); } else { listeners[i].moved(x, y); } } _this.lastX = x; _this.lastY = y; } }); /** @type {?} */ var mouseUp = (/** * @param {?} ev * @return {?} */ function (ev) { if (ev instanceof MouseEvent) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = ev.clientX - rect.left; /** @type {?} */ var y = ev.clientY - rect.top; /** @type {?} */ var listeners = _this.listeners; for (var i = 0; i < listeners.length; i++) { listeners[i].up(x, y); } _this.lastX = x; _this.lastY = y; _this.buttonDown = false; document.removeEventListener("mousemove", mouseMove); document.removeEventListener("mouseup", mouseUp); } }); element.addEventListener("mousedown", mouseDown, true); element.addEventListener("mousemove", mouseMove, true); element.addEventListener("mouseup", mouseUp, true); element.addEventListener("touchstart", (/** * @param {?} ev * @return {?} */ function (ev) { if (_this.currTouch != null) return; /** @type {?} */ var touches = ev.changedTouches; for (var i = 0; i < touches.length; i++) { /** @type {?} */ var touch = touches[i]; /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = touch.clientX - rect.left; /** @type {?} */ var y = touch.clientY - rect.top; _this.currTouch = _this.touchesPool.obtain(); _this.currTouch.identifier = touch.identifier; _this.currTouch.x = x; _this.currTouch.y = y; break; } /** @type {?} */ var listeners = _this.listeners; for (var i_1 = 0; i_1 < listeners.length; i_1++) { listeners[i_1].down(_this.currTouch.x, _this.currTouch.y); } console.log("Start " + _this.currTouch.x + ", " + _this.currTouch.y); _this.lastX = _this.currTouch.x; _this.lastY = _this.currTouch.y; _this.buttonDown = true; ev.preventDefault(); }), false); element.addEventListener("touchend", (/** * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var touches = ev.changedTouches; for (var i = 0; i < touches.length; i++) { /** @type {?} */ var touch = touches[i]; if (_this.currTouch.identifier === touch.identifier) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = (_this.currTouch.x = touch.clientX - rect.left); /** @type {?} */ var y = (_this.currTouch.y = touch.clientY - rect.top); _this.touchesPool.free(_this.currTouch); /** @type {?} */ var listeners = _this.listeners; for (var i_2 = 0; i_2 < listeners.length; i_2++) { listeners[i_2].up(x, y); } console.log("End " + x + ", " + y); _this.lastX = x; _this.lastY = y; _this.buttonDown = false; _this.currTouch = null; break; } } ev.preventDefault(); }), false); element.addEventListener("touchcancel", (/** * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var touches = ev.changedTouches; for (var i = 0; i < touches.length; i++) { /** @type {?} */ var touch = touches[i]; if (_this.currTouch.identifier === touch.identifier) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = (_this.currTouch.x = touch.clientX - rect.left); /** @type {?} */ var y = (_this.currTouch.y = touch.clientY - rect.top); _this.touchesPool.free(_this.currTouch); /** @type {?} */ var listeners = _this.listeners; for (var i_3 = 0; i_3 < listeners.length; i_3++) { listeners[i_3].up(x, y); } console.log("End " + x + ", " + y); _this.lastX = x; _this.lastY = y; _this.buttonDown = false; _this.currTouch = null; break; } } ev.preventDefault(); }), false); element.addEventListener("touchmove", (/** * @param {?} ev * @return {?} */ function (ev) { if (_this.currTouch == null) return; /** @type {?} */ var touches = ev.changedTouches; for (var i = 0; i < touches.length; i++) { /** @type {?} */ var touch = touches[i]; if (_this.currTouch.identifier === touch.identifier) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var x = touch.clientX - rect.left; /** @type {?} */ var y = touch.clientY - rect.top; /** @type {?} */ var listeners = _this.listeners; for (var i_4 = 0; i_4 < listeners.length; i_4++) { listeners[i_4].dragged(x, y); } console.log("Drag " + x + ", " + y); _this.lastX = _this.currTouch.x = x; _this.lastY = _this.currTouch.y = y; break; } } ev.preventDefault(); }), false); }; /** * @param {?} listener * @return {?} */ Input.prototype.addListener = /** * @param {?} listener * @return {?} */ function (listener) { this.listeners.push(listener); }; /** * @param {?} listener * @return {?} */ Input.prototype.removeListener = /** * @param {?} listener * @return {?} */ function (listener) { /** @type {?} */ var idx = this.listeners.indexOf(listener); if (idx > -1) { this.listeners.splice(idx, 1); } }; return Input; }()); export { Input }; if (false) { /** @type {?} */ Input.prototype.element; /** @type {?} */ Input.prototype.lastX; /** @type {?} */ Input.prototype.lastY; /** @type {?} */ Input.prototype.buttonDown; /** @type {?} */ Input.prototype.currTouch; /** @type {?} */ Input.prototype.touchesPool; /** * @type {?} * @private */ Input.prototype.listeners; } var Touch = /** @class */ (function () { function Touch(identifier, x, y) { this.identifier = identifier; this.x = x; this.y = y; } return Touch; }()); export { Touch }; if (false) { /** @type {?} */ Touch.prototype.identifier; /** @type {?} */ Touch.prototype.x; /** @type {?} */ Touch.prototype.y; } /** * @record */ export function InputListener() { } if (false) { /** * @param {?} x * @param {?} y * @return {?} */ InputListener.prototype.down = function (x, y) { }; /** * @param {?} x * @param {?} y * @return {?} */ InputListener.prototype.up = function (x, y) { }; /** * @param {?} x * @param {?} y * @return {?} */ InputListener.prototype.moved = function (x, y) { }; /** * @param {?} x * @param {?} y * @return {?} */ InputListener.prototype.dragged = function (x, y) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvd2ViZ2wvSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyQztJQVVFLGVBQVksT0FBb0I7UUFSaEMsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGNBQVMsR0FBVSxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLElBQUk7OztRQUFRO1lBQzVCLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUMsQ0FBQztRQUNLLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBaUIsQ0FBQztRQUU3QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7Ozs7OztJQUNPLDhCQUFjOzs7OztJQUF0QixVQUF1QixPQUFvQjtRQUEzQyxpQkFnS0M7O1lBL0pLLFNBQVM7Ozs7UUFBRyxVQUFDLEVBQVc7WUFDMUIsSUFBSSxFQUFFLFlBQVksVUFBVSxFQUFFOztvQkFDeEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTs7b0JBQ3RDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJOztvQkFDMUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUc7O29CQUN6QixTQUFTLEdBQUcsS0FBSSxDQUFDLFNBQVM7Z0JBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FB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QXdMQzs7OztJQXZMQyx3QkFBcUI7O0lBQ3JCLHNCQUFVOztJQUNWLHNCQUFVOztJQUNWLDJCQUFtQjs7SUFDbkIsMEJBQXdCOztJQUN4Qiw0QkFFRzs7Ozs7SUFDSCwwQkFBK0M7O0FBZ0xqRDtJQUNFLGVBQW1CLFVBQWtCLEVBQVMsQ0FBUyxFQUFTLENBQVM7UUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFTLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBUyxNQUFDLEdBQUQsQ0FBQyxDQUFRO0lBQUcsQ0FBQztJQUMvRSxZQUFDO0FBQUQsQ0FBQyxBQUZELElBRUM7Ozs7SUFEYSwyQkFBeUI7O0lBQUUsa0JBQWdCOztJQUFFLGtCQUFnQjs7Ozs7QUFFM0UsbUNBS0M7Ozs7Ozs7SUFKQyxtREFBaUM7Ozs7OztJQUNqQyxpREFBK0I7Ozs7OztJQUMvQixvREFBa0M7Ozs7OztJQUNsQyxzREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IFBvb2wgfSBmcm9tIFwiLi4vY29yZS9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0IHtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBsYXN0WCA9IDA7XHJcbiAgbGFzdFkgPSAwO1xyXG4gIGJ1dHRvbkRvd24gPSBmYWxzZTtcclxuICBjdXJyVG91Y2g6IFRvdWNoID0gbnVsbDtcclxuICB0b3VjaGVzUG9vbCA9IG5ldyBQb29sPFRvdWNoPigoKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFRvdWNoKDAsIDAsIDApO1xyXG4gIH0pO1xyXG4gIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IEFycmF5PElucHV0TGlzdGVuZXI+KCk7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldHVwQ2FsbGJhY2tzKGVsZW1lbnQpO1xyXG4gIH1cclxuICBwcml2YXRlIHNldHVwQ2FsbGJhY2tzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgbW91c2VEb3duID0gKGV2OiBVSUV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldiBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBsZXQgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgbGV0IHggPSBldi5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgICAgIGxldCB5ID0gZXYuY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmRvd24oeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRG93biA9IHRydWU7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG1vdXNlVXApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgbGV0IG1vdXNlTW92ZSA9IChldjogVUlFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXYgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGxldCB4ID0gZXYuY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICBsZXQgeSA9IGV2LmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgICAgICBsZXQgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLmJ1dHRvbkRvd24pIHtcclxuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmRyYWdnZWQoeCwgeSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0ubW92ZWQoeCwgeSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgbGV0IG1vdXNlVXAgPSAoZXY6IFVJRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBsZXQgeCA9IGV2LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgbGV0IHkgPSBldi5jbGllbnRZIC0gcmVjdC50b3A7XHJcbiAgICAgICAgbGV0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsaXN0ZW5lcnNbaV0udXAoeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRG93biA9IGZhbHNlO1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW91c2VNb3ZlKTtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBtb3VzZVVwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBtb3VzZURvd24sIHRydWUpO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdXNlTW92ZSwgdHJ1ZSk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG1vdXNlVXAsIHRydWUpO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcInRvdWNoc3RhcnRcIixcclxuICAgICAgKGV2OiBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyclRvdWNoICE9IG51bGwpIHJldHVybjtcclxuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcclxuICAgICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgIGxldCB4ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICAgIGxldCB5ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgICAgdGhpcy5jdXJyVG91Y2ggPSB0aGlzLnRvdWNoZXNQb29sLm9idGFpbigpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyVG91Y2guaWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7XHJcbiAgICAgICAgICB0aGlzLmN1cnJUb3VjaC54ID0geDtcclxuICAgICAgICAgIHRoaXMuY3VyclRvdWNoLnkgPSB5O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmRvd24odGhpcy5jdXJyVG91Y2gueCwgdGhpcy5jdXJyVG91Y2gueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhcnQgXCIgKyB0aGlzLmN1cnJUb3VjaC54ICsgXCIsIFwiICsgdGhpcy5jdXJyVG91Y2gueSk7XHJcbiAgICAgICAgdGhpcy5sYXN0WCA9IHRoaXMuY3VyclRvdWNoLng7XHJcbiAgICAgICAgdGhpcy5sYXN0WSA9IHRoaXMuY3VyclRvdWNoLnk7XHJcbiAgICAgICAgdGhpcy5idXR0b25Eb3duID0gdHJ1ZTtcclxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBmYWxzZVxyXG4gICAgKTtcclxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgXCJ0b3VjaGVuZFwiLFxyXG4gICAgICAoZXY6IFRvdWNoRXZlbnQpID0+IHtcclxuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJUb3VjaC5pZGVudGlmaWVyID09PSB0b3VjaC5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIGxldCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgbGV0IHggPSAodGhpcy5jdXJyVG91Y2gueCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQpO1xyXG4gICAgICAgICAgICBsZXQgeSA9ICh0aGlzLmN1cnJUb3VjaC55ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wKTtcclxuICAgICAgICAgICAgdGhpcy50b3VjaGVzUG9vbC5mcmVlKHRoaXMuY3VyclRvdWNoKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS51cCh4LCB5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVuZCBcIiArIHggKyBcIiwgXCIgKyB5KTtcclxuICAgICAgICAgICAgdGhpcy5sYXN0WCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFkgPSB5O1xyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkRvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyVG91Y2ggPSBudWxsO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSxcclxuICAgICAgZmFsc2VcclxuICAgICk7XHJcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgIFwidG91Y2hjYW5jZWxcIixcclxuICAgICAgKGV2OiBUb3VjaEV2ZW50KSA9PiB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldi5jaGFuZ2VkVG91Y2hlcztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHZhciB0b3VjaCA9IHRvdWNoZXNbaV07XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyVG91Y2guaWRlbnRpZmllciA9PT0gdG91Y2guaWRlbnRpZmllcikge1xyXG4gICAgICAgICAgICBsZXQgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGxldCB4ID0gKHRoaXMuY3VyclRvdWNoLnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgbGV0IHkgPSAodGhpcy5jdXJyVG91Y2gueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcCk7XHJcbiAgICAgICAgICAgIHRoaXMudG91Y2hlc1Bvb2wuZnJlZSh0aGlzLmN1cnJUb3VjaCk7XHJcbiAgICAgICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0udXAoeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbmQgXCIgKyB4ICsgXCIsIFwiICsgeSk7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFggPSB4O1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RZID0geTtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25Eb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyclRvdWNoID0gbnVsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZhbHNlXHJcbiAgICApO1xyXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcInRvdWNobW92ZVwiLFxyXG4gICAgICAoZXY6IFRvdWNoRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyVG91Y2ggPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciB0b3VjaGVzID0gZXYuY2hhbmdlZFRvdWNoZXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY3VyclRvdWNoLmlkZW50aWZpZXIgPT09IHRvdWNoLmlkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgbGV0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBsZXQgeCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgIGxldCB5ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgICAgICAgICBsZXQgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldLmRyYWdnZWQoeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJEcmFnIFwiICsgeCArIFwiLCBcIiArIHkpO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RYID0gdGhpcy5jdXJyVG91Y2gueCA9IHg7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFkgPSB0aGlzLmN1cnJUb3VjaC55ID0geTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZhbHNlXHJcbiAgICApO1xyXG4gIH1cclxuICBhZGRMaXN0ZW5lcihsaXN0ZW5lcjogSW5wdXRMaXN0ZW5lcikge1xyXG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XHJcbiAgfVxyXG4gIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyOiBJbnB1dExpc3RlbmVyKSB7XHJcbiAgICBsZXQgaWR4ID0gdGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBUb3VjaCB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIGlkZW50aWZpZXI6IG51bWJlciwgcHVibGljIHg6IG51bWJlciwgcHVibGljIHk6IG51bWJlcikge31cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElucHV0TGlzdGVuZXIge1xyXG4gIGRvd24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkO1xyXG4gIHVwKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZDtcclxuICBtb3ZlZCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XHJcbiAgZHJhZ2dlZCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQ7XHJcbn1cclxuIl19