821 lines
136 KiB
JavaScript
821 lines
136 KiB
JavaScript
/******************************************************************************
|
|
* Spine Runtimes License Agreement
|
|
* Last updated April 5, 2025. Replaces all prior versions.
|
|
*
|
|
* Copyright (c) 2013-2025, Esoteric Software LLC
|
|
*
|
|
* Integration of the Spine Runtimes into software or otherwise creating
|
|
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
* http://esotericsoftware.com/spine-editor-license
|
|
*
|
|
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
* "Products"), provided that each user of the Products must obtain their own
|
|
* Spine Editor license and redistribution of the Products in any form must
|
|
* include this license and copyright notice.
|
|
*
|
|
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*****************************************************************************/
|
|
import { Triangulator } from "./Triangulator.js";
|
|
import { Utils } from "./Utils.js";
|
|
export class SkeletonClipping {
|
|
triangulator = null;
|
|
clippingPolygon = [];
|
|
clippingPolygons = [];
|
|
clipOutput = [];
|
|
clippedVertices = [];
|
|
/** An empty array unless {@link clipTrianglesUnpacked} was used. **/
|
|
clippedUVs = [];
|
|
clippedTriangles = [];
|
|
inverseVertices = [];
|
|
_clippedVerticesTyped = new Float32Array(1024);
|
|
_clippedUVsTyped = new Float32Array(1024);
|
|
_clippedTrianglesTyped = new Uint16Array(1024);
|
|
clippedVerticesTyped = new Float32Array(0);
|
|
clippedUVsTyped = new Float32Array(0);
|
|
clippedTrianglesTyped = new Uint16Array(0);
|
|
clippedVerticesLength = 0;
|
|
clippedUVsLength = 0;
|
|
clippedTrianglesLength = 0;
|
|
scratch = [];
|
|
inverse = false;
|
|
clipAttachment = null;
|
|
clipStart(skeleton, slot, clip) {
|
|
if (this.clipAttachment)
|
|
return;
|
|
const n = clip.worldVerticesLength;
|
|
this.clipAttachment = clip;
|
|
this.inverse = clip.inverse;
|
|
const vertices = Utils.setArraySize(this.clippingPolygon, n);
|
|
clip.computeWorldVertices(skeleton, slot, 0, n, vertices, 0, 2);
|
|
const clippingPolygon = this.clippingPolygon;
|
|
const convex = this.makeClockwise(clippingPolygon);
|
|
if (convex || this.inverse || clip.convex) {
|
|
if (!convex)
|
|
this.makeConvex(clippingPolygon);
|
|
this.clippingPolygon.push(clippingPolygon[0], clippingPolygon[1]);
|
|
this.clippingPolygons.push(clippingPolygon);
|
|
}
|
|
else {
|
|
if (this.triangulator === null)
|
|
this.triangulator = new Triangulator();
|
|
this.clippingPolygons.push(...this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)));
|
|
}
|
|
}
|
|
clipEnd(slot) {
|
|
if (!this.clipAttachment)
|
|
return;
|
|
if (slot && this.clipAttachment.endSlot !== slot.data)
|
|
return;
|
|
this.clipAttachment = null;
|
|
this.clippingPolygons.length = 0;
|
|
}
|
|
isClipping() {
|
|
return this.clipAttachment != null;
|
|
}
|
|
clipTriangles(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride) {
|
|
return (uvs && light && dark && typeof twoColor === 'boolean' && typeof stride === 'number')
|
|
? this.clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride)
|
|
: this.clipTrianglesNoRender(vertices, triangles, trianglesLength);
|
|
}
|
|
clipTrianglesNoRender(vertices, triangles, trianglesLength) {
|
|
const clippedVertices = this.clippedVertices;
|
|
clippedVertices.length = 0;
|
|
const clippedTriangles = this.clippedTriangles;
|
|
clippedTriangles.length = 0;
|
|
let index = 0;
|
|
if (this.inverse) {
|
|
const polygon = this.clippingPolygons[0];
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let t = triangles[i] << 1;
|
|
const x1 = vertices[t], y1 = vertices[t + 1];
|
|
t = triangles[i + 1] << 1;
|
|
const x2 = vertices[t], y2 = vertices[t + 1];
|
|
t = triangles[i + 2] << 1;
|
|
const x3 = vertices[t], y3 = vertices[t + 1];
|
|
this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
|
|
const iv = this.inverseVertices;
|
|
for (let offset = 0, nn = this.inverseVertices.length; offset < nn;) {
|
|
const polygonSize = iv[offset++];
|
|
let vertexCount = polygonSize >> 1, s = clippedVertices.length;
|
|
const cv = Utils.setArraySize(clippedVertices, s + polygonSize);
|
|
Utils.arrayCopy(iv, offset, cv, s, polygonSize);
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3 * (vertexCount - 2));
|
|
for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = index + ii;
|
|
ct[s + 2] = index + ii + 1;
|
|
}
|
|
index += vertexCount;
|
|
offset += polygonSize;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
const clipOutput = this.clipOutput;
|
|
const polygons = this.clippingPolygons;
|
|
const polygonsCount = polygons.length;
|
|
let clipOutputItems = null;
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let t = triangles[i] << 1;
|
|
const x1 = vertices[t], y1 = vertices[t + 1];
|
|
t = triangles[i + 1] << 1;
|
|
const x2 = vertices[t], y2 = vertices[t + 1];
|
|
t = triangles[i + 2] << 1;
|
|
const x3 = vertices[t], y3 = vertices[t + 1];
|
|
for (let p = 0; p < polygonsCount; p++) {
|
|
let s = clippedVertices.length;
|
|
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
|
|
clipOutputItems = this.clipOutput;
|
|
const clipOutputLength = clipOutput.length;
|
|
if (clipOutputLength === 0)
|
|
continue;
|
|
let clipOutputCount = clipOutputLength >> 1;
|
|
const cv = Utils.setArraySize(clippedVertices, s + clipOutputLength);
|
|
Utils.arrayCopy(clipOutputItems, 0, cv, s, clipOutputLength);
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
|
clipOutputCount--;
|
|
for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + ii);
|
|
ct[s + 2] = (index + ii + 1);
|
|
}
|
|
index += clipOutputCount;
|
|
}
|
|
else {
|
|
const cv = Utils.setArraySize(clippedVertices, s + 3 * 2);
|
|
cv[s] = x1;
|
|
cv[s + 1] = y1;
|
|
cv[s + 2] = x2;
|
|
cv[s + 3] = y2;
|
|
cv[s + 4] = x3;
|
|
cv[s + 5] = y3;
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3);
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + 1);
|
|
ct[s + 2] = (index + 2);
|
|
index += 3;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return clipOutputItems != null;
|
|
}
|
|
clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride) {
|
|
const clippedVertices = this.clippedVertices;
|
|
clippedVertices.length = 0;
|
|
const clippedTriangles = this.clippedTriangles;
|
|
clippedTriangles.length = 0;
|
|
let index = 0;
|
|
if (this.inverse) {
|
|
const polygon = this.clippingPolygons[0];
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let t0 = triangles[i], t1 = triangles[i + 1], t2 = triangles[i + 2];
|
|
const x1 = vertices[t0 * stride], y1 = vertices[t0 * stride + 1];
|
|
const x2 = vertices[t1 * stride], y2 = vertices[t1 * stride + 1];
|
|
const x3 = vertices[t2 * stride], y3 = vertices[t2 * stride + 1];
|
|
this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
|
|
const nn = this.inverseVertices.length;
|
|
if (nn === 0)
|
|
continue;
|
|
const u1 = uvs[t0 <<= 1], v1 = uvs[t0 + 1];
|
|
const u2 = uvs[t1 <<= 1], v2 = uvs[t1 + 1];
|
|
const u3 = uvs[t2 <<= 1], v3 = uvs[t2 + 1];
|
|
const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
|
const iv = this.inverseVertices;
|
|
for (let offset = 0; offset < nn;) {
|
|
const polygonSize = iv[offset++];
|
|
const vertexCount = polygonSize >> 1;
|
|
let s = clippedVertices.length;
|
|
const cv = Utils.setArraySize(clippedVertices, s + vertexCount * stride);
|
|
for (let ii = 0; ii < polygonSize; ii += 2, s += stride) {
|
|
const x = iv[offset + ii], y = iv[offset + ii + 1];
|
|
cv[s] = x;
|
|
cv[s + 1] = y;
|
|
cv[s + 2] = light.r;
|
|
cv[s + 3] = light.g;
|
|
cv[s + 4] = light.b;
|
|
cv[s + 5] = light.a;
|
|
const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
|
|
cv[s + 6] = u1 * a + u2 * b + u3 * c;
|
|
cv[s + 7] = v1 * a + v2 * b + v3 * c;
|
|
if (twoColor) {
|
|
cv[s + 8] = dark.r;
|
|
cv[s + 9] = dark.g;
|
|
cv[s + 10] = dark.b;
|
|
cv[s + 11] = dark.a;
|
|
}
|
|
}
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3 * (vertexCount - 2));
|
|
for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = index + ii;
|
|
ct[s + 2] = index + ii + 1;
|
|
}
|
|
index += vertexCount;
|
|
offset += polygonSize;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
const clipOutput = this.clipOutput;
|
|
const polygons = this.clippingPolygons;
|
|
const polygonsCount = this.clippingPolygons.length;
|
|
let clipOutputItems = null;
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let t = triangles[i];
|
|
const x1 = vertices[t * stride], y1 = vertices[t * stride + 1];
|
|
const u1 = uvs[t << 1], v1 = uvs[(t << 1) + 1];
|
|
t = triangles[i + 1];
|
|
const x2 = vertices[t * stride], y2 = vertices[t * stride + 1];
|
|
const u2 = uvs[t << 1], v2 = uvs[(t << 1) + 1];
|
|
t = triangles[i + 2];
|
|
const x3 = vertices[t * stride], y3 = vertices[t * stride + 1];
|
|
const u3 = uvs[t << 1], v3 = uvs[(t << 1) + 1];
|
|
let d0 = 0, d1 = 0, d2 = 0, d4 = 0, d = 0;
|
|
for (let p = 0; p < polygonsCount; p++) {
|
|
let s = clippedVertices.length;
|
|
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
|
|
clipOutputItems = this.clipOutput;
|
|
const clipOutputLength = clipOutput.length;
|
|
if (clipOutputLength === 0)
|
|
continue;
|
|
let clipOutputCount = clipOutputLength >> 1;
|
|
if (d === 0) {
|
|
d0 = y2 - y3;
|
|
d1 = x3 - x2;
|
|
d2 = x1 - x3;
|
|
d4 = y3 - y1;
|
|
d = 1 / (d0 * d2 - d1 * d4);
|
|
}
|
|
const cv = Utils.setArraySize(clippedVertices, s + clipOutputCount * stride);
|
|
for (let ii = 0; ii < clipOutputLength; ii += 2, s += stride) {
|
|
const x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
|
cv[s] = x;
|
|
cv[s + 1] = y;
|
|
cv[s + 2] = light.r;
|
|
cv[s + 3] = light.g;
|
|
cv[s + 4] = light.b;
|
|
cv[s + 5] = light.a;
|
|
const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
|
|
cv[s + 6] = u1 * a + u2 * b + u3 * c;
|
|
cv[s + 7] = v1 * a + v2 * b + v3 * c;
|
|
if (twoColor) {
|
|
cv[s + 8] = dark.r;
|
|
cv[s + 9] = dark.g;
|
|
cv[s + 10] = dark.b;
|
|
cv[s + 11] = dark.a;
|
|
}
|
|
}
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
|
clipOutputCount--;
|
|
for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + ii);
|
|
ct[s + 2] = (index + ii + 1);
|
|
}
|
|
index += clipOutputCount + 1;
|
|
}
|
|
else {
|
|
const cv = Utils.setArraySize(clippedVertices, s + 3 * stride);
|
|
cv[s] = x1;
|
|
cv[s + 1] = y1;
|
|
cv[s + 2] = light.r;
|
|
cv[s + 3] = light.g;
|
|
cv[s + 4] = light.b;
|
|
cv[s + 5] = light.a;
|
|
if (!twoColor) {
|
|
cv[s + 6] = u1;
|
|
cv[s + 7] = v1;
|
|
cv[s + 8] = x2;
|
|
cv[s + 9] = y2;
|
|
cv[s + 10] = light.r;
|
|
cv[s + 11] = light.g;
|
|
cv[s + 12] = light.b;
|
|
cv[s + 13] = light.a;
|
|
cv[s + 14] = u2;
|
|
cv[s + 15] = v2;
|
|
cv[s + 16] = x3;
|
|
cv[s + 17] = y3;
|
|
cv[s + 18] = light.r;
|
|
cv[s + 19] = light.g;
|
|
cv[s + 20] = light.b;
|
|
cv[s + 21] = light.a;
|
|
cv[s + 22] = u3;
|
|
cv[s + 23] = v3;
|
|
}
|
|
else {
|
|
cv[s + 6] = u1;
|
|
cv[s + 7] = v1;
|
|
cv[s + 8] = dark.r;
|
|
cv[s + 9] = dark.g;
|
|
cv[s + 10] = dark.b;
|
|
cv[s + 11] = dark.a;
|
|
cv[s + 12] = x2;
|
|
cv[s + 13] = y2;
|
|
cv[s + 14] = light.r;
|
|
cv[s + 15] = light.g;
|
|
cv[s + 16] = light.b;
|
|
cv[s + 17] = light.a;
|
|
cv[s + 18] = u2;
|
|
cv[s + 19] = v2;
|
|
cv[s + 20] = dark.r;
|
|
cv[s + 21] = dark.g;
|
|
cv[s + 22] = dark.b;
|
|
cv[s + 23] = dark.a;
|
|
cv[s + 24] = x3;
|
|
cv[s + 25] = y3;
|
|
cv[s + 26] = light.r;
|
|
cv[s + 27] = light.g;
|
|
cv[s + 28] = light.b;
|
|
cv[s + 29] = light.a;
|
|
cv[s + 30] = u3;
|
|
cv[s + 31] = v3;
|
|
cv[s + 32] = dark.r;
|
|
cv[s + 33] = dark.g;
|
|
cv[s + 34] = dark.b;
|
|
cv[s + 35] = dark.a;
|
|
}
|
|
s = clippedTriangles.length;
|
|
const ct = Utils.setArraySize(clippedTriangles, s + 3);
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + 1);
|
|
ct[s + 2] = (index + 2);
|
|
index += 3;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return clipOutputItems != null;
|
|
}
|
|
clipTrianglesUnpacked(vertices, vertexStart, triangles, trianglesLength, uvs, stride = 2) {
|
|
let clippedVertices = this._clippedVerticesTyped;
|
|
let clippedUVs = this._clippedUVsTyped;
|
|
let clippedTriangles = this._clippedTrianglesTyped;
|
|
let index = 0;
|
|
this.clippedVerticesLength = 0;
|
|
this.clippedUVsLength = 0;
|
|
this.clippedTrianglesLength = 0;
|
|
if (this.inverse) {
|
|
const polygon = this.clippingPolygons[0];
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let v = triangles[i] * stride;
|
|
const x1 = vertices[vertexStart + v], y1 = vertices[vertexStart + v + 1];
|
|
let uv = triangles[i] << 1;
|
|
const u1 = uvs[uv], v1 = uvs[uv + 1];
|
|
v = triangles[i + 1] * stride;
|
|
const x2 = vertices[vertexStart + v], y2 = vertices[vertexStart + v + 1];
|
|
uv = triangles[i + 1] << 1;
|
|
const u2 = uvs[uv], v2 = uvs[uv + 1];
|
|
v = triangles[i + 2] * stride;
|
|
const x3 = vertices[vertexStart + v], y3 = vertices[vertexStart + v + 1];
|
|
uv = triangles[i + 2] << 1;
|
|
const u3 = uvs[uv], v3 = uvs[uv + 1];
|
|
this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
|
|
const nn = this.inverseVertices.length;
|
|
if (nn === 0)
|
|
continue;
|
|
const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
|
const iv = this.inverseVertices;
|
|
for (let offset = 0; offset < nn;) {
|
|
const polygonSize = iv[offset++];
|
|
const vertexCount = polygonSize >> 1;
|
|
let s = this.clippedVerticesLength;
|
|
const newLength = s + vertexCount * stride;
|
|
const newUVLength = this.clippedUVsLength + vertexCount * 2;
|
|
if (clippedVertices.length < newLength) {
|
|
this._clippedVerticesTyped = new Float32Array(newLength * 2);
|
|
this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
|
|
clippedVertices = this._clippedVerticesTyped;
|
|
}
|
|
if (clippedUVs.length < newUVLength) {
|
|
this._clippedUVsTyped = new Float32Array(newUVLength * 2);
|
|
this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
|
|
clippedUVs = this._clippedUVsTyped;
|
|
}
|
|
this.clippedVerticesLength = newLength;
|
|
this.clippedUVsLength = newUVLength;
|
|
const cv = this._clippedVerticesTyped;
|
|
const cu = this._clippedUVsTyped;
|
|
let uvIndex = newUVLength - vertexCount * 2;
|
|
for (let ii = 0; ii < polygonSize; ii += 2, s += stride, uvIndex += 2) {
|
|
const x = iv[offset + ii], y = iv[offset + ii + 1];
|
|
cv[s] = x;
|
|
cv[s + 1] = y;
|
|
const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
|
|
cu[uvIndex] = u1 * a + u2 * b + u3 * c;
|
|
cu[uvIndex + 1] = v1 * a + v2 * b + v3 * c;
|
|
}
|
|
s = this.clippedTrianglesLength;
|
|
const newLengthTriangles = s + 3 * (vertexCount - 2);
|
|
if (clippedTriangles.length < newLengthTriangles) {
|
|
this._clippedTrianglesTyped = new Uint16Array(newLengthTriangles * 2);
|
|
this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
|
|
clippedTriangles = this._clippedTrianglesTyped;
|
|
}
|
|
this.clippedTrianglesLength = newLengthTriangles;
|
|
const ct = clippedTriangles;
|
|
for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = index + ii;
|
|
ct[s + 2] = index + ii + 1;
|
|
}
|
|
index += vertexCount;
|
|
offset += polygonSize;
|
|
}
|
|
}
|
|
this.clippedVerticesTyped = this._clippedVerticesTyped.subarray(0, this.clippedVerticesLength);
|
|
this.clippedUVsTyped = this._clippedUVsTyped.subarray(0, this.clippedUVsLength);
|
|
this.clippedTrianglesTyped = this._clippedTrianglesTyped.subarray(0, this.clippedTrianglesLength);
|
|
return true;
|
|
}
|
|
const clipOutput = this.clipOutput;
|
|
const polygons = this.clippingPolygons;
|
|
const polygonsCount = this.clippingPolygons.length;
|
|
let clipOutputItems = null;
|
|
for (let i = 0; i < trianglesLength; i += 3) {
|
|
let t = triangles[i];
|
|
let v = t * stride;
|
|
const x1 = vertices[vertexStart + v], y1 = vertices[vertexStart + v + 1];
|
|
let uv = t << 1;
|
|
const u1 = uvs[uv], v1 = uvs[uv + 1];
|
|
t = triangles[i + 1];
|
|
v = t * stride;
|
|
const x2 = vertices[vertexStart + v], y2 = vertices[vertexStart + v + 1];
|
|
uv = t << 1;
|
|
const u2 = uvs[uv], v2 = uvs[uv + 1];
|
|
t = triangles[i + 2];
|
|
v = t * stride;
|
|
const x3 = vertices[vertexStart + v], y3 = vertices[vertexStart + v + 1];
|
|
uv = t << 1;
|
|
const u3 = uvs[uv], v3 = uvs[uv + 1];
|
|
let d0 = 0, d1 = 0, d2 = 0, d4 = 0, d = 0;
|
|
for (let p = 0; p < polygonsCount; p++) {
|
|
let s = this.clippedVerticesLength;
|
|
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
|
|
clipOutputItems = clipOutput;
|
|
const clipOutputLength = clipOutput.length;
|
|
if (clipOutputLength === 0)
|
|
continue;
|
|
let clipOutputCount = clipOutputLength >> 1;
|
|
if (d === 0) {
|
|
d0 = y2 - y3;
|
|
d1 = x3 - x2;
|
|
d2 = x1 - x3;
|
|
d4 = y3 - y1;
|
|
d = 1 / (d0 * d2 - d1 * d4);
|
|
}
|
|
const newLength = s + clipOutputCount * stride;
|
|
if (clippedVertices.length < newLength) {
|
|
this._clippedVerticesTyped = new Float32Array(newLength * 2);
|
|
this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
|
|
this._clippedUVsTyped = new Float32Array((this.clippedUVsLength + clipOutputCount * 2) * 2);
|
|
this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
|
|
clippedVertices = this._clippedVerticesTyped;
|
|
clippedUVs = this._clippedUVsTyped;
|
|
}
|
|
const cv = clippedVertices;
|
|
const cu = clippedUVs;
|
|
this.clippedVerticesLength = newLength;
|
|
let uvIndex = this.clippedUVsLength;
|
|
this.clippedUVsLength = uvIndex + clipOutputCount * 2;
|
|
for (let ii = 0; ii < clipOutputLength; ii += 2, s += stride, uvIndex += 2) {
|
|
const x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
|
cv[s] = x;
|
|
cv[s + 1] = y;
|
|
const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
|
|
cu[uvIndex] = u1 * a + u2 * b + u3 * c;
|
|
cu[uvIndex + 1] = v1 * a + v2 * b + v3 * c;
|
|
}
|
|
s = this.clippedTrianglesLength;
|
|
const newLengthTriangles = s + 3 * (clipOutputCount - 2);
|
|
if (clippedTriangles.length < newLengthTriangles) {
|
|
this._clippedTrianglesTyped = new Uint16Array(newLengthTriangles * 2);
|
|
this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
|
|
clippedTriangles = this._clippedTrianglesTyped;
|
|
}
|
|
this.clippedTrianglesLength = newLengthTriangles;
|
|
const ct = clippedTriangles;
|
|
clipOutputCount--;
|
|
for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + ii);
|
|
ct[s + 2] = (index + ii + 1);
|
|
}
|
|
index += clipOutputCount + 1;
|
|
}
|
|
else {
|
|
let newLength = s + 3 * stride;
|
|
if (clippedVertices.length < newLength) {
|
|
this._clippedVerticesTyped = new Float32Array(newLength * 2);
|
|
this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
|
|
clippedVertices = this._clippedVerticesTyped;
|
|
}
|
|
clippedVertices[s] = x1;
|
|
clippedVertices[s + 1] = y1;
|
|
clippedVertices[s + stride] = x2;
|
|
clippedVertices[s + stride + 1] = y2;
|
|
clippedVertices[s + stride * 2] = x3;
|
|
clippedVertices[s + stride * 2 + 1] = y3;
|
|
const uvLength = this.clippedUVsLength + 3 * 2;
|
|
if (clippedUVs.length < uvLength) {
|
|
this._clippedUVsTyped = new Float32Array(uvLength * 2);
|
|
this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
|
|
clippedUVs = this._clippedUVsTyped;
|
|
}
|
|
const uvIndex = this.clippedUVsLength;
|
|
clippedUVs[uvIndex] = u1;
|
|
clippedUVs[uvIndex + 1] = v1;
|
|
clippedUVs[uvIndex + 2] = u2;
|
|
clippedUVs[uvIndex + 3] = v2;
|
|
clippedUVs[uvIndex + 4] = u3;
|
|
clippedUVs[uvIndex + 5] = v3;
|
|
this.clippedVerticesLength = newLength;
|
|
this.clippedUVsLength = uvLength;
|
|
s = this.clippedTrianglesLength;
|
|
newLength = s + 3;
|
|
if (clippedTriangles.length < newLength) {
|
|
this._clippedTrianglesTyped = new Uint16Array(newLength * 2);
|
|
this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
|
|
clippedTriangles = this._clippedTrianglesTyped;
|
|
}
|
|
const ct = clippedTriangles;
|
|
ct[s] = index;
|
|
ct[s + 1] = (index + 1);
|
|
ct[s + 2] = (index + 2);
|
|
index += 3;
|
|
this.clippedTrianglesLength = newLength;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
this.clippedVerticesTyped = this._clippedVerticesTyped.subarray(0, this.clippedVerticesLength);
|
|
this.clippedUVsTyped = this._clippedUVsTyped.subarray(0, this.clippedUVsLength);
|
|
this.clippedTrianglesTyped = this._clippedTrianglesTyped.subarray(0, this.clippedTrianglesLength);
|
|
return clipOutputItems !== null;
|
|
}
|
|
clip(x1, y1, x2, y2, x3, y3, polygon) {
|
|
const originalOutput = this.clipOutput;
|
|
let clipped = false;
|
|
// Avoid copy at the end.
|
|
let input, output;
|
|
if (polygon.length % 4 >= 2) {
|
|
input = this.clipOutput;
|
|
output = this.scratch;
|
|
}
|
|
else {
|
|
input = this.scratch;
|
|
output = this.clipOutput;
|
|
}
|
|
const v = polygon;
|
|
input.length = 8;
|
|
const iv = input;
|
|
iv[0] = x1;
|
|
iv[1] = y1;
|
|
iv[2] = x2;
|
|
iv[3] = y2;
|
|
iv[4] = x3;
|
|
iv[5] = y3;
|
|
iv[6] = x1;
|
|
iv[7] = y1;
|
|
output.length = 0;
|
|
const last = polygon.length - 4;
|
|
for (let i = 0;; i += 2) {
|
|
const edgeX = v[i], edgeY = v[i + 1], ex = edgeX - v[i + 2], ey = edgeY - v[i + 3];
|
|
const outputStart = output.length;
|
|
const iv = input;
|
|
x1 = iv[0];
|
|
y1 = iv[1];
|
|
let s1 = ey * (edgeX - x1) - ex * (edgeY - y1);
|
|
for (let ii = 2, nn = input.length - 2; ii <= nn; ii += 2) {
|
|
x2 = iv[ii];
|
|
y2 = iv[ii + 1];
|
|
const s2 = ey * (edgeX - x2) - ex * (edgeY - y2);
|
|
if (s1 > 0) {
|
|
if (s2 > 0) // v1 in, v2 in
|
|
output.push(x2, y2);
|
|
else { // v1 in, v2 out
|
|
const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
|
|
if (t >= 0 && t <= 1) {
|
|
output.push(x1 + ix * t, y1 + iy * t);
|
|
clipped = true;
|
|
}
|
|
else
|
|
output.push(x2, y2);
|
|
}
|
|
}
|
|
else if (s2 > 0) { // v1 out, v2 in
|
|
const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
|
|
if (t >= 0 && t <= 1) {
|
|
output.push(x1 + ix * t, y1 + iy * t, x2, y2);
|
|
clipped = true;
|
|
}
|
|
else
|
|
output.push(x2, y2);
|
|
}
|
|
else // v1 out, v2 out
|
|
clipped = true;
|
|
x1 = x2;
|
|
y1 = y2;
|
|
s1 = s2;
|
|
}
|
|
if (outputStart === output.length) { // All outside.
|
|
originalOutput.length = 0;
|
|
return true;
|
|
}
|
|
output.push(output[0], output[1]);
|
|
if (i === last)
|
|
break;
|
|
const temp = output;
|
|
output = input;
|
|
output.length = 0;
|
|
input = temp;
|
|
}
|
|
if (originalOutput !== output) {
|
|
originalOutput.length = 0;
|
|
for (let i = 0, n = output.length - 2; i < n; i++)
|
|
originalOutput[i] = output[i];
|
|
}
|
|
else
|
|
originalOutput.length = originalOutput.length - 2;
|
|
return clipped;
|
|
}
|
|
clipInverse(x1, y1, x2, y2, x3, y3, polygon) {
|
|
this.inverseVertices.length = 0;
|
|
const vLast = polygon.length - 4;
|
|
let input, output; // Avoid copy at the end.
|
|
if (polygon.length % 4 >= 2) {
|
|
input = this.clipOutput;
|
|
output = this.scratch;
|
|
}
|
|
else {
|
|
input = this.scratch;
|
|
output = this.clipOutput;
|
|
}
|
|
input.length = 8;
|
|
let v = polygon, iv = input;
|
|
iv[0] = x1;
|
|
iv[1] = y1;
|
|
iv[2] = x2;
|
|
iv[3] = y2;
|
|
iv[4] = x3;
|
|
iv[5] = y3;
|
|
iv[6] = x1;
|
|
iv[7] = y1;
|
|
output.length = 0;
|
|
for (let i = 0;; i += 2) {
|
|
const edgeX = v[i], edgeY = v[i + 1], ex = edgeX - v[i + 2], ey = edgeY - v[i + 3];
|
|
const outputStart = output.length, fragmentStart = this.inverseVertices.length;
|
|
this.inverseVertices.push(0);
|
|
iv = input;
|
|
x1 = iv[0];
|
|
y1 = iv[1];
|
|
let s1 = ey * (edgeX - x1) - ex * (edgeY - y1);
|
|
for (let ii = 2, nn = input.length - 2; ii <= nn; ii += 2) {
|
|
x2 = iv[ii];
|
|
y2 = iv[ii + 1];
|
|
const s2 = ey * (edgeX - x2) - ex * (edgeY - y2);
|
|
if (s1 > 0) {
|
|
if (s2 > 0) // v1 in, v2 in
|
|
output.push(x2, y2);
|
|
else { // v1 in, v2 out
|
|
const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
|
|
if (t >= 0 && t <= 1) {
|
|
const cx = x1 + ix * t, cy = y1 + iy * t;
|
|
output.push(cx, cy);
|
|
this.inverseVertices.push(cx, cy, x2, y2);
|
|
}
|
|
else
|
|
output.push(x2, y2);
|
|
}
|
|
}
|
|
else if (s2 > 0) { // v1 out, v2 in
|
|
const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
|
|
if (t >= 0 && t <= 1) {
|
|
const cx = x1 + ix * t, cy = y1 + iy * t;
|
|
this.inverseVertices.push(cx, cy);
|
|
output.push(cx, cy, x2, y2);
|
|
}
|
|
else
|
|
output.push(x2, y2);
|
|
}
|
|
else // v1 out, v2 out
|
|
this.inverseVertices.push(x2, y2);
|
|
x1 = x2;
|
|
y1 = y2;
|
|
s1 = s2;
|
|
}
|
|
const fragmentSize = this.inverseVertices.length - fragmentStart - 1;
|
|
if (fragmentSize >= 6)
|
|
this.inverseVertices[fragmentStart] = fragmentSize;
|
|
else
|
|
this.inverseVertices.length = fragmentStart; // Degenerate.
|
|
if (outputStart === output.length)
|
|
break; // All outside.
|
|
output.push(output[0], output[1]);
|
|
if (i === vLast)
|
|
break;
|
|
const temp = output;
|
|
output = input;
|
|
output.length = 0;
|
|
input = temp;
|
|
}
|
|
}
|
|
makeClockwise(polygon) {
|
|
const v = polygon;
|
|
const n = polygon.length;
|
|
let noCW = true, noCCW = true;
|
|
let area = 0, prevX = v[n - 2], prevY = v[n - 1], currX = v[0], currY = v[1];
|
|
for (let i = 2; i < n; i += 2) {
|
|
const nextX = v[i], nextY = v[i + 1];
|
|
area += currX * nextY - nextX * currY;
|
|
const cross = (currX - prevX) * (nextY - currY) - (currY - prevY) * (nextX - currX);
|
|
noCCW = noCCW && cross <= 0;
|
|
noCW = noCW && cross >= 0;
|
|
prevX = currX;
|
|
prevY = currY;
|
|
currX = nextX;
|
|
currY = nextY;
|
|
}
|
|
area += currX * v[1] - v[0] * currY;
|
|
const cross = (currX - prevX) * (v[1] - currY) - (currY - prevY) * (v[0] - currX);
|
|
noCCW = noCCW && cross <= 0;
|
|
noCW = noCW && cross >= 0;
|
|
if (area >= 0) {
|
|
for (let i = 0, lastX = n - 2, half = n >> 1; i < half; i += 2) {
|
|
const x = v[i], y = v[i + 1];
|
|
const other = lastX - i;
|
|
v[i] = v[other];
|
|
v[i + 1] = v[other + 1];
|
|
v[other] = x;
|
|
v[other + 1] = y;
|
|
}
|
|
return noCW;
|
|
}
|
|
return noCCW;
|
|
}
|
|
makeConvex(polygon) {
|
|
const n = polygon.length;
|
|
const v = polygon;
|
|
this.clipOutput.length = n;
|
|
const sorted = this.clipOutput;
|
|
sorted[0] = v[0];
|
|
sorted[1] = v[1];
|
|
for (let i = 2; i < n; i += 2) {
|
|
const x = v[i], y = v[i + 1];
|
|
let p = i - 2;
|
|
for (; p >= 0 && (sorted[p] > x || (sorted[p] === x && sorted[p + 1] > y)); p -= 2) {
|
|
sorted[p + 2] = sorted[p];
|
|
sorted[p + 3] = sorted[p + 1];
|
|
}
|
|
sorted[p + 2] = x;
|
|
sorted[p + 3] = y;
|
|
}
|
|
v[0] = sorted[0];
|
|
v[1] = sorted[1];
|
|
v[2] = sorted[2];
|
|
v[3] = sorted[3];
|
|
let s = 4;
|
|
for (let i = 4; i < n; i += 2, s += 2) {
|
|
const x = sorted[i], y = sorted[i + 1];
|
|
while ((v[s - 2] - v[s - 4]) * (y - v[s - 3]) - (v[s - 1] - v[s - 3]) * (x - v[s - 4]) >= 0) {
|
|
s -= 2;
|
|
if (s === 2)
|
|
break;
|
|
}
|
|
v[s] = x;
|
|
v[s + 1] = y;
|
|
}
|
|
v[s] = sorted[n - 4];
|
|
v[s + 1] = sorted[n - 3];
|
|
const t = s;
|
|
s += 2;
|
|
for (let i = n - 6; i >= 0; i -= 2, s += 2) {
|
|
const x = sorted[i], y = sorted[i + 1];
|
|
while ((v[s - 2] - v[s - 4]) * (y - v[s - 3]) - (v[s - 1] - v[s - 3]) * (x - v[s - 4]) >= 0) {
|
|
s -= 2;
|
|
if (s === t)
|
|
break;
|
|
}
|
|
v[s] = x;
|
|
v[s + 1] = y;
|
|
}
|
|
polygon.length = s - 2;
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvbkNsaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUsvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFvQyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckUsTUFBTSxPQUFPLGdCQUFnQjtJQUNwQixZQUFZLEdBQXdCLElBQUksQ0FBQztJQUN6QyxlQUFlLEdBQUcsRUFBYyxDQUFDO0lBQ2pDLGdCQUFnQixHQUFlLEVBQUUsQ0FBQztJQUNsQyxVQUFVLEdBQUcsRUFBYyxDQUFDO0lBQ3BDLGVBQWUsR0FBRyxFQUFjLENBQUM7SUFFakMscUVBQXFFO0lBQ3JFLFVBQVUsR0FBRyxFQUFjLENBQUM7SUFFNUIsZ0JBQWdCLEdBQUcsRUFBYyxDQUFDO0lBQ2xDLGVBQWUsR0FBRyxFQUFjLENBQUM7SUFFakMscUJBQXFCLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxzQkFBc0IsR0FBZ0IsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsb0JBQW9CLEdBQWlCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELGVBQWUsR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQscUJBQXFCLEdBQWdCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUMxQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDckIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLE9BQU8sR0FBRyxFQUFjLENBQUM7SUFD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Q0FBQzt3QkFDZixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFZixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDZixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDZixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDakIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNQLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNmLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNmLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDbkIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3BCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFFcEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3BCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUVwQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3BCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMs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S0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwRixLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzFCLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDZCxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2QsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNkLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNsRixLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxD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QUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDN0YsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDUCxJQUFJLENBQUMsS0FBSyxDQUFDO29CQUFFLE1BQU07WUFDcEIsQ0FBQztZQUNELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLENBQUM7UUFDRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNQLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM3RixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNQLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQUUsTUFBTTtZQUNwQixDQUFDO1lBQ0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNULENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgQ2xpcHBpbmdBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQ2xpcHBpbmdBdHRhY2htZW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNrZWxldG9uIH0gZnJvbSBcIi4vU2tlbGV0b24uanNcIjtcbmltcG9ydCB0eXBlIHsgU2xvdCB9IGZyb20gXCIuL1Nsb3QuanNcIjtcbmltcG9ydCB7IFRyaWFuZ3VsYXRvciB9IGZyb20gXCIuL1RyaWFuZ3VsYXRvci5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDb2xvciwgdHlwZSBOdW1iZXJBcnJheUxpa2UsIFV0aWxzIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuZXhwb3J0IGNsYXNzIFNrZWxldG9uQ2xpcHBpbmcge1xuXHRwcml2YXRlIHRyaWFuZ3VsYXRvcjogVHJpYW5ndWxhdG9yIHwgbnVsbCA9IG51bGw7XG5cdHByaXZhdGUgY2xpcHBpbmdQb2x5Z29uID0gW10gYXMgbnVtYmVyW107XG5cdHByaXZhdGUgY2xpcHBpbmdQb2x5Z29uczogbnVtYmVyW11bXSA9IFtdO1xuXHRwcml2YXRlIGNsaXBPdXRwdXQgPSBbXSBhcyBudW1iZXJbXTtcblx0Y2xpcHBlZFZlcnRpY2VzID0gW10gYXMgbnVtYmVyW107XG5cblx0LyoqIEFuIGVtcHR5IGFycmF5IHVubGVzcyB7QGxpbmsgY2xpcFRyaWFuZ2xlc1VucGFja2VkfSB3YXMgdXNlZC4gKiovXG5cdGNsaXBwZWRVVnMgPSBbXSBhcyBudW1iZXJbXTtcblxuXHRjbGlwcGVkVHJpYW5nbGVzID0gW10gYXMgbnVtYmVyW107XG5cdGludmVyc2VWZXJ0aWNlcyA9IFtdIGFzIG51bWJlcltdO1xuXG5cdF9jbGlwcGVkVmVydGljZXNUeXBlZDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxMDI0KTtcblx0X2NsaXBwZWRVVnNUeXBlZDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgxMDI0KTtcblx0X2NsaXBwZWRUcmlhbmdsZXNUeXBlZDogVWludDE2QXJyYXkgPSBuZXcgVWludDE2QXJyYXkoMTAyNCk7XG5cdGNsaXBwZWRWZXJ0aWNlc1R5cGVkOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDApO1xuXHRjbGlwcGVkVVZzVHlwZWQ6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG5cdGNsaXBwZWRUcmlhbmdsZXNUeXBlZDogVWludDE2QXJyYXkgPSBuZXcgVWludDE2QXJyYXkoMCk7XG5cdGNsaXBwZWRWZXJ0aWNlc0xlbmd0aCA9IDA7XG5cdGNsaXBwZWRVVnNMZW5ndGggPSAwO1xuXHRjbGlwcGVkVHJpYW5nbGVzTGVuZ3RoID0gMDtcblxuXHRwcml2YXRlIHNjcmF0Y2ggPSBbXSBhcyBudW1iZXJbXTtcblx0cHJpdmF0ZSBpbnZlcnNlID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBjbGlwQXR0YWNobWVudDogQ2xpcHBpbmdBdHRhY2htZW50IHwgbnVsbCA9IG51bGw7XG5cblx0Y2xpcFN0YXJ0IChza2VsZXRvbjogU2tlbGV0b24sIHNsb3Q6IFNsb3QsIGNsaXA6IENsaXBwaW5nQXR0YWNobWVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNsaXBBdHRhY2htZW50KSByZXR1cm47XG5cdFx0Y29uc3QgbiA9IGNsaXAud29ybGRWZXJ0aWNlc0xlbmd0aDtcblx0XHR0aGlzLmNsaXBBdHRhY2htZW50ID0gY2xpcDtcblx0XHR0aGlzLmludmVyc2UgPSBjbGlwLmludmVyc2U7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLmNsaXBwaW5nUG9seWdvbiwgbik7XG5cdFx0Y2xpcC5jb21wdXRlV29ybGRWZXJ0aWNlcyhza2VsZXRvbiwgc2xvdCwgMCwgbiwgdmVydGljZXMsIDAsIDIpO1xuXHRcdGNvbnN0IGNsaXBwaW5nUG9seWdvbiA9IHRoaXMuY2xpcHBpbmdQb2x5Z29uO1xuXHRcdGNvbnN0IGNvbnZleCA9IHRoaXMubWFrZUNsb2Nrd2lzZShjbGlwcGluZ1BvbHlnb24pO1xuXG5cdFx0aWYgKGNvbnZleCB8fCB0aGlzLmludmVyc2UgfHwgY2xpcC5jb252ZXgpIHtcblx0XHRcdGlmICghY29udmV4KSB0aGlzLm1ha2VDb252ZXgoY2xpcHBpbmdQb2x5Z29uKTtcblx0XHRcdHRoaXMuY2xpcHBpbmdQb2x5Z29uLnB1c2goY2xpcHBpbmdQb2x5Z29uWzBdLCBjbGlwcGluZ1BvbHlnb25bMV0pO1xuXHRcdFx0dGhpcy5jbGlwcGluZ1BvbHlnb25zLnB1c2goY2xpcHBpbmdQb2x5Z29uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMudHJpYW5ndWxhdG9yID09PSBudWxsKSB0aGlzLnRyaWFuZ3VsYXRvciA9IG5ldyBUcmlhbmd1bGF0b3IoKTtcblx0XHRcdHRoaXMuY2xpcHBpbmdQb2x5Z29ucy5wdXNoKC4uLnRoaXMudHJpYW5ndWxhdG9yLmRlY29tcG9zZShjbGlwcGluZ1BvbHlnb24sIHRoaXMudHJpYW5ndWxhdG9yLnRyaWFuZ3VsYXRlKGNsaXBwaW5nUG9seWdvbikpKTtcblx0XHR9XG5cdH1cblxuXHRjbGlwRW5kIChzbG90PzogU2xvdCkge1xuXHRcdGlmICghdGhpcy5jbGlwQXR0YWNobWVudCkgcmV0dXJuO1xuXHRcdGlmIChzbG90ICYmIHRoaXMuY2xpcEF0dGFjaG1lbnQuZW5kU2xvdCAhPT0gc2xvdC5kYXRhKSByZXR1cm47XG5cdFx0dGhpcy5jbGlwQXR0YWNobWVudCA9IG51bGw7XG5cdFx0dGhpcy5jbGlwcGluZ1BvbHlnb25zLmxlbmd0aCA9IDA7XG5cdH1cblxuXHRpc0NsaXBwaW5nICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jbGlwQXR0YWNobWVudCAhPSBudWxsO1xuXHR9XG5cblx0Y2xpcFRyaWFuZ2xlcyAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyKTogYm9vbGVhbjtcblx0Y2xpcFRyaWFuZ2xlcyAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLFxuXHRcdHV2czogTnVtYmVyQXJyYXlMaWtlLCBsaWdodDogQ29sb3IsIGRhcms6IENvbG9yLCB0d29Db2xvcjogYm9vbGVhbiwgc3RyaWRlOiBudW1iZXIpOiBib29sZWFuO1xuXHRjbGlwVHJpYW5nbGVzICh2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXIsXG5cdFx0dXZzPzogTnVtYmVyQXJyYXlMaWtlLCBsaWdodD86IENvbG9yLCBkYXJrPzogQ29sb3IsIHR3b0NvbG9yPzogYm9vbGVhbiwgc3RyaWRlPzogbnVtYmVyKTogYm9vbGVhbiB7XG5cblx0XHRyZXR1cm4gKHV2cyAmJiBsaWdodCAmJiBkYXJrICYmIHR5cGVvZiB0d29Db2xvciA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBzdHJpZGUgPT09ICdudW1iZXInKVxuXHRcdFx0PyB0aGlzLmNsaXBUcmlhbmdsZXNSZW5kZXIodmVydGljZXMsIHRyaWFuZ2xlcywgdHJpYW5nbGVzTGVuZ3RoLCB1dnMsIGxpZ2h0LCBkYXJrLCB0d29Db2xvciwgc3RyaWRlKVxuXHRcdFx0OiB0aGlzLmNsaXBUcmlhbmdsZXNOb1JlbmRlcih2ZXJ0aWNlcywgdHJpYW5nbGVzLCB0cmlhbmdsZXNMZW5ndGgpO1xuXHR9XG5cblx0cHJpdmF0ZSBjbGlwVHJpYW5nbGVzTm9SZW5kZXIgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXNMZW5ndGg6IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuY2xpcHBlZFZlcnRpY2VzO1xuXHRcdGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGggPSAwO1xuXHRcdGNvbnN0IGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLmNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0Y2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuXHRcdGxldCBpbmRleCA9IDA7XG5cblx0XHRpZiAodGhpcy5pbnZlcnNlKSB7XG5cdFx0XHRjb25zdCBwb2x5Z29uID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zWzBdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0XHRsZXQgdCA9IHRyaWFuZ2xlc1tpXSA8PCAxO1xuXHRcdFx0XHRjb25zdCB4MSA9IHZlcnRpY2VzW3RdLCB5MSA9IHZlcnRpY2VzW3QgKyAxXTtcblx0XHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMTtcblx0XHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t0XSwgeTIgPSB2ZXJ0aWNlc1t0ICsgMV07XG5cdFx0XHRcdHQgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG5cdFx0XHRcdGNvbnN0IHgzID0gdmVydGljZXNbdF0sIHkzID0gdmVydGljZXNbdCArIDFdO1xuXHRcdFx0XHR0aGlzLmNsaXBJbnZlcnNlKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb24pO1xuXG5cdFx0XHRcdGNvbnN0IGl2ID0gdGhpcy5pbnZlcnNlVmVydGljZXM7XG5cdFx0XHRcdGZvciAobGV0IG9mZnNldCA9IDAsIG5uID0gdGhpcy5pbnZlcnNlVmVydGljZXMubGVuZ3RoOyBvZmZzZXQgPCBubjspIHtcblx0XHRcdFx0XHRjb25zdCBwb2x5Z29uU2l6ZSA9IGl2W29mZnNldCsrXTtcblx0XHRcdFx0XHRsZXQgdmVydGV4Q291bnQgPSBwb2x5Z29uU2l6ZSA+PiAxLCBzID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGNvbnN0IGN2ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIHBvbHlnb25TaXplKTtcblx0XHRcdFx0XHRVdGlscy5hcnJheUNvcHkoaXYsIG9mZnNldCwgY3YsIHMsIHBvbHlnb25TaXplKTtcblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBjdCA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyAqICh2ZXJ0ZXhDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgdmVydGV4Q291bnQgLSAxOyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRjdFtzICsgMV0gPSBpbmRleCArIGlpO1xuXHRcdFx0XHRcdFx0Y3RbcyArIDJdID0gaW5kZXggKyBpaSArIDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZGV4ICs9IHZlcnRleENvdW50O1xuXHRcdFx0XHRcdG9mZnNldCArPSBwb2x5Z29uU2l6ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xpcE91dHB1dCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRjb25zdCBwb2x5Z29ucyA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucztcblx0XHRjb25zdCBwb2x5Z29uc0NvdW50ID0gcG9seWdvbnMubGVuZ3RoO1xuXHRcdGxldCBjbGlwT3V0cHV0SXRlbXMgPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzTGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdGxldCB0ID0gdHJpYW5nbGVzW2ldIDw8IDE7XG5cdFx0XHRjb25zdCB4MSA9IHZlcnRpY2VzW3RdLCB5MSA9IHZlcnRpY2VzW3QgKyAxXTtcblx0XHRcdHQgPSB0cmlhbmdsZXNbaSArIDFdIDw8IDE7XG5cdFx0XHRjb25zdCB4MiA9IHZlcnRpY2VzW3RdLCB5MiA9IHZlcnRpY2VzW3QgKyAxXTtcblx0XHRcdHQgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG5cdFx0XHRjb25zdCB4MyA9IHZlcnRpY2VzW3RdLCB5MyA9IHZlcnRpY2VzW3QgKyAxXTtcblx0XHRcdGZvciAobGV0IHAgPSAwOyBwIDwgcG9seWdvbnNDb3VudDsgcCsrKSB7XG5cdFx0XHRcdGxldCBzID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKHRoaXMuY2xpcCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uc1twXSkpIHtcblx0XHRcdFx0XHRjbGlwT3V0cHV0SXRlbXMgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRcdFx0Y29uc3QgY2xpcE91dHB1dExlbmd0aCA9IGNsaXBPdXRwdXQubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChjbGlwT3V0cHV0TGVuZ3RoID09PSAwKSBjb250aW51ZTtcblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dENvdW50ID0gY2xpcE91dHB1dExlbmd0aCA+PiAxO1xuXG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgY2xpcE91dHB1dExlbmd0aCk7XG5cdFx0XHRcdFx0VXRpbHMuYXJyYXlDb3B5KGNsaXBPdXRwdXRJdGVtcywgMCwgY3YsIHMsIGNsaXBPdXRwdXRMZW5ndGgpO1xuXG5cdFx0XHRcdFx0cyA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGN0ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRUcmlhbmdsZXMsIHMgKyAzICogKGNsaXBPdXRwdXRDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRjbGlwT3V0cHV0Q291bnQtLTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgY2xpcE91dHB1dENvdW50OyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyBpaSk7XG5cdFx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyBpaSArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBjbGlwT3V0cHV0Q291bnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgMyAqIDIpO1xuXHRcdFx0XHRcdGN2W3NdID0geDE7XG5cdFx0XHRcdFx0Y3ZbcyArIDFdID0geTE7XG5cdFx0XHRcdFx0Y3ZbcyArIDJdID0geDI7XG5cdFx0XHRcdFx0Y3ZbcyArIDNdID0geTI7XG5cdFx0XHRcdFx0Y3ZbcyArIDRdID0geDM7XG5cdFx0XHRcdFx0Y3ZbcyArIDVdID0geTM7XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgY3QgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFRyaWFuZ2xlcywgcyArIDMpO1xuXHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0Y3RbcyArIDFdID0gKGluZGV4ICsgMSk7XG5cdFx0XHRcdFx0Y3RbcyArIDJdID0gKGluZGV4ICsgMik7XG5cdFx0XHRcdFx0aW5kZXggKz0gMztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2xpcE91dHB1dEl0ZW1zICE9IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGNsaXBUcmlhbmdsZXNSZW5kZXIgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXNMZW5ndGg6IG51bWJlciwgdXZzOiBOdW1iZXJBcnJheUxpa2UsIGxpZ2h0OiBDb2xvciwgZGFyazogQ29sb3IsXG5cdFx0dHdvQ29sb3I6IGJvb2xlYW4sIHN0cmlkZTogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY2xpcHBlZFZlcnRpY2VzID0gdGhpcy5jbGlwcGVkVmVydGljZXM7XG5cdFx0Y2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0Y29uc3QgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlcztcblx0XHRjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG5cdFx0bGV0IGluZGV4ID0gMDtcblxuXHRcdGlmICh0aGlzLmludmVyc2UpIHtcblx0XHRcdGNvbnN0IHBvbHlnb24gPSB0aGlzLmNsaXBwaW5nUG9seWdvbnNbMF07XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlc0xlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHRcdGxldCB0MCA9IHRyaWFuZ2xlc1tpXSwgdDEgPSB0cmlhbmdsZXNbaSArIDFdLCB0MiA9IHRyaWFuZ2xlc1tpICsgMl07XG5cdFx0XHRcdGNvbnN0IHgxID0gdmVydGljZXNbdDAgKiBzdHJpZGVdLCB5MSA9IHZlcnRpY2VzW3QwICogc3RyaWRlICsgMV07XG5cdFx0XHRcdGNvbnN0IHgyID0gdmVydGljZXNbdDEgKiBzdHJpZGVdLCB5MiA9IHZlcnRpY2VzW3QxICogc3RyaWRlICsgMV07XG5cdFx0XHRcdGNvbnN0IHgzID0gdmVydGljZXNbdDIgKiBzdHJpZGVdLCB5MyA9IHZlcnRpY2VzW3QyICogc3RyaWRlICsgMV07XG5cdFx0XHRcdHRoaXMuY2xpcEludmVyc2UoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcG9seWdvbik7XG5cdFx0XHRcdGNvbnN0IG5uID0gdGhpcy5pbnZlcnNlVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAobm4gPT09IDApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGNvbnN0IHUxID0gdXZzW3QwIDw8PSAxXSwgdjEgPSB1dnNbdDAgKyAxXTtcblx0XHRcdFx0Y29uc3QgdTIgPSB1dnNbdDEgPDw9IDFdLCB2MiA9IHV2c1t0MSArIDFdO1xuXHRcdFx0XHRjb25zdCB1MyA9IHV2c1t0MiA8PD0gMV0sIHYzID0gdXZzW3QyICsgMV07XG5cdFx0XHRcdGNvbnN0IGQwID0geTIgLSB5MywgZDEgPSB4MyAtIHgyLCBkMiA9IHgxIC0geDMsIGQ0ID0geTMgLSB5MSwgZCA9IDEgLyAoZDAgKiBkMiArIGQxICogKHkxIC0geTMpKTtcblx0XHRcdFx0Y29uc3QgaXYgPSB0aGlzLmludmVyc2VWZXJ0aWNlcztcblx0XHRcdFx0Zm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbm47KSB7XG5cdFx0XHRcdFx0Y29uc3QgcG9seWdvblNpemUgPSBpdltvZmZzZXQrK107XG5cdFx0XHRcdFx0Y29uc3QgdmVydGV4Q291bnQgPSBwb2x5Z29uU2l6ZSA+PiAxO1xuXG5cdFx0XHRcdFx0bGV0IHMgPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGN2ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIHZlcnRleENvdW50ICogc3RyaWRlKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgcG9seWdvblNpemU7IGlpICs9IDIsIHMgKz0gc3RyaWRlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB4ID0gaXZbb2Zmc2V0ICsgaWldLCB5ID0gaXZbb2Zmc2V0ICsgaWkgKyAxXTtcblx0XHRcdFx0XHRcdGN2W3NdID0geDtcblx0XHRcdFx0XHRcdGN2W3MgKyAxXSA9IHk7XG5cdFx0XHRcdFx0XHRjdltzICsgMl0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDNdID0gbGlnaHQuZztcblx0XHRcdFx0XHRcdGN2W3MgKyA0XSA9IGxpZ2h0LmI7XG5cdFx0XHRcdFx0XHRjdltzICsgNV0gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y29uc3QgYzAgPSB4IC0geDMsIGMxID0geSAtIHkzLCBhID0gKGQwICogYzAgKyBkMSAqIGMxKSAqIGQsIGIgPSAoZDQgKiBjMCArIGQyICogYzEpICogZCwgYyA9IDEgLSBhIC0gYjtcblx0XHRcdFx0XHRcdGN2W3MgKyA2XSA9IHUxICogYSArIHUyICogYiArIHUzICogYztcblx0XHRcdFx0XHRcdGN2W3MgKyA3XSA9IHYxICogYSArIHYyICogYiArIHYzICogYztcblx0XHRcdFx0XHRcdGlmICh0d29Db2xvcikge1xuXHRcdFx0XHRcdFx0XHRjdltzICsgOF0gPSBkYXJrLnI7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyA5XSA9IGRhcmsuZztcblx0XHRcdFx0XHRcdFx0Y3ZbcyArIDEwXSA9IGRhcmsuYjtcblx0XHRcdFx0XHRcdFx0Y3ZbcyArIDExXSA9IGRhcmsuYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgY3QgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFRyaWFuZ2xlcywgcyArIDMgKiAodmVydGV4Q291bnQgLSAyKSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IHZlcnRleENvdW50IC0gMTsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjdFtzXSA9IGluZGV4O1xuXHRcdFx0XHRcdFx0Y3RbcyArIDFdID0gaW5kZXggKyBpaTtcblx0XHRcdFx0XHRcdGN0W3MgKyAyXSA9IGluZGV4ICsgaWkgKyAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSB2ZXJ0ZXhDb3VudDtcblx0XHRcdFx0XHRvZmZzZXQgKz0gcG9seWdvblNpemU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXG5cdFx0Y29uc3QgY2xpcE91dHB1dCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRjb25zdCBwb2x5Z29ucyA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucztcblx0XHRjb25zdCBwb2x5Z29uc0NvdW50ID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zLmxlbmd0aDtcblx0XHRsZXQgY2xpcE91dHB1dEl0ZW1zID0gbnVsbDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlc0xlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHRsZXQgdCA9IHRyaWFuZ2xlc1tpXTtcblx0XHRcdGNvbnN0IHgxID0gdmVydGljZXNbdCAqIHN0cmlkZV0sIHkxID0gdmVydGljZXNbdCAqIHN0cmlkZSArIDFdO1xuXHRcdFx0Y29uc3QgdTEgPSB1dnNbdCA8PCAxXSwgdjEgPSB1dnNbKHQgPDwgMSkgKyAxXTtcblx0XHRcdHQgPSB0cmlhbmdsZXNbaSArIDFdO1xuXHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t0ICogc3RyaWRlXSwgeTIgPSB2ZXJ0aWNlc1t0ICogc3RyaWRlICsgMV07XG5cdFx0XHRjb25zdCB1MiA9IHV2c1t0IDw8IDFdLCB2MiA9IHV2c1sodCA8PCAxKSArIDFdO1xuXHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMl07XG5cdFx0XHRjb25zdCB4MyA9IHZlcnRpY2VzW3QgKiBzdHJpZGVdLCB5MyA9IHZlcnRpY2VzW3QgKiBzdHJpZGUgKyAxXTtcblx0XHRcdGNvbnN0IHUzID0gdXZzW3QgPDwgMV0sIHYzID0gdXZzWyh0IDw8IDEpICsgMV07XG5cdFx0XHRsZXQgZDAgPSAwLCBkMSA9IDAsIGQyID0gMCwgZDQgPSAwLCBkID0gMDtcblx0XHRcdGZvciAobGV0IHAgPSAwOyBwIDwgcG9seWdvbnNDb3VudDsgcCsrKSB7XG5cdFx0XHRcdGxldCBzID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKHRoaXMuY2xpcCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uc1twXSkpIHtcblx0XHRcdFx0XHRjbGlwT3V0cHV0SXRlbXMgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRcdFx0Y29uc3QgY2xpcE91dHB1dExlbmd0aCA9IGNsaXBPdXRwdXQubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChjbGlwT3V0cHV0TGVuZ3RoID09PSAwKSBjb250aW51ZTtcblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dENvdW50ID0gY2xpcE91dHB1dExlbmd0aCA+PiAxO1xuXHRcdFx0XHRcdGlmIChkID09PSAwKSB7XG5cdFx0XHRcdFx0XHRkMCA9IHkyIC0geTM7XG5cdFx0XHRcdFx0XHRkMSA9IHgzIC0geDI7XG5cdFx0XHRcdFx0XHRkMiA9IHgxIC0geDM7XG5cdFx0XHRcdFx0XHRkNCA9IHkzIC0geTE7XG5cdFx0XHRcdFx0XHRkID0gMSAvIChkMCAqIGQyIC0gZDEgKiBkNCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgY2xpcE91dHB1dENvdW50ICogc3RyaWRlKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgY2xpcE91dHB1dExlbmd0aDsgaWkgKz0gMiwgcyArPSBzdHJpZGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLCB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG5cdFx0XHRcdFx0XHRjdltzXSA9IHg7XG5cdFx0XHRcdFx0XHRjdltzICsgMV0gPSB5O1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDJdID0gbGlnaHQucjtcblx0XHRcdFx0XHRcdGN2W3MgKyAzXSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgNF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDVdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRcdGNvbnN0IGMwID0geCAtIHgzLCBjMSA9IHkgLSB5MywgYSA9IChkMCAqIGMwICsgZDEgKiBjMSkgKiBkLCBiID0gKGQ0ICogYzAgKyBkMiAqIGMxKSAqIGQsIGMgPSAxIC0gYSAtIGI7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MSAqIGEgKyB1MiAqIGIgKyB1MyAqIGM7XG5cdFx0XHRcdFx0XHRjdltzICsgN10gPSB2MSAqIGEgKyB2MiAqIGIgKyB2MyAqIGM7XG5cdFx0XHRcdFx0XHRpZiAodHdvQ29sb3IpIHtcblx0XHRcdFx0XHRcdFx0Y3ZbcyArIDhdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0XHRjdltzICsgOV0gPSBkYXJrLmc7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyAxMF0gPSBkYXJrLmI7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyAxMV0gPSBkYXJrLmE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cyA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGN0ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRUcmlhbmdsZXMsIHMgKyAzICogKGNsaXBPdXRwdXRDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRjbGlwT3V0cHV0Q291bnQtLTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgY2xpcE91dHB1dENvdW50OyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyBpaSk7XG5cdFx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyBpaSArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBjbGlwT3V0cHV0Q291bnQgKyAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGN2ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIDMgKiBzdHJpZGUpO1xuXHRcdFx0XHRcdGN2W3NdID0geDE7XG5cdFx0XHRcdFx0Y3ZbcyArIDFdID0geTE7XG5cdFx0XHRcdFx0Y3ZbcyArIDJdID0gbGlnaHQucjtcblx0XHRcdFx0XHRjdltzICsgM10gPSBsaWdodC5nO1xuXHRcdFx0XHRcdGN2W3MgKyA0XSA9IGxpZ2h0LmI7XG5cdFx0XHRcdFx0Y3ZbcyArIDVdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRpZiAoIXR3b0NvbG9yKSB7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MTtcblx0XHRcdFx0XHRcdGN2W3MgKyA3XSA9IHYxO1xuXG5cdFx0XHRcdFx0XHRjdltzICsgOF0gPSB4Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyA5XSA9IHkyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEwXSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0XHRjdltzICsgMTFdID0gbGlnaHQuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAxMl0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEzXSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0XHRjdltzICsgMTRdID0gdTI7XG5cdFx0XHRcdFx0XHRjdltzICsgMTVdID0gdjI7XG5cblx0XHRcdFx0XHRcdGN2W3MgKyAxNl0gPSB4Mztcblx0XHRcdFx0XHRcdGN2W3MgKyAxN10gPSB5Mztcblx0XHRcdFx0XHRcdGN2W3MgKyAxOF0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE5XSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMjBdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAyMV0gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIyXSA9IHUzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIzXSA9IHYzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MTtcblx0XHRcdFx0XHRcdGN2W3MgKyA3XSA9IHYxO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDhdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDldID0gZGFyay5nO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEwXSA9IGRhcmsuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxMV0gPSBkYXJrLmE7XG5cblx0XHRcdFx0XHRcdGN2W3MgKyAxMl0gPSB4Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxM10gPSB5Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxNF0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE1XSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMTZdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxN10gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE4XSA9IHUyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE5XSA9IHYyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIwXSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdGN2W3MgKyAyMV0gPSBkYXJrLmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMjJdID0gZGFyay5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIzXSA9IGRhcmsuYTtcblxuXHRcdFx0XHRcdFx0Y3ZbcyArIDI0XSA9IHgzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI1XSA9IHkzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI2XSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0XHRjdltzICsgMjddID0gbGlnaHQuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAyOF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI5XSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0XHRjdltzICsgMzBdID0gdTM7XG5cdFx0XHRcdFx0XHRjdltzICsgMzFdID0gdjM7XG5cdFx0XHRcdFx0XHRjdltzICsgMzJdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDMzXSA9IGRhcmsuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAzNF0gPSBkYXJrLmI7XG5cdFx0XHRcdFx0XHRjdltzICsgMzVdID0gZGFyay5hO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBjdCA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyk7XG5cdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyAxKTtcblx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyAyKTtcblx0XHRcdFx0XHRpbmRleCArPSAzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjbGlwT3V0cHV0SXRlbXMgIT0gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBjbGlwVHJpYW5nbGVzVW5wYWNrZWQgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHZlcnRleFN0YXJ0OiBudW1iZXIsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlIHwgVWludDE2QXJyYXksIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLCB1dnM6IE51bWJlckFycmF5TGlrZSwgc3RyaWRlID0gMik6IGJvb2xlYW4ge1xuXHRcdGxldCBjbGlwcGVkVmVydGljZXMgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZDtcblx0XHRsZXQgY2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRsZXQgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZDtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzTGVuZ3RoID0gMDtcblx0XHR0aGlzLmNsaXBwZWRVVnNMZW5ndGggPSAwO1xuXHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IDA7XG5cblx0XHRpZiAodGhpcy5pbnZlcnNlKSB7XG5cdFx0XHRjb25zdCBwb2x5Z29uID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zWzBdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0XHRsZXQgdiA9IHRyaWFuZ2xlc1tpXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MSA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHRsZXQgdXYgPSB0cmlhbmdsZXNbaV0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTEgPSB1dnNbdXZdLCB2MSA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR2ID0gdHJpYW5nbGVzW2kgKyAxXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MiA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHR1diA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTIgPSB1dnNbdXZdLCB2MiA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR2ID0gdHJpYW5nbGVzW2kgKyAyXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MyA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHR1diA9IHRyaWFuZ2xlc1tpICsgMl0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTMgPSB1dnNbdXZdLCB2MyA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR0aGlzLmNsaXBJbnZlcnNlKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb24pO1xuXHRcdFx0XHRjb25zdCBubiA9IHRoaXMuaW52ZXJzZVZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKG5uID09PSAwKSBjb250aW51ZTtcblxuXHRcdFx0XHRjb25zdCBkMCA9IHkyIC0geTMsIGQxID0geDMgLSB4MiwgZDIgPSB4MSAtIHgzLCBkNCA9IHkzIC0geTEsIGQgPSAxIC8gKGQwICogZDIgKyBkMSAqICh5MSAtIHkzKSk7XG5cdFx0XHRcdGNvbnN0IGl2ID0gdGhpcy5pbnZlcnNlVmVydGljZXM7XG5cdFx0XHRcdGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IG5uOykge1xuXHRcdFx0XHRcdGNvbnN0IHBvbHlnb25TaXplID0gaXZbb2Zmc2V0KytdO1xuXHRcdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gcG9seWdvblNpemUgPj4gMTtcblxuXHRcdFx0XHRcdGxldCBzID0gdGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgbmV3TGVuZ3RoID0gcyArIHZlcnRleENvdW50ICogc3RyaWRlO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1VWTGVuZ3RoID0gdGhpcy5jbGlwcGVkVVZzTGVuZ3RoICsgdmVydGV4Q291bnQgKiAyO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVmVydGljZXMubGVuZ3RoIDwgbmV3TGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoICogMik7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zZXQoY2xpcHBlZFZlcnRpY2VzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoY2xpcHBlZFVWcy5sZW5ndGggPCBuZXdVVkxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkID0gbmV3IEZsb2F0MzJBcnJheShuZXdVVkxlbmd0aCAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkLnNldChjbGlwcGVkVVZzLnN1YmFycmF5KDAsIHRoaXMuY2xpcHBlZFVWc0xlbmd0aCkpO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGggPSBuZXdMZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVVZzTGVuZ3RoID0gbmV3VVZMZW5ndGg7XG5cblx0XHRcdFx0XHRjb25zdCBjdiA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdGNvbnN0IGN1ID0gdGhpcy5fY2xpcHBlZFVWc1R5cGVkO1xuXHRcdFx0XHRcdGxldCB1dkluZGV4ID0gbmV3VVZMZW5ndGggLSB2ZXJ0ZXhDb3VudCAqIDI7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHBvbHlnb25TaXplOyBpaSArPSAyLCBzICs9IHN0cmlkZSwgdXZJbmRleCArPSAyKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB4ID0gaXZbb2Zmc2V0ICsgaWldLCB5ID0gaXZbb2Zmc2V0ICsgaWkgKyAxXTtcblx0XHRcdFx0XHRcdGN2W3NdID0geDtcblx0XHRcdFx0XHRcdGN2W3MgKyAxXSA9IHk7XG5cdFx0XHRcdFx0XHRjb25zdCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTMsIGEgPSAoZDAgKiBjMCArIGQxICogYzEpICogZCwgYiA9IChkNCAqIGMwICsgZDIgKiBjMSkgKiBkLCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y3VbdXZJbmRleF0gPSB1MSAqIGEgKyB1MiAqIGIgKyB1MyAqIGM7XG5cdFx0XHRcdFx0XHRjdVt1dkluZGV4ICsgMV0gPSB2MSAqIGEgKyB2MiAqIGIgKyB2MyAqIGM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBuZXdMZW5ndGhUcmlhbmdsZXMgPSBzICsgMyAqICh2ZXJ0ZXhDb3VudCAtIDIpO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA8IG5ld0xlbmd0aFRyaWFuZ2xlcykge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkID0gbmV3IFVpbnQxNkFycmF5KG5ld0xlbmd0aFRyaWFuZ2xlcyAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkLnNldChjbGlwcGVkVHJpYW5nbGVzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IG5ld0xlbmd0aFRyaWFuZ2xlcztcblx0XHRcdFx0XHRjb25zdCBjdCA9IGNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IHZlcnRleENvdW50IC0gMTsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjdFtzXSA9IGluZGV4O1xuXHRcdFx0XHRcdFx0Y3RbcyArIDFdID0gaW5kZXggKyBpaTtcblx0XHRcdFx0XHRcdGN0W3MgKyAyXSA9IGluZGV4ICsgaWkgKyAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSB2ZXJ0ZXhDb3VudDtcblx0XHRcdFx0XHRvZmZzZXQgKz0gcG9seWdvblNpemU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzVHlwZWQgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRWZXJ0aWNlc0xlbmd0aCk7XG5cdFx0XHR0aGlzLmNsaXBwZWRVVnNUeXBlZCA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZC5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRVVnNMZW5ndGgpO1xuXHRcdFx0dGhpcy5jbGlwcGVkVHJpYW5nbGVzVHlwZWQgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQuc3ViYXJyYXkoMCwgdGhpcy5jbGlwcGVkVHJpYW5nbGVzTGVuZ3RoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXBPdXRwdXQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0Y29uc3QgcG9seWdvbnMgPSB0aGlzLmNsaXBwaW5nUG9seWdvbnM7XG5cdFx0Y29uc3QgcG9seWdvbnNDb3VudCA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7XG5cdFx0bGV0IGNsaXBPdXRwdXRJdGVtcyA9IG51bGw7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0bGV0IHQgPSB0cmlhbmdsZXNbaV07XG5cdFx0XHRsZXQgdiA9IHQgKiBzdHJpZGU7XG5cdFx0XHRjb25zdCB4MSA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdl0sIHkxID0gdmVydGljZXNbdmVydGV4U3RhcnQgKyB2ICsgMV07XG5cdFx0XHRsZXQgdXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MSA9IHV2c1t1dl0sIHYxID0gdXZzW3V2ICsgMV07XG5cdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAxXTtcblx0XHRcdHYgPSB0ICogc3RyaWRlO1xuXHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MiA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0dXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MiA9IHV2c1t1dl0sIHYyID0gdXZzW3V2ICsgMV07XG5cdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAyXTtcblx0XHRcdHYgPSB0ICogc3RyaWRlO1xuXHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MyA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0dXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MyA9IHV2c1t1dl0sIHYzID0gdXZzW3V2ICsgMV07XG5cdFx0XHRsZXQgZDAgPSAwLCBkMSA9IDAsIGQyID0gMCwgZDQgPSAwLCBkID0gMDtcblxuXHRcdFx0Zm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5Z29uc0NvdW50OyBwKyspIHtcblx0XHRcdFx0bGV0IHMgPSB0aGlzLmNsaXBwZWRWZXJ0aWNlc0xlbmd0aDtcblx0XHRcdFx0aWYgKHRoaXMuY2xpcCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uc1twXSkpIHtcblx0XHRcdFx0XHRjbGlwT3V0cHV0SXRlbXMgPSBjbGlwT3V0cHV0O1xuXHRcdFx0XHRcdGNvbnN0IGNsaXBPdXRwdXRMZW5ndGggPSBjbGlwT3V0cHV0Lmxlbmd0aDtcblx0XHRcdFx0XHRpZiAoY2xpcE91dHB1dExlbmd0aCA9PT0gMCkgY29udGludWU7XG5cdFx0XHRcdFx0bGV0IGNsaXBPdXRwdXRDb3VudCA9IGNsaXBPdXRwdXRMZW5ndGggPj4gMTtcblx0XHRcdFx0XHRpZiAoZCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZDAgPSB5MiAtIHkzO1xuXHRcdFx0XHRcdFx0ZDEgPSB4MyAtIHgyO1xuXHRcdFx0XHRcdFx0ZDIgPSB4MSAtIHgzO1xuXHRcdFx0XHRcdFx0ZDQgPSB5MyAtIHkxO1xuXHRcdFx0XHRcdFx0ZCA9IDEgLyAoZDAgKiBkMiAtIGQxICogZDQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG5ld0xlbmd0aCA9IHMgKyBjbGlwT3V0cHV0Q291bnQgKiBzdHJpZGU7XG5cdFx0XHRcdFx0aWYgKGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGggPCBuZXdMZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkID0gbmV3IEZsb2F0MzJBcnJheShuZXdMZW5ndGggKiAyKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkLnNldChjbGlwcGVkVmVydGljZXMuc3ViYXJyYXkoMCwgcykpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkID0gbmV3IEZsb2F0MzJBcnJheSgodGhpcy5jbGlwcGVkVVZzTGVuZ3RoICsgY2xpcE91dHB1dENvdW50ICogMikgKiAyKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRVVnNUeXBlZC5zZXQoY2xpcHBlZFVWcy5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRVVnNMZW5ndGgpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBjbGlwcGVkVmVydGljZXM7XG5cdFx0XHRcdFx0Y29uc3QgY3UgPSBjbGlwcGVkVVZzO1xuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzTGVuZ3RoID0gbmV3TGVuZ3RoO1xuXG5cdFx0XHRcdFx0bGV0IHV2SW5kZXggPSB0aGlzLmNsaXBwZWRVVnNMZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVVZzTGVuZ3RoID0gdXZJbmRleCArIGNsaXBPdXRwdXRDb3VudCAqIDI7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNsaXBPdXRwdXRMZW5ndGg7IGlpICs9IDIsIHMgKz0gc3RyaWRlLCB1dkluZGV4ICs9IDIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLCB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG5cdFx0XHRcdFx0XHRjdltzXSA9IHg7XG5cdFx0XHRcdFx0XHRjdltzICsgMV0gPSB5O1xuXG5cdFx0XHRcdFx0XHRjb25zdCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTMsIGEgPSAoZDAgKiBjMCArIGQxICogYzEpICogZCwgYiA9IChkNCAqIGMwICsgZDIgKiBjMSkgKiBkLCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y3VbdXZJbmRleF0gPSB1MSAqIGEgKyB1MiAqIGIgKyB1MyAqIGM7XG5cdFx0XHRcdFx0XHRjdVt1dkluZGV4ICsgMV0gPSB2MSAqIGEgKyB2MiAqIGIgKyB2MyAqIGM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBuZXdMZW5ndGhUcmlhbmdsZXMgPSBzICsgMyAqIChjbGlwT3V0cHV0Q291bnQgLSAyKVxuXHRcdFx0XHRcdGlmIChjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA8IG5ld0xlbmd0aFRyaWFuZ2xlcykge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkID0gbmV3IFVpbnQxNkFycmF5KG5ld0xlbmd0aFRyaWFuZ2xlcyAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkLnNldChjbGlwcGVkVHJpYW5nbGVzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IG5ld0xlbmd0aFRyaWFuZ2xlcztcblx0XHRcdFx0XHRjb25zdCBjdCA9IGNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0XHRcdFx0Y2xpcE91dHB1dENvdW50LS07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IGNsaXBPdXRwdXRDb3VudDsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjdFtzXSA9IGluZGV4O1xuXHRcdFx0XHRcdFx0Y3RbcyArIDFdID0gKGluZGV4ICsgaWkpO1xuXHRcdFx0XHRcdFx0Y3RbcyArIDJdID0gKGluZGV4ICsgaWkgKyAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aW5kZXggKz0gY2xpcE91dHB1dENvdW50ICsgMTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bGV0IG5ld0xlbmd0aCA9IHMgKyAzICogc3RyaWRlO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVmVydGljZXMubGVuZ3RoIDwgbmV3TGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoICogMik7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zZXQoY2xpcHBlZFZlcnRpY2VzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNbc10gPSB4MTtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNbcyArIDFdID0geTE7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzW3MgKyBzdHJpZGVdID0geDI7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzW3MgKyBzdHJpZGUgKyAxXSA9IHkyO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc1tzICsgc3RyaWRlICogMl0gPSB4Mztcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNbcyArIHN0cmlkZSAqIDIgKyAxXSA9IHkzO1xuXG5cdFx0XHRcdFx0Y29uc3QgdXZMZW5ndGggPSB0aGlzLmNsaXBwZWRVVnNMZW5ndGggKyAzICogMjtcblx0XHRcdFx0XHRpZiAoY2xpcHBlZFVWcy5sZW5ndGggPCB1dkxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkID0gbmV3IEZsb2F0MzJBcnJheSh1dkxlbmd0aCAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkLnNldChjbGlwcGVkVVZzLnN1YmFycmF5KDAsIHRoaXMuY2xpcHBlZFVWc0xlbmd0aCkpO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdXZJbmRleCA9IHRoaXMuY2xpcHBlZFVWc0xlbmd0aDtcblx0XHRcdFx0XHRjbGlwcGVkVVZzW3V2SW5kZXhdID0gdTE7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWc1t1dkluZGV4ICsgMV0gPSB2MTtcblx0XHRcdFx0XHRjbGlwcGVkVVZzW3V2SW5kZXggKyAyXSA9IHUyO1xuXHRcdFx0XHRcdGNsaXBwZWRVVnNbdXZJbmRleCArIDNdID0gdjI7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWc1t1dkluZGV4ICsgNF0gPSB1Mztcblx0XHRcdFx0XHRjbGlwcGVkVVZzW3V2SW5kZXggKyA1XSA9IHYzO1xuXG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGggPSBuZXdMZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVVZzTGVuZ3RoID0gdXZMZW5ndGg7XG5cblx0XHRcdFx0XHRzID0gdGhpcy5jbGlwcGVkVHJpYW5nbGVzTGVuZ3RoO1xuXHRcdFx0XHRcdG5ld0xlbmd0aCA9IHMgKyAzO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA8IG5ld0xlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkID0gbmV3IFVpbnQxNkFycmF5KG5ld0xlbmd0aCAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkLnNldChjbGlwcGVkVHJpYW5nbGVzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY3QgPSBjbGlwcGVkVHJpYW5nbGVzO1xuXHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0Y3RbcyArIDFdID0gKGluZGV4ICsgMSk7XG5cdFx0XHRcdFx0Y3RbcyArIDJdID0gKGluZGV4ICsgMik7XG5cdFx0XHRcdFx0aW5kZXggKz0gMztcblxuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IG5ld0xlbmd0aDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzVHlwZWQgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRWZXJ0aWNlc0xlbmd0aClcblx0XHR0aGlzLmNsaXBwZWRVVnNUeXBlZCA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZC5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRVVnNMZW5ndGgpXG5cdFx0dGhpcy5jbGlwcGVkVHJpYW5nbGVzVHlwZWQgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQuc3ViYXJyYXkoMCwgdGhpcy5jbGlwcGVkVHJpYW5nbGVzTGVuZ3RoKVxuXHRcdHJldHVybiBjbGlwT3V0cHV0SXRlbXMgIT09IG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGNsaXAgKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHgzOiBudW1iZXIsIHkzOiBudW1iZXIsIHBvbHlnb246IG51bWJlcltdKSB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxPdXRwdXQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0bGV0IGNsaXBwZWQgPSBmYWxzZTtcblxuXHRcdC8vIEF2b2lkIGNvcHkgYXQgdGhlIGVuZC5cblx0XHRsZXQgaW5wdXQ6IG51bWJlcltdLCBvdXRwdXQ6IG51bWJlcltdO1xuXHRcdGlmIChwb2x5Z29uLmxlbmd0aCAlIDQgPj0gMikge1xuXHRcdFx0aW5wdXQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRvdXRwdXQgPSB0aGlzLnNjcmF0Y2g7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlucHV0ID0gdGhpcy5zY3JhdGNoO1xuXHRcdFx0b3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdH1cblxuXHRcdGNvbnN0IHYgPSBwb2x5Z29uO1xuXHRcdGlucHV0Lmxlbmd0aCA9IDg7XG5cdFx0Y29uc3QgaXYgPSBpbnB1dDtcblx0XHRpdlswXSA9IHgxO1xuXHRcdGl2WzFdID0geTE7XG5cdFx0aXZbMl0gPSB4Mjtcblx0XHRpdlszXSA9IHkyO1xuXHRcdGl2WzRdID0geDM7XG5cdFx0aXZbNV0gPSB5Mztcblx0XHRpdls2XSA9IHgxO1xuXHRcdGl2WzddID0geTE7XG5cdFx0b3V0cHV0Lmxlbmd0aCA9IDA7XG5cblx0XHRjb25zdCBsYXN0ID0gcG9seWdvbi5sZW5ndGggLSA0O1xuXHRcdGZvciAobGV0IGkgPSAwOyA7IGkgKz0gMikge1xuXHRcdFx0Y29uc3QgZWRnZVggPSB2W2ldLCBlZGdlWSA9IHZbaSArIDFdLCBleCA9IGVkZ2VYIC0gdltpICsgMl0sIGV5ID0gZWRnZVkgLSB2W2kgKyAzXTtcblx0XHRcdGNvbnN0IG91dHB1dFN0YXJ0ID0gb3V0cHV0Lmxlbmd0aDtcblx0XHRcdGNvbnN0IGl2ID0gaW5wdXQ7XG5cdFx0XHR4MSA9IGl2WzBdO1xuXHRcdFx0eTEgPSBpdlsxXTtcblx0XHRcdGxldCBzMSA9IGV5ICogKGVkZ2VYIC0geDEpIC0gZXggKiAoZWRnZVkgLSB5MSk7XG5cdFx0XHRmb3IgKGxldCBpaSA9IDIsIG5uID0gaW5wdXQubGVuZ3RoIC0gMjsgaWkgPD0gbm47IGlpICs9IDIpIHtcblx0XHRcdFx0eDIgPSBpdltpaV07XG5cdFx0XHRcdHkyID0gaXZbaWkgKyAxXTtcblx0XHRcdFx0Y29uc3QgczIgPSBleSAqIChlZGdlWCAtIHgyKSAtIGV4ICogKGVkZ2VZIC0geTIpO1xuXHRcdFx0XHRpZiAoczEgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKHMyID4gMCkgLy8gdjEgaW4sIHYyIGluXG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaCh4MiwgeTIpO1xuXHRcdFx0XHRcdGVsc2UgeyAvLyB2MSBpbiwgdjIgb3V0XG5cdFx0XHRcdFx0XHRjb25zdCBpeCA9IHgyIC0geDEsIGl5ID0geTIgLSB5MSwgdCA9IHMxIC8gKGl4ICogZXkgLSBpeSAqIGV4KTtcblx0XHRcdFx0XHRcdGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG5cdFx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgxICsgaXggKiB0LCB5MSArIGl5ICogdCk7XG5cdFx0XHRcdFx0XHRcdGNsaXBwZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgyLCB5Mik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHMyID4gMCkgeyAvLyB2MSBvdXQsIHYyIGluXG5cdFx0XHRcdFx0Y29uc3QgaXggPSB4MiAtIHgxLCBpeSA9IHkyIC0geTEsIHQgPSBzMSAvIChpeCAqIGV5IC0gaXkgKiBleCk7XG5cdFx0XHRcdFx0aWYgKHQgPj0gMCAmJiB0IDw9IDEpIHtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgxICsgaXggKiB0LCB5MSArIGl5ICogdCwgeDIsIHkyKTtcblx0XHRcdFx0XHRcdGNsaXBwZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0fSBlbHNlIC8vIHYxIG91dCwgdjIgb3V0XG5cdFx0XHRcdFx0Y2xpcHBlZCA9IHRydWU7XG5cdFx0XHRcdHgxID0geDI7XG5cdFx0XHRcdHkxID0geTI7XG5cdFx0XHRcdHMxID0gczI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvdXRwdXRTdGFydCA9PT0gb3V0cHV0Lmxlbmd0aCkgeyAvLyBBbGwgb3V0c2lkZS5cblx0XHRcdFx0b3JpZ2luYWxPdXRwdXQubGVuZ3RoID0gMDtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdG91dHB1dC5wdXNoKG91dHB1dFswXSwgb3V0cHV0WzFdKTtcblxuXHRcdFx0aWYgKGkgPT09IGxhc3QpIGJyZWFrO1xuXHRcdFx0Y29uc3QgdGVtcCA9IG91dHB1dDtcblx0XHRcdG91dHB1dCA9IGlucHV0O1xuXHRcdFx0b3V0cHV0Lmxlbmd0aCA9IDA7XG5cdFx0XHRpbnB1dCA9IHRlbXA7XG5cdFx0fVxuXG5cdFx0aWYgKG9yaWdpbmFsT3V0cHV0ICE9PSBvdXRwdXQpIHtcblx0XHRcdG9yaWdpbmFsT3V0cHV0Lmxlbmd0aCA9IDA7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IG91dHB1dC5sZW5ndGggLSAyOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHRvcmlnaW5hbE91dHB1dFtpXSA9IG91dHB1dFtpXTtcblx0XHR9IGVsc2Vcblx0XHRcdG9yaWdpbmFsT3V0cHV0Lmxlbmd0aCA9IG9yaWdpbmFsT3V0cHV0Lmxlbmd0aCAtIDI7XG5cblx0XHRyZXR1cm4gY2xpcHBlZDtcblx0fVxuXG5cdHByaXZhdGUgY2xpcEludmVyc2UgKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHgzOiBudW1iZXIsIHkzOiBudW1iZXIsIHBvbHlnb246IG51bWJlcltdKTogdm9pZCB7XG5cdFx0dGhpcy5pbnZlcnNlVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHRjb25zdCB2TGFzdCA9IHBvbHlnb24ubGVuZ3RoIC0gNDtcblxuXHRcdGxldCBpbnB1dDogbnVtYmVyW10sIG91dHB1dDogbnVtYmVyW107IC8vIEF2b2lkIGNvcHkgYXQgdGhlIGVuZC5cblx0XHRpZiAocG9seWdvbi5sZW5ndGggJSA0ID49IDIpIHtcblx0XHRcdGlucHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdFx0b3V0cHV0ID0gdGhpcy5zY3JhdGNoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnB1dCA9IHRoaXMuc2NyYXRjaDtcblx0XHRcdG91dHB1dCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHR9XG5cblx0XHRpbnB1dC5sZW5ndGggPSA4O1xuXHRcdGxldCB2ID0gcG9seWdvbiwgaXYgPSBpbnB1dDtcblx0XHRpdlswXSA9IHgxO1xuXHRcdGl2WzFdID0geTE7XG5cdFx0aXZbMl0gPSB4Mjtcblx0XHRpdlszXSA9IHkyO1xuXHRcdGl2WzRdID0geDM7XG5cdFx0aXZbNV0gPSB5Mztcblx0XHRpdls2XSA9IHgxO1xuXHRcdGl2WzddID0geTE7XG5cdFx0b3V0cHV0Lmxlbmd0aCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgOyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IGVkZ2VYID0gdltpXSwgZWRnZVkgPSB2W2kgKyAxXSwgZXggPSBlZGdlWCAtIHZbaSArIDJdLCBleSA9IGVkZ2VZIC0gdltpICsgM107XG5cdFx0XHRjb25zdCBvdXRwdXRTdGFydCA9IG91dHB1dC5sZW5ndGgsIGZyYWdtZW50U3RhcnQgPSB0aGlzLmludmVyc2VWZXJ0aWNlcy5sZW5ndGg7XG5cdFx0XHR0aGlzLmludmVyc2VWZXJ0aWNlcy5wdXNoKDApO1xuXHRcdFx0aXYgPSBpbnB1dDtcblx0XHRcdHgxID0gaXZbMF07XG5cdFx0XHR5MSA9IGl2WzFdO1xuXHRcdFx0bGV0IHMxID0gZXkgKiAoZWRnZVggLSB4MSkgLSBleCAqIChlZGdlWSAtIHkxKTtcblx0XHRcdGZvciAobGV0IGlpID0gMiwgbm4gPSBpbnB1dC5sZW5ndGggLSAyOyBpaSA8PSBubjsgaWkgKz0gMikge1xuXHRcdFx0XHR4MiA9IGl2W2lpXTtcblx0XHRcdFx0eTIgPSBpdltpaSArIDFdO1xuXHRcdFx0XHRjb25zdCBzMiA9IGV5ICogKGVkZ2VYIC0geDIpIC0gZXggKiAoZWRnZVkgLSB5Mik7XG5cdFx0XHRcdGlmIChzMSA+IDApIHtcblx0XHRcdFx0XHRpZiAoczIgPiAwKSAvLyB2MSBpbiwgdjIgaW5cblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgyLCB5Mik7XG5cdFx0XHRcdFx0ZWxzZSB7IC8vIHYxIGluLCB2MiBvdXRcblx0XHRcdFx0XHRcdGNvbnN0IGl4ID0geDIgLSB4MSwgaXkgPSB5MiAtIHkxLCB0ID0gczEgLyAoaXggKiBleSAtIGl5ICogZXgpO1xuXHRcdFx0XHRcdFx0aWYgKHQgPj0gMCAmJiB0IDw9IDEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3ggPSB4MSArIGl4ICogdCwgY3kgPSB5MSArIGl5ICogdDtcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goY3gsIGN5KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXMucHVzaChjeCwgY3ksIHgyLCB5Mik7XG5cdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoczIgPiAwKSB7IC8vIHYxIG91dCwgdjIgaW5cblx0XHRcdFx0XHRjb25zdCBpeCA9IHgyIC0geDEsIGl5ID0geTIgLSB5MSwgdCA9IHMxIC8gKGl4ICogZXkgLSBpeSAqIGV4KTtcblx0XHRcdFx0XHRpZiAodCA+PSAwICYmIHQgPD0gMSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY3ggPSB4MSArIGl4ICogdCwgY3kgPSB5MSArIGl5ICogdDtcblx0XHRcdFx0XHRcdHRoaXMuaW52ZXJzZVZlcnRpY2VzLnB1c2goY3gsIGN5KTtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGN4LCBjeSwgeDIsIHkyKTtcblx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgyLCB5Mik7XG5cdFx0XHRcdH0gZWxzZSAvLyB2MSBvdXQsIHYyIG91dFxuXHRcdFx0XHRcdHRoaXMuaW52ZXJzZVZlcnRpY2VzLnB1c2goeDIsIHkyKTtcblx0XHRcdFx0eDEgPSB4Mjtcblx0XHRcdFx0eTEgPSB5Mjtcblx0XHRcdFx0czEgPSBzMjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZnJhZ21lbnRTaXplID0gdGhpcy5pbnZlcnNlVmVydGljZXMubGVuZ3RoIC0gZnJhZ21lbnRTdGFydCAtIDE7XG5cdFx0XHRpZiAoZnJhZ21lbnRTaXplID49IDYpXG5cdFx0XHRcdHRoaXMuaW52ZXJzZVZlcnRpY2VzW2ZyYWdtZW50U3RhcnRdID0gZnJhZ21lbnRTaXplO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmludmVyc2VWZXJ0aWNlcy5sZW5ndGggPSBmcmFnbWVudFN0YXJ0OyAvLyBEZWdlbmVyYXRlLlxuXG5cdFx0XHRpZiAob3V0cHV0U3RhcnQgPT09IG91dHB1dC5sZW5ndGgpIGJyZWFrOyAvLyBBbGwgb3V0c2lkZS5cblxuXHRcdFx0b3V0cHV0LnB1c2gob3V0cHV0WzBdLCBvdXRwdXRbMV0pO1xuXG5cdFx0XHRpZiAoaSA9PT0gdkxhc3QpIGJyZWFrO1xuXHRcdFx0Y29uc3QgdGVtcCA9IG91dHB1dDtcblx0XHRcdG91dHB1dCA9IGlucHV0O1xuXHRcdFx0b3V0cHV0Lmxlbmd0aCA9IDA7XG5cdFx0XHRpbnB1dCA9IHRlbXA7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBtYWtlQ2xvY2t3aXNlIChwb2x5Z29uOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHYgPSBwb2x5Z29uO1xuXHRcdGNvbnN0IG4gPSBwb2x5Z29uLmxlbmd0aDtcblx0XHRsZXQgbm9DVyA9IHRydWUsIG5vQ0NXID0gdHJ1ZTtcblx0XHRsZXQgYXJlYSA9IDAsIHByZXZYID0gdltuIC0gMl0sIHByZXZZID0gdltuIC0gMV0sIGN1cnJYID0gdlswXSwgY3VyclkgPSB2WzFdO1xuXHRcdGZvciAobGV0IGkgPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRjb25zdCBuZXh0WCA9IHZbaV0sIG5leHRZID0gdltpICsgMV07XG5cdFx0XHRhcmVhICs9IGN1cnJYICogbmV4dFkgLSBuZXh0WCAqIGN1cnJZO1xuXHRcdFx0Y29uc3QgY3Jvc3MgPSAoY3VyclggLSBwcmV2WCkgKiAobmV4dFkgLSBjdXJyWSkgLSAoY3VyclkgLSBwcmV2WSkgKiAobmV4dFggLSBjdXJyWCk7XG5cdFx0XHRub0NDVyA9IG5vQ0NXICYmIGNyb3NzIDw9IDA7XG5cdFx0XHRub0NXID0gbm9DVyAmJiBjcm9zcyA+PSAwO1xuXHRcdFx0cHJldlggPSBjdXJyWDtcblx0XHRcdHByZXZZID0gY3Vyclk7XG5cdFx0XHRjdXJyWCA9IG5leHRYO1xuXHRcdFx0Y3VyclkgPSBuZXh0WTtcblx0XHR9XG5cdFx0YXJlYSArPSBjdXJyWCAqIHZbMV0gLSB2WzBdICogY3Vyclk7XG5cdFx0Y29uc3QgY3Jvc3MgPSAoY3VyclggLSBwcmV2WCkgKiAodlsxXSAtIGN1cnJZKSAtIChjdXJyWSAtIHByZXZZKSAqICh2WzBdIC0gY3VyclgpO1xuXHRcdG5vQ0NXID0gbm9DQ1cgJiYgY3Jvc3MgPD0gMDtcblx0XHRub0NXID0gbm9DVyAmJiBjcm9zcyA+PSAwO1xuXHRcdGlmIChhcmVhID49IDApIHtcblx0XHRcdGZvciAobGV0IGkgPSAwLCBsYXN0WCA9IG4gLSAyLCBoYWxmID0gbiA+PiAxOyBpIDwgaGFsZjsgaSArPSAyKSB7XG5cdFx0XHRcdGNvbnN0IHggPSB2W2ldLCB5ID0gdltpICsgMV07XG5cdFx0XHRcdGNvbnN0IG90aGVyID0gbGFzdFggLSBpO1xuXHRcdFx0XHR2W2ldID0gdltvdGhlcl07XG5cdFx0XHRcdHZbaSArIDFdID0gdltvdGhlciArIDFdO1xuXHRcdFx0XHR2W290aGVyXSA9IHg7XG5cdFx0XHRcdHZbb3RoZXIgKyAxXSA9IHk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbm9DVztcblx0XHR9XG5cdFx0cmV0dXJuIG5vQ0NXO1xuXHR9XG5cblx0cHJpdmF0ZSBtYWtlQ29udmV4IChwb2x5Z29uOiBudW1iZXJbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG4gPSBwb2x5Z29uLmxlbmd0aDtcblx0XHRjb25zdCB2ID0gcG9seWdvbjtcblx0XHR0aGlzLmNsaXBPdXRwdXQubGVuZ3RoID0gbjtcblx0XHRjb25zdCBzb3J0ZWQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0c29ydGVkWzBdID0gdlswXTtcblx0XHRzb3J0ZWRbMV0gPSB2WzFdO1xuXHRcdGZvciAobGV0IGkgPSAyOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRjb25zdCB4ID0gdltpXSwgeSA9IHZbaSArIDFdO1xuXHRcdFx0bGV0IHAgPSBpIC0gMjtcblx0XHRcdGZvciAoOyBwID49IDAgJiYgKHNvcnRlZFtwXSA+IHggfHwgKHNvcnRlZFtwXSA9PT0geCAmJiBzb3J0ZWRbcCArIDFdID4geSkpOyBwIC09IDIpIHtcblx0XHRcdFx0c29ydGVkW3AgKyAyXSA9IHNvcnRlZFtwXTtcblx0XHRcdFx0c29ydGVkW3AgKyAzXSA9IHNvcnRlZFtwICsgMV07XG5cdFx0XHR9XG5cdFx0XHRzb3J0ZWRbcCArIDJdID0geDtcblx0XHRcdHNvcnRlZFtwICsgM10gPSB5O1xuXHRcdH1cblx0XHR2WzBdID0gc29ydGVkWzBdO1xuXHRcdHZbMV0gPSBzb3J0ZWRbMV07XG5cdFx0dlsyXSA9IHNvcnRlZFsyXTtcblx0XHR2WzNdID0gc29ydGVkWzNdO1xuXHRcdGxldCBzID0gNDtcblx0XHRmb3IgKGxldCBpID0gNDsgaSA8IG47IGkgKz0gMiwgcyArPSAyKSB7XG5cdFx0XHRjb25zdCB4ID0gc29ydGVkW2ldLCB5ID0gc29ydGVkW2kgKyAxXTtcblx0XHRcdHdoaWxlICgodltzIC0gMl0gLSB2W3MgLSA0XSkgKiAoeSAtIHZbcyAtIDNdKSAtICh2W3MgLSAxXSAtIHZbcyAtIDNdKSAqICh4IC0gdltzIC0gNF0pID49IDApIHtcblx0XHRcdFx0cyAtPSAyO1xuXHRcdFx0XHRpZiAocyA9PT0gMikgYnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR2W3NdID0geDtcblx0XHRcdHZbcyArIDFdID0geTtcblx0XHR9XG5cdFx0dltzXSA9IHNvcnRlZFtuIC0gNF07XG5cdFx0dltzICsgMV0gPSBzb3J0ZWRbbiAtIDNdO1xuXHRcdGNvbnN0IHQgPSBzO1xuXHRcdHMgKz0gMjtcblx0XHRmb3IgKGxldCBpID0gbiAtIDY7IGkgPj0gMDsgaSAtPSAyLCBzICs9IDIpIHtcblx0XHRcdGNvbnN0IHggPSBzb3J0ZWRbaV0sIHkgPSBzb3J0ZWRbaSArIDFdO1xuXHRcdFx0d2hpbGUgKCh2W3MgLSAyXSAtIHZbcyAtIDRdKSAqICh5IC0gdltzIC0gM10pIC0gKHZbcyAtIDFdIC0gdltzIC0gM10pICogKHggLSB2W3MgLSA0XSkgPj0gMCkge1xuXHRcdFx0XHRzIC09IDI7XG5cdFx0XHRcdGlmIChzID09PSB0KSBicmVhaztcblx0XHRcdH1cblx0XHRcdHZbc10gPSB4O1xuXHRcdFx0dltzICsgMV0gPSB5O1xuXHRcdH1cblx0XHRwb2x5Z29uLmxlbmd0aCA9IHMgLSAyO1xuXHR9XG59XG4iXX0=
|