UNPKG

ngx-spine

Version:

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

564 lines 62.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * Spine Runtimes License Agreement * Last updated May 1, 2019. Replaces all prior versions. * * Copyright (c) 2013-2019, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS * INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Utils } from "./Utils"; import { Triangulator } from "./Triangulator"; var SkeletonClipping = /** @class */ (function () { function SkeletonClipping() { this.triangulator = new Triangulator(); this.clippingPolygon = new Array(); this.clipOutput = new Array(); this.clippedVertices = new Array(); this.clippedTriangles = new Array(); this.scratch = new Array(); } /** * @param {?} slot * @param {?} clip * @return {?} */ SkeletonClipping.prototype.clipStart = /** * @param {?} slot * @param {?} clip * @return {?} */ function (slot, clip) { if (this.clipAttachment != null) return 0; this.clipAttachment = clip; /** @type {?} */ var n = clip.worldVerticesLength; /** @type {?} */ var vertices = Utils.setArraySize(this.clippingPolygon, n); clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); /** @type {?} */ var clippingPolygon = this.clippingPolygon; SkeletonClipping.makeClockwise(clippingPolygon); /** @type {?} */ var clippingPolygons = (this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon))); for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) { /** @type {?} */ var polygon = clippingPolygons[i]; SkeletonClipping.makeClockwise(polygon); polygon.push(polygon[0]); polygon.push(polygon[1]); } return clippingPolygons.length; }; /** * @param {?} slot * @return {?} */ SkeletonClipping.prototype.clipEndWithSlot = /** * @param {?} slot * @return {?} */ function (slot) { if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data) this.clipEnd(); }; /** * @return {?} */ SkeletonClipping.prototype.clipEnd = /** * @return {?} */ function () { if (this.clipAttachment == null) return; this.clipAttachment = null; this.clippingPolygons = null; this.clippedVertices.length = 0; this.clippedTriangles.length = 0; this.clippingPolygon.length = 0; }; /** * @return {?} */ SkeletonClipping.prototype.isClipping = /** * @return {?} */ function () { return this.clipAttachment != null; }; /** * @param {?} vertices * @param {?} verticesLength * @param {?} triangles * @param {?} trianglesLength * @param {?} uvs * @param {?} light * @param {?} dark * @param {?} twoColor * @return {?} */ SkeletonClipping.prototype.clipTriangles = /** * @param {?} vertices * @param {?} verticesLength * @param {?} triangles * @param {?} trianglesLength * @param {?} uvs * @param {?} light * @param {?} dark * @param {?} twoColor * @return {?} */ function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { /** @type {?} */ var clipOutput = this.clipOutput; /** @type {?} */ var clippedVertices = this.clippedVertices; /** @type {?} */ var clippedTriangles = this.clippedTriangles; /** @type {?} */ var polygons = this.clippingPolygons; /** @type {?} */ var polygonsCount = this.clippingPolygons.length; /** @type {?} */ var vertexSize = twoColor ? 12 : 8; /** @type {?} */ var index = 0; clippedVertices.length = 0; clippedTriangles.length = 0; outer: for (var i = 0; i < trianglesLength; i += 3) { /** @type {?} */ var vertexOffset = triangles[i] << 1; /** @type {?} */ var x1 = vertices[vertexOffset]; /** @type {?} */ var y1 = vertices[vertexOffset + 1]; /** @type {?} */ var u1 = uvs[vertexOffset]; /** @type {?} */ var v1 = uvs[vertexOffset + 1]; vertexOffset = triangles[i + 1] << 1; /** @type {?} */ var x2 = vertices[vertexOffset]; /** @type {?} */ var y2 = vertices[vertexOffset + 1]; /** @type {?} */ var u2 = uvs[vertexOffset]; /** @type {?} */ var v2 = uvs[vertexOffset + 1]; vertexOffset = triangles[i + 2] << 1; /** @type {?} */ var x3 = vertices[vertexOffset]; /** @type {?} */ var y3 = vertices[vertexOffset + 1]; /** @type {?} */ var u3 = uvs[vertexOffset]; /** @type {?} */ var v3 = uvs[vertexOffset + 1]; for (var p = 0; p < polygonsCount; p++) { /** @type {?} */ var s = clippedVertices.length; if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { /** @type {?} */ var clipOutputLength = clipOutput.length; if (clipOutputLength == 0) continue; /** @type {?} */ var d0 = y2 - y3; /** @type {?} */ var d1 = x3 - x2; /** @type {?} */ var d2 = x1 - x3; /** @type {?} */ var d4 = y3 - y1; /** @type {?} */ var d = 1 / (d0 * d2 + d1 * (y1 - y3)); /** @type {?} */ var clipOutputCount = clipOutputLength >> 1; /** @type {?} */ var clipOutputItems = this.clipOutput; /** @type {?} */ var clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); for (var ii = 0; ii < clipOutputLength; ii += 2) { /** @type {?} */ var x = clipOutputItems[ii]; /** @type {?} */ var y = clipOutputItems[ii + 1]; clippedVerticesItems[s] = x; clippedVerticesItems[s + 1] = y; clippedVerticesItems[s + 2] = light.r; clippedVerticesItems[s + 3] = light.g; clippedVerticesItems[s + 4] = light.b; clippedVerticesItems[s + 5] = light.a; /** @type {?} */ var c0 = x - x3; /** @type {?} */ var c1 = y - y3; /** @type {?} */ var a = (d0 * c0 + d1 * c1) * d; /** @type {?} */ var b = (d4 * c0 + d2 * c1) * d; /** @type {?} */ var c = 1 - a - b; clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; if (twoColor) { clippedVerticesItems[s + 8] = dark.r; clippedVerticesItems[s + 9] = dark.g; clippedVerticesItems[s + 10] = dark.b; clippedVerticesItems[s + 11] = dark.a; } s += vertexSize; } s = clippedTriangles.length; /** @type {?} */ var clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); clipOutputCount--; for (var ii = 1; ii < clipOutputCount; ii++) { clippedTrianglesItems[s] = index; clippedTrianglesItems[s + 1] = index + ii; clippedTrianglesItems[s + 2] = index + ii + 1; s += 3; } index += clipOutputCount + 1; } else { /** @type {?} */ var clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize); clippedVerticesItems[s] = x1; clippedVerticesItems[s + 1] = y1; clippedVerticesItems[s + 2] = light.r; clippedVerticesItems[s + 3] = light.g; clippedVerticesItems[s + 4] = light.b; clippedVerticesItems[s + 5] = light.a; if (!twoColor) { clippedVerticesItems[s + 6] = u1; clippedVerticesItems[s + 7] = v1; clippedVerticesItems[s + 8] = x2; clippedVerticesItems[s + 9] = y2; clippedVerticesItems[s + 10] = light.r; clippedVerticesItems[s + 11] = light.g; clippedVerticesItems[s + 12] = light.b; clippedVerticesItems[s + 13] = light.a; clippedVerticesItems[s + 14] = u2; clippedVerticesItems[s + 15] = v2; clippedVerticesItems[s + 16] = x3; clippedVerticesItems[s + 17] = y3; clippedVerticesItems[s + 18] = light.r; clippedVerticesItems[s + 19] = light.g; clippedVerticesItems[s + 20] = light.b; clippedVerticesItems[s + 21] = light.a; clippedVerticesItems[s + 22] = u3; clippedVerticesItems[s + 23] = v3; } else { clippedVerticesItems[s + 6] = u1; clippedVerticesItems[s + 7] = v1; clippedVerticesItems[s + 8] = dark.r; clippedVerticesItems[s + 9] = dark.g; clippedVerticesItems[s + 10] = dark.b; clippedVerticesItems[s + 11] = dark.a; clippedVerticesItems[s + 12] = x2; clippedVerticesItems[s + 13] = y2; clippedVerticesItems[s + 14] = light.r; clippedVerticesItems[s + 15] = light.g; clippedVerticesItems[s + 16] = light.b; clippedVerticesItems[s + 17] = light.a; clippedVerticesItems[s + 18] = u2; clippedVerticesItems[s + 19] = v2; clippedVerticesItems[s + 20] = dark.r; clippedVerticesItems[s + 21] = dark.g; clippedVerticesItems[s + 22] = dark.b; clippedVerticesItems[s + 23] = dark.a; clippedVerticesItems[s + 24] = x3; clippedVerticesItems[s + 25] = y3; clippedVerticesItems[s + 26] = light.r; clippedVerticesItems[s + 27] = light.g; clippedVerticesItems[s + 28] = light.b; clippedVerticesItems[s + 29] = light.a; clippedVerticesItems[s + 30] = u3; clippedVerticesItems[s + 31] = v3; clippedVerticesItems[s + 32] = dark.r; clippedVerticesItems[s + 33] = dark.g; clippedVerticesItems[s + 34] = dark.b; clippedVerticesItems[s + 35] = dark.a; } s = clippedTriangles.length; /** @type {?} */ var clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3); clippedTrianglesItems[s] = index; clippedTrianglesItems[s + 1] = index + 1; clippedTrianglesItems[s + 2] = index + 2; index += 3; continue outer; } } } }; /** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */ /** * Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. * @param {?} x1 * @param {?} y1 * @param {?} x2 * @param {?} y2 * @param {?} x3 * @param {?} y3 * @param {?} clippingArea * @param {?} output * @return {?} */ SkeletonClipping.prototype.clip = /** * Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. * @param {?} x1 * @param {?} y1 * @param {?} x2 * @param {?} y2 * @param {?} x3 * @param {?} y3 * @param {?} clippingArea * @param {?} output * @return {?} */ function (x1, y1, x2, y2, x3, y3, clippingArea, output) { /** @type {?} */ var originalOutput = output; /** @type {?} */ var clipped = false; // Avoid copy at the end. /** @type {?} */ var input = null; if (clippingArea.length % 4 >= 2) { input = output; output = this.scratch; } else input = this.scratch; input.length = 0; input.push(x1); input.push(y1); input.push(x2); input.push(y2); input.push(x3); input.push(y3); input.push(x1); input.push(y1); output.length = 0; /** @type {?} */ var clippingVertices = clippingArea; /** @type {?} */ var clippingVerticesLast = clippingArea.length - 4; for (var i = 0;; i += 2) { /** @type {?} */ var edgeX = clippingVertices[i]; /** @type {?} */ var edgeY = clippingVertices[i + 1]; /** @type {?} */ var edgeX2 = clippingVertices[i + 2]; /** @type {?} */ var edgeY2 = clippingVertices[i + 3]; /** @type {?} */ var deltaX = edgeX - edgeX2; /** @type {?} */ var deltaY = edgeY - edgeY2; /** @type {?} */ var inputVertices = input; /** @type {?} */ var inputVerticesLength = input.length - 2; /** @type {?} */ var outputStart = output.length; for (var ii = 0; ii < inputVerticesLength; ii += 2) { /** @type {?} */ var inputX = inputVertices[ii]; /** @type {?} */ var inputY = inputVertices[ii + 1]; /** @type {?} */ var inputX2 = inputVertices[ii + 2]; /** @type {?} */ var inputY2 = inputVertices[ii + 3]; /** @type {?} */ var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { if (side2) { // v1 inside, v2 inside output.push(inputX2); output.push(inputY2); continue; } // v1 inside, v2 outside /** @type {?} */ var c0 = inputY2 - inputY; /** @type {?} */ var c2 = inputX2 - inputX; /** @type {?} */ var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); if (Math.abs(s) > 0.000001) { /** @type {?} */ var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; output.push(edgeX + (edgeX2 - edgeX) * ua); output.push(edgeY + (edgeY2 - edgeY) * ua); } else { output.push(edgeX); output.push(edgeY); } } else if (side2) { // v1 outside, v2 inside /** @type {?} */ var c0 = inputY2 - inputY; /** @type {?} */ var c2 = inputX2 - inputX; /** @type {?} */ var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); if (Math.abs(s) > 0.000001) { /** @type {?} */ var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; output.push(edgeX + (edgeX2 - edgeX) * ua); output.push(edgeY + (edgeY2 - edgeY) * ua); } else { output.push(edgeX); output.push(edgeY); } output.push(inputX2); output.push(inputY2); } clipped = true; } if (outputStart == output.length) { // All edges outside. originalOutput.length = 0; return true; } output.push(output[0]); output.push(output[1]); if (i == clippingVerticesLast) break; /** @type {?} */ var temp = output; output = input; output.length = 0; input = temp; } if (originalOutput != output) { originalOutput.length = 0; for (var i = 0, n = output.length - 2; i < n; i++) originalOutput[i] = output[i]; } else originalOutput.length = originalOutput.length - 2; return clipped; }; /** * @param {?} polygon * @return {?} */ SkeletonClipping.makeClockwise = /** * @param {?} polygon * @return {?} */ function (polygon) { /** @type {?} */ var vertices = polygon; /** @type {?} */ var verticeslength = polygon.length; /** @type {?} */ var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1]; /** @type {?} */ var p1x = 0; /** @type {?} */ var p1y = 0; /** @type {?} */ var p2x = 0; /** @type {?} */ var p2y = 0; for (var i = 0, n = verticeslength - 3; i < n; i += 2) { p1x = vertices[i]; p1y = vertices[i + 1]; p2x = vertices[i + 2]; p2y = vertices[i + 3]; area += p1x * p2y - p2x * p1y; } if (area < 0) return; for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { /** @type {?} */ var x = vertices[i]; /** @type {?} */ var y = vertices[i + 1]; /** @type {?} */ var other = lastX - i; vertices[i] = vertices[other]; vertices[i + 1] = vertices[other + 1]; vertices[other] = x; vertices[other + 1] = y; } }; return SkeletonClipping; }()); export { SkeletonClipping }; if (false) { /** * @type {?} * @private */ SkeletonClipping.prototype.triangulator; /** * @type {?} * @private */ SkeletonClipping.prototype.clippingPolygon; /** * @type {?} * @private */ SkeletonClipping.prototype.clipOutput; /** @type {?} */ SkeletonClipping.prototype.clippedVertices; /** @type {?} */ SkeletonClipping.prototype.clippedTriangles; /** * @type {?} * @private */ SkeletonClipping.prototype.scratch; /** * @type {?} * @private */ SkeletonClipping.prototype.clipAttachment; /** * @type {?} * @private */ SkeletonClipping.prototype.clippingPolygons; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1NrZWxldG9uQ2xpcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFhLEtBQUssRUFBUyxNQUFNLFNBQVMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUM7SUFBQTtRQUNVLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDekMsb0JBQWUsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3RDLHFCQUFnQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDL0IsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFvWHhDLENBQUM7Ozs7OztJQS9XQyxvQ0FBUzs7Ozs7SUFBVCxVQUFVLElBQVUsRUFBRSxJQUF3QjtRQUM1QyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDOztZQUV2QixDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjs7WUFDNUIsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ2xELGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZTtRQUMxQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMs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RyxFQUFFLENBQUM7d0JBQ2pDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUVsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDbkM7eUJBQU07d0JBQ0wsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBRXRDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFFdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUN2QztvQkFFRCxDQUFDLEdB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LEdBQUcsQ0FBQzs7WUFDUCxHQUFHLEdBQUcsQ0FBQztRQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyRCxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDL0I7UUFDRCxJQUFJLElBQUksR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQixLQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxJQUFJLENBQUMsRUFDOUQsQ0FBQyxHQUFHLENBQUMsRUFDTCxDQUFDLElBQUksQ0FBQyxFQUNOOztnQkFDSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQzs7Z0JBQ2pCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Z0JBQ2pCLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQztZQUNyQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxBQTFYRCxJQTBYQzs7Ozs7OztJQXpYQyx3Q0FBMEM7Ozs7O0lBQzFDLDJDQUE4Qzs7Ozs7SUFDOUMsc0NBQXlDOztJQUN6QywyQ0FBc0M7O0lBQ3RDLDRDQUF1Qzs7Ozs7SUFDdkMsbUNBQXNDOzs7OztJQUV0QywwQ0FBMkM7Ozs7O0lBQzNDLDRDQUErQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcnJheUxpa2UsIFV0aWxzLCBDb2xvciB9IGZyb20gXCIuL1V0aWxzXCI7XG5pbXBvcnQgeyBUcmlhbmd1bGF0b3IgfSBmcm9tIFwiLi9Ucmlhbmd1bGF0b3JcIjtcbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0NsaXBwaW5nQXR0YWNobWVudFwiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuL1Nsb3RcIjtcblxuZXhwb3J0IGNsYXNzIFNrZWxldG9uQ2xpcHBpbmcge1xuICBwcml2YXRlIHRyaWFuZ3VsYXRvciA9IG5ldyBUcmlhbmd1bGF0b3IoKTtcbiAgcHJpdmF0ZSBjbGlwcGluZ1BvbHlnb24gPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBwcml2YXRlIGNsaXBPdXRwdXQgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBjbGlwcGVkVmVydGljZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICBjbGlwcGVkVHJpYW5nbGVzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBzY3JhdGNoID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuICBwcml2YXRlIGNsaXBBdHRhY2htZW50OiBDbGlwcGluZ0F0dGFjaG1lbnQ7XG4gIHByaXZhdGUgY2xpcHBpbmdQb2x5Z29uczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG5cbiAgY2xpcFN0YXJ0KHNsb3Q6IFNsb3QsIGNsaXA6IENsaXBwaW5nQXR0YWNobWVudCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgdGhpcy5jbGlwQXR0YWNobWVudCA9IGNsaXA7XG5cbiAgICBsZXQgbiA9IGNsaXAud29ybGRWZXJ0aWNlc0xlbmd0aDtcbiAgICBsZXQgdmVydGljZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5jbGlwcGluZ1BvbHlnb24sIG4pO1xuICAgIGNsaXAuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbiwgdmVydGljZXMsIDAsIDIpO1xuICAgIGxldCBjbGlwcGluZ1BvbHlnb24gPSB0aGlzLmNsaXBwaW5nUG9seWdvbjtcbiAgICBTa2VsZXRvbkNsaXBwaW5nLm1ha2VDbG9ja3dpc2UoY2xpcHBpbmdQb2x5Z29uKTtcbiAgICBsZXQgY2xpcHBpbmdQb2x5Z29ucyA9ICh0aGlzLmNsaXBwaW5nUG9seWdvbnMgPSB0aGlzLnRyaWFuZ3VsYXRvci5kZWNvbXBvc2UoXG4gICAgICBjbGlwcGluZ1BvbHlnb24sXG4gICAgICB0aGlzLnRyaWFuZ3VsYXRvci50cmlhbmd1bGF0ZShjbGlwcGluZ1BvbHlnb24pXG4gICAgKSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBjbGlwcGluZ1BvbHlnb25zLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgbGV0IHBvbHlnb24gPSBjbGlwcGluZ1BvbHlnb25zW2ldO1xuICAgICAgU2tlbGV0b25DbGlwcGluZy5tYWtlQ2xvY2t3aXNlKHBvbHlnb24pO1xuICAgICAgcG9seWdvbi5wdXNoKHBvbHlnb25bMF0pO1xuICAgICAgcG9seWdvbi5wdXNoKHBvbHlnb25bMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGluZ1BvbHlnb25zLmxlbmd0aDtcbiAgfVxuXG4gIGNsaXBFbmRXaXRoU2xvdChzbG90OiBTbG90KSB7XG4gICAgaWYgKHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbCAmJiB0aGlzLmNsaXBBdHRhY2htZW50LmVuZFNsb3QgPT0gc2xvdC5kYXRhKVxuICAgICAgdGhpcy5jbGlwRW5kKCk7XG4gIH1cblxuICBjbGlwRW5kKCkge1xuICAgIGlmICh0aGlzLmNsaXBBdHRhY2htZW50ID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmNsaXBBdHRhY2htZW50ID0gbnVsbDtcbiAgICB0aGlzLmNsaXBwaW5nUG9seWdvbnMgPSBudWxsO1xuICAgIHRoaXMuY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5jbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5jbGlwcGluZ1BvbHlnb24ubGVuZ3RoID0gMDtcbiAgfVxuXG4gIGlzQ2xpcHBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbDtcbiAgfVxuXG4gIGNsaXBUcmlhbmdsZXMoXG4gICAgdmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxuICAgIHZlcnRpY2VzTGVuZ3RoOiBudW1iZXIsXG4gICAgdHJpYW5nbGVzOiBBcnJheUxpa2U8bnVtYmVyPixcbiAgICB0cmlhbmdsZXNMZW5ndGg6IG51bWJlcixcbiAgICB1dnM6IEFycmF5TGlrZTxudW1iZXI+LFxuICAgIGxpZ2h0OiBDb2xvcixcbiAgICBkYXJrOiBDb2xvcixcbiAgICB0d29Db2xvcjogYm9vbGVhblxuICApIHtcbiAgICBsZXQgY2xpcE91dHB1dCA9IHRoaXMuY2xpcE91dHB1dCxcbiAgICAgIGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuY2xpcHBlZFZlcnRpY2VzO1xuICAgIGxldCBjbGlwcGVkVHJpYW5nbGVzID0gdGhpcy5jbGlwcGVkVHJpYW5nbGVzO1xuICAgIGxldCBwb2x5Z29ucyA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucztcbiAgICBsZXQgcG9seWdvbnNDb3VudCA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7XG4gICAgbGV0IHZlcnRleFNpemUgPSB0d29Db2xvciA/IDEyIDogODtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG4gICAgY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuICAgIG91dGVyOiBmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlc0xlbmd0aDsgaSArPSAzKSB7XG4gICAgICBsZXQgdmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2ldIDw8IDE7XG4gICAgICBsZXQgeDEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MSA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUxID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYxID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICB2ZXJ0ZXhPZmZzZXQgPSB0cmlhbmdsZXNbaSArIDFdIDw8IDE7XG4gICAgICBsZXQgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MiA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUyID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYyID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICB2ZXJ0ZXhPZmZzZXQgPSB0cmlhbmdsZXNbaSArIDJdIDw8IDE7XG4gICAgICBsZXQgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXRdLFxuICAgICAgICB5MyA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldCArIDFdO1xuICAgICAgbGV0IHUzID0gdXZzW3ZlcnRleE9mZnNldF0sXG4gICAgICAgIHYzID0gdXZzW3ZlcnRleE9mZnNldCArIDFdO1xuXG4gICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHBvbHlnb25zQ291bnQ7IHArKykge1xuICAgICAgICBsZXQgcyA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLmNsaXAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcG9seWdvbnNbcF0sIGNsaXBPdXRwdXQpKSB7XG4gICAgICAgICAgbGV0IGNsaXBPdXRwdXRMZW5ndGggPSBjbGlwT3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICBpZiAoY2xpcE91dHB1dExlbmd0aCA9PSAwKSBjb250aW51ZTtcbiAgICAgICAgICBsZXQgZDAgPSB5MiAtIHkzLFxuICAgICAgICAgICAgZDEgPSB4MyAtIHgyLFxuICAgICAgICAgICAgZDIgPSB4MSAtIHgzLFxuICAgICAgICAgICAgZDQgPSB5MyAtIHkxO1xuICAgICAgICAgIGxldCBkID0gMSAvIChkMCAqIGQyICsgZDEgKiAoeTEgLSB5MykpO1xuXG4gICAgICAgICAgbGV0IGNsaXBPdXRwdXRDb3VudCA9IGNsaXBPdXRwdXRMZW5ndGggPj4gMTtcbiAgICAgICAgICBsZXQgY2xpcE91dHB1dEl0ZW1zID0gdGhpcy5jbGlwT3V0cHV0O1xuICAgICAgICAgIGxldCBjbGlwcGVkVmVydGljZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShcbiAgICAgICAgICAgIGNsaXBwZWRWZXJ0aWNlcyxcbiAgICAgICAgICAgIHMgKyBjbGlwT3V0cHV0Q291bnQgKiB2ZXJ0ZXhTaXplXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgY2xpcE91dHB1dExlbmd0aDsgaWkgKz0gMikge1xuICAgICAgICAgICAgbGV0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLFxuICAgICAgICAgICAgICB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzXSA9IHg7XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMV0gPSB5O1xuICAgICAgICAgICAgY2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDJdID0gbGlnaHQucjtcbiAgICAgICAgICAgIGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAzXSA9IGxpZ2h0Lmc7XG4gICAgICAgICAgICBjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNF0gPSBsaWdodC5iO1xuICAg