ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
379 lines • 31.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 { Shader } from "./Shader";
export class Mesh {
/**
* @param {?} context
* @param {?} attributes
* @param {?} maxVertices
* @param {?} maxIndices
*/
constructor(context, attributes, maxVertices, maxIndices) {
this.attributes = attributes;
this.verticesLength = 0;
this.dirtyVertices = false;
this.indicesLength = 0;
this.dirtyIndices = false;
this.elementsPerVertex = 0;
this.context =
context instanceof ManagedWebGLRenderingContext
? context
: new ManagedWebGLRenderingContext(context);
this.elementsPerVertex = 0;
for (let i = 0; i < attributes.length; i++) {
this.elementsPerVertex += attributes[i].numElements;
}
this.vertices = new Float32Array(maxVertices * this.elementsPerVertex);
this.indices = new Uint16Array(maxIndices);
this.context.addRestorable(this);
}
/**
* @return {?}
*/
getAttributes() {
return this.attributes;
}
/**
* @return {?}
*/
maxVertices() {
return this.vertices.length / this.elementsPerVertex;
}
/**
* @return {?}
*/
numVertices() {
return this.verticesLength / this.elementsPerVertex;
}
/**
* @param {?} length
* @return {?}
*/
setVerticesLength(length) {
this.dirtyVertices = true;
this.verticesLength = length;
}
/**
* @return {?}
*/
getVertices() {
return this.vertices;
}
/**
* @return {?}
*/
maxIndices() {
return this.indices.length;
}
/**
* @return {?}
*/
numIndices() {
return this.indicesLength;
}
/**
* @param {?} length
* @return {?}
*/
setIndicesLength(length) {
this.dirtyIndices = true;
this.indicesLength = length;
}
/**
* @return {?}
*/
getIndices() {
return this.indices;
}
/**
* @return {?}
*/
getVertexSizeInFloats() {
/** @type {?} */
let size = 0;
for (var i = 0; i < this.attributes.length; i++) {
/** @type {?} */
let attribute = this.attributes[i];
size += attribute.numElements;
}
return size;
}
/**
* @param {?} vertices
* @return {?}
*/
setVertices(vertices) {
this.dirtyVertices = true;
if (vertices.length > this.vertices.length)
throw Error("Mesh can't store more than " + this.maxVertices() + " vertices");
this.vertices.set(vertices, 0);
this.verticesLength = vertices.length;
}
/**
* @param {?} indices
* @return {?}
*/
setIndices(indices) {
this.dirtyIndices = true;
if (indices.length > this.indices.length)
throw Error("Mesh can't store more than " + this.maxIndices() + " indices");
this.indices.set(indices, 0);
this.indicesLength = indices.length;
}
/**
* @param {?} shader
* @param {?} primitiveType
* @return {?}
*/
draw(shader, primitiveType) {
this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0
? this.indicesLength
: this.verticesLength / this.elementsPerVertex);
}
/**
* @param {?} shader
* @param {?} primitiveType
* @param {?} offset
* @param {?} count
* @return {?}
*/
drawWithOffset(shader, primitiveType, offset, count) {
/** @type {?} */
let gl = this.context.gl;
if (this.dirtyVertices || this.dirtyIndices)
this.update();
this.bind(shader);
if (this.indicesLength > 0) {
gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2);
}
else {
gl.drawArrays(primitiveType, offset, count);
}
this.unbind(shader);
}
/**
* @param {?} shader
* @return {?}
*/
bind(shader) {
/** @type {?} */
let gl = this.context.gl;
gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer);
/** @type {?} */
let offset = 0;
for (let i = 0; i < this.attributes.length; i++) {
/** @type {?} */
let attrib = this.attributes[i];
/** @type {?} */
let location = shader.getAttributeLocation(attrib.name);
gl.enableVertexAttribArray(location);
gl.vertexAttribPointer(location, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4);
offset += attrib.numElements;
}
if (this.indicesLength > 0)
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer);
}
/**
* @param {?} shader
* @return {?}
*/
unbind(shader) {
/** @type {?} */
let gl = this.context.gl;
for (let i = 0; i < this.attributes.length; i++) {
/** @type {?} */
let attrib = this.attributes[i];
/** @type {?} */
let location = shader.getAttributeLocation(attrib.name);
gl.disableVertexAttribArray(location);
}
gl.bindBuffer(gl.ARRAY_BUFFER, null);
if (this.indicesLength > 0)
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
}
/**
* @private
* @return {?}
*/
update() {
/** @type {?} */
let gl = this.context.gl;
if (this.dirtyVertices) {
if (!this.verticesBuffer) {
this.verticesBuffer = gl.createBuffer();
}
gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer);
gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW);
this.dirtyVertices = false;
}
if (this.dirtyIndices) {
if (!this.indicesBuffer) {
this.indicesBuffer = gl.createBuffer();
}
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW);
this.dirtyIndices = false;
}
}
/**
* @return {?}
*/
restore() {
this.verticesBuffer = null;
this.indicesBuffer = null;
this.update();
}
/**
* @return {?}
*/
dispose() {
this.context.removeRestorable(this);
/** @type {?} */
let gl = this.context.gl;
gl.deleteBuffer(this.verticesBuffer);
gl.deleteBuffer(this.indicesBuffer);
}
}
if (false) {
/**
* @type {?}
* @private
*/
Mesh.prototype.context;
/**
* @type {?}
* @private
*/
Mesh.prototype.vertices;
/**
* @type {?}
* @private
*/
Mesh.prototype.verticesBuffer;
/**
* @type {?}
* @private
*/
Mesh.prototype.verticesLength;
/**
* @type {?}
* @private
*/
Mesh.prototype.dirtyVertices;
/**
* @type {?}
* @private
*/
Mesh.prototype.indices;
/**
* @type {?}
* @private
*/
Mesh.prototype.indicesBuffer;
/**
* @type {?}
* @private
*/
Mesh.prototype.indicesLength;
/**
* @type {?}
* @private
*/
Mesh.prototype.dirtyIndices;
/**
* @type {?}
* @private
*/
Mesh.prototype.elementsPerVertex;
/**
* @type {?}
* @private
*/
Mesh.prototype.attributes;
}
export class VertexAttribute {
/**
* @param {?} name
* @param {?} type
* @param {?} numElements
*/
constructor(name, type, numElements) {
this.name = name;
this.type = type;
this.numElements = numElements;
}
}
if (false) {
/** @type {?} */
VertexAttribute.prototype.name;
/** @type {?} */
VertexAttribute.prototype.type;
/** @type {?} */
VertexAttribute.prototype.numElements;
}
export class Position2Attribute extends VertexAttribute {
constructor() {
super(Shader.POSITION, VertexAttributeType.Float, 2);
}
}
export class Position3Attribute extends VertexAttribute {
constructor() {
super(Shader.POSITION, VertexAttributeType.Float, 3);
}
}
export class TexCoordAttribute extends VertexAttribute {
/**
* @param {?=} unit
*/
constructor(unit = 0) {
super(Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2);
}
}
export class ColorAttribute extends VertexAttribute {
constructor() {
super(Shader.COLOR, VertexAttributeType.Float, 4);
}
}
export class Color2Attribute extends VertexAttribute {
constructor() {
super(Shader.COLOR2, VertexAttributeType.Float, 4);
}
}
/** @enum {number} */
const VertexAttributeType = {
Float: 0,
};
export { VertexAttributeType };
VertexAttributeType[VertexAttributeType.Float] = 'Float';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJOzs7Ozs7O0lBZ0RmLFlBQ0UsT0FBNkQsRUFDckQsVUFBNkIsRUFDckMsV0FBbUIsRUFDbkIsVUFBa0I7UUFGVixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQTlDL0IsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHdEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBNEM1QixJQUFJLENBQUMsT0FBTztZQUNWLE9BQU8sWUFBWSw0QkFBNEI7Z0JBQzdDLENBQUMsQ0FBQyxPQUFPO2dCQUNULENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksV0FBVyxD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LENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDMUMsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELE1BQU0sT0FBTyxjQUFlLFNBQVEsZUFBZTtJQUNqRDtRQUNFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFDRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlO0lBQ2xEO1FBQ0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjs7O0lBRUMsUUFBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSBcIi4vV2ViR0xcIjtcclxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcbmltcG9ydCB7IFNoYWRlciB9IGZyb20gXCIuL1NoYWRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lc2ggaW1wbGVtZW50cyBEaXNwb3NhYmxlLCBSZXN0b3JhYmxlIHtcclxuICBwcml2YXRlIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xyXG4gIHByaXZhdGUgdmVydGljZXNCdWZmZXI6IFdlYkdMQnVmZmVyO1xyXG4gIHByaXZhdGUgdmVydGljZXNMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgZGlydHlWZXJ0aWNlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaW5kaWNlczogVWludDE2QXJyYXk7XHJcbiAgcHJpdmF0ZSBpbmRpY2VzQnVmZmVyOiBXZWJHTEJ1ZmZlcjtcclxuICBwcml2YXRlIGluZGljZXNMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgZGlydHlJbmRpY2VzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBlbGVtZW50c1BlclZlcnRleCA9IDA7XHJcbiAgZ2V0QXR0cmlidXRlcygpOiBWZXJ0ZXhBdHRyaWJ1dGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzO1xyXG4gIH1cclxuICBtYXhWZXJ0aWNlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGljZXMubGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleDtcclxuICB9XHJcbiAgbnVtVmVydGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2VzTGVuZ3RoIC8gdGhpcy5lbGVtZW50c1BlclZlcnRleDtcclxuICB9XHJcbiAgc2V0VmVydGljZXNMZW5ndGgobGVuZ3RoOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IHRydWU7XHJcbiAgICB0aGlzLnZlcnRpY2VzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIH1cclxuICBnZXRWZXJ0aWNlcygpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGljZXM7XHJcbiAgfVxyXG4gIG1heEluZGljZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmluZGljZXMubGVuZ3RoO1xyXG4gIH1cclxuICBudW1JbmRpY2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRpY2VzTGVuZ3RoO1xyXG4gIH1cclxuICBzZXRJbmRpY2VzTGVuZ3RoKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpcnR5SW5kaWNlcyA9IHRydWU7XHJcbiAgICB0aGlzLmluZGljZXNMZW5ndGggPSBsZW5ndGg7XHJcbiAgfVxyXG4gIGdldEluZGljZXMoKTogVWludDE2QXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kaWNlcztcclxuICB9XHJcbiAgZ2V0VmVydGV4U2l6ZUluRmxvYXRzKCk6IG51bWJlciB7XHJcbiAgICBsZXQgc2l6ZSA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW2ldO1xyXG4gICAgICBzaXplICs9IGF0dHJpYnV0ZS5udW1FbGVtZW50cztcclxuICAgIH1cclxuICAgIHJldHVybiBzaXplO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRleHQ6IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfCBXZWJHTFJlbmRlcmluZ0NvbnRleHQsXHJcbiAgICBwcml2YXRlIGF0dHJpYnV0ZXM6IFZlcnRleEF0dHJpYnV0ZVtdLFxyXG4gICAgbWF4VmVydGljZXM6IG51bWJlcixcclxuICAgIG1heEluZGljZXM6IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5jb250ZXh0ID1cclxuICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICA/IGNvbnRleHRcclxuICAgICAgICA6IG5ldyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0KGNvbnRleHQpO1xyXG4gICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCArPSBhdHRyaWJ1dGVzW2ldLm51bUVsZW1lbnRzO1xyXG4gICAgfVxyXG4gICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkobWF4VmVydGljZXMgKiB0aGlzLmVsZW1lbnRzUGVyVmVydGV4KTtcclxuICAgIHRoaXMuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShtYXhJbmRpY2VzKTtcclxuICAgIHRoaXMuY29udGV4dC5hZGRSZXN0b3JhYmxlKHRoaXMpO1xyXG4gIH1cclxuICBzZXRWZXJ0aWNlcyh2ZXJ0aWNlczogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgdGhpcy5kaXJ0eVZlcnRpY2VzID0gdHJ1ZTtcclxuICAgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPiB0aGlzLnZlcnRpY2VzLmxlbmd0aClcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgXCJNZXNoIGNhbid0IHN0b3JlIG1vcmUgdGhhbiBcIiArIHRoaXMubWF4VmVydGljZXMoKSArIFwiIHZlcnRpY2VzXCJcclxuICAgICAgKTtcclxuICAgIHRoaXMudmVydGljZXMuc2V0KHZlcnRpY2VzLCAwKTtcclxuICAgIHRoaXMudmVydGljZXNMZW5ndGggPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgfVxyXG4gIHNldEluZGljZXMoaW5kaWNlczogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgdGhpcy5kaXJ0eUluZGljZXMgPSB0cnVlO1xyXG4gICAgaWYgKGluZGljZXMubGVuZ3RoID4gdGhpcy5pbmRpY2VzLmxlbmd0aClcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgXCJNZXNoIGNhbid0IHN0b3JlIG1vcmUgdGhhbiBcIiArIHRoaXMubWF4SW5kaWNlcygpICsgXCIgaW5kaWNlc1wiXHJcbiAgICAgICk7XHJcbiAgICB0aGlzLmluZGljZXMuc2V0KGluZGljZXMsIDApO1xyXG4gICAgdGhpcy5pbmRpY2VzTGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XHJcbiAgfVxyXG4gIGRyYXcoc2hhZGVyOiBTaGFkZXIsIHByaW1pdGl2ZVR5cGU6IG51bWJlcikge1xyXG4gICAgdGhpcy5kcmF3V2l0aE9mZnNldChcclxuICAgICAgc2hhZGVyLFxyXG4gICAgICBwcmltaXRpdmVUeXBlLFxyXG4gICAgICAwLFxyXG4gICAgICB0aGlzLmluZGljZXNMZW5ndGggPiAwXHJcbiAgICAgICAgPyB0aGlzLmluZGljZXNMZW5ndGhcclxuICAgICAgICA6IHRoaXMudmVydGljZXNMZW5ndGggLyB0aGlzLmVsZW1lbnRzUGVyVmVydGV4XHJcbiAgICApO1xyXG4gIH1cclxuICBkcmF3V2l0aE9mZnNldChcclxuICAgIHNoYWRlcjogU2hhZGVyLFxyXG4gICAgcHJpbWl0aXZlVHlwZTogbnVtYmVyLFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBjb3VudDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAodGhpcy5kaXJ0eVZlcnRpY2VzIHx8IHRoaXMuZGlydHlJbmRpY2VzKSB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5iaW5kKHNoYWRlcik7XHJcbiAgICBpZiAodGhpcy5pbmRpY2VzTGVuZ3RoID4gMCkge1xyXG4gICAgICBnbC5kcmF3RWxlbWVudHMocHJpbWl0aXZlVHlwZSwgY291bnQsIGdsLlVOU0lHTkVEX1NIT1JULCBvZmZzZXQgKiAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdsLmRyYXdBcnJheXMocHJpbWl0aXZlVHlwZSwgb2Zmc2V0LCBjb3VudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVuYmluZChzaGFkZXIpO1xyXG4gIH1cclxuICBiaW5kKHNoYWRlcjogU2hhZGVyKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbaV07XHJcbiAgICAgIGxldCBsb2NhdGlvbiA9IHNoYWRlci5nZXRBdHRyaWJ1dGVMb2NhdGlvbihhdHRyaWIubmFtZSk7XHJcbiAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcclxuICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICBsb2NhdGlvbixcclxuICAgICAgICBhdHRyaWIubnVtRWxlbWVudHMsXHJcbiAgICAgICAgZ2wuRkxPQVQsXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgdGhpcy5lbGVtZW50c1BlclZlcnRleCAqIDQsXHJcbiAgICAgICAgb2Zmc2V0ICogNFxyXG4gICAgICApO1xyXG4gICAgICBvZmZzZXQgKz0gYXR0cmliLm51bUVsZW1lbnRzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5kaWNlc0xlbmd0aCA+IDApXHJcbiAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuaW5kaWNlc0J1ZmZlcik7XHJcbiAgfVxyXG4gIHVuYmluZChzaGFkZXI6IFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGF0dHJpYiA9IHRoaXMuYXR0cmlidXRlc1tpXTtcclxuICAgICAgbGV0IGxvY2F0aW9uID0gc2hhZGVyLmdldEF0dHJpYnV0ZUxvY2F0aW9uKGF0dHJpYi5uYW1lKTtcclxuICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcclxuICAgIH1cclxuICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICAgIGlmICh0aGlzLmluZGljZXNMZW5ndGggPiAwKSBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBpZiAodGhpcy5kaXJ0eVZlcnRpY2VzKSB7XHJcbiAgICAgIGlmICghdGhpcy52ZXJ0aWNlc0J1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuICAgICAgfVxyXG4gICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0aWNlc0J1ZmZlcik7XHJcbiAgICAgIGdsLmJ1ZmZlckRhdGEoXHJcbiAgICAgICAgZ2wuQVJSQVlfQlVGRkVSLFxyXG4gICAgICAgIHRoaXMudmVydGljZXMuc3ViYXJyYXkoMCwgdGhpcy52ZXJ0aWNlc0xlbmd0aCksXHJcbiAgICAgICAgZ2wuRFlOQU1JQ19EUkFXXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGlydHlWZXJ0aWNlcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGlydHlJbmRpY2VzKSB7XHJcbiAgICAgIGlmICghdGhpcy5pbmRpY2VzQnVmZmVyKSB7XHJcbiAgICAgICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5pbmRpY2VzQnVmZmVyKTtcclxuICAgICAgZ2wuYnVmZmVyRGF0YShcclxuICAgICAgICBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixcclxuICAgICAgICB0aGlzLmluZGljZXMuc3ViYXJyYXkoMCwgdGhpcy5pbmRpY2VzTGVuZ3RoKSxcclxuICAgICAgICBnbC5EWU5BTUlDX0RSQVdcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kaXJ0eUluZGljZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVzdG9yZSgpIHtcclxuICAgIHRoaXMudmVydGljZXNCdWZmZXIgPSBudWxsO1xyXG4gICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gbnVsbDtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzdG9yYWJsZSh0aGlzKTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRpY2VzQnVmZmVyKTtcclxuICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmluZGljZXNCdWZmZXIpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgdHlwZTogVmVydGV4QXR0cmlidXRlVHlwZSxcclxuICAgIHB1YmxpYyBudW1FbGVtZW50czogbnVtYmVyXHJcbiAgKSB7fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBQb3NpdGlvbjJBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLlBPU0lUSU9OLCBWZXJ0ZXhBdHRyaWJ1dGVUeXBlLkZsb2F0LCAyKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uM0F0dHJpYnV0ZSBleHRlbmRzIFZlcnRleEF0dHJpYnV0ZSB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihTaGFkZXIuUE9TSVRJT04sIFZlcnRleEF0dHJpYnV0ZVR5cGUuRmxvYXQsIDMpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVGV4Q29vcmRBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKHVuaXQ6IG51bWJlciA9IDApIHtcclxuICAgIHN1cGVyKFxyXG4gICAgICBTaGFkZXIuVEVYQ09PUkRTICsgKHVuaXQgPT0gMCA/IFwiXCIgOiB1bml0KSxcclxuICAgICAgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCxcclxuICAgICAgMlxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIENvbG9yQXR0cmlidXRlIGV4dGVuZHMgVmVydGV4QXR0cmlidXRlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKFNoYWRlci5DT0xPUiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgNCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBDb2xvcjJBdHRyaWJ1dGUgZXh0ZW5kcyBWZXJ0ZXhBdHRyaWJ1dGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoU2hhZGVyLkNPTE9SMiwgVmVydGV4QXR0cmlidXRlVHlwZS5GbG9hdCwgNCk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBlbnVtIFZlcnRleEF0dHJpYnV0ZVR5cGUge1xyXG4gIEZsb2F0XHJcbn1cclxuIl19