valtech-components 4.0.610 → 4.0.612
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +83 -9
- package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +69 -0
- package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +247 -0
- package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +26 -397
- package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +132 -0
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +7 -1
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +348 -196
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +2 -1
- package/lib/components/organisms/mini-games/christianity-bot.d.ts +15 -0
- package/lib/components/organisms/mini-games/christianity-catalog.d.ts +18 -0
- package/lib/components/organisms/mini-games/christianity-game.component.d.ts +1 -9
- package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +38 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { STARTING_GAME } from './christianity-catalog';
|
|
2
|
+
export const TUTORIAL_CHARACTER_LIMIT = 12;
|
|
3
|
+
export const TUTORIAL_OFFERING_LIMIT = 6;
|
|
4
|
+
export const TUTORIAL_OPENING_HAND_SIZE = 5;
|
|
5
|
+
export const TUTORIAL_LEADER_CHOICE_COUNT = 2;
|
|
6
|
+
export const TUTORIAL_LEADER_CHOICE_SECONDS = 15;
|
|
7
|
+
export const TUTORIAL_SEED = 20260728;
|
|
8
|
+
export function isClassicGalleryCard(card) {
|
|
9
|
+
return (card.frontTemplate ?? 'genesis-classic') === 'genesis-classic';
|
|
10
|
+
}
|
|
11
|
+
export function cardSortKey(card, nameResolver = c => c.name) {
|
|
12
|
+
const collector = card.collectorNumber ?? card.id;
|
|
13
|
+
return `${card.edition ?? ''}-${collector.padStart(8, '0')}-${nameResolver(card)}`;
|
|
14
|
+
}
|
|
15
|
+
export function tutorialLeaderCards(cards, nameResolver = c => c.name) {
|
|
16
|
+
const leaders = cards
|
|
17
|
+
.filter(card => card.type === 'leader' && isClassicGalleryCard(card))
|
|
18
|
+
.sort((a, b) => cardSortKey(a, nameResolver).localeCompare(cardSortKey(b, nameResolver), 'es'));
|
|
19
|
+
if (leaders.length >= 2)
|
|
20
|
+
return leaders.slice(0, 4);
|
|
21
|
+
return cards.filter(card => card.type === 'leader').slice(0, 4);
|
|
22
|
+
}
|
|
23
|
+
export function findCardByName(cards, namePart, nameResolver = c => c.name) {
|
|
24
|
+
return cards.find(card => nameResolver(card).toLowerCase().includes(namePart.toLowerCase()));
|
|
25
|
+
}
|
|
26
|
+
export function shuffleCards(cards, seed) {
|
|
27
|
+
const result = [...cards];
|
|
28
|
+
let state = seed >>> 0;
|
|
29
|
+
for (let i = result.length - 1; i > 0; i--) {
|
|
30
|
+
state = (state * 1664525 + 1013904223) >>> 0;
|
|
31
|
+
const j = state % (i + 1);
|
|
32
|
+
[result[i], result[j]] = [result[j], result[i]];
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
function ensureOpeningOffering(cards, start, size) {
|
|
37
|
+
const hand = cards.slice(start, start + size);
|
|
38
|
+
if (hand.some(card => card.type === 'offering'))
|
|
39
|
+
return;
|
|
40
|
+
const offeringIndex = cards.findIndex((card, i) => i >= start + size && card.type === 'offering');
|
|
41
|
+
if (offeringIndex < 0)
|
|
42
|
+
return;
|
|
43
|
+
[cards[start], cards[offeringIndex]] = [cards[offeringIndex], cards[start]];
|
|
44
|
+
}
|
|
45
|
+
export function prepareTutorialOpeningDeck(cards) {
|
|
46
|
+
const result = [...cards];
|
|
47
|
+
ensureOpeningOffering(result, 0, TUTORIAL_OPENING_HAND_SIZE);
|
|
48
|
+
ensureOpeningOffering(result, TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
export function createTutorialPlayer(seat, leader, hand, battleZone, nameResolver = c => c.name) {
|
|
52
|
+
const base = STARTING_GAME.players[seat];
|
|
53
|
+
const leaderLife = leader?.leaderLife ?? leader?.life ?? base.leaderMaxHp;
|
|
54
|
+
return {
|
|
55
|
+
...structuredClone(base),
|
|
56
|
+
leaderCardId: leader?.id,
|
|
57
|
+
leaderName: leader ? nameResolver(leader) : base.leaderName,
|
|
58
|
+
leaderHp: leaderLife,
|
|
59
|
+
leaderMaxHp: leaderLife,
|
|
60
|
+
offerings: [],
|
|
61
|
+
offeringPlayedThisTurn: false,
|
|
62
|
+
hand,
|
|
63
|
+
handCount: hand ? undefined : 4,
|
|
64
|
+
battleZone,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function createTutorialGame(cards, options = {}, context = {}) {
|
|
68
|
+
const nameResolver = context.nameResolver ?? (c => c.name);
|
|
69
|
+
const cardById = context.cardById;
|
|
70
|
+
const leaders = tutorialLeaderCards(cards, nameResolver);
|
|
71
|
+
const playerLeader = (cardById && options.playerLeaderId ? cardById(options.playerLeaderId) : undefined) ??
|
|
72
|
+
findCardByName(leaders, 'Adán', nameResolver) ??
|
|
73
|
+
findCardByName(leaders, 'Adan', nameResolver) ??
|
|
74
|
+
leaders[0];
|
|
75
|
+
const opponentLeader = (cardById && options.opponentLeaderId ? cardById(options.opponentLeaderId) : undefined) ??
|
|
76
|
+
findCardByName(leaders, 'Noé', nameResolver) ??
|
|
77
|
+
findCardByName(leaders, 'Noe', nameResolver) ??
|
|
78
|
+
leaders.find(c => c.id !== playerLeader?.id) ??
|
|
79
|
+
leaders[0];
|
|
80
|
+
const offerings = cards
|
|
81
|
+
.filter(c => c.type === 'offering' && isClassicGalleryCard(c))
|
|
82
|
+
.slice(0, TUTORIAL_OFFERING_LIMIT);
|
|
83
|
+
const places = cards.filter(c => c.type === 'place');
|
|
84
|
+
const characters = cards
|
|
85
|
+
.filter(c => c.type === 'character' &&
|
|
86
|
+
isClassicGalleryCard(c) &&
|
|
87
|
+
(c.cost ?? 0) <= 4 &&
|
|
88
|
+
(c.attack ?? 0) >= 0 &&
|
|
89
|
+
(c.life ?? 0) > 0)
|
|
90
|
+
.slice(0, TUTORIAL_CHARACTER_LIMIT);
|
|
91
|
+
const tutorialDeck = [...offerings, ...characters, ...offerings, ...characters.slice(0, 6)].slice(0, 28);
|
|
92
|
+
const shuffledDeck = prepareTutorialOpeningDeck(shuffleCards(tutorialDeck, options.seed ?? TUTORIAL_SEED));
|
|
93
|
+
const playerHand = shuffledDeck.slice(0, TUTORIAL_OPENING_HAND_SIZE).map(c => c.id);
|
|
94
|
+
const opponentHand = shuffledDeck
|
|
95
|
+
.slice(TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE * 2)
|
|
96
|
+
.map(c => c.id);
|
|
97
|
+
const sharedDeck = shuffledDeck.slice(TUTORIAL_OPENING_HAND_SIZE * 2).map(c => c.id);
|
|
98
|
+
const firstPlayer = options.firstPlayer ?? 'P1';
|
|
99
|
+
const firstPlayerName = firstPlayer === 'P1'
|
|
100
|
+
? STARTING_GAME.players.P1.displayName
|
|
101
|
+
: STARTING_GAME.players.P2.displayName;
|
|
102
|
+
const messages = context.messages;
|
|
103
|
+
const log = messages
|
|
104
|
+
? [`${messages.turnOf} ${firstPlayerName}.`, messages.tutorialLoaded]
|
|
105
|
+
: [`Turno de ${firstPlayerName}.`, 'Tutorial cargado.'];
|
|
106
|
+
return {
|
|
107
|
+
...structuredClone(STARTING_GAME),
|
|
108
|
+
status: 'in_progress',
|
|
109
|
+
turnOwner: firstPlayer,
|
|
110
|
+
turnCount: 1,
|
|
111
|
+
matchScore: { P1: 0, P2: 0 },
|
|
112
|
+
sharedDeck,
|
|
113
|
+
placeZone: places[0] ? [places[0].id] : [],
|
|
114
|
+
historyZone: [],
|
|
115
|
+
players: {
|
|
116
|
+
P1: createTutorialPlayer('P1', playerLeader, playerHand, [], nameResolver),
|
|
117
|
+
P2: createTutorialPlayer('P2', opponentLeader, opponentHand, [], nameResolver),
|
|
118
|
+
},
|
|
119
|
+
log,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function createTutorialSetup(leaders) {
|
|
123
|
+
const coinWinner = TUTORIAL_SEED % 2 === 0 ? 'P1' : 'P2';
|
|
124
|
+
const firstPlayer = coinWinner === 'P1' ? 'P2' : 'P1';
|
|
125
|
+
return {
|
|
126
|
+
coinWinner,
|
|
127
|
+
leaderPicker: coinWinner,
|
|
128
|
+
firstPlayer,
|
|
129
|
+
availableLeaders: leaders.slice(0, TUTORIAL_LEADER_CHOICE_COUNT).map(c => c.id),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LXR1dG9yaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS10dXRvcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUF1QnZELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBZ0M7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksaUJBQWlCLENBQUMsS0FBSyxpQkFBaUIsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBZ0MsRUFDaEMsZUFBNkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtJQUV4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1D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RUFBRTtRQUNmLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDO1lBQzFFLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDO1NBQy9FO1FBQ0QsR0FBRztLQUNKLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxPQUFxQztJQUVyQyxNQUFNLFVBQVUsR0FBcUIsYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNFLE1BQU0sV0FBVyxHQUFxQixVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RSxPQUFPO1FBQ0wsVUFBVTtRQUNWLFlBQVksRUFBRSxVQUFVO1FBQ3hCLFdBQVc7UUFDWCxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDaEYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUsXG4gIENocmlzdGlhbml0eVNlYXQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU1RBUlRJTkdfR0FNRSB9IGZyb20gJy4vY2hyaXN0aWFuaXR5LWNhdGFsb2cnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eVR1dG9yaWFsU2V0dXAge1xuICBjb2luV2lubmVyOiBDaHJpc3RpYW5pdHlTZWF0O1xuICBsZWFkZXJQaWNrZXI6IENocmlzdGlhbml0eVNlYXQ7XG4gIGZpcnN0UGxheWVyOiBDaHJpc3RpYW5pdHlTZWF0O1xuICBhdmFpbGFibGVMZWFkZXJzOiBzdHJpbmdbXTtcbiAgcGxheWVyTGVhZGVySWQ/OiBzdHJpbmc7XG4gIG9wcG9uZW50TGVhZGVySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHV0b3JpYWxHYW1lTWVzc2FnZXMge1xuICB0dXJuT2Y6IHN0cmluZztcbiAgdHV0b3JpYWxMb2FkZWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXRvcmlhbEdhbWVPcHRpb25zIHtcbiAgcGxheWVyTGVhZGVySWQ/OiBzdHJpbmc7XG4gIG9wcG9uZW50TGVhZGVySWQ/OiBzdHJpbmc7XG4gIGZpcnN0UGxheWVyPzogQ2hyaXN0aWFuaXR5U2VhdDtcbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFRVVE9SSUFMX0NIQVJBQ1RFUl9MSU1JVCA9IDEyO1xuZXhwb3J0IGNvbnN0IFRVVE9SSUFMX09GRkVSSU5HX0xJTUlUID0gNjtcbmV4cG9ydCBjb25zdCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSA9IDU7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfTEVBREVSX0NIT0lDRV9DT1VOVCA9IDI7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfTEVBREVSX0NIT0lDRV9TRUNPTkRTID0gMTU7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfU0VFRCA9IDIwMjYwNzI4O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc2ljR2FsbGVyeUNhcmQoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChjYXJkLmZyb250VGVtcGxhdGUgPz8gJ2dlbmVzaXMtY2xhc3NpYycpID09PSAnZ2VuZXNpcy1jbGFzc2ljJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcmRTb3J0S2V5KFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lXG4pOiBzdHJpbmcge1xuICBjb25zdCBjb2xsZWN0b3IgPSBjYXJkLmNvbGxlY3Rvck51bWJlciA/PyBjYXJkLmlkO1xuICByZXR1cm4gYCR7Y2FyZC5lZGl0aW9uID8/ICcnfS0ke2NvbGxlY3Rvci5wYWRTdGFydCg4LCAnMCcpfS0ke25hbWVSZXNvbHZlcihjYXJkKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHV0b3JpYWxMZWFkZXJDYXJkcyhcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10sXG4gIG5hbWVSZXNvbHZlcjogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmcgPSBjID0+IGMubmFtZVxuKTogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSB7XG4gIGNvbnN0IGxlYWRlcnMgPSBjYXJkc1xuICAgIC5maWx0ZXIoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdsZWFkZXInICYmIGlzQ2xhc3NpY0dhbGxlcnlDYXJkKGNhcmQpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBjYXJkU29ydEtleShhLCBuYW1lUmVzb2x2ZXIpLmxvY2FsZUNvbXBhcmUoY2FyZFNvcnRLZXkoYiwgbmFtZVJlc29sdmVyKSwgJ2VzJykpO1xuICBpZiAobGVhZGVycy5sZW5ndGggPj0gMikgcmV0dXJuIGxlYWRlcnMuc2xpY2UoMCwgNCk7XG4gIHJldHVybiBjYXJkcy5maWx0ZXIoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdsZWFkZXInKS5zbGljZSgwLCA0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDYXJkQnlOYW1lKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgbmFtZVBhcnQ6IHN0cmluZyxcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lXG4pOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYXJkcy5maW5kKGNhcmQgPT4gbmFtZVJlc29sdmVyKGNhcmQpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobmFtZVBhcnQudG9Mb3dlckNhc2UoKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZUNhcmRzKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgc2VlZDogbnVtYmVyXG4pOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgcmVzdWx0ID0gWy4uLmNhcmRzXTtcbiAgbGV0IHN0YXRlID0gc2VlZCA+Pj4gMDtcbiAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgc3RhdGUgPSAoc3RhdGUgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgPj4+IDA7XG4gICAgY29uc3QgaiA9IHN0YXRlICUgKGkgKyAxKTtcbiAgICBbcmVzdWx0W2ldLCByZXN1bHRbal1dID0gW3Jlc3VsdFtqXSwgcmVzdWx0W2ldXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVPcGVuaW5nT2ZmZXJpbmcoXG4gIGNhcmRzOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdLFxuICBzdGFydDogbnVtYmVyLFxuICBzaXplOiBudW1iZXJcbik6IHZvaWQge1xuICBjb25zdCBoYW5kID0gY2FyZHMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7XG4gIGlmIChoYW5kLnNvbWUoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdvZmZlcmluZycpKSByZXR1cm47XG4gIGNvbnN0IG9mZmVyaW5nSW5kZXggPSBjYXJkcy5maW5kSW5kZXgoKGNhcmQsIGkpID0+IGkgPj0gc3RhcnQgKyBzaXplICYmIGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyk7XG4gIGlmIChvZmZlcmluZ0luZGV4IDwgMCkgcmV0dXJuO1xuICBbY2FyZHNbc3RhcnRdLCBjYXJkc1tvZmZlcmluZ0luZGV4XV0gPSBbY2FyZHNbb2ZmZXJpbmdJbmRleF0sIGNhcmRzW3N0YXJ0XV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVHV0b3JpYWxPcGVuaW5nRGVjayhcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW11cbik6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10ge1xuICBjb25zdCByZXN1bHQgPSBbLi4uY2FyZHNdO1xuICBlbnN1cmVPcGVuaW5nT2ZmZXJpbmcocmVzdWx0LCAwLCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSk7XG4gIGVuc3VyZU9wZW5pbmdPZmZlcmluZyhyZXN1bHQsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFLCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUdXRvcmlhbFBsYXllcihcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgbGVhZGVyOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCxcbiAgaGFuZDogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGJhdHRsZVpvbmU6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlW10sXG4gIG5hbWVSZXNvbHZlcjogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmcgPSBjID0+IGMubmFtZVxuKTogQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUge1xuICBjb25zdCBiYXNlID0gU1RBUlRJTkdfR0FNRS5wbGF5ZXJzW3NlYXRdO1xuICBjb25zdCBsZWFkZXJMaWZlID0gbGVhZGVyPy5sZWFkZXJMaWZlID8/IGxlYWRlcj8ubGlmZSA/PyBiYXNlLmxlYWRlck1heEhwO1xuICByZXR1cm4ge1xuICAgIC4uLnN0cnVjdHVyZWRDbG9uZShiYXNlKSxcbiAgICBsZWFkZXJDYXJkSWQ6IGxlYWRlcj8uaWQsXG4gICAgbGVhZGVyTmFtZTogbGVhZGVyID8gbmFtZVJlc29sdmVyKGxlYWRlcikgOiBiYXNlLmxlYWRlck5hbWUsXG4gICAgbGVhZGVySHA6IGxlYWRlckxpZmUsXG4gICAgbGVhZGVyTWF4SHA6IGxlYWRlckxpZmUsXG4gICAgb2ZmZXJpbmdzOiBbXSxcbiAgICBvZmZlcmluZ1BsYXllZFRoaXNUdXJuOiBmYWxzZSxcbiAgICBoYW5kLFxuICAgIGhhbmRDb3VudDogaGFuZCA/IHVuZGVmaW5lZCA6IDQsXG4gICAgYmF0dGxlWm9uZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1dG9yaWFsR2FtZShcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFR1dG9yaWFsR2FtZU9wdGlvbnMgPSB7fSxcbiAgY29udGV4dDoge1xuICAgIG1lc3NhZ2VzPzogVHV0b3JpYWxHYW1lTWVzc2FnZXM7XG4gICAgbmFtZVJlc29sdmVyPzogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmc7XG4gICAgY2FyZEJ5SWQ/OiAoaWQ6IHN0cmluZykgPT4gQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24gfCB1bmRlZmluZWQ7XG4gIH0gPSB7fVxuKTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlIHtcbiAgY29uc3QgbmFtZVJlc29sdmVyID0gY29udGV4dC5uYW1lUmVzb2x2ZXIgPz8gKGMgPT4gYy5uYW1lKTtcbiAgY29uc3QgY2FyZEJ5SWQgPSBjb250ZXh0LmNhcmRCeUlkO1xuICBjb25zdCBsZWFkZXJzID0gdHV0b3JpYWxMZWFkZXJDYXJkcyhjYXJkcywgbmFtZVJlc29sdmVyKTtcblxuICBjb25zdCBwbGF5ZXJMZWFkZXIgPVxuICAgIChjYXJkQnlJZCAmJiBvcHRpb25zLnBsYXllckxlYWRlcklkID8gY2FyZEJ5SWQob3B0aW9ucy5wbGF5ZXJMZWFkZXJJZCkgOiB1bmRlZmluZWQpID8/XG4gICAgZmluZENhcmRCeU5hbWUobGVhZGVycywgJ0Fkw6FuJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdBZGFuJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGxlYWRlcnNbMF07XG5cbiAgY29uc3Qgb3Bwb25lbnRMZWFkZXIgPVxuICAgIChjYXJkQnlJZCAmJiBvcHRpb25zLm9wcG9uZW50TGVhZGVySWQgPyBjYXJkQnlJZChvcHRpb25zLm9wcG9uZW50TGVhZGVySWQpIDogdW5kZWZpbmVkKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdOb8OpJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdOb2UnLCBuYW1lUmVzb2x2ZXIpID8/XG4gICAgbGVhZGVycy5maW5kKGMgPT4gYy5pZCAhPT0gcGxheWVyTGVhZGVyPy5pZCkgPz9cbiAgICBsZWFkZXJzWzBdO1xuXG4gIGNvbnN0IG9mZmVyaW5ncyA9IGNhcmRzXG4gICAgLmZpbHRlcihjID0+IGMudHlwZSA9PT0gJ29mZmVyaW5nJyAmJiBpc0NsYXNzaWNHYWxsZXJ5Q2FyZChjKSlcbiAgICAuc2xpY2UoMCwgVFVUT1JJQUxfT0ZGRVJJTkdfTElNSVQpO1xuXG4gIGNvbnN0IHBsYWNlcyA9IGNhcmRzLmZpbHRlcihjID0+IGMudHlwZSA9PT0gJ3BsYWNlJyk7XG5cbiAgY29uc3QgY2hhcmFjdGVycyA9IGNhcmRzXG4gICAgLmZpbHRlcihcbiAgICAgIGMgPT5cbiAgICAgICAgYy50eXBlID09PSAnY2hhcmFjdGVyJyAmJlxuICAgICAgICBpc0NsYXNzaWNHYWxsZXJ5Q2FyZChjKSAmJlxuICAgICAgICAoYy5jb3N0ID8/IDApIDw9IDQgJiZcbiAgICAgICAgKGMuYXR0YWNrID8/IDApID49IDAgJiZcbiAgICAgICAgKGMubGlmZSA/PyAwKSA+IDBcbiAgICApXG4gICAgLnNsaWNlKDAsIFRVVE9SSUFMX0NIQVJBQ1RFUl9MSU1JVCk7XG5cbiAgY29uc3QgdHV0b3JpYWxEZWNrID0gWy4uLm9mZmVyaW5ncywgLi4uY2hhcmFjdGVycywgLi4ub2ZmZXJpbmdzLCAuLi5jaGFyYWN0ZXJzLnNsaWNlKDAsIDYpXS5zbGljZShcbiAgICAwLFxuICAgIDI4XG4gICk7XG4gIGNvbnN0IHNodWZmbGVkRGVjayA9IHByZXBhcmVUdXRvcmlhbE9wZW5pbmdEZWNrKFxuICAgIHNodWZmbGVDYXJkcyh0dXRvcmlhbERlY2ssIG9wdGlvbnMuc2VlZCA/PyBUVVRPUklBTF9TRUVEKVxuICApO1xuXG4gIGNvbnN0IHBsYXllckhhbmQgPSBzaHVmZmxlZERlY2suc2xpY2UoMCwgVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUpLm1hcChjID0+IGMuaWQpO1xuICBjb25zdCBvcHBvbmVudEhhbmQgPSBzaHVmZmxlZERlY2tcbiAgICAuc2xpY2UoVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFICogMilcbiAgICAubWFwKGMgPT4gYy5pZCk7XG4gIGNvbnN0IHNoYXJlZERlY2sgPSBzaHVmZmxlZERlY2suc2xpY2UoVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUgKiAyKS5tYXAoYyA9PiBjLmlkKTtcblxuICBjb25zdCBmaXJzdFBsYXllciA9IG9wdGlvbnMuZmlyc3RQbGF5ZXIgPz8gJ1AxJztcbiAgY29uc3QgZmlyc3RQbGF5ZXJOYW1lID1cbiAgICBmaXJzdFBsYXllciA9PT0gJ1AxJ1xuICAgICAgPyBTVEFSVElOR19HQU1FLnBsYXllcnMuUDEuZGlzcGxheU5hbWVcbiAgICAgIDogU1RBUlRJTkdfR0FNRS5wbGF5ZXJzLlAyLmRpc3BsYXlOYW1lO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gY29udGV4dC5tZXNzYWdlcztcbiAgY29uc3QgbG9nID0gbWVzc2FnZXNcbiAgICA/IFtgJHttZXNzYWdlcy50dXJuT2Z9ICR7Zmlyc3RQbGF5ZXJOYW1lfS5gLCBtZXNzYWdlcy50dXRvcmlhbExvYWRlZF1cbiAgICA6IFtgVHVybm8gZGUgJHtmaXJzdFBsYXllck5hbWV9LmAsICdUdXRvcmlhbCBjYXJnYWRvLiddO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RydWN0dXJlZENsb25lKFNUQVJUSU5HX0dBTUUpLFxuICAgIHN0YXR1czogJ2luX3Byb2dyZXNzJyxcbiAgICB0dXJuT3duZXI6IGZpcnN0UGxheWVyLFxuICAgIHR1cm5Db3VudDogMSxcbiAgICBtYXRjaFNjb3JlOiB7IFAxOiAwLCBQMjogMCB9LFxuICAgIHNoYXJlZERlY2ssXG4gICAgcGxhY2Vab25lOiBwbGFjZXNbMF0gPyBbcGxhY2VzWzBdLmlkXSA6IFtdLFxuICAgIGhpc3Rvcnlab25lOiBbXSxcbiAgICBwbGF5ZXJzOiB7XG4gICAgICBQMTogY3JlYXRlVHV0b3JpYWxQbGF5ZXIoJ1AxJywgcGxheWVyTGVhZGVyLCBwbGF5ZXJIYW5kLCBbXSwgbmFtZVJlc29sdmVyKSxcbiAgICAgIFAyOiBjcmVhdGVUdXRvcmlhbFBsYXllcignUDInLCBvcHBvbmVudExlYWRlciwgb3Bwb25lbnRIYW5kLCBbXSwgbmFtZVJlc29sdmVyKSxcbiAgICB9LFxuICAgIGxvZyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1dG9yaWFsU2V0dXAoXG4gIGxlYWRlcnM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW11cbik6IENocmlzdGlhbml0eVR1dG9yaWFsU2V0dXAge1xuICBjb25zdCBjb2luV2lubmVyOiBDaHJpc3RpYW5pdHlTZWF0ID0gVFVUT1JJQUxfU0VFRCAlIDIgPT09IDAgPyAnUDEnIDogJ1AyJztcbiAgY29uc3QgZmlyc3RQbGF5ZXI6IENocmlzdGlhbml0eVNlYXQgPSBjb2luV2lubmVyID09PSAnUDEnID8gJ1AyJyA6ICdQMSc7XG4gIHJldHVybiB7XG4gICAgY29pbldpbm5lcixcbiAgICBsZWFkZXJQaWNrZXI6IGNvaW5XaW5uZXIsXG4gICAgZmlyc3RQbGF5ZXIsXG4gICAgYXZhaWxhYmxlTGVhZGVyczogbGVhZGVycy5zbGljZSgwLCBUVVRPUklBTF9MRUFERVJfQ0hPSUNFX0NPVU5UKS5tYXAoYyA9PiBjLmlkKSxcbiAgfTtcbn1cbiJdfQ==
|