UNPKG

@esotericsoftware/spine-core

Version:
318 lines 48.7 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, 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. * * THE SPINE RUNTIMES ARE 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 * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Constraint } from "./Constraint.js"; import { ScaleYMode } from "./ConstraintData.js"; import { Physics } from "./Physics.js"; import { PhysicsConstraintPose } from "./PhysicsConstraintPose.js"; import { Skeleton } from "./Skeleton.js"; import { MathUtils } from "./Utils.js"; /** Applies physics to a bone. * * See <a href="http://esotericsoftware.com/spine-physics-constraints">Physics constraints</a> in the Spine User Guide. */ export class PhysicsConstraint extends Constraint { bone; _reset = true; ux = 0; uy = 0; cx = 0; cy = 0; tx = 0; ty = 0; xOffset = 0; xLag = 0; xVelocity = 0; yOffset = 0; yLag = 0; yVelocity = 0; rotateOffset = 0; rotateLag = 0; rotateVelocity = 0; scaleOffset = 0; scaleLag = 0; scaleVelocity = 0; remaining = 0; lastTime = 0; constructor(data, skeleton) { super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose()); if (skeleton == null) throw new Error("skeleton cannot be null."); this.bone = skeleton.bones[data.bone.index].constrainedPose; } copy(skeleton) { var copy = new PhysicsConstraint(this.data, skeleton); copy.pose.set(this.pose); return copy; } /** Resets all physics state that was the result of previous movement. Use this after moving a bone to prevent physics from * reacting to the movement. */ reset(skeleton) { this.remaining = 0; this.lastTime = skeleton.time; this._reset = true; this.xOffset = 0; this.xLag = 0; this.xVelocity = 0; this.yOffset = 0; this.yLag = 0; this.yVelocity = 0; this.rotateOffset = 0; this.rotateLag = 0; this.rotateVelocity = 0; this.scaleOffset = 0; this.scaleLag = 0; this.scaleVelocity = 0; } /** Translates the physics constraint so the next {@link update} forces are applied as if the bone moved an * additional amount in world space. */ translate(x, y) { this.ux -= x; this.uy -= y; this.cx -= x; this.cy -= y; } /** Rotates the physics constraint so the next {@link update} forces are applied as if the bone rotated * around the specified point in world space. */ rotate(x, y, degrees) { const r = degrees * MathUtils.degRad, cos = Math.cos(r), sin = Math.sin(r); const dx = this.cx - x, dy = this.cy - y; this.translate(dx * cos - dy * sin - dx, dx * sin + dy * cos - dy); } /** Applies the constraint to the constrained bones. */ update(skeleton, physics) { const p = this.appliedPose; const mix = p.mix; if (mix === 0) return; const x = this.data.x > 0, y = this.data.y > 0, rotateOrShearX = this.data.rotate > 0 || this.data.shearX > 0, scaleX = this.data.scaleX > 0; const bone = this.bone; let l = bone.bone.data.length, t = this.data.step, z = 0; if (physics === Physics.none) return; bone.modifyWorld(skeleton); switch (physics) { // biome-ignore lint/suspicious/noFallthroughSwitchClause: fall through expected case Physics.reset: this.reset(skeleton); // Fall through. case Physics.update: { const delta = Math.max(skeleton.time - this.lastTime, 0), aa = this.remaining; this.remaining += delta; this.lastTime = skeleton.time; const bx = bone.worldX, by = bone.worldY; if (this._reset) { this._reset = false; this.ux = bx; this.uy = by; } else { let a = this.remaining, i = p.inertia, f = skeleton.data.referenceScale, d = -1, m = 0, e = 0, qx = this.data.limit * delta, qy = qx * Math.abs(skeleton.scaleY); qx *= Math.abs(skeleton.scaleX); if (x || y) { if (x) { const u = (this.ux - bx) * i; this.xOffset += u > qx ? qx : u < -qx ? -qx : u; this.ux = bx; } if (y) { const u = (this.uy - by) * i; this.yOffset += u > qy ? qy : u < -qy ? -qy : u; this.uy = by; } if (a >= t) { const xs = this.xOffset, ys = this.yOffset; d = p.damping ** (60 * t); m = t * p.massInverse; e = p.strength; const w = f * p.wind, g = f * p.gravity; const ax = (w * skeleton.windX + g * skeleton.gravityX) * skeleton.scaleX; const ay = (w * skeleton.windY + g * skeleton.gravityY) * skeleton.scaleY; do { if (x) { this.xVelocity += (ax - this.xOffset * e) * m; this.xOffset += this.xVelocity * t; this.xVelocity *= d; } if (y) { this.yVelocity -= (ay + this.yOffset * e) * m; this.yOffset += this.yVelocity * t; this.yVelocity *= d; } a -= t; } while (a >= t); this.xLag = this.xOffset - xs; this.yLag = this.yOffset - ys; } z = Math.max(0, 1 - a / t); if (x) bone.worldX += (this.xOffset - this.xLag * z) * mix * this.data.x; if (y) bone.worldY += (this.yOffset - this.yLag * z) * mix * this.data.y; } if (rotateOrShearX || scaleX) { let ca = Math.atan2(bone.c, bone.a), c = 0, s = 0, mr = 0, dx = this.cx - bone.worldX, dy = this.cy - bone.worldY; if (dx > qx) dx = qx; else if (dx < -qx) // dx = -qx; if (dy > qy) dy = qy; else if (dy < -qy) // dy = -qy; a = this.remaining; if (rotateOrShearX) { mr = (this.data.rotate + this.data.shearX) * mix; z = this.rotateLag * Math.max(0, 1 - aa / t); let r = Math.atan2(dy + this.ty, dx + this.tx) - ca - (this.rotateOffset - z) * mr; this.rotateOffset += (r - Math.ceil(r * MathUtils.invPI2 - 0.5) * MathUtils.PI2) * i; r = (this.rotateOffset - z) * mr + ca; c = Math.cos(r); s = Math.sin(r); if (scaleX) { r = l * bone.getWorldScaleX(); if (r > 0) this.scaleOffset += (dx * c + dy * s) * i / r; } } else { c = Math.cos(ca); s = Math.sin(ca); const r = l * bone.getWorldScaleX() - this.scaleLag * Math.max(0, 1 - aa / t); if (r > 0) this.scaleOffset += (dx * c + dy * s) * i / r; } if (a >= t) { if (d === -1) { d = p.damping ** (60 * t); m = t * p.massInverse; e = p.strength; } const ax = p.wind * skeleton.windX + p.gravity * skeleton.gravityX; const ay = (p.wind * skeleton.windY + p.gravity * skeleton.gravityY) * Skeleton.yDir; const rs = this.rotateOffset, ss = this.scaleOffset, h = l / f; while (true) { a -= t; if (scaleX) { this.scaleVelocity += (ax * c - ay * s - this.scaleOffset * e) * m; this.scaleOffset += this.scaleVelocity * t; this.scaleVelocity *= d; } if (rotateOrShearX) { this.rotateVelocity -= ((ax * s + ay * c) * h + this.rotateOffset * e) * m; this.rotateOffset += this.rotateVelocity * t; this.rotateVelocity *= d; if (a < t) break; const r = this.rotateOffset * mr + ca; c = Math.cos(r); s = Math.sin(r); } else if (a < t) // break; } this.rotateLag = this.rotateOffset - rs; this.scaleLag = this.scaleOffset - ss; } z = Math.max(0, 1 - a / t); } this.remaining = a; } this.cx = bone.worldX; this.cy = bone.worldY; break; } case Physics.pose: z = Math.max(0, 1 - this.remaining / t); if (x) bone.worldX += (this.xOffset - this.xLag * z) * mix * this.data.x; if (y) bone.worldY += (this.yOffset - this.yLag * z) * mix * this.data.y; } if (rotateOrShearX) { let o = (this.rotateOffset - this.rotateLag * z) * mix, s = 0, c = 0, a = 0; if (this.data.shearX > 0) { let r = 0; if (this.data.rotate > 0) { r = o * this.data.rotate; s = Math.sin(r); c = Math.cos(r); a = bone.b; bone.b = c * a - s * bone.d; bone.d = s * a + c * bone.d; } r += o * this.data.shearX; s = Math.sin(r); c = Math.cos(r); a = bone.a; bone.a = c * a - s * bone.c; bone.c = s * a + c * bone.c; } else { o *= this.data.rotate; s = Math.sin(o); c = Math.cos(o); a = bone.a; bone.a = c * a - s * bone.c; bone.c = s * a + c * bone.c; a = bone.b; bone.b = c * a - s * bone.d; bone.d = s * a + c * bone.d; } } if (scaleX) { let s = 1 + (this.scaleOffset - this.scaleLag * z) * mix * this.data.scaleX; bone.a *= s; bone.c *= s; switch (this.data.scaleYMode) { case ScaleYMode.Uniform: bone.b *= s; bone.d *= s; break; case ScaleYMode.Volume: s = Math.abs(s); s = s >= 0.7 ? 1 / s : 4 - 3.67347 * s; bone.b *= s; bone.d *= s; } } if (physics !== Physics.pose) { this.tx = l * bone.a; this.ty = l * bone.c; } } sort(skeleton) { const bone = this.bone.bone; skeleton.sortBone(bone); skeleton._updateCache.push(this); skeleton.sortReset(bone.children); skeleton.constrained(bone); } isSourceActive() { return this.bone.bone.active; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGh5c2ljc0NvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUGh5c2ljc0NvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHdkM7OzBIQUUwSDtBQUMxSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsVUFBMkU7SUFDakgsSUFBSSxDQUFXO0lBRWYsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNkLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDUCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1AsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDUCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1AsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNQLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsV0FBVyxHQUFHLENB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QUFDO29CQUNaLE1BQU07Z0JBQ1AsS0FBSyxVQUFVLENBQUMsTUFBTTtvQkFDckIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ1osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNGLENBQUM7SUFFRCxJQUFJLENBQUUsUUFBa0I7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEJvbmVQb3NlIH0gZnJvbSBcIi4vQm9uZVBvc2UuanNcIjtcbmltcG9ydCB7IENvbnN0cmFpbnQgfSBmcm9tIFwiLi9Db25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBTY2FsZVlNb2RlIH0gZnJvbSBcIi4vQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBoeXNpY3MgfSBmcm9tIFwiLi9QaHlzaWNzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBoeXNpY3NDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHsgUGh5c2ljc0NvbnN0cmFpbnRQb3NlIH0gZnJvbSBcIi4vUGh5c2ljc0NvbnN0cmFpbnRQb3NlLmpzXCI7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgeyBNYXRoVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG5cbi8qKiBBcHBsaWVzIHBoeXNpY3MgdG8gYSBib25lLlxuICpcbiAqIFNlZSA8YSBocmVmPVwiaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXBoeXNpY3MtY29uc3RyYWludHNcIj5QaHlzaWNzIGNvbnN0cmFpbnRzPC9hPiBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBQaHlzaWNzQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQ8UGh5c2ljc0NvbnN0cmFpbnQsIFBoeXNpY3NDb25zdHJhaW50RGF0YSwgUGh5c2ljc0NvbnN0cmFpbnRQb3NlPiB7XG5cdGJvbmU6IEJvbmVQb3NlO1xuXG5cdF9yZXNldCA9IHRydWU7XG5cdHV4ID0gMDtcblx0dXkgPSAwO1xuXHRjeCA9IDA7XG5cdGN5ID0gMDtcblx0dHggPSAwO1xuXHR0eSA9IDA7XG5cdHhPZmZzZXQgPSAwO1xuXHR4TGFnID0gMDtcblx0eFZlbG9jaXR5ID0gMDtcblx0eU9mZnNldCA9IDA7XG5cdHlMYWcgPSAwO1xuXHR5VmVsb2NpdHkgPSAwO1xuXHRyb3RhdGVPZmZzZXQgPSAwO1xuXHRyb3RhdGVMYWcgPSAwO1xuXHRyb3RhdGVWZWxvY2l0eSA9IDA7XG5cdHNjYWxlT2Zmc2V0ID0gMFxuXHRzY2FsZUxhZyA9IDBcblx0c2NhbGVWZWxvY2l0eSA9IDA7XG5cdHJlbWFpbmluZyA9IDA7XG5cdGxhc3RUaW1lID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoZGF0YTogUGh5c2ljc0NvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHRzdXBlcihkYXRhLCBuZXcgUGh5c2ljc0NvbnN0cmFpbnRQb3NlKCksIG5ldyBQaHlzaWNzQ29uc3RyYWludFBvc2UoKSk7XG5cdFx0aWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdHRoaXMuYm9uZSA9IHNrZWxldG9uLmJvbmVzW2RhdGEuYm9uZS5pbmRleF0uY29uc3RyYWluZWRQb3NlO1xuXHR9XG5cblx0cHVibGljIGNvcHkgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdHZhciBjb3B5ID0gbmV3IFBoeXNpY3NDb25zdHJhaW50KHRoaXMuZGF0YSwgc2tlbGV0b24pO1xuXHRcdGNvcHkucG9zZS5zZXQodGhpcy5wb3NlKTtcblx0XHRyZXR1cm4gY29weTtcblx0fVxuXG5cdC8qKiBSZXNldHMgYWxsIHBoeXNpY3Mgc3RhdGUgdGhhdCB3YXMgdGhlIHJlc3VsdCBvZiBwcmV2aW91cyBtb3ZlbWVudC4gVXNlIHRoaXMgYWZ0ZXIgbW92aW5nIGEgYm9uZSB0byBwcmV2ZW50IHBoeXNpY3MgZnJvbVxuXHQgKiByZWFjdGluZyB0byB0aGUgbW92ZW1lbnQuICovXG5cdHJlc2V0IChza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHR0aGlzLnJlbWFpbmluZyA9IDA7XG5cdFx0dGhpcy5sYXN0VGltZSA9IHNrZWxldG9uLnRpbWU7XG5cdFx0dGhpcy5fcmVzZXQgPSB0cnVlO1xuXHRcdHRoaXMueE9mZnNldCA9IDA7XG5cdFx0dGhpcy54TGFnID0gMDtcblx0XHR0aGlzLnhWZWxvY2l0eSA9IDA7XG5cdFx0dGhpcy55T2Zmc2V0ID0gMDtcblx0XHR0aGlzLnlMYWcgPSAwO1xuXHRcdHRoaXMueVZlbG9jaXR5ID0gMDtcblx0XHR0aGlzLnJvdGF0ZU9mZnNldCA9IDA7XG5cdFx0dGhpcy5yb3RhdGVMYWcgPSAwO1xuXHRcdHRoaXMucm90YXRlVmVsb2NpdHkgPSAwO1xuXHRcdHRoaXMuc2NhbGVPZmZzZXQgPSAwO1xuXHRcdHRoaXMuc2NhbGVMYWcgPSAwO1xuXHRcdHRoaXMuc2NhbGVWZWxvY2l0eSA9IDA7XG5cdH1cblxuXHQvKiogVHJhbnNsYXRlcyB0aGUgcGh5c2ljcyBjb25zdHJhaW50IHNvIHRoZSBuZXh0IHtAbGluayB1cGRhdGV9IGZvcmNlcyBhcmUgYXBwbGllZCBhcyBpZiB0aGUgYm9uZSBtb3ZlZCBhblxuXHQgKiBhZGRpdGlvbmFsIGFtb3VudCBpbiB3b3JsZCBzcGFjZS4gKi9cblx0dHJhbnNsYXRlICh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuXHRcdHRoaXMudXggLT0geDtcblx0XHR0aGlzLnV5IC09IHk7XG5cdFx0dGhpcy5jeCAtPSB4O1xuXHRcdHRoaXMuY3kgLT0geTtcblx0fVxuXG5cdC8qKiBSb3RhdGVzIHRoZSBwaHlzaWNzIGNvbnN0cmFpbnQgc28gdGhlIG5leHQge0BsaW5rIHVwZGF0ZX0gZm9yY2VzIGFyZSBhcHBsaWVkIGFzIGlmIHRoZSBib25lIHJvdGF0ZWRcblx0ICogYXJvdW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQgaW4gd29ybGQgc3BhY2UuICovXG5cdHJvdGF0ZSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlZ3JlZXM6IG51bWJlcikge1xuXHRcdGNvbnN0IHIgPSBkZWdyZWVzICogTWF0aFV0aWxzLmRlZ1JhZCwgY29zID0gTWF0aC5jb3MociksIHNpbiA9IE1hdGguc2luKHIpO1xuXHRcdGNvbnN0IGR4ID0gdGhpcy5jeCAtIHgsIGR5ID0gdGhpcy5jeSAtIHk7XG5cdFx0dGhpcy50cmFuc2xhdGUoZHggKiBjb3MgLSBkeSAqIHNpbiAtIGR4LCBkeCAqIHNpbiArIGR5ICogY29zIC0gZHkpO1xuXHR9XG5cblx0LyoqIEFwcGxpZXMgdGhlIGNvbnN0cmFpbnQgdG8gdGhlIGNvbnN0cmFpbmVkIGJvbmVzLiAqL1xuXHR1cGRhdGUgKHNrZWxldG9uOiBTa2VsZXRvbiwgcGh5c2ljczogUGh5c2ljcykge1xuXHRcdGNvbnN0IHAgPSB0aGlzLmFwcGxpZWRQb3NlO1xuXHRcdGNvbnN0IG1peCA9IHAubWl4O1xuXHRcdGlmIChtaXggPT09IDApIHJldHVybjtcblxuXHRcdGNvbnN0IHggPSB0aGlzLmRhdGEueCA+IDAsIHkgPSB0aGlzLmRhdGEueSA+IDAsIHJvdGF0ZU9yU2hlYXJYID0gdGhpcy5kYXRhLnJvdGF0ZSA+IDAgfHwgdGhpcy5kYXRhLnNoZWFyWCA+IDAsIHNjYWxlWCA9IHRoaXMuZGF0YS5zY2FsZVggPiAwO1xuXHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmU7XG5cdFx0bGV0IGwgPSBib25lLmJvbmUuZGF0YS5sZW5ndGgsIHQgPSB0aGlzLmRhdGEuc3RlcCwgeiA9IDA7XG5cdFx0aWYgKHBoeXNpY3MgPT09IFBoeXNpY3Mubm9uZSkgcmV0dXJuO1xuXHRcdGJvbmUubW9kaWZ5V29ybGQoc2tlbGV0b24pO1xuXG5cdFx0c3dpdGNoIChwaHlzaWNzKSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6IGZhbGwgdGhyb3VnaCBleHBlY3RlZFxuXHRcdFx0Y2FzZSBQaHlzaWNzLnJlc2V0OlxuXHRcdFx0XHR0aGlzLnJlc2V0KHNrZWxldG9uKTsgLy8gRmFsbCB0aHJvdWdoLlxuXHRcdFx0Y2FzZSBQaHlzaWNzLnVwZGF0ZToge1xuXHRcdFx0XHRjb25zdCBkZWx0YSA9IE1hdGgubWF4KHNrZWxldG9uLnRpbWUgLSB0aGlzLmxhc3RUaW1lLCAwKSwgYWEgPSB0aGlzLnJlbWFpbmluZztcblx0XHRcdFx0dGhpcy5yZW1haW5pbmcgKz0gZGVsdGE7XG5cdFx0XHRcdHRoaXMubGFzdFRpbWUgPSBza2VsZXRvbi50aW1lO1xuXG5cdFx0XHRcdGNvbnN0IGJ4ID0gYm9uZS53b3JsZFgsIGJ5ID0gYm9uZS53b3JsZFk7XG5cdFx0XHRcdGlmICh0aGlzLl9yZXNldCkge1xuXHRcdFx0XHRcdHRoaXMuX3Jlc2V0ID0gZmFsc2U7XG5cdFx0XHRcdFx0dGhpcy51eCA9IGJ4O1xuXHRcdFx0XHRcdHRoaXMudXkgPSBieTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsZXQgYSA9IHRoaXMucmVtYWluaW5nLCBpID0gcC5pbmVydGlhLCBmID0gc2tlbGV0b24uZGF0YS5yZWZlcmVuY2VTY2FsZSwgZCA9IC0xLCBtID0gMCwgZSA9IDAsIHF4ID0gdGhpcy5kYXRhLmxpbWl0ICogZGVsdGEsXG5cdFx0XHRcdFx0XHRxeSA9IHF4ICogTWF0aC5hYnMoc2tlbGV0b24uc2NhbGVZKTtcblx0XHRcdFx0XHRxeCAqPSBNYXRoLmFicyhza2VsZXRvbi5zY2FsZVgpO1xuXHRcdFx0XHRcdGlmICh4IHx8IHkpIHtcblx0XHRcdFx0XHRcdGlmICh4KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHUgPSAodGhpcy51eCAtIGJ4KSAqIGk7XG5cdFx0XHRcdFx0XHRcdHRoaXMueE9mZnNldCArPSB1ID4gcXggPyBxeCA6IHUgPCAtcXggPyAtcXggOiB1O1xuXHRcdFx0XHRcdFx0XHR0aGlzLnV4ID0gYng7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoeSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB1ID0gKHRoaXMudXkgLSBieSkgKiBpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnlPZmZzZXQgKz0gdSA+IHF5ID8gcXkgOiB1IDwgLXF5ID8gLXF5IDogdTtcblx0XHRcdFx0XHRcdFx0dGhpcy51eSA9IGJ5O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGEgPj0gdCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB4cyA9IHRoaXMueE9mZnNldCwgeXMgPSB0aGlzLnlPZmZzZXQ7XG5cdFx0XHRcdFx0XHRcdGQgPSBwLmRhbXBpbmcgKiogKDYwICogdCk7XG5cdFx0XHRcdFx0XHRcdG0gPSB0ICogcC5tYXNzSW52ZXJzZTtcblx0XHRcdFx0XHRcdFx0ZSA9IHAuc3RyZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHcgPSBmICogcC53aW5kLCBnID0gZiAqIHAuZ3Jhdml0eTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXggPSAodyAqIHNrZWxldG9uLndpbmRYICsgZyAqIHNrZWxldG9uLmdyYXZpdHlYKSAqIHNrZWxldG9uLnNjYWxlWDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXkgPSAodyAqIHNrZWxldG9uLndpbmRZICsgZyAqIHNrZWxldG9uLmdyYXZpdHlZKSAqIHNrZWxldG9uLnNjYWxlWTtcblx0XHRcdFx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh4KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnhWZWxvY2l0eSArPSAoYXggLSB0aGlzLnhPZmZzZXQgKiBlKSAqIG07XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnhPZmZzZXQgKz0gdGhpcy54VmVsb2NpdHkgKiB0O1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy54VmVsb2NpdHkgKj0gZDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMueVZlbG9jaXR5IC09IChheSArIHRoaXMueU9mZnNldCAqIGUpICogbTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMueU9mZnNldCArPSB0aGlzLnlWZWxvY2l0eSAqIHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnlWZWxvY2l0eSAqPSBkO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRhIC09IHQ7XG5cdFx0XHRcdFx0XHRcdH0gd2hpbGUgKGEgPj0gdCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMueExhZyA9IHRoaXMueE9mZnNldCAtIHhzO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnlMYWcgPSB0aGlzLnlPZmZzZXQgLSB5cztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHogPSBNYXRoLm1heCgwLCAxIC0gYSAvIHQpO1xuXHRcdFx0XHRcdFx0aWYgKHgpIGJvbmUud29ybGRYICs9ICh0aGlzLnhPZmZzZXQgLSB0aGlzLnhMYWcgKiB6KSAqIG1peCAqIHRoaXMuZGF0YS54O1xuXHRcdFx0XHRcdFx0aWYgKHkpIGJvbmUud29ybGRZICs9ICh0aGlzLnlPZmZzZXQgLSB0aGlzLnlMYWcgKiB6KSAqIG1peCAqIHRoaXMuZGF0YS55O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocm90YXRlT3JTaGVhclggfHwgc2NhbGVYKSB7XG5cdFx0XHRcdFx0XHRsZXQgY2EgPSBNYXRoLmF0YW4yKGJvbmUuYywgYm9uZS5hKSwgYyA9IDAsIHMgPSAwLCBtciA9IDAsIGR4ID0gdGhpcy5jeCAtIGJvbmUud29ybGRYLCBkeSA9IHRoaXMuY3kgLSBib25lLndvcmxkWTtcblx0XHRcdFx0XHRcdGlmIChkeCA+IHF4KVxuXHRcdFx0XHRcdFx0XHRkeCA9IHF4O1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAoZHggPCAtcXgpIC8vXG5cdFx0XHRcdFx0XHRcdGR4ID0gLXF4O1xuXHRcdFx0XHRcdFx0aWYgKGR5ID4gcXkpXG5cdFx0XHRcdFx0XHRcdGR5ID0gcXk7XG5cdFx0XHRcdFx0XHRlbHNlIGlmIChkeSA8IC1xeSkgLy9cblx0XHRcdFx0XHRcdFx0ZHkgPSAtcXk7XG5cdFx0XHRcdFx0XHRhID0gdGhpcy5yZW1haW5pbmc7XG5cdFx0XHRcdFx0XHRpZiAocm90YXRlT3JTaGVhclgpIHtcblx0XHRcdFx0XHRcdFx0bXIgPSAodGhpcy5kYXRhLnJvdGF0ZSArIHRoaXMuZGF0YS5zaGVhclgpICogbWl4O1xuXHRcdFx0XHRcdFx0XHR6ID0gdGhpcy5yb3RhdGVMYWcgKiBNYXRoLm1heCgwLCAxIC0gYWEgLyB0KTtcblx0XHRcdFx0XHRcdFx0bGV0IHIgPSBNYXRoLmF0YW4yKGR5ICsgdGhpcy50eSwgZHggKyB0aGlzLnR4KSAtIGNhIC0gKHRoaXMucm90YXRlT2Zmc2V0IC0geikgKiBtcjtcblx0XHRcdFx0XHRcdFx0dGhpcy5yb3RhdGVPZmZzZXQgKz0gKHIgLSBNYXRoLmNlaWwociAqIE1hdGhVdGlscy5pbnZQSTIgLSAwLjUpICogTWF0aFV0aWxzLlBJMikgKiBpO1xuXHRcdFx0XHRcdFx0XHRyID0gKHRoaXMucm90YXRlT2Zmc2V0IC0geikgKiBtciArIGNhO1xuXHRcdFx0XHRcdFx0XHRjID0gTWF0aC5jb3Mocik7XG5cdFx0XHRcdFx0XHRcdHMgPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0XHRcdFx0aWYgKHNjYWxlWCkge1xuXHRcdFx0XHRcdFx0XHRcdHIgPSBsICogYm9uZS5nZXRXb3JsZFNjYWxlWCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyID4gMCkgdGhpcy5zY2FsZU9mZnNldCArPSAoZHggKiBjICsgZHkgKiBzKSAqIGkgLyByO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjID0gTWF0aC5jb3MoY2EpO1xuXHRcdFx0XHRcdFx0XHRzID0gTWF0aC5zaW4oY2EpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCByID0gbCAqIGJvbmUuZ2V0V29ybGRTY2FsZVgoKSAtIHRoaXMuc2NhbGVMYWcgKiBNYXRoLm1heCgwLCAxIC0gYWEgLyB0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHIgPiAwKSB0aGlzLnNjYWxlT2Zmc2V0ICs9IChkeCAqIGMgKyBkeSAqIHMpICogaSAvIHI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYSA+PSB0KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChkID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdGQgPSBwLmRhbXBpbmcgKiogKDYwICogdCk7XG5cdFx0XHRcdFx0XHRcdFx0bSA9IHQgKiBwLm1hc3NJbnZlcnNlO1xuXHRcdFx0XHRcdFx0XHRcdGUgPSBwLnN0cmVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGF4ID0gcC53aW5kICogc2tlbGV0b24ud2luZFggKyBwLmdyYXZpdHkgKiBza2VsZXRvbi5ncmF2aXR5WDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXkgPSAocC53aW5kICogc2tlbGV0b24ud2luZFkgKyBwLmdyYXZpdHkgKiBza2VsZXRvbi5ncmF2aXR5WSkgKiBTa2VsZXRvbi55RGlyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBycyA9IHRoaXMucm90YXRlT2Zmc2V0LCBzcyA9IHRoaXMuc2NhbGVPZmZzZXQsIGggPSBsIC8gZjtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhIC09IHQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNjYWxlWCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zY2FsZVZlbG9jaXR5ICs9IChheCAqIGMgLSBheSAqIHMgLSB0aGlzLnNjYWxlT2Zmc2V0ICogZSkgKiBtO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zY2FsZU9mZnNldCArPSB0aGlzLnNjYWxlVmVsb2NpdHkgKiB0O1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zY2FsZVZlbG9jaXR5ICo9IGQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChyb3RhdGVPclNoZWFyWCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5yb3RhdGVWZWxvY2l0eSAtPSAoKGF4ICogcyArIGF5ICogYykgKiBoICsgdGhpcy5yb3RhdGVPZmZzZXQgKiBlKSAqIG07XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnJvdGF0ZU9mZnNldCArPSB0aGlzLnJvdGF0ZVZlbG9jaXR5ICogdDtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMucm90YXRlVmVsb2NpdHkgKj0gZDtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhIDwgdCkgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByID0gdGhpcy5yb3RhdGVPZmZzZXQgKiBtciArIGNhO1xuXHRcdFx0XHRcdFx0XHRcdFx0YyA9IE1hdGguY29zKHIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cyA9IE1hdGguc2luKHIpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYSA8IHQpIC8vXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLnJvdGF0ZUxhZyA9IHRoaXMucm90YXRlT2Zmc2V0IC0gcnM7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2NhbGVMYWcgPSB0aGlzLnNjYWxlT2Zmc2V0IC0gc3M7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR6ID0gTWF0aC5tYXgoMCwgMSAtIGEgLyB0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5yZW1haW5pbmcgPSBhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuY3ggPSBib25lLndvcmxkWDtcblx0XHRcdFx0dGhpcy5jeSA9IGJvbmUud29ybGRZO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgUGh5c2ljcy5wb3NlOlxuXHRcdFx0XHR6ID0gTWF0aC5tYXgoMCwgMSAtIHRoaXMucmVtYWluaW5nIC8gdCk7XG5cdFx0XHRcdGlmICh4KSBib25lLndvcmxkWCArPSAodGhpcy54T2Zmc2V0IC0gdGhpcy54TGFnICogeikgKiBtaXggKiB0aGlzLmRhdGEueDtcblx0XHRcdFx0aWYgKHkpIGJvbmUud29ybGRZICs9ICh0aGlzLnlPZmZzZXQgLSB0aGlzLnlMYWcgKiB6KSAqIG1peCAqIHRoaXMuZGF0YS55O1xuXHRcdH1cblxuXHRcdGlmIChyb3RhdGVPclNoZWFyWCkge1xuXHRcdFx0bGV0IG8gPSAodGhpcy5yb3RhdGVPZmZzZXQgLSB0aGlzLnJvdGF0ZUxhZyAqIHopICogbWl4LCBzID0gMCwgYyA9IDAsIGEgPSAwO1xuXHRcdFx0aWYgKHRoaXMuZGF0YS5zaGVhclggPiAwKSB7XG5cdFx0XHRcdGxldCByID0gMDtcblx0XHRcdFx0aWYgKHRoaXMuZGF0YS5yb3RhdGUgPiAwKSB7XG5cdFx0XHRcdFx0ciA9IG8gKiB0aGlzLmRhdGEucm90YXRlO1xuXHRcdFx0XHRcdHMgPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0XHRjID0gTWF0aC5jb3Mocik7XG5cdFx0XHRcdFx0YSA9IGJvbmUuYjtcblx0XHRcdFx0XHRib25lLmIgPSBjICogYSAtIHMgKiBib25lLmQ7XG5cdFx0XHRcdFx0Ym9uZS5kID0gcyAqIGEgKyBjICogYm9uZS5kO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHIgKz0gbyAqIHRoaXMuZGF0YS5zaGVhclg7XG5cdFx0XHRcdHMgPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0YyA9IE1hdGguY29zKHIpO1xuXHRcdFx0XHRhID0gYm9uZS5hO1xuXHRcdFx0XHRib25lLmEgPSBjICogYSAtIHMgKiBib25lLmM7XG5cdFx0XHRcdGJvbmUuYyA9IHMgKiBhICsgYyAqIGJvbmUuYztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG8gKj0gdGhpcy5kYXRhLnJvdGF0ZTtcblx0XHRcdFx0cyA9IE1hdGguc2luKG8pO1xuXHRcdFx0XHRjID0gTWF0aC5jb3Mobyk7XG5cdFx0XHRcdGEgPSBib25lLmE7XG5cdFx0XHRcdGJvbmUuYSA9IGMgKiBhIC0gcyAqIGJvbmUuYztcblx0XHRcdFx0Ym9uZS5jID0gcyAqIGEgKyBjICogYm9uZS5jO1xuXHRcdFx0XHRhID0gYm9uZS5iO1xuXHRcdFx0XHRib25lLmIgPSBjICogYSAtIHMgKiBib25lLmQ7XG5cdFx0XHRcdGJvbmUuZCA9IHMgKiBhICsgYyAqIGJvbmUuZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNjYWxlWCkge1xuXHRcdFx0bGV0IHMgPSAxICsgKHRoaXMuc2NhbGVPZmZzZXQgLSB0aGlzLnNjYWxlTGFnICogeikgKiBtaXggKiB0aGlzLmRhdGEuc2NhbGVYO1xuXHRcdFx0Ym9uZS5hICo9IHM7XG5cdFx0XHRib25lLmMgKj0gcztcblx0XHRcdHN3aXRjaCAodGhpcy5kYXRhLnNjYWxlWU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBTY2FsZVlNb2RlLlVuaWZvcm06XG5cdFx0XHRcdFx0Ym9uZS5iICo9IHM7XG5cdFx0XHRcdFx0Ym9uZS5kICo9IHM7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgU2NhbGVZTW9kZS5Wb2x1bWU6XG5cdFx0XHRcdFx0cyA9IE1hdGguYWJzKHMpO1xuXHRcdFx0XHRcdHMgPSBzID49IDAuNyA/IDEgLyBzIDogNCAtIDMuNjczNDcgKiBzO1xuXHRcdFx0XHRcdGJvbmUuYiAqPSBzO1xuXHRcdFx0XHRcdGJvbmUuZCAqPSBzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAocGh5c2ljcyAhPT0gUGh5c2ljcy5wb3NlKSB7XG5cdFx0XHR0aGlzLnR4ID0gbCAqIGJvbmUuYTtcblx0XHRcdHRoaXMudHkgPSBsICogYm9uZS5jO1xuXHRcdH1cblx0fVxuXG5cdHNvcnQgKHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmUuYm9uZTtcblx0XHRza2VsZXRvbi5zb3J0Qm9uZShib25lKTtcblx0XHRza2VsZXRvbi5fdXBkYXRlQ2FjaGUucHVzaCh0aGlzKTtcblx0XHRza2VsZXRvbi5zb3J0UmVzZXQoYm9uZS5jaGlsZHJlbik7XG5cdFx0c2tlbGV0b24uY29uc3RyYWluZWQoYm9uZSk7XG5cdH1cblxuXHRpc1NvdXJjZUFjdGl2ZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYm9uZS5ib25lLmFjdGl2ZTtcblx0fVxuXG59XG4iXX0=