122 lines
20 KiB
JavaScript
122 lines
20 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 { TextureAtlas } from "@spine-particle/spine-core-4.3";
|
|
import { Assets, checkExtension, copySearchParams, LoaderParserPriority } from "@pixi/assets";
|
|
import { ALPHA_MODES, BaseTexture, ExtensionType, extensions, settings, utils } from "@pixi/core";
|
|
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(settings.RETINA_PREFIX?.exec(value)?.[1] ?? '1'),
|
|
format: split[split.length - 2],
|
|
src: value,
|
|
};
|
|
},
|
|
},
|
|
loader: {
|
|
name: loaderName,
|
|
extension: {
|
|
type: ExtensionType.LoadParser,
|
|
priority: LoaderParserPriority.Normal,
|
|
name: loaderName,
|
|
},
|
|
test(url) {
|
|
return checkExtension(url, ".atlas");
|
|
},
|
|
async load(url) {
|
|
const response = await settings.ADAPTER.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.loadParser === loaderName;
|
|
return Promise.resolve((isExtensionRight || isExplicitLoadParserSet) && isString);
|
|
},
|
|
unload(atlas) {
|
|
atlas.dispose();
|
|
},
|
|
async parse(asset, options, loader) {
|
|
const metadata = options.data || {};
|
|
let basePath = utils.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 its 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 BaseTexture || 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 = [];
|
|
// setting preferCreateImageBitmap to false for loadTextures loader to allow loading PMA images
|
|
let oldPreferCreateImageBitmap = true;
|
|
for (const parser of loader.parsers) {
|
|
if (parser.name === "loadTextures") {
|
|
oldPreferCreateImageBitmap = parser.config?.preferCreateImageBitmap;
|
|
break;
|
|
}
|
|
}
|
|
Assets.setPreferences({ preferCreateImageBitmap: false });
|
|
// fill the pages
|
|
for (const page of retval.pages) {
|
|
const pageName = page.name;
|
|
const providedPage = metadata?.images ? metadata.images[pageName] : undefined;
|
|
if (providedPage instanceof BaseTexture) {
|
|
page.setTexture(SpineTexture.from(providedPage));
|
|
}
|
|
else {
|
|
const url = providedPage ?? utils.path.normalize([...basePath.split(utils.path.sep), pageName].join(utils.path.sep));
|
|
const assetsToLoadIn = { src: copySearchParams(url, options.src), data: { ...metadata.imageMetadata, ...{ alphaMode: page.pma ? ALPHA_MODES.PMA : ALPHA_MODES.UNPACK } } };
|
|
const pixiPromise = loader.load(assetsToLoadIn)
|
|
.then((texture) => {
|
|
page.setTexture(SpineTexture.from(texture.baseTexture));
|
|
});
|
|
textureLoadingPromises.push(pixiPromise);
|
|
}
|
|
}
|
|
await Promise.all(textureLoadingPromises);
|
|
// restoring preferCreateImageBitmap old value for loadTextures loader
|
|
Assets.setPreferences({ preferCreateImageBitmap: oldPreferCreateImageBitmap });
|
|
return retval;
|
|
},
|
|
},
|
|
};
|
|
extensions.add(spineTextureAtlasLoader);
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL0F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlsRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUU3QyxNQUFNLHVCQUF1QixHQUFpRTtJQUM3RixTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUs7SUFFOUIsUUFBUSxFQUFFO1FBQ1QsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQW1CLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixPQUFPO2dCQUNOLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxLQUFLO2FBQ1YsQ0FBQztRQUNILENBQUM7S0FDRDtJQUVE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SSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxDQUFDLENBQUMsQ0FBQztvQkFDSixzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFDLENBQUM7WUFDRixDQUFDO1lBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFMUMsc0VBQXNFO1lBQ3RFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7WUFFL0UsT0FBTyxNQUFNLENBQUM7UUFDZixDQUFDO0tBQ0Q7Q0FDK0QsQ0FBQztBQUVsRSxVQUFVLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFRleHR1cmVBdGxhcyB9IGZyb20gXCJAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2V0RXh0ZW5zaW9uLCBMb2FkZXIsIFJlc29sdmVkQXNzZXQsIFVucmVzb2x2ZWRBc3NldCB9IGZyb20gXCJAcGl4aS9hc3NldHNcIjtcbmltcG9ydCB7IEFzc2V0cywgY2hlY2tFeHRlbnNpb24sIGNvcHlTZWFyY2hQYXJhbXMsIExvYWRlclBhcnNlclByaW9yaXR5IH0gZnJvbSBcIkBwaXhpL2Fzc2V0c1wiO1xuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcIkBwaXhpL2NvcmVcIjtcbmltcG9ydCB7IEFMUEhBX01PREVTLCBCYXNlVGV4dHVyZSwgRXh0ZW5zaW9uVHlwZSwgZXh0ZW5zaW9ucywgc2V0dGluZ3MsIHV0aWxzIH0gZnJvbSBcIkBwaXhpL2NvcmVcIjtcbmltcG9ydCB7IFNwaW5lVGV4dHVyZSB9IGZyb20gXCIuLi9TcGluZVRleHR1cmUuanNcIjtcblxudHlwZSBSYXdBdGxhcyA9IHN0cmluZztcblxuY29uc3QgbG9hZGVyTmFtZSA9IFwic3BpbmVUZXh0dXJlQXRsYXNMb2FkZXJcIjtcblxuY29uc3Qgc3BpbmVUZXh0dXJlQXRsYXNMb2FkZXI6IEFzc2V0RXh0ZW5zaW9uPFJhd0F0bGFzIHwgVGV4dHVyZUF0bGFzLCBJU3BpbmVBdGxhc01ldGFkYXRhPiA9IHtcblx0ZXh0ZW5zaW9uOiBFeHRlbnNpb25UeXBlLkFzc2V0LFxuXG5cdHJlc29sdmVyOiB7XG5cdFx0dGVzdDogKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IGNoZWNrRXh0ZW5zaW9uKHZhbHVlLCBcIi5hdGxhc1wiKSxcblx0XHRwYXJzZTogKHZhbHVlOiBzdHJpbmcpOiBVbnJlc29sdmVkQXNzZXQgPT4ge1xuXHRcdFx0Y29uc3Qgc3BsaXQgPSB2YWx1ZS5zcGxpdCgnLicpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVzb2x1dGlvbjogcGFyc2VGbG9hdChzZXR0aW5ncy5SRVRJTkFfUFJFRklYPy5leGVjKHZhbHVlKT8uWzFdID8/ICcxJyksXG5cdFx0XHRcdGZvcm1hdDogc3BsaXRbc3BsaXQubGVuZ3RoIC0gMl0sXG5cdFx0XHRcdHNyYzogdmFsdWUsXG5cdFx0XHR9O1xuXHRcdH0sXG5cdH0sXG5cblx0bG9hZGVyOiB7XG5cdFx0bmFtZTogbG9hZGVyTmFtZSxcblx0XHRleHRlbnNpb246IHtcblx0XHRcdHR5cGU6IEV4dGVuc2lvblR5cGUuTG9hZFBhcnNlcixcblx0XHRcdHByaW9yaXR5OiBMb2FkZXJQYXJzZXJQcmlvcml0eS5Ob3JtYWwsXG5cdFx0XHRuYW1lOiBsb2FkZXJOYW1lLFxuXHRcdH0sXG5cblx0XHR0ZXN0ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGNoZWNrRXh0ZW5zaW9uKHVybCwgXCIuYXRsYXNcIik7XG5cdFx0fSxcblxuXHRcdGFzeW5jIGxvYWQgKHVybDogc3RyaW5nKTogUHJvbWlzZTxSYXdBdGxhcz4ge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZXR0aW5ncy5BREFQVEVSLmZldGNoKHVybCk7XG5cblx0XHRcdGlmICghcmVzcG9uc2Uub2spXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgWyR7bG9hZGVyTmFtZX1dIEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG5cdFx0fSxcblxuXHRcdHRlc3RQYXJzZSAoYXNzZXQ6IHVua25vd24sIG9wdGlvbnM6IFJlc29sdmVkQXNzZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRcdGNvbnN0IGlzRXh0ZW5zaW9uUmlnaHQgPSBjaGVja0V4dGVuc2lvbihvcHRpb25zLnNyYyBhcyBzdHJpbmcsIFwiLmF0bGFzXCIpO1xuXHRcdFx0Y29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgYXNzZXQgPT09IFwic3RyaW5nXCI7XG5cdFx0XHRjb25zdCBpc0V4cGxpY2l0TG9hZFBhcnNlclNldCA9IG9wdGlvbnMubG9hZFBhcnNlciA9PT0gbG9hZGVyTmFtZTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgoaXNFeHRlbnNpb25SaWdodCB8fCBpc0V4cGxpY2l0TG9hZFBhcnNlclNldCkgJiYgaXNTdHJpbmcpO1xuXHRcdH0sXG5cblx0XHR1bmxvYWQgKGF0bGFzOiBUZXh0dXJlQXRsYXMpIHtcblx0XHRcdGF0bGFzLmRpc3Bvc2UoKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgcGFyc2UgKGFzc2V0OiBSYXdBdGxhcywgb3B0aW9uczogeyBzcmM6IHN0cmluZywgZGF0YTogSVNwaW5lQXRsYXNNZXRhZGF0YSB9LCBsb2FkZXI6IExvYWRlcik6IFByb21pc2U8VGV4dHVyZUF0bGFzPiB7XG5cdFx0XHRjb25zdCBtZXRhZGF0YTogSVNwaW5lQXRsYXNNZXRhZGF0YSA9IG9wdGlvbnMuZGF0YSB8fCB7fTtcblx0XHRcdGxldCBiYXNlUGF0aCA9IHV0aWxzLnBhdGguZGlybmFtZShvcHRpb25zLnNyYyk7XG5cblx0XHRcdGlmIChiYXNlUGF0aCAmJiBiYXNlUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgIT09IGJhc2VQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0YmFzZVBhdGggKz0gXCIvXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHZhbCBpcyBnb2luZyB0byBiZSBhIHRleHR1cmUgYXRsYXMuIEhvd2V2ZXIsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIGNhbGxiYWNrIHRvIHJlc29sdmUgdGhpcyBwcm9taXNlLlxuXHRcdFx0Y29uc3QgcmV0dmFsID0gbmV3IFRleHR1cmVBdGxhcyhhc3NldCk7XG5cblx0XHRcdC8vIElmIHRoZSB1c2VyIGdhdmUgbWUgb25seSBvbmUgdGV4dHVyZSwgdGhhdCBvbmUgaXMgYXNzdW1lZCB0byBiZSB0aGUgXCJmaXJzdFwiIHRleHR1cmUgaW4gdGhlIGF0bGFzXG5cdFx0XHRpZiAobWV0YWRhdGEuaW1hZ2VzIGluc3RhbmNlb2YgQmFzZVRleHR1cmUgfHwgdHlwZW9mIG1ldGFkYXRhLmltYWdlcyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBwaXhpVGV4dHVyZSA9IG1ldGFkYXRhLmltYWdlcztcblx0XHRcdFx0bWV0YWRhdGEuaW1hZ2VzID0ge30gYXMgUmVjb3JkPHN0cmluZywgQmFzZVRleHR1cmUgfCBzdHJpbmc+O1xuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXNbcmV0dmFsLnBhZ2VzWzBdLm5hbWVdID0gcGl4aVRleHR1cmU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIHdpbGwgd2FpdCBmb3IgYWxsIHByb21pc2VzIGZvciB0aGUgdGV4dHVyZXMgYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgZW5kLlxuXHRcdFx0Y29uc3QgdGV4dHVyZUxvYWRpbmdQcm9taXNlcyA9IFtdO1xuXG5cdFx0XHQvLyBzZXR0aW5nIHByZWZlckNyZWF0ZUltYWdlQml0bWFwIHRvIGZhbHNlIGZvciBsb2FkVGV4dHVyZXMgbG9hZGVyIHRvIGFsbG93IGxvYWRpbmcgUE1BIGltYWdlc1xuXHRcdFx0bGV0IG9sZFByZWZlckNyZWF0ZUltYWdlQml0bWFwID0gdHJ1ZTtcblx0XHRcdGZvciAoY29uc3QgcGFyc2VyIG9mIGxvYWRlci5wYXJzZXJzKSB7XG5cdFx0XHRcdGlmIChwYXJzZXIubmFtZSA9PT0gXCJsb2FkVGV4dHVyZXNcIikge1xuXHRcdFx0XHRcdG9sZFByZWZlckNyZWF0ZUltYWdlQml0bWFwID0gcGFyc2VyLmNvbmZpZz8ucHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXA7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdEFzc2V0cy5zZXRQcmVmZXJlbmNlcyh7IHByZWZlckNyZWF0ZUltYWdlQml0bWFwOiBmYWxzZSB9KTtcblxuXHRcdFx0Ly8gZmlsbCB0aGUgcGFnZXNcblx0XHRcdGZvciAoY29uc3QgcGFnZSBvZiByZXR2YWwucGFnZXMpIHtcblx0XHRcdFx0Y29uc3QgcGFnZU5hbWUgPSBwYWdlLm5hbWU7XG5cdFx0XHRcdGNvbnN0IHByb3ZpZGVkUGFnZSA9IG1ldGFkYXRhPy5pbWFnZXMgPyBtZXRhZGF0YS5pbWFnZXNbcGFnZU5hbWVdIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAocHJvdmlkZWRQYWdlIGluc3RhbmNlb2YgQmFzZVRleHR1cmUpIHtcblx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20ocHJvdmlkZWRQYWdlKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgdXJsOiBzdHJpbmcgPSBwcm92aWRlZFBhZ2UgPz8gdXRpbHMucGF0aC5ub3JtYWxpemUoWy4uLmJhc2VQYXRoLnNwbGl0KHV0aWxzLnBhdGguc2VwKSwgcGFnZU5hbWVdLmpvaW4odXRpbHMucGF0aC5zZXApKTtcblx0XHRcdFx0XHRjb25zdCBhc3NldHNUb0xvYWRJbiA9IHsgc3JjOiBjb3B5U2VhcmNoUGFyYW1zKHVybCwgb3B0aW9ucy5zcmMgYXMgc3RyaW5nKSwgZGF0YTogeyAuLi5tZXRhZGF0YS5pbWFnZU1ldGFkYXRhLCAuLi57IGFscGhhTW9kZTogcGFnZS5wbWEgPyBBTFBIQV9NT0RFUy5QTUEgOiBBTFBIQV9NT0RFUy5VTlBBQ0sgfSB9IH07XG5cdFx0XHRcdFx0Y29uc3QgcGl4aVByb21pc2UgPSBsb2FkZXIubG9hZDxUZXh0dXJlPihhc3NldHNUb0xvYWRJbilcblx0XHRcdFx0XHRcdC50aGVuKCh0ZXh0dXJlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHBhZ2Uuc2V0VGV4dHVyZShTcGluZVRleHR1cmUuZnJvbSh0ZXh0dXJlLmJhc2VUZXh0dXJlKSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0ZXh0dXJlTG9hZGluZ1Byb21pc2VzLnB1c2gocGl4aVByb21pc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHRleHR1cmVMb2FkaW5nUHJvbWlzZXMpO1xuXG5cdFx0XHQvLyByZXN0b3JpbmcgcHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgb2xkIHZhbHVlIGZvciBsb2FkVGV4dHVyZXMgbG9hZGVyXG5cdFx0XHRBc3NldHMuc2V0UHJlZmVyZW5jZXMoeyBwcmVmZXJDcmVhdGVJbWFnZUJpdG1hcDogb2xkUHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgfSk7XG5cblx0XHRcdHJldHVybiByZXR2YWw7XG5cdFx0fSxcblx0fSxcbn0gYXMgQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+O1xuXG5leHRlbnNpb25zLmFkZChzcGluZVRleHR1cmVBdGxhc0xvYWRlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNwaW5lQXRsYXNNZXRhZGF0YSB7XG5cdC8vIElmIHlvdSBhcmUgZG93bmxvYWRpbmcgYW4gLmF0bGFzIGZpbGUsIHRoaXMgbWV0YWRhdGEgd2lsbCBnbyB0byB0aGUgVGV4dHVyZSBsb2FkZXJcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiB1c2VyIGNhbiBwYXNzIGFueVxuXHRpbWFnZU1ldGFkYXRhPzogYW55O1xuXHQvLyBJZiB5b3UgYWxyZWFkeSBoYXZlIGF0bGFzIHBhZ2VzIGxvYWRlZCBhcyBwaXhpIHRleHR1cmVzIGFuZCB3YW50IHRvIHVzZSB0aGF0IHRvIGNyZWF0ZSB0aGUgYXRsYXMsIHlvdSBjYW4gcGFzcyB0aGVtIGhlcmVcblx0aW1hZ2VzPzogQmFzZVRleHR1cmUgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBCYXNlVGV4dHVyZSB8IHN0cmluZz47XG59XG4iXX0=
|