ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
252 lines • 21.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { ManagedWebGLRenderingContext } from "./WebGL";
import { Mesh, Position2Attribute, ColorAttribute, TexCoordAttribute, Color2Attribute } from "./Mesh";
var PolygonBatcher = /** @class */ (function () {
function PolygonBatcher(context, twoColorTint, maxVertices) {
if (twoColorTint === void 0) { twoColorTint = true; }
if (maxVertices === void 0) { maxVertices = 10920; }
this.isDrawing = false;
this.shader = null;
this.lastTexture = null;
this.verticesLength = 0;
this.indicesLength = 0;
if (maxVertices > 10920)
throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices);
this.context =
context instanceof ManagedWebGLRenderingContext
? context
: new ManagedWebGLRenderingContext(context);
/** @type {?} */
var attributes = twoColorTint
? [
new Position2Attribute(),
new ColorAttribute(),
new TexCoordAttribute(),
new Color2Attribute()
]
: [
new Position2Attribute(),
new ColorAttribute(),
new TexCoordAttribute()
];
this.mesh = new Mesh(context, attributes, maxVertices, maxVertices * 3);
this.srcBlend = this.context.gl.SRC_ALPHA;
this.dstBlend = this.context.gl.ONE_MINUS_SRC_ALPHA;
}
/**
* @param {?} shader
* @return {?}
*/
PolygonBatcher.prototype.begin = /**
* @param {?} shader
* @return {?}
*/
function (shader) {
/** @type {?} */
var gl = this.context.gl;
if (this.isDrawing)
throw new Error("PolygonBatch is already drawing. Call PolygonBatch.end() before calling PolygonBatch.begin()");
this.drawCalls = 0;
this.shader = shader;
this.lastTexture = null;
this.isDrawing = true;
gl.enable(gl.BLEND);
gl.blendFunc(this.srcBlend, this.dstBlend);
};
/**
* @param {?} srcBlend
* @param {?} dstBlend
* @return {?}
*/
PolygonBatcher.prototype.setBlendMode = /**
* @param {?} srcBlend
* @param {?} dstBlend
* @return {?}
*/
function (srcBlend, dstBlend) {
/** @type {?} */
var gl = this.context.gl;
this.srcBlend = srcBlend;
this.dstBlend = dstBlend;
if (this.isDrawing) {
this.flush();
gl.blendFunc(this.srcBlend, this.dstBlend);
}
};
/**
* @param {?} texture
* @param {?} vertices
* @param {?} indices
* @return {?}
*/
PolygonBatcher.prototype.draw = /**
* @param {?} texture
* @param {?} vertices
* @param {?} indices
* @return {?}
*/
function (texture, vertices, indices) {
if (texture != this.lastTexture) {
this.flush();
this.lastTexture = texture;
}
else if (this.verticesLength + vertices.length > this.mesh.getVertices().length ||
this.indicesLength + indices.length > this.mesh.getIndices().length) {
this.flush();
}
/** @type {?} */
var indexStart = this.mesh.numVertices();
this.mesh.getVertices().set(vertices, this.verticesLength);
this.verticesLength += vertices.length;
this.mesh.setVerticesLength(this.verticesLength);
/** @type {?} */
var indicesArray = this.mesh.getIndices();
for (var i = this.indicesLength, j = 0; j < indices.length; i++, j++)
indicesArray[i] = indices[j] + indexStart;
this.indicesLength += indices.length;
this.mesh.setIndicesLength(this.indicesLength);
};
/**
* @private
* @return {?}
*/
PolygonBatcher.prototype.flush = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var gl = this.context.gl;
if (this.verticesLength == 0)
return;
this.lastTexture.bind();
this.mesh.draw(this.shader, gl.TRIANGLES);
this.verticesLength = 0;
this.indicesLength = 0;
this.mesh.setVerticesLength(0);
this.mesh.setIndicesLength(0);
this.drawCalls++;
};
/**
* @return {?}
*/
PolygonBatcher.prototype.end = /**
* @return {?}
*/
function () {
/** @type {?} */
var gl = this.context.gl;
if (!this.isDrawing)
throw new Error("PolygonBatch is not drawing. Call PolygonBatch.begin() before calling PolygonBatch.end()");
if (this.verticesLength > 0 || this.indicesLength > 0)
this.flush();
this.shader = null;
this.lastTexture = null;
this.isDrawing = false;
gl.disable(gl.BLEND);
};
/**
* @return {?}
*/
PolygonBatcher.prototype.getDrawCalls = /**
* @return {?}
*/
function () {
return this.drawCalls;
};
/**
* @return {?}
*/
PolygonBatcher.prototype.dispose = /**
* @return {?}
*/
function () {
this.mesh.dispose();
};
return PolygonBatcher;
}());
export { PolygonBatcher };
if (false) {
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.context;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.drawCalls;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.isDrawing;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.mesh;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.shader;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.lastTexture;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.verticesLength;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.indicesLength;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.srcBlend;
/**
* @type {?}
* @private
*/
PolygonBatcher.prototype.dstBlend;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9seWdvbkJhdGNoZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvd2ViZ2wvUG9seWdvbkJhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxJQUFJLEVBQ0osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsZUFBZSxFQUNoQixNQUFNLFFBQVEsQ0FBQztBQUtoQjtJQVdFLHdCQUNFLE9BQTZELEVBQzdELFlBQTRCLEVBQzVCLFdBQTJCO1FBRDNCLDZCQUFBLEVBQUEsbUJBQTRCO1FBQzVCLDRCQUFBLEVBQUEsbUJBQTJCO1FBWHJCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsV0FBTSxHQUFXLElBQUksQ0FBQztRQUN0QixnQkFBVyxHQUFjLElBQUksQ0FBQztRQUM5QixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQVF4QixJQUFJLFdBQVcsR0FBRyxLQUFLO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELEdBQUcsV0FBVyxDQUNqRSxDQUFDO1FBQ0osSUFBSSxDQUFDLE9BQU87WUFDVixPQUFPLFlBQVksNEJBQTRCO2dCQUM3QyxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7WUFDNUMsVUFBVSxHQUFHLFlBQVk7WUFDM0IsQ0FBQyxDQUFDO2dCQUNFLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3hCLElBQUksY0FBYyxFQUFFO2dCQUNwQixJQUFJLGlCQUFpQixFQUFFO2dCQUN2QixJQUFJLGVBQWUsRUFBRTthQUN0QjtZQUNILENBQUMsQ0FBQztnQkFDRSxJQUFJLGtCQUFrQixFQUFF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QUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDOzs7O0lBQ0QscUNBQVk7OztJQUFaO1FBQ0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFDRCxnQ0FBTzs7O0lBQVA7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUFuSEQsSUFtSEM7Ozs7Ozs7SUFsSEMsaUNBQThDOzs7OztJQUM5QyxtQ0FBMEI7Ozs7O0lBQzFCLG1DQUEwQjs7Ozs7SUFDMUIsOEJBQW1COzs7OztJQUNuQixnQ0FBOEI7Ozs7O0lBQzlCLHFDQUFzQzs7Ozs7SUFDdEMsd0NBQTJCOzs7OztJQUMzQix1Q0FBMEI7Ozs7O0lBQzFCLGtDQUF5Qjs7Ozs7SUFDekIsa0NBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbmltcG9ydCB7IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfSBmcm9tIFwiLi9XZWJHTFwiO1xyXG5pbXBvcnQge1xyXG4gIE1lc2gsXHJcbiAgUG9zaXRpb24yQXR0cmlidXRlLFxyXG4gIENvbG9yQXR0cmlidXRlLFxyXG4gIFRleENvb3JkQXR0cmlidXRlLFxyXG4gIENvbG9yMkF0dHJpYnV0ZVxyXG59IGZyb20gXCIuL01lc2hcIjtcclxuaW1wb3J0IHsgU2hhZGVyIH0gZnJvbSBcIi4vU2hhZGVyXCI7XHJcbmltcG9ydCB7IEdMVGV4dHVyZSB9IGZyb20gXCIuL0dMVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQb2x5Z29uQmF0Y2hlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xyXG4gIHByaXZhdGUgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcclxuICBwcml2YXRlIGRyYXdDYWxsczogbnVtYmVyO1xyXG4gIHByaXZhdGUgaXNEcmF3aW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBtZXNoOiBNZXNoO1xyXG4gIHByaXZhdGUgc2hhZGVyOiBTaGFkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgbGFzdFRleHR1cmU6IEdMVGV4dHVyZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlc0xlbmd0aCA9IDA7XHJcbiAgcHJpdmF0ZSBpbmRpY2VzTGVuZ3RoID0gMDtcclxuICBwcml2YXRlIHNyY0JsZW5kOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBkc3RCbGVuZDogbnVtYmVyO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dCxcclxuICAgIHR3b0NvbG9yVGludDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBtYXhWZXJ0aWNlczogbnVtYmVyID0gMTA5MjBcclxuICApIHtcclxuICAgIGlmIChtYXhWZXJ0aWNlcyA+IDEwOTIwKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgXCJDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMDkyMCB0cmlhbmdsZXMgcGVyIGJhdGNoOiBcIiArIG1heFZlcnRpY2VzXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLmNvbnRleHQgPVxyXG4gICAgICBjb250ZXh0IGluc3RhbmNlb2YgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICAgICAgID8gY29udGV4dFxyXG4gICAgICAgIDogbmV3IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQoY29udGV4dCk7XHJcbiAgICBsZXQgYXR0cmlidXRlcyA9IHR3b0NvbG9yVGludFxyXG4gICAgICA/IFtcclxuICAgICAgICAgIG5ldyBQb3NpdGlvbjJBdHRyaWJ1dGUoKSxcclxuICAgICAgICAgIG5ldyBDb2xvckF0dHJpYnV0ZSgpLFxyXG4gICAgICAgICAgbmV3IFRleENvb3JkQXR0cmlidXRlKCksXHJcbiAgICAgICAgICBuZXcgQ29sb3IyQXR0cmlidXRlKClcclxuICAgICAgICBdXHJcbiAgICAgIDogW1xyXG4gICAgICAgICAgbmV3IFBvc2l0aW9uMkF0dHJpYnV0ZSgpLFxyXG4gICAgICAgICAgbmV3IENvbG9yQXR0cmlidXRlKCksXHJcbiAgICAgICAgICBuZXcgVGV4Q29vcmRBdHRyaWJ1dGUoKVxyXG4gICAgICAgIF07XHJcbiAgICB0aGlzLm1lc2ggPSBuZXcgTWVzaChjb250ZXh0LCBhdHRyaWJ1dGVzLCBtYXhWZXJ0aWNlcywgbWF4VmVydGljZXMgKiAzKTtcclxuICAgIHRoaXMuc3JjQmxlbmQgPSB0aGlzLmNvbnRleHQuZ2wuU1JDX0FMUEhBO1xyXG4gICAgdGhpcy5kc3RCbGVuZCA9IHRoaXMuY29udGV4dC5nbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xyXG4gIH1cclxuICBiZWdpbihzaGFkZXI6IFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMuaXNEcmF3aW5nKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgXCJQb2x5Z29uQmF0Y2ggaXMgYWxyZWFkeSBkcmF3aW5nLiBDYWxsIFBvbHlnb25CYXRjaC5lbmQoKSBiZWZvcmUgY2FsbGluZyBQb2x5Z29uQmF0Y2guYmVnaW4oKVwiXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLmRyYXdDYWxscyA9IDA7XHJcbiAgICB0aGlzLnNoYWRlciA9IHNoYWRlcjtcclxuICAgIHRoaXMubGFzdFRleHR1cmUgPSBudWxsO1xyXG4gICAgdGhpcy5pc0RyYXdpbmcgPSB0cnVlO1xyXG4gICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcclxuICAgIGdsLmJsZW5kRnVuYyh0aGlzLnNyY0JsZW5kLCB0aGlzLmRzdEJsZW5kKTtcclxuICB9XHJcbiAgc2V0QmxlbmRNb2RlKHNyY0JsZW5kOiBudW1iZXIsIGRzdEJsZW5kOiBudW1iZXIpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIHRoaXMuc3JjQmxlbmQgPSBzcmNCbGVuZDtcclxuICAgIHRoaXMuZHN0QmxlbmQgPSBkc3RCbGVuZDtcclxuICAgIGlmICh0aGlzLmlzRHJhd2luZykge1xyXG4gICAgICB0aGlzLmZsdXNoKCk7XHJcbiAgICAgIGdsLmJsZW5kRnVuYyh0aGlzLnNyY0JsZW5kLCB0aGlzLmRzdEJsZW5kKTtcclxuICAgIH1cclxuICB9XHJcbiAgZHJhdyhcclxuICAgIHRleHR1cmU6IEdMVGV4dHVyZSxcclxuICAgIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgIGluZGljZXM6IEFycmF5PG51bWJlcj5cclxuICApIHtcclxuICAgIGlmICh0ZXh0dXJlICE9IHRoaXMubGFzdFRleHR1cmUpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgICB0aGlzLmxhc3RUZXh0dXJlID0gdGV4dHVyZTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMudmVydGljZXNMZW5ndGggKyB2ZXJ0aWNlcy5sZW5ndGggPiB0aGlzLm1lc2guZ2V0VmVydGljZXMoKS5sZW5ndGggfHxcclxuICAgICAgdGhpcy5pbmRpY2VzTGVuZ3RoICsgaW5kaWNlcy5sZW5ndGggPiB0aGlzLm1lc2guZ2V0SW5kaWNlcygpLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgIH1cclxuICAgIGxldCBpbmRleFN0YXJ0ID0gdGhpcy5tZXNoLm51bVZlcnRpY2VzKCk7XHJcbiAgICB0aGlzLm1lc2guZ2V0VmVydGljZXMoKS5zZXQodmVydGljZXMsIHRoaXMudmVydGljZXNMZW5ndGgpO1xyXG4gICAgdGhpcy52ZXJ0aWNlc0xlbmd0aCArPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICB0aGlzLm1lc2guc2V0VmVydGljZXNMZW5ndGgodGhpcy52ZXJ0aWNlc0xlbmd0aCk7XHJcbiAgICBsZXQgaW5kaWNlc0FycmF5ID0gdGhpcy5tZXNoLmdldEluZGljZXMoKTtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGljZXNMZW5ndGgsIGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGkrKywgaisrKVxyXG4gICAgICBpbmRpY2VzQXJyYXlbaV0gPSBpbmRpY2VzW2pdICsgaW5kZXhTdGFydDtcclxuICAgIHRoaXMuaW5kaWNlc0xlbmd0aCArPSBpbmRpY2VzLmxlbmd0aDtcclxuICAgIHRoaXMubWVzaC5zZXRJbmRpY2VzTGVuZ3RoKHRoaXMuaW5kaWNlc0xlbmd0aCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZmx1c2goKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAodGhpcy52ZXJ0aWNlc0xlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICB0aGlzLmxhc3RUZXh0dXJlLmJpbmQoKTtcclxuICAgIHRoaXMubWVzaC5kcmF3KHRoaXMuc2hhZGVyLCBnbC5UUklBTkdMRVMpO1xyXG4gICAgdGhpcy52ZXJ0aWNlc0xlbmd0aCA9IDA7XHJcbiAgICB0aGlzLmluZGljZXNMZW5ndGggPSAwO1xyXG4gICAgdGhpcy5tZXNoLnNldFZlcnRpY2VzTGVuZ3RoKDApO1xyXG4gICAgdGhpcy5tZXNoLnNldEluZGljZXNMZW5ndGgoMCk7XHJcbiAgICB0aGlzLmRyYXdDYWxscysrO1xyXG4gIH1cclxuICBlbmQoKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmF3aW5nKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgXCJQb2x5Z29uQmF0Y2ggaXMgbm90IGRyYXdpbmcuIENhbGwgUG9seWdvbkJhdGNoLmJlZ2luKCkgYmVmb3JlIGNhbGxpbmcgUG9seWdvbkJhdGNoLmVuZCgpXCJcclxuICAgICAgKTtcclxuICAgIGlmICh0aGlzLnZlcnRpY2VzTGVuZ3RoID4gMCB8fCB0aGlzLmluZGljZXNMZW5ndGggPiAwKSB0aGlzLmZsdXNoKCk7XHJcbiAgICB0aGlzLnNoYWRlciA9IG51bGw7XHJcbiAgICB0aGlzLmxhc3RUZXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XHJcbiAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcclxuICB9XHJcbiAgZ2V0RHJhd0NhbGxzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZHJhd0NhbGxzO1xyXG4gIH1cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5tZXNoLmRpc3Bvc2UoKTtcclxuICB9XHJcbn1cclxuIl19