ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
508 lines • 40.1 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";
var Shader = /** @class */ (function () {
function Shader(context, vertexShader, fragmentShader) {
this.vertexShader = vertexShader;
this.fragmentShader = fragmentShader;
this.vs = null;
this.fs = null;
this.program = null;
this.tmp2x2 = new Float32Array(2 * 2);
this.tmp3x3 = new Float32Array(3 * 3);
this.tmp4x4 = new Float32Array(4 * 4);
this.vsSource = vertexShader;
this.fsSource = fragmentShader;
this.context =
context instanceof ManagedWebGLRenderingContext
? context
: new ManagedWebGLRenderingContext(context);
this.context.addRestorable(this);
this.compile();
}
/**
* @return {?}
*/
Shader.prototype.getProgram = /**
* @return {?}
*/
function () {
return this.program;
};
/**
* @return {?}
*/
Shader.prototype.getVertexShader = /**
* @return {?}
*/
function () {
return this.vertexShader;
};
/**
* @return {?}
*/
Shader.prototype.getFragmentShader = /**
* @return {?}
*/
function () {
return this.fragmentShader;
};
/**
* @return {?}
*/
Shader.prototype.getVertexShaderSource = /**
* @return {?}
*/
function () {
return this.vsSource;
};
/**
* @return {?}
*/
Shader.prototype.getFragmentSource = /**
* @return {?}
*/
function () {
return this.fsSource;
};
/**
* @private
* @return {?}
*/
Shader.prototype.compile = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var gl = this.context.gl;
try {
this.vs = this.compileShader(gl.VERTEX_SHADER, this.vertexShader);
this.fs = this.compileShader(gl.FRAGMENT_SHADER, this.fragmentShader);
this.program = this.compileProgram(this.vs, this.fs);
}
catch (e) {
this.dispose();
throw e;
}
};
/**
* @private
* @param {?} type
* @param {?} source
* @return {?}
*/
Shader.prototype.compileShader = /**
* @private
* @param {?} type
* @param {?} source
* @return {?}
*/
function (type, source) {
/** @type {?} */
var gl = this.context.gl;
/** @type {?} */
var shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
/** @type {?} */
var error = "Couldn't compile shader: " + gl.getShaderInfoLog(shader);
gl.deleteShader(shader);
if (!gl.isContextLost())
throw new Error(error);
}
return shader;
};
/**
* @private
* @param {?} vs
* @param {?} fs
* @return {?}
*/
Shader.prototype.compileProgram = /**
* @private
* @param {?} vs
* @param {?} fs
* @return {?}
*/
function (vs, fs) {
/** @type {?} */
var gl = this.context.gl;
/** @type {?} */
var program = gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
/** @type {?} */
var error = "Couldn't compile shader program: " + gl.getProgramInfoLog(program);
gl.deleteProgram(program);
if (!gl.isContextLost())
throw new Error(error);
}
return program;
};
/**
* @return {?}
*/
Shader.prototype.restore = /**
* @return {?}
*/
function () {
this.compile();
};
/**
* @return {?}
*/
Shader.prototype.bind = /**
* @return {?}
*/
function () {
this.context.gl.useProgram(this.program);
};
/**
* @return {?}
*/
Shader.prototype.unbind = /**
* @return {?}
*/
function () {
this.context.gl.useProgram(null);
};
/**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
Shader.prototype.setUniformi = /**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
function (uniform, value) {
this.context.gl.uniform1i(this.getUniformLocation(uniform), value);
};
/**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
Shader.prototype.setUniformf = /**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
function (uniform, value) {
this.context.gl.uniform1f(this.getUniformLocation(uniform), value);
};
/**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @return {?}
*/
Shader.prototype.setUniform2f = /**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @return {?}
*/
function (uniform, value, value2) {
this.context.gl.uniform2f(this.getUniformLocation(uniform), value, value2);
};
/**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @param {?} value3
* @return {?}
*/
Shader.prototype.setUniform3f = /**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @param {?} value3
* @return {?}
*/
function (uniform, value, value2, value3) {
this.context.gl.uniform3f(this.getUniformLocation(uniform), value, value2, value3);
};
/**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @param {?} value3
* @param {?} value4
* @return {?}
*/
Shader.prototype.setUniform4f = /**
* @param {?} uniform
* @param {?} value
* @param {?} value2
* @param {?} value3
* @param {?} value4
* @return {?}
*/
function (uniform, value, value2, value3, value4) {
this.context.gl.uniform4f(this.getUniformLocation(uniform), value, value2, value3, value4);
};
/**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
Shader.prototype.setUniform2x2f = /**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
function (uniform, value) {
/** @type {?} */
var gl = this.context.gl;
this.tmp2x2.set(value);
gl.uniformMatrix2fv(this.getUniformLocation(uniform), false, this.tmp2x2);
};
/**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
Shader.prototype.setUniform3x3f = /**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
function (uniform, value) {
/** @type {?} */
var gl = this.context.gl;
this.tmp3x3.set(value);
gl.uniformMatrix3fv(this.getUniformLocation(uniform), false, this.tmp3x3);
};
/**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
Shader.prototype.setUniform4x4f = /**
* @param {?} uniform
* @param {?} value
* @return {?}
*/
function (uniform, value) {
/** @type {?} */
var gl = this.context.gl;
this.tmp4x4.set(value);
gl.uniformMatrix4fv(this.getUniformLocation(uniform), false, this.tmp4x4);
};
/**
* @param {?} uniform
* @return {?}
*/
Shader.prototype.getUniformLocation = /**
* @param {?} uniform
* @return {?}
*/
function (uniform) {
/** @type {?} */
var gl = this.context.gl;
/** @type {?} */
var location = gl.getUniformLocation(this.program, uniform);
if (!location && !gl.isContextLost())
throw new Error("Couldn't find location for uniform " + uniform);
return location;
};
/**
* @param {?} attribute
* @return {?}
*/
Shader.prototype.getAttributeLocation = /**
* @param {?} attribute
* @return {?}
*/
function (attribute) {
/** @type {?} */
var gl = this.context.gl;
/** @type {?} */
var location = gl.getAttribLocation(this.program, attribute);
if (location == -1 && !gl.isContextLost())
throw new Error("Couldn't find location for attribute " + attribute);
return location;
};
/**
* @return {?}
*/
Shader.prototype.dispose = /**
* @return {?}
*/
function () {
this.context.removeRestorable(this);
/** @type {?} */
var gl = this.context.gl;
if (this.vs) {
gl.deleteShader(this.vs);
this.vs = null;
}
if (this.fs) {
gl.deleteShader(this.fs);
this.fs = null;
}
if (this.program) {
gl.deleteProgram(this.program);
this.program = null;
}
};
/**
* @param {?} context
* @return {?}
*/
Shader.newColoredTextured = /**
* @param {?} context
* @return {?}
*/
function (context) {
/** @type {?} */
var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t";
/** @type {?} */
var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n\t\t\t\t}\n\t\t\t";
return new Shader(context, vs, fs);
};
/**
* @param {?} context
* @return {?}
*/
Shader.newTwoColoredTextured = /**
* @param {?} context
* @return {?}
*/
function (context) {
/** @type {?} */
var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR2 + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_light;\n\t\t\t\tvarying vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_light = " + Shader.COLOR + ";\n\t\t\t\t\tv_dark = " + Shader.COLOR2 + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t";
/** @type {?} */
var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_light;\n\t\t\t\tvarying LOWP vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tvoid main () {\n\t\t\t\t\tvec4 texColor = texture2D(u_texture, v_texCoords);\n\t\t\t\t\tgl_FragColor.a = texColor.a * v_light.a;\n\t\t\t\t\tgl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb;\n\t\t\t\t}\n\t\t\t";
return new Shader(context, vs, fs);
};
/**
* @param {?} context
* @return {?}
*/
Shader.newColored = /**
* @param {?} context
* @return {?}
*/
function (context) {
/** @type {?} */
var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t";
/** @type {?} */
var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color;\n\t\t\t\t}\n\t\t\t";
return new Shader(context, vs, fs);
};
Shader.MVP_MATRIX = "u_projTrans";
Shader.POSITION = "a_position";
Shader.COLOR = "a_color";
Shader.COLOR2 = "a_color2";
Shader.TEXCOORDS = "a_texCoords";
Shader.SAMPLER = "u_texture";
return Shader;
}());
export { Shader };
if (false) {
/** @type {?} */
Shader.MVP_MATRIX;
/** @type {?} */
Shader.POSITION;
/** @type {?} */
Shader.COLOR;
/** @type {?} */
Shader.COLOR2;
/** @type {?} */
Shader.TEXCOORDS;
/** @type {?} */
Shader.SAMPLER;
/**
* @type {?}
* @private
*/
Shader.prototype.context;
/**
* @type {?}
* @private
*/
Shader.prototype.vs;
/**
* @type {?}
* @private
*/
Shader.prototype.vsSource;
/**
* @type {?}
* @private
*/
Shader.prototype.fs;
/**
* @type {?}
* @private
*/
Shader.prototype.fsSource;
/**
* @type {?}
* @private
*/
Shader.prototype.program;
/**
* @type {?}
* @private
*/
Shader.prototype.tmp2x2;
/**
* @type {?}
* @private
*/
Shader.prototype.tmp3x3;
/**
* @type {?}
* @private
*/
Shader.prototype.tmp4x4;
/**
* @type {?}
* @private
*/
Shader.prototype.vertexShader;
/**
* @type {?}
* @private
*/
Shader.prototype.fragmentShader;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhZGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL3dlYmdsL1NoYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdkQ7SUErQkUsZ0JBQ0UsT0FBNkQsRUFDckQsWUFBb0IsRUFDcEIsY0FBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUExQnhCLE9BQUUsR0FBZ0IsSUFBSSxDQUFDO1FBRXZCLE9BQUUsR0FBZ0IsSUFBSSxDQUFDO1FBRXZCLFlBQU8sR0FBaUIsSUFBSSxDQUFDO1FBQzdCLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFdBQU0sR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBcUJyRCxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTztZQUNWLE9BQU8sWUFBWSw0QkFBNEI7Z0JBQzdDLENBQUMsQ0FBQyxPQUFPO2dCQUNULENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs7O0lBNUJNLDJCQUFVOzs7SUFBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FB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QyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBQ2EsaUJBQVU7Ozs7SUFBeEIsVUFDRSxPQUE2RDs7WUFFekQsRUFBRSxHQUFHLDhCQUNRLE1BQU0sQ0FBQyxRQUFRLGtDQUNmLE1BQU0sQ0FBQyxLQUFLLGdDQUNkLE1BQU0sQ0FBQyxVQUFVLHNGQUduQixNQUFNLENBQUMsS0FBSyxtQ0FDUixNQUFNLENBQUMsVUFBVSxXQUFNLE1BQU0sQ0FBQyxRQUFRLHlCQUV2RDs7WUFDSSxFQUFFLEdBQUcsa1FBV1Q7UUFDQSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQTVRYSxpQkFBVSxHQUFHLGFBQWEsQ0FBQztJQUMzQixlQUFRLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLFlBQUssR0FBRyxTQUFTLENBQUM7SUFDbEIsYUFBTSxHQUFHLFVBQVUsQ0FBQztJQUNwQixnQkFBUyxHQUFHLGFBQWEsQ0FBQztJQUMxQixjQUFPLEdBQUcsV0FBVyxDQUFDO0lBd1F0QyxhQUFDO0NBQUEsQUE5UUQsSUE4UUM7U0E5UVksTUFBTTs7O0lBQ2pCLGtCQUF5Qzs7SUFDekMsZ0JBQXNDOztJQUN0QyxhQUFnQzs7SUFDaEMsY0FBa0M7O0lBQ2xDLGlCQUF3Qzs7SUFDeEMsZUFBb0M7Ozs7O0lBQ3BDLHlCQUE4Qzs7Ozs7SUFDOUMsb0JBQStCOzs7OztJQUMvQiwwQkFBeUI7Ozs7O0lBQ3pCLG9CQUErQjs7Ozs7SUFDL0IsMEJBQXlCOzs7OztJQUN6Qix5QkFBcUM7Ozs7O0lBQ3JDLHdCQUF1RDs7Ozs7SUFDdkQsd0JBQXVEOzs7OztJQUN2RCx3QkFBdUQ7Ozs7O0lBa0JyRCw4QkFBNEI7Ozs7O0lBQzVCLGdDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgUmVzdG9yYWJsZSB9IGZyb20gXCIuLi9jb3JlL1V0aWxzXCI7XHJcbmltcG9ydCB7IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfSBmcm9tIFwiLi9XZWJHTFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNoYWRlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUsIFJlc3RvcmFibGUge1xyXG4gIHB1YmxpYyBzdGF0aWMgTVZQX01BVFJJWCA9IFwidV9wcm9qVHJhbnNcIjtcclxuICBwdWJsaWMgc3RhdGljIFBPU0lUSU9OID0gXCJhX3Bvc2l0aW9uXCI7XHJcbiAgcHVibGljIHN0YXRpYyBDT0xPUiA9IFwiYV9jb2xvclwiO1xyXG4gIHB1YmxpYyBzdGF0aWMgQ09MT1IyID0gXCJhX2NvbG9yMlwiO1xyXG4gIHB1YmxpYyBzdGF0aWMgVEVYQ09PUkRTID0gXCJhX3RleENvb3Jkc1wiO1xyXG4gIHB1YmxpYyBzdGF0aWMgU0FNUExFUiA9IFwidV90ZXh0dXJlXCI7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xyXG4gIHByaXZhdGUgdnM6IFdlYkdMU2hhZGVyID0gbnVsbDtcclxuICBwcml2YXRlIHZzU291cmNlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBmczogV2ViR0xTaGFkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgZnNTb3VyY2U6IHN0cmluZztcclxuICBwcml2YXRlIHByb2dyYW06IFdlYkdMUHJvZ3JhbSA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0bXAyeDI6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMiAqIDIpO1xyXG4gIHByaXZhdGUgdG1wM3gzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDMgKiAzKTtcclxuICBwcml2YXRlIHRtcDR4NDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg0ICogNCk7XHJcbiAgcHVibGljIGdldFByb2dyYW0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0VmVydGV4U2hhZGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGV4U2hhZGVyO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RnJhZ21lbnRTaGFkZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mcmFnbWVudFNoYWRlcjtcclxuICB9XHJcbiAgcHVibGljIGdldFZlcnRleFNoYWRlclNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZzU291cmNlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RnJhZ21lbnRTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mc1NvdXJjZTtcclxuICB9XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IHwgV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgcHJpdmF0ZSB2ZXJ0ZXhTaGFkZXI6IHN0cmluZyxcclxuICAgIHByaXZhdGUgZnJhZ21lbnRTaGFkZXI6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgdGhpcy52c1NvdXJjZSA9IHZlcnRleFNoYWRlcjtcclxuICAgIHRoaXMuZnNTb3VyY2UgPSBmcmFnbWVudFNoYWRlcjtcclxuICAgIHRoaXMuY29udGV4dCA9XHJcbiAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgPyBjb250ZXh0XHJcbiAgICAgICAgOiBuZXcgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dChjb250ZXh0KTtcclxuICAgIHRoaXMuY29udGV4dC5hZGRSZXN0b3JhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5jb21waWxlKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgY29tcGlsZSgpIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMudnMgPSB0aGlzLmNvbXBpbGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUiwgdGhpcy52ZXJ0ZXhTaGFkZXIpO1xyXG4gICAgICB0aGlzLmZzID0gdGhpcy5jb21waWxlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5mcmFnbWVudFNoYWRlcik7XHJcbiAgICAgIHRoaXMucHJvZ3JhbSA9IHRoaXMuY29tcGlsZVByb2dyYW0odGhpcy52cywgdGhpcy5mcyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuZGlzcG9zZSgpO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNvbXBpbGVTaGFkZXIodHlwZTogbnVtYmVyLCBzb3VyY2U6IHN0cmluZykge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgbGV0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTtcclxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XHJcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XHJcbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xyXG4gICAgICBsZXQgZXJyb3IgPSBcIkNvdWxkbid0IGNvbXBpbGUgc2hhZGVyOiBcIiArIGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcclxuICAgICAgZ2wuZGVsZXRlU2hhZGVyKHNoYWRlcik7XHJcbiAgICAgIGlmICghZ2wuaXNDb250ZXh0TG9zdCgpKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNoYWRlcjtcclxuICB9XHJcbiAgcHJpdmF0ZSBjb21waWxlUHJvZ3JhbSh2czogV2ViR0xTaGFkZXIsIGZzOiBXZWJHTFNoYWRlcikge1xyXG4gICAgbGV0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xyXG4gICAgbGV0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XHJcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdnMpO1xyXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZzKTtcclxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xyXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xyXG4gICAgICBsZXQgZXJyb3IgPVxyXG4gICAgICAgIFwiQ291bGRuJ3QgY29tcGlsZSBzaGFkZXIgcHJvZ3JhbTogXCIgKyBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTtcclxuICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcclxuICAgICAgaWYgKCFnbC5pc0NvbnRleHRMb3N0KCkpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvZ3JhbTtcclxuICB9XHJcbiAgcmVzdG9yZSgpIHtcclxuICAgIHRoaXMuY29tcGlsZSgpO1xyXG4gIH1cclxuICBwdWJsaWMgYmluZCgpIHtcclxuICAgIHRoaXMuY29udGV4dC5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1bmJpbmQoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuZ2wudXNlUHJvZ3JhbShudWxsKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm1pKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0xaSh0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgdmFsdWUpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0VW5pZm9ybWYodW5pZm9ybTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNvbnRleHQuZ2wudW5pZm9ybTFmKHRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKHVuaWZvcm0pLCB2YWx1ZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRVbmlmb3JtMmYodW5pZm9ybTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0yZih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgdmFsdWUsIHZhbHVlMik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRVbmlmb3JtM2YoXHJcbiAgICB1bmlmb3JtOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogbnVtYmVyLFxyXG4gICAgdmFsdWUyOiBudW1iZXIsXHJcbiAgICB2YWx1ZTM6IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5jb250ZXh0LmdsLnVuaWZvcm0zZihcclxuICAgICAgdGhpcy5nZXRVbmlmb3JtTG9jYXRpb24odW5pZm9ybSksXHJcbiAgICAgIHZhbHVlLFxyXG4gICAgICB2YWx1ZTIsXHJcbiAgICAgIHZhbHVlM1xyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm00ZihcclxuICAgIHVuaWZvcm06IHN0cmluZyxcclxuICAgIHZhbHVlOiBudW1iZXIsXHJcbiAgICB2YWx1ZTI6IG51bWJlcixcclxuICAgIHZhbHVlMzogbnVtYmVyLFxyXG4gICAgdmFsdWU0OiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuY29udGV4dC5nbC51bmlmb3JtNGYoXHJcbiAgICAgIHRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKHVuaWZvcm0pLFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgdmFsdWUyLFxyXG4gICAgICB2YWx1ZTMsXHJcbiAgICAgIHZhbHVlNFxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm0yeDJmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDJ4Mi5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDJmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wMngyKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm0zeDNmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDN4My5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDNmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wM3gzKTtcclxuICB9XHJcbiAgcHVibGljIHNldFVuaWZvcm00eDRmKHVuaWZvcm06IHN0cmluZywgdmFsdWU6IEFycmF5TGlrZTxudW1iZXI+KSB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICB0aGlzLnRtcDR4NC5zZXQodmFsdWUpO1xyXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtKSwgZmFsc2UsIHRoaXMudG1wNHg0KTtcclxuICB9XHJcbiAgcHVibGljIGdldFVuaWZvcm1Mb2NhdGlvbih1bmlmb3JtOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XHJcbiAgICBsZXQgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XHJcbiAgICBsZXQgbG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1bmlmb3JtKTtcclxuICAgIGlmICghbG9jYXRpb24gJiYgIWdsLmlzQ29udGV4dExvc3QoKSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIGZvciB1bmlmb3JtICR7dW5pZm9ybX1gKTtcclxuICAgIHJldHVybiBsb2NhdGlvbjtcclxuICB9XHJcbiAgcHVibGljIGdldEF0dHJpYnV0ZUxvY2F0aW9uKGF0dHJpYnV0ZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGxldCBsb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgYXR0cmlidXRlKTtcclxuICAgIGlmIChsb2NhdGlvbiA9PSAtMSAmJiAhZ2wuaXNDb250ZXh0TG9zdCgpKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgbG9jYXRpb24gZm9yIGF0dHJpYnV0ZSAke2F0dHJpYnV0ZX1gKTtcclxuICAgIHJldHVybiBsb2NhdGlvbjtcclxuICB9XHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzdG9yYWJsZSh0aGlzKTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGlmICh0aGlzLnZzKSB7XHJcbiAgICAgIGdsLmRlbGV0ZVNoYWRlcih0aGlzLnZzKTtcclxuICAgICAgdGhpcy52cyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mcykge1xyXG4gICAgICBnbC5kZWxldGVTaGFkZXIodGhpcy5mcyk7XHJcbiAgICAgIHRoaXMuZnMgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJvZ3JhbSkge1xyXG4gICAgICBnbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgbmV3Q29sb3JlZFRleHR1cmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHRhdHRyaWJ1dGUgdmVjMiAke1NoYWRlci5URVhDT09SRFN9O1xyXG5cdFx0XHRcdHVuaWZvcm0gbWF0NCAke1NoYWRlci5NVlBfTUFUUklYfTtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dm9pZCBtYWluICgpIHtcclxuXHRcdFx0XHRcdHZfY29sb3IgPSAke1NoYWRlci5DT0xPUn07XHJcblx0XHRcdFx0XHR2X3RleENvb3JkcyA9ICR7U2hhZGVyLlRFWENPT1JEU307XHJcblx0XHRcdFx0XHRnbF9Qb3NpdGlvbiA9ICR7U2hhZGVyLk1WUF9NQVRSSVh9ICogJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIGxldCBmcyA9IGBcclxuXHRcdFx0XHQjaWZkZWYgR0xfRVNcclxuXHRcdFx0XHRcdCNkZWZpbmUgTE9XUCBsb3dwXHJcblx0XHRcdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0XHQjZWxzZVxyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQXHJcblx0XHRcdFx0I2VuZGlmXHJcblx0XHRcdFx0dmFyeWluZyBMT1dQIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2X2NvbG9yICogdGV4dHVyZTJEKHVfdGV4dHVyZSwgdl90ZXhDb29yZHMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIHJldHVybiBuZXcgU2hhZGVyKGNvbnRleHQsIHZzLCBmcyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgbmV3VHdvQ29sb3JlZFRleHR1cmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHRhdHRyaWJ1dGUgdmVjNCAke1NoYWRlci5DT0xPUjJ9O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWMyICR7U2hhZGVyLlRFWENPT1JEU307XHJcblx0XHRcdFx0dW5pZm9ybSBtYXQ0ICR7U2hhZGVyLk1WUF9NQVRSSVh9O1xyXG5cdFx0XHRcdHZhcnlpbmcgdmVjNCB2X2xpZ2h0O1xyXG5cdFx0XHRcdHZhcnlpbmcgdmVjNCB2X2Rhcms7XHJcblx0XHRcdFx0dmFyeWluZyB2ZWMyIHZfdGV4Q29vcmRzO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHR2X2xpZ2h0ID0gJHtTaGFkZXIuQ09MT1J9O1xyXG5cdFx0XHRcdFx0dl9kYXJrID0gJHtTaGFkZXIuQ09MT1IyfTtcclxuXHRcdFx0XHRcdHZfdGV4Q29vcmRzID0gJHtTaGFkZXIuVEVYQ09PUkRTfTtcclxuXHRcdFx0XHRcdGdsX1Bvc2l0aW9uID0gJHtTaGFkZXIuTVZQX01BVFJJWH0gKiAke1NoYWRlci5QT1NJVElPTn07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgO1xyXG4gICAgbGV0IGZzID0gYFxyXG5cdFx0XHRcdCNpZmRlZiBHTF9FU1xyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQIGxvd3BcclxuXHRcdFx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRcdCNlbHNlXHJcblx0XHRcdFx0XHQjZGVmaW5lIExPV1BcclxuXHRcdFx0XHQjZW5kaWZcclxuXHRcdFx0XHR2YXJ5aW5nIExPV1AgdmVjNCB2X2xpZ2h0O1xyXG5cdFx0XHRcdHZhcnlpbmcgTE9XUCB2ZWM0IHZfZGFyaztcclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZHM7XHJcblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xyXG5cdFx0XHRcdHZvaWQgbWFpbiAoKSB7XHJcblx0XHRcdFx0XHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4dHVyZSwgdl90ZXhDb29yZHMpO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLmEgPSB0ZXhDb2xvci5hICogdl9saWdodC5hO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9ICgodGV4Q29sb3IuYSAtIDEuMCkgKiB2X2RhcmsuYSArIDEuMCAtIHRleENvbG9yLnJnYikgKiB2X2RhcmsucmdiICsgdGV4Q29sb3IucmdiICogdl9saWdodC5yZ2I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgO1xyXG4gICAgcmV0dXJuIG5ldyBTaGFkZXIoY29udGV4dCwgdnMsIGZzKTtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBuZXdDb2xvcmVkKFxyXG4gICAgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dFxyXG4gICk6IFNoYWRlciB7XHJcbiAgICBsZXQgdnMgPSBgXHJcblx0XHRcdFx0YXR0cmlidXRlIHZlYzQgJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdGF0dHJpYnV0ZSB2ZWM0ICR7U2hhZGVyLkNPTE9SfTtcclxuXHRcdFx0XHR1bmlmb3JtIG1hdDQgJHtTaGFkZXIuTVZQX01BVFJJWH07XHJcblx0XHRcdFx0dmFyeWluZyB2ZWM0IHZfY29sb3I7XHJcblx0XHRcdFx0dm9pZCBtYWluICgpIHtcclxuXHRcdFx0XHRcdHZfY29sb3IgPSAke1NoYWRlci5DT0xPUn07XHJcblx0XHRcdFx0XHRnbF9Qb3NpdGlvbiA9ICR7U2hhZGVyLk1WUF9NQVRSSVh9ICogJHtTaGFkZXIuUE9TSVRJT059O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0YDtcclxuICAgIGxldCBmcyA9IGBcclxuXHRcdFx0XHQjaWZkZWYgR0xfRVNcclxuXHRcdFx0XHRcdCNkZWZpbmUgTE9XUCBsb3dwXHJcblx0XHRcdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0XHQjZWxzZVxyXG5cdFx0XHRcdFx0I2RlZmluZSBMT1dQXHJcblx0XHRcdFx0I2VuZGlmXHJcblx0XHRcdFx0dmFyeWluZyBMT1dQIHZlYzQgdl9jb2xvcjtcclxuXHRcdFx0XHR2b2lkIG1haW4gKCkge1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdl9jb2xvcjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdGA7XHJcbiAgICByZXR1cm4gbmV3IFNoYWRlcihjb250ZXh0LCB2cywgZnMpO1xyXG4gIH1cclxufVxyXG4iXX0=