ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
225 lines • 20.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";
export class PolygonBatcher {
/**
* @param {?} context
* @param {?=} twoColorTint
* @param {?=} maxVertices
*/
constructor(context, twoColorTint = true, 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 {?} */
let 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 {?}
*/
begin(shader) {
/** @type {?} */
let 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 {?}
*/
setBlendMode(srcBlend, dstBlend) {
/** @type {?} */
let 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 {?}
*/
draw(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 {?} */
let indexStart = this.mesh.numVertices();
this.mesh.getVertices().set(vertices, this.verticesLength);
this.verticesLength += vertices.length;
this.mesh.setVerticesLength(this.verticesLength);
/** @type {?} */
let indicesArray = this.mesh.getIndices();
for (let 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 {?}
*/
flush() {
/** @type {?} */
let 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 {?}
*/
end() {
/** @type {?} */
let 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 {?}
*/
getDrawCalls() {
return this.drawCalls;
}
/**
* @return {?}
*/
dispose() {
this.mesh.dispose();
}
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9seWdvbkJhdGNoZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvd2ViZ2wvUG9seWdvbkJhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxJQUFJLEVBQ0osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsZUFBZSxFQUNoQixNQUFNLFFBQVEsQ0FBQztBQUtoQixNQUFNLE9BQU8sY0FBYzs7Ozs7O0lBV3pCLFlBQ0UsT0FBNkQsRUFDN0QsZUFBd0IsSUFBSSxFQUM1QixjQUFzQixLQUFLO1FBWHJCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsV0FBTSxHQUFXLElBQUksQ0FBQztRQUN0QixnQkFBVyxHQUFjLElBQUksQ0FBQztRQUM5QixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQVF4QixJQUFJLFdBQVcsR0FBRyxLQUFLO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELEdBQUcsV0FBVyxDQUNqRSxDQUFDO1FBQ0osSUFBSSxDQUFDLE9BQU87WUFDVixPQUFPLFlBQVksNEJBQTRCO2dCQUM3QyxDQUFDLENBQUMsT0FBTztnQkFDVCxDQUFDLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7WUFDNUMsVUFBVSxHQUFHLFlBQVk7WUFDM0IsQ0FBQyxDQUFDO2dCQUNFLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3hCLElBQUksY0FBYyxFQUFFO2dCQUNwQixJQUFJLGlCQUFpQixFQUFFO2dCQUN2QixJQUFJLGVBQWUsRUFBRTthQUN0QjtZQUNILENBQUMsQ0FBQztnQkFDRSxJQUFJLGtCQUFrQixFQUFFO2dCQUN4QixJQUFJLGNBQWMs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UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQzs7OztJQUNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7OztJQUNELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDRjs7Ozs7O0lBbEhDLGlDQUE4Qzs7Ozs7SUFDOUMsbUNBQTBCOzs7OztJQUMxQixtQ0FBMEI7Ozs7O0lBQzFCLDhCQUFtQjs7Ozs7SUFDbkIsZ0NBQThCOzs7OztJQUM5QixxQ0FBc0M7Ozs7O0lBQ3RDLHdDQUEyQjs7Ozs7SUFDM0IsdUNBQTBCOzs7OztJQUMxQixrQ0FBeUI7Ozs7O0lBQ3pCLGtDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSBcIi4vV2ViR0xcIjtcclxuaW1wb3J0IHtcclxuICBNZXNoLFxyXG4gIFBvc2l0aW9uMkF0dHJpYnV0ZSxcclxuICBDb2xvckF0dHJpYnV0ZSxcclxuICBUZXhDb29yZEF0dHJpYnV0ZSxcclxuICBDb2xvcjJBdHRyaWJ1dGVcclxufSBmcm9tIFwiLi9NZXNoXCI7XHJcbmltcG9ydCB7IFNoYWRlciB9IGZyb20gXCIuL1NoYWRlclwiO1xyXG5pbXBvcnQgeyBHTFRleHR1cmUgfSBmcm9tIFwiLi9HTFRleHR1cmVcIjtcclxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUG9seWdvbkJhdGNoZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBwcml2YXRlIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgcHJpdmF0ZSBkcmF3Q2FsbHM6IG51bWJlcjtcclxuICBwcml2YXRlIGlzRHJhd2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbWVzaDogTWVzaDtcclxuICBwcml2YXRlIHNoYWRlcjogU2hhZGVyID0gbnVsbDtcclxuICBwcml2YXRlIGxhc3RUZXh0dXJlOiBHTFRleHR1cmUgPSBudWxsO1xyXG4gIHByaXZhdGUgdmVydGljZXNMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgaW5kaWNlc0xlbmd0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzcmNCbGVuZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgZHN0QmxlbmQ6IG51bWJlcjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTFJlbmRlcmluZ0NvbnRleHQsXHJcbiAgICB0d29Db2xvclRpbnQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgbWF4VmVydGljZXM6IG51bWJlciA9IDEwOTIwXHJcbiAgKSB7XHJcbiAgICBpZiAobWF4VmVydGljZXMgPiAxMDkyMClcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIFwiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTA5MjAgdHJpYW5nbGVzIHBlciBiYXRjaDogXCIgKyBtYXhWZXJ0aWNlc1xyXG4gICAgICApO1xyXG4gICAgdGhpcy5jb250ZXh0ID1cclxuICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICA/IGNvbnRleHRcclxuICAgICAgICA6IG5ldyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0KGNvbnRleHQpO1xyXG4gICAgbGV0IGF0dHJpYnV0ZXMgPSB0d29Db2xvclRpbnRcclxuICAgICAgPyBbXHJcbiAgICAgICAgICBuZXcgUG9zaXRpb24yQXR0cmlidXRlKCksXHJcbiAgICAgICAgICBuZXcgQ29sb3JBdHRyaWJ1dGUoKSxcclxuICAgICAgICAgIG5ldyBUZXhDb29yZEF0dHJpYnV0ZSgpLFxyXG4gICAgICAgICAgbmV3IENvbG9yMkF0dHJpYnV0ZSgpXHJcbiAgICAgICAgXVxyXG4gICAgICA6IFtcclxuICAgICAgICAgIG5ldyBQb3NpdGlvbjJBdHRyaWJ1dGUoKSxcclxuICAgICAgICAgIG5ldyBDb2xvckF0dHJpYnV0ZSgpLFxyXG4gICAgICAgICAgbmV3IFRleENvb3JkQXR0cmlidXRlKClcclxuICAgICAgICBdO1xyXG4gICAgdGhpcy5tZXNoID0gbmV3IE1lc2goY29udGV4dCwgYXR0cmlidXRlcywgbWF4VmVydGljZXMsIG1heFZlcnRpY2VzICogMyk7XHJcbiAgICB0aGlzLnNyY0JsZW5kID0gdGhpcy5jb250ZXh0LmdsLlNSQ19BTFBIQTtcclxuICAgIHRoaXMuZHN0QmxlbmQgPSB0aGlzLmNvbnRleHQuZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcclxuICB9XHJcbiAgYmVnaW4oc2hhZGVyOiBTaGFkZXIpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGlmICh0aGlzLmlzRHJhd2luZylcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIFwiUG9seWdvbkJhdGNoIGlzIGFscmVhZHkgZHJhd2luZy4gQ2FsbCBQb2x5Z29uQmF0Y2guZW5kKCkgYmVmb3JlIGNhbGxpbmcgUG9seWdvbkJhdGNoLmJlZ2luKClcIlxyXG4gICAgICApO1xyXG4gICAgdGhpcy5kcmF3Q2FsbHMgPSAwO1xyXG4gICAgdGhpcy5zaGFkZXIgPSBzaGFkZXI7XHJcbiAgICB0aGlzLmxhc3RUZXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuaXNEcmF3aW5nID0gdHJ1ZTtcclxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XHJcbiAgICBnbC5ibGVuZEZ1bmModGhpcy5zcmNCbGVuZCwgdGhpcy5kc3RCbGVuZCk7XHJcbiAgfVxyXG4gIHNldEJsZW5kTW9kZShzcmNCbGVuZDogbnVtYmVyLCBkc3RCbGVuZDogbnVtYmVyKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnNyY0JsZW5kID0gc3JjQmxlbmQ7XHJcbiAgICB0aGlzLmRzdEJsZW5kID0gZHN0QmxlbmQ7XHJcbiAgICBpZiAodGhpcy5pc0RyYXdpbmcpIHtcclxuICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgICBnbC5ibGVuZEZ1bmModGhpcy5zcmNCbGVuZCwgdGhpcy5kc3RCbGVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRyYXcoXHJcbiAgICB0ZXh0dXJlOiBHTFRleHR1cmUsXHJcbiAgICB2ZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj4sXHJcbiAgICBpbmRpY2VzOiBBcnJheTxudW1iZXI+XHJcbiAgKSB7XHJcbiAgICBpZiAodGV4dHVyZSAhPSB0aGlzLmxhc3RUZXh0dXJlKSB7XHJcbiAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgdGhpcy5sYXN0VGV4dHVyZSA9IHRleHR1cmU7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLnZlcnRpY2VzTGVuZ3RoICsgdmVydGljZXMubGVuZ3RoID4gdGhpcy5tZXNoLmdldFZlcnRpY2VzKCkubGVuZ3RoIHx8XHJcbiAgICAgIHRoaXMuaW5kaWNlc0xlbmd0aCArIGluZGljZXMubGVuZ3RoID4gdGhpcy5tZXNoLmdldEluZGljZXMoKS5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLmZsdXNoKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgaW5kZXhTdGFydCA9IHRoaXMubWVzaC5udW1WZXJ0aWNlcygpO1xyXG4gICAgdGhpcy5tZXNoLmdldFZlcnRpY2VzKCkuc2V0KHZlcnRpY2VzLCB0aGlzLnZlcnRpY2VzTGVuZ3RoKTtcclxuICAgIHRoaXMudmVydGljZXNMZW5ndGggKz0gdmVydGljZXMubGVuZ3RoO1xyXG4gICAgdGhpcy5tZXNoLnNldFZlcnRpY2VzTGVuZ3RoKHRoaXMudmVydGljZXNMZW5ndGgpO1xyXG4gICAgbGV0IGluZGljZXNBcnJheSA9IHRoaXMubWVzaC5nZXRJbmRpY2VzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRpY2VzTGVuZ3RoLCBqID0gMDsgaiA8IGluZGljZXMubGVuZ3RoOyBpKyssIGorKylcclxuICAgICAgaW5kaWNlc0FycmF5W2ldID0gaW5kaWNlc1tqXSArIGluZGV4U3RhcnQ7XHJcbiAgICB0aGlzLmluZGljZXNMZW5ndGggKz0gaW5kaWNlcy5sZW5ndGg7XHJcbiAgICB0aGlzLm1lc2guc2V0SW5kaWNlc0xlbmd0aCh0aGlzLmluZGljZXNMZW5ndGgpO1xyXG4gIH1cclxuICBwcml2YXRlIGZsdXNoKCkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKHRoaXMudmVydGljZXNMZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5sYXN0VGV4dHVyZS5iaW5kKCk7XHJcbiAgICB0aGlzLm1lc2guZHJhdyh0aGlzLnNoYWRlciwgZ2wuVFJJQU5HTEVTKTtcclxuICAgIHRoaXMudmVydGljZXNMZW5ndGggPSAwO1xyXG4gICAgdGhpcy5pbmRpY2VzTGVuZ3RoID0gMDtcclxuICAgIHRoaXMubWVzaC5zZXRWZXJ0aWNlc0xlbmd0aCgwKTtcclxuICAgIHRoaXMubWVzaC5zZXRJbmRpY2VzTGVuZ3RoKDApO1xyXG4gICAgdGhpcy5kcmF3Q2FsbHMrKztcclxuICB9XHJcbiAgZW5kKCkge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgaWYgKCF0aGlzLmlzRHJhd2luZylcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIFwiUG9seWdvbkJhdGNoIGlzIG5vdCBkcmF3aW5nLiBDYWxsIFBvbHlnb25CYXRjaC5iZWdpbigpIGJlZm9yZSBjYWxsaW5nIFBvbHlnb25CYXRjaC5lbmQoKVwiXHJcbiAgICAgICk7XHJcbiAgICBpZiAodGhpcy52ZXJ0aWNlc0xlbmd0aCA+IDAgfHwgdGhpcy5pbmRpY2VzTGVuZ3RoID4gMCkgdGhpcy5mbHVzaCgpO1xyXG4gICAgdGhpcy5zaGFkZXIgPSBudWxsO1xyXG4gICAgdGhpcy5sYXN0VGV4dHVyZSA9IG51bGw7XHJcbiAgICB0aGlzLmlzRHJhd2luZyA9IGZhbHNlO1xyXG4gICAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XHJcbiAgfVxyXG4gIGdldERyYXdDYWxscygpIHtcclxuICAgIHJldHVybiB0aGlzLmRyYXdDYWxscztcclxuICB9XHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMubWVzaC5kaXNwb3NlKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==