@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
141 lines • 32 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./all-cards.service";
export class ImagePreloaderService {
constructor(cards) {
this.cards = cards;
// Declare here all the image resources we will need in the app
this.STATIC_IMAGES = {
// Used in CSS
enchantmentBanner: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/enchantments/enchantment-banner.png',
mana: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/mana.png',
manaSpent: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/mana_spent.png',
manaLocked: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/mana_locked.png',
// Used in JS
raceBanner: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/card/race-banner.png',
frameMinionPremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/frame-minion-premium.png',
frameHeroPower: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_power.png',
frameHeroPowerExhausted: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_power_exhausted.png',
frameHeroPowerPremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_power_premium.png',
frameHeroPowerExhaustedPremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_power_exhausted_premium.png',
onBoardMinionFrame: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/onboard_minion_frame.png',
onBoardMinionFramePremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/onboard_minion_frame_premium.png',
onBoardMinionTaunt: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/onboard_minion_taunt.png',
onBoardMinionTauntPremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/onboard_minion_taunt_premium.png',
heroFrame: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_frame.png',
heroFramePremium: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/hero/hero_frame_premium.png',
nameBannerSpell: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/name-banner-spell.png',
nameBannerMinion: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/name-banner-minion.png',
nameBannerWeapon: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/name-banner-weapon.png',
weaponSheathed: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/weapon_sheathed.png',
weaponUnsheathed: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/weapon_unsheathed.png',
exhausted: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/exhausted.png',
iconDeathrattle: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/effects/icon_deathrattle.png',
iconPoisonous: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/effects/icon_poisonous.png',
iconLifesteal: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/effects/icon_lifesteal.png',
iconInspire: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/effects/icon_inspire.png',
iconTrigger: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/effects/icon_trigger.png',
overlayImmune: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_immune.png',
overlayDivineShield: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_divine_shield.png',
overlaySilenced: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_silenced.png',
overlayFrozen: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_frozen.png',
overlayStealth: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_stealth.png',
overlayElusive: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_elusive.png',
overlayWindfury: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_windfury.png',
overlayTemporaryEffect: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/minion_temporary_effect.png',
heroOverlayStealth: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/hero_stealth.png',
heroOverlayImmune: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/hero_immune.png',
heroOverlayHeavilyArmored: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/hero_heavily_armored.png',
heroOverlayFrozen: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/hero_frozen.png',
enchantmentRing: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/enchantments/enchantment-ring.png',
rarityCommon: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/card/rarity-common.png',
rarityRare: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/card/rarity-rare.png',
rarityEpic: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/card/rarity-epic.png',
rarityLegendary: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/card/rarity-legendary.png',
attack: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/attack.png',
health: 'https://static.zerotoheroes.com/hearthstone/asset/manastorm/health_new.png',
armor: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/armor.png',
damage: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/icon_damage.png',
heal: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/icon_heal.png',
burned: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/overlays/burned.png',
mulliganDiscard: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/mulligan_discard.png',
cardback: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/cardback.png',
quest: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/quest_button.png',
questBang: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/quest_bang.png',
questInfo: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/quest_info_arrow.png',
secretQuestionMark: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/secret_question_mark.png',
fatigue: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/fatigue.png',
victoryScreen: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/victory_screen.png',
lossScreen: 'https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/loss_screen.png',
};
this.CLASS_IMAGES = {
spellFrame: playerClass => `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/frame-spell-${playerClass}.png`,
minionFrame: playerClass => `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/frame-minion-${playerClass}.png`,
weaponFrame: playerClass => `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/card/frame-weapon-${playerClass}.png`,
secretFrame: playerClass => {
if (['warlock', 'druid', 'priest', 'neutral'].indexOf(playerClass) !== -1) {
return null;
}
return `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/secret_${playerClass}.png`;
},
secretSplash: playerClass => {
if (['warlock', 'druid', 'priest', 'neutral'].indexOf(playerClass) !== -1) {
return null;
}
return `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/secret_splash_${playerClass}.png`;
},
secretBanner: playerClass => {
if (['warlock', 'druid', 'priest', 'neutral'].indexOf(playerClass) !== -1) {
return null;
}
return `https://static.zerotoheroes.com/hearthstone/asset/coliseum/images/secrets/secret_banner_${playerClass}.png`;
},
};
}
*preloadImages(history) {
const imageUrls = this.buildImageUrls(history);
// yield;
// // // console.log('preloading ' + imageUrls.length + ' images');
for (let i = 0; i < imageUrls.length; i++) {
const imageUrl = imageUrls[i];
// // // console.log('[image-preloader] preloading image', imageUrl);
const image = new Image();
image.onload = () =>
// // // console.log('[image-preloader] preloaded image', imageUrl);
(image.src = imageUrl);
// if (i % 15 === 0) {
// yield;
// }
}
return;
}
buildImageUrls(history) {
const cardIds = history
.filter(history => history.entityDefintion)
.map(history => history.entityDefintion)
.map(def => def.cardID)
.filter(cardId => cardId);
const cardArtUrls = cardIds.map(cardId => `https://static.zerotoheroes.com/hearthstone/cardart/256x/${cardId}.jpg`);
const staticImageUrls = Object.values(this.STATIC_IMAGES);
const classes = cardIds
.map(cardId => this.cards.getCard(cardId))
.filter(card => card && card.playerClass) // This could happen if the json cards are not in sync, like right after a patch
.map(card => card.playerClass)
.filter(playerClass => playerClass)
.map(playerClass => playerClass.toLowerCase());
const dynamicImageUrls = Object.values(this.CLASS_IMAGES)
.map(generator => classes.map(playerClass => generator(playerClass)))
.reduce((a, b) => a.concat(b), []);
const withDuplications = [...cardArtUrls, ...staticImageUrls, ...dynamicImageUrls];
return withDuplications.filter((item, index) => withDuplications.indexOf(item) === index);
}
}
ImagePreloaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: ImagePreloaderService, deps: [{ token: i1.AllCardsService }], target: i0.ɵɵFactoryTarget.Injectable });
ImagePreloaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: ImagePreloaderService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: ImagePreloaderService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.AllCardsService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJlbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBsYXktcGFyc2VyL3NyYy9saWIvc2VydmljZXMvaW1hZ2UtcHJlbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBUTNDLE1BQU0sT0FBTyxxQkFBcUI7SUFpSGpDLFlBQW9CLEtBQXNCO1FBQXRCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBaEgxQywrREFBK0Q7UUFDL0Msa0JBQWEsR0FBRztZQUMvQixjQUFjO1lBQ2QsaUJBQWlCLEVBQ2hCLHVHQUF1RztZQUN4RyxJQUFJLEVBQUUsc0VBQXNFO1lBQzVFLFNBQVMsRUFBRSw0RUFBNEU7WUFDdkYsVUFBVSxFQUFFLDZFQUE2RTtZQUN6RixhQUFhO1lBQ2IsVUFBVSxFQUFFLGtGQUFrRjtZQUM5RixrQkFBa0IsRUFDakIsaUdBQWlHO1lBQ2xHLGNBQWMsRUFBRSx1RkFBdUY7WUFDdkcsdUJBQXVCLEVBQ3RCLGlHQUFpRztZQUNsRyxxQkFBcUIsRUFDcEIsK0ZBQStGO1lBQ2hHLDhCQUE4QixFQUM3Qix5R0FBeUc7WUFDMUcsa0JBQWtCLEVBQ2pCLDRGQUE0RjtZQUM3Rix5QkFBeUIsRUFDeEIsb0dBQW9HO1lBQ3JHLGtCQUFrQixFQUNqQiw0RkFBNEY7WUFDN0YseUJBQXlCLEVBQ3hCLG9HQUFvRztZQUNyRyxTQUFTLEVBQUUsdUZBQXVGO1lBQ2xHLGdCQUFnQixFQUNmLCtGQUErRjtZQUNoRyxlQUFlLEVBQUUsOEZBQThGO1lBQy9HLGdCQUFnQixFQUNmLCtGQUErRjtZQUNoRyxnQkFBZ0IsRUFDZiwrRkFBK0Y7WUFDaEcsY0FBYyxFQUFFLHVGQUF1RjtZQUN2RyxnQkFBZ0IsRUFBRSx5RkFBeUY7WUFDM0csU0FBUyxFQUFFLGlGQUFpRjtZQUM1RixlQUFlLEVB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LENBQUMsV0FBVyxDQUFDLENBQUMsZ0ZBQWdGO2FBQ3pILEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFxQixDQUFDO2FBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQzthQUNsQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUN2RCxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDcEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzNGLENBQUM7O2tIQTdKVyxxQkFBcUI7c0hBQXJCLHFCQUFxQixjQUZyQixNQUFNOzJGQUVOLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2hpc3RvcnkvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgRW50aXR5RGVmaW5pdGlvbiB9IGZyb20gJy4uL21vZGVscy9wYXJzZXIvZW50aXR5LWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBBbGxDYXJkc1NlcnZpY2UgfSBmcm9tICcuL2FsbC1jYXJkcy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZVByZWxvYWRlclNlcnZpY2Uge1xyXG5cdC8vIERlY2xhcmUgaGVyZSBhbGwgdGhlIGltYWdlIHJlc291cmNlcyB3ZSB3aWxsIG5lZWQgaW4gdGhlIGFwcFxyXG5cdHB1YmxpYyByZWFkb25seSBTVEFUSUNfSU1BR0VTID0ge1xyXG5cdFx0Ly8gVXNlZCBpbiBDU1NcclxuXHRcdGVuY2hhbnRtZW50QmFubmVyOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZW5jaGFudG1lbnRzL2VuY2hhbnRtZW50LWJhbm5lci5wbmcnLFxyXG5cdFx0bWFuYTogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL21hbmEucG5nJyxcclxuXHRcdG1hbmFTcGVudDogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL21hbmFfc3BlbnQucG5nJyxcclxuXHRcdG1hbmFMb2NrZWQ6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L21hbmFzdG9ybS9tYW5hX2xvY2tlZC5wbmcnLFxyXG5cdFx0Ly8gVXNlZCBpbiBKU1xyXG5cdFx0cmFjZUJhbm5lcjogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL2NhcmQvcmFjZS1iYW5uZXIucG5nJyxcclxuXHRcdGZyYW1lTWluaW9uUHJlbWl1bTpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2NhcmQvZnJhbWUtbWluaW9uLXByZW1pdW0ucG5nJyxcclxuXHRcdGZyYW1lSGVyb1Bvd2VyOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvaGVyby9oZXJvX3Bvd2VyLnBuZycsXHJcblx0XHRmcmFtZUhlcm9Qb3dlckV4aGF1c3RlZDpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2hlcm8vaGVyb19wb3dlcl9leGhhdXN0ZWQucG5nJyxcclxuXHRcdGZyYW1lSGVyb1Bvd2VyUHJlbWl1bTpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2hlcm8vaGVyb19wb3dlcl9wcmVtaXVtLnBuZycsXHJcblx0XHRmcmFtZUhlcm9Qb3dlckV4aGF1c3RlZFByZW1pdW06XHJcblx0XHRcdCdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9oZXJvL2hlcm9fcG93ZXJfZXhoYXVzdGVkX3ByZW1pdW0ucG5nJyxcclxuXHRcdG9uQm9hcmRNaW5pb25GcmFtZTpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL29uYm9hcmRfbWluaW9uX2ZyYW1lLnBuZycsXHJcblx0XHRvbkJvYXJkTWluaW9uRnJhbWVQcmVtaXVtOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb25ib2FyZF9taW5pb25fZnJhbWVfcHJlbWl1bS5wbmcnLFxyXG5cdFx0b25Cb2FyZE1pbmlvblRhdW50OlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb25ib2FyZF9taW5pb25fdGF1bnQucG5nJyxcclxuXHRcdG9uQm9hcmRNaW5pb25UYXVudFByZW1pdW06XHJcblx0XHRcdCdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9vbmJvYXJkX21pbmlvbl90YXVudF9wcmVtaXVtLnBuZycsXHJcblx0XHRoZXJvRnJhbWU6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9oZXJvL2hlcm9fZnJhbWUucG5nJyxcclxuXHRcdGhlcm9GcmFtZVByZW1pdW06XHJcblx0XHRcdCdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9oZXJvL2hlcm9fZnJhbWVfcHJlbWl1bS5wbmcnLFxyXG5cdFx0bmFtZUJhbm5lclNwZWxsOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvY2FyZC9uYW1lLWJhbm5lci1zcGVsbC5wbmcnLFxyXG5cdFx0bmFtZUJhbm5lck1pbmlvbjpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2NhcmQvbmFtZS1iYW5uZXItbWluaW9uLnBuZycsXHJcblx0XHRuYW1lQmFubmVyV2VhcG9uOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvY2FyZC9uYW1lLWJhbm5lci13ZWFwb24ucG5nJyxcclxuXHRcdHdlYXBvblNoZWF0aGVkOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvd2VhcG9uX3NoZWF0aGVkLnBuZycsXHJcblx0XHR3ZWFwb25VbnNoZWF0aGVkOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvd2VhcG9uX3Vuc2hlYXRoZWQucG5nJyxcclxuXHRcdGV4aGF1c3RlZDogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2V4aGF1c3RlZC5wbmcnLFxyXG5cdFx0aWNvbkRlYXRocmF0dGxlOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZWZmZWN0cy9pY29uX2RlYXRocmF0dGxlLnBuZycsXHJcblx0XHRpY29uUG9pc29ub3VzOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZWZmZWN0cy9pY29uX3BvaXNvbm91cy5wbmcnLFxyXG5cdFx0aWNvbkxpZmVzdGVhbDogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2VmZmVjdHMvaWNvbl9saWZlc3RlYWwucG5nJyxcclxuXHRcdGljb25JbnNwaXJlOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZWZmZWN0cy9pY29uX2luc3BpcmUucG5nJyxcclxuXHRcdGljb25UcmlnZ2VyOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZWZmZWN0cy9pY29uX3RyaWdnZXIucG5nJyxcclxuXHRcdG92ZXJsYXlJbW11bmU6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9vdmVybGF5cy9taW5pb25faW1tdW5lLnBuZycsXHJcblx0XHRvdmVybGF5RGl2aW5lU2hpZWxkOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb3ZlcmxheXMvbWluaW9uX2RpdmluZV9zaGllbGQucG5nJyxcclxuXHRcdG92ZXJsYXlTaWxlbmNlZDpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL292ZXJsYXlzL21pbmlvbl9zaWxlbmNlZC5wbmcnLFxyXG5cdFx0b3ZlcmxheUZyb3plbjogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL292ZXJsYXlzL21pbmlvbl9mcm96ZW4ucG5nJyxcclxuXHRcdG92ZXJsYXlTdGVhbHRoOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb3ZlcmxheXMvbWluaW9uX3N0ZWFsdGgucG5nJyxcclxuXHRcdG92ZXJsYXlFbHVzaXZlOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb3ZlcmxheXMvbWluaW9uX2VsdXNpdmUucG5nJyxcclxuXHRcdG92ZXJsYXlXaW5kZnVyeTpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL292ZXJsYXlzL21pbmlvbl93aW5kZnVyeS5wbmcnLFxyXG5cdFx0b3ZlcmxheVRlbXBvcmFyeUVmZmVjdDpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL292ZXJsYXlzL21pbmlvbl90ZW1wb3JhcnlfZWZmZWN0LnBuZycsXHJcblx0XHRoZXJvT3ZlcmxheVN0ZWFsdGg6XHJcblx0XHRcdCdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9vdmVybGF5cy9oZXJvX3N0ZWFsdGgucG5nJyxcclxuXHRcdGhlcm9PdmVybGF5SW1tdW5lOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvb3ZlcmxheXMvaGVyb19pbW11bmUucG5nJyxcclxuXHRcdGhlcm9PdmVybGF5SGVhdmlseUFybW9yZWQ6XHJcblx0XHRcdCdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9vdmVybGF5cy9oZXJvX2hlYXZpbHlfYXJtb3JlZC5wbmcnLFxyXG5cdFx0aGVyb092ZXJsYXlGcm96ZW46ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9vdmVybGF5cy9oZXJvX2Zyb3plbi5wbmcnLFxyXG5cdFx0ZW5jaGFudG1lbnRSaW5nOlxyXG5cdFx0XHQnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvZW5jaGFudG1lbnRzL2VuY2hhbnRtZW50LXJpbmcucG5nJyxcclxuXHRcdHJhcml0eUNvbW1vbjogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL2NhcmQvcmFyaXR5LWNvbW1vbi5wbmcnLFxyXG5cdFx0cmFyaXR5UmFyZTogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL2NhcmQvcmFyaXR5LXJhcmUucG5nJyxcclxuXHRcdHJhcml0eUVwaWM6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L21hbmFzdG9ybS9jYXJkL3Jhcml0eS1lcGljLnBuZycsXHJcblx0XHRyYXJpdHlMZWdlbmRhcnk6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L21hbmFzdG9ybS9jYXJkL3Jhcml0eS1sZWdlbmRhcnkucG5nJyxcclxuXHRcdGF0dGFjazogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvbWFuYXN0b3JtL2F0dGFjay5wbmcnLFxyXG5cdFx0aGVhbHRoOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9tYW5hc3Rvcm0vaGVhbHRoX25ldy5wbmcnLFxyXG5cdFx0YXJtb3I6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9hcm1vci5wbmcnLFxyXG5cdFx0ZGFtYWdlOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvaWNvbl9kYW1hZ2UucG5nJyxcclxuXHRcdGhlYWw6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9pY29uX2hlYWwucG5nJyxcclxuXHRcdGJ1cm5lZDogJ2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL292ZXJsYXlzL2J1cm5lZC5wbmcnLFxyXG5cdFx0bXVsbGlnYW5EaXNjYXJkOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvbXVsbGlnYW5fZGlzY2FyZC5wbmcnLFxyXG5cdFx0Y2FyZGJhY2s6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9jYXJkYmFjay5wbmcnLFxyXG5cdFx0cXVlc3Q6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9zZWNyZXRzL3F1ZXN0X2J1dHRvbi5wbmcnLFxyXG5cdFx0cXVlc3RCYW5nOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvc2VjcmV0cy9xdWVzdF9iYW5nLnBuZycsXHJcblx0XHRxdWVzdEluZm86ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9zZWNyZXRzL3F1ZXN0X2luZm9fYXJyb3cucG5nJyxcclxuXHRcdHNlY3JldFF1ZXN0aW9uTWFyazpcclxuXHRcdFx0J2h0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL3NlY3JldHMvc2VjcmV0X3F1ZXN0aW9uX21hcmsucG5nJyxcclxuXHRcdGZhdGlndWU6ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9mYXRpZ3VlLnBuZycsXHJcblx0XHR2aWN0b3J5U2NyZWVuOiAnaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvdmljdG9yeV9zY3JlZW4ucG5nJyxcclxuXHRcdGxvc3NTY3JlZW46ICdodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9sb3NzX3NjcmVlbi5wbmcnLFxyXG5cdH07XHJcblx0cHVibGljIHJlYWRvbmx5IENMQVNTX0lNQUdFUyA9IHtcclxuXHRcdHNwZWxsRnJhbWU6IHBsYXllckNsYXNzID0+XHJcblx0XHRcdGBodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9jYXJkL2ZyYW1lLXNwZWxsLSR7cGxheWVyQ2xhc3N9LnBuZ2AsXHJcblx0XHRtaW5pb25GcmFtZTogcGxheWVyQ2xhc3MgPT5cclxuXHRcdFx0YGh0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2NhcmQvZnJhbWUtbWluaW9uLSR7cGxheWVyQ2xhc3N9LnBuZ2AsXHJcblx0XHR3ZWFwb25GcmFtZTogcGxheWVyQ2xhc3MgPT5cclxuXHRcdFx0YGh0dHBzOi8vc3RhdGljLnplcm90b2hlcm9lcy5jb20vaGVhcnRoc3RvbmUvYXNzZXQvY29saXNldW0vaW1hZ2VzL2NhcmQvZnJhbWUtd2VhcG9uLSR7cGxheWVyQ2xhc3N9LnBuZ2AsXHJcblx0XHRzZWNyZXRGcmFtZTogcGxheWVyQ2xhc3MgPT4ge1xyXG5cdFx0XHRpZiAoWyd3YXJsb2NrJywgJ2RydWlkJywgJ3ByaWVzdCcsICduZXV0cmFsJ10uaW5kZXhPZihwbGF5ZXJDbGFzcykgIT09IC0xKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGBodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9zZWNyZXRzL3NlY3JldF8ke3BsYXllckNsYXNzfS5wbmdgO1xyXG5cdFx0fSxcclxuXHRcdHNlY3JldFNwbGFzaDogcGxheWVyQ2xhc3MgPT4ge1xyXG5cdFx0XHRpZiAoWyd3YXJsb2NrJywgJ2RydWlkJywgJ3ByaWVzdCcsICduZXV0cmFsJ10uaW5kZXhPZihwbGF5ZXJDbGFzcykgIT09IC0xKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGBodHRwczovL3N0YXRpYy56ZXJvdG9oZXJvZXMuY29tL2hlYXJ0aHN0b25lL2Fzc2V0L2NvbGlzZXVtL2ltYWdlcy9zZWNyZXRzL3NlY3JldF9zcGxhc2hfJHtwbGF5ZXJDbGFzc30ucG5nYDtcclxuXHRcdH0sXHJcblx0XHRzZWNyZXRCYW5uZXI6IHBsYXllckNsYXNzID0+IHtcclxuXHRcdFx0aWYgKFsnd2FybG9jaycsICdkcnVpZCcsICdwcmllc3QnLCAnbmV1dHJhbCddLmluZGV4T2YocGxheWVyQ2xhc3MpICE9PSAtMSkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBgaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9hc3NldC9jb2xpc2V1bS9pbWFnZXMvc2VjcmV0cy9zZWNyZXRfYmFubmVyXyR7cGxheWVyQ2xhc3N9LnBuZ2A7XHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgY2FyZHM6IEFsbENhcmRzU2VydmljZSkge31cclxuXHJcblx0cHVibGljICpwcmVsb2FkSW1hZ2VzKGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10pIHtcclxuXHRcdGNvbnN0IGltYWdlVXJscyA9IHRoaXMuYnVpbGRJbWFnZVVybHMoaGlzdG9yeSk7XHJcblx0XHQvLyB5aWVsZDtcclxuXHRcdC8vIC8vIC8vIGNvbnNvbGUubG9nKCdwcmVsb2FkaW5nICcgKyBpbWFnZVVybHMubGVuZ3RoICsgJyBpbWFnZXMnKTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VVcmxzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGltYWdlVXJsID0gaW1hZ2VVcmxzW2ldO1xyXG5cdFx0XHQvLyAvLyAvLyBjb25zb2xlLmxvZygnW2ltYWdlLXByZWxvYWRlcl0gcHJlbG9hZGluZyBpbWFnZScsIGltYWdlVXJsKTtcclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHRcdFx0aW1hZ2Uub25sb2FkID0gKCkgPT5cclxuXHRcdFx0XHQvLyAvLyAvLyBjb25zb2xlLmxvZygnW2ltYWdlLXByZWxvYWRlcl0gcHJlbG9hZGVkIGltYWdlJywgaW1hZ2VVcmwpO1xyXG5cdFx0XHRcdChpbWFnZS5zcmMgPSBpbWFnZVVybCk7XHJcblx0XHRcdC8vIGlmIChpICUgMTUgPT09IDApIHtcclxuXHRcdFx0Ly8gXHR5aWVsZDtcclxuXHRcdFx0Ly8gfVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBidWlsZEltYWdlVXJscyhoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xyXG5cdFx0Y29uc3QgY2FyZElkcyA9IGhpc3RvcnlcclxuXHRcdFx0LmZpbHRlcihoaXN0b3J5ID0+IChoaXN0b3J5IGFzIGFueSkuZW50aXR5RGVmaW50aW9uKVxyXG5cdFx0XHQubWFwKGhpc3RvcnkgPT4gKGhpc3RvcnkgYXMgYW55KS5lbnRpdHlEZWZpbnRpb24gYXMgRW50aXR5RGVmaW5pdGlvbilcclxuXHRcdFx0Lm1hcChkZWYgPT4gZGVmLmNhcmRJRClcclxuXHRcdFx0LmZpbHRlcihjYXJkSWQgPT4gY2FyZElkKTtcclxuXHRcdGNvbnN0IGNhcmRBcnRVcmxzID0gY2FyZElkcy5tYXAoXHJcblx0XHRcdGNhcmRJZCA9PiBgaHR0cHM6Ly9zdGF0aWMuemVyb3RvaGVyb2VzLmNvbS9oZWFydGhzdG9uZS9jYXJkYXJ0LzI1NngvJHtjYXJkSWR9LmpwZ2AsXHJcblx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IHN0YXRpY0ltYWdlVXJscyA9IE9iamVjdC52YWx1ZXModGhpcy5TVEFUSUNfSU1BR0VTKTtcclxuXHJcblx0XHRjb25zdCBjbGFzc2VzID0gY2FyZElkc1xyXG5cdFx0XHQubWFwKGNhcmRJZCA9PiB0aGlzLmNhcmRzLmdldENhcmQoY2FyZElkKSlcclxuXHRcdFx0LmZpbHRlcihjYXJkID0+IGNhcmQgJiYgY2FyZC5wbGF5ZXJDbGFzcykgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlIGpzb24gY2FyZHMgYXJlIG5vdCBpbiBzeW5jLCBsaWtlIHJpZ2h0IGFmdGVyIGEgcGF0Y2hcclxuXHRcdFx0Lm1hcChjYXJkID0+IGNhcmQucGxheWVyQ2xhc3MgYXMgc3RyaW5nKVxyXG5cdFx0XHQuZmlsdGVyKHBsYXllckNsYXNzID0+IHBsYXllckNsYXNzKVxyXG5cdFx0XHQubWFwKHBsYXllckNsYXNzID0+IHBsYXllckNsYXNzLnRvTG93ZXJDYXNlKCkpO1xyXG5cdFx0Y29uc3QgZHluYW1pY0ltYWdlVXJscyA9IE9iamVjdC52YWx1ZXModGhpcy5DTEFTU19JTUFHRVMpXHJcblx0XHRcdC5tYXAoZ2VuZXJhdG9yID0+IGNsYXNzZXMubWFwKHBsYXllckNsYXNzID0+IGdlbmVyYXRvcihwbGF5ZXJDbGFzcykpKVxyXG5cdFx0XHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xyXG5cclxuXHRcdGNvbnN0IHdpdGhEdXBsaWNhdGlvbnMgPSBbLi4uY2FyZEFydFVybHMsIC4uLnN0YXRpY0ltYWdlVXJscywgLi4uZHluYW1pY0ltYWdlVXJsc107XHJcblx0XHRyZXR1cm4gd2l0aER1cGxpY2F0aW9ucy5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB3aXRoRHVwbGljYXRpb25zLmluZGV4T2YoaXRlbSkgPT09IGluZGV4KTtcclxuXHR9XHJcbn1cclxuIl19