ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
382 lines • 44.9 kB
JavaScript
/**
* @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 { Color, Utils } from "../core/Utils";
import { ManagedWebGLRenderingContext } from "./WebGL";
import { SkeletonBounds } from "../core/SkeletonBounds";
import { RegionAttachment } from "../core/attachments/RegionAttachment";
import { MeshAttachment } from "../core/attachments/MeshAttachment";
import { PathAttachment } from "../core/attachments/PathAttachment";
import { ClippingAttachment } from "../core/attachments/ClippingAttachment";
export class SkeletonDebugRenderer {
/**
* @param {?} context
*/
constructor(context) {
this.boneLineColor = new Color(1, 0, 0, 1);
this.boneOriginColor = new Color(0, 1, 0, 1);
this.attachmentLineColor = new Color(0, 0, 1, 0.5);
this.triangleLineColor = new Color(1, 0.64, 0, 0.5);
this.pathColor = new Color().setFromString("FF7F00");
this.clipColor = new Color(0.8, 0, 0, 2);
this.aabbColor = new Color(0, 1, 0, 0.5);
this.drawBones = true;
this.drawRegionAttachments = true;
this.drawBoundingBoxes = true;
this.drawMeshHull = true;
this.drawMeshTriangles = true;
this.drawPaths = true;
this.drawSkeletonXY = false;
this.drawClipping = true;
this.premultipliedAlpha = false;
this.scale = 1;
this.boneWidth = 2;
this.bounds = new SkeletonBounds();
this.temp = new Array();
this.vertices = Utils.newFloatArray(2 * 1024);
this.context =
context instanceof ManagedWebGLRenderingContext
? context
: new ManagedWebGLRenderingContext(context);
}
/**
* @param {?} shapes
* @param {?} skeleton
* @param {?=} ignoredBones
* @return {?}
*/
draw(shapes, skeleton, ignoredBones = null) {
/** @type {?} */
let skeletonX = skeleton.x;
/** @type {?} */
let skeletonY = skeleton.y;
/** @type {?} */
let gl = this.context.gl;
/** @type {?} */
let srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA;
shapes.setBlendMode(srcFunc, gl.ONE_MINUS_SRC_ALPHA);
/** @type {?} */
let bones = skeleton.bones;
if (this.drawBones) {
shapes.setColor(this.boneLineColor);
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1)
continue;
if (bone.parent == null)
continue;
/** @type {?} */
let x = skeletonX + bone.data.length * bone.a + bone.worldX;
/** @type {?} */
let y = skeletonY + bone.data.length * bone.c + bone.worldY;
shapes.rectLine(true, skeletonX + bone.worldX, skeletonY + bone.worldY, x, y, this.boneWidth * this.scale);
}
if (this.drawSkeletonXY)
shapes.x(skeletonX, skeletonY, 4 * this.scale);
}
if (this.drawRegionAttachments) {
shapes.setColor(this.attachmentLineColor);
/** @type {?} */
let slots = skeleton.slots;
for (let i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
let slot = slots[i];
/** @type {?} */
let attachment = slot.getAttachment();
if (attachment instanceof RegionAttachment) {
/** @type {?} */
let regionAttachment = (/** @type {?} */ (attachment));
/** @type {?} */
let vertices = this.vertices;
regionAttachment.computeWorldVertices(slot.bone, vertices, 0, 2);
shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]);
shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]);
shapes.line(vertices[4], vertices[5], vertices[6], vertices[7]);
shapes.line(vertices[6], vertices[7], vertices[0], vertices[1]);
}
}
}
if (this.drawMeshHull || this.drawMeshTriangles) {
/** @type {?} */
let slots = skeleton.slots;
for (let i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
let slot = slots[i];
/** @type {?} */
let attachment = slot.getAttachment();
if (!(attachment instanceof MeshAttachment))
continue;
/** @type {?} */
let mesh = (/** @type {?} */ (attachment));
/** @type {?} */
let vertices = this.vertices;
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2);
/** @type {?} */
let triangles = mesh.triangles;
/** @type {?} */
let hullLength = mesh.hullLength;
if (this.drawMeshTriangles) {
shapes.setColor(this.triangleLineColor);
for (let ii = 0, nn = triangles.length; ii < nn; ii += 3) {
/** @type {?} */
let v1 = triangles[ii] * 2;
/** @type {?} */
let v2 = triangles[ii + 1] * 2;
/** @type {?} */
let v3 = triangles[ii + 2] * 2;
shapes.triangle(false, vertices[v1], vertices[v1 + 1], //
vertices[v2], vertices[v2 + 1], //
vertices[v3], vertices[v3 + 1] //
);
}
}
if (this.drawMeshHull && hullLength > 0) {
shapes.setColor(this.attachmentLineColor);
hullLength = (hullLength >> 1) * 2;
/** @type {?} */
let lastX = vertices[hullLength - 2];
/** @type {?} */
let lastY = vertices[hullLength - 1];
for (let ii = 0, nn = hullLength; ii < nn; ii += 2) {
/** @type {?} */
let x = vertices[ii];
/** @type {?} */
let y = vertices[ii + 1];
shapes.line(x, y, lastX, lastY);
lastX = x;
lastY = y;
}
}
}
}
if (this.drawBoundingBoxes) {
/** @type {?} */
let bounds = this.bounds;
bounds.update(skeleton, true);
shapes.setColor(this.aabbColor);
shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight());
/** @type {?} */
let polygons = bounds.polygons;
/** @type {?} */
let boxes = bounds.boundingBoxes;
for (let i = 0, n = polygons.length; i < n; i++) {
/** @type {?} */
let polygon = polygons[i];
shapes.setColor(boxes[i].color);
shapes.polygon(polygon, 0, polygon.length);
}
}
if (this.drawPaths) {
/** @type {?} */
let slots = skeleton.slots;
for (let i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
let slot = slots[i];
/** @type {?} */
let attachment = slot.getAttachment();
if (!(attachment instanceof PathAttachment))
continue;
/** @type {?} */
let path = (/** @type {?} */ (attachment));
/** @type {?} */
let nn = path.worldVerticesLength;
/** @type {?} */
let world = (this.temp = Utils.setArraySize(this.temp, nn, 0));
path.computeWorldVertices(slot, 0, nn, world, 0, 2);
/** @type {?} */
let color = this.pathColor;
/** @type {?} */
let x1 = world[2];
/** @type {?} */
let y1 = world[3];
/** @type {?} */
let x2 = 0;
/** @type {?} */
let y2 = 0;
if (path.closed) {
shapes.setColor(color);
/** @type {?} */
let cx1 = world[0];
/** @type {?} */
let cy1 = world[1];
/** @type {?} */
let cx2 = world[nn - 2];
/** @type {?} */
let cy2 = world[nn - 1];
x2 = world[nn - 4];
y2 = world[nn - 3];
shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32);
shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY);
shapes.line(x1, y1, cx1, cy1);
shapes.line(x2, y2, cx2, cy2);
}
nn -= 4;
for (let ii = 4; ii < nn; ii += 6) {
/** @type {?} */
let cx1 = world[ii];
/** @type {?} */
let cy1 = world[ii + 1];
/** @type {?} */
let cx2 = world[ii + 2];
/** @type {?} */
let cy2 = world[ii + 3];
x2 = world[ii + 4];
y2 = world[ii + 5];
shapes.setColor(color);
shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32);
shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY);
shapes.line(x1, y1, cx1, cy1);
shapes.line(x2, y2, cx2, cy2);
x1 = x2;
y1 = y2;
}
}
}
if (this.drawBones) {
shapes.setColor(this.boneOriginColor);
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1)
continue;
shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8);
}
}
if (this.drawClipping) {
/** @type {?} */
let slots = skeleton.slots;
shapes.setColor(this.clipColor);
for (let i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
let slot = slots[i];
/** @type {?} */
let attachment = slot.getAttachment();
if (!(attachment instanceof ClippingAttachment))
continue;
/** @type {?} */
let clip = (/** @type {?} */ (attachment));
/** @type {?} */
let nn = clip.worldVerticesLength;
/** @type {?} */
let world = (this.temp = Utils.setArraySize(this.temp, nn, 0));
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
for (let i = 0, n = world.length; i < n; i += 2) {
/** @type {?} */
let x = world[i];
/** @type {?} */
let y = world[i + 1];
/** @type {?} */
let x2 = world[(i + 2) % world.length];
/** @type {?} */
let y2 = world[(i + 3) % world.length];
shapes.line(x, y, x2, y2);
}
}
}
}
/**
* @return {?}
*/
dispose() { }
}
SkeletonDebugRenderer.LIGHT_GRAY = new Color(192 / 255, 192 / 255, 192 / 255, 1);
SkeletonDebugRenderer.GREEN = new Color(0, 1, 0, 1);
if (false) {
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.LIGHT_GRAY;
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.GREEN;
/** @type {?} */
SkeletonDebugRenderer.prototype.boneLineColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.boneOriginColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.attachmentLineColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.triangleLineColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.pathColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.clipColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.aabbColor;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawBones;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawRegionAttachments;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawBoundingBoxes;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawMeshHull;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawMeshTriangles;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawPaths;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawSkeletonXY;
/** @type {?} */
SkeletonDebugRenderer.prototype.drawClipping;
/** @type {?} */
SkeletonDebugRenderer.prototype.premultipliedAlpha;
/** @type {?} */
SkeletonDebugRenderer.prototype.scale;
/** @type {?} */
SkeletonDebugRenderer.prototype.boneWidth;
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.prototype.context;
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.prototype.bounds;
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.prototype.temp;
/**
* @type {?}
* @private
*/
SkeletonDebugRenderer.prototype.vertices;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL3dlYmdsL1NrZWxldG9uRGVidWdSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFNUUsTUFBTSxPQUFPLHFCQUFxQjs7OztJQXlCaEMsWUFBWSxPQUE2RDtRQXhCekUsa0JBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxvQkFBZSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLHdCQUFtQixHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLHNCQUFpQixHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLGFBQWEs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QUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTs7NEJBQ3BELEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7NEJBQ3hCLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7OzRCQUMxQixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO3dCQUM1QixNQUFNLENBQUMsUUFBUSxDQUNiLEtBQUssRUFDTCxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ1osUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNwQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ1osUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNwQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ1osUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO3lCQUNwQixDQUFDO3FCQUNIO2lCQUNGO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUMxQyxVQUFVLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzt3QkFDL0IsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDOzt3QkFDbEMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO29CQUNsQyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTs7NEJBQzlDLENBQUMsR0FBRyxRQUFR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QUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7aUJBQzNCO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7SUFDRCxPQUFPLEtBQUksQ0FBQzs7QUE5TUcsZ0NBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCwyQkFBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7Ozs7SUFEN0MsaUNBQTBFOzs7OztJQUMxRSw0QkFBNkM7O0lBdkI3Qyw4Q0FBc0M7O0lBQ3RDLGdEQUF3Qzs7SUFDeEMsb0RBQThDOztJQUM5QyxrREFBK0M7O0lBQy9DLDBDQUFnRDs7SUFDaEQsMENBQW9DOztJQUNwQywwQ0FBb0M7O0lBQ3BDLDBDQUFpQjs7SUFDakIsc0RBQTZCOztJQUM3QixrREFBeUI7O0lBQ3pCLDZDQUFvQjs7SUFDcEIsa0RBQXlCOztJQUN6QiwwQ0FBaUI7O0lBQ2pCLCtDQUF1Qjs7SUFDdkIsNkNBQW9COztJQUNwQixtREFBMkI7O0lBQzNCLHNDQUFVOztJQUNWLDBDQUFjOzs7OztJQUNkLHdDQUE4Qzs7Ozs7SUFDOUMsdUNBQXNDOzs7OztJQUN0QyxxQ0FBbUM7Ozs7O0lBQ25DLHlDQUFpRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb2xvciwgVXRpbHMsIERpc3Bvc2FibGUgfSBmcm9tIFwiLi4vY29yZS9VdGlsc1wiO1xyXG5pbXBvcnQgeyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSBcIi4vV2ViR0xcIjtcclxuaW1wb3J0IHsgU2tlbGV0b25Cb3VuZHMgfSBmcm9tIFwiLi4vY29yZS9Ta2VsZXRvbkJvdW5kc1wiO1xyXG5pbXBvcnQgeyBTaGFwZVJlbmRlcmVyIH0gZnJvbSBcIi4vU2hhcGVSZW5kZXJlclwiO1xyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuLi9jb3JlL1NrZWxldG9uXCI7XHJcbmltcG9ydCB7IFJlZ2lvbkF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9SZWdpb25BdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IE1lc2hBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvTWVzaEF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgUGF0aEF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9QYXRoQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBDbGlwcGluZ0F0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9DbGlwcGluZ0F0dGFjaG1lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkRlYnVnUmVuZGVyZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBib25lTGluZUNvbG9yID0gbmV3IENvbG9yKDEsIDAsIDAsIDEpO1xyXG4gIGJvbmVPcmlnaW5Db2xvciA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcclxuICBhdHRhY2htZW50TGluZUNvbG9yID0gbmV3IENvbG9yKDAsIDAsIDEsIDAuNSk7XHJcbiAgdHJpYW5nbGVMaW5lQ29sb3IgPSBuZXcgQ29sb3IoMSwgMC42NCwgMCwgMC41KTtcclxuICBwYXRoQ29sb3IgPSBuZXcgQ29sb3IoKS5zZXRGcm9tU3RyaW5nKFwiRkY3RjAwXCIpO1xyXG4gIGNsaXBDb2xvciA9IG5ldyBDb2xvcigwLjgsIDAsIDAsIDIpO1xyXG4gIGFhYmJDb2xvciA9IG5ldyBDb2xvcigwLCAxLCAwLCAwLjUpO1xyXG4gIGRyYXdCb25lcyA9IHRydWU7XHJcbiAgZHJhd1JlZ2lvbkF0dGFjaG1lbnRzID0gdHJ1ZTtcclxuICBkcmF3Qm91bmRpbmdCb3hlcyA9IHRydWU7XHJcbiAgZHJhd01lc2hIdWxsID0gdHJ1ZTtcclxuICBkcmF3TWVzaFRyaWFuZ2xlcyA9IHRydWU7XHJcbiAgZHJhd1BhdGhzID0gdHJ1ZTtcclxuICBkcmF3U2tlbGV0b25YWSA9IGZhbHNlO1xyXG4gIGRyYXdDbGlwcGluZyA9IHRydWU7XHJcbiAgcHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XHJcbiAgc2NhbGUgPSAxO1xyXG4gIGJvbmVXaWR0aCA9IDI7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xyXG4gIHByaXZhdGUgYm91bmRzID0gbmV3IFNrZWxldG9uQm91bmRzKCk7XHJcbiAgcHJpdmF0ZSB0ZW1wID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICBwcml2YXRlIHZlcnRpY2VzID0gVXRpbHMubmV3RmxvYXRBcnJheSgyICogMTAyNCk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTElHSFRfR1JBWSA9IG5ldyBDb2xvcigxOTIgLyAyNTUsIDE5MiAvIDI1NSwgMTkyIC8gMjU1LCAxKTtcclxuICBwcml2YXRlIHN0YXRpYyBHUkVFTiA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPVxyXG4gICAgICBjb250ZXh0IGluc3RhbmNlb2YgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICAgICAgID8gY29udGV4dFxyXG4gICAgICAgIDogbmV3IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQoY29udGV4dCk7XHJcbiAgfVxyXG4gIGRyYXcoXHJcbiAgICBzaGFwZXM6IFNoYXBlUmVuZGVyZXIsXHJcbiAgICBza2VsZXRvbjogU2tlbGV0b24sXHJcbiAgICBpZ25vcmVkQm9uZXM6IEFycmF5PHN0cmluZz4gPSBudWxsXHJcbiAgKSB7XHJcbiAgICBsZXQgc2tlbGV0b25YID0gc2tlbGV0b24ueDtcclxuICAgIGxldCBza2VsZXRvblkgPSBza2VsZXRvbi55O1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgbGV0IHNyY0Z1bmMgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA/IGdsLk9ORSA6IGdsLlNSQ19BTFBIQTtcclxuICAgIHNoYXBlcy5zZXRCbGVuZE1vZGUoc3JjRnVuYywgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICBsZXQgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcclxuICAgIGlmICh0aGlzLmRyYXdCb25lcykge1xyXG4gICAgICBzaGFwZXMuc2V0Q29sb3IodGhpcy5ib25lTGluZUNvbG9yKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICAgIGlmIChpZ25vcmVkQm9uZXMgJiYgaWdub3JlZEJvbmVzLmluZGV4T2YoYm9uZS5kYXRhLm5hbWUpID4gLTEpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChib25lLnBhcmVudCA9PSBudWxsKSBjb250aW51ZTtcclxuICAgICAgICBsZXQgeCA9IHNrZWxldG9uWCArIGJvbmUuZGF0YS5sZW5ndGggKiBib25lLmEgKyBib25lLndvcmxkWDtcclxuICAgICAgICBsZXQgeSA9IHNrZWxldG9uWSArIGJvbmUuZGF0YS5sZW5ndGggKiBib25lLmMgKyBib25lLndvcmxkWTtcclxuICAgICAgICBzaGFwZXMucmVjdExpbmUoXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgc2tlbGV0b25YICsgYm9uZS53b3JsZFgsXHJcbiAgICAgICAgICBza2VsZXRvblkgKyBib25lLndvcmxkWSxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgdGhpcy5ib25lV2lkdGggKiB0aGlzLnNjYWxlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kcmF3U2tlbGV0b25YWSkgc2hhcGVzLngoc2tlbGV0b25YLCBza2VsZXRvblksIDQgKiB0aGlzLnNjYWxlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRyYXdSZWdpb25BdHRhY2htZW50cykge1xyXG4gICAgICBzaGFwZXMuc2V0Q29sb3IodGhpcy5hdHRhY2htZW50TGluZUNvbG9yKTtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xyXG4gICAgICAgICAgbGV0IHJlZ2lvbkF0dGFjaG1lbnQgPSA8UmVnaW9uQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgICAgbGV0IHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcclxuICAgICAgICAgIHJlZ2lvbkF0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdC5ib25lLCB2ZXJ0aWNlcywgMCwgMik7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh2ZXJ0aWNlc1swXSwgdmVydGljZXNbMV0sIHZlcnRpY2VzWzJdLCB2ZXJ0aWNlc1szXSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh2ZXJ0aWNlc1syXSwgdmVydGljZXNbM10sIHZlcnRpY2VzWzRdLCB2ZXJ0aWNlc1s1XSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh2ZXJ0aWNlc1s0XSwgdmVydGljZXNbNV0sIHZlcnRpY2VzWzZdLCB2ZXJ0aWNlc1s3XSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh2ZXJ0aWNlc1s2XSwgdmVydGljZXNbN10sIHZlcnRpY2VzWzBdLCB2ZXJ0aWNlc1sxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3TWVzaEh1bGwgfHwgdGhpcy5kcmF3TWVzaFRyaWFuZ2xlcykge1xyXG4gICAgICBsZXQgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBsZXQgc2xvdCA9IHNsb3RzW2ldO1xyXG4gICAgICAgIGxldCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XHJcbiAgICAgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSkgY29udGludWU7XHJcbiAgICAgICAgbGV0IG1lc2ggPSA8TWVzaEF0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICBsZXQgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xyXG4gICAgICAgIG1lc2guY29tcHV0ZVdvcmxkVmVydGljZXMoXHJcbiAgICAgICAgICBzbG90LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIG1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aCxcclxuICAgICAgICAgIHZlcnRpY2VzLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIDJcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCB0cmlhbmdsZXMgPSBtZXNoLnRyaWFuZ2xlcztcclxuICAgICAgICBsZXQgaHVsbExlbmd0aCA9IG1lc2guaHVsbExlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5kcmF3TWVzaFRyaWFuZ2xlcykge1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMudHJpYW5nbGVMaW5lQ29sb3IpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwLCBubiA9IHRyaWFuZ2xlcy5sZW5ndGg7IGlpIDwgbm47IGlpICs9IDMpIHtcclxuICAgICAgICAgICAgbGV0IHYxID0gdHJpYW5nbGVzW2lpXSAqIDIsXHJcbiAgICAgICAgICAgICAgdjIgPSB0cmlhbmdsZXNbaWkgKyAxXSAqIDIsXHJcbiAgICAgICAgICAgICAgdjMgPSB0cmlhbmdsZXNbaWkgKyAyXSAqIDI7XHJcbiAgICAgICAgICAgIHNoYXBlcy50cmlhbmdsZShcclxuICAgICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgICB2ZXJ0aWNlc1t2MV0sXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjEgKyAxXSwgLy9cclxuICAgICAgICAgICAgICB2ZXJ0aWNlc1t2Ml0sXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjIgKyAxXSwgLy9cclxuICAgICAgICAgICAgICB2ZXJ0aWNlc1t2M10sXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjMgKyAxXSAvL1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcmF3TWVzaEh1bGwgJiYgaHVsbExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLmF0dGFjaG1lbnRMaW5lQ29sb3IpO1xyXG4gICAgICAgICAgaHVsbExlbmd0aCA9IChodWxsTGVuZ3RoID4+IDEpICogMjtcclxuICAgICAgICAgIGxldCBsYXN0WCA9IHZlcnRpY2VzW2h1bGxMZW5ndGggLSAyXSxcclxuICAgICAgICAgICAgbGFzdFkgPSB2ZXJ0aWNlc1todWxsTGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBmb3IgKGxldCBpaSA9IDAsIG5uID0gaHVsbExlbmd0aDsgaWkgPCBubjsgaWkgKz0gMikge1xyXG4gICAgICAgICAgICBsZXQgeCA9IHZlcnRpY2VzW2lpXSxcclxuICAgICAgICAgICAgICB5ID0gdmVydGljZXNbaWkgKyAxXTtcclxuICAgICAgICAgICAgc2hhcGVzLmxpbmUoeCwgeSwgbGFzdFgsIGxhc3RZKTtcclxuICAgICAgICAgICAgbGFzdFggPSB4O1xyXG4gICAgICAgICAgICBsYXN0WSA9IHk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3Qm91bmRpbmdCb3hlcykge1xyXG4gICAgICBsZXQgYm91bmRzID0gdGhpcy5ib3VuZHM7XHJcbiAgICAgIGJvdW5kcy51cGRhdGUoc2tlbGV0b24sIHRydWUpO1xyXG4gICAgICBzaGFwZXMuc2V0Q29sb3IodGhpcy5hYWJiQ29sb3IpO1xyXG4gICAgICBzaGFwZXMucmVjdChcclxuICAgICAgICBmYWxzZSxcclxuICAgICAgICBib3VuZHMubWluWCxcclxuICAgICAgICBib3VuZHMubWluWSxcclxuICAgICAgICBib3VuZHMuZ2V0V2lkdGgoKSxcclxuICAgICAgICBib3VuZHMuZ2V0SGVpZ2h0KClcclxuICAgICAgKTtcclxuICAgICAgbGV0IHBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zO1xyXG4gICAgICBsZXQgYm94ZXMgPSBib3VuZHMuYm91bmRpbmdCb3hlcztcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBwb2x5Z29ucy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9seWdvbiA9IHBvbHlnb25zW2ldO1xyXG4gICAgICAgIHNoYXBlcy5zZXRDb2xvcihib3hlc1tpXS5jb2xvcik7XHJcbiAgICAgICAgc2hhcGVzLnBvbHlnb24ocG9seWdvbiwgMCwgcG9seWdvbi5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3UGF0aHMpIHtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBQYXRoQXR0YWNobWVudCkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBwYXRoID0gPFBhdGhBdHRhY2htZW50PmF0dGFjaG1lbnQ7XHJcbiAgICAgICAgbGV0IG5uID0gcGF0aC53b3JsZFZlcnRpY2VzTGVuZ3RoO1xyXG4gICAgICAgIGxldCB3b3JsZCA9ICh0aGlzLnRlbXAgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy50ZW1wLCBubiwgMCkpO1xyXG4gICAgICAgIHBhdGguY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbm4sIHdvcmxkLCAwLCAyKTtcclxuICAgICAgICBsZXQgY29sb3IgPSB0aGlzLnBhdGhDb2xvcjtcclxuICAgICAgICBsZXQgeDEgPSB3b3JsZFsyXSxcclxuICAgICAgICAgIHkxID0gd29ybGRbM10sXHJcbiAgICAgICAgICB4MiA9IDAsXHJcbiAgICAgICAgICB5MiA9IDA7XHJcbiAgICAgICAgaWYgKHBhdGguY2xvc2VkKSB7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgbGV0IGN4MSA9IHdvcmxkWzBdLFxyXG4gICAgICAgICAgICBjeTEgPSB3b3JsZFsxXSxcclxuICAgICAgICAgICAgY3gyID0gd29ybGRbbm4gLSAyXSxcclxuICAgICAgICAgICAgY3kyID0gd29ybGRbbm4gLSAxXTtcclxuICAgICAgICAgIHgyID0gd29ybGRbbm4gLSA0XTtcclxuICAgICAgICAgIHkyID0gd29ybGRbbm4gLSAzXTtcclxuICAgICAgICAgIHNoYXBlcy5jdXJ2ZSh4MSwgeTEsIGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyLCAzMik7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IoU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLkxJR0hUX0dSQVkpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeDEsIHkxLCBjeDEsIGN5MSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh4MiwgeTIsIGN4MiwgY3kyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm4gLT0gNDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDQ7IGlpIDwgbm47IGlpICs9IDYpIHtcclxuICAgICAgICAgIGxldCBjeDEgPSB3b3JsZFtpaV0sXHJcbiAgICAgICAgICAgIGN5MSA9IHdvcmxkW2lpICsgMV0sXHJcbiAgICAgICAgICAgIGN4MiA9IHdvcmxkW2lpICsgMl0sXHJcbiAgICAgICAgICAgIGN5MiA9IHdvcmxkW2lpICsgM107XHJcbiAgICAgICAgICB4MiA9IHdvcmxkW2lpICsgNF07XHJcbiAgICAgICAgICB5MiA9IHdvcmxkW2lpICsgNV07XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgc2hhcGVzLmN1cnZlKHgxLCB5MSwgY3gxLCBjeTEsIGN4MiwgY3kyLCB4MiwgeTIsIDMyKTtcclxuICAgICAgICAgIHNoYXBlcy5zZXRDb2xvcihTa2VsZXRvbkRlYnVnUmVuZGVyZXIuTElHSFRfR1JBWSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh4MSwgeTEsIGN4MSwgY3kxKTtcclxuICAgICAgICAgIHNoYXBlcy5saW5lKHgyLCB5MiwgY3gyLCBjeTIpO1xyXG4gICAgICAgICAgeDEgPSB4MjtcclxuICAgICAgICAgIHkxID0geTI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3Qm9uZXMpIHtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYm9uZU9yaWdpbkNvbG9yKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICAgIGlmIChpZ25vcmVkQm9uZXMgJiYgaWdub3JlZEJvbmVzLmluZGV4T2YoYm9uZS5kYXRhLm5hbWUpID4gLTEpIGNvbnRpbnVlO1xyXG4gICAgICAgIHNoYXBlcy5jaXJjbGUoXHJcbiAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgc2tlbGV0b25YICsgYm9uZS53b3JsZFgsXHJcbiAgICAgICAgICBza2VsZXRvblkgKyBib25lLndvcmxkWSxcclxuICAgICAgICAgIDMgKiB0aGlzLnNjYWxlLFxyXG4gICAgICAgICAgU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLkdSRUVOLFxyXG4gICAgICAgICAgOFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRyYXdDbGlwcGluZykge1xyXG4gICAgICBsZXQgc2xvdHMgPSBza2VsZXRvbi5zbG90cztcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuY2xpcENvbG9yKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBsZXQgc2xvdCA9IHNsb3RzW2ldO1xyXG4gICAgICAgIGxldCBhdHRhY2htZW50ID0gc2xvdC5nZXRBdHRhY2htZW50KCk7XHJcbiAgICAgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIENsaXBwaW5nQXR0YWNobWVudCkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBjbGlwID0gPENsaXBwaW5nQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIGxldCBubiA9IGNsaXAud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgICAgICBsZXQgd29ybGQgPSAodGhpcy50ZW1wID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMudGVtcCwgbm4sIDApKTtcclxuICAgICAgICBjbGlwLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIDAsIG5uLCB3b3JsZCwgMCwgMik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSB3b3JsZC5sZW5ndGg7IGkgPCBuOyBpICs9IDIpIHtcclxuICAgICAgICAgIGxldCB4ID0gd29ybGRbaV07XHJcbiAgICAgICAgICBsZXQgeSA9IHdvcmxkW2kgKyAxXTtcclxuICAgICAgICAgIGxldCB4MiA9IHdvcmxkWyhpICsgMikgJSB3b3JsZC5sZW5ndGhdO1xyXG4gICAgICAgICAgbGV0IHkyID0gd29ybGRbKGkgKyAzKSAlIHdvcmxkLmxlbmd0aF07XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh4LCB5LCB4MiwgeTIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBkaXNwb3NlKCkge31cclxufVxyXG4iXX0=