/****************************************************************************** * 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 { SpineTexture } from "../SpineTexture.js"; import { Assets, copySearchParams } from "@pixi/assets"; import { LoaderParserPriority, checkExtension } from "@pixi/assets"; import { ALPHA_MODES, ExtensionType, settings, utils, BaseTexture, extensions } from "@pixi/core"; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL2F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJbEcsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7QUFFN0MsTUFBTSx1QkFBdUIsR0FBaUU7SUFDN0YsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLO0lBRTlCLFFBQVEsRUFBRTtRQUNULElBQUksRUFBRSxDQUFDLEtBQWEsRUFBVyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7UUFDakUsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFtQixFQUFFO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsT0FBTztnQkFDTixVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUN2RSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixHQUFHLEVBQUUsS0FB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LENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDekQsQ0FBQyxDQUFDLENBQUM7b0JBQ0osc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0YsQ0FBQztZQUVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRTFDLHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBRS9FLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztLQUNEO0NBQytELENBQUM7QUFFbEUsVUFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tIFwiQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZVwiO1xuaW1wb3J0IHsgU3BpbmVUZXh0dXJlIH0gZnJvbSBcIi4uL1NwaW5lVGV4dHVyZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBc3NldEV4dGVuc2lvbiwgTG9hZGVyLCBSZXNvbHZlZEFzc2V0LCBVbnJlc29sdmVkQXNzZXQgfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgeyBBc3NldHMsIGNvcHlTZWFyY2hQYXJhbXMgfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgeyBMb2FkZXJQYXJzZXJQcmlvcml0eSwgY2hlY2tFeHRlbnNpb24gfSBmcm9tIFwiQHBpeGkvYXNzZXRzXCI7XG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuaW1wb3J0IHsgQUxQSEFfTU9ERVMsIEV4dGVuc2lvblR5cGUsIHNldHRpbmdzLCB1dGlscywgQmFzZVRleHR1cmUsIGV4dGVuc2lvbnMgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG50eXBlIFJhd0F0bGFzID0gc3RyaW5nO1xuXG5jb25zdCBsb2FkZXJOYW1lID0gXCJzcGluZVRleHR1cmVBdGxhc0xvYWRlclwiO1xuXG5jb25zdCBzcGluZVRleHR1cmVBdGxhc0xvYWRlcjogQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+ID0ge1xuXHRleHRlbnNpb246IEV4dGVuc2lvblR5cGUuQXNzZXQsXG5cblx0cmVzb2x2ZXI6IHtcblx0XHR0ZXN0OiAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gY2hlY2tFeHRlbnNpb24odmFsdWUsIFwiLmF0bGFzXCIpLFxuXHRcdHBhcnNlOiAodmFsdWU6IHN0cmluZyk6IFVucmVzb2x2ZWRBc3NldCA9PiB7XG5cdFx0XHRjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXNvbHV0aW9uOiBwYXJzZUZsb2F0KHNldHRpbmdzLlJFVElOQV9QUkVGSVg/LmV4ZWModmFsdWUpPy5bMV0gPz8gJzEnKSxcblx0XHRcdFx0Zm9ybWF0OiBzcGxpdFtzcGxpdC5sZW5ndGggLSAyXSxcblx0XHRcdFx0c3JjOiB2YWx1ZSxcblx0XHRcdH07XG5cdFx0fSxcblx0fSxcblxuXHRsb2FkZXI6IHtcblx0XHRuYW1lOiBsb2FkZXJOYW1lLFxuXHRcdGV4dGVuc2lvbjoge1xuXHRcdFx0dHlwZTogRXh0ZW5zaW9uVHlwZS5Mb2FkUGFyc2VyLFxuXHRcdFx0cHJpb3JpdHk6IExvYWRlclBhcnNlclByaW9yaXR5Lk5vcm1hbCxcblx0XHRcdG5hbWU6IGxvYWRlck5hbWUsXG5cdFx0fSxcblxuXHRcdHRlc3QgKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gY2hlY2tFeHRlbnNpb24odXJsLCBcIi5hdGxhc1wiKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJhd0F0bGFzPiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHNldHRpbmdzLkFEQVBURVIuZmV0Y2godXJsKTtcblxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaylcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBbJHtsb2FkZXJOYW1lfV0gRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblx0XHR9LFxuXG5cdFx0dGVzdFBhcnNlIChhc3NldDogdW5rbm93biwgb3B0aW9uczogUmVzb2x2ZWRBc3NldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdFx0Y29uc3QgaXNFeHRlbnNpb25SaWdodCA9IGNoZWNrRXh0ZW5zaW9uKG9wdGlvbnMuc3JjISwgXCIuYXRsYXNcIik7XG5cdFx0XHRjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBhc3NldCA9PT0gXCJzdHJpbmdcIjtcblx0XHRcdGNvbnN0IGlzRXhwbGljaXRMb2FkUGFyc2VyU2V0ID0gb3B0aW9ucy5sb2FkUGFyc2VyID09PSBsb2FkZXJOYW1lO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKChpc0V4dGVuc2lvblJpZ2h0IHx8IGlzRXhwbGljaXRMb2FkUGFyc2VyU2V0KSAmJiBpc1N0cmluZyk7XG5cdFx0fSxcblxuXHRcdHVubG9hZCAoYXRsYXM6IFRleHR1cmVBdGxhcykge1xuXHRcdFx0YXRsYXMuZGlzcG9zZSgpO1xuXHRcdH0sXG5cblx0XHRhc3luYyBwYXJzZSAoYXNzZXQ6IFJhd0F0bGFzLCBvcHRpb25zOiB7IHNyYzogc3RyaW5nLCBkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhIH0sIGxvYWRlcjogTG9hZGVyKTogUHJvbWlzZTxUZXh0dXJlQXRsYXM+IHtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhID0gb3B0aW9ucy5kYXRhIHx8IHt9O1xuXHRcdFx0bGV0IGJhc2VQYXRoID0gdXRpbHMucGF0aC5kaXJuYW1lKG9wdGlvbnMuc3JjKTtcblxuXHRcdFx0aWYgKGJhc2VQYXRoICYmIGJhc2VQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSAhPT0gYmFzZVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRiYXNlUGF0aCArPSBcIi9cIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dmFsIGlzIGdvaW5nIHRvIGJlIGEgdGV4dHVyZSBhdGxhcy4gSG93ZXZlciwgd2UgbmVlZCB0byB3YWl0IGZvciBpdHMgY2FsbGJhY2sgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2UuXG5cdFx0XHRjb25zdCByZXR2YWwgPSBuZXcgVGV4dHVyZUF0bGFzKGFzc2V0KTtcblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgZ2F2ZSBtZSBvbmx5IG9uZSB0ZXh0dXJlLCB0aGF0IG9uZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBcImZpcnN0XCIgdGV4dHVyZSBpbiB0aGUgYXRsYXNcblx0XHRcdGlmIChtZXRhZGF0YS5pbWFnZXMgaW5zdGFuY2VvZiBCYXNlVGV4dHVyZSB8fCB0eXBlb2YgbWV0YWRhdGEuaW1hZ2VzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IHBpeGlUZXh0dXJlID0gbWV0YWRhdGEuaW1hZ2VzO1xuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBCYXNlVGV4dHVyZSB8IHN0cmluZz47XG5cdFx0XHRcdG1ldGFkYXRhLmltYWdlc1tyZXR2YWwucGFnZXNbMF0ubmFtZV0gPSBwaXhpVGV4dHVyZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Ugd2lsbCB3YWl0IGZvciBhbGwgcHJvbWlzZXMgZm9yIHRoZSB0ZXh0dXJlcyBhdCB0aGUgc2FtZSB0aW1lIGF0IHRoZSBlbmQuXG5cdFx0XHRjb25zdCB0ZXh0dXJlTG9hZGluZ1Byb21pc2VzID0gW107XG5cblx0XHRcdC8vIHNldHRpbmcgcHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgdG8gZmFsc2UgZm9yIGxvYWRUZXh0dXJlcyBsb2FkZXIgdG8gYWxsb3cgbG9hZGluZyBQTUEgaW1hZ2VzXG5cdFx0XHRsZXQgb2xkUHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXAgPSB0cnVlO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJzZXIgb2YgbG9hZGVyLnBhcnNlcnMpIHtcblx0XHRcdFx0aWYgKHBhcnNlci5uYW1lID09IFwibG9hZFRleHR1cmVzXCIpIHtcblx0XHRcdFx0XHRvbGRQcmVmZXJDcmVhdGVJbWFnZUJpdG1hcCA9IHBhcnNlci5jb25maWc/LnByZWZlckNyZWF0ZUltYWdlQml0bWFwO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRBc3NldHMuc2V0UHJlZmVyZW5jZXMoeyBwcmVmZXJDcmVhdGVJbWFnZUJpdG1hcDogZmFsc2UgfSk7XG5cblx0XHRcdC8vIGZpbGwgdGhlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmV0dmFsLnBhZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VOYW1lID0gcGFnZS5uYW1lO1xuXHRcdFx0XHRjb25zdCBwcm92aWRlZFBhZ2UgPSBtZXRhZGF0YT8uaW1hZ2VzID8gbWV0YWRhdGEuaW1hZ2VzW3BhZ2VOYW1lXSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHByb3ZpZGVkUGFnZSBpbnN0YW5jZW9mIEJhc2VUZXh0dXJlKSB7XG5cdFx0XHRcdFx0cGFnZS5zZXRUZXh0dXJlKFNwaW5lVGV4dHVyZS5mcm9tKHByb3ZpZGVkUGFnZSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHVybDogc3RyaW5nID0gcHJvdmlkZWRQYWdlID8/IHV0aWxzLnBhdGgubm9ybWFsaXplKFsuLi5iYXNlUGF0aC5zcGxpdCh1dGlscy5wYXRoLnNlcCksIHBhZ2VOYW1lXS5qb2luKHV0aWxzLnBhdGguc2VwKSk7XG5cdFx0XHRcdFx0Y29uc3QgYXNzZXRzVG9Mb2FkSW4gPSB7IHNyYzogY29weVNlYXJjaFBhcmFtcyh1cmwsIG9wdGlvbnMuc3JjIGFzIHN0cmluZyksIGRhdGE6IHsgLi4ubWV0YWRhdGEuaW1hZ2VNZXRhZGF0YSwgLi4ueyBhbHBoYU1vZGU6IHBhZ2UucG1hID8gQUxQSEFfTU9ERVMuUE1BIDogQUxQSEFfTU9ERVMuVU5QQUNLIH0gfSB9O1xuXHRcdFx0XHRcdGNvbnN0IHBpeGlQcm9taXNlID0gbG9hZGVyLmxvYWQ8VGV4dHVyZT4oYXNzZXRzVG9Mb2FkSW4pXG5cdFx0XHRcdFx0XHQudGhlbigodGV4dHVyZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20odGV4dHVyZS5iYXNlVGV4dHVyZSkpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGV4dHVyZUxvYWRpbmdQcm9taXNlcy5wdXNoKHBpeGlQcm9taXNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh0ZXh0dXJlTG9hZGluZ1Byb21pc2VzKTtcblxuXHRcdFx0Ly8gcmVzdG9yaW5nIHByZWZlckNyZWF0ZUltYWdlQml0bWFwIG9sZCB2YWx1ZSBmb3IgbG9hZFRleHR1cmVzIGxvYWRlclxuXHRcdFx0QXNzZXRzLnNldFByZWZlcmVuY2VzKHsgcHJlZmVyQ3JlYXRlSW1hZ2VCaXRtYXA6IG9sZFByZWZlckNyZWF0ZUltYWdlQml0bWFwIH0pO1xuXG5cdFx0XHRyZXR1cm4gcmV0dmFsO1xuXHRcdH0sXG5cdH0sXG59IGFzIEFzc2V0RXh0ZW5zaW9uPFJhd0F0bGFzIHwgVGV4dHVyZUF0bGFzLCBJU3BpbmVBdGxhc01ldGFkYXRhPjtcblxuZXh0ZW5zaW9ucy5hZGQoc3BpbmVUZXh0dXJlQXRsYXNMb2FkZXIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTcGluZUF0bGFzTWV0YWRhdGEge1xuXHQvLyBJZiB5b3UgYXJlIGRvd25sb2FkaW5nIGFuIC5hdGxhcyBmaWxlLCB0aGlzIG1ldGFkYXRhIHdpbGwgZ28gdG8gdGhlIFRleHR1cmUgbG9hZGVyXG5cdGltYWdlTWV0YWRhdGE/OiBhbnk7XG5cdC8vIElmIHlvdSBhbHJlYWR5IGhhdmUgYXRsYXMgcGFnZXMgbG9hZGVkIGFzIHBpeGkgdGV4dHVyZXMgYW5kIHdhbnQgdG8gdXNlIHRoYXQgdG8gY3JlYXRlIHRoZSBhdGxhcywgeW91IGNhbiBwYXNzIHRoZW0gaGVyZVxuXHRpbWFnZXM/OiBCYXNlVGV4dHVyZSB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIEJhc2VUZXh0dXJlIHwgc3RyaW5nPjtcbn1cbiJdfQ==