ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
391 lines • 45.4 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";
var SkeletonDebugRenderer = /** @class */ (function () {
function SkeletonDebugRenderer(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 {?}
*/
SkeletonDebugRenderer.prototype.draw = /**
* @param {?} shapes
* @param {?} skeleton
* @param {?=} ignoredBones
* @return {?}
*/
function (shapes, skeleton, ignoredBones) {
if (ignoredBones === void 0) { ignoredBones = null; }
/** @type {?} */
var skeletonX = skeleton.x;
/** @type {?} */
var skeletonY = skeleton.y;
/** @type {?} */
var gl = this.context.gl;
/** @type {?} */
var srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA;
shapes.setBlendMode(srcFunc, gl.ONE_MINUS_SRC_ALPHA);
/** @type {?} */
var bones = skeleton.bones;
if (this.drawBones) {
shapes.setColor(this.boneLineColor);
for (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var bone = bones[i];
if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1)
continue;
if (bone.parent == null)
continue;
/** @type {?} */
var x = skeletonX + bone.data.length * bone.a + bone.worldX;
/** @type {?} */
var 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 {?} */
var slots = skeleton.slots;
for (var i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
var slot = slots[i];
/** @type {?} */
var attachment = slot.getAttachment();
if (attachment instanceof RegionAttachment) {
/** @type {?} */
var regionAttachment = (/** @type {?} */ (attachment));
/** @type {?} */
var 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 {?} */
var slots = skeleton.slots;
for (var i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
var slot = slots[i];
/** @type {?} */
var attachment = slot.getAttachment();
if (!(attachment instanceof MeshAttachment))
continue;
/** @type {?} */
var mesh = (/** @type {?} */ (attachment));
/** @type {?} */
var vertices = this.vertices;
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2);
/** @type {?} */
var triangles = mesh.triangles;
/** @type {?} */
var hullLength = mesh.hullLength;
if (this.drawMeshTriangles) {
shapes.setColor(this.triangleLineColor);
for (var ii = 0, nn = triangles.length; ii < nn; ii += 3) {
/** @type {?} */
var v1 = triangles[ii] * 2;
/** @type {?} */
var v2 = triangles[ii + 1] * 2;
/** @type {?} */
var 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 {?} */
var lastX = vertices[hullLength - 2];
/** @type {?} */
var lastY = vertices[hullLength - 1];
for (var ii = 0, nn = hullLength; ii < nn; ii += 2) {
/** @type {?} */
var x = vertices[ii];
/** @type {?} */
var y = vertices[ii + 1];
shapes.line(x, y, lastX, lastY);
lastX = x;
lastY = y;
}
}
}
}
if (this.drawBoundingBoxes) {
/** @type {?} */
var bounds = this.bounds;
bounds.update(skeleton, true);
shapes.setColor(this.aabbColor);
shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight());
/** @type {?} */
var polygons = bounds.polygons;
/** @type {?} */
var boxes = bounds.boundingBoxes;
for (var i = 0, n = polygons.length; i < n; i++) {
/** @type {?} */
var polygon = polygons[i];
shapes.setColor(boxes[i].color);
shapes.polygon(polygon, 0, polygon.length);
}
}
if (this.drawPaths) {
/** @type {?} */
var slots = skeleton.slots;
for (var i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
var slot = slots[i];
/** @type {?} */
var attachment = slot.getAttachment();
if (!(attachment instanceof PathAttachment))
continue;
/** @type {?} */
var path = (/** @type {?} */ (attachment));
/** @type {?} */
var nn = path.worldVerticesLength;
/** @type {?} */
var world = (this.temp = Utils.setArraySize(this.temp, nn, 0));
path.computeWorldVertices(slot, 0, nn, world, 0, 2);
/** @type {?} */
var color = this.pathColor;
/** @type {?} */
var x1 = world[2];
/** @type {?} */
var y1 = world[3];
/** @type {?} */
var x2 = 0;
/** @type {?} */
var y2 = 0;
if (path.closed) {
shapes.setColor(color);
/** @type {?} */
var cx1 = world[0];
/** @type {?} */
var cy1 = world[1];
/** @type {?} */
var cx2 = world[nn - 2];
/** @type {?} */
var 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 (var ii = 4; ii < nn; ii += 6) {
/** @type {?} */
var cx1 = world[ii];
/** @type {?} */
var cy1 = world[ii + 1];
/** @type {?} */
var cx2 = world[ii + 2];
/** @type {?} */
var 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 (var i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
var 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 {?} */
var slots = skeleton.slots;
shapes.setColor(this.clipColor);
for (var i = 0, n = slots.length; i < n; i++) {
/** @type {?} */
var slot = slots[i];
/** @type {?} */
var attachment = slot.getAttachment();
if (!(attachment instanceof ClippingAttachment))
continue;
/** @type {?} */
var clip = (/** @type {?} */ (attachment));
/** @type {?} */
var nn = clip.worldVerticesLength;
/** @type {?} */
var world = (this.temp = Utils.setArraySize(this.temp, nn, 0));
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
for (var i_1 = 0, n_1 = world.length; i_1 < n_1; i_1 += 2) {
/** @type {?} */
var x = world[i_1];
/** @type {?} */
var y = world[i_1 + 1];
/** @type {?} */
var x2 = world[(i_1 + 2) % world.length];
/** @type {?} */
var y2 = world[(i_1 + 3) % world.length];
shapes.line(x, y, x2, y2);
}
}
}
};
/**
* @return {?}
*/
SkeletonDebugRenderer.prototype.dispose = /**
* @return {?}
*/
function () { };
SkeletonDebugRenderer.LIGHT_GRAY = new Color(192 / 255, 192 / 255, 192 / 255, 1);
SkeletonDebugRenderer.GREEN = new Color(0, 1, 0, 1);
return SkeletonDebugRenderer;
}());
export { SkeletonDebugRenderer };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL3dlYmdsL1NrZWxldG9uRGVidWdSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFNUU7SUF5QkUsK0JBQVksT0FBNkQ7UUF4QnpFLGtCQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsb0JBQWUsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4Qyx3QkFBbUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7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QUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBQ0QsdUNBQU87OztJQUFQLGNBQVcsQ0FBQztJQTlNRyxnQ0FBVSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELDJCQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUE4TS9DLDRCQUFDO0NBQUEsQUF0T0QsSUFzT0M7U0F0T1kscUJBQXFCOzs7Ozs7SUF1QmhDLGlDQUEwRTs7Ozs7SUFDMUUsNEJBQTZDOztJQXZCN0MsOENBQXNDOztJQUN0QyxnREFBd0M7O0lBQ3hDLG9EQUE4Qzs7SUFDOUMsa0RBQStDOztJQUMvQywwQ0FBZ0Q7O0lBQ2hELDBDQUFvQzs7SUFDcEMsMENBQW9DOztJQUNwQywwQ0FBaUI7O0lBQ2pCLHNEQUE2Qjs7SUFDN0Isa0RBQXlCOztJQUN6Qiw2Q0FBb0I7O0lBQ3BCLGtEQUF5Qjs7SUFDekIsMENBQWlCOztJQUNqQiwrQ0FBdUI7O0lBQ3ZCLDZDQUFvQjs7SUFDcEIsbURBQTJCOztJQUMzQixzQ0FBVTs7SUFDViwwQ0FBYzs7Ozs7SUFDZCx3Q0FBOEM7Ozs7O0lBQzlDLHVDQUFzQzs7Ozs7SUFDdEMscUNBQW1DOzs7OztJQUNuQyx5Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29sb3IsIFV0aWxzLCBEaXNwb3NhYmxlIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gXCIuL1dlYkdMXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uQm91bmRzIH0gZnJvbSBcIi4uL2NvcmUvU2tlbGV0b25Cb3VuZHNcIjtcclxuaW1wb3J0IHsgU2hhcGVSZW5kZXJlciB9IGZyb20gXCIuL1NoYXBlUmVuZGVyZXJcIjtcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tIFwiLi4vY29yZS9Ta2VsZXRvblwiO1xyXG5pbXBvcnQgeyBSZWdpb25BdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUmVnaW9uQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuLi9jb3JlL2F0dGFjaG1lbnRzL01lc2hBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IFBhdGhBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUGF0aEF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgQ2xpcHBpbmdBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvQ2xpcHBpbmdBdHRhY2htZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tlbGV0b25EZWJ1Z1JlbmRlcmVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XHJcbiAgYm9uZUxpbmVDb2xvciA9IG5ldyBDb2xvcigxLCAwLCAwLCAxKTtcclxuICBib25lT3JpZ2luQ29sb3IgPSBuZXcgQ29sb3IoMCwgMSwgMCwgMSk7XHJcbiAgYXR0YWNobWVudExpbmVDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAxLCAwLjUpO1xyXG4gIHRyaWFuZ2xlTGluZUNvbG9yID0gbmV3IENvbG9yKDEsIDAuNjQsIDAsIDAuNSk7XHJcbiAgcGF0aENvbG9yID0gbmV3IENvbG9yKCkuc2V0RnJvbVN0cmluZyhcIkZGN0YwMFwiKTtcclxuICBjbGlwQ29sb3IgPSBuZXcgQ29sb3IoMC44LCAwLCAwLCAyKTtcclxuICBhYWJiQ29sb3IgPSBuZXcgQ29sb3IoMCwgMSwgMCwgMC41KTtcclxuICBkcmF3Qm9uZXMgPSB0cnVlO1xyXG4gIGRyYXdSZWdpb25BdHRhY2htZW50cyA9IHRydWU7XHJcbiAgZHJhd0JvdW5kaW5nQm94ZXMgPSB0cnVlO1xyXG4gIGRyYXdNZXNoSHVsbCA9IHRydWU7XHJcbiAgZHJhd01lc2hUcmlhbmdsZXMgPSB0cnVlO1xyXG4gIGRyYXdQYXRocyA9IHRydWU7XHJcbiAgZHJhd1NrZWxldG9uWFkgPSBmYWxzZTtcclxuICBkcmF3Q2xpcHBpbmcgPSB0cnVlO1xyXG4gIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xyXG4gIHNjYWxlID0gMTtcclxuICBib25lV2lkdGggPSAyO1xyXG4gIHByaXZhdGUgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcclxuICBwcml2YXRlIGJvdW5kcyA9IG5ldyBTa2VsZXRvbkJvdW5kcygpO1xyXG4gIHByaXZhdGUgdGVtcCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoMiAqIDEwMjQpO1xyXG4gIHByaXZhdGUgc3RhdGljIExJR0hUX0dSQVkgPSBuZXcgQ29sb3IoMTkyIC8gMjU1LCAxOTIgLyAyNTUsIDE5MiAvIDI1NSwgMSk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgR1JFRU4gPSBuZXcgQ29sb3IoMCwgMSwgMCwgMSk7XHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID1cclxuICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICA/IGNvbnRleHRcclxuICAgICAgICA6IG5ldyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0KGNvbnRleHQpO1xyXG4gIH1cclxuICBkcmF3KFxyXG4gICAgc2hhcGVzOiBTaGFwZVJlbmRlcmVyLFxyXG4gICAgc2tlbGV0b246IFNrZWxldG9uLFxyXG4gICAgaWdub3JlZEJvbmVzOiBBcnJheTxzdHJpbmc+ID0gbnVsbFxyXG4gICkge1xyXG4gICAgbGV0IHNrZWxldG9uWCA9IHNrZWxldG9uLng7XHJcbiAgICBsZXQgc2tlbGV0b25ZID0gc2tlbGV0b24ueTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGxldCBzcmNGdW5jID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPyBnbC5PTkUgOiBnbC5TUkNfQUxQSEE7XHJcbiAgICBzaGFwZXMuc2V0QmxlbmRNb2RlKHNyY0Z1bmMsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xyXG4gICAgbGV0IGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XHJcbiAgICBpZiAodGhpcy5kcmF3Qm9uZXMpIHtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYm9uZUxpbmVDb2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgICBpZiAoaWdub3JlZEJvbmVzICYmIGlnbm9yZWRCb25lcy5pbmRleE9mKGJvbmUuZGF0YS5uYW1lKSA+IC0xKSBjb250aW51ZTtcclxuICAgICAgICBpZiAoYm9uZS5wYXJlbnQgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgbGV0IHggPSBza2VsZXRvblggKyBib25lLmRhdGEubGVuZ3RoICogYm9uZS5hICsgYm9uZS53b3JsZFg7XHJcbiAgICAgICAgbGV0IHkgPSBza2VsZXRvblkgKyBib25lLmRhdGEubGVuZ3RoICogYm9uZS5jICsgYm9uZS53b3JsZFk7XHJcbiAgICAgICAgc2hhcGVzLnJlY3RMaW5lKFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIHNrZWxldG9uWCArIGJvbmUud29ybGRYLFxyXG4gICAgICAgICAgc2tlbGV0b25ZICsgYm9uZS53b3JsZFksXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIHRoaXMuYm9uZVdpZHRoICogdGhpcy5zY2FsZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZHJhd1NrZWxldG9uWFkpIHNoYXBlcy54KHNrZWxldG9uWCwgc2tlbGV0b25ZLCA0ICogdGhpcy5zY2FsZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3UmVnaW9uQXR0YWNobWVudHMpIHtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYXR0YWNobWVudExpbmVDb2xvcik7XHJcbiAgICAgIGxldCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGxldCBzbG90ID0gc2xvdHNbaV07XHJcbiAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcclxuICAgICAgICAgIGxldCByZWdpb25BdHRhY2htZW50ID0gPFJlZ2lvbkF0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICAgIGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcbiAgICAgICAgICByZWdpb25BdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QuYm9uZSwgdmVydGljZXMsIDAsIDIpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbMF0sIHZlcnRpY2VzWzFdLCB2ZXJ0aWNlc1syXSwgdmVydGljZXNbM10pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbMl0sIHZlcnRpY2VzWzNdLCB2ZXJ0aWNlc1s0XSwgdmVydGljZXNbNV0pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbNF0sIHZlcnRpY2VzWzVdLCB2ZXJ0aWNlc1s2XSwgdmVydGljZXNbN10pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbNl0sIHZlcnRpY2VzWzddLCB2ZXJ0aWNlc1swXSwgdmVydGljZXNbMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd01lc2hIdWxsIHx8IHRoaXMuZHJhd01lc2hUcmlhbmdsZXMpIHtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBtZXNoID0gPE1lc2hBdHRhY2htZW50PmF0dGFjaG1lbnQ7XHJcbiAgICAgICAgbGV0IHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcclxuICAgICAgICBtZXNoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKFxyXG4gICAgICAgICAgc2xvdCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBtZXNoLndvcmxkVmVydGljZXNMZW5ndGgsXHJcbiAgICAgICAgICB2ZXJ0aWNlcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAyXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgdHJpYW5nbGVzID0gbWVzaC50cmlhbmdsZXM7XHJcbiAgICAgICAgbGV0IGh1bGxMZW5ndGggPSBtZXNoLmh1bGxMZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhd01lc2hUcmlhbmdsZXMpIHtcclxuICAgICAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLnRyaWFuZ2xlTGluZUNvbG9yKTtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gMCwgbm4gPSB0cmlhbmdsZXMubGVuZ3RoOyBpaSA8IG5uOyBpaSArPSAzKSB7XHJcbiAgICAgICAgICAgIGxldCB2MSA9IHRyaWFuZ2xlc1tpaV0gKiAyLFxyXG4gICAgICAgICAgICAgIHYyID0gdHJpYW5nbGVzW2lpICsgMV0gKiAyLFxyXG4gICAgICAgICAgICAgIHYzID0gdHJpYW5nbGVzW2lpICsgMl0gKiAyO1xyXG4gICAgICAgICAgICBzaGFwZXMudHJpYW5nbGUoXHJcbiAgICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjFdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YxICsgMV0sIC8vXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjJdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YyICsgMV0sIC8vXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjNdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YzICsgMV0gLy9cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhd01lc2hIdWxsICYmIGh1bGxMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IodGhpcy5hdHRhY2htZW50TGluZUNvbG9yKTtcclxuICAgICAgICAgIGh1bGxMZW5ndGggPSAoaHVsbExlbmd0aCA+PiAxKSAqIDI7XHJcbiAgICAgICAgICBsZXQgbGFzdFggPSB2ZXJ0aWNlc1todWxsTGVuZ3RoIC0gMl0sXHJcbiAgICAgICAgICAgIGxhc3RZID0gdmVydGljZXNbaHVsbExlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwLCBubiA9IGh1bGxMZW5ndGg7IGlpIDwgbm47IGlpICs9IDIpIHtcclxuICAgICAgICAgICAgbGV0IHggPSB2ZXJ0aWNlc1tpaV0sXHJcbiAgICAgICAgICAgICAgeSA9IHZlcnRpY2VzW2lpICsgMV07XHJcbiAgICAgICAgICAgIHNoYXBlcy5saW5lKHgsIHksIGxhc3RYLCBsYXN0WSk7XHJcbiAgICAgICAgICAgIGxhc3RYID0geDtcclxuICAgICAgICAgICAgbGFzdFkgPSB5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd0JvdW5kaW5nQm94ZXMpIHtcclxuICAgICAgbGV0IGJvdW5kcyA9IHRoaXMuYm91bmRzO1xyXG4gICAgICBib3VuZHMudXBkYXRlKHNrZWxldG9uLCB0cnVlKTtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYWFiYkNvbG9yKTtcclxuICAgICAgc2hhcGVzLnJlY3QoXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgYm91bmRzLm1pblgsXHJcbiAgICAgICAgYm91bmRzLm1pblksXHJcbiAgICAgICAgYm91bmRzLmdldFdpZHRoKCksXHJcbiAgICAgICAgYm91bmRzLmdldEhlaWdodCgpXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBwb2x5Z29ucyA9IGJvdW5kcy5wb2x5Z29ucztcclxuICAgICAgbGV0IGJveGVzID0gYm91bmRzLmJvdW5kaW5nQm94ZXM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gcG9seWdvbnMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvbHlnb24gPSBwb2x5Z29uc1tpXTtcclxuICAgICAgICBzaGFwZXMuc2V0Q29sb3IoYm94ZXNbaV0uY29sb3IpO1xyXG4gICAgICAgIHNoYXBlcy5wb2x5Z29uKHBvbHlnb24sIDAsIHBvbHlnb24ubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd1BhdGhzKSB7XHJcbiAgICAgIGxldCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGxldCBzbG90ID0gc2xvdHNbaV07XHJcbiAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSBjb250aW51ZTtcclxuICAgICAgICBsZXQgcGF0aCA9IDxQYXRoQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIGxldCBubiA9IHBhdGgud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgICAgICBsZXQgd29ybGQgPSAodGhpcy50ZW1wID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMudGVtcCwgbm4sIDApKTtcclxuICAgICAgICBwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIDAsIG5uLCB3b3JsZCwgMCwgMik7XHJcbiAgICAgICAgbGV0IGNvbG9yID0gdGhpcy5wYXRoQ29sb3I7XHJcbiAgICAgICAgbGV0IHgxID0gd29ybGRbMl0sXHJcbiAgICAgICAgICB5MSA9IHdvcmxkWzNdLFxyXG4gICAgICAgICAgeDIgPSAwLFxyXG4gICAgICAgICAgeTIgPSAwO1xyXG4gICAgICAgIGlmIChwYXRoLmNsb3NlZCkge1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgIGxldCBjeDEgPSB3b3JsZFswXSxcclxuICAgICAgICAgICAgY3kxID0gd29ybGRbMV0sXHJcbiAgICAgICAgICAgIGN4MiA9IHdvcmxkW25uIC0gMl0sXHJcbiAgICAgICAgICAgIGN5MiA9IHdvcmxkW25uIC0gMV07XHJcbiAgICAgICAgICB4MiA9IHdvcmxkW25uIC0gNF07XHJcbiAgICAgICAgICB5MiA9IHdvcmxkW25uIC0gM107XHJcbiAgICAgICAgICBzaGFwZXMuY3VydmUoeDEsIHkxLCBjeDEsIGN5MSwgY3gyLCBjeTIsIHgyLCB5MiwgMzIpO1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKFNrZWxldG9uRGVidWdSZW5kZXJlci5MSUdIVF9HUkFZKTtcclxuICAgICAgICAgIHNoYXBlcy5saW5lKHgxLCB5MSwgY3gxLCBjeTEpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeDIsIHkyLCBjeDIsIGN5Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5uIC09IDQ7XHJcbiAgICAgICAgZm9yIChsZXQgaWkgPSA0OyBpaSA8IG5uOyBpaSArPSA2KSB7XHJcbiAgICAgICAgICBsZXQgY3gxID0gd29ybGRbaWldLFxyXG4gICAgICAgICAgICBjeTEgPSB3b3JsZFtpaSArIDFdLFxyXG4gICAgICAgICAgICBjeDIgPSB3b3JsZFtpaSArIDJdLFxyXG4gICAgICAgICAgICBjeTIgPSB3b3JsZFtpaSArIDNdO1xyXG4gICAgICAgICAgeDIgPSB3b3JsZFtpaSArIDRdO1xyXG4gICAgICAgICAgeTIgPSB3b3JsZFtpaSArIDVdO1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgIHNoYXBlcy5jdXJ2ZSh4MSwgeTEsIGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyLCAzMik7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IoU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLkxJR0hUX0dSQVkpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeDEsIHkxLCBjeDEsIGN5MSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh4MiwgeTIsIGN4MiwgY3kyKTtcclxuICAgICAgICAgIHgxID0geDI7XHJcbiAgICAgICAgICB5MSA9IHkyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd0JvbmVzKSB7XHJcbiAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLmJvbmVPcmlnaW5Db2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgICBpZiAoaWdub3JlZEJvbmVzICYmIGlnbm9yZWRCb25lcy5pbmRleE9mKGJvbmUuZGF0YS5uYW1lKSA+IC0xKSBjb250aW51ZTtcclxuICAgICAgICBzaGFwZXMuY2lyY2xlKFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIHNrZWxldG9uWCArIGJvbmUud29ybGRYLFxyXG4gICAgICAgICAgc2tlbGV0b25ZICsgYm9uZS53b3JsZFksXHJcbiAgICAgICAgICAzICogdGhpcy5zY2FsZSxcclxuICAgICAgICAgIFNrZWxldG9uRGVidWdSZW5kZXJlci5HUkVFTixcclxuICAgICAgICAgIDhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3Q2xpcHBpbmcpIHtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLmNsaXBDb2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpKSBjb250aW51ZTtcclxuICAgICAgICBsZXQgY2xpcCA9IDxDbGlwcGluZ0F0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICBsZXQgbm4gPSBjbGlwLndvcmxkVmVydGljZXNMZW5ndGg7XHJcbiAgICAgICAgbGV0IHdvcmxkID0gKHRoaXMudGVtcCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLnRlbXAsIG5uLCAwKSk7XHJcbiAgICAgICAgY2xpcC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90LCAwLCBubiwgd29ybGQsIDAsIDIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gd29ybGQubGVuZ3RoOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICBsZXQgeCA9IHdvcmxkW2ldO1xyXG4gICAgICAgICAgbGV0IHkgPSB3b3JsZFtpICsgMV07XHJcbiAgICAgICAgICBsZXQgeDIgPSB3b3JsZFsoaSArIDIpICUgd29ybGQubGVuZ3RoXTtcclxuICAgICAgICAgIGxldCB5MiA9IHdvcmxkWyhpICsgMykgJSB3b3JsZC5sZW5ndGhdO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeCwgeSwgeDIsIHkyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZGlzcG9zZSgpIHt9XHJcbn1cclxuIl19