UNPKG

ngx-spine

Version:

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

246 lines 24 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /****************************************************************************** * 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"; /** * @abstract */ var /** * @abstract */ Attachment = /** @class */ (function () { function Attachment(name) { if (name == null) throw new Error("name cannot be null."); this.name = name; } return Attachment; }()); /** * @abstract */ export { Attachment }; if (false) { /** @type {?} */ Attachment.prototype.name; /** * @abstract * @return {?} */ Attachment.prototype.copy = function () { }; } /** * @abstract */ var VertexAttachment = /** @class */ (function (_super) { tslib_1.__extends(VertexAttachment, _super); function VertexAttachment(name) { var _this = _super.call(this, name) || this; _this.id = (VertexAttachment.nextID++ & 65535) << 11; _this.worldVerticesLength = 0; _this.deformAttachment = _this; return _this; } /** Transforms local vertices to world coordinates. * @param start The index of the first local vertex value to transform. Each vertex has 2 values, x and y. * @param count The number of world vertex values to output. Must be <= {@link #getWorldVerticesLength()} - start. * @param worldVertices The output world vertices. Must have a length >= offset + count. * @param offset The worldVertices index to begin writing values. */ /** * Transforms local vertices to world coordinates. * @param {?} slot * @param {?} start The index of the first local vertex value to transform. Each vertex has 2 values, x and y. * @param {?} count The number of world vertex values to output. Must be <= {\@link #getWorldVerticesLength()} - start. * @param {?} worldVertices The output world vertices. Must have a length >= offset + count. * @param {?} offset The worldVertices index to begin writing values. * @param {?} stride * @return {?} */ VertexAttachment.prototype.computeWorldVertices = /** * Transforms local vertices to world coordinates. * @param {?} slot * @param {?} start The index of the first local vertex value to transform. Each vertex has 2 values, x and y. * @param {?} count The number of world vertex values to output. Must be <= {\@link #getWorldVerticesLength()} - start. * @param {?} worldVertices The output world vertices. Must have a length >= offset + count. * @param {?} offset The worldVertices index to begin writing values. * @param {?} stride * @return {?} */ function (slot, start, count, worldVertices, offset, stride) { count = offset + (count >> 1) * stride; /** @type {?} */ var skeleton = slot.bone.skeleton; /** @type {?} */ var deformArray = slot.deform; /** @type {?} */ var vertices = this.vertices; /** @type {?} */ var bones = this.bones; if (bones == null) { if (deformArray.length > 0) vertices = deformArray; /** @type {?} */ var bone = slot.bone; /** @type {?} */ var x = bone.worldX; /** @type {?} */ var y = bone.worldY; /** @type {?} */ var a = bone.a; /** @type {?} */ var b = bone.b; /** @type {?} */ var c = bone.c; /** @type {?} */ var d = bone.d; for (var v_1 = start, w = offset; w < count; v_1 += 2, w += stride) { /** @type {?} */ var vx = vertices[v_1]; /** @type {?} */ var vy = vertices[v_1 + 1]; worldVertices[w] = vx * a + vy * b + x; worldVertices[w + 1] = vx * c + vy * d + y; } return; } /** @type {?} */ var v = 0; /** @type {?} */ var skip = 0; for (var i = 0; i < start; i += 2) { /** @type {?} */ var n = bones[v]; v += n + 1; skip += n; } /** @type {?} */ var skeletonBones = skeleton.bones; if (deformArray.length == 0) { for (var w = offset, b = skip * 3; w < count; w += stride) { /** @type {?} */ var wx = 0; /** @type {?} */ var wy = 0; /** @type {?} */ var n = bones[v++]; n += v; for (; v < n; v++, b += 3) { /** @type {?} */ var bone = skeletonBones[bones[v]]; /** @type {?} */ var vx = vertices[b]; /** @type {?} */ var vy = vertices[b + 1]; /** @type {?} */ var weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } else { /** @type {?} */ var deform = deformArray; for (var w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { /** @type {?} */ var wx = 0; /** @type {?} */ var wy = 0; /** @type {?} */ var n = bones[v++]; n += v; for (; v < n; v++, b += 3, f += 2) { /** @type {?} */ var bone = skeletonBones[bones[v]]; /** @type {?} */ var vx = vertices[b] + deform[f]; /** @type {?} */ var vy = vertices[b + 1] + deform[f + 1]; /** @type {?} */ var weight = vertices[b + 2]; wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; } worldVertices[w] = wx; worldVertices[w + 1] = wy; } } }; /** * @param {?} attachment * @return {?} */ VertexAttachment.prototype.copyTo = /** * @param {?} attachment * @return {?} */ function (attachment) { if (this.bones != null) { attachment.bones = new Array(this.bones.length); Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); } else attachment.bones = null; if (this.vertices != null) { attachment.vertices = Utils.newFloatArray(this.vertices.length); Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); } else attachment.vertices = null; attachment.worldVerticesLength = this.worldVerticesLength; attachment.deformAttachment = this.deformAttachment; }; VertexAttachment.nextID = 0; return VertexAttachment; }(Attachment)); export { VertexAttachment }; if (false) { /** * @type {?} * @private */ VertexAttachment.nextID; /** @type {?} */ VertexAttachment.prototype.id; /** @type {?} */ VertexAttachment.prototype.bones; /** @type {?} */ VertexAttachment.prototype.vertices; /** @type {?} */ VertexAttachment.prototype.worldVerticesLength; /** @type {?} */ VertexAttachment.prototype.deformAttachment; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE9BQU8sRUFBYSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7QUFHNUM7Ozs7SUFHRSxvQkFBWSxJQUFZO1FBQ3RCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUdILGlCQUFDO0FBQUQsQ0FBQyxBQVRELElBU0M7Ozs7Ozs7SUFSQywwQkFBYTs7Ozs7SUFPYiw0Q0FBNEI7Ozs7O0FBRzlCO0lBQStDLDRDQUFVO0lBU3ZELDBCQUFZLElBQVk7UUFBeEIsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FDWjtRQVJELFFBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUcvQyx5QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDeEIsc0JBQWdCLEdBQXFCLEtBQUksQ0FBQzs7SUFJMUMsQ0FBQztJQUVEOzs7O3dFQUlvRTs7Ozs7Ozs7Ozs7SUFDcEUsK0NBQW9COzs7Ozs7Ozs7O0lBQXBCLFVBQ0UsSUFBVSxFQUNWLEtBQWEsRUFDYixLQUFhLEVBQ2IsYUFBZ0MsRUFDaEMsTUFBYyxFQUNkLE1BQWM7UUFFZCxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7WUFDbkMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTs7WUFDN0IsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNOztZQUN6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O0NBQUEsQUF0SEQsQ0FBK0MsVUFBVSxHQXNIeEQ7U0F0SHFCLGdCQUFnQjs7Ozs7O0lBQ3BDLHdCQUEwQjs7SUFFMUIsOEJBQStDOztJQUMvQyxpQ0FBcUI7O0lBQ3JCLG9DQUE0Qjs7SUFDNUIsK0NBQXdCOztJQUN4Qiw0Q0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IEFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuLi9TbG90XCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXR0YWNobWVudCB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmIChuYW1lID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIm5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGNvcHkoKTogQXR0YWNobWVudDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZlcnRleEF0dGFjaG1lbnQgZXh0ZW5kcyBBdHRhY2htZW50IHtcclxuICBwcml2YXRlIHN0YXRpYyBuZXh0SUQgPSAwO1xyXG5cclxuICBpZCA9IChWZXJ0ZXhBdHRhY2htZW50Lm5leHRJRCsrICYgNjU1MzUpIDw8IDExO1xyXG4gIGJvbmVzOiBBcnJheTxudW1iZXI+O1xyXG4gIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPjtcclxuICB3b3JsZFZlcnRpY2VzTGVuZ3RoID0gMDtcclxuICBkZWZvcm1BdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50ID0gdGhpcztcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmFuc2Zvcm1zIGxvY2FsIHZlcnRpY2VzIHRvIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGxvY2FsIHZlcnRleCB2YWx1ZSB0byB0cmFuc2Zvcm0uIEVhY2ggdmVydGV4IGhhcyAyIHZhbHVlcywgeCBhbmQgeS5cclxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiB3b3JsZCB2ZXJ0ZXggdmFsdWVzIHRvIG91dHB1dC4gTXVzdCBiZSA8PSB7QGxpbmsgI2dldFdvcmxkVmVydGljZXNMZW5ndGgoKX0gLSBzdGFydC5cclxuICAgKiBAcGFyYW0gd29ybGRWZXJ0aWNlcyBUaGUgb3V0cHV0IHdvcmxkIHZlcnRpY2VzLiBNdXN0IGhhdmUgYSBsZW5ndGggPj0gb2Zmc2V0ICsgY291bnQuXHJcbiAgICogQHBhcmFtIG9mZnNldCBUaGUgd29ybGRWZXJ0aWNlcyBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy4gKi9cclxuICBjb21wdXRlV29ybGRWZXJ0aWNlcyhcclxuICAgIHNsb3Q6IFNsb3QsXHJcbiAgICBzdGFydDogbnVtYmVyLFxyXG4gICAgY291bnQ6IG51bWJlcixcclxuICAgIHdvcmxkVmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBzdHJpZGU6IG51bWJlclxyXG4gICkge1xyXG4gICAgY291bnQgPSBvZmZzZXQgKyAoY291bnQgPj4gMSkgKiBzdHJpZGU7XHJcbiAgICBsZXQgc2tlbGV0b24gPSBzbG90LmJvbmUuc2tlbGV0b247XHJcbiAgICBsZXQgZGVmb3JtQXJyYXkgPSBzbG90LmRlZm9ybTtcclxuICAgIGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgaWYgKGJvbmVzID09IG51bGwpIHtcclxuICAgICAgaWYgKGRlZm9ybUFycmF5Lmxlbmd0aCA+IDApIHZlcnRpY2VzID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGxldCBib25lID0gc2xvdC5ib25lO1xyXG4gICAgICBsZXQgeCA9IGJvbmUud29ybGRYO1xyXG4gICAgICBsZXQgeSA9IGJvbmUud29ybGRZO1xyXG4gICAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgICBiID0gYm9uZS5iLFxyXG4gICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgZCA9IGJvbmUuZDtcclxuICAgICAgZm9yIChsZXQgdiA9IHN0YXJ0LCB3ID0gb2Zmc2V0OyB3IDwgY291bnQ7IHYgKz0gMiwgdyArPSBzdHJpZGUpIHtcclxuICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1t2XSxcclxuICAgICAgICAgIHZ5ID0gdmVydGljZXNbdiArIDFdO1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB2eCAqIGEgKyB2eSAqIGIgKyB4O1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbdyArIDFdID0gdnggKiBjICsgdnkgKiBkICsgeTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgdiA9IDAsXHJcbiAgICAgIHNraXAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydDsgaSArPSAyKSB7XHJcbiAgICAgIGxldCBuID0gYm9uZXNbdl07XHJcbiAgICAgIHYgKz0gbiArIDE7XHJcbiAgICAgIHNraXAgKz0gbjtcclxuICAgIH1cclxuICAgIGxldCBza2VsZXRvbkJvbmVzID0gc2tlbGV0b24uYm9uZXM7XHJcbiAgICBpZiAoZGVmb3JtQXJyYXkubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgdyA9IG9mZnNldCwgYiA9IHNraXAgKiAzOyB3IDwgY291bnQ7IHcgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMpIHtcclxuICAgICAgICAgIGxldCBib25lID0gc2tlbGV0b25Cb25lc1tib25lc1t2XV07XHJcbiAgICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1tiXSxcclxuICAgICAgICAgICAgdnkgPSB2ZXJ0aWNlc1tiICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGVmb3JtID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IHcgPSBvZmZzZXQsIGIgPSBza2lwICogMywgZiA9IHNraXAgPDwgMTtcclxuICAgICAgICB3IDwgY291bnQ7XHJcbiAgICAgICAgdyArPSBzdHJpZGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMsIGYgKz0gMikge1xyXG4gICAgICAgICAgbGV0IGJvbmUgPSBza2VsZXRvbkJvbmVzW2JvbmVzW3ZdXTtcclxuICAgICAgICAgIGxldCB2eCA9IHZlcnRpY2VzW2JdICsgZGVmb3JtW2ZdLFxyXG4gICAgICAgICAgICB2eSA9IHZlcnRpY2VzW2IgKyAxXSArIGRlZm9ybVtmICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5VG8oYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xyXG4gICAgaWYgKHRoaXMuYm9uZXMgIT0gbnVsbCkge1xyXG4gICAgICBhdHRhY2htZW50LmJvbmVzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkodGhpcy5ib25lcywgMCwgYXR0YWNobWVudC5ib25lcywgMCwgdGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQuYm9uZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLnZlcnRpY2VzICE9IG51bGwpIHtcclxuICAgICAgYXR0YWNobWVudC52ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkodGhpcy52ZXJ0aWNlcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkoXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGF0dGFjaG1lbnQudmVydGljZXMsXHJcbiAgICAgICAgMCxcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLmxlbmd0aFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQudmVydGljZXMgPSBudWxsO1xyXG5cclxuICAgIGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHRoaXMud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgIGF0dGFjaG1lbnQuZGVmb3JtQXR0YWNobWVudCA9IHRoaXMuZGVmb3JtQXR0YWNobWVudDtcclxuICB9XHJcbn1cclxuIl19