@esotericsoftware/spine-pixi-v8
Version:
The official Spine Runtimes for PixiJS v8.
117 lines • 19.3 kB
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 { TextureAtlas } from '@esotericsoftware/spine-core';
import { checkExtension, copySearchParams, DOMAdapter, ExtensionType, extensions, LoaderParserPriority, path, Resolver, TextureSource, } from 'pixi.js';
import { SpineTexture } from '../SpineTexture.js';
const loaderName = "spineTextureAtlasLoader";
const spineTextureAtlasLoader = {
extension: ExtensionType.Asset,
resolver: {
test: (value) => checkExtension(value, ".atlas"),
parse: (value) => {
const split = value.split('.');
return {
resolution: parseFloat(Resolver.RETINA_PREFIX?.exec(value)?.[1] ?? '1'),
format: split[split.length - 2],
src: value,
};
},
},
loader: {
id: loaderName,
name: loaderName,
extension: {
type: ExtensionType.LoadParser,
priority: LoaderParserPriority.Normal,
name: loaderName,
},
test(url) {
return checkExtension(url, '.atlas');
},
async load(url) {
const response = await DOMAdapter.get().fetch(url);
if (!response.ok)
throw new Error(`[${loaderName}] Failed to fetch ${url}: ${response.status} ${response.statusText}`);
return await response.text();
},
testParse(asset, options) {
const isExtensionRight = checkExtension(options.src, '.atlas');
const isString = typeof asset === 'string';
const isExplicitLoadParserSet = options.parser === loaderName || options.loadParser === loaderName;
return Promise.resolve((isExtensionRight || isExplicitLoadParserSet) && isString);
},
unload(atlas) {
atlas.dispose();
},
async parse(asset, options, loader) {
const metadata = options.data || {};
let basePath = path.dirname(options.src);
if (basePath && basePath.lastIndexOf('/') !== basePath.length - 1) {
basePath += '/';
}
// Retval is going to be a texture atlas. However we need to wait for it's callback to resolve this promise.
const retval = new TextureAtlas(asset);
// If the user gave me only one texture, that one is assumed to be the "first" texture in the atlas
if (metadata.images instanceof TextureSource || typeof metadata.images === 'string') {
const pixiTexture = metadata.images;
metadata.images = {};
metadata.images[retval.pages[0].name] = pixiTexture;
}
// we will wait for all promises for the textures at the same time at the end.
const textureLoadingPromises = [];
// fill the pages
for (const page of retval.pages) {
const pageName = page.name;
const providedPage = metadata?.images ? metadata.images[pageName] : undefined;
if (providedPage instanceof TextureSource) {
page.setTexture(SpineTexture.from(providedPage));
}
else {
// eslint-disable-next-line max-len
const url = providedPage ?? path.normalize([...basePath.split(path.sep), pageName].join(path.sep));
const assetsToLoadIn = {
src: copySearchParams(url, options.src),
data: {
...metadata.imageMetadata,
alphaMode: page.pma ? 'premultiplied-alpha' : 'premultiply-alpha-on-upload'
}
};
const pixiPromise = loader.load(assetsToLoadIn).then((texture) => {
page.setTexture(SpineTexture.from(texture.source));
});
textureLoadingPromises.push(pixiPromise);
}
}
await Promise.all(textureLoadingPromises);
return retval;
},
},
};
extensions.add(spineTextureAtlasLoader);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL0F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUVOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGFBQWEsRUFDYixVQUFVLEVBRVYsb0JBQW9CLEVBQ3BCLElBQUksRUFFSixRQUFRLEVBRVIsYUFBYSxHQUViLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtsRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUU3QyxNQUFNLHVCQUF1QixHQUFpRTtJQUM3RixTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUs7SUFFOUIsUUFBUSxFQUFFO1FBQ1QsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQW1CLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUUvQixPQUFPO2dCQUNOLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxLQUFLO2FBQ1YsQ0FBQztRQUNILENBQUM7S0FDRDtJQUVELE1BQU0sRUFBRTtRQUNQLEVBQUUsRUFBRSxVQUFVO1FBQ2QsSUFBSSxFQUFFLFVBQVU7UUFDaEIsU0FBUyxFQUFFO1lBQ1YsSUFBSSxFQUFFLGFBQWEsQ0FBQyxVQUFVO1lBQzlCLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxNQUFNO1lBQ3JDLElBQUksRUFBRSxVQUFVO1NBQ2hCO1FBRUQsSUFBSSxDQUFFLEdBQVc7WUFDaEIsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFFLEdBQVc7WUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5ELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksVUFBVSxxQkFBcUIsR0FBRyxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFFdEcsT0FBTyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsU0FBUyxDQUFFLEtBQWMsRUFBRSxPQUFzQjtZQUNoRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztZQUMzQyxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDO1lBRW5HLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixJQUFJLHVCQUF1QixDQUFDLElBQUksUUFBUSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUVELE1BQU0sQ0FBRSxLQUFtQjtZQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLLENBQUUsS0FBZSxFQUFFLE9BQXNCLEVBQUUsTUFBYztZQUNuRSxNQUFNLFFBQVEsR0FBd0IsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBYSxDQUFDLENBQUM7WUFFbkQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRSxRQUFRLElBQUksR0FBRyxDQUFDO1lBQ2pCLENBQUM7WUFFRCw0R0FBNEc7WUFDNUcsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdkMsbUdBQW1HO1lBQ25HLElBQUksUUFBUSxDQUFDLE1BQU0sWUFBWSxhQUFhLElBQUksT0FBTyxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyRixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUVwQyxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQTRDLENBQUM7Z0JBQy9ELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDckQsQ0FBQztZQUVELDhFQUE4RTtZQUM5RSxNQUFNLHNCQUFzQixHQUFvQixFQUFFLENBQUM7WUFFbkQsaUJBQWlCO1lBQ2pCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUMzQixNQUFNLFlBQVksR0FBRyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBRTlFLElBQUksWUFBWSxZQUFZLGFBQWEsRUFBRSxDQUFDO29CQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztxQkFDSSxDQUFDO29CQUNMLG1DQUFtQztvQkFDbkMsTUFBTSxHQUFHLEdBQVcsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFFM0csTUFBTSxjQUFjLEdBQUc7d0JBQ3RCLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQWEsQ0FBQzt3QkFDakQsSUFBSSxFQUFFOzRCQUNMLEdBQUcsUUFBUSxDQUFDLGFBQWE7NEJBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO3lCQUMzRTtxQkFDRCxDQUFDO29CQUVGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQVUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDcEQsQ0FBQyxDQUFDLENBQUM7b0JBRUgsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0YsQ0FBQztZQUVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRTFDLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztLQUNEO0NBQytELENBQUM7QUFFbEUsVUFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tICdAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlJztcbmltcG9ydCB7XG5cdHR5cGUgQXNzZXRFeHRlbnNpb24sXG5cdGNoZWNrRXh0ZW5zaW9uLFxuXHRjb3B5U2VhcmNoUGFyYW1zLFxuXHRET01BZGFwdGVyLFxuXHRFeHRlbnNpb25UeXBlLFxuXHRleHRlbnNpb25zLFxuXHR0eXBlIExvYWRlcixcblx0TG9hZGVyUGFyc2VyUHJpb3JpdHksXG5cdHBhdGgsXG5cdHR5cGUgUmVzb2x2ZWRBc3NldCxcblx0UmVzb2x2ZXIsXG5cdHR5cGUgVGV4dHVyZSxcblx0VGV4dHVyZVNvdXJjZSxcblx0dHlwZSBVbnJlc29sdmVkQXNzZXQsXG59IGZyb20gJ3BpeGkuanMnO1xuaW1wb3J0IHsgU3BpbmVUZXh0dXJlIH0gZnJvbSAnLi4vU3BpbmVUZXh0dXJlLmpzJztcblxuXG50eXBlIFJhd0F0bGFzID0gc3RyaW5nO1xuXG5jb25zdCBsb2FkZXJOYW1lID0gXCJzcGluZVRleHR1cmVBdGxhc0xvYWRlclwiO1xuXG5jb25zdCBzcGluZVRleHR1cmVBdGxhc0xvYWRlcjogQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+ID0ge1xuXHRleHRlbnNpb246IEV4dGVuc2lvblR5cGUuQXNzZXQsXG5cblx0cmVzb2x2ZXI6IHtcblx0XHR0ZXN0OiAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gY2hlY2tFeHRlbnNpb24odmFsdWUsIFwiLmF0bGFzXCIpLFxuXHRcdHBhcnNlOiAodmFsdWU6IHN0cmluZyk6IFVucmVzb2x2ZWRBc3NldCA9PiB7XG5cdFx0XHRjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlc29sdXRpb246IHBhcnNlRmxvYXQoUmVzb2x2ZXIuUkVUSU5BX1BSRUZJWD8uZXhlYyh2YWx1ZSk/LlsxXSA/PyAnMScpLFxuXHRcdFx0XHRmb3JtYXQ6IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDJdLFxuXHRcdFx0XHRzcmM6IHZhbHVlLFxuXHRcdFx0fTtcblx0XHR9LFxuXHR9LFxuXG5cdGxvYWRlcjoge1xuXHRcdGlkOiBsb2FkZXJOYW1lLFxuXHRcdG5hbWU6IGxvYWRlck5hbWUsXG5cdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHR0eXBlOiBFeHRlbnNpb25UeXBlLkxvYWRQYXJzZXIsXG5cdFx0XHRwcmlvcml0eTogTG9hZGVyUGFyc2VyUHJpb3JpdHkuTm9ybWFsLFxuXHRcdFx0bmFtZTogbG9hZGVyTmFtZSxcblx0XHR9LFxuXG5cdFx0dGVzdCAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBjaGVja0V4dGVuc2lvbih1cmwsICcuYXRsYXMnKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJhd0F0bGFzPiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IERPTUFkYXB0ZXIuZ2V0KCkuZmV0Y2godXJsKTtcblxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaylcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBbJHtsb2FkZXJOYW1lfV0gRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblx0XHR9LFxuXG5cdFx0dGVzdFBhcnNlIChhc3NldDogdW5rbm93biwgb3B0aW9uczogUmVzb2x2ZWRBc3NldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdFx0Y29uc3QgaXNFeHRlbnNpb25SaWdodCA9IGNoZWNrRXh0ZW5zaW9uKG9wdGlvbnMuc3JjIGFzIHN0cmluZywgJy5hdGxhcycpO1xuXHRcdFx0Y29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgYXNzZXQgPT09ICdzdHJpbmcnO1xuXHRcdFx0Y29uc3QgaXNFeHBsaWNpdExvYWRQYXJzZXJTZXQgPSBvcHRpb25zLnBhcnNlciA9PT0gbG9hZGVyTmFtZSB8fCBvcHRpb25zLmxvYWRQYXJzZXIgPT09IGxvYWRlck5hbWU7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKGlzRXh0ZW5zaW9uUmlnaHQgfHwgaXNFeHBsaWNpdExvYWRQYXJzZXJTZXQpICYmIGlzU3RyaW5nKTtcblx0XHR9LFxuXG5cdFx0dW5sb2FkIChhdGxhczogVGV4dHVyZUF0bGFzKSB7XG5cdFx0XHRhdGxhcy5kaXNwb3NlKCk7XG5cdFx0fSxcblxuXHRcdGFzeW5jIHBhcnNlIChhc3NldDogUmF3QXRsYXMsIG9wdGlvbnM6IFJlc29sdmVkQXNzZXQsIGxvYWRlcjogTG9hZGVyKTogUHJvbWlzZTxUZXh0dXJlQXRsYXM+IHtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhID0gb3B0aW9ucy5kYXRhIHx8IHt9O1xuXHRcdFx0bGV0IGJhc2VQYXRoID0gcGF0aC5kaXJuYW1lKG9wdGlvbnMuc3JjIGFzIHN0cmluZyk7XG5cblx0XHRcdGlmIChiYXNlUGF0aCAmJiBiYXNlUGF0aC5sYXN0SW5kZXhPZignLycpICE9PSBiYXNlUGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGJhc2VQYXRoICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dmFsIGlzIGdvaW5nIHRvIGJlIGEgdGV4dHVyZSBhdGxhcy4gSG93ZXZlciB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0J3MgY2FsbGJhY2sgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2UuXG5cdFx0XHRjb25zdCByZXR2YWwgPSBuZXcgVGV4dHVyZUF0bGFzKGFzc2V0KTtcblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgZ2F2ZSBtZSBvbmx5IG9uZSB0ZXh0dXJlLCB0aGF0IG9uZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBcImZpcnN0XCIgdGV4dHVyZSBpbiB0aGUgYXRsYXNcblx0XHRcdGlmIChtZXRhZGF0YS5pbWFnZXMgaW5zdGFuY2VvZiBUZXh0dXJlU291cmNlIHx8IHR5cGVvZiBtZXRhZGF0YS5pbWFnZXMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGNvbnN0IHBpeGlUZXh0dXJlID0gbWV0YWRhdGEuaW1hZ2VzO1xuXG5cdFx0XHRcdG1ldGFkYXRhLmltYWdlcyA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIFRleHR1cmVTb3VyY2UgfCBzdHJpbmc+O1xuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXNbcmV0dmFsLnBhZ2VzWzBdLm5hbWVdID0gcGl4aVRleHR1cmU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIHdpbGwgd2FpdCBmb3IgYWxsIHByb21pc2VzIGZvciB0aGUgdGV4dHVyZXMgYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgZW5kLlxuXHRcdFx0Y29uc3QgdGV4dHVyZUxvYWRpbmdQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cblx0XHRcdC8vIGZpbGwgdGhlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmV0dmFsLnBhZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VOYW1lID0gcGFnZS5uYW1lO1xuXHRcdFx0XHRjb25zdCBwcm92aWRlZFBhZ2UgPSBtZXRhZGF0YT8uaW1hZ2VzID8gbWV0YWRhdGEuaW1hZ2VzW3BhZ2VOYW1lXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAocHJvdmlkZWRQYWdlIGluc3RhbmNlb2YgVGV4dHVyZVNvdXJjZSkge1xuXHRcdFx0XHRcdHBhZ2Uuc2V0VGV4dHVyZShTcGluZVRleHR1cmUuZnJvbShwcm92aWRlZFBhZ2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuXHRcdFx0XHRcdGNvbnN0IHVybDogc3RyaW5nID0gcHJvdmlkZWRQYWdlID8/IHBhdGgubm9ybWFsaXplKFsuLi5iYXNlUGF0aC5zcGxpdChwYXRoLnNlcCksIHBhZ2VOYW1lXS5qb2luKHBhdGguc2VwKSk7XG5cblx0XHRcdFx0XHRjb25zdCBhc3NldHNUb0xvYWRJbiA9IHtcblx0XHRcdFx0XHRcdHNyYzogY29weVNlYXJjaFBhcmFtcyh1cmwsIG9wdGlvbnMuc3JjIGFzIHN0cmluZyksXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdC4uLm1ldGFkYXRhLmltYWdlTWV0YWRhdGEsXG5cdFx0XHRcdFx0XHRcdGFscGhhTW9kZTogcGFnZS5wbWEgPyAncHJlbXVsdGlwbGllZC1hbHBoYScgOiAncHJlbXVsdGlwbHktYWxwaGEtb24tdXBsb2FkJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjb25zdCBwaXhpUHJvbWlzZSA9IGxvYWRlci5sb2FkPFRleHR1cmU+KGFzc2V0c1RvTG9hZEluKS50aGVuKCh0ZXh0dXJlKSA9PiB7XG5cdFx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20odGV4dHVyZS5zb3VyY2UpKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkaW5nUHJvbWlzZXMucHVzaChwaXhpUHJvbWlzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dHVyZUxvYWRpbmdQcm9taXNlcyk7XG5cblx0XHRcdHJldHVybiByZXR2YWw7XG5cdFx0fSxcblx0fSxcbn0gYXMgQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+O1xuXG5leHRlbnNpb25zLmFkZChzcGluZVRleHR1cmVBdGxhc0xvYWRlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNwaW5lQXRsYXNNZXRhZGF0YSB7XG5cdC8vIElmIHlvdSBhcmUgZG93bmxvYWRpbmcgYW4gLmF0bGFzIGZpbGUsIHRoaXMgbWV0YWRhdGEgd2lsbCBnbyB0byB0aGUgVGV4dHVyZSBsb2FkZXJcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiB1c2VyIGNhbiBwYXNzIGFueVxuXHRpbWFnZU1ldGFkYXRhPzogYW55O1xuXHQvLyBJZiB5b3UgYWxyZWFkeSBoYXZlIGF0bGFzIHBhZ2VzIGxvYWRlZCBhcyBwaXhpIHRleHR1cmVzXG5cdC8vIGFuZCB3YW50IHRvIHVzZSB0aGF0IHRvIGNyZWF0ZSB0aGUgYXRsYXMsIHlvdSBjYW4gcGFzcyB0aGVtIGhlcmVcblx0aW1hZ2VzPzogVGV4dHVyZVNvdXJjZSB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIFRleHR1cmVTb3VyY2UgfCBzdHJpbmc+O1xufVxuIl19