UNPKG

ngx-spine

Version:

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

453 lines 44.9 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 { MathUtils } from "./Utils"; var IkConstraint = /** @class */ (function () { function IkConstraint(data, skeleton) { this.bendDirection = 0; this.compress = false; this.stretch = false; this.mix = 1; this.softness = 0; 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.mix = data.mix; this.softness = data.softness; this.bendDirection = data.bendDirection; this.compress = data.compress; this.stretch = data.stretch; this.bones = new Array(); for (var i = 0; i < data.bones.length; i++) this.bones.push(skeleton.findBone(data.bones[i].name)); this.target = skeleton.findBone(data.target.name); } /** * @return {?} */ IkConstraint.prototype.isActive = /** * @return {?} */ function () { return this.active; }; /** * @return {?} */ IkConstraint.prototype.apply = /** * @return {?} */ function () { this.update(); }; /** * @return {?} */ IkConstraint.prototype.update = /** * @return {?} */ function () { /** @type {?} */ var target = this.target; /** @type {?} */ var bones = this.bones; switch (bones.length) { case 1: this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix); break; case 2: this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.softness, this.mix); break; } }; /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. */ /** * Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. * @param {?} bone * @param {?} targetX * @param {?} targetY * @param {?} compress * @param {?} stretch * @param {?} uniform * @param {?} alpha * @return {?} */ IkConstraint.prototype.apply1 = /** * Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. * @param {?} bone * @param {?} targetX * @param {?} targetY * @param {?} compress * @param {?} stretch * @param {?} uniform * @param {?} alpha * @return {?} */ function (bone, targetX, targetY, compress, stretch, uniform, alpha) { if (!bone.appliedValid) bone.updateAppliedTransform(); /** @type {?} */ var p = bone.parent; /** @type {?} */ var id = 1 / (p.a * p.d - p.b * p.c); /** @type {?} */ var x = targetX - p.worldX; /** @type {?} */ var y = targetY - p.worldY; /** @type {?} */ var tx = (x * p.d - y * p.b) * id - bone.ax; /** @type {?} */ var ty = (y * p.a - x * p.c) * id - bone.ay; /** @type {?} */ var rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation; if (bone.ascaleX < 0) rotationIK += 180; if (rotationIK > 180) rotationIK -= 360; else if (rotationIK < -180) rotationIK += 360; /** @type {?} */ var sx = bone.ascaleX; /** @type {?} */ var sy = bone.ascaleY; if (compress || stretch) { /** @type {?} */ var b = bone.data.length * sx; /** @type {?} */ var dd = Math.sqrt(tx * tx + ty * ty); if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) { /** @type {?} */ var s = (dd / b - 1) * alpha + 1; sx *= s; if (uniform) sy *= s; } } bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY); }; /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param child A direct descendant of the parent bone. */ /** * Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param {?} parent * @param {?} child A direct descendant of the parent bone. * @param {?} targetX * @param {?} targetY * @param {?} bendDir * @param {?} stretch * @param {?} softness * @param {?} alpha * @return {?} */ IkConstraint.prototype.apply2 = /** * Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param {?} parent * @param {?} child A direct descendant of the parent bone. * @param {?} targetX * @param {?} targetY * @param {?} bendDir * @param {?} stretch * @param {?} softness * @param {?} alpha * @return {?} */ function (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) { if (alpha == 0) { child.updateWorldTransform(); return; } if (!parent.appliedValid) parent.updateAppliedTransform(); if (!child.appliedValid) child.updateAppliedTransform(); /** @type {?} */ var px = parent.ax; /** @type {?} */ var py = parent.ay; /** @type {?} */ var psx = parent.ascaleX; /** @type {?} */ var sx = psx; /** @type {?} */ var psy = parent.ascaleY; /** @type {?} */ var csx = child.ascaleX; /** @type {?} */ var os1 = 0; /** @type {?} */ var os2 = 0; /** @type {?} */ var s2 = 0; if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; } else { os1 = 0; s2 = 1; } if (psy < 0) { psy = -psy; s2 = -s2; } if (csx < 0) { csx = -csx; os2 = 180; } else os2 = 0; /** @type {?} */ var cx = child.ax; /** @type {?} */ var cy = 0; /** @type {?} */ var cwx = 0; /** @type {?} */ var cwy = 0; /** @type {?} */ var a = parent.a; /** @type {?} */ var b = parent.b; /** @type {?} */ var c = parent.c; /** @type {?} */ var d = parent.d; /** @type {?} */ var u = Math.abs(psx - psy) <= 0.0001; if (!u) { cy = 0; cwx = a * cx + parent.worldX; cwy = c * cx + parent.worldY; } else { cy = child.ay; cwx = a * cx + b * cy + parent.worldX; cwy = c * cx + d * cy + parent.worldY; } /** @type {?} */ var pp = parent.parent; a = pp.a; b = pp.b; c = pp.c; d = pp.d; /** @type {?} */ var id = 1 / (a * d - b * c); /** @type {?} */ var x = cwx - pp.worldX; /** @type {?} */ var y = cwy - pp.worldY; /** @type {?} */ var dx = (x * d - y * b) * id - px; /** @type {?} */ var dy = (y * a - x * c) * id - py; /** @type {?} */ var l1 = Math.sqrt(dx * dx + dy * dy); /** @type {?} */ var l2 = child.data.length * csx; /** @type {?} */ var a1; /** @type {?} */ var a2; if (l1 < 0.0001) { this.apply1(parent, targetX, targetY, false, stretch, false, alpha); child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); return; } x = targetX - pp.worldX; y = targetY - pp.worldY; /** @type {?} */ var tx = (x * d - y * b) * id - px; /** @type {?} */ var ty = (y * a - x * c) * id - py; /** @type {?} */ var dd = tx * tx + ty * ty; if (softness != 0) { softness *= (psx * (csx + 1)) / 2; /** @type {?} */ var td = Math.sqrt(dd); /** @type {?} */ var sd = td - l1 - l2 * psx + softness; if (sd > 0) { /** @type {?} */ var p = Math.min(1, sd / (softness * 2)) - 1; p = (sd - softness * (1 - p * p)) / td; tx -= p * tx; ty -= p * ty; dd = tx * tx + ty * ty; } } outer: if (u) { l2 *= psx; /** @type {?} */ var cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2); if (cos < -1) cos = -1; else if (cos > 1) { cos = 1; if (stretch) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1; } a2 = Math.acos(cos) * bendDir; a = l1 + l2 * cos; b = l2 * Math.sin(a2); a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b); } else { a = psx * l2; b = psy * l2; /** @type {?} */ var aa = a * a; /** @type {?} */ var bb = b * b; /** @type {?} */ var ta = Math.atan2(ty, tx); c = bb * l1 * l1 + aa * dd - aa * bb; /** @type {?} */ var c1 = -2 * bb * l1; /** @type {?} */ var c2 = bb - aa; d = c1 * c1 - 4 * c2 * c; if (d >= 0) { /** @type {?} */ var q = Math.sqrt(d); if (c1 < 0) q = -q; q = -(c1 + q) / 2; /** @type {?} */ var r0 = q / c2; /** @type {?} */ var r1 = c / q; /** @type {?} */ var r = Math.abs(r0) < Math.abs(r1) ? r0 : r1; if (r * r <= dd) { y = Math.sqrt(dd - r * r) * bendDir; a1 = ta - Math.atan2(y, r); a2 = Math.atan2(y / psy, (r - l1) / psx); break outer; } } /** @type {?} */ var minAngle = MathUtils.PI; /** @type {?} */ var minX = l1 - a; /** @type {?} */ var minDist = minX * minX; /** @type {?} */ var minY = 0; /** @type {?} */ var maxAngle = 0; /** @type {?} */ var maxX = l1 + a; /** @type {?} */ var maxDist = maxX * maxX; /** @type {?} */ var maxY = 0; c = (-a * l1) / (aa - bb); if (c >= -1 && c <= 1) { c = Math.acos(c); x = a * Math.cos(c) + l1; y = b * Math.sin(c); d = x * x + y * y; if (d < minDist) { minAngle = c; minDist = d; minX = x; minY = y; } if (d > maxDist) { maxAngle = c; maxDist = d; maxX = x; maxY = y; } } if (dd <= (minDist + maxDist) / 2) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; } else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; } } /** @type {?} */ var os = Math.atan2(cy, cx) * s2; /** @type {?} */ var rotation = parent.arotation; a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation; if (a1 > 180) a1 -= 360; else if (a1 < -180) a1 += 360; parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0); rotation = child.arotation; a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation; if (a2 > 180) a2 -= 360; else if (a2 < -180) a2 += 360; child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); }; return IkConstraint; }()); export { IkConstraint }; if (false) { /** @type {?} */ IkConstraint.prototype.data; /** @type {?} */ IkConstraint.prototype.bones; /** @type {?} */ IkConstraint.prototype.target; /** @type {?} */ IkConstraint.prototype.bendDirection; /** @type {?} */ IkConstraint.prototype.compress; /** @type {?} */ IkConstraint.prototype.stretch; /** @type {?} */ IkConstraint.prototype.mix; /** @type {?} */ IkConstraint.prototype.softness; /** @type {?} */ IkConstraint.prototype.active; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWtDb25zdHJhaW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvSWtDb25zdHJhaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFNcEM7SUFVRSxzQkFBWSxJQUFzQixFQUFFLFFBQWtCO1FBTnRELGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFRLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDOzs7O0lBQ0QsK0JBQVE7OztJQUFSO1FBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFDRCw0QkFBSzs7O0lBQUw7UUFDRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQzs7OztJQUNELDZCQUFNOzs7SUFBTjs7WUFDTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07O1lBQ3BCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztRQUN0QixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDcEIsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQ1QsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLE1BQU0sRUFDYixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQ2pCLElBQUksQ0FBQyxHQUFHLENBQ1QsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQ1QsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxHQUFHLENBQ1QsQ0FBQztnQkFDRixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBQ0Q7NEJBQ3dCOzs7Ozs7Ozs7Ozs7O0lBQ3hCLDZCQUFNOzs7Ozs7Ozs7Ozs7SUFBTixVQUNFLElBQVUsRUFDVixPQUFlLEVBQ2YsT0FBZSxFQUNmLFFBQWlCLEVBQ2pCLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLEtBQWE7UUFFYixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7WUFDbEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNOztZQUNmLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNoQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNOztZQUN4QixDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNOztZQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRTs7WUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7O1lBQ3JDLFVBQVUsR0FDWixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVM7UUFDdkUsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7WUFBRSxVQUFVLElBQUksR0FBRyxDQUFDO1FBQ3hDLElBQUksVUFBVSxHQUFHLEdBQUc7WUFBRSxVQUFVLElBQUksR0FBRyxDQUFDO2FBQ25DLElBQUksVUFBVSxHQUFHLENBQUMsR0FBRztZQUFFLFVBQVUsSUFBSSxHQUFHLENBQUM7O1lBQzFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTzs7WUFDbkIsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPO1FBQ25CLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRTs7Z0JBQ25CLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFOztnQkFDM0IsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFOztvQkFDekQsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQztnQkFDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDUixJQUFJLE9BQU87b0JBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUMzQixJQUFJLENBQUMsRUFBRSxFQUNQLElBQUksQ0FBQyxFQUFFLEVBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLEdBQUcsS0FBSyxFQUNuQyxFQUFFLEVBQ0YsRUFBRSxFQUNGLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUNEOzs4REFFMEQ7Ozs7Ozs7Ozs7Ozs7O0lBQzFELDZCQUFNOzs7Ozs7Ozs7Ozs7O0lBQU4sVUFDRSxNQUFZLEVBQ1osS0FBVyxFQUNYLE9BQWUsRUFDZixPQUFlLEVBQ2YsT0FBZSxFQUNmLE9BQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLEtBQWE7UUFFYixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDZCxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFBRSxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFBRSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7WUFDcEQsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFOztZQUNoQixFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUU7O1lBQ2QsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPOztZQUNwQixFQUFFLEdBQUcsR0FBRzs7WUFDUixHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU87O1lBQ3BCLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTzs7WUFDakIsR0FBRyxHQUFHLENBQUM7O1lBQ1QsR0FBRyxHQUFHLENBQUM7O1lBQ1AsRUFBRSxHQUFHLENBQUM7UUFDUixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDWCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDWCxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ1Q7YUFBTTtZQUNMLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDUixFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1I7UUFDRCxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDWCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDWCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7U0FDVjtRQUNELElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNYLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNYLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDWDs7WUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztZQUNYLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRTs7WUFDZixFQUFFLEdBQUcsQ0FBQzs7WUFDTixHQUFHLEdBQUcsQ0FBQzs7WUFDUCxHQUFHLEdBQUcsQ0FBQzs7WUFDUCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7O1lBQ1osQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDOztZQUNaLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQzs7WUFDWixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7O1lBQ1YsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLE1BQU07UUFDckMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNOLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDOUI7YUFBTTtZQUNMLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3RDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUN2Qzs7WUFDRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU07UUFDdEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVCxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNULENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ0wsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFDMUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTTs7WUFDbkIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTTs7WUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7O1lBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFOztZQUM1QixFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O1lBQ25DLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHOztZQUM1QixFQUFFOztZQUNGLEVBQUU7UUFDSixJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLEtBQUssQ0FBQyx3QkFBd0IsQ0FDNUIsRUFBRSxFQUNGLEVBQUUsRUFDRixDQUFDLEVBQ0QsS0FBSyxDQUFDLE9BQU8sRUFDYixLQUFLLENBQUMsT0FBTyxFQUNiLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsQ0FBQyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3hCLENBQUMsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQzs7WUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7O1lBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFOztZQUM1QixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtRQUMxQixJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7WUFDakIsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFDOUIsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOztnQkFDcEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRO1lBQ3BDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTs7b0JBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzVDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN2QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDYixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDYixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7UUFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWixFQUFFLElBQUksR0FBRyxDQUFDOztnQkFDTixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ1IsSUFBSSxPQUFPO29CQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNoRTtZQUNELEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUM5QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7WUFDbEIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Z0JBQ1QsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDOztnQkFDWixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7O2dCQUNWLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDekIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Z0JBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTs7Z0JBQ25CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUNkLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTs7b0JBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDO29CQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztvQkFDZCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7O29CQUNiLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7b0JBQ1IsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNmLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO29CQUNwQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzQixFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLEtBQUssQ0FBQztpQkFDYjthQUNGOztnQkFDRyxRQUFRLEdBQUcsU0FBUyxDQUFDLEVBQUU7O2dCQUN6QixJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUM7O2dCQUNiLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSTs7Z0JBQ3JCLElBQUksR0FBRyxDQUFDOztnQkFDTixRQUFRLEdBQUcsQ0FBQzs7Z0JBQ2QsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDOztnQkFDYixPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUk7O2dCQUNyQixJQUFJLEdBQUcsQ0FBQztZQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3JCLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRTtvQkFDZixRQUFRLEdBQUcsQ0FBQyxDQUFDO29CQUNiLE9BQU8sR0FBRyxDQUFDLENBQUM7b0JBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDVCxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNWO2dCQUNELElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRTtvQkFDZixRQUFRLEdBQUcsQ0FBQyxDQUFDO29CQUNiLE9BQU8sR0FBRyxDQUFDLENBQUM7b0JBQ1osSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDVCxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7WUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxFQUFFLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0MsRUFBRSxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUM7YUFDekI7U0FDRjs7WUFDRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRTs7WUFDNUIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTO1FBQy9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDbkQsSUFBSSxFQUFFLEdBQUcsR0FBRztZQUFFLEVBQUUsSUFBSSxHQUFHLENBQUM7YUFDbkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUM5QixNQUFNLENBQUMsd0JBQXdCLENBQzdCLEVBQUUsRUFDRixFQUFFLEVBQ0YsUUFBUSxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQ3JCLEVBQUUsRUFDRixNQUFNLENBQUMsT0FBTyxFQUNkLENBQUMsRUFDRCxDQUFDLENBQ0YsQ0FBQztRQUNGLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO1FBQzFFLElBQUksRUFBRSxHQUFHLEdBQUc7WUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO2FBQ25CLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRztZQUFFLEVBQUUsSUFBSSxHQUFHLENBQUM7UUFDOUIsS0FBSyxDQUFDLHdCQUF3QixDQUM1QixFQUFFLEVBQ0YsRUFBRSxFQUNGLFFBQVEsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUNyQixLQUFLLENBQUMsT0FBTyxFQUNiLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLE9BQU8sRUFDYixLQUFLLENBQUMsT0FBTyxDQUNkLENBQUM7SUFDSixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBcFRELElBb1RDOzs7O0lBblRDLDRCQUF1Qjs7SUFDdkIsNkJBQW1COztJQUNuQiw4QkFBYTs7SUFDYixxQ0FBa0I7O0lBQ2xCLGdDQUFpQjs7SUFDakIsK0JBQWdCOztJQUNoQiwyQkFBUTs7SUFDUixnQ0FBYTs7SUFDYiw4QkFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgSWtDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL0lrQ29uc3RyYWludERhdGFcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuL0JvbmVcIjtcclxuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJa0NvbnN0cmFpbnQgaW1wbGVtZW50cyBVcGRhdGFibGUge1xyXG4gIGRhdGE6IElrQ29uc3RyYWludERhdGE7XHJcbiAgYm9uZXM6IEFycmF5PEJvbmU+O1xyXG4gIHRhcmdldDogQm9uZTtcclxuICBiZW5kRGlyZWN0aW9uID0gMDtcclxuICBjb21wcmVzcyA9IGZhbHNlO1xyXG4gIHN0cmV0Y2ggPSBmYWxzZTtcclxuICBtaXggPSAxO1xyXG4gIHNvZnRuZXNzID0gMDtcclxuICBhY3RpdmUgPSBmYWxzZTtcclxuICBjb25zdHJ1Y3RvcihkYXRhOiBJa0NvbnN0cmFpbnREYXRhLCBza2VsZXRvbjogU2tlbGV0b24pIHtcclxuICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImRhdGEgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgaWYgKHNrZWxldG9uID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLm1peCA9IGRhdGEubWl4O1xyXG4gICAgdGhpcy5zb2Z0bmVzcyA9IGRhdGEuc29mdG5lc3M7XHJcbiAgICB0aGlzLmJlbmREaXJlY3Rpb24gPSBkYXRhLmJlbmREaXJlY3Rpb247XHJcbiAgICB0aGlzLmNvbXByZXNzID0gZGF0YS5jb21wcmVzcztcclxuICAgIHRoaXMuc3RyZXRjaCA9IGRhdGEuc3RyZXRjaDtcclxuICAgIHRoaXMuYm9uZXMgPSBuZXcgQXJyYXk8Qm9uZT4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmZpbmRCb25lKGRhdGEuYm9uZXNbaV0ubmFtZSkpO1xyXG4gICAgdGhpcy50YXJnZXQgPSBza2VsZXRvbi5maW5kQm9uZShkYXRhLnRhcmdldC5uYW1lKTtcclxuICB9XHJcbiAgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgfVxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgbGV0IGJvbmVzID0gdGhpcy5ib25lcztcclxuICAgIHN3aXRjaCAoYm9uZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmFwcGx5MShcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWCxcclxuICAgICAgICAgIHRhcmdldC53b3JsZFksXHJcbiAgICAgICAgICB0aGlzLmNvbXByZXNzLFxyXG4gICAgICAgICAgdGhpcy5zdHJldGNoLFxyXG4gICAgICAgICAgdGhpcy5kYXRhLnVuaWZvcm0sXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLmFwcGx5MihcclxuICAgICAgICAgIGJvbmVzWzBdLFxyXG4gICAgICAgICAgYm9uZXNbMV0sXHJcbiAgICAgICAgICB0YXJnZXQud29ybGRYLFxyXG4gICAgICAgICAgdGFyZ2V0LndvcmxkWSxcclxuICAgICAgICAgIHRoaXMuYmVuZERpcmVjdGlvbixcclxuICAgICAgICAgIHRoaXMuc3RyZXRjaCxcclxuICAgICAgICAgIHRoaXMuc29mdG5lc3MsXHJcbiAgICAgICAgICB0aGlzLm1peFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKiBBZGp1c3RzIHRoZSBib25lIHJvdGF0aW9uIHNvIHRoZSB0aXAgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlIHRhcmdldCBpcyBzcGVjaWZpZWQgaW4gdGhlIHdvcmxkXHJcbiAgICogY29vcmRpbmF0ZSBzeXN0ZW0uICovXHJcbiAgYXBwbHkxKFxyXG4gICAgYm9uZTogQm9uZSxcclxuICAgIHRhcmdldFg6IG51bWJlcixcclxuICAgIHRhcmdldFk6IG51bWJlcixcclxuICAgIGNvbXByZXNzOiBib29sZWFuLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHVuaWZvcm06IGJvb2xlYW4sXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBwID0gYm9uZS5wYXJlbnQ7XHJcbiAgICBsZXQgaWQgPSAxIC8gKHAuYSAqIHAuZCAtIHAuYiAqIHAuYyk7XHJcbiAgICBsZXQgeCA9IHRhcmdldFggLSBwLndvcmxkWCxcclxuICAgICAgeSA9IHRhcmdldFkgLSBwLndvcmxkWTtcclxuICAgIGxldCB0eCA9ICh4ICogcC5kIC0geSAqIHAuYikgKiBpZCAtIGJvbmUuYXgsXHJcbiAgICAgIHR5ID0gKHkgKiBwLmEgLSB4ICogcC5jKSAqIGlkIC0gYm9uZS5heTtcclxuICAgIGxldCByb3RhdGlvbklLID1cclxuICAgICAgTWF0aC5hdGFuMih0eSwgdHgpICogTWF0aFV0aWxzLnJhZERlZyAtIGJvbmUuYXNoZWFyWCAtIGJvbmUuYXJvdGF0aW9uO1xyXG4gICAgaWYgKGJvbmUuYXNjYWxlWCA8IDApIHJvdGF0aW9uSUsgKz0gMTgwO1xyXG4gICAgaWYgKHJvdGF0aW9uSUsgPiAxODApIHJvdGF0aW9uSUsgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAocm90YXRpb25JSyA8IC0xODApIHJvdGF0aW9uSUsgKz0gMzYwO1xyXG4gICAgbGV0IHN4ID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICBzeSA9IGJvbmUuYXNjYWxlWTtcclxuICAgIGlmIChjb21wcmVzcyB8fCBzdHJldGNoKSB7XHJcbiAgICAgIGxldCBiID0gYm9uZS5kYXRhLmxlbmd0aCAqIHN4LFxyXG4gICAgICAgIGRkID0gTWF0aC5zcXJ0KHR4ICogdHggKyB0eSAqIHR5KTtcclxuICAgICAgaWYgKChjb21wcmVzcyAmJiBkZCA8IGIpIHx8IChzdHJldGNoICYmIGRkID4gYiAmJiBiID4gMC4wMDAxKSkge1xyXG4gICAgICAgIGxldCBzID0gKGRkIC8gYiAtIDEpICogYWxwaGEgKyAxO1xyXG4gICAgICAgIHN4ICo9IHM7XHJcbiAgICAgICAgaWYgKHVuaWZvcm0pIHN5ICo9IHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGJvbmUudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBib25lLmF4LFxyXG4gICAgICBib25lLmF5LFxyXG4gICAgICBib25lLmFyb3RhdGlvbiArIHJvdGF0aW9uSUsgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHN5LFxyXG4gICAgICBib25lLmFzaGVhclgsXHJcbiAgICAgIGJvbmUuYXNoZWFyWVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIEFkanVzdHMgdGhlIHBhcmVudCBhbmQgY2hpbGQgYm9uZSByb3RhdGlvbnMgc28gdGhlIHRpcCBvZiB0aGUgY2hpbGQgaXMgYXMgY2xvc2UgdG8gdGhlIHRhcmdldCBwb3NpdGlvbiBhcyBwb3NzaWJsZS4gVGhlXHJcbiAgICogdGFyZ2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcbiAgICogQHBhcmFtIGNoaWxkIEEgZGlyZWN0IGRlc2NlbmRhbnQgb2YgdGhlIHBhcmVudCBib25lLiAqL1xyXG4gIGFwcGx5MihcclxuICAgIHBhcmVudDogQm9uZSxcclxuICAgIGNoaWxkOiBCb25lLFxyXG4gICAgdGFyZ2V0WDogbnVtYmVyLFxyXG4gICAgdGFyZ2V0WTogbnVtYmVyLFxyXG4gICAgYmVuZERpcjogbnVtYmVyLFxyXG4gICAgc3RyZXRjaDogYm9vbGVhbixcclxuICAgIHNvZnRuZXNzOiBudW1iZXIsXHJcbiAgICBhbHBoYTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAoYWxwaGEgPT0gMCkge1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXBhcmVudC5hcHBsaWVkVmFsaWQpIHBhcmVudC51cGRhdGVBcHBsaWVkVHJhbnNmb3JtKCk7XHJcbiAgICBpZiAoIWNoaWxkLmFwcGxpZWRWYWxpZCkgY2hpbGQudXBkYXRlQXBwbGllZFRyYW5zZm9ybSgpO1xyXG4gICAgbGV0IHB4ID0gcGFyZW50LmF4LFxyXG4gICAgICBweSA9IHBhcmVudC5heSxcclxuICAgICAgcHN4ID0gcGFyZW50LmFzY2FsZVgsXHJcbiAgICAgIHN4ID0gcHN4LFxyXG4gICAgICBwc3kgPSBwYXJlbnQuYXNjYWxlWSxcclxuICAgICAgY3N4ID0gY2hpbGQuYXNjYWxlWDtcclxuICAgIGxldCBvczEgPSAwLFxyXG4gICAgICBvczIgPSAwLFxyXG4gICAgICBzMiA9IDA7XHJcbiAgICBpZiAocHN4IDwgMCkge1xyXG4gICAgICBwc3ggPSAtcHN4O1xyXG4gICAgICBvczEgPSAxODA7XHJcbiAgICAgIHMyID0gLTE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvczEgPSAwO1xyXG4gICAgICBzMiA9IDE7XHJcbiAgICB9XHJcbiAgICBpZiAocHN5IDwgMCkge1xyXG4gICAgICBwc3kgPSAtcHN5O1xyXG4gICAgICBzMiA9IC1zMjtcclxuICAgIH1cclxuICAgIGlmIChjc3ggPCAwKSB7XHJcbiAgICAgIGNzeCA9IC1jc3g7XHJcbiAgICAgIG9zMiA9IDE4MDtcclxuICAgIH0gZWxzZSBvczIgPSAwO1xyXG4gICAgbGV0IGN4ID0gY2hpbGQuYXgsXHJcbiAgICAgIGN5ID0gMCxcclxuICAgICAgY3d4ID0gMCxcclxuICAgICAgY3d5ID0gMCxcclxuICAgICAgYSA9IHBhcmVudC5hLFxyXG4gICAgICBiID0gcGFyZW50LmIsXHJcbiAgICAgIGMgPSBwYXJlbnQuYyxcclxuICAgICAgZCA9IHBhcmVudC5kO1xyXG4gICAgbGV0IHUgPSBNYXRoLmFicyhwc3ggLSBwc3kpIDw9IDAuMDAwMTtcclxuICAgIGlmICghdSkge1xyXG4gICAgICBjeSA9IDA7XHJcbiAgICAgIGN3eCA9IGEgKiBjeCArIHBhcmVudC53b3JsZFg7XHJcbiAgICAgIGN3eSA9IGMgKiBjeCArIHBhcmVudC53b3JsZFk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjeSA9IGNoaWxkLmF5O1xyXG4gICAgICBjd3ggPSBhICogY3ggKyBiICogY3kgKyBwYXJlbnQud29ybGRYO1xyXG4gICAgICBjd3kgPSBjICogY3ggKyBkICogY3kgKyBwYXJlbnQud29ybGRZO1xyXG4gICAgfVxyXG4gICAgbGV0IHBwID0gcGFyZW50LnBhcmVudDtcclxuICAgIGEgPSBwcC5hO1xyXG4gICAgYiA9IHBwLmI7XHJcbiAgICBjID0gcHAuYztcclxuICAgIGQgPSBwcC5kO1xyXG4gICAgbGV0IGlkID0gMSAvIChhICogZCAtIGIgKiBjKSxcclxuICAgICAgeCA9IGN3eCAtIHBwLndvcmxkWCxcclxuICAgICAgeSA9IGN3eSAtIHBwLndvcmxkWTtcclxuICAgIGxldCBkeCA9ICh4ICogZCAtIHkgKiBiKSAqIGlkIC0gcHgsXHJcbiAgICAgIGR5ID0gKHkgKiBhIC0geCAqIGMpICogaWQgLSBweTtcclxuICAgIGxldCBsMSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSksXHJcbiAgICAgIGwyID0gY2hpbGQuZGF0YS5sZW5ndGggKiBjc3gsXHJcbiAgICAgIGExLFxyXG4gICAgICBhMjtcclxuICAgIGlmIChsMSA8IDAuMDAwMSkge1xyXG4gICAgICB0aGlzLmFwcGx5MShwYXJlbnQsIHRhcmdldFgsIHRhcmdldFksIGZhbHNlLCBzdHJldGNoLCBmYWxzZSwgYWxwaGEpO1xyXG4gICAgICBjaGlsZC51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgY3gsXHJcbiAgICAgICAgY3ksXHJcbiAgICAgICAgMCxcclxuICAgICAgICBjaGlsZC5hc2NhbGVYLFxyXG4gICAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgICAgY2hpbGQuYXNoZWFyWCxcclxuICAgICAgICBjaGlsZC5hc2hlYXJZXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHggPSB0YXJnZXRYIC0gcHAud29ybGRYO1xyXG4gICAgeSA9IHRhcmdldFkgLSBwcC53b3JsZFk7XHJcbiAgICBsZXQgdHggPSAoeCAqIGQgLSB5ICogYikgKiBpZCAtIHB4LFxyXG4gICAgICB0eSA9ICh5ICogYSAtIHggKiBjKSAqIGlkIC0gcHk7XHJcbiAgICBsZXQgZGQgPSB0eCAqIHR4ICsgdHkgKiB0eTtcclxuICAgIGlmIChzb2Z0bmVzcyAhPSAwKSB7XHJcbiAgICAgIHNvZnRuZXNzICo9IChwc3ggKiAoY3N4ICsgMSkpIC8gMjtcclxuICAgICAgbGV0IHRkID0gTWF0aC5zcXJ0KGRkKSxcclxuICAgICAgICBzZCA9IHRkIC0gbDEgLSBsMiAqIHBzeCArIHNvZnRuZXNzO1xyXG4gICAgICBpZiAoc2QgPiAwKSB7XHJcbiAgICAgICAgbGV0IHAgPSBNYXRoLm1pbigxLCBzZCAvIChzb2Z0bmVzcyAqIDIpKSAtIDE7XHJcbiAgICAgICAgcCA9IChzZCAtIHNvZnRuZXNzICogKDEgLSBwICogcCkpIC8gdGQ7XHJcbiAgICAgICAgdHggLT0gcCAqIHR4O1xyXG4gICAgICAgIHR5IC09IHAgKiB0eTtcclxuICAgICAgICBkZCA9IHR4ICogdHggKyB0eSAqIHR5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBvdXRlcjogaWYgKHUpIHtcclxuICAgICAgbDIgKj0gcHN4O1xyXG4gICAgICBsZXQgY29zID0gKGRkIC0gbDEgKiBsMSAtIGwyICogbDIpIC8gKDIgKiBsMSAqIGwyKTtcclxuICAgICAgaWYgKGNvcyA8IC0xKSBjb3MgPSAtMTtcclxuICAgICAgZWxzZSBpZiAoY29zID4gMSkge1xyXG4gICAgICAgIGNvcyA9IDE7XHJcbiAgICAgICAgaWYgKHN0cmV0Y2gpIHN4ICo9IChNYXRoLnNxcnQoZGQpIC8gKGwxICsgbDIpIC0gMSkgKiBhbHBoYSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgYTIgPSBNYXRoLmFjb3MoY29zKSAqIGJlbmREaXI7XHJcbiAgICAgIGEgPSBsMSArIGwyICogY29zO1xyXG4gICAgICBiID0gbDIgKiBNYXRoLnNpbihhMik7XHJcbiAgICAgIGExID0gTWF0aC5hdGFuMih0eSAqIGEgLSB0eCAqIGIsIHR4ICogYSArIHR5ICogYik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhID0gcHN4ICogbDI7XHJcbiAgICAgIGIgPSBwc3kgKiBsMjtcclxuICAgICAgbGV0IGFhID0gYSAqIGEsXHJcbiAgICAgICAgYmIgPSBiICogYixcclxuICAgICAgICB0YSA9IE1hdGguYXRhbjIodHksIHR4KTtcclxuICAgICAgYyA9IGJiICogbDEgKiBsMSArIGFhICogZGQgLSBhYSAqIGJiO1xyXG4gICAgICBsZXQgYzEgPSAtMiAqIGJiICogbDEsXHJcbiAgICAgICAgYzIgPSBiYiAtIGFhO1xyXG4gICAgICBkID0gYzEgKiBjMSAtIDQgKiBjMiAqIGM7XHJcbiAgICAgIGlmIChkID49IDApIHtcclxuICAgICAgICBsZXQgcSA9IE1hdGguc3FydChkKTtcclxuICAgICAgICBpZiAoYzEgPCAwKSBxID0gLXE7XHJcbiAgICAgICAgcSA9IC0oYzEgKyBxKSAvIDI7XHJcbiAgICAgICAgbGV0IHIwID0gcSAvIGMyLFxyXG4gICAgICAgICAgcjEgPSBjIC8gcTtcclxuICAgICAgICBsZXQgciA9IE1hdGguYWJzKHIwKSA8IE1hdGguYWJzKHIxKSA/IHIwIDogcjE7XHJcbiAgICAgICAgaWYgKHIgKiByIDw9IGRkKSB7XHJcbiAgICAgICAgICB5ID0gTWF0aC5zcXJ0KGRkIC0gciAqIHIpICogYmVuZERpcjtcclxuICAgICAgICAgIGExID0gdGEgLSBNYXRoLmF0YW4yKHksIHIpO1xyXG4gICAgICAgICAgYTIgPSBNYXRoLmF0YW4yKHkgLyBwc3ksIChyIC0gbDEpIC8gcHN4KTtcclxuICAgICAgICAgIGJyZWFrIG91dGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbWluQW5nbGUgPSBNYXRoVXRpbHMuUEksXHJcbiAgICAgICAgbWluWCA9IGwxIC0gYSxcclxuICAgICAgICBtaW5EaXN0ID0gbWluWCAqIG1pblgsXHJcbiAgICAgICAgbWluWSA9IDA7XHJcbiAgICAgIGxldCBtYXhBbmdsZSA9IDAsXHJcbiAgICAgICAgbWF4WCA9IGwxICsgYSxcclxuICAgICAgICBtYXhEaXN0ID0gbWF4WCAqIG1heFgsXHJcbiAgICAgICAgbWF4WSA9IDA7XHJcbiAgICAgIGMgPSAoLWEgKiBsMSkgLyAoYWEgLSBiYik7XHJcbiAgICAgIGlmIChjID49IC0xICYmIGMgPD0gMSkge1xyXG4gICAgICAgIGMgPSBNYXRoLmFjb3MoYyk7XHJcbiAgICAgICAgeCA9IGEgKiBNYXRoLmNvcyhjKSArIGwxO1xyXG4gICAgICAgIHkgPSBiICogTWF0aC5zaW4oYyk7XHJcbiAgICAgICAgZCA9IHggKiB4ICsgeSAqIHk7XHJcbiAgICAgICAgaWYgKGQgPCBtaW5EaXN0KSB7XHJcbiAgICAgICAgICBtaW5BbmdsZSA9IGM7XHJcbiAgICAgICAgICBtaW5EaXN0ID0gZDtcclxuICAgICAgICAgIG1pblggPSB4O1xyXG4gICAgICAgICAgbWluWSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkID4gbWF4RGlzdCkge1xyXG4gICAgICAgICAgbWF4QW5nbGUgPSBjO1xyXG4gICAgICAgICAgbWF4RGlzdCA9IGQ7XHJcbiAgICAgICAgICBtYXhYID0geDtcclxuICAgICAgICAgIG1heFkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZGQgPD0gKG1pbkRpc3QgKyBtYXhEaXN0KSAvIDIpIHtcclxuICAgICAgICBhMSA9IHRhIC0gTWF0aC5hdGFuMihtaW5ZICogYmVuZERpciwgbWluWCk7XHJcbiAgICAgICAgYTIgPSBtaW5BbmdsZSAqIGJlbmREaXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYTEgPSB0YSAtIE1hdGguYXRhbjIobWF4WSAqIGJlbmREaXIsIG1heFgpO1xyXG4gICAgICAgIGEyID0gbWF4QW5nbGUgKiBiZW5kRGlyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3MgPSBNYXRoLmF0YW4yKGN5LCBjeCkgKiBzMjtcclxuICAgIGxldCByb3RhdGlvbiA9IHBhcmVudC5hcm90YXRpb247XHJcbiAgICBhMSA9IChhMSAtIG9zKSAqIE1hdGhVdGlscy5yYWREZWcgKyBvczEgLSByb3RhdGlvbjtcclxuICAgIGlmIChhMSA+IDE4MCkgYTEgLT0gMzYwO1xyXG4gICAgZWxzZSBpZiAoYTEgPCAtMTgwKSBhMSArPSAzNjA7XHJcbiAgICBwYXJlbnQudXBkYXRlV29ybGRUcmFuc2Zvcm1XaXRoKFxyXG4gICAgICBweCxcclxuICAgICAgcHksXHJcbiAgICAgIHJvdGF0aW9uICsgYTEgKiBhbHBoYSxcclxuICAgICAgc3gsXHJcbiAgICAgIHBhcmVudC5hc2NhbGVZLFxyXG4gICAgICAwLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gICAgcm90YXRpb24gPSBjaGlsZC5hcm90YXRpb247XHJcbiAgICBhMiA9ICgoYTIgKyBvcykgKiBNYXRoVXRpbHMucmFkRGVnIC0gY2hpbGQuYXNoZWFyWCkgKiBzMiArIG9zMiAtIHJvdGF0aW9uO1xyXG4gICAgaWYgKGEyID4gMTgwKSBhMiAtPSAzNjA7XHJcbiAgICBlbHNlIGlmIChhMiA8IC0xODApIGEyICs9IDM2MDtcclxuICAgIGNoaWxkLnVwZGF0ZVdvcmxkVHJhbnNmb3JtV2l0aChcclxuICAgICAgY3gsXHJcbiAgICAgIGN5LFxyXG4gICAgICByb3RhdGlvbiArIGEyICogYWxwaGEsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVgsXHJcbiAgICAgIGNoaWxkLmFzY2FsZVksXHJcbiAgICAgIGNoaWxkLmFzaGVhclgsXHJcbiAgICAgIGNoaWxkLmFzaGVhcllcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==