113 lines
16 KiB
JavaScript
113 lines
16 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 { BlendMode, Texture, TextureFilter, TextureWrap } from "@esotericsoftware/spine-core";
|
|
import { Texture as PixiTexture, SCALE_MODES, MIPMAP_MODES, WRAP_MODES, BLEND_MODES } from "@pixi/core";
|
|
export class SpineTexture extends Texture {
|
|
static textureMap = new Map();
|
|
static from(texture) {
|
|
if (SpineTexture.textureMap.has(texture)) {
|
|
return SpineTexture.textureMap.get(texture);
|
|
}
|
|
return new SpineTexture(texture);
|
|
}
|
|
texture;
|
|
constructor(image) {
|
|
// Todo: maybe add error handling if you feed a video texture to spine?
|
|
super(image.resource.source);
|
|
this.texture = PixiTexture.from(image);
|
|
}
|
|
setFilters(minFilter, _magFilter) {
|
|
this.texture.baseTexture.scaleMode = SpineTexture.toPixiTextureFilter(minFilter);
|
|
this.texture.baseTexture.mipmap = SpineTexture.toPixiMipMap(minFilter);
|
|
// pixi only has one filter for both min and mag, too bad
|
|
}
|
|
setWraps(uWrap, _vWrap) {
|
|
this.texture.baseTexture.wrapMode = SpineTexture.toPixiTextureWrap(uWrap);
|
|
// Pixi only has one setting
|
|
}
|
|
dispose() {
|
|
// I am not entirely sure about this...
|
|
this.texture.destroy();
|
|
}
|
|
static toPixiTextureFilter(filter) {
|
|
switch (filter) {
|
|
case TextureFilter.Nearest:
|
|
case TextureFilter.MipMapNearestLinear:
|
|
case TextureFilter.MipMapNearestNearest:
|
|
return SCALE_MODES.NEAREST;
|
|
case TextureFilter.Linear:
|
|
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
|
case TextureFilter.MipMapLinearNearest:
|
|
return SCALE_MODES.LINEAR;
|
|
default:
|
|
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
|
}
|
|
}
|
|
static toPixiMipMap(filter) {
|
|
switch (filter) {
|
|
case TextureFilter.Nearest:
|
|
case TextureFilter.Linear:
|
|
return MIPMAP_MODES.OFF;
|
|
case TextureFilter.MipMapNearestLinear:
|
|
case TextureFilter.MipMapNearestNearest:
|
|
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
|
case TextureFilter.MipMapLinearNearest:
|
|
return MIPMAP_MODES.ON;
|
|
default:
|
|
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
|
}
|
|
}
|
|
static toPixiTextureWrap(wrap) {
|
|
switch (wrap) {
|
|
case TextureWrap.ClampToEdge:
|
|
return WRAP_MODES.CLAMP;
|
|
case TextureWrap.MirroredRepeat:
|
|
return WRAP_MODES.MIRRORED_REPEAT;
|
|
case TextureWrap.Repeat:
|
|
return WRAP_MODES.REPEAT;
|
|
default:
|
|
throw new Error(`Unknown texture wrap: ${String(wrap)}`);
|
|
}
|
|
}
|
|
static toPixiBlending(blend) {
|
|
switch (blend) {
|
|
case BlendMode.Normal:
|
|
return BLEND_MODES.NORMAL;
|
|
case BlendMode.Additive:
|
|
return BLEND_MODES.ADD;
|
|
case BlendMode.Multiply:
|
|
return BLEND_MODES.MULTIPLY;
|
|
case BlendMode.Screen:
|
|
return BLEND_MODES.SCREEN;
|
|
default:
|
|
throw new Error(`Unknown blendMode: ${String(blend)}`);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RyxNQUFNLE9BQU8sWUFBYSxTQUFRLE9BQU87SUFDaEMsTUFBTSxDQUFDLFVBQVUsR0FBdUMsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBRSxPQUF3QjtRQUMzQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRWUsT0FBTyxDQUFjO0lBRXJDLFlBQXFCLEtBQXNCO1FBQzFDLHVFQUF1RTtRQUN2RSxLQUFLLENBQUUsS0FBSyxDQUFDLFFBQThCLENBQUMsTUFBYSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxVQUFVLENBQUUsU0FBd0IsRUFBRSxVQUF5QjtRQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pGLElB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S0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCbGVuZE1vZGUsIFRleHR1cmUsIFRleHR1cmVGaWx0ZXIsIFRleHR1cmVXcmFwIH0gZnJvbSBcIkBlc290ZXJpY3NvZnR3YXJlL3NwaW5lLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQmFzZVRleHR1cmUgYXMgUGl4aUJhc2VUZXh0dXJlLCBCYXNlSW1hZ2VSZXNvdXJjZSB9IGZyb20gXCJAcGl4aS9jb3JlXCI7XG5pbXBvcnQgeyBUZXh0dXJlIGFzIFBpeGlUZXh0dXJlLCBTQ0FMRV9NT0RFUywgTUlQTUFQX01PREVTLCBXUkFQX01PREVTLCBCTEVORF9NT0RFUyB9IGZyb20gXCJAcGl4aS9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTcGluZVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcblx0cHJpdmF0ZSBzdGF0aWMgdGV4dHVyZU1hcDogTWFwPFBpeGlCYXNlVGV4dHVyZSwgU3BpbmVUZXh0dXJlPiA9IG5ldyBNYXA8UGl4aUJhc2VUZXh0dXJlLCBTcGluZVRleHR1cmU+KCk7XG5cblx0cHVibGljIHN0YXRpYyBmcm9tICh0ZXh0dXJlOiBQaXhpQmFzZVRleHR1cmUpOiBTcGluZVRleHR1cmUge1xuXHRcdGlmIChTcGluZVRleHR1cmUudGV4dHVyZU1hcC5oYXModGV4dHVyZSkpIHtcblx0XHRcdHJldHVybiBTcGluZVRleHR1cmUudGV4dHVyZU1hcC5nZXQodGV4dHVyZSkhO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFNwaW5lVGV4dHVyZSh0ZXh0dXJlKTtcblx0fVxuXG5cdHB1YmxpYyByZWFkb25seSB0ZXh0dXJlOiBQaXhpVGV4dHVyZTtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yIChpbWFnZTogUGl4aUJhc2VUZXh0dXJlKSB7XG5cdFx0Ly8gVG9kbzogbWF5YmUgYWRkIGVycm9yIGhhbmRsaW5nIGlmIHlvdSBmZWVkIGEgdmlkZW8gdGV4dHVyZSB0byBzcGluZT9cblx0XHRzdXBlcigoaW1hZ2UucmVzb3VyY2UgYXMgQmFzZUltYWdlUmVzb3VyY2UpLnNvdXJjZSBhcyBhbnkpO1xuXHRcdHRoaXMudGV4dHVyZSA9IFBpeGlUZXh0dXJlLmZyb20oaW1hZ2UpO1xuXHR9XG5cblx0cHVibGljIHNldEZpbHRlcnMgKG1pbkZpbHRlcjogVGV4dHVyZUZpbHRlciwgX21hZ0ZpbHRlcjogVGV4dHVyZUZpbHRlcik6IHZvaWQge1xuXHRcdHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5zY2FsZU1vZGUgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZUZpbHRlcihtaW5GaWx0ZXIpO1xuXHRcdHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5taXBtYXAgPSBTcGluZVRleHR1cmUudG9QaXhpTWlwTWFwKG1pbkZpbHRlcik7XG5cblx0XHQvLyBwaXhpIG9ubHkgaGFzIG9uZSBmaWx0ZXIgZm9yIGJvdGggbWluIGFuZCBtYWcsIHRvbyBiYWRcblx0fVxuXG5cdHB1YmxpYyBzZXRXcmFwcyAodVdyYXA6IFRleHR1cmVXcmFwLCBfdldyYXA6IFRleHR1cmVXcmFwKTogdm9pZCB7XG5cdFx0dGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLndyYXBNb2RlID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVXcmFwKHVXcmFwKTtcblxuXHRcdC8vIFBpeGkgb25seSBoYXMgb25lIHNldHRpbmdcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlICgpOiB2b2lkIHtcblx0XHQvLyBJIGFtIG5vdCBlbnRpcmVseSBzdXJlIGFib3V0IHRoaXMuLi5cblx0XHR0aGlzLnRleHR1cmUuZGVzdHJveSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgdG9QaXhpVGV4dHVyZUZpbHRlciAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogU0NBTEVfTU9ERVMge1xuXHRcdHN3aXRjaCAoZmlsdGVyKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTmVhcmVzdDpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TGluZWFyOlxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3ROZWFyZXN0OlxuXHRcdFx0XHRyZXR1cm4gU0NBTEVfTU9ERVMuTkVBUkVTVDtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLkxpbmVhcjpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBMaW5lYXJMaW5lYXI6IC8vIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyID09IFRleHR1cmVGaWx0ZXIuTWlwTWFwXG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTmVhcmVzdDpcblx0XHRcdFx0cmV0dXJuIFNDQUxFX01PREVTLkxJTkVBUjtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRleHR1cmUgZmlsdGVyOiAke1N0cmluZyhmaWx0ZXIpfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIHRvUGl4aU1pcE1hcCAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogTUlQTUFQX01PREVTIHtcblx0XHRzd2l0Y2ggKGZpbHRlcikge1xuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTGluZWFyOlxuXHRcdFx0XHRyZXR1cm4gTUlQTUFQX01PREVTLk9GRjtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiBNSVBNQVBfTU9ERVMuT047XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIGZpbHRlcjogJHtTdHJpbmcoZmlsdGVyKX1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB0b1BpeGlUZXh0dXJlV3JhcCAod3JhcDogVGV4dHVyZVdyYXApOiBXUkFQX01PREVTIHtcblx0XHRzd2l0Y2ggKHdyYXApIHtcblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuQ2xhbXBUb0VkZ2U6XG5cdFx0XHRcdHJldHVybiBXUkFQX01PREVTLkNMQU1QO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLk1pcnJvcmVkUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gV1JBUF9NT0RFUy5NSVJST1JFRF9SRVBFQVQ7XG5cblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gV1JBUF9NT0RFUy5SRVBFQVQ7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHdyYXA6ICR7U3RyaW5nKHdyYXApfWApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgdG9QaXhpQmxlbmRpbmcgKGJsZW5kOiBCbGVuZE1vZGUpOiBCTEVORF9NT0RFUyB7XG5cdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuTm9ybWFsOlxuXHRcdFx0XHRyZXR1cm4gQkxFTkRfTU9ERVMuTk9STUFMO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5BZGRpdGl2ZTpcblx0XHRcdFx0cmV0dXJuIEJMRU5EX01PREVTLkFERDtcblxuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuTXVsdGlwbHk6XG5cdFx0XHRcdHJldHVybiBCTEVORF9NT0RFUy5NVUxUSVBMWTtcblxuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuU2NyZWVuOlxuXHRcdFx0XHRyZXR1cm4gQkxFTkRfTU9ERVMuU0NSRUVOO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYmxlbmRNb2RlOiAke1N0cmluZyhibGVuZCl9YCk7XG5cdFx0fVxuXHR9XG59XG4iXX0=
|