167 lines
19 KiB
JavaScript
167 lines
19 KiB
JavaScript
/******************************************************************************
|
|
* Spine Runtimes License Agreement
|
|
* Last updated April 5, 2025. Replaces all prior versions.
|
|
*
|
|
* Copyright (c) 2013-2025, 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.
|
|
*
|
|
* THE SPINE RUNTIMES ARE 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
|
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*****************************************************************************/
|
|
import { Color, Matrix, Program, Shader, Texture, TextureMatrix } from "@pixi/core";
|
|
const vertex = `
|
|
attribute vec2 aVertexPosition;
|
|
attribute vec2 aTextureCoord;
|
|
|
|
uniform mat3 projectionMatrix;
|
|
uniform mat3 translationMatrix;
|
|
uniform mat3 uTextureMatrix;
|
|
|
|
varying vec2 vTextureCoord;
|
|
|
|
void main(void)
|
|
{
|
|
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
|
|
|
vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;
|
|
}
|
|
`;
|
|
const fragment = `
|
|
varying vec2 vTextureCoord;
|
|
uniform vec4 uColor;
|
|
uniform vec4 uDarkColor;
|
|
|
|
uniform sampler2D uSampler;
|
|
|
|
void main(void)
|
|
{
|
|
vec4 texColor = texture2D(uSampler, vTextureCoord);
|
|
gl_FragColor.a = texColor.a * uColor.a;
|
|
gl_FragColor.rgb = ((texColor.a - 1.0) * uDarkColor.a + 1.0 - texColor.rgb) * uDarkColor.rgb + texColor.rgb * uColor.rgb;
|
|
}
|
|
`;
|
|
export class DarkTintMaterial extends Shader {
|
|
uvMatrix;
|
|
batchable;
|
|
pluginName;
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
_tintRGB;
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
_darkTintRGB;
|
|
/**
|
|
* Only do update if tint or alpha changes.
|
|
* @private
|
|
* @default false
|
|
*/
|
|
_colorDirty;
|
|
_alpha;
|
|
_tintColor;
|
|
_darkTintColor;
|
|
constructor(texture) {
|
|
const uniforms = {
|
|
uSampler: texture ?? Texture.EMPTY,
|
|
alpha: 1,
|
|
uTextureMatrix: Matrix.IDENTITY,
|
|
uColor: new Float32Array([1, 1, 1, 1]),
|
|
uDarkColor: new Float32Array([0, 0, 0, 0]),
|
|
};
|
|
// Set defaults
|
|
const options = {
|
|
tint: 0xffffff,
|
|
darkTint: 0x0,
|
|
alpha: 1,
|
|
pluginName: "darkTintBatch",
|
|
};
|
|
super(Program.from(vertex, fragment), uniforms);
|
|
this._colorDirty = false;
|
|
this.uvMatrix = new TextureMatrix(uniforms.uSampler);
|
|
this.batchable = true;
|
|
this.pluginName = options.pluginName;
|
|
this._tintColor = new Color(options.tint);
|
|
this._darkTintColor = new Color(options.darkTint);
|
|
this._tintRGB = this._tintColor.toLittleEndianNumber();
|
|
this._darkTintRGB = this._darkTintColor.toLittleEndianNumber();
|
|
this._alpha = options.alpha;
|
|
this._colorDirty = true;
|
|
}
|
|
get texture() {
|
|
return this.uniforms.uSampler;
|
|
}
|
|
set texture(value) {
|
|
if (this.uniforms.uSampler !== value) {
|
|
if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode) {
|
|
this._colorDirty = true;
|
|
}
|
|
this.uniforms.uSampler = value;
|
|
this.uvMatrix.texture = value;
|
|
}
|
|
}
|
|
set alpha(value) {
|
|
if (value === this._alpha) {
|
|
return;
|
|
}
|
|
this._alpha = value;
|
|
this._colorDirty = true;
|
|
}
|
|
get alpha() {
|
|
return this._alpha;
|
|
}
|
|
set tint(value) {
|
|
if (value === this.tint) {
|
|
return;
|
|
}
|
|
this._tintColor.setValue(value);
|
|
this._tintRGB = this._tintColor.toLittleEndianNumber();
|
|
this._colorDirty = true;
|
|
}
|
|
get tint() {
|
|
return this._tintColor.value;
|
|
}
|
|
set darkTint(value) {
|
|
if (value === this.darkTint) {
|
|
return;
|
|
}
|
|
this._darkTintColor.setValue(value);
|
|
this._darkTintRGB = this._darkTintColor.toLittleEndianNumber();
|
|
this._colorDirty = true;
|
|
}
|
|
get darkTint() {
|
|
return this._darkTintColor.value;
|
|
}
|
|
get tintValue() {
|
|
return this._tintColor.toNumber();
|
|
}
|
|
get darkTintValue() {
|
|
return this._darkTintColor.toNumber();
|
|
}
|
|
/** Gets called automatically by the Mesh. Intended to be overridden for custom {@link PIXI.MeshMaterial} objects. */
|
|
update() {
|
|
if (this._colorDirty) {
|
|
this._colorDirty = false;
|
|
Color.shared.setValue(this._tintColor).premultiply(this._alpha, true).toArray(this.uniforms.uColor);
|
|
Color.shared.setValue(this._darkTintColor).premultiply(this._alpha, true).premultiply(1, false).toArray(this.uniforms.uDarkColor);
|
|
}
|
|
if (this.uvMatrix.update()) {
|
|
this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord;
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRNYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXJrVGludE1lc2gvRGFya1RpbnRNYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLE1BQU0sTUFBTSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JkLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7OztDQWFoQixDQUFDO0FBVUYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLE1BQU07SUFDM0IsUUFBUSxDQUFnQjtJQUVqQyxTQUFTLENBQVU7SUFFbkIsVUFBVSxDQUFTO0lBRTFCLGdFQUFnRTtJQUN6RCxRQUFRLENBQVM7SUFDeEIsZ0VBQWdFO0lBQ3pELFlBQVksQ0FBUztJQUU1Qjs7OztPQUlHO0lBQ0ssV0FBVyxDQUFVO0lBQ3JCLE1BQU0sQ0FBUztJQUVmLFVBQVUsQ0FBUTtJQUNsQixjQUFjLENBQVE7SUFFOUIsWUFBYSxPQUFpQjtRQUM3QixNQUFNLFFBQVEsR0FBRztZQUNoQixRQUFRLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQ2xDLEtBQUssRUFBRSxDQUFDO1lBQ1IsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQy9CLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFVBQVUsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFDLENBQUM7UUFFRixlQUFlO1FBQ2YsTUFBTSxPQUFP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Q0FBQztJQUNGLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBDb2xvclNvdXJjZSB9IGZyb20gXCJAcGl4aS9jb3JlXCI7XG5pbXBvcnQgeyBDb2xvciwgTWF0cml4LCBQcm9ncmFtLCBTaGFkZXIsIFRleHR1cmUsIFRleHR1cmVNYXRyaXggfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG5jb25zdCB2ZXJ0ZXggPSBgXG5hdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1xuXG51bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDtcbnVuaWZvcm0gbWF0MyB0cmFuc2xhdGlvbk1hdHJpeDtcbnVuaWZvcm0gbWF0MyB1VGV4dHVyZU1hdHJpeDtcblxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG5cbnZvaWQgbWFpbih2b2lkKVxue1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHRyYW5zbGF0aW9uTWF0cml4ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XG5cbiAgICB2VGV4dHVyZUNvb3JkID0gKHVUZXh0dXJlTWF0cml4ICogdmVjMyhhVGV4dHVyZUNvb3JkLCAxLjApKS54eTtcbn1cbmA7XG5cbmNvbnN0IGZyYWdtZW50ID0gYFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG51bmlmb3JtIHZlYzQgdUNvbG9yO1xudW5pZm9ybSB2ZWM0IHVEYXJrQ29sb3I7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xuXG52b2lkIG1haW4odm9pZClcbntcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSB0ZXhDb2xvci5hICogdUNvbG9yLmE7XG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9ICgodGV4Q29sb3IuYSAtIDEuMCkgKiB1RGFya0NvbG9yLmEgKyAxLjAgLSB0ZXhDb2xvci5yZ2IpICogdURhcmtDb2xvci5yZ2IgKyB0ZXhDb2xvci5yZ2IgKiB1Q29sb3IucmdiO1xufVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBJRGFya1RpbnRNYXRlcmlhbE9wdGlvbnMge1xuXHRhbHBoYT86IG51bWJlcjtcblx0dGludD86IENvbG9yU291cmNlO1xuXHRkYXJrVGludD86IENvbG9yU291cmNlO1xuXHRwbHVnaW5OYW1lPzogc3RyaW5nO1xuXHR1bmlmb3Jtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgY2xhc3MgRGFya1RpbnRNYXRlcmlhbCBleHRlbmRzIFNoYWRlciB7XG5cdHB1YmxpYyByZWFkb25seSB1dk1hdHJpeDogVGV4dHVyZU1hdHJpeDtcblxuXHRwdWJsaWMgYmF0Y2hhYmxlOiBib29sZWFuO1xuXG5cdHB1YmxpYyBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRwdWJsaWMgX3RpbnRSR0I6IG51bWJlcjtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRwdWJsaWMgX2RhcmtUaW50UkdCOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIE9ubHkgZG8gdXBkYXRlIGlmIHRpbnQgb3IgYWxwaGEgY2hhbmdlcy5cblx0ICogQHByaXZhdGVcblx0ICogQGRlZmF1bHQgZmFsc2Vcblx0ICovXG5cdHByaXZhdGUgX2NvbG9yRGlydHk6IGJvb2xlYW47XG5cdHByaXZhdGUgX2FscGhhOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBfdGludENvbG9yOiBDb2xvcjtcblx0cHJpdmF0ZSBfZGFya1RpbnRDb2xvcjogQ29sb3I7XG5cblx0Y29uc3RydWN0b3IgKHRleHR1cmU/OiBUZXh0dXJlKSB7XG5cdFx0Y29uc3QgdW5pZm9ybXMgPSB7XG5cdFx0XHR1U2FtcGxlcjogdGV4dHVyZSA/PyBUZXh0dXJlLkVNUFRZLFxuXHRcdFx0YWxwaGE6IDEsXG5cdFx0XHR1VGV4dHVyZU1hdHJpeDogTWF0cml4LklERU5USVRZLFxuXHRcdFx0dUNvbG9yOiBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxLCAxXSksXG5cdFx0XHR1RGFya0NvbG9yOiBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwLCAwXSksXG5cdFx0fTtcblxuXHRcdC8vIFNldCBkZWZhdWx0c1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB7XG5cdFx0XHR0aW50OiAweGZmZmZmZixcblx0XHRcdGRhcmtUaW50OiAweDAsXG5cdFx0XHRhbHBoYTogMSxcblx0XHRcdHBsdWdpbk5hbWU6IFwiZGFya1RpbnRCYXRjaFwiLFxuXHRcdH07XG5cblx0XHRzdXBlcihQcm9ncmFtLmZyb20odmVydGV4LCBmcmFnbWVudCksIHVuaWZvcm1zKTtcblxuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSBmYWxzZTtcblxuXHRcdHRoaXMudXZNYXRyaXggPSBuZXcgVGV4dHVyZU1hdHJpeCh1bmlmb3Jtcy51U2FtcGxlcik7XG5cdFx0dGhpcy5iYXRjaGFibGUgPSB0cnVlO1xuXHRcdHRoaXMucGx1Z2luTmFtZSA9IG9wdGlvbnMucGx1Z2luTmFtZTtcblxuXHRcdHRoaXMuX3RpbnRDb2xvciA9IG5ldyBDb2xvcihvcHRpb25zLnRpbnQpO1xuXHRcdHRoaXMuX2RhcmtUaW50Q29sb3IgPSBuZXcgQ29sb3Iob3B0aW9ucy5kYXJrVGludCk7XG5cdFx0dGhpcy5fdGludFJHQiA9IHRoaXMuX3RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2RhcmtUaW50UkdCID0gdGhpcy5fZGFya1RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2FscGhhID0gb3B0aW9ucy5hbHBoYTtcblx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgdGV4dHVyZSAoKTogVGV4dHVyZSB7XG5cdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMudVNhbXBsZXI7XG5cdH1cblx0cHVibGljIHNldCB0ZXh0dXJlICh2YWx1ZTogVGV4dHVyZSkge1xuXHRcdGlmICh0aGlzLnVuaWZvcm1zLnVTYW1wbGVyICE9PSB2YWx1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLnVuaWZvcm1zLnVTYW1wbGVyLmJhc2VUZXh0dXJlLmFscGhhTW9kZSAhPT0gIXZhbHVlLmJhc2VUZXh0dXJlLmFscGhhTW9kZSkge1xuXHRcdFx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy51bmlmb3Jtcy51U2FtcGxlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy51dk1hdHJpeC50ZXh0dXJlID0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldCBhbHBoYSAodmFsdWU6IG51bWJlcikge1xuXHRcdGlmICh2YWx1ZSA9PT0gdGhpcy5fYWxwaGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9hbHBoYSA9IHZhbHVlO1xuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSB0cnVlO1xuXHR9XG5cdHB1YmxpYyBnZXQgYWxwaGEgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX2FscGhhO1xuXHR9XG5cblx0cHVibGljIHNldCB0aW50ICh2YWx1ZTogQ29sb3JTb3VyY2UpIHtcblx0XHRpZiAodmFsdWUgPT09IHRoaXMudGludCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3RpbnRDb2xvci5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0dGhpcy5fdGludFJHQiA9IHRoaXMuX3RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSB0cnVlO1xuXHR9XG5cdHB1YmxpYyBnZXQgdGludCAoKTogQ29sb3JTb3VyY2Uge1xuXHRcdHJldHVybiB0aGlzLl90aW50Q29sb3IudmFsdWUgYXMgQ29sb3JTb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGRhcmtUaW50ICh2YWx1ZTogQ29sb3JTb3VyY2UpIHtcblx0XHRpZiAodmFsdWUgPT09IHRoaXMuZGFya1RpbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9kYXJrVGludENvbG9yLnNldFZhbHVlKHZhbHVlKTtcblx0XHR0aGlzLl9kYXJrVGludFJHQiA9IHRoaXMuX2RhcmtUaW50Q29sb3IudG9MaXR0bGVFbmRpYW5OdW1iZXIoKTtcblx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0fVxuXHRwdWJsaWMgZ2V0IGRhcmtUaW50ICgpOiBDb2xvclNvdXJjZSB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhcmtUaW50Q29sb3IudmFsdWUgYXMgQ29sb3JTb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHRpbnRWYWx1ZSAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fdGludENvbG9yLnRvTnVtYmVyKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRhcmtUaW50VmFsdWUgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhcmtUaW50Q29sb3IudG9OdW1iZXIoKTtcblx0fVxuXG5cdC8qKiBHZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNZXNoLiBJbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGZvciBjdXN0b20ge0BsaW5rIFBJWEkuTWVzaE1hdGVyaWFsfSBvYmplY3RzLiAqL1xuXHRwdWJsaWMgdXBkYXRlICgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fY29sb3JEaXJ0eSkge1xuXHRcdFx0dGhpcy5fY29sb3JEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0Q29sb3Iuc2hhcmVkLnNldFZhbHVlKHRoaXMuX3RpbnRDb2xvcikucHJlbXVsdGlwbHkodGhpcy5fYWxwaGEsIHRydWUpLnRvQXJyYXkodGhpcy51bmlmb3Jtcy51Q29sb3IpO1xuXHRcdFx0Q29sb3Iuc2hhcmVkLnNldFZhbHVlKHRoaXMuX2RhcmtUaW50Q29sb3IpLnByZW11bHRpcGx5KHRoaXMuX2FscGhhLCB0cnVlKS5wcmVtdWx0aXBseSgxLCBmYWxzZSkudG9BcnJheSh0aGlzLnVuaWZvcm1zLnVEYXJrQ29sb3IpO1xuXHRcdH1cblx0XHRpZiAodGhpcy51dk1hdHJpeC51cGRhdGUoKSkge1xuXHRcdFx0dGhpcy51bmlmb3Jtcy51VGV4dHVyZU1hdHJpeCA9IHRoaXMudXZNYXRyaXgubWFwQ29vcmQ7XG5cdFx0fVxuXHR9XG59XG4iXX0=
|