UNPKG

ngx-spine

Version:

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

448 lines 48.6 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 { Vector2, MathUtils } from "./Utils"; export class TransformConstraint { /** * @param {?} data * @param {?} skeleton */ constructor(data, skeleton) { this.rotateMix = 0; this.translateMix = 0; this.scaleMix = 0; this.shearMix = 0; this.temp = new Vector2(); this.active = false; if (data == null) throw new Error("data cannot be null."); if (skeleton == null) throw new Error("skeleton cannot be null."); this.data = data; this.rotateMix = data.rotateMix; this.translateMix = data.translateMix; this.scaleMix = data.scaleMix; this.shearMix = data.shearMix; this.bones = new Array(); for (let i = 0; i < data.bones.length; i++) this.bones.push(skeleton.findBone(data.bones[i].name)); this.target = skeleton.findBone(data.target.name); } /** * @return {?} */ isActive() { return this.active; } /** * @return {?} */ apply() { this.update(); } /** * @return {?} */ update() { if (this.data.local) { if (this.data.relative) this.applyRelativeLocal(); else this.applyAbsoluteLocal(); } else { if (this.data.relative) this.applyRelativeWorld(); else this.applyAbsoluteWorld(); } } /** * @return {?} */ applyAbsoluteWorld() { /** @type {?} */ let rotateMix = this.rotateMix; /** @type {?} */ let translateMix = this.translateMix; /** @type {?} */ let scaleMix = this.scaleMix; /** @type {?} */ let shearMix = this.shearMix; /** @type {?} */ let target = this.target; /** @type {?} */ let ta = target.a; /** @type {?} */ let tb = target.b; /** @type {?} */ let tc = target.c; /** @type {?} */ let td = target.d; /** @type {?} */ let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; /** @type {?} */ let offsetRotation = this.data.offsetRotation * degRadReflect; /** @type {?} */ let offsetShearY = this.data.offsetShearY * degRadReflect; /** @type {?} */ let bones = this.bones; for (let i = 0, n = bones.length; i < n; i++) { /** @type {?} */ let bone = bones[i]; /** @type {?} */ let modified = false; if (rotateMix != 0) { /** @type {?} */ let a = bone.a; /** @type {?} */ let b = bone.b; /** @type {?} */ let c = bone.c; /** @type {?} */ let d = bone.d; /** @type {?} */ let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r *= rotateMix; /** @type {?} */ let cos = Math.cos(r); /** @type {?} */ let sin = Math.sin(r); bone.a = cos * a - sin * c; bone.b = cos * b - sin * d; bone.c = sin * a + cos * c; bone.d = sin * b + cos * d; modified = true; } if (translateMix != 0) { /** @type {?} */ let temp = this.temp; target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); bone.worldX += (temp.x - bone.worldX) * translateMix; bone.worldY += (temp.y - bone.worldY) * translateMix; modified = true; } if (scaleMix > 0) { /** @type {?} */ let s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); /** @type {?} */ let ts = Math.sqrt(ta * ta + tc * tc); if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s; bone.a *= s; bone.c *= s; s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); ts = Math.sqrt(tb * tb + td * td); if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s; bone.b *= s; bone.d *= s; modified = true; } if (shearMix > 0) { /** @type {?} */ let b = bone.b; /** @type {?} */ let d = bone.d; /** @type {?} */ let by = Math.atan2(d, b); /** @type {?} */ let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r = by + (r + offsetShearY) * shearMix; /** @type {?} */ let s = Math.sqrt(b * b + d * d); bone.b = Math.cos(r) * s; bone.d = Math.sin(r) * s; modified = true; } if (modified) bone.appliedValid = false; } } /** * @return {?} */ applyRelativeWorld() { /** @type {?} */ let rotateMix = this.rotateMix; /** @type {?} */ let translateMix = this.translateMix; /** @type {?} */ let scaleMix = this.scaleMix; /** @type {?} */ let shearMix = this.shearMix; /** @type {?} */ let target = this.target; /** @type {?} */ let ta = target.a; /** @type {?} */ let tb = target.b; /** @type {?} */ let tc = target.c; /** @type {?} */ let td = target.d; /** @type {?} */ let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad; /** @type {?} */ let offsetRotation = this.data.offsetRotation * degRadReflect; /** @type {?} */ let offsetShearY = this.data.offsetShearY * degRadReflect; /** @type {?} */ let bones = this.bones; for (let i = 0, n = bones.length; i < n; i++) { /** @type {?} */ let bone = bones[i]; /** @type {?} */ let modified = false; if (rotateMix != 0) { /** @type {?} */ let a = bone.a; /** @type {?} */ let b = bone.b; /** @type {?} */ let c = bone.c; /** @type {?} */ let d = bone.d; /** @type {?} */ let r = Math.atan2(tc, ta) + offsetRotation; if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; r *= rotateMix; /** @type {?} */ let cos = Math.cos(r); /** @type {?} */ let sin = Math.sin(r); bone.a = cos * a - sin * c; bone.b = cos * b - sin * d; bone.c = sin * a + cos * c; bone.d = sin * b + cos * d; modified = true; } if (translateMix != 0) { /** @type {?} */ let temp = this.temp; target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); bone.worldX += temp.x * translateMix; bone.worldY += temp.y * translateMix; modified = true; } if (scaleMix > 0) { /** @type {?} */ let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1; bone.a *= s; bone.c *= s; s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1; bone.b *= s; bone.d *= s; modified = true; } if (shearMix > 0) { /** @type {?} */ let r = Math.atan2(td, tb) - Math.atan2(tc, ta); if (r > MathUtils.PI) r -= MathUtils.PI2; else if (r < -MathUtils.PI) r += MathUtils.PI2; /** @type {?} */ let b = bone.b; /** @type {?} */ let d = bone.d; r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix; /** @type {?} */ let s = Math.sqrt(b * b + d * d); bone.b = Math.cos(r) * s; bone.d = Math.sin(r) * s; modified = true; } if (modified) bone.appliedValid = false; } } /** * @return {?} */ applyAbsoluteLocal() { /** @type {?} */ let rotateMix = this.rotateMix; /** @type {?} */ let translateMix = this.translateMix; /** @type {?} */ let scaleMix = this.scaleMix; /** @type {?} */ let shearMix = this.shearMix; /** @type {?} */ let target = this.target; if (!target.appliedValid) target.updateAppliedTransform(); /** @type {?} */ let bones = this.bones; for (let i = 0, n = bones.length; i < n; i++) { /** @type {?} */ let bone = bones[i]; if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ let rotation = bone.arotation; if (rotateMix != 0) { /** @type {?} */ let r = target.arotation - rotation + this.data.offsetRotation; r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; rotation += r * rotateMix; } /** @type {?} */ let x = bone.ax; /** @type {?} */ let y = bone.ay; if (translateMix != 0) { x += (target.ax - x + this.data.offsetX) * translateMix; y += (target.ay - y + this.data.offsetY) * translateMix; } /** @type {?} */ let scaleX = bone.ascaleX; /** @type {?} */ let scaleY = bone.ascaleY; if (scaleMix != 0) { if (scaleX > 0.00001) scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) / scaleX; if (scaleY > 0.00001) scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) / scaleY; } /** @type {?} */ let shearY = bone.ashearY; if (shearMix != 0) { /** @type {?} */ let r = target.ashearY - shearY + this.data.offsetShearY; r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; bone.shearY += r * shearMix; } bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); } } /** * @return {?} */ applyRelativeLocal() { /** @type {?} */ let rotateMix = this.rotateMix; /** @type {?} */ let translateMix = this.translateMix; /** @type {?} */ let scaleMix = this.scaleMix; /** @type {?} */ let shearMix = this.shearMix; /** @type {?} */ let target = this.target; if (!target.appliedValid) target.updateAppliedTransform(); /** @type {?} */ let bones = this.bones; for (let i = 0, n = bones.length; i < n; i++) { /** @type {?} */ let bone = bones[i]; if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ let rotation = bone.arotation; if (rotateMix != 0) rotation += (target.arotation + this.data.offsetRotation) * rotateMix; /** @type {?} */ let x = bone.ax; /** @type {?} */ let y = bone.ay; if (translateMix != 0) { x += (target.ax + this.data.offsetX) * translateMix; y += (target.ay + this.data.offsetY) * translateMix; } /** @type {?} */ let scaleX = bone.ascaleX; /** @type {?} */ let scaleY = bone.ascaleY; if (scaleMix != 0) { if (scaleX > 0.00001) scaleX *= (target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix + 1; if (scaleY > 0.00001) scaleY *= (target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix + 1; } /** @type {?} */ let shearY = bone.ashearY; if (shearMix != 0) shearY += (target.ashearY + this.data.offsetShearY) * shearMix; bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); } } } if (false) { /** @type {?} */ TransformConstraint.prototype.data; /** @type {?} */ TransformConstraint.prototype.bones; /** @type {?} */ TransformConstraint.prototype.target; /** @type {?} */ TransformConstraint.prototype.rotateMix; /** @type {?} */ TransformConstraint.prototype.translateMix; /** @type {?} */ TransformConstraint.prototype.scaleMix; /** @type {?} */ TransformConstraint.prototype.shearMix; /** @type {?} */ TransformConstraint.prototype.temp; /** @type {?} */ TransformConstraint.prototype.active; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtQ29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1RyYW5zZm9ybUNvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHN0MsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7SUFVOUIsWUFBWSxJQUE2QixFQUFFLFFBQWtCO1FBTjdELGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVEsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdB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SUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqRSxJQUFJLENBQUMsd0JBQXdCLENBQzNCLENBQUMsRUFDRCxDQUFDLEVBQ0QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxDQUFDLE9BQU8sRUFDWixNQUFNLENBQ1AsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGOzs7SUEzUkMsbUNBQThCOztJQUM5QixvQ0FBbUI7O0lBQ25CLHFDQUFhOztJQUNiLHdDQUFjOztJQUNkLDJDQUFpQjs7SUFDakIsdUNBQWE7O0lBQ2IsdUNBQWE7O0lBQ2IsbUNBQXFCOztJQUNyQixxQ0FBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlXCI7XHJcbmltcG9ydCB7IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludERhdGFcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuL0JvbmVcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiwgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tIFwiLi9Ta2VsZXRvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybUNvbnN0cmFpbnQgaW1wbGVtZW50cyBVcGRhdGFibGUge1xyXG4gIGRhdGE6IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhO1xyXG4gIGJvbmVzOiBBcnJheTxCb25lPjtcclxuICB0YXJnZXQ6IEJvbmU7XHJcbiAgcm90YXRlTWl4ID0gMDtcclxuICB0cmFuc2xhdGVNaXggPSAwO1xyXG4gIHNjYWxlTWl4ID0gMDtcclxuICBzaGVhck1peCA9IDA7XHJcbiAgdGVtcCA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgYWN0aXZlID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoZGF0YTogVHJhbnNmb3JtQ29uc3RyYWludERhdGEsIHNrZWxldG9uOiBTa2VsZXRvbikge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiZGF0YSBjYW5ub3QgYmUgbnVsbC5cIik7XHJcbiAgICBpZiAoc2tlbGV0b24gPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwic2tlbGV0b24gY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIHRoaXMucm90YXRlTWl4ID0gZGF0YS5yb3RhdGVNaXg7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZU1peCA9IGRhdGEudHJhbnNsYXRlTWl4O1xyXG4gICAgdGhpcy5zY2FsZU1peCA9IGRhdGEuc2NhbGVNaXg7XHJcbiAgICB0aGlzLnNoZWFyTWl4ID0gZGF0YS5zaGVhck1peDtcclxuICAgIHRoaXMuYm9uZXMgPSBuZXcgQXJyYXk8Qm9uZT4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmZpbmRCb25lKGRhdGEuYm9uZXNbaV0ubmFtZSkpO1xyXG4gICAgdGhpcy50YXJnZXQgPSBza2VsZXRvbi5maW5kQm9uZShkYXRhLnRhcmdldC5uYW1lKTtcclxuICB9XHJcbiAgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgfVxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5sb2NhbCkge1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnJlbGF0aXZlKSB0aGlzLmFwcGx5UmVsYXRpdmVMb2NhbCgpO1xyXG4gICAgICBlbHNlIHRoaXMuYXBwbHlBYnNvbHV0ZUxvY2FsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnJlbGF0aXZlKSB0aGlzLmFwcGx5UmVsYXRpdmVXb3JsZCgpO1xyXG4gICAgICBlbHNlIHRoaXMuYXBwbHlBYnNvbHV0ZVdvcmxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFwcGx5QWJzb2x1dGVXb3JsZCgpIHtcclxuICAgIGxldCByb3RhdGVNaXggPSB0aGlzLnJvdGF0ZU1peCxcclxuICAgICAgdHJhbnNsYXRlTWl4ID0gdGhpcy50cmFuc2xhdGVNaXgsXHJcbiAgICAgIHNjYWxlTWl4ID0gdGhpcy5zY2FsZU1peCxcclxuICAgICAgc2hlYXJNaXggPSB0aGlzLnNoZWFyTWl4O1xyXG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgbGV0IHRhID0gdGFyZ2V0LmEsXHJcbiAgICAgIHRiID0gdGFyZ2V0LmIsXHJcbiAgICAgIHRjID0gdGFyZ2V0LmMsXHJcbiAgICAgIHRkID0gdGFyZ2V0LmQ7XHJcbiAgICBsZXQgZGVnUmFkUmVmbGVjdCA9XHJcbiAgICAgIHRhICogdGQgLSB0YiAqIHRjID4gMCA/IE1hdGhVdGlscy5kZWdSYWQgOiAtTWF0aFV0aWxzLmRlZ1JhZDtcclxuICAgIGxldCBvZmZzZXRSb3RhdGlvbiA9IHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbiAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgb2Zmc2V0U2hlYXJZID0gdGhpcy5kYXRhLm9mZnNldFNoZWFyWSAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCBhID0gYm9uZS5hLFxyXG4gICAgICAgICAgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0YywgdGEpIC0gTWF0aC5hdGFuMihjLCBhKSArIG9mZnNldFJvdGF0aW9uO1xyXG4gICAgICAgIGlmIChyID4gTWF0aFV0aWxzLlBJKSByIC09IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgZWxzZSBpZiAociA8IC1NYXRoVXRpbHMuUEkpIHIgKz0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICByICo9IHJvdGF0ZU1peDtcclxuICAgICAgICBsZXQgY29zID0gTWF0aC5jb3MociksXHJcbiAgICAgICAgICBzaW4gPSBNYXRoLnNpbihyKTtcclxuICAgICAgICBib25lLmEgPSBjb3MgKiBhIC0gc2luICogYztcclxuICAgICAgICBib25lLmIgPSBjb3MgKiBiIC0gc2luICogZDtcclxuICAgICAgICBib25lLmMgPSBzaW4gKiBhICsgY29zICogYztcclxuICAgICAgICBib25lLmQgPSBzaW4gKiBiICsgY29zICogZDtcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSB0aGlzLnRlbXA7XHJcbiAgICAgICAgdGFyZ2V0LmxvY2FsVG9Xb3JsZCh0ZW1wLnNldCh0aGlzLmRhdGEub2Zmc2V0WCwgdGhpcy5kYXRhLm9mZnNldFkpKTtcclxuICAgICAgICBib25lLndvcmxkWCArPSAodGVtcC54IC0gYm9uZS53b3JsZFgpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIGJvbmUud29ybGRZICs9ICh0ZW1wLnkgLSBib25lLndvcmxkWSkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzY2FsZU1peCA+IDApIHtcclxuICAgICAgICBsZXQgcyA9IE1hdGguc3FydChib25lLmEgKiBib25lLmEgKyBib25lLmMgKiBib25lLmMpO1xyXG4gICAgICAgIGxldCB0cyA9IE1hdGguc3FydCh0YSAqIHRhICsgdGMgKiB0Yyk7XHJcbiAgICAgICAgaWYgKHMgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgcyA9IChzICsgKHRzIC0gcyArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXgpIC8gcztcclxuICAgICAgICBib25lLmEgKj0gcztcclxuICAgICAgICBib25lLmMgKj0gcztcclxuICAgICAgICBzID0gTWF0aC5zcXJ0KGJvbmUuYiAqIGJvbmUuYiArIGJvbmUuZCAqIGJvbmUuZCk7XHJcbiAgICAgICAgdHMgPSBNYXRoLnNxcnQodGIgKiB0YiArIHRkICogdGQpO1xyXG4gICAgICAgIGlmIChzID4gMC4wMDAwMSlcclxuICAgICAgICAgIHMgPSAocyArICh0cyAtIHMgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4KSAvIHM7XHJcbiAgICAgICAgYm9uZS5iICo9IHM7XHJcbiAgICAgICAgYm9uZS5kICo9IHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzaGVhck1peCA+IDApIHtcclxuICAgICAgICBsZXQgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgbGV0IGJ5ID0gTWF0aC5hdGFuMihkLCBiKTtcclxuICAgICAgICBsZXQgciA9XHJcbiAgICAgICAgICBNYXRoLmF0YW4yKHRkLCB0YikgLVxyXG4gICAgICAgICAgTWF0aC5hdGFuMih0YywgdGEpIC1cclxuICAgICAgICAgIChieSAtIE1hdGguYXRhbjIoYm9uZS5jLCBib25lLmEpKTtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciA9IGJ5ICsgKHIgKyBvZmZzZXRTaGVhclkpICogc2hlYXJNaXg7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYiAqIGIgKyBkICogZCk7XHJcbiAgICAgICAgYm9uZS5iID0gTWF0aC5jb3MocikgKiBzO1xyXG4gICAgICAgIGJvbmUuZCA9IE1hdGguc2luKHIpICogcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1vZGlmaWVkKSBib25lLmFwcGxpZWRWYWxpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseVJlbGF0aXZlV29ybGQoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGxldCB0YSA9IHRhcmdldC5hLFxyXG4gICAgICB0YiA9IHRhcmdldC5iLFxyXG4gICAgICB0YyA9IHRhcmdldC5jLFxyXG4gICAgICB0ZCA9IHRhcmdldC5kO1xyXG4gICAgbGV0IGRlZ1JhZFJlZmxlY3QgPVxyXG4gICAgICB0YSAqIHRkIC0gdGIgKiB0YyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XHJcbiAgICBsZXQgb2Zmc2V0Um90YXRpb24gPSB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24gKiBkZWdSYWRSZWZsZWN0LFxyXG4gICAgICBvZmZzZXRTaGVhclkgPSB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZICogZGVnUmFkUmVmbGVjdDtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKHJvdGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgbGV0IGEgPSBib25lLmEsXHJcbiAgICAgICAgICBiID0gYm9uZS5iLFxyXG4gICAgICAgICAgYyA9IGJvbmUuYyxcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgbGV0IHIgPSBNYXRoLmF0YW4yKHRjLCB0YSkgKyBvZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciAqPSByb3RhdGVNaXg7XHJcbiAgICAgICAgbGV0IGNvcyA9IE1hdGguY29zKHIpLFxyXG4gICAgICAgICAgc2luID0gTWF0aC5zaW4ocik7XHJcbiAgICAgICAgYm9uZS5hID0gY29zICogYSAtIHNpbiAqIGM7XHJcbiAgICAgICAgYm9uZS5iID0gY29zICogYiAtIHNpbiAqIGQ7XHJcbiAgICAgICAgYm9uZS5jID0gc2luICogYSArIGNvcyAqIGM7XHJcbiAgICAgICAgYm9uZS5kID0gc2luICogYiArIGNvcyAqIGQ7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCB0ZW1wID0gdGhpcy50ZW1wO1xyXG4gICAgICAgIHRhcmdldC5sb2NhbFRvV29ybGQodGVtcC5zZXQodGhpcy5kYXRhLm9mZnNldFgsIHRoaXMuZGF0YS5vZmZzZXRZKSk7XHJcbiAgICAgICAgYm9uZS53b3JsZFggKz0gdGVtcC54ICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIGJvbmUud29ybGRZICs9IHRlbXAueSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNjYWxlTWl4ID4gMCkge1xyXG4gICAgICAgIGxldCBzID1cclxuICAgICAgICAgIChNYXRoLnNxcnQodGEgKiB0YSArIHRjICogdGMpIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICpcclxuICAgICAgICAgICAgc2NhbGVNaXggK1xyXG4gICAgICAgICAgMTtcclxuICAgICAgICBib25lLmEgKj0gcztcclxuICAgICAgICBib25lLmMgKj0gcztcclxuICAgICAgICBzID1cclxuICAgICAgICAgIChNYXRoLnNxcnQodGIgKiB0YiArIHRkICogdGQpIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVkpICpcclxuICAgICAgICAgICAgc2NhbGVNaXggK1xyXG4gICAgICAgICAgMTtcclxuICAgICAgICBib25lLmIgKj0gcztcclxuICAgICAgICBib25lLmQgKj0gcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNoZWFyTWl4ID4gMCkge1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0ZCwgdGIpIC0gTWF0aC5hdGFuMih0YywgdGEpO1xyXG4gICAgICAgIGlmIChyID4gTWF0aFV0aWxzLlBJKSByIC09IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgZWxzZSBpZiAociA8IC1NYXRoVXRpbHMuUEkpIHIgKz0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBsZXQgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgciA9IE1hdGguYXRhbjIoZCwgYikgKyAociAtIE1hdGhVdGlscy5QSSAvIDIgKyBvZmZzZXRTaGVhclkpICogc2hlYXJNaXg7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYiAqIGIgKyBkICogZCk7XHJcbiAgICAgICAgYm9uZS5iID0gTWF0aC5jb3MocikgKiBzO1xyXG4gICAgICAgIGJvbmUuZCA9IE1hdGguc2luKHIpICogcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1vZGlmaWVkKSBib25lLmFwcGxpZWRWYWxpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseUFic29sdXRlTG9jYWwoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGlmICghdGFyZ2V0LmFwcGxpZWRWYWxpZCkgdGFyZ2V0LnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHJvdGF0aW9uID0gYm9uZS5hcm90YXRpb247XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCByID0gdGFyZ2V0LmFyb3RhdGlvbiAtIHJvdGF0aW9uICsgdGhpcy5kYXRhLm9mZnNldFJvdGF0aW9uO1xyXG4gICAgICAgIHIgLT0gKDE2Mzg0IC0gKCgxNjM4NC40OTk5OTk5OTk5OTYgLSByIC8gMzYwKSB8IDApKSAqIDM2MDtcclxuICAgICAgICByb3RhdGlvbiArPSByICogcm90YXRlTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB4ID0gYm9uZS5heCxcclxuICAgICAgICB5ID0gYm9uZS5heTtcclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgeCArPSAodGFyZ2V0LmF4IC0geCArIHRoaXMuZGF0YS5vZmZzZXRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICB5ICs9ICh0YXJnZXQuYXkgLSB5ICsgdGhpcy5kYXRhLm9mZnNldFkpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzY2FsZVggPSBib25lLmFzY2FsZVgsXHJcbiAgICAgICAgc2NhbGVZID0gYm9uZS5hc2NhbGVZO1xyXG4gICAgICBpZiAoc2NhbGVNaXggIT0gMCkge1xyXG4gICAgICAgIGlmIChzY2FsZVggPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVYID1cclxuICAgICAgICAgICAgKHNjYWxlWCArXHJcbiAgICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVYIC0gc2NhbGVYICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWCkgKiBzY2FsZU1peCkgL1xyXG4gICAgICAgICAgICBzY2FsZVg7XHJcbiAgICAgICAgaWYgKHNjYWxlWSA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVkgPVxyXG4gICAgICAgICAgICAoc2NhbGVZICtcclxuICAgICAgICAgICAgICAodGFyZ2V0LmFzY2FsZVkgLSBzY2FsZVkgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4KSAvXHJcbiAgICAgICAgICAgIHNjYWxlWTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2hlYXJZID0gYm9uZS5hc2hlYXJZO1xyXG4gICAgICBpZiAoc2hlYXJNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCByID0gdGFyZ2V0LmFzaGVhclkgLSBzaGVhclkgKyB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZO1xyXG4gICAgICAgIHIgLT0gKDE2Mzg0IC0gKCgxNjM4NC40OTk5OTk5OTk5OTYgLSByIC8gMzYwKSB8IDApKSAqIDM2MDtcclxuICAgICAgICBib25lLnNoZWFyWSArPSByICogc2hlYXJNaXg7XHJcbiAgICAgIH1cclxuICAgICAgYm9uZS51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgeCxcclxuICAgICAgICB5LFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxlWCxcclxuICAgICAgICBzY2FsZVksXHJcbiAgICAgICAgYm9uZS5hc2hlYXJYLFxyXG4gICAgICAgIHNoZWFyWVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseVJlbGF0aXZlTG9jYWwoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGlmICghdGFyZ2V0LmFwcGxpZWRWYWxpZCkgdGFyZ2V0LnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHJvdGF0aW9uID0gYm9uZS5hcm90YXRpb247XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMClcclxuICAgICAgICByb3RhdGlvbiArPSAodGFyZ2V0LmFyb3RhdGlvbiArIHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbikgKiByb3RhdGVNaXg7XHJcbiAgICAgIGxldCB4ID0gYm9uZS5heCxcclxuICAgICAgICB5ID0gYm9uZS5heTtcclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgeCArPSAodGFyZ2V0LmF4ICsgdGhpcy5kYXRhLm9mZnNldFgpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIHkgKz0gKHRhcmdldC5heSArIHRoaXMuZGF0YS5vZmZzZXRZKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2NhbGVYID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSA9IGJvbmUuYXNjYWxlWTtcclxuICAgICAgaWYgKHNjYWxlTWl4ICE9IDApIHtcclxuICAgICAgICBpZiAoc2NhbGVYID4gMC4wMDAwMSlcclxuICAgICAgICAgIHNjYWxlWCAqPVxyXG4gICAgICAgICAgICAodGFyZ2V0LmFzY2FsZVggLSAxICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWCkgKiBzY2FsZU1peCArIDE7XHJcbiAgICAgICAgaWYgKHNjYWxlWSA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVkgKj1cclxuICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVZIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVkpICogc2NhbGVNaXggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzaGVhclkgPSBib25lLmFzaGVhclk7XHJcbiAgICAgIGlmIChzaGVhck1peCAhPSAwKVxyXG4gICAgICAgIHNoZWFyWSArPSAodGFyZ2V0LmFzaGVhclkgKyB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICBib25lLnVwZGF0ZVdvcmxkVHJhbnNmb3JtV2l0aChcclxuICAgICAgICB4LFxyXG4gICAgICAgIHksXHJcbiAgICAgICAgcm90YXRpb24sXHJcbiAgICAgICAgc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSxcclxuICAgICAgICBib25lLmFzaGVhclgsXHJcbiAgICAgICAgc2hlYXJZXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==