@jubbio/core 1.1.20 → 1.3.2
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/dist/Client.js +13 -14
- package/dist/cjs/Client.d.ts +157 -0
- package/dist/cjs/Client.js +640 -0
- package/dist/cjs/builders/ActionRowBuilder.d.ts +53 -0
- package/dist/cjs/builders/ActionRowBuilder.js +68 -0
- package/dist/cjs/builders/ButtonBuilder.d.ts +77 -0
- package/dist/cjs/builders/ButtonBuilder.js +96 -0
- package/dist/cjs/builders/EmbedBuilder.d.ts +157 -0
- package/dist/cjs/builders/EmbedBuilder.js +208 -0
- package/dist/cjs/builders/ModalBuilder.d.ts +122 -0
- package/dist/cjs/builders/ModalBuilder.js +162 -0
- package/dist/cjs/builders/SelectMenuBuilder.d.ts +123 -0
- package/dist/cjs/builders/SelectMenuBuilder.js +165 -0
- package/dist/cjs/builders/SlashCommandBuilder.d.ts +197 -0
- package/dist/cjs/builders/SlashCommandBuilder.js +324 -0
- package/dist/cjs/builders/index.d.ts +9 -0
- package/dist/cjs/builders/index.js +26 -0
- package/dist/cjs/enums.d.ts +191 -0
- package/dist/cjs/enums.js +211 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.js +130 -0
- package/dist/cjs/managers/BaseManager.d.ts +69 -0
- package/dist/cjs/managers/BaseManager.js +106 -0
- package/dist/cjs/managers/ChannelManager.d.ts +95 -0
- package/dist/cjs/managers/ChannelManager.js +205 -0
- package/dist/cjs/managers/GuildMemberManager.d.ts +74 -0
- package/dist/cjs/managers/GuildMemberManager.js +157 -0
- package/dist/cjs/managers/RoleManager.d.ts +84 -0
- package/dist/cjs/managers/RoleManager.js +207 -0
- package/dist/cjs/managers/index.d.ts +7 -0
- package/dist/cjs/managers/index.js +24 -0
- package/dist/cjs/rest/REST.d.ts +527 -0
- package/dist/cjs/rest/REST.js +904 -0
- package/dist/cjs/rest/index.d.ts +1 -0
- package/dist/cjs/rest/index.js +18 -0
- package/dist/cjs/sharding/ShardingManager.d.ts +179 -0
- package/dist/cjs/sharding/ShardingManager.js +375 -0
- package/dist/cjs/sharding/index.d.ts +4 -0
- package/dist/cjs/sharding/index.js +21 -0
- package/dist/cjs/structures/Channel.d.ts +122 -0
- package/dist/cjs/structures/Channel.js +240 -0
- package/dist/cjs/structures/Collection.d.ts +53 -0
- package/dist/cjs/structures/Collection.js +115 -0
- package/dist/cjs/structures/Guild.d.ts +59 -0
- package/dist/cjs/structures/Guild.js +94 -0
- package/dist/cjs/structures/GuildMember.d.ts +174 -0
- package/dist/cjs/structures/GuildMember.js +311 -0
- package/dist/cjs/structures/Interaction.d.ts +245 -0
- package/dist/cjs/structures/Interaction.js +450 -0
- package/dist/cjs/structures/Message.d.ts +98 -0
- package/dist/cjs/structures/Message.js +195 -0
- package/dist/cjs/structures/User.d.ts +37 -0
- package/dist/cjs/structures/User.js +65 -0
- package/dist/cjs/structures/index.d.ts +7 -0
- package/dist/cjs/structures/index.js +25 -0
- package/dist/cjs/structures.d.ts +1 -0
- package/dist/cjs/structures.js +19 -0
- package/dist/cjs/types.d.ts +255 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/utils/BitField.d.ts +66 -0
- package/dist/cjs/utils/BitField.js +138 -0
- package/dist/cjs/utils/Collection.d.ts +116 -0
- package/dist/cjs/utils/Collection.js +265 -0
- package/dist/cjs/utils/Collector.d.ts +152 -0
- package/dist/cjs/utils/Collector.js +314 -0
- package/dist/cjs/utils/DataResolver.d.ts +61 -0
- package/dist/cjs/utils/DataResolver.js +146 -0
- package/dist/cjs/utils/Formatters.d.ts +145 -0
- package/dist/cjs/utils/Formatters.js +213 -0
- package/dist/cjs/utils/IntentsBitField.d.ts +85 -0
- package/dist/cjs/utils/IntentsBitField.js +99 -0
- package/dist/cjs/utils/Partials.d.ts +104 -0
- package/dist/cjs/utils/Partials.js +148 -0
- package/dist/cjs/utils/PermissionsBitField.d.ts +118 -0
- package/dist/cjs/utils/PermissionsBitField.js +145 -0
- package/dist/cjs/utils/SnowflakeUtil.d.ts +63 -0
- package/dist/cjs/utils/SnowflakeUtil.js +93 -0
- package/dist/cjs/utils/Sweepers.d.ts +119 -0
- package/dist/cjs/utils/Sweepers.js +249 -0
- package/dist/cjs/utils/index.d.ts +13 -0
- package/dist/cjs/utils/index.js +30 -0
- package/dist/esm/Client.js +634 -0
- package/dist/esm/builders/ActionRowBuilder.js +64 -0
- package/dist/esm/builders/ButtonBuilder.js +92 -0
- package/dist/esm/builders/EmbedBuilder.js +204 -0
- package/dist/esm/builders/ModalBuilder.js +157 -0
- package/dist/esm/builders/SelectMenuBuilder.js +161 -0
- package/dist/esm/builders/SlashCommandBuilder.js +311 -0
- package/dist/esm/builders/index.js +10 -0
- package/dist/esm/enums.js +208 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/managers/BaseManager.js +100 -0
- package/dist/esm/managers/ChannelManager.js +200 -0
- package/dist/esm/managers/GuildMemberManager.js +153 -0
- package/dist/esm/managers/RoleManager.js +203 -0
- package/dist/esm/managers/index.js +8 -0
- package/dist/esm/rest/REST.js +900 -0
- package/dist/esm/rest/index.js +2 -0
- package/dist/esm/sharding/ShardingManager.js +366 -0
- package/dist/esm/sharding/index.js +5 -0
- package/dist/esm/structures/Channel.js +232 -0
- package/dist/esm/structures/Collection.js +111 -0
- package/dist/esm/structures/Guild.js +90 -0
- package/dist/esm/structures/GuildMember.js +306 -0
- package/dist/esm/structures/Interaction.js +438 -0
- package/dist/esm/structures/Message.js +191 -0
- package/dist/esm/structures/User.js +61 -0
- package/dist/esm/structures/index.js +9 -0
- package/dist/esm/structures.js +3 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/utils/BitField.js +134 -0
- package/dist/esm/utils/Collection.js +261 -0
- package/dist/esm/utils/Collector.js +305 -0
- package/dist/esm/utils/DataResolver.js +142 -0
- package/dist/esm/utils/Formatters.js +191 -0
- package/dist/esm/utils/IntentsBitField.js +93 -0
- package/dist/esm/utils/Partials.js +137 -0
- package/dist/esm/utils/PermissionsBitField.js +141 -0
- package/dist/esm/utils/SnowflakeUtil.js +89 -0
- package/dist/esm/utils/Sweepers.js +245 -0
- package/dist/esm/utils/index.js +14 -0
- package/dist/rest/REST.js +8 -1
- package/dist/structures/Interaction.js +3 -5
- package/dist/structures/Message.js +56 -2
- package/package.json +14 -4
|
@@ -0,0 +1,900 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REST API client for Jubbio
|
|
3
|
+
*/
|
|
4
|
+
export class REST {
|
|
5
|
+
baseUrl;
|
|
6
|
+
token = '';
|
|
7
|
+
// User cache for mention resolution (ID -> username)
|
|
8
|
+
userCache = new Map();
|
|
9
|
+
USER_CACHE_TTL = 5 * 60 * 1000; // 5 dakika
|
|
10
|
+
constructor(baseUrl = 'https://gateway.jubbio.com/api/v1') {
|
|
11
|
+
this.baseUrl = baseUrl;
|
|
12
|
+
}
|
|
13
|
+
// ==================== Mention Helpers ====================
|
|
14
|
+
/**
|
|
15
|
+
* Cache a user for mention resolution
|
|
16
|
+
* Bot'lar interaction'dan gelen user bilgisini cache'leyebilir
|
|
17
|
+
*/
|
|
18
|
+
cacheUser(user) {
|
|
19
|
+
const userId = typeof user.id === 'string' ? parseInt(user.id, 10) : user.id;
|
|
20
|
+
this.userCache.set(userId, {
|
|
21
|
+
id: userId,
|
|
22
|
+
username: user.username,
|
|
23
|
+
displayName: user.displayName || user.display_name,
|
|
24
|
+
cachedAt: Date.now()
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Cache multiple users
|
|
29
|
+
*/
|
|
30
|
+
cacheUsers(users) {
|
|
31
|
+
users.forEach(user => this.cacheUser(user));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get cached user by ID
|
|
35
|
+
*/
|
|
36
|
+
getCachedUser(userId) {
|
|
37
|
+
const cached = this.userCache.get(userId);
|
|
38
|
+
if (cached && Date.now() - cached.cachedAt < this.USER_CACHE_TTL) {
|
|
39
|
+
return cached;
|
|
40
|
+
}
|
|
41
|
+
// Expired, remove from cache
|
|
42
|
+
if (cached) {
|
|
43
|
+
this.userCache.delete(userId);
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Format a user mention
|
|
49
|
+
* Returns both the text format and mentions data
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* const mention = rest.formatMention(user);
|
|
53
|
+
* // mention.text = "<@1>"
|
|
54
|
+
* // mention.data = { users: [{ id: 1, username: "ilkay" }] }
|
|
55
|
+
*/
|
|
56
|
+
formatMention(user) {
|
|
57
|
+
const userId = typeof user.id === 'string' ? parseInt(user.id, 10) : user.id;
|
|
58
|
+
return {
|
|
59
|
+
text: `<@${userId}>`,
|
|
60
|
+
data: {
|
|
61
|
+
users: [{ id: userId, username: user.username }]
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse mentions (<@ID>) in content and build mentions data structure
|
|
67
|
+
* Content is kept as-is with <@ID> format (client renders them)
|
|
68
|
+
*
|
|
69
|
+
* @param content - Message content with mentions
|
|
70
|
+
* @param existingMentions - Existing mentions data to merge with
|
|
71
|
+
* @returns Original content and mentions data
|
|
72
|
+
*/
|
|
73
|
+
processMentions(content, existingMentions) {
|
|
74
|
+
const mentions = {
|
|
75
|
+
users: [...(existingMentions?.users || [])],
|
|
76
|
+
roles: [...(existingMentions?.roles || [])],
|
|
77
|
+
everyone: existingMentions?.everyone
|
|
78
|
+
};
|
|
79
|
+
// Track already added user IDs to avoid duplicates
|
|
80
|
+
const addedUserIds = new Set(mentions.users?.map(u => u.id) || []);
|
|
81
|
+
// Parse <@ID> format (user mentions) — keep content as-is, only build mentions data
|
|
82
|
+
const userMentionRegex = /<@!?(\d+)>/g;
|
|
83
|
+
let match;
|
|
84
|
+
while ((match = userMentionRegex.exec(content)) !== null) {
|
|
85
|
+
const userId = parseInt(match[1], 10);
|
|
86
|
+
if (!addedUserIds.has(userId)) {
|
|
87
|
+
// Try to get username from cache for mentions data
|
|
88
|
+
const cachedUser = this.getCachedUser(userId);
|
|
89
|
+
mentions.users.push({ id: userId, username: cachedUser?.username || `User_${userId}` });
|
|
90
|
+
addedUserIds.add(userId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Parse <@&ID> format (role mentions) — keep content as-is
|
|
94
|
+
const roleMentionRegex = /<@&(\d+)>/g;
|
|
95
|
+
const addedRoleIds = new Set(mentions.roles?.map(r => r.id) || []);
|
|
96
|
+
while ((match = roleMentionRegex.exec(content)) !== null) {
|
|
97
|
+
const roleId = match[1];
|
|
98
|
+
if (!addedRoleIds.has(roleId)) {
|
|
99
|
+
mentions.roles.push({ id: roleId });
|
|
100
|
+
addedRoleIds.add(roleId);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Parse @everyone and @here
|
|
104
|
+
if (content.includes('@everyone')) {
|
|
105
|
+
mentions.everyone = true;
|
|
106
|
+
}
|
|
107
|
+
// Clean up empty arrays
|
|
108
|
+
if (mentions.users?.length === 0)
|
|
109
|
+
delete mentions.users;
|
|
110
|
+
if (mentions.roles?.length === 0)
|
|
111
|
+
delete mentions.roles;
|
|
112
|
+
return { content, mentions };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Prepare message data with processed mentions
|
|
116
|
+
* Automatically converts mentions to our format
|
|
117
|
+
*/
|
|
118
|
+
prepareMessageData(data) {
|
|
119
|
+
const result = { ...data };
|
|
120
|
+
// Resolve components (ActionRowBuilder / ButtonBuilder instances)
|
|
121
|
+
if (data.components && data.components.length > 0) {
|
|
122
|
+
result.components = data.components.map((c) => typeof c.toJSON === 'function' ? c.toJSON() : c);
|
|
123
|
+
}
|
|
124
|
+
let allMentions = { ...data.mentions };
|
|
125
|
+
// Process mentions in content if present
|
|
126
|
+
if (data.content) {
|
|
127
|
+
const { content, mentions } = this.processMentions(data.content, allMentions);
|
|
128
|
+
result.content = content;
|
|
129
|
+
allMentions = mentions;
|
|
130
|
+
}
|
|
131
|
+
// Process mentions in embeds (description, title, footer, fields)
|
|
132
|
+
if (data.embeds && data.embeds.length > 0) {
|
|
133
|
+
result.embeds = data.embeds.map(embed => {
|
|
134
|
+
// Support EmbedBuilder instances - extract raw data via toJSON()
|
|
135
|
+
const rawEmbed = typeof embed.toJSON === 'function' ? embed.toJSON() : embed;
|
|
136
|
+
const processedEmbed = { ...rawEmbed };
|
|
137
|
+
// Normalize thumbnail: string → { url: string }
|
|
138
|
+
if (typeof processedEmbed.thumbnail === 'string') {
|
|
139
|
+
processedEmbed.thumbnail = { url: processedEmbed.thumbnail };
|
|
140
|
+
}
|
|
141
|
+
// Normalize image: string → { url: string }
|
|
142
|
+
if (typeof processedEmbed.image === 'string') {
|
|
143
|
+
processedEmbed.image = { url: processedEmbed.image };
|
|
144
|
+
}
|
|
145
|
+
// Normalize color: hex string → number
|
|
146
|
+
if (typeof processedEmbed.color === 'string') {
|
|
147
|
+
processedEmbed.color = parseInt(processedEmbed.color.replace('#', ''), 16);
|
|
148
|
+
}
|
|
149
|
+
// Normalize timestamp: Date → ISO string
|
|
150
|
+
if (processedEmbed.timestamp instanceof Date) {
|
|
151
|
+
processedEmbed.timestamp = processedEmbed.timestamp.toISOString();
|
|
152
|
+
}
|
|
153
|
+
else if (typeof processedEmbed.timestamp === 'number') {
|
|
154
|
+
processedEmbed.timestamp = new Date(processedEmbed.timestamp).toISOString();
|
|
155
|
+
}
|
|
156
|
+
// Normalize footer.iconURL → footer.icon_url
|
|
157
|
+
if (processedEmbed.footer) {
|
|
158
|
+
if (processedEmbed.footer.iconURL && !processedEmbed.footer.icon_url) {
|
|
159
|
+
processedEmbed.footer = { ...processedEmbed.footer, icon_url: processedEmbed.footer.iconURL };
|
|
160
|
+
delete processedEmbed.footer.iconURL;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Normalize author.iconURL → author.icon_url
|
|
164
|
+
if (processedEmbed.author) {
|
|
165
|
+
if (processedEmbed.author.iconURL && !processedEmbed.author.icon_url) {
|
|
166
|
+
processedEmbed.author = { ...processedEmbed.author, icon_url: processedEmbed.author.iconURL };
|
|
167
|
+
delete processedEmbed.author.iconURL;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Process description
|
|
171
|
+
if (rawEmbed.description) {
|
|
172
|
+
const { content, mentions } = this.processMentions(rawEmbed.description, allMentions);
|
|
173
|
+
processedEmbed.description = content;
|
|
174
|
+
allMentions = mentions;
|
|
175
|
+
}
|
|
176
|
+
// Process title
|
|
177
|
+
if (rawEmbed.title) {
|
|
178
|
+
const { content, mentions } = this.processMentions(rawEmbed.title, allMentions);
|
|
179
|
+
processedEmbed.title = content;
|
|
180
|
+
allMentions = mentions;
|
|
181
|
+
}
|
|
182
|
+
// Process footer text
|
|
183
|
+
if (rawEmbed.footer?.text) {
|
|
184
|
+
const { content, mentions } = this.processMentions(rawEmbed.footer.text, allMentions);
|
|
185
|
+
processedEmbed.footer = { ...rawEmbed.footer, text: content };
|
|
186
|
+
allMentions = mentions;
|
|
187
|
+
}
|
|
188
|
+
// Process fields
|
|
189
|
+
if (rawEmbed.fields && rawEmbed.fields.length > 0) {
|
|
190
|
+
processedEmbed.fields = rawEmbed.fields.map((field) => {
|
|
191
|
+
const processedField = { ...field };
|
|
192
|
+
if (field.value) {
|
|
193
|
+
const { content, mentions } = this.processMentions(field.value, allMentions);
|
|
194
|
+
processedField.value = content;
|
|
195
|
+
allMentions = mentions;
|
|
196
|
+
}
|
|
197
|
+
if (field.name) {
|
|
198
|
+
const { content, mentions } = this.processMentions(field.name, allMentions);
|
|
199
|
+
processedField.name = content;
|
|
200
|
+
allMentions = mentions;
|
|
201
|
+
}
|
|
202
|
+
return processedField;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return processedEmbed;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// Add merged mentions to result
|
|
209
|
+
if (allMentions.users?.length || allMentions.roles?.length || allMentions.everyone) {
|
|
210
|
+
result.mentions = allMentions;
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Set the bot token
|
|
216
|
+
*/
|
|
217
|
+
setToken(token) {
|
|
218
|
+
this.token = token;
|
|
219
|
+
return this;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Make an authenticated request
|
|
223
|
+
*/
|
|
224
|
+
async request(method, path, body) {
|
|
225
|
+
const url = `${this.baseUrl}${path}`;
|
|
226
|
+
// Debug log
|
|
227
|
+
console.log(`[REST] ${method} ${url}`, body ? JSON.stringify(body) : '');
|
|
228
|
+
const response = await fetch(url, {
|
|
229
|
+
method,
|
|
230
|
+
headers: {
|
|
231
|
+
'Authorization': `Bot ${this.token}`,
|
|
232
|
+
'Content-Type': 'application/json'
|
|
233
|
+
},
|
|
234
|
+
body: body ? JSON.stringify(body) : undefined
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
const error = await response.text();
|
|
238
|
+
throw new Error(`API Error ${response.status}: ${error}`);
|
|
239
|
+
}
|
|
240
|
+
// Handle empty responses
|
|
241
|
+
const text = await response.text();
|
|
242
|
+
if (!text)
|
|
243
|
+
return {};
|
|
244
|
+
return JSON.parse(text);
|
|
245
|
+
}
|
|
246
|
+
// ==================== Messages ====================
|
|
247
|
+
/**
|
|
248
|
+
* Create a message in a channel
|
|
249
|
+
* Mentions use <@ID> format and are kept as-is (client renders them)
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* await rest.createMessage(guildId, channelId, {
|
|
253
|
+
* content: 'Hello <@123>!',
|
|
254
|
+
* });
|
|
255
|
+
*/
|
|
256
|
+
async createMessage(guildIdOrChannelId, channelIdOrData, data) {
|
|
257
|
+
// İki kullanım şekli:
|
|
258
|
+
// 1. createMessage(guildId, channelId, data) - guildId ile (tercih edilen)
|
|
259
|
+
// 2. createMessage(channelId, data) - guildId olmadan (eski format, hata verir)
|
|
260
|
+
let guildId;
|
|
261
|
+
let channelId;
|
|
262
|
+
let messageData;
|
|
263
|
+
if (typeof channelIdOrData === 'string' && data) {
|
|
264
|
+
// Yeni format: createMessage(guildId, channelId, data)
|
|
265
|
+
guildId = guildIdOrChannelId;
|
|
266
|
+
channelId = channelIdOrData;
|
|
267
|
+
messageData = this.prepareMessageData(data);
|
|
268
|
+
// Add interaction_id if provided
|
|
269
|
+
if (data.interactionId) {
|
|
270
|
+
messageData.interaction_id = data.interactionId;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else if (typeof channelIdOrData === 'object') {
|
|
274
|
+
// Eski format: createMessage(channelId, data) - guildId yok
|
|
275
|
+
// Bu format artık desteklenmiyor, hata fırlat
|
|
276
|
+
throw new Error('createMessage requires guildId: createMessage(guildId, channelId, data)');
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
throw new Error('Invalid createMessage arguments');
|
|
280
|
+
}
|
|
281
|
+
return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, messageData);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Create an ephemeral message that is only visible to a specific user
|
|
285
|
+
* Ephemeral messages are NOT saved to database - they are only sent via WebSocket
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* // Send a warning only visible to the user
|
|
289
|
+
* await rest.createEphemeralMessage(guildId, channelId, targetUserId, {
|
|
290
|
+
* embeds: [warningEmbed]
|
|
291
|
+
* });
|
|
292
|
+
*/
|
|
293
|
+
async createEphemeralMessage(guildId, channelId, targetUserId, data) {
|
|
294
|
+
const messageData = this.prepareMessageData(data);
|
|
295
|
+
return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, {
|
|
296
|
+
...messageData,
|
|
297
|
+
flags: 64, // EPHEMERAL flag
|
|
298
|
+
target_user_id: typeof targetUserId === 'string' ? parseInt(targetUserId, 10) : targetUserId
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Create a DM message
|
|
303
|
+
*/
|
|
304
|
+
async createDMMessage(channelId, data) {
|
|
305
|
+
return this.request('POST', `/bot/dm/${channelId}`, data);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Edit a message
|
|
309
|
+
* Automatically processes mentions
|
|
310
|
+
*/
|
|
311
|
+
async editMessage(guildId, channelId, messageId, data) {
|
|
312
|
+
const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}`;
|
|
313
|
+
const processedData = this.prepareMessageData(data);
|
|
314
|
+
return this.request('PATCH', path, processedData);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Delete a message
|
|
318
|
+
*/
|
|
319
|
+
async deleteMessage(guildId, channelId, messageId) {
|
|
320
|
+
const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}`;
|
|
321
|
+
await this.request('DELETE', path);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Validate and normalize emoji format for the API.
|
|
325
|
+
* Accepted formats: :name:, <:name:id>, <a:name:id>
|
|
326
|
+
* Unicode emoji characters (👍) are NOT supported.
|
|
327
|
+
*/
|
|
328
|
+
validateEmoji(emoji) {
|
|
329
|
+
const trimmed = emoji.trim();
|
|
330
|
+
// Custom emoji: <:name:id> or <a:name:id>
|
|
331
|
+
if (/^<a?:\w+:\d+>$/.test(trimmed))
|
|
332
|
+
return trimmed;
|
|
333
|
+
// Unicode emoji by name: :name:
|
|
334
|
+
if (/^:\w+:$/.test(trimmed))
|
|
335
|
+
return trimmed;
|
|
336
|
+
throw new Error(`Geçersiz emoji formatı: "${emoji}". Kabul edilen formatlar: :emoji_name:, <:name:id>, <a:name:id>`);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Add a reaction to a message
|
|
340
|
+
* @param emoji - Emoji in :name:, <:name:id>, or <a:name:id> format. Unicode characters (👍) are not supported.
|
|
341
|
+
*/
|
|
342
|
+
async addReaction(guildId, channelId, messageId, emoji) {
|
|
343
|
+
const validated = this.validateEmoji(emoji);
|
|
344
|
+
const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(validated)}/@me`;
|
|
345
|
+
await this.request('PUT', path);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Remove a reaction from a message
|
|
349
|
+
* @param emoji - Emoji in :name:, <:name:id>, or <a:name:id> format. Unicode characters (👍) are not supported.
|
|
350
|
+
*/
|
|
351
|
+
async removeReaction(guildId, channelId, messageId, emoji) {
|
|
352
|
+
const validated = this.validateEmoji(emoji);
|
|
353
|
+
const path = `/bot/guilds/${guildId}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(validated)}/@me`;
|
|
354
|
+
await this.request('DELETE', path);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Upload an attachment to a channel
|
|
358
|
+
*/
|
|
359
|
+
async uploadAttachment(guildId, channelId, file) {
|
|
360
|
+
const FormData = require('form-data');
|
|
361
|
+
const form = new FormData();
|
|
362
|
+
// form-data expects the buffer directly with options
|
|
363
|
+
form.append('file', file.data, {
|
|
364
|
+
filename: file.name,
|
|
365
|
+
contentType: file.contentType || 'text/plain'
|
|
366
|
+
});
|
|
367
|
+
const url = `${this.baseUrl}/bot/guilds/${guildId}/channels/${channelId}/attachments`;
|
|
368
|
+
console.log(`[REST] Uploading attachment: ${file.name} (${file.data.length} bytes)`);
|
|
369
|
+
const response = await fetch(url, {
|
|
370
|
+
method: 'POST',
|
|
371
|
+
headers: {
|
|
372
|
+
'Authorization': `Bot ${this.token}`,
|
|
373
|
+
...form.getHeaders()
|
|
374
|
+
},
|
|
375
|
+
body: form.getBuffer()
|
|
376
|
+
});
|
|
377
|
+
if (!response.ok) {
|
|
378
|
+
const error = await response.text();
|
|
379
|
+
throw new Error(`API Error ${response.status}: ${error}`);
|
|
380
|
+
}
|
|
381
|
+
return response.json();
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Create a message with a file attachment
|
|
385
|
+
*/
|
|
386
|
+
async createMessageWithFile(guildId, channelId, data) {
|
|
387
|
+
const FormData = require('form-data');
|
|
388
|
+
const form = new FormData();
|
|
389
|
+
// Add content if provided
|
|
390
|
+
if (data.content) {
|
|
391
|
+
form.append('content', data.content);
|
|
392
|
+
}
|
|
393
|
+
// Add interaction_id if provided (for deferred response matching)
|
|
394
|
+
if (data.interactionId) {
|
|
395
|
+
form.append('interaction_id', data.interactionId);
|
|
396
|
+
}
|
|
397
|
+
// Add file
|
|
398
|
+
form.append('files', data.file.data, {
|
|
399
|
+
filename: data.file.name,
|
|
400
|
+
contentType: data.file.contentType || 'text/plain'
|
|
401
|
+
});
|
|
402
|
+
const url = `${this.baseUrl}/bot/guilds/${guildId}/channels/${channelId}/messages`;
|
|
403
|
+
console.log(`[REST] Creating message with file: ${data.file.name} (${data.file.data.length} bytes)${data.interactionId ? ` [interaction: ${data.interactionId}]` : ''}`);
|
|
404
|
+
const response = await fetch(url, {
|
|
405
|
+
method: 'POST',
|
|
406
|
+
headers: {
|
|
407
|
+
'Authorization': `Bot ${this.token}`,
|
|
408
|
+
...form.getHeaders()
|
|
409
|
+
},
|
|
410
|
+
body: form.getBuffer()
|
|
411
|
+
});
|
|
412
|
+
if (!response.ok) {
|
|
413
|
+
const error = await response.text();
|
|
414
|
+
throw new Error(`API Error ${response.status}: ${error}`);
|
|
415
|
+
}
|
|
416
|
+
return response.json();
|
|
417
|
+
}
|
|
418
|
+
// ==================== Interactions ====================
|
|
419
|
+
/**
|
|
420
|
+
* Create an interaction response
|
|
421
|
+
* Automatically processes mentions in content and embeds
|
|
422
|
+
*/
|
|
423
|
+
async createInteractionResponse(interactionId, token, data) {
|
|
424
|
+
console.log(`📤 Interaction response: ${interactionId} -> type ${data.type}`);
|
|
425
|
+
try {
|
|
426
|
+
// Process mentions in response data if present
|
|
427
|
+
let processedData = data;
|
|
428
|
+
if (data.data && (data.data.content || data.data.embeds)) {
|
|
429
|
+
processedData = {
|
|
430
|
+
...data,
|
|
431
|
+
data: this.prepareMessageData(data.data)
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
await this.request('POST', `/interactions/${interactionId}/${token}/callback`, processedData);
|
|
435
|
+
console.log(`✅ Interaction response sent`);
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
console.error(`❌ Interaction response error:`, error);
|
|
439
|
+
throw error;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Edit the original interaction response
|
|
444
|
+
* If files are provided, creates a new message with files (since webhook edit doesn't support file upload)
|
|
445
|
+
* Automatically processes mentions
|
|
446
|
+
*/
|
|
447
|
+
async editInteractionResponse(token, data, guildId, channelId, interactionId) {
|
|
448
|
+
const appId = this.getApplicationId();
|
|
449
|
+
// Process mentions in content
|
|
450
|
+
const processedData = this.prepareMessageData(data);
|
|
451
|
+
// If files are present and we have guild/channel info, create message with file instead
|
|
452
|
+
if (data.files && data.files.length > 0 && guildId && channelId) {
|
|
453
|
+
console.log(`[REST] editInteractionResponse with ${data.files.length} files - using createMessageWithFile`);
|
|
454
|
+
// Create message with file
|
|
455
|
+
const file = data.files[0]; // For now, support single file
|
|
456
|
+
await this.createMessageWithFile(guildId, channelId, {
|
|
457
|
+
content: processedData.content,
|
|
458
|
+
file: file,
|
|
459
|
+
interactionId: interactionId
|
|
460
|
+
});
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
// If we have guildId, channelId and interactionId, create a new message with interaction_id
|
|
464
|
+
// This is needed because our deferred response doesn't create a message
|
|
465
|
+
if (guildId && channelId && interactionId) {
|
|
466
|
+
console.log(`[REST] editInteractionResponse - creating message with interaction_id: ${interactionId}`);
|
|
467
|
+
const payload = {
|
|
468
|
+
interaction_id: interactionId
|
|
469
|
+
};
|
|
470
|
+
if (processedData.content !== undefined)
|
|
471
|
+
payload.content = processedData.content;
|
|
472
|
+
if (processedData.embeds)
|
|
473
|
+
payload.embeds = processedData.embeds;
|
|
474
|
+
if (processedData.components)
|
|
475
|
+
payload.components = processedData.components;
|
|
476
|
+
if (processedData.mentions)
|
|
477
|
+
payload.mentions = processedData.mentions;
|
|
478
|
+
await this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages`, payload);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
// Fallback: Regular edit without files (webhook PATCH)
|
|
482
|
+
const payload = {};
|
|
483
|
+
if (processedData.content !== undefined)
|
|
484
|
+
payload.content = processedData.content;
|
|
485
|
+
if (processedData.embeds)
|
|
486
|
+
payload.embeds = processedData.embeds;
|
|
487
|
+
if (processedData.components)
|
|
488
|
+
payload.components = processedData.components;
|
|
489
|
+
if (processedData.mentions)
|
|
490
|
+
payload.mentions = processedData.mentions;
|
|
491
|
+
await this.request('PATCH', `/interactions/webhooks/${appId}/${token}/messages/@original`, payload);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Delete the original interaction response
|
|
495
|
+
*/
|
|
496
|
+
async deleteInteractionResponse(token) {
|
|
497
|
+
const appId = this.getApplicationId();
|
|
498
|
+
await this.request('DELETE', `/interactions/webhooks/${appId}/${token}/messages/@original`);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Create a followup message
|
|
502
|
+
* Automatically processes mentions
|
|
503
|
+
*/
|
|
504
|
+
async createFollowup(token, data) {
|
|
505
|
+
const appId = this.getApplicationId();
|
|
506
|
+
const processedData = this.prepareMessageData(data);
|
|
507
|
+
await this.request('POST', `/interactions/webhooks/${appId}/${token}`, processedData);
|
|
508
|
+
}
|
|
509
|
+
// ==================== Commands ====================
|
|
510
|
+
/**
|
|
511
|
+
* Register global application commands
|
|
512
|
+
*/
|
|
513
|
+
async registerGlobalCommands(commands) {
|
|
514
|
+
const appId = this.getApplicationId();
|
|
515
|
+
for (const command of commands) {
|
|
516
|
+
await this.request('POST', `/applications/${appId}/commands`, command);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Register guild-specific commands
|
|
521
|
+
*/
|
|
522
|
+
async registerGuildCommands(guildId, commands) {
|
|
523
|
+
const appId = this.getApplicationId();
|
|
524
|
+
for (const command of commands) {
|
|
525
|
+
await this.request('POST', `/applications/${appId}/guilds/${guildId}/commands`, command);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Delete a global command
|
|
530
|
+
*/
|
|
531
|
+
async deleteGlobalCommand(commandId) {
|
|
532
|
+
const appId = this.getApplicationId();
|
|
533
|
+
await this.request('DELETE', `/applications/${appId}/commands/${commandId}`);
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Delete a guild-specific command
|
|
537
|
+
*/
|
|
538
|
+
async deleteGuildCommand(guildId, commandId) {
|
|
539
|
+
const appId = this.getApplicationId();
|
|
540
|
+
await this.request('DELETE', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`);
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* List all global commands for this application
|
|
544
|
+
*/
|
|
545
|
+
async listGlobalCommands() {
|
|
546
|
+
const appId = this.getApplicationId();
|
|
547
|
+
return this.request('GET', `/applications/${appId}/commands`);
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* List all guild-specific commands for this application
|
|
551
|
+
*/
|
|
552
|
+
async listGuildCommands(guildId) {
|
|
553
|
+
const appId = this.getApplicationId();
|
|
554
|
+
return this.request('GET', `/applications/${appId}/guilds/${guildId}/commands`);
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Get a specific global command
|
|
558
|
+
*/
|
|
559
|
+
async getGlobalCommand(commandId) {
|
|
560
|
+
const appId = this.getApplicationId();
|
|
561
|
+
return this.request('GET', `/applications/${appId}/commands/${commandId}`);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Get a specific guild command
|
|
565
|
+
*/
|
|
566
|
+
async getGuildCommand(guildId, commandId) {
|
|
567
|
+
const appId = this.getApplicationId();
|
|
568
|
+
return this.request('GET', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`);
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Update a global command
|
|
572
|
+
*/
|
|
573
|
+
async updateGlobalCommand(commandId, data) {
|
|
574
|
+
const appId = this.getApplicationId();
|
|
575
|
+
return this.request('PATCH', `/applications/${appId}/commands/${commandId}`, data);
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Update a guild-specific command
|
|
579
|
+
*/
|
|
580
|
+
async updateGuildCommand(guildId, commandId, data) {
|
|
581
|
+
const appId = this.getApplicationId();
|
|
582
|
+
return this.request('PATCH', `/applications/${appId}/guilds/${guildId}/commands/${commandId}`, data);
|
|
583
|
+
}
|
|
584
|
+
// ==================== Helpers ====================
|
|
585
|
+
applicationId = '';
|
|
586
|
+
/**
|
|
587
|
+
* Set the application ID
|
|
588
|
+
*/
|
|
589
|
+
setApplicationId(id) {
|
|
590
|
+
this.applicationId = id;
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Get the application ID
|
|
594
|
+
*/
|
|
595
|
+
getApplicationId() {
|
|
596
|
+
if (!this.applicationId) {
|
|
597
|
+
throw new Error('Application ID not set. Call setApplicationId() first.');
|
|
598
|
+
}
|
|
599
|
+
return this.applicationId;
|
|
600
|
+
}
|
|
601
|
+
// ==================== Channels ====================
|
|
602
|
+
/**
|
|
603
|
+
* Create a channel in a guild
|
|
604
|
+
*/
|
|
605
|
+
async createChannel(guildId, data) {
|
|
606
|
+
// Map parent_id to category_id for backend compatibility
|
|
607
|
+
const requestData = {
|
|
608
|
+
name: data.name,
|
|
609
|
+
type: data.type ?? 0, // Default to text channel
|
|
610
|
+
};
|
|
611
|
+
// Backend expects category_id, not parent_id
|
|
612
|
+
if (data.category_id) {
|
|
613
|
+
requestData.category_id = data.category_id;
|
|
614
|
+
}
|
|
615
|
+
else if (data.parent_id) {
|
|
616
|
+
requestData.category_id = data.parent_id;
|
|
617
|
+
}
|
|
618
|
+
// Add permission_overwrites if provided
|
|
619
|
+
if (data.permission_overwrites && data.permission_overwrites.length > 0) {
|
|
620
|
+
requestData.permission_overwrites = data.permission_overwrites;
|
|
621
|
+
}
|
|
622
|
+
return this.request('POST', `/bot/guilds/${guildId}/channels`, requestData);
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Delete a channel
|
|
626
|
+
*/
|
|
627
|
+
/**
|
|
628
|
+
* Delete a channel
|
|
629
|
+
*/
|
|
630
|
+
async deleteChannel(guildId, channelId) {
|
|
631
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/channels/${channelId}`);
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Delete a category
|
|
635
|
+
*/
|
|
636
|
+
async deleteCategory(guildId, categoryId) {
|
|
637
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/categories/${categoryId}`);
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Edit channel permission overwrites
|
|
641
|
+
*/
|
|
642
|
+
async editChannelPermissions(channelId, overwriteId, data) {
|
|
643
|
+
await this.request('PUT', `/bot/channels/${channelId}/permissions/${overwriteId}`, data);
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Delete channel permission overwrite
|
|
647
|
+
*/
|
|
648
|
+
async deleteChannelPermission(channelId, overwriteId) {
|
|
649
|
+
await this.request('DELETE', `/bot/channels/${channelId}/permissions/${overwriteId}`);
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Get messages from a channel
|
|
653
|
+
*/
|
|
654
|
+
async getMessages(guildId, channelId, options) {
|
|
655
|
+
const params = new URLSearchParams();
|
|
656
|
+
if (options?.limit)
|
|
657
|
+
params.append('limit', String(options.limit));
|
|
658
|
+
if (options?.before)
|
|
659
|
+
params.append('before', options.before);
|
|
660
|
+
if (options?.after)
|
|
661
|
+
params.append('after', options.after);
|
|
662
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
663
|
+
const response = await this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/messages${query}`);
|
|
664
|
+
return response.messages || [];
|
|
665
|
+
}
|
|
666
|
+
// ==================== Members ====================
|
|
667
|
+
/**
|
|
668
|
+
* Get a guild member
|
|
669
|
+
*/
|
|
670
|
+
async getMember(guildId, userId) {
|
|
671
|
+
return this.request('GET', `/bot/guilds/${guildId}/members/${userId}`);
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Timeout a guild member
|
|
675
|
+
*/
|
|
676
|
+
async timeoutMember(guildId, userId, duration, reason) {
|
|
677
|
+
if (duration === null) {
|
|
678
|
+
// Clear timeout
|
|
679
|
+
await this.request('POST', `/bot/guilds/${guildId}/members/${userId}/timeout/clear`, {
|
|
680
|
+
reason
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
else {
|
|
684
|
+
// Set timeout
|
|
685
|
+
const until = new Date(Date.now() + duration).toISOString();
|
|
686
|
+
await this.request('POST', `/bot/guilds/${guildId}/members/${userId}/timeout`, {
|
|
687
|
+
until,
|
|
688
|
+
reason
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Kick a guild member
|
|
694
|
+
*/
|
|
695
|
+
async kickMember(guildId, userId, reason) {
|
|
696
|
+
const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
|
|
697
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/members/${userId}${query}`);
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Ban a guild member
|
|
701
|
+
*/
|
|
702
|
+
async banMember(guildId, userId, options) {
|
|
703
|
+
await this.request('PUT', `/bot/guilds/${guildId}/bans/${userId}`, {
|
|
704
|
+
delete_message_days: options?.deleteMessageDays,
|
|
705
|
+
delete_message_seconds: options?.deleteMessageSeconds,
|
|
706
|
+
reason: options?.reason
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Unban a user
|
|
711
|
+
*/
|
|
712
|
+
async unbanMember(guildId, userId, reason) {
|
|
713
|
+
const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
|
|
714
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/bans/${userId}${query}`);
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Edit a guild member
|
|
718
|
+
*/
|
|
719
|
+
async editMember(guildId, userId, data) {
|
|
720
|
+
return this.request('PATCH', `/bot/guilds/${guildId}/members/${userId}`, data);
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Add a role to a member
|
|
724
|
+
*/
|
|
725
|
+
async addMemberRole(guildId, userId, roleId, reason) {
|
|
726
|
+
const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
|
|
727
|
+
await this.request('PUT', `/bot/guilds/${guildId}/members/${userId}/roles/${roleId}${query}`);
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Remove a role from a member
|
|
731
|
+
*/
|
|
732
|
+
async removeMemberRole(guildId, userId, roleId, reason) {
|
|
733
|
+
const query = reason ? `?reason=${encodeURIComponent(reason)}` : '';
|
|
734
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/members/${userId}/roles/${roleId}${query}`);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Bulk assign roles to members
|
|
738
|
+
*/
|
|
739
|
+
async bulkAssignRoles(guildId, assignments) {
|
|
740
|
+
return this.request('PUT', `/bot/guilds/${guildId}/members/roles/assign`, { assignments });
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Bulk remove roles from members
|
|
744
|
+
*/
|
|
745
|
+
async bulkRemoveRoles(guildId, removals) {
|
|
746
|
+
return this.request('DELETE', `/bot/guilds/${guildId}/members/roles/remove`, { removals });
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Bulk delete messages
|
|
750
|
+
*/
|
|
751
|
+
async bulkDeleteMessages(guildId, channelId, messageIds) {
|
|
752
|
+
await this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/messages/bulk-delete`, {
|
|
753
|
+
messages: messageIds
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
// ==================== Guilds ====================
|
|
757
|
+
/**
|
|
758
|
+
* Get a guild
|
|
759
|
+
*/
|
|
760
|
+
async getGuild(guildId) {
|
|
761
|
+
return this.request('GET', `/bot/guilds/${guildId}`);
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Get guild channels
|
|
765
|
+
*/
|
|
766
|
+
async getGuildChannels(guildId) {
|
|
767
|
+
return this.request('GET', `/bot/guilds/${guildId}/channels`);
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Get guild roles
|
|
771
|
+
*/
|
|
772
|
+
async getRoles(guildId) {
|
|
773
|
+
return this.request('GET', `/bot/guilds/${guildId}/roles`);
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Create a role
|
|
777
|
+
*/
|
|
778
|
+
async createRole(guildId, data) {
|
|
779
|
+
return this.request('POST', `/bot/guilds/${guildId}/roles`, data);
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* Edit a role
|
|
783
|
+
*/
|
|
784
|
+
async editRole(guildId, roleId, data) {
|
|
785
|
+
return this.request('PATCH', `/bot/guilds/${guildId}/roles/${roleId}`, data);
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Delete a role
|
|
789
|
+
*/
|
|
790
|
+
async deleteRole(guildId, roleId) {
|
|
791
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/roles/${roleId}`);
|
|
792
|
+
}
|
|
793
|
+
/**
|
|
794
|
+
* Get guild emojis
|
|
795
|
+
*/
|
|
796
|
+
async getEmojis(guildId) {
|
|
797
|
+
return this.request('GET', `/bot/guilds/${guildId}/emojis`);
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Get guild bans
|
|
801
|
+
*/
|
|
802
|
+
async getBans(guildId) {
|
|
803
|
+
return this.request('GET', `/bot/guilds/${guildId}/bans`);
|
|
804
|
+
}
|
|
805
|
+
/**
|
|
806
|
+
* Get a specific ban
|
|
807
|
+
*/
|
|
808
|
+
async getBan(guildId, userId) {
|
|
809
|
+
return this.request('GET', `/bot/guilds/${guildId}/bans/${userId}`);
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Get guild invites
|
|
813
|
+
*/
|
|
814
|
+
async getGuildInvites(guildId) {
|
|
815
|
+
return this.request('GET', `/bot/guilds/${guildId}/invites`);
|
|
816
|
+
}
|
|
817
|
+
// ==================== Pins ====================
|
|
818
|
+
/**
|
|
819
|
+
* Pin a message
|
|
820
|
+
*/
|
|
821
|
+
async pinMessage(guildId, channelId, messageId) {
|
|
822
|
+
await this.request('PUT', `/bot/guilds/${guildId}/channels/${channelId}/pins/${messageId}`);
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Unpin a message
|
|
826
|
+
*/
|
|
827
|
+
async unpinMessage(guildId, channelId, messageId) {
|
|
828
|
+
await this.request('DELETE', `/bot/guilds/${guildId}/channels/${channelId}/pins/${messageId}`);
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* Get pinned messages
|
|
832
|
+
*/
|
|
833
|
+
async getPinnedMessages(guildId, channelId) {
|
|
834
|
+
return this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/pins`);
|
|
835
|
+
}
|
|
836
|
+
// ==================== Users ====================
|
|
837
|
+
/**
|
|
838
|
+
* Get a user
|
|
839
|
+
*/
|
|
840
|
+
async getUser(userId) {
|
|
841
|
+
return this.request('GET', `/bot/users/${userId}`);
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Get current bot user
|
|
845
|
+
*/
|
|
846
|
+
async getCurrentUser() {
|
|
847
|
+
return this.request('GET', `/bot/users/@me`);
|
|
848
|
+
}
|
|
849
|
+
// ==================== Invites ====================
|
|
850
|
+
/**
|
|
851
|
+
* Create an invite
|
|
852
|
+
*/
|
|
853
|
+
async createInvite(guildId, channelId, data) {
|
|
854
|
+
return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/invites`, data || {});
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Delete an invite
|
|
858
|
+
*/
|
|
859
|
+
async deleteInvite(inviteCode) {
|
|
860
|
+
await this.request('DELETE', `/bot/invites/${inviteCode}`);
|
|
861
|
+
}
|
|
862
|
+
/**
|
|
863
|
+
* Get an invite
|
|
864
|
+
*/
|
|
865
|
+
async getInvite(inviteCode) {
|
|
866
|
+
return this.request('GET', `/bot/invites/${inviteCode}`);
|
|
867
|
+
}
|
|
868
|
+
// ==================== Webhooks ====================
|
|
869
|
+
/**
|
|
870
|
+
* Get channel webhooks
|
|
871
|
+
*/
|
|
872
|
+
async getChannelWebhooks(guildId, channelId) {
|
|
873
|
+
return this.request('GET', `/bot/guilds/${guildId}/channels/${channelId}/webhooks`);
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Get guild webhooks
|
|
877
|
+
*/
|
|
878
|
+
async getGuildWebhooks(guildId) {
|
|
879
|
+
return this.request('GET', `/bot/guilds/${guildId}/webhooks`);
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Create a webhook
|
|
883
|
+
*/
|
|
884
|
+
async createWebhook(guildId, channelId, data) {
|
|
885
|
+
return this.request('POST', `/bot/guilds/${guildId}/channels/${channelId}/webhooks`, data);
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* Update a webhook
|
|
889
|
+
*/
|
|
890
|
+
async updateWebhook(guildId, webhookId, data) {
|
|
891
|
+
return this.request('PATCH', `/bot/guilds/${guildId}/webhooks/${webhookId}`, data);
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Delete a webhook
|
|
895
|
+
*/
|
|
896
|
+
async deleteWebhook(guildId, webhookId) {
|
|
897
|
+
return this.request('DELETE', `/bot/guilds/${guildId}/webhooks/${webhookId}`);
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkVTVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXN0L1JFU1QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLElBQUk7SUFDUCxPQUFPLENBQVM7SUFDaEIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUUzQixxREFBcUQ7SUFDN0MsU0FBUyxHQUE0QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLGNBQWMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVc7SUFFNUQsWUFBWSxVQUFrQixtQ0FBbUM7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELDREQUE0RDtJQUU1RDs7O09BR0c7SUFDSCxTQUFTLENBQUMsSUFBNEY7UUFDcEcsTUFBTSxNQUFNLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ3pCLEVBQUUsRUFBRSxNQUFNO1lBQ1YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQ2xELFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxLQUFvRztRQUM3RyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNI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SSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxPQUFPLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsSUFHdkQ7UUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGVBQWUsT0FBTyxhQUFhLFNBQVMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsSUFHdkQ7UUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGVBQWUsT0FBTyxhQUFhLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLFNBQWlCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsZUFBZSxPQUFPLGFBQWEsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUElNZXNzYWdlLCBBUElBcHBsaWNhdGlvbkNvbW1hbmQsIEFQSUVtYmVkIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIE1lbnRpb24gZGF0YSBzdHJ1Y3R1cmUgZm9yIG91ciBzeXN0ZW1cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudGlvblVzZXIge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgdXNlcm5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW50aW9uUm9sZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbnRpb25zRGF0YSB7XHJcbiAgdXNlcnM/OiBNZW50aW9uVXNlcltdO1xyXG4gIHJvbGVzPzogTWVudGlvblJvbGVbXTtcclxuICBldmVyeW9uZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVc2VyIGNhY2hlIGVudHJ5XHJcbiAqL1xyXG5pbnRlcmZhY2UgQ2FjaGVkVXNlciB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICB1c2VybmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xyXG4gIGNhY2hlZEF0OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSRVNUIEFQSSBjbGllbnQgZm9yIEp1YmJpb1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJFU1Qge1xyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyA9ICcnO1xyXG4gIFxyXG4gIC8vIFVzZXIgY2FjaGUgZm9yIG1lbnRpb24gcmVzb2x1dGlvbiAoSUQgLT4gdXNlcm5hbWUpXHJcbiAgcHJpdmF0ZSB1c2VyQ2FjaGU6IE1hcDxudW1iZXIsIENhY2hlZFVzZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgVVNFUl9DQUNIRV9UVEwgPSA1ICogNjAgKiAxMDAwOyAvLyA1IGRha2lrYVxyXG5cclxuICBjb25zdHJ1Y3RvcihiYXNlVXJsOiBzdHJpbmcgPSAnaHR0cHM6Ly9nYXRld2F5Lmp1YmJpby5jb20vYXBpL3YxJykge1xyXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IE1lbnRpb24gSGVscGVycyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDYWNoZSBhIHVzZXIgZm9yIG1lbnRpb24gcmVzb2x1dGlvblxyXG4gICAqIEJvdCdsYXIgaW50ZXJhY3Rpb24nZGFuIGdlbGVuIHVzZXIgYmlsZ2lzaW5pIGNhY2hlJ2xleWViaWxpclxyXG4gICAqL1xyXG4gIGNhY2hlVXNlcih1c2VyOiB7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHVzZXJuYW1lOiBzdHJpbmc7IGRpc3BsYXlOYW1lPzogc3RyaW5nOyBkaXNwbGF5X25hbWU/OiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgdXNlcklkID0gdHlwZW9mIHVzZXIuaWQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodXNlci5pZCwgMTApIDogdXNlci5pZDtcclxuICAgIHRoaXMudXNlckNhY2hlLnNldCh1c2VySWQsIHtcclxuICAgICAgaWQ6IHVzZXJJZCxcclxuICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsXHJcbiAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLmRpc3BsYXlOYW1lIHx8IHVzZXIuZGlzcGxheV9uYW1lLFxyXG4gICAgICBjYWNoZWRBdDogRGF0ZS5ub3coKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWNoZSBtdWx0aXBsZSB1c2Vyc1xyXG4gICAqL1xyXG4gIGNhY2hlVXNlcnModXNlcnM6IEFycmF5PHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdXNlcm5hbWU6IHN0cmluZzsgZGlzcGxheU5hbWU/OiBzdHJpbmc7IGRpc3BsYXlfbmFtZT86IHN0cmluZyB9Pik6IHZvaWQge1xyXG4gICAgdXNlcnMuZm9yRWFjaCh1c2VyID0+IHRoaXMuY2FjaGVVc2VyKHVzZXIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjYWNoZWQgdXNlciBieSBJRFxyXG4gICAqL1xyXG4gIGdldENhY2hlZFVzZXIodXNlcklkOiBudW1iZXIpOiBDYWNoZWRVc2VyIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudXNlckNhY2hlLmdldCh1c2VySWQpO1xyXG4gICAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgdGhpcy5VU0VSX0NBQ0hFX1RUTCkge1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG4gICAgLy8gRXhwaXJlZCwgcmVtb3ZlIGZyb20gY2FjaGVcclxuICAgIGlmIChjYWNoZWQpIHtcclxuICAgICAgdGhpcy51c2VyQ2FjaGUuZGVsZXRlKHVzZXJJZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGEgdXNlciBtZW50aW9uXHJcbiAgICogUmV0dXJucyBib3RoIHRoZSB0ZXh0IGZvcm1hdCBhbmQgbWVudGlvbnMgZGF0YVxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogY29uc3QgbWVudGlvbiA9IHJlc3QuZm9ybWF0TWVudGlvbih1c2VyKTtcclxuICAgKiAvLyBtZW50aW9uLnRleHQgPSBcIjxAMT5cIlxyXG4gICAqIC8vIG1lbnRpb24uZGF0YSA9IHsgdXNlcnM6IFt7IGlkOiAxLCB1c2VybmFtZTogXCJpbGtheVwiIH1dIH1cclxuICAgKi9cclxuICBmb3JtYXRNZW50aW9uKHVzZXI6IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdXNlcm5hbWU6IHN0cmluZyB9KTogeyB0ZXh0OiBzdHJpbmc7IGRhdGE6IE1lbnRpb25zRGF0YSB9IHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHR5cGVvZiB1c2VyLmlkID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHVzZXIuaWQsIDEwKSA6IHVzZXIuaWQ7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0ZXh0OiBgPEAke3VzZXJJZH0+YCxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVzZXJzOiBbeyBpZDogdXNlcklkLCB1c2VybmFtZTogdXNlci51c2VybmFtZSB9XVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2UgbWVudGlvbnMgKDxASUQ+KSBpbiBjb250ZW50IGFuZCBidWlsZCBtZW50aW9ucyBkYXRhIHN0cnVjdHVyZVxyXG4gICAqIENvbnRlbnQgaXMga2VwdCBhcy1pcyB3aXRoIDxASUQ+IGZvcm1hdCAoY2xpZW50IHJlbmRlcnMgdGhlbSlcclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29udGVudCAtIE1lc3NhZ2UgY29udGVudCB3aXRoIG1lbnRpb25zXHJcbiAgICogQHBhcmFtIGV4aXN0aW5nTWVudGlvbnMgLSBFeGlzdGluZyBtZW50aW9ucyBkYXRhIHRvIG1lcmdlIHdpdGhcclxuICAgKiBAcmV0dXJucyBPcmlnaW5hbCBjb250ZW50IGFuZCBtZW50aW9ucyBkYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzTWVudGlvbnMoY29udGVudDogc3RyaW5nLCBleGlzdGluZ01lbnRpb25zPzogTWVudGlvbnNEYXRhKTogeyBjb250ZW50OiBzdHJpbmc7IG1lbnRpb25zOiBNZW50aW9uc0RhdGEgfSB7XHJcbiAgICBjb25zdCBtZW50aW9uczogTWVudGlvbnNEYXRhID0ge1xyXG4gICAgICB1c2VyczogWy4uLihleGlzdGluZ01lbnRpb25zPy51c2VycyB8fCBbXSldLFxyXG4gICAgICByb2xlczogWy4uLihleGlzdGluZ01lbnRpb25zPy5yb2xlcyB8fCBbXSldLFxyXG4gICAgICBldmVyeW9uZTogZXhpc3RpbmdNZW50aW9ucz8uZXZlcnlvbmVcclxuICAgIH07XHJcblxyXG4gICAgLy8gVHJhY2sgYWxyZWFkeSBhZGRlZCB1c2VyIElEcyB0byBhdm9pZCBkdXBsaWNhdGVzXHJcbiAgICBjb25zdCBhZGRlZFVzZXJJZHMgPSBuZXcgU2V0KG1lbnRpb25zLnVzZXJzPy5tYXAodSA9PiB1LmlkKSB8fCBbXSk7XHJcblxyXG4gICAgLy8gUGFyc2UgPEBJRD4gZm9ybWF0ICh1c2VyIG1lbnRpb25zKSDigJQga2VlcCBjb250ZW50IGFzLWlzLCBvbmx5IGJ1aWxkIG1lbnRpb25zIGRhdGFcclxuICAgIGNvbnN0IHVzZXJNZW50aW9uUmVnZXggPSAvPEAhPyhcXGQrKT4vZztcclxuICAgIGxldCBtYXRjaDtcclxuXHJcbiAgICB3aGlsZSAoKG1hdGNoID0gdXNlck1lbnRpb25SZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1c2VySWQgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xyXG5cclxuICAgICAgaWYgKCFhZGRlZFVzZXJJZHMuaGFzKHVzZXJJZCkpIHtcclxuICAgICAgICAvLyBUcnkgdG8gZ2V0IHVzZXJuYW1lIGZyb20gY2FjaGUgZm9yIG1lbnRpb25zIGRhdGFcclxuICAgICAgICBjb25zdCBjYWNoZWRVc2VyID0gdGhpcy5nZXRDYWNoZWRVc2VyKHVzZXJJZCk7XHJcbiAgICAgICAgbWVudGlvbnMudXNlcnMhLnB1c2goeyBpZDogdXNlcklkLCB1c2VybmFtZTogY2FjaGVkVXNlcj8udXNlcm5hbWUgfHwgYFVzZXJfJHt1c2VySWR9YCB9KTtcclxuICAgICAgICBhZGRlZFVzZXJJZHMuYWRkKHVzZXJJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQYXJzZSA8QCZJRD4gZm9ybWF0IChyb2xlIG1lbnRpb25zKSDigJQga2VlcCBjb250ZW50IGFzLWlzXHJcbiAgICBjb25zdCByb2xlTWVudGlvblJlZ2V4ID0gLzxAJihcXGQrKT4vZztcclxuICAgIGNvbnN0IGFkZGVkUm9sZUlkcyA9IG5ldyBTZXQobWVudGlvbnMucm9sZXM/Lm1hcChyID0+IHIuaWQpIHx8IFtdKTtcclxuXHJcbiAgICB3aGlsZSAoKG1hdGNoID0gcm9sZU1lbnRpb25SZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCByb2xlSWQgPSBtYXRjaFsxXTtcclxuICAgICAgaWYgKCFhZGRlZFJvbGVJZHMuaGFzKHJvbGVJZCkpIHtcclxuICAgICAgICBtZW50aW9ucy5yb2xlcyEucHVzaCh7IGlkOiByb2xlSWQgfSk7XHJcbiAgICAgICAgYWRkZWRSb2xlSWRzLmFkZChyb2xlSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGFyc2UgQGV2ZXJ5b25lIGFuZCBAaGVyZVxyXG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ0BldmVyeW9uZScpKSB7XHJcbiAgICAgIG1lbnRpb25zLmV2ZXJ5b25lID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhbiB1cCBlbXB0eSBhcnJheXNcclxuICAgIGlmIChtZW50aW9ucy51c2Vycz8ubGVuZ3RoID09PSAwKSBkZWxldGUgbWVudGlvbnMudXNlcnM7XHJcbiAgICBpZiAobWVudGlvbnMucm9sZXM/Lmxlbmd0aCA9PT0gMCkgZGVsZXRlIG1lbnRpb25zLnJvbGVzO1xyXG5cclxuICAgIHJldHVybiB7IGNvbnRlbnQsIG1lbnRpb25zIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmVwYXJlIG1lc3NhZ2UgZGF0YSB3aXRoIHByb2Nlc3NlZCBtZW50aW9uc1xyXG4gICAqIEF1dG9tYXRpY2FsbHkgY29udmVydHMgbWVudGlvbnMgdG8gb3VyIGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBtZXNzYWdlX3JlZmVyZW5jZT86IHsgbWVzc2FnZV9pZDogc3RyaW5nIH07XHJcbiAgfSk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHsgLi4uZGF0YSB9O1xyXG5cclxuICAgIC8vIFJlc29sdmUgY29tcG9uZW50cyAoQWN0aW9uUm93QnVpbGRlciAvIEJ1dHRvbkJ1aWxkZXIgaW5zdGFuY2VzKVxyXG4gICAgaWYgKGRhdGEuY29tcG9uZW50cyAmJiBkYXRhLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXN1bHQuY29tcG9uZW50cyA9IGRhdGEuY29tcG9uZW50cy5tYXAoKGM6IGFueSkgPT5cclxuICAgICAgICB0eXBlb2YgYy50b0pTT04gPT09ICdmdW5jdGlvbicgPyBjLnRvSlNPTigpIDogY1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBhbGxNZW50aW9uczogTWVudGlvbnNEYXRhID0geyAuLi5kYXRhLm1lbnRpb25zIH07XHJcblxyXG4gICAgLy8gUHJvY2VzcyBtZW50aW9ucyBpbiBjb250ZW50IGlmIHByZXNlbnRcclxuICAgIGlmIChkYXRhLmNvbnRlbnQpIHtcclxuICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMoZGF0YS5jb250ZW50LCBhbGxNZW50aW9ucyk7XHJcbiAgICAgIHJlc3VsdC5jb250ZW50ID0gY29udGVudDtcclxuICAgICAgYWxsTWVudGlvbnMgPSBtZW50aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9jZXNzIG1lbnRpb25zIGluIGVtYmVkcyAoZGVzY3JpcHRpb24sIHRpdGxlLCBmb290ZXIsIGZpZWxkcylcclxuICAgIGlmIChkYXRhLmVtYmVkcyAmJiBkYXRhLmVtYmVkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJlc3VsdC5lbWJlZHMgPSBkYXRhLmVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIC8vIFN1cHBvcnQgRW1iZWRCdWlsZGVyIGluc3RhbmNlcyAtIGV4dHJhY3QgcmF3IGRhdGEgdmlhIHRvSlNPTigpXHJcbiAgICAgICAgY29uc3QgcmF3RW1iZWQgPSB0eXBlb2YgKGVtYmVkIGFzIGFueSkudG9KU09OID09PSAnZnVuY3Rpb24nID8gKGVtYmVkIGFzIGFueSkudG9KU09OKCkgOiBlbWJlZDtcclxuICAgICAgICBjb25zdCBwcm9jZXNzZWRFbWJlZDogYW55ID0geyAuLi5yYXdFbWJlZCB9O1xyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgdGh1bWJuYWlsOiBzdHJpbmcg4oaSIHsgdXJsOiBzdHJpbmcgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VkRW1iZWQudGh1bWJuYWlsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQudGh1bWJuYWlsID0geyB1cmw6IHByb2Nlc3NlZEVtYmVkLnRodW1ibmFpbCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm9ybWFsaXplIGltYWdlOiBzdHJpbmcg4oaSIHsgdXJsOiBzdHJpbmcgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VkRW1iZWQuaW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBwcm9jZXNzZWRFbWJlZC5pbWFnZSA9IHsgdXJsOiBwcm9jZXNzZWRFbWJlZC5pbWFnZSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm9ybWFsaXplIGNvbG9yOiBoZXggc3RyaW5nIOKGkiBudW1iZXJcclxuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3NlZEVtYmVkLmNvbG9yID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuY29sb3IgPSBwYXJzZUludChwcm9jZXNzZWRFbWJlZC5jb2xvci5yZXBsYWNlKCcjJywgJycpLCAxNik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgdGltZXN0YW1wOiBEYXRlIOKGkiBJU08gc3RyaW5nXHJcbiAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9IHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCA9IG5ldyBEYXRlKHByb2Nlc3NlZEVtYmVkLnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmb290ZXIuaWNvblVSTCDihpIgZm9vdGVyLmljb25fdXJsXHJcbiAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLmZvb3Rlcikge1xyXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZEVtYmVkLmZvb3Rlci5pY29uVVJMICYmICFwcm9jZXNzZWRFbWJlZC5mb290ZXIuaWNvbl91cmwpIHtcclxuICAgICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyID0geyAuLi5wcm9jZXNzZWRFbWJlZC5mb290ZXIsIGljb25fdXJsOiBwcm9jZXNzZWRFbWJlZC5mb290ZXIuaWNvblVSTCB9O1xyXG4gICAgICAgICAgICBkZWxldGUgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyLmljb25VUkw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgYXV0aG9yLmljb25VUkwg4oaSIGF1dGhvci5pY29uX3VybFxyXG4gICAgICAgIGlmIChwcm9jZXNzZWRFbWJlZC5hdXRob3IpIHtcclxuICAgICAgICAgIGlmIChwcm9jZXNzZWRFbWJlZC5hdXRob3IuaWNvblVSTCAmJiAhcHJvY2Vzc2VkRW1iZWQuYXV0aG9yLmljb25fdXJsKSB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLmF1dGhvciA9IHsgLi4ucHJvY2Vzc2VkRW1iZWQuYXV0aG9yLCBpY29uX3VybDogcHJvY2Vzc2VkRW1iZWQuYXV0aG9yLmljb25VUkwgfTtcclxuICAgICAgICAgICAgZGVsZXRlIHByb2Nlc3NlZEVtYmVkLmF1dGhvci5pY29uVVJMO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBQcm9jZXNzIGRlc2NyaXB0aW9uXHJcbiAgICAgICAgaWYgKHJhd0VtYmVkLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhyYXdFbWJlZC5kZXNjcmlwdGlvbiwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZGVzY3JpcHRpb24gPSBjb250ZW50O1xyXG4gICAgICAgICAgYWxsTWVudGlvbnMgPSBtZW50aW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aXRsZVxyXG4gICAgICAgIGlmIChyYXdFbWJlZC50aXRsZSkge1xyXG4gICAgICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMocmF3RW1iZWQudGl0bGUsIGFsbE1lbnRpb25zKTtcclxuICAgICAgICAgIHByb2Nlc3NlZEVtYmVkLnRpdGxlID0gY29udGVudDtcclxuICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFByb2Nlc3MgZm9vdGVyIHRleHRcclxuICAgICAgICBpZiAocmF3RW1iZWQuZm9vdGVyPy50ZXh0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhyYXdFbWJlZC5mb290ZXIudGV4dCwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZm9vdGVyID0geyAuLi5yYXdFbWJlZC5mb290ZXIsIHRleHQ6IGNvbnRlbnQgfTtcclxuICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFByb2Nlc3MgZmllbGRzXHJcbiAgICAgICAgaWYgKHJhd0VtYmVkLmZpZWxkcyAmJiByYXdFbWJlZC5maWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcHJvY2Vzc2VkRW1iZWQuZmllbGRzID0gcmF3RW1iZWQuZmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRGaWVsZDogYW55ID0geyAuLi5maWVsZCB9O1xyXG4gICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIG1lbnRpb25zIH0gPSB0aGlzLnByb2Nlc3NNZW50aW9ucyhmaWVsZC52YWx1ZSwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkLnZhbHVlID0gY29udGVudDtcclxuICAgICAgICAgICAgICBhbGxNZW50aW9ucyA9IG1lbnRpb25zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50LCBtZW50aW9ucyB9ID0gdGhpcy5wcm9jZXNzTWVudGlvbnMoZmllbGQubmFtZSwgYWxsTWVudGlvbnMpO1xyXG4gICAgICAgICAgICAgIHByb2Nlc3NlZEZpZWxkLm5hbWUgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgIGFsbE1lbnRpb25zID0gbWVudGlvbnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEZpZWxkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRFbWJlZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIG1lcmdlZCBtZW50aW9ucyB0byByZXN1bHRcclxuICAgIGlmIChhbGxNZW50aW9ucy51c2Vycz8ubGVuZ3RoIHx8IGFsbE1lbnRpb25zLnJvbGVzPy5sZW5ndGggfHwgYWxsTWVudGlvbnMuZXZlcnlvbmUpIHtcclxuICAgICAgcmVzdWx0Lm1lbnRpb25zID0gYWxsTWVudGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgYm90IHRva2VuXHJcbiAgICovXHJcbiAgc2V0VG9rZW4odG9rZW46IHN0cmluZyk6IHRoaXMge1xyXG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBib2R5PzogYW55KTogUHJvbWlzZTxUPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWA7XHJcbiAgICBcclxuICAgIC8vIERlYnVnIGxvZ1xyXG4gICAgY29uc29sZS5sb2coYFtSRVNUXSAke21ldGhvZH0gJHt1cmx9YCwgYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogJycpO1xyXG4gICAgXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2QsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCb3QgJHt0aGlzLnRva2VufWAsXHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBib2R5ID8gSlNPTi5zdHJpbmdpZnkoYm9keSkgOiB1bmRlZmluZWRcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVBJIEVycm9yICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvcn1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgZW1wdHkgcmVzcG9uc2VzXHJcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgaWYgKCF0ZXh0KSByZXR1cm4ge30gYXMgVDtcclxuICAgIFxyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBNZXNzYWdlcyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBtZXNzYWdlIGluIGEgY2hhbm5lbFxyXG4gICAqIE1lbnRpb25zIHVzZSA8QElEPiBmb3JtYXQgYW5kIGFyZSBrZXB0IGFzLWlzIChjbGllbnQgcmVuZGVycyB0aGVtKVxyXG4gICAqIFxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYXdhaXQgcmVzdC5jcmVhdGVNZXNzYWdlKGd1aWxkSWQsIGNoYW5uZWxJZCwge1xyXG4gICAqICAgY29udGVudDogJ0hlbGxvIDxAMTIzPiEnLFxyXG4gICAqIH0pO1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1lc3NhZ2UoZ3VpbGRJZE9yQ2hhbm5lbElkOiBzdHJpbmcsIGNoYW5uZWxJZE9yRGF0YTogc3RyaW5nIHwge1xyXG4gICAgY29udGVudD86IHN0cmluZztcclxuICAgIGVtYmVkcz86IEFQSUVtYmVkW107XHJcbiAgICBjb21wb25lbnRzPzogYW55W107XHJcbiAgICBtZW50aW9ucz86IE1lbnRpb25zRGF0YTtcclxuICAgIGZpbGVzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlciB9PjtcclxuICAgIG1lc3NhZ2VfcmVmZXJlbmNlPzogeyBtZXNzYWdlX2lkOiBzdHJpbmcgfTtcclxuICAgIGludGVyYWN0aW9uSWQ/OiBzdHJpbmc7XHJcbiAgfSwgZGF0YT86IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBmaWxlcz86IEFycmF5PHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXIgfT47XHJcbiAgICBtZXNzYWdlX3JlZmVyZW5jZT86IHsgbWVzc2FnZV9pZDogc3RyaW5nIH07XHJcbiAgICBpbnRlcmFjdGlvbklkPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPEFQSU1lc3NhZ2U+IHtcclxuICAgIC8vIMSwa2kga3VsbGFuxLFtIMWfZWtsaTpcclxuICAgIC8vIDEuIGNyZWF0ZU1lc3NhZ2UoZ3VpbGRJZCwgY2hhbm5lbElkLCBkYXRhKSAtIGd1aWxkSWQgaWxlICh0ZXJjaWggZWRpbGVuKVxyXG4gICAgLy8gMi4gY3JlYXRlTWVzc2FnZShjaGFubmVsSWQsIGRhdGEpIC0gZ3VpbGRJZCBvbG1hZGFuIChlc2tpIGZvcm1hdCwgaGF0YSB2ZXJpcilcclxuICAgIFxyXG4gICAgbGV0IGd1aWxkSWQ6IHN0cmluZztcclxuICAgIGxldCBjaGFubmVsSWQ6IHN0cmluZztcclxuICAgIGxldCBtZXNzYWdlRGF0YTogYW55O1xyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIGNoYW5uZWxJZE9yRGF0YSA9PT0gJ3N0cmluZycgJiYgZGF0YSkge1xyXG4gICAgICAvLyBZZW5pIGZvcm1hdDogY3JlYXRlTWVzc2FnZShndWlsZElkLCBjaGFubmVsSWQsIGRhdGEpXHJcbiAgICAgIGd1aWxkSWQgPSBndWlsZElkT3JDaGFubmVsSWQ7XHJcbiAgICAgIGNoYW5uZWxJZCA9IGNoYW5uZWxJZE9yRGF0YTtcclxuICAgICAgbWVzc2FnZURhdGEgPSB0aGlzLnByZXBhcmVNZXNzYWdlRGF0YShkYXRhKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFkZCBpbnRlcmFjdGlvbl9pZCBpZiBwcm92aWRlZFxyXG4gICAgICBpZiAoZGF0YS5pbnRlcmFjdGlvbklkKSB7XHJcbiAgICAgICAgbWVzc2FnZURhdGEuaW50ZXJhY3Rpb25faWQgPSBkYXRhLmludGVyYWN0aW9uSWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNoYW5uZWxJZE9yRGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gRXNraSBmb3JtYXQ6IGNyZWF0ZU1lc3NhZ2UoY2hhbm5lbElkLCBkYXRhKSAtIGd1aWxkSWQgeW9rXHJcbiAgICAgIC8vIEJ1IGZvcm1hdCBhcnTEsWsgZGVzdGVrbGVubWl5b3IsIGhhdGEgZsSxcmxhdFxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZU1lc3NhZ2UgcmVxdWlyZXMgZ3VpbGRJZDogY3JlYXRlTWVzc2FnZShndWlsZElkLCBjaGFubmVsSWQsIGRhdGEpJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY3JlYXRlTWVzc2FnZSBhcmd1bWVudHMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxBUElNZXNzYWdlPignUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlc2AsIG1lc3NhZ2VEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBlcGhlbWVyYWwgbWVzc2FnZSB0aGF0IGlzIG9ubHkgdmlzaWJsZSB0byBhIHNwZWNpZmljIHVzZXJcclxuICAgKiBFcGhlbWVyYWwgbWVzc2FnZXMgYXJlIE5PVCBzYXZlZCB0byBkYXRhYmFzZSAtIHRoZXkgYXJlIG9ubHkgc2VudCB2aWEgV2ViU29ja2V0XHJcbiAgICogXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiAvLyBTZW5kIGEgd2FybmluZyBvbmx5IHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgKiBhd2FpdCByZXN0LmNyZWF0ZUVwaGVtZXJhbE1lc3NhZ2UoZ3VpbGRJZCwgY2hhbm5lbElkLCB0YXJnZXRVc2VySWQsIHtcclxuICAgKiAgIGVtYmVkczogW3dhcm5pbmdFbWJlZF1cclxuICAgKiB9KTtcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVFcGhlbWVyYWxNZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIHRhcmdldFVzZXJJZDogc3RyaW5nIHwgbnVtYmVyLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICAgIGNvbXBvbmVudHM/OiBhbnlbXTtcclxuICB9KTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IGVwaGVtZXJhbDogYm9vbGVhbjsgZmxhZ3M6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBtZXNzYWdlRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PHsgaWQ6IHN0cmluZzsgZXBoZW1lcmFsOiBib29sZWFuOyBmbGFnczogbnVtYmVyIH0+KCdQT1NUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzYCwge1xyXG4gICAgICAuLi5tZXNzYWdlRGF0YSxcclxuICAgICAgZmxhZ3M6IDY0LCAvLyBFUEhFTUVSQUwgZmxhZ1xyXG4gICAgICB0YXJnZXRfdXNlcl9pZDogdHlwZW9mIHRhcmdldFVzZXJJZCA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh0YXJnZXRVc2VySWQsIDEwKSA6IHRhcmdldFVzZXJJZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBETSBtZXNzYWdlXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlRE1NZXNzYWdlKGNoYW5uZWxJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICB9KTogUHJvbWlzZTxBUElNZXNzYWdlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSU1lc3NhZ2U+KCdQT1NUJywgYC9ib3QvZG0vJHtjaGFubmVsSWR9YCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgbWVzc2FnZVxyXG4gICAqIEF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIG1lbnRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdE1lc3NhZ2UoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgY29tcG9uZW50cz86IGFueVtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgfSk6IFByb21pc2U8QVBJTWVzc2FnZT4ge1xyXG4gICAgY29uc3QgcGF0aCA9IGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gO1xyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxBUElNZXNzYWdlPignUEFUQ0gnLCBwYXRoLCBwcm9jZXNzZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIG1lc3NhZ2VcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVNZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwYXRoID0gYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWA7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ0RFTEVURScsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBlbW9qaSBmb3JtYXQgZm9yIHRoZSBBUEkuXHJcbiAgICogQWNjZXB0ZWQgZm9ybWF0czogOm5hbWU6LCA8Om5hbWU6aWQ+LCA8YTpuYW1lOmlkPlxyXG4gICAqIFVuaWNvZGUgZW1vamkgY2hhcmFjdGVycyAo8J+RjSkgYXJlIE5PVCBzdXBwb3J0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUVtb2ppKGVtb2ppOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdHJpbW1lZCA9IGVtb2ppLnRyaW0oKTtcclxuICAgIC8vIEN1c3RvbSBlbW9qaTogPDpuYW1lOmlkPiBvciA8YTpuYW1lOmlkPlxyXG4gICAgaWYgKC9ePGE/Olxcdys6XFxkKz4kLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcclxuICAgIC8vIFVuaWNvZGUgZW1vamkgYnkgbmFtZTogOm5hbWU6XHJcbiAgICBpZiAoL146XFx3KzokLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYEdlw6dlcnNpeiBlbW9qaSBmb3JtYXTEsTogXCIke2Vtb2ppfVwiLiBLYWJ1bCBlZGlsZW4gZm9ybWF0bGFyOiA6ZW1vamlfbmFtZTosIDw6bmFtZTppZD4sIDxhOm5hbWU6aWQ+YFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHJlYWN0aW9uIHRvIGEgbWVzc2FnZVxyXG4gICAqIEBwYXJhbSBlbW9qaSAtIEVtb2ppIGluIDpuYW1lOiwgPDpuYW1lOmlkPiwgb3IgPGE6bmFtZTppZD4gZm9ybWF0LiBVbmljb2RlIGNoYXJhY3RlcnMgKPCfkY0pIGFyZSBub3Qgc3VwcG9ydGVkLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFJlYWN0aW9uKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nLCBlbW9qaTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSB0aGlzLnZhbGlkYXRlRW1vamkoZW1vamkpO1xyXG4gICAgY29uc3QgcGF0aCA9IGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vcmVhY3Rpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbGlkYXRlZCl9L0BtZWA7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BVVCcsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGEgcmVhY3Rpb24gZnJvbSBhIG1lc3NhZ2VcclxuICAgKiBAcGFyYW0gZW1vamkgLSBFbW9qaSBpbiA6bmFtZTosIDw6bmFtZTppZD4sIG9yIDxhOm5hbWU6aWQ+IGZvcm1hdC4gVW5pY29kZSBjaGFyYWN0ZXJzICjwn5GNKSBhcmUgbm90IHN1cHBvcnRlZC5cclxuICAgKi9cclxuICBhc3luYyByZW1vdmVSZWFjdGlvbihndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZywgZW1vamk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdmFsaWRhdGVkID0gdGhpcy52YWxpZGF0ZUVtb2ppKGVtb2ppKTtcclxuICAgIGNvbnN0IHBhdGggPSBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3JlYWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudCh2YWxpZGF0ZWQpfS9AbWVgO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdERUxFVEUnLCBwYXRoKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWQgYW4gYXR0YWNobWVudCB0byBhIGNoYW5uZWxcclxuICAgKi9cclxuICBhc3luYyB1cGxvYWRBdHRhY2htZW50KGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIGZpbGU6IHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGNvbnRlbnRUeXBlPzogc3RyaW5nIH0pOiBQcm9taXNlPHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGZpbGVuYW1lOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgRm9ybURhdGEgPSByZXF1aXJlKCdmb3JtLWRhdGEnKTtcclxuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIFxyXG4gICAgLy8gZm9ybS1kYXRhIGV4cGVjdHMgdGhlIGJ1ZmZlciBkaXJlY3RseSB3aXRoIG9wdGlvbnNcclxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgZmlsZS5kYXRhLCB7XHJcbiAgICAgIGZpbGVuYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBmaWxlLmNvbnRlbnRUeXBlIHx8ICd0ZXh0L3BsYWluJ1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0vYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9hdHRhY2htZW50c2A7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBbUkVTVF0gVXBsb2FkaW5nIGF0dGFjaG1lbnQ6ICR7ZmlsZS5uYW1lfSAoJHtmaWxlLmRhdGEubGVuZ3RofSBieXRlcylgKTtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCb3QgJHt0aGlzLnRva2VufWAsXHJcbiAgICAgICAgLi4uZm9ybS5nZXRIZWFkZXJzKClcclxuICAgICAgfSxcclxuICAgICAgYm9keTogZm9ybS5nZXRCdWZmZXIoKVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQVBJIEVycm9yICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtlcnJvcn1gKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGZpbGVuYW1lOiBzdHJpbmcgfT47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYSBmaWxlIGF0dGFjaG1lbnRcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNZXNzYWdlV2l0aEZpbGUoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgY29udGVudD86IHN0cmluZztcclxuICAgIGZpbGU6IHsgbmFtZTogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IGNvbnRlbnRUeXBlPzogc3RyaW5nIH07XHJcbiAgICBpbnRlcmFjdGlvbklkPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPEFQSU1lc3NhZ2U+IHtcclxuICAgIGNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XHJcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBcclxuICAgIC8vIEFkZCBjb250ZW50IGlmIHByb3ZpZGVkXHJcbiAgICBpZiAoZGF0YS5jb250ZW50KSB7XHJcbiAgICAgIGZvcm0uYXBwZW5kKCdjb250ZW50JywgZGF0YS5jb250ZW50KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIGludGVyYWN0aW9uX2lkIGlmIHByb3ZpZGVkIChmb3IgZGVmZXJyZWQgcmVzcG9uc2UgbWF0Y2hpbmcpXHJcbiAgICBpZiAoZGF0YS5pbnRlcmFjdGlvbklkKSB7XHJcbiAgICAgIGZvcm0uYXBwZW5kKCdpbnRlcmFjdGlvbl9pZCcsIGRhdGEuaW50ZXJhY3Rpb25JZCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCBmaWxlXHJcbiAgICBmb3JtLmFwcGVuZCgnZmlsZXMnLCBkYXRhLmZpbGUuZGF0YSwge1xyXG4gICAgICBmaWxlbmFtZTogZGF0YS5maWxlLm5hbWUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBkYXRhLmZpbGUuY29udGVudFR5cGUgfHwgJ3RleHQvcGxhaW4nXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzYDtcclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYFtSRVNUXSBDcmVhdGluZyBtZXNzYWdlIHdpdGggZmlsZTogJHtkYXRhLmZpbGUubmFtZX0gKCR7ZGF0YS5maWxlLmRhdGEubGVuZ3RofSBieXRlcykke2RhdGEuaW50ZXJhY3Rpb25JZCA/IGAgW2ludGVyYWN0aW9uOiAke2RhdGEuaW50ZXJhY3Rpb25JZH1dYCA6ICcnfWApO1xyXG4gICAgXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJvdCAke3RoaXMudG9rZW59YCxcclxuICAgICAgICAuLi5mb3JtLmdldEhlYWRlcnMoKVxyXG4gICAgICB9LFxyXG4gICAgICBib2R5OiBmb3JtLmdldEJ1ZmZlcigpXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgRXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yfWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8QVBJTWVzc2FnZT47XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnRlcmFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludGVyYWN0aW9uIHJlc3BvbnNlXHJcbiAgICogQXV0b21hdGljYWxseSBwcm9jZXNzZXMgbWVudGlvbnMgaW4gY29udGVudCBhbmQgZW1iZWRzXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlSW50ZXJhY3Rpb25SZXNwb25zZShpbnRlcmFjdGlvbklkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIHR5cGU6IG51bWJlcjtcclxuICAgIGRhdGE/OiBhbnk7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coYPCfk6QgSW50ZXJhY3Rpb24gcmVzcG9uc2U6ICR7aW50ZXJhY3Rpb25JZH0gLT4gdHlwZSAke2RhdGEudHlwZX1gKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFByb2Nlc3MgbWVudGlvbnMgaW4gcmVzcG9uc2UgZGF0YSBpZiBwcmVzZW50XHJcbiAgICAgIGxldCBwcm9jZXNzZWREYXRhID0gZGF0YTtcclxuICAgICAgaWYgKGRhdGEuZGF0YSAmJiAoZGF0YS5kYXRhLmNvbnRlbnQgfHwgZGF0YS5kYXRhLmVtYmVkcykpIHtcclxuICAgICAgICBwcm9jZXNzZWREYXRhID0ge1xyXG4gICAgICAgICAgLi4uZGF0YSxcclxuICAgICAgICAgIGRhdGE6IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEuZGF0YSlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BPU1QnLCBgL2ludGVyYWN0aW9ucy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L2NhbGxiYWNrYCwgcHJvY2Vzc2VkRGF0YSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGDinIUgSW50ZXJhY3Rpb24gcmVzcG9uc2Ugc2VudGApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihg4p2MIEludGVyYWN0aW9uIHJlc3BvbnNlIGVycm9yOmAsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbiByZXNwb25zZVxyXG4gICAqIElmIGZpbGVzIGFyZSBwcm92aWRlZCwgY3JlYXRlcyBhIG5ldyBtZXNzYWdlIHdpdGggZmlsZXMgKHNpbmNlIHdlYmhvb2sgZWRpdCBkb2Vzbid0IHN1cHBvcnQgZmlsZSB1cGxvYWQpXHJcbiAgICogQXV0b21hdGljYWxseSBwcm9jZXNzZXMgbWVudGlvbnNcclxuICAgKi9cclxuICBhc3luYyBlZGl0SW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbjogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBjb250ZW50Pzogc3RyaW5nO1xyXG4gICAgZW1iZWRzPzogQVBJRW1iZWRbXTtcclxuICAgIGNvbXBvbmVudHM/OiBhbnlbXTtcclxuICAgIG1lbnRpb25zPzogTWVudGlvbnNEYXRhO1xyXG4gICAgZmlsZXM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBjb250ZW50VHlwZT86IHN0cmluZyB9PjtcclxuICB9LCBndWlsZElkPzogc3RyaW5nLCBjaGFubmVsSWQ/OiBzdHJpbmcsIGludGVyYWN0aW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICBcclxuICAgIC8vIFByb2Nlc3MgbWVudGlvbnMgaW4gY29udGVudFxyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgXHJcbiAgICAvLyBJZiBmaWxlcyBhcmUgcHJlc2VudCBhbmQgd2UgaGF2ZSBndWlsZC9jaGFubmVsIGluZm8sIGNyZWF0ZSBtZXNzYWdlIHdpdGggZmlsZSBpbnN0ZWFkXHJcbiAgICBpZiAoZGF0YS5maWxlcyAmJiBkYXRhLmZpbGVzLmxlbmd0aCA+IDAgJiYgZ3VpbGRJZCAmJiBjaGFubmVsSWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtSRVNUXSBlZGl0SW50ZXJhY3Rpb25SZXNwb25zZSB3aXRoICR7ZGF0YS5maWxlcy5sZW5ndGh9IGZpbGVzIC0gdXNpbmcgY3JlYXRlTWVzc2FnZVdpdGhGaWxlYCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgbWVzc2FnZSB3aXRoIGZpbGVcclxuICAgICAgY29uc3QgZmlsZSA9IGRhdGEuZmlsZXNbMF07IC8vIEZvciBub3csIHN1cHBvcnQgc2luZ2xlIGZpbGVcclxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVNZXNzYWdlV2l0aEZpbGUoZ3VpbGRJZCwgY2hhbm5lbElkLCB7XHJcbiAgICAgICAgY29udGVudDogcHJvY2Vzc2VkRGF0YS5jb250ZW50LFxyXG4gICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgICAgICAgaW50ZXJhY3Rpb25JZDogaW50ZXJhY3Rpb25JZFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBJZiB3ZSBoYXZlIGd1aWxkSWQsIGNoYW5uZWxJZCBhbmQgaW50ZXJhY3Rpb25JZCwgY3JlYXRlIGEgbmV3IG1lc3NhZ2Ugd2l0aCBpbnRlcmFjdGlvbl9pZFxyXG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvdXIgZGVmZXJyZWQgcmVzcG9uc2UgZG9lc24ndCBjcmVhdGUgYSBtZXNzYWdlXHJcbiAgICBpZiAoZ3VpbGRJZCAmJiBjaGFubmVsSWQgJiYgaW50ZXJhY3Rpb25JZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1JFU1RdIGVkaXRJbnRlcmFjdGlvblJlc3BvbnNlIC0gY3JlYXRpbmcgbWVzc2FnZSB3aXRoIGludGVyYWN0aW9uX2lkOiAke2ludGVyYWN0aW9uSWR9YCk7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgICAgaW50ZXJhY3Rpb25faWQ6IGludGVyYWN0aW9uSWRcclxuICAgICAgfTtcclxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuY29udGVudCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmNvbnRlbnQgPSBwcm9jZXNzZWREYXRhLmNvbnRlbnQ7XHJcbiAgICAgIGlmIChwcm9jZXNzZWREYXRhLmVtYmVkcykgcGF5bG9hZC5lbWJlZHMgPSBwcm9jZXNzZWREYXRhLmVtYmVkcztcclxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuY29tcG9uZW50cykgcGF5bG9hZC5jb21wb25lbnRzID0gcHJvY2Vzc2VkRGF0YS5jb21wb25lbnRzO1xyXG4gICAgICBpZiAocHJvY2Vzc2VkRGF0YS5tZW50aW9ucykgcGF5bG9hZC5tZW50aW9ucyA9IHByb2Nlc3NlZERhdGEubWVudGlvbnM7XHJcbiAgICAgIFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXNgLCBwYXlsb2FkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGYWxsYmFjazogUmVndWxhciBlZGl0IHdpdGhvdXQgZmlsZXMgKHdlYmhvb2sgUEFUQ0gpXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7fTtcclxuICAgIGlmIChwcm9jZXNzZWREYXRhLmNvbnRlbnQgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5jb250ZW50ID0gcHJvY2Vzc2VkRGF0YS5jb250ZW50O1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEuZW1iZWRzKSBwYXlsb2FkLmVtYmVkcyA9IHByb2Nlc3NlZERhdGEuZW1iZWRzO1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEuY29tcG9uZW50cykgcGF5bG9hZC5jb21wb25lbnRzID0gcHJvY2Vzc2VkRGF0YS5jb21wb25lbnRzO1xyXG4gICAgaWYgKHByb2Nlc3NlZERhdGEubWVudGlvbnMpIHBheWxvYWQubWVudGlvbnMgPSBwcm9jZXNzZWREYXRhLm1lbnRpb25zO1xyXG4gICAgXHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ1BBVENIJywgYC9pbnRlcmFjdGlvbnMvd2ViaG9va3MvJHthcHBJZH0vJHt0b2tlbn0vbWVzc2FnZXMvQG9yaWdpbmFsYCwgcGF5bG9hZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uIHJlc3BvbnNlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdERUxFVEUnLCBgL2ludGVyYWN0aW9ucy93ZWJob29rcy8ke2FwcElkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWxgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGZvbGxvd3VwIG1lc3NhZ2VcclxuICAgKiBBdXRvbWF0aWNhbGx5IHByb2Nlc3NlcyBtZW50aW9uc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUZvbGxvd3VwKHRva2VuOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XHJcbiAgICBlbWJlZHM/OiBBUElFbWJlZFtdO1xyXG4gICAgbWVudGlvbnM/OiBNZW50aW9uc0RhdGE7XHJcbiAgICBmbGFncz86IG51bWJlcjtcclxuICB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJlcGFyZU1lc3NhZ2VEYXRhKGRhdGEpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9pbnRlcmFjdGlvbnMvd2ViaG9va3MvJHthcHBJZH0vJHt0b2tlbn1gLCBwcm9jZXNzZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENvbW1hbmRzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlZ2lzdGVyR2xvYmFsQ29tbWFuZHMoY29tbWFuZHM6IEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHNgLCBjb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRzXHJcbiAgICovXHJcbiAgYXN5bmMgcmVnaXN0ZXJHdWlsZENvbW1hbmRzKGd1aWxkSWQ6IHN0cmluZywgY29tbWFuZHM6IEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhcHBJZCA9IHRoaXMuZ2V0QXBwbGljYXRpb25JZCgpO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KCdQT1NUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgLCBjb21tYW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIGdsb2JhbCBjb21tYW5kXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlR2xvYmFsQ29tbWFuZChjb21tYW5kSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdDx2b2lkPignREVMRVRFJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYSBndWlsZC1zcGVjaWZpYyBjb21tYW5kXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlR3VpbGRDb21tYW5kKGd1aWxkSWQ6IHN0cmluZywgY29tbWFuZElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3Q8dm9pZD4oJ0RFTEVURScsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBhbGwgZ2xvYmFsIGNvbW1hbmRzIGZvciB0aGlzIGFwcGxpY2F0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdEdsb2JhbENvbW1hbmRzKCk6IFByb21pc2U8QVBJQXBwbGljYXRpb25Db21tYW5kW10+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZFtdPignR0VUJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vY29tbWFuZHNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3QgYWxsIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRzIGZvciB0aGlzIGFwcGxpY2F0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdEd1aWxkQ29tbWFuZHMoZ3VpbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmRbXT4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8QVBJQXBwbGljYXRpb25Db21tYW5kW10+KCdHRVQnLCBgL2FwcGxpY2F0aW9ucy8ke2FwcElkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgc3BlY2lmaWMgZ2xvYmFsIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyBnZXRHbG9iYWxDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ0dFVCcsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgc3BlY2lmaWMgZ3VpbGQgY29tbWFuZFxyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkQ29tbWFuZChndWlsZElkOiBzdHJpbmcsIGNvbW1hbmRJZDogc3RyaW5nKTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ0dFVCcsIGAvYXBwbGljYXRpb25zLyR7YXBwSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGEgZ2xvYmFsIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVHbG9iYWxDb21tYW5kKGNvbW1hbmRJZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4pOiBQcm9taXNlPEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4ge1xyXG4gICAgY29uc3QgYXBwSWQgPSB0aGlzLmdldEFwcGxpY2F0aW9uSWQoKTtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8QVBJQXBwbGljYXRpb25Db21tYW5kPignUEFUQ0gnLCBgL2FwcGxpY2F0aW9ucy8ke2FwcElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhIGd1aWxkLXNwZWNpZmljIGNvbW1hbmRcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVHdWlsZENvbW1hbmQoZ3VpbGRJZDogc3RyaW5nLCBjb21tYW5kSWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+KTogUHJvbWlzZTxBUElBcHBsaWNhdGlvbkNvbW1hbmQ+IHtcclxuICAgIGNvbnN0IGFwcElkID0gdGhpcy5nZXRBcHBsaWNhdGlvbklkKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PEFQSUFwcGxpY2F0aW9uQ29tbWFuZD4oJ1BBVENIJywgYC9hcHBsaWNhdGlvbnMvJHthcHBJZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9YCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBIZWxwZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIHByaXZhdGUgYXBwbGljYXRpb25JZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgYXBwbGljYXRpb24gSURcclxuICAgKi9cclxuICBzZXRBcHBsaWNhdGlvbklkKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBJRFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QXBwbGljYXRpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvbiBJRCBub3Qgc2V0LiBDYWxsIHNldEFwcGxpY2F0aW9uSWQoKSBmaXJzdC4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFwcGxpY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBDaGFubmVscyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBjaGFubmVsIGluIGEgZ3VpbGRcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZT86IG51bWJlcjtcclxuICAgIHBhcmVudF9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBwZXJtaXNzaW9uX292ZXJ3cml0ZXM/OiBBcnJheTx7XHJcbiAgICAgIGlkOiBzdHJpbmc7XHJcbiAgICAgIHR5cGU6IG51bWJlcjtcclxuICAgICAgYWxsb3c/OiBzdHJpbmc7XHJcbiAgICAgIGRlbnk/OiBzdHJpbmc7XHJcbiAgICB9PjtcclxuICB9KTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PiB7XHJcbiAgICAvLyBNYXAgcGFyZW50X2lkIHRvIGNhdGVnb3J5X2lkIGZvciBiYWNrZW5kIGNvbXBhdGliaWxpdHlcclxuICAgIGNvbnN0IHJlcXVlc3REYXRhOiBhbnkgPSB7XHJcbiAgICAgIG5hbWU6IGRhdGEubmFtZSxcclxuICAgICAgdHlwZTogZGF0YS50eXBlID8/IDAsIC8vIERlZmF1bHQgdG8gdGV4dCBjaGFubmVsXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBCYWNrZW5kIGV4cGVjdHMgY2F0ZWdvcnlfaWQsIG5vdCBwYXJlbnRfaWRcclxuICAgIGlmIChkYXRhLmNhdGVnb3J5X2lkKSB7XHJcbiAgICAgIHJlcXVlc3REYXRhLmNhdGVnb3J5X2lkID0gZGF0YS5jYXRlZ29yeV9pZDtcclxuICAgIH0gZWxzZSBpZiAoZGF0YS5wYXJlbnRfaWQpIHtcclxuICAgICAgcmVxdWVzdERhdGEuY2F0ZWdvcnlfaWQgPSBkYXRhLnBhcmVudF9pZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIHBlcm1pc3Npb25fb3ZlcndyaXRlcyBpZiBwcm92aWRlZFxyXG4gICAgaWYgKGRhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzICYmIGRhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmVxdWVzdERhdGEucGVybWlzc2lvbl9vdmVyd3JpdGVzID0gZGF0YS5wZXJtaXNzaW9uX292ZXJ3cml0ZXM7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2AsIHJlcXVlc3REYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIGNoYW5uZWxcclxuICAgKi9cclxuICAvKipcclxuICAgKiBEZWxldGUgYSBjaGFubmVsXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlQ2hhbm5lbChndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgY2F0ZWdvcnlcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVDYXRlZ29yeShndWlsZElkOiBzdHJpbmcsIGNhdGVnb3J5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnlJZH1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVkaXQgY2hhbm5lbCBwZXJtaXNzaW9uIG92ZXJ3cml0ZXNcclxuICAgKi9cclxuICBhc3luYyBlZGl0Q2hhbm5lbFBlcm1pc3Npb25zKGNoYW5uZWxJZDogc3RyaW5nLCBvdmVyd3JpdGVJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICB0eXBlOiBudW1iZXI7XHJcbiAgICBhbGxvdz86IHN0cmluZztcclxuICAgIGRlbnk/OiBzdHJpbmc7XHJcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdQVVQnLCBgL2JvdC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGVybWlzc2lvbnMvJHtvdmVyd3JpdGVJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBjaGFubmVsIHBlcm1pc3Npb24gb3ZlcndyaXRlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb24oY2hhbm5lbElkOiBzdHJpbmcsIG92ZXJ3cml0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3Blcm1pc3Npb25zLyR7b3ZlcndyaXRlSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbWVzc2FnZXMgZnJvbSBhIGNoYW5uZWxcclxuICAgKi9cclxuICBhc3luYyBnZXRNZXNzYWdlcyhndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBvcHRpb25zPzoge1xyXG4gICAgbGltaXQ/OiBudW1iZXI7XHJcbiAgICBiZWZvcmU/OiBzdHJpbmc7XHJcbiAgICBhZnRlcj86IHN0cmluZztcclxuICB9KTogUHJvbWlzZTxBUElNZXNzYWdlW10+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5saW1pdCkgcGFyYW1zLmFwcGVuZCgnbGltaXQnLCBTdHJpbmcob3B0aW9ucy5saW1pdCkpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmJlZm9yZSkgcGFyYW1zLmFwcGVuZCgnYmVmb3JlJywgb3B0aW9ucy5iZWZvcmUpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmFmdGVyKSBwYXJhbXMuYXBwZW5kKCdhZnRlcicsIG9wdGlvbnMuYWZ0ZXIpO1xyXG4gICAgXHJcbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpID8gYD8ke3BhcmFtcy50b1N0cmluZygpfWAgOiAnJztcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0PHsgbWVzc2FnZXM6IEFQSU1lc3NhZ2VbXTsgcGFnZV9pbmZvOiBhbnkgfT4oJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcyR7cXVlcnl9YCk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBNZW1iZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIGd1aWxkIG1lbWJlclxyXG4gICAqL1xyXG4gIGFzeW5jIGdldE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaW1lb3V0IGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgdGltZW91dE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyIHwgbnVsbCwgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZHVyYXRpb24gPT09IG51bGwpIHtcclxuICAgICAgLy8gQ2xlYXIgdGltZW91dFxyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfS90aW1lb3V0L2NsZWFyYCwge1xyXG4gICAgICAgIHJlYXNvblxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFNldCB0aW1lb3V0XHJcbiAgICAgIGNvbnN0IHVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGR1cmF0aW9uKS50b0lTT1N0cmluZygpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BPU1QnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfS90aW1lb3V0YCwge1xyXG4gICAgICAgIHVudGlsLFxyXG4gICAgICAgIHJlYXNvblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtpY2sgYSBndWlsZCBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyBraWNrTWVtYmVyKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSByZWFzb24gPyBgP3JlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudChyZWFzb24pfWAgOiAnJztcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH0ke3F1ZXJ5fWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFuIGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiB7XHJcbiAgICBkZWxldGVNZXNzYWdlRGF5cz86IG51bWJlcjtcclxuICAgIGRlbGV0ZU1lc3NhZ2VTZWNvbmRzPzogbnVtYmVyO1xyXG4gICAgcmVhc29uPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnUFVUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vYmFucy8ke3VzZXJJZH1gLCB7XHJcbiAgICAgIGRlbGV0ZV9tZXNzYWdlX2RheXM6IG9wdGlvbnM/LmRlbGV0ZU1lc3NhZ2VEYXlzLFxyXG4gICAgICBkZWxldGVfbWVzc2FnZV9zZWNvbmRzOiBvcHRpb25zPy5kZWxldGVNZXNzYWdlU2Vjb25kcyxcclxuICAgICAgcmVhc29uOiBvcHRpb25zPy5yZWFzb25cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5iYW4gYSB1c2VyXHJcbiAgICovXHJcbiAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWVyeSA9IHJlYXNvbiA/IGA/cmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlYXNvbil9YCA6ICcnO1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgZ3VpbGQgbWVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBkYXRhOiB7XHJcbiAgICBuaWNrPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJvbGVzPzogc3RyaW5nW107XHJcbiAgICBtdXRlPzogYm9vbGVhbjtcclxuICAgIGRlYWY/OiBib29sZWFuO1xyXG4gICAgY2hhbm5lbF9pZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjb21tdW5pY2F0aW9uX2Rpc2FibGVkX3VudGlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYXNvbj86IHN0cmluZztcclxuICB9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHJvbGUgdG8gYSBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyBhZGRNZW1iZXJSb2xlKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJvbGVJZDogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVhc29uID8gYD9yZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQocmVhc29uKX1gIDogJyc7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9L3JvbGVzLyR7cm9sZUlkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYSByb2xlIGZyb20gYSBtZW1iZXJcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVNZW1iZXJSb2xlKGd1aWxkSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHJvbGVJZDogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gcmVhc29uID8gYD9yZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQocmVhc29uKX1gIDogJyc7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvJHt1c2VySWR9L3JvbGVzLyR7cm9sZUlkfSR7cXVlcnl9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWxrIGFzc2lnbiByb2xlcyB0byBtZW1iZXJzXHJcbiAgICovXHJcbiAgYXN5bmMgYnVsa0Fzc2lnblJvbGVzKGd1aWxkSWQ6IHN0cmluZywgYXNzaWdubWVudHM6IHsgdXNlcl9pZDogc3RyaW5nOyByb2xlX2lkczogc3RyaW5nW10gfVtdKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvcm9sZXMvYXNzaWduYCwgeyBhc3NpZ25tZW50cyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1bGsgcmVtb3ZlIHJvbGVzIGZyb20gbWVtYmVyc1xyXG4gICAqL1xyXG4gIGFzeW5jIGJ1bGtSZW1vdmVSb2xlcyhndWlsZElkOiBzdHJpbmcsIHJlbW92YWxzOiB7IHVzZXJfaWQ6IHN0cmluZzsgcm9sZV9pZHM6IHN0cmluZ1tdIH1bXSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL3JvbGVzL3JlbW92ZWAsIHsgcmVtb3ZhbHMgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWxrIGRlbGV0ZSBtZXNzYWdlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGJ1bGtEZWxldGVNZXNzYWdlcyhndWlsZElkOiBzdHJpbmcsIGNoYW5uZWxJZDogc3RyaW5nLCBtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdQT1NUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzL2J1bGstZGVsZXRlYCwge1xyXG4gICAgICBtZXNzYWdlczogbWVzc2FnZUlkc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBHdWlsZHMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZ3VpbGRcclxuICAgKi9cclxuICBhc3luYyBnZXRHdWlsZChndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBndWlsZCBjaGFubmVsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkQ2hhbm5lbHMoZ3VpbGRJZDogc3RyaW5nKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBndWlsZCByb2xlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3JvbGVzYCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSByb2xlXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2xvcj86IG51bWJlcjtcclxuICAgIGhvaXN0PzogYm9vbGVhbjtcclxuICAgIG1lbnRpb25hYmxlPzogYm9vbGVhbjtcclxuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3JvbGVzYCwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZGl0IGEgcm9sZVxyXG4gICAqL1xyXG4gIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQ6IHN0cmluZywgcm9sZUlkOiBzdHJpbmcsIGRhdGE6IHtcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICBjb2xvcj86IG51bWJlcjtcclxuICAgIGhvaXN0PzogYm9vbGVhbjtcclxuICAgIG1lbnRpb25hYmxlPzogYm9vbGVhbjtcclxuICAgIHBlcm1pc3Npb25zPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9yb2xlcy8ke3JvbGVJZH1gLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIHJvbGVcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQ6IHN0cmluZywgcm9sZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXMvJHtyb2xlSWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZ3VpbGQgZW1vamlzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2Vtb2ppc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGd1aWxkIGJhbnNcclxuICAgKi9cclxuICBhc3luYyBnZXRCYW5zKGd1aWxkSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2JhbnNgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHNwZWNpZmljIGJhblxyXG4gICAqL1xyXG4gIGFzeW5jIGdldEJhbihndWlsZElkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2JhbnMvJHt1c2VySWR9YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZ3VpbGQgaW52aXRlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldEd1aWxkSW52aXRlcyhndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS9pbnZpdGVzYCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBQaW5zID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIFBpbiBhIG1lc3NhZ2VcclxuICAgKi9cclxuICBhc3luYyBwaW5NZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ1BVVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9waW5zLyR7bWVzc2FnZUlkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5waW4gYSBtZXNzYWdlXHJcbiAgICovXHJcbiAgYXN5bmMgdW5waW5NZXNzYWdlKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9waW5zLyR7bWVzc2FnZUlkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHBpbm5lZCBtZXNzYWdlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGd1aWxkSWQ6IHN0cmluZywgY2hhbm5lbElkOiBzdHJpbmcpOiBQcm9taXNlPEFQSU1lc3NhZ2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vY2hhbm5lbHMvJHtjaGFubmVsSWR9L3BpbnNgKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFVzZXJzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHVzZXJcclxuICAgKi9cclxuICBhc3luYyBnZXRVc2VyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L3VzZXJzLyR7dXNlcklkfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGN1cnJlbnQgYm90IHVzZXJcclxuICAgKi9cclxuICBhc3luYyBnZXRDdXJyZW50VXNlcigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgYC9ib3QvdXNlcnMvQG1lYCk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBJbnZpdGVzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnZpdGVcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVJbnZpdGUoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YT86IHtcclxuICAgIG1heF9hZ2U/OiBudW1iZXI7XHJcbiAgICBtYXhfdXNlcz86IG51bWJlcjtcclxuICAgIHRlbXBvcmFyeT86IGJvb2xlYW47XHJcbiAgICB1bmlxdWU/OiBib29sZWFuO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYCwgZGF0YSB8fCB7fSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYW4gaW52aXRlXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCBgL2JvdC9pbnZpdGVzLyR7aW52aXRlQ29kZX1gKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpbnZpdGVcclxuICAgKi9cclxuICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2ludml0ZXMvJHtpbnZpdGVDb2RlfWApO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gV2ViaG9va3MgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNoYW5uZWwgd2ViaG9va3NcclxuICAgKi9cclxuICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGd1aWxkIHdlYmhvb2tzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdHRVQnLCBgL2JvdC9ndWlsZHMvJHtndWlsZElkfS93ZWJob29rc2ApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCBjaGFubmVsSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYXZhdGFyPzogc3RyaW5nO1xyXG4gIH0pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUE9TVCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzLyR7Y2hhbm5lbElkfS93ZWJob29rc2AsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCB3ZWJob29rSWQ6IHN0cmluZywgZGF0YToge1xyXG4gICAgbmFtZT86IHN0cmluZztcclxuICAgIGF2YXRhcl91cmw/OiBzdHJpbmc7XHJcbiAgfSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQQVRDSCcsIGAvYm90L2d1aWxkcy8ke2d1aWxkSWR9L3dlYmhvb2tzLyR7d2ViaG9va0lkfWAsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgd2ViaG9va1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZVdlYmhvb2soZ3VpbGRJZDogc3RyaW5nLCB3ZWJob29rSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnREVMRVRFJywgYC9ib3QvZ3VpbGRzLyR7Z3VpbGRJZH0vd2ViaG9va3MvJHt3ZWJob29rSWR9YCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|