@discordeno/rest 21.0.1-next.f6ea699 → 22.0.1-next.269a5bf
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/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/invalidBucket.d.ts.map +1 -0
- package/dist/invalidBucket.js +82 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +1623 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +154 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +621 -0
- package/dist/{types/types.d.ts → types.d.ts} +9 -7
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/{types/typings → typings}/routes.d.ts +3 -3
- package/dist/typings/routes.d.ts.map +1 -0
- package/dist/typings/routes.js +3 -0
- package/package.json +14 -21
- package/dist/cjs/index.cjs +0 -25
- package/dist/cjs/invalidBucket.cjs +0 -86
- package/dist/cjs/manager.cjs +0 -1643
- package/dist/cjs/queue.cjs +0 -164
- package/dist/cjs/routes.cjs +0 -630
- package/dist/cjs/types.cjs +0 -6
- package/dist/cjs/typings/routes.cjs +0 -6
- package/dist/esm/index.js +0 -8
- package/dist/esm/invalidBucket.js +0 -82
- package/dist/esm/manager.js +0 -1601
- package/dist/esm/queue.js +0 -154
- package/dist/esm/routes.js +0 -620
- package/dist/esm/types.js +0 -3
- package/dist/esm/typings/routes.js +0 -3
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/invalidBucket.d.ts.map +0 -1
- package/dist/types/manager.d.ts.map +0 -1
- package/dist/types/queue.d.ts.map +0 -1
- package/dist/types/routes.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/typings/routes.d.ts.map +0 -1
- /package/dist/{types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{types/invalidBucket.d.ts → invalidBucket.d.ts} +0 -0
- /package/dist/{types/manager.d.ts → manager.d.ts} +0 -0
- /package/dist/{types/queue.d.ts → queue.d.ts} +0 -0
- /package/dist/{types/routes.d.ts → routes.d.ts} +0 -0
package/dist/esm/manager.js
DELETED
|
@@ -1,1601 +0,0 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
|
-
import { inspect } from 'node:util';
|
|
3
|
-
import { calculateBits, camelize, camelToSnakeCase, DISCORDENO_VERSION, delay, getBotIdFromToken, hasProperty, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
|
|
4
|
-
import { createInvalidRequestBucket } from './invalidBucket.js';
|
|
5
|
-
import { Queue } from './queue.js';
|
|
6
|
-
import { createRoutes } from './routes.js';
|
|
7
|
-
export const DISCORD_API_VERSION = 10;
|
|
8
|
-
export const DISCORD_API_URL = 'https://discord.com/api';
|
|
9
|
-
export const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
|
|
10
|
-
export const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
|
|
11
|
-
export const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
|
|
12
|
-
export const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
|
|
13
|
-
export const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
|
|
14
|
-
export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
|
|
15
|
-
export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
|
|
16
|
-
export function createRestManager(options) {
|
|
17
|
-
const applicationId = options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token);
|
|
18
|
-
const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
|
|
19
|
-
// Discord error can get nested a lot, so we use a custom inspect to change the depth to Infinity
|
|
20
|
-
const baseErrorPrototype = {
|
|
21
|
-
[inspect.custom] (_depth, options, _inspect) {
|
|
22
|
-
return _inspect(this, {
|
|
23
|
-
...options,
|
|
24
|
-
depth: Infinity,
|
|
25
|
-
// Since we call inspect on ourself, we need to disable the calls to the inspect.custom symbol or else it will cause an infinite loop.
|
|
26
|
-
customInspect: false
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
const rest = {
|
|
31
|
-
applicationId,
|
|
32
|
-
authorization: options.proxy?.authorization,
|
|
33
|
-
authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
|
|
34
|
-
baseUrl,
|
|
35
|
-
deleteQueueDelay: 60000,
|
|
36
|
-
globallyRateLimited: false,
|
|
37
|
-
invalidBucket: createInvalidRequestBucket({
|
|
38
|
-
logger: options.logger
|
|
39
|
-
}),
|
|
40
|
-
isProxied: !baseUrl.startsWith(DISCORD_API_URL),
|
|
41
|
-
updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
|
|
42
|
-
maxRetryCount: Infinity,
|
|
43
|
-
processingRateLimitedPaths: false,
|
|
44
|
-
queues: new Map(),
|
|
45
|
-
rateLimitedPaths: new Map(),
|
|
46
|
-
token: options.token,
|
|
47
|
-
version: options.version ?? DISCORD_API_VERSION,
|
|
48
|
-
logger: options.logger ?? logger,
|
|
49
|
-
events: {
|
|
50
|
-
request: ()=>{},
|
|
51
|
-
response: ()=>{},
|
|
52
|
-
requestError: ()=>{},
|
|
53
|
-
...options.events
|
|
54
|
-
},
|
|
55
|
-
routes: createRoutes(),
|
|
56
|
-
createBaseHeaders () {
|
|
57
|
-
return {
|
|
58
|
-
'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`
|
|
59
|
-
};
|
|
60
|
-
},
|
|
61
|
-
checkRateLimits (url, identifier) {
|
|
62
|
-
const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
|
|
63
|
-
const global = rest.rateLimitedPaths.get('global');
|
|
64
|
-
const now = Date.now();
|
|
65
|
-
if (ratelimited && now < ratelimited.resetTimestamp) {
|
|
66
|
-
return ratelimited.resetTimestamp - now;
|
|
67
|
-
}
|
|
68
|
-
if (global && now < global.resetTimestamp) {
|
|
69
|
-
return global.resetTimestamp - now;
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
},
|
|
73
|
-
async updateTokenQueues (oldToken, newToken) {
|
|
74
|
-
if (rest.isProxied) {
|
|
75
|
-
if (!rest.updateBearerTokenEndpoint) {
|
|
76
|
-
throw new Error("The 'proxy.updateBearerTokenEndpoint' option needs to be set when using a rest proxy and needed to call 'updateTokenQueues'");
|
|
77
|
-
}
|
|
78
|
-
const headers = {
|
|
79
|
-
'content-type': 'application/json'
|
|
80
|
-
};
|
|
81
|
-
if (rest.authorization !== undefined) {
|
|
82
|
-
headers[rest.authorizationHeader] = rest.authorization;
|
|
83
|
-
}
|
|
84
|
-
await fetch(`${rest.baseUrl}/${rest.updateBearerTokenEndpoint}`, {
|
|
85
|
-
method: 'POST',
|
|
86
|
-
body: JSON.stringify({
|
|
87
|
-
oldToken,
|
|
88
|
-
newToken
|
|
89
|
-
}),
|
|
90
|
-
headers
|
|
91
|
-
});
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const newIdentifier = `Bearer ${newToken}`;
|
|
95
|
-
// Update all the queues
|
|
96
|
-
for (const [key, queue] of rest.queues.entries()){
|
|
97
|
-
if (!key.startsWith(`Bearer ${oldToken}`)) continue;
|
|
98
|
-
rest.queues.delete(key);
|
|
99
|
-
queue.identifier = newIdentifier;
|
|
100
|
-
const newKey = `${newIdentifier}${queue.url}`;
|
|
101
|
-
const newQueue = rest.queues.get(newKey);
|
|
102
|
-
// Merge the queues
|
|
103
|
-
if (newQueue) {
|
|
104
|
-
newQueue.waiting.unshift(...queue.waiting);
|
|
105
|
-
newQueue.pending.unshift(...queue.pending);
|
|
106
|
-
queue.waiting = [];
|
|
107
|
-
queue.pending = [];
|
|
108
|
-
queue.cleanup();
|
|
109
|
-
} else {
|
|
110
|
-
rest.queues.set(newKey, queue);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
for (const [key, ratelimitPath] of rest.rateLimitedPaths.entries()){
|
|
114
|
-
if (!key.startsWith(`Bearer ${oldToken}`)) continue;
|
|
115
|
-
rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.url}`, ratelimitPath);
|
|
116
|
-
if (ratelimitPath.bucketId) {
|
|
117
|
-
rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.bucketId}`, ratelimitPath);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
changeToDiscordFormat (obj) {
|
|
122
|
-
if (obj === null) return null;
|
|
123
|
-
if (typeof obj === 'object') {
|
|
124
|
-
if (Array.isArray(obj)) {
|
|
125
|
-
return obj.map((item)=>rest.changeToDiscordFormat(item));
|
|
126
|
-
}
|
|
127
|
-
const newObj = {};
|
|
128
|
-
for (const key of Object.keys(obj)){
|
|
129
|
-
const value = obj[key];
|
|
130
|
-
// If the key is already in snake_case we can assume it is already in the discord format.
|
|
131
|
-
if (key.includes('_')) {
|
|
132
|
-
newObj[key] = value;
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
// Some falsy values should be allowed like null or 0
|
|
136
|
-
if (value !== undefined) {
|
|
137
|
-
switch(key){
|
|
138
|
-
case 'permissions':
|
|
139
|
-
case 'allow':
|
|
140
|
-
case 'deny':
|
|
141
|
-
newObj[key] = typeof value === 'string' ? value : calculateBits(value);
|
|
142
|
-
continue;
|
|
143
|
-
case 'defaultMemberPermissions':
|
|
144
|
-
newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
|
|
145
|
-
continue;
|
|
146
|
-
case 'nameLocalizations':
|
|
147
|
-
newObj.name_localizations = value;
|
|
148
|
-
continue;
|
|
149
|
-
case 'descriptionLocalizations':
|
|
150
|
-
newObj.description_localizations = value;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(value);
|
|
155
|
-
}
|
|
156
|
-
return newObj;
|
|
157
|
-
}
|
|
158
|
-
if (typeof obj === 'bigint') return obj.toString();
|
|
159
|
-
return obj;
|
|
160
|
-
},
|
|
161
|
-
createRequestBody (method, options) {
|
|
162
|
-
const headers = this.createBaseHeaders();
|
|
163
|
-
if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
|
|
164
|
-
// IF A REASON IS PROVIDED ENCODE IT IN HEADERS
|
|
165
|
-
if (options?.reason !== undefined) {
|
|
166
|
-
headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
|
|
167
|
-
}
|
|
168
|
-
let body;
|
|
169
|
-
// TODO: check if we need to add specific check for GET method
|
|
170
|
-
// Since GET does not allow bodies
|
|
171
|
-
// Have to check for attachments first, since body then has to be send in a different way.
|
|
172
|
-
if (options?.files !== undefined) {
|
|
173
|
-
const form = new FormData();
|
|
174
|
-
for(let i = 0; i < options.files.length; ++i){
|
|
175
|
-
form.append(`files[${i}]`, options.files[i].blob, options.files[i].name);
|
|
176
|
-
}
|
|
177
|
-
// Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
|
|
178
|
-
form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
|
|
179
|
-
...options.body,
|
|
180
|
-
files: undefined
|
|
181
|
-
})));
|
|
182
|
-
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
183
|
-
body = form;
|
|
184
|
-
} else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
|
|
185
|
-
// OAuth2 body handling
|
|
186
|
-
const formBody = [];
|
|
187
|
-
const discordBody = rest.changeToDiscordFormat(options.body);
|
|
188
|
-
for(const prop in discordBody){
|
|
189
|
-
formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
|
|
190
|
-
}
|
|
191
|
-
body = formBody.join('&');
|
|
192
|
-
} else if (options?.body !== undefined) {
|
|
193
|
-
if (options.body instanceof FormData) {
|
|
194
|
-
body = options.body;
|
|
195
|
-
// No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
|
|
196
|
-
} else {
|
|
197
|
-
body = JSON.stringify(rest.changeToDiscordFormat(options.body));
|
|
198
|
-
headers['content-type'] = `application/json`;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
|
|
202
|
-
if (options?.headers) {
|
|
203
|
-
Object.assign(headers, options.headers);
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
body,
|
|
207
|
-
headers,
|
|
208
|
-
method
|
|
209
|
-
};
|
|
210
|
-
},
|
|
211
|
-
processRateLimitedPaths () {
|
|
212
|
-
const now = Date.now();
|
|
213
|
-
for (const [key, value] of rest.rateLimitedPaths.entries()){
|
|
214
|
-
// rest.debug(
|
|
215
|
-
// `[REST - processRateLimitedPaths] Running for of loop. ${
|
|
216
|
-
// value.resetTimestamp - now
|
|
217
|
-
// }`
|
|
218
|
-
// )
|
|
219
|
-
// If the time has not reached cancel
|
|
220
|
-
if (value.resetTimestamp > now) continue;
|
|
221
|
-
// Rate limit is over, delete the rate limiter
|
|
222
|
-
rest.rateLimitedPaths.delete(key);
|
|
223
|
-
// If it was global, also mark the global value as false
|
|
224
|
-
if (key === 'global') rest.globallyRateLimited = false;
|
|
225
|
-
}
|
|
226
|
-
// ALL PATHS ARE CLEARED CAN CANCEL OUT!
|
|
227
|
-
if (rest.rateLimitedPaths.size === 0) {
|
|
228
|
-
rest.processingRateLimitedPaths = false;
|
|
229
|
-
} else {
|
|
230
|
-
rest.processingRateLimitedPaths = true;
|
|
231
|
-
// RECHECK IN 1 SECOND
|
|
232
|
-
setTimeout(()=>{
|
|
233
|
-
// rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
|
|
234
|
-
rest.processRateLimitedPaths();
|
|
235
|
-
}, 1000);
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
|
-
/** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, identifier) {
|
|
239
|
-
let rateLimited = false;
|
|
240
|
-
// GET ALL NECESSARY HEADERS
|
|
241
|
-
const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
|
|
242
|
-
const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
243
|
-
const reset = Date.now() + Number(retryAfter) * 1000;
|
|
244
|
-
const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
|
|
245
|
-
// undefined override null needed for typings
|
|
246
|
-
const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
|
|
247
|
-
const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
|
|
248
|
-
// If we didn't received the identifier, fallback to the bot token
|
|
249
|
-
identifier ??= `Bot ${rest.token}`;
|
|
250
|
-
rest.queues.get(`${identifier}${url}`)?.handleCompletedRequest({
|
|
251
|
-
remaining: remaining ? Number(remaining) : undefined,
|
|
252
|
-
interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
|
|
253
|
-
max: limit ? Number(limit) : undefined
|
|
254
|
-
});
|
|
255
|
-
// IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
|
|
256
|
-
if (remaining === '0') {
|
|
257
|
-
rateLimited = true;
|
|
258
|
-
// SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
|
|
259
|
-
rest.rateLimitedPaths.set(`${identifier}${url}`, {
|
|
260
|
-
url,
|
|
261
|
-
resetTimestamp: reset,
|
|
262
|
-
bucketId
|
|
263
|
-
});
|
|
264
|
-
// SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
|
|
265
|
-
if (bucketId) {
|
|
266
|
-
rest.rateLimitedPaths.set(`${identifier}${bucketId}`, {
|
|
267
|
-
url,
|
|
268
|
-
resetTimestamp: reset,
|
|
269
|
-
bucketId
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
|
|
274
|
-
if (global) {
|
|
275
|
-
const retryAfter = Number(headers.get('retry-after')) * 1000;
|
|
276
|
-
const globalReset = Date.now() + retryAfter;
|
|
277
|
-
// rest.debug(
|
|
278
|
-
// `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
|
|
279
|
-
// )
|
|
280
|
-
rest.globallyRateLimited = true;
|
|
281
|
-
rateLimited = true;
|
|
282
|
-
setTimeout(()=>{
|
|
283
|
-
rest.globallyRateLimited = false;
|
|
284
|
-
}, retryAfter);
|
|
285
|
-
rest.rateLimitedPaths.set('global', {
|
|
286
|
-
url: 'global',
|
|
287
|
-
resetTimestamp: globalReset,
|
|
288
|
-
bucketId
|
|
289
|
-
});
|
|
290
|
-
if (bucketId) {
|
|
291
|
-
rest.rateLimitedPaths.set(identifier, {
|
|
292
|
-
url: 'global',
|
|
293
|
-
resetTimestamp: globalReset,
|
|
294
|
-
bucketId
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (rateLimited && !rest.processingRateLimitedPaths) {
|
|
299
|
-
rest.processRateLimitedPaths();
|
|
300
|
-
}
|
|
301
|
-
return rateLimited ? bucketId : undefined;
|
|
302
|
-
},
|
|
303
|
-
async sendRequest (options) {
|
|
304
|
-
const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
|
|
305
|
-
const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
|
|
306
|
-
const loggingHeaders = {
|
|
307
|
-
...payload.headers
|
|
308
|
-
};
|
|
309
|
-
if (payload.headers.authorization) {
|
|
310
|
-
const authorizationScheme = payload.headers.authorization?.split(' ')[0];
|
|
311
|
-
loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
|
|
312
|
-
}
|
|
313
|
-
const request = new Request(url, payload);
|
|
314
|
-
rest.events.request(request, {
|
|
315
|
-
body: options.requestBodyOptions?.body
|
|
316
|
-
});
|
|
317
|
-
rest.logger.debug(`sending request to ${url}`, 'with payload:', {
|
|
318
|
-
...payload,
|
|
319
|
-
headers: loggingHeaders
|
|
320
|
-
});
|
|
321
|
-
const response = await fetch(request).catch(async (error)=>{
|
|
322
|
-
rest.logger.error(error);
|
|
323
|
-
rest.events.requestError(request, error, {
|
|
324
|
-
body: options.requestBodyOptions?.body
|
|
325
|
-
});
|
|
326
|
-
// Mark request as completed
|
|
327
|
-
rest.invalidBucket.handleCompletedRequest(999, false);
|
|
328
|
-
options.reject({
|
|
329
|
-
ok: false,
|
|
330
|
-
status: 999,
|
|
331
|
-
error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
|
|
332
|
-
});
|
|
333
|
-
throw error;
|
|
334
|
-
});
|
|
335
|
-
rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
|
|
336
|
-
// Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
|
|
337
|
-
const body = await (response.headers.get('Content-Type')?.startsWith('application/json') ? response.json() : response.text()).catch(()=>null);
|
|
338
|
-
rest.events.response(request, response, {
|
|
339
|
-
requestBody: options.requestBodyOptions?.body,
|
|
340
|
-
responseBody: body
|
|
341
|
-
});
|
|
342
|
-
// Mark request as completed
|
|
343
|
-
rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
|
|
344
|
-
// Set the bucket id if it was available on the headers
|
|
345
|
-
const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
|
|
346
|
-
if (bucketId) options.bucketId = bucketId;
|
|
347
|
-
if (response.status < 200 || response.status >= 400) {
|
|
348
|
-
rest.logger.debug(`Request to ${url} failed.`);
|
|
349
|
-
if (response.status !== 429) {
|
|
350
|
-
options.reject({
|
|
351
|
-
ok: false,
|
|
352
|
-
status: response.status,
|
|
353
|
-
statusText: response.statusText,
|
|
354
|
-
body
|
|
355
|
-
});
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
rest.logger.debug(`Request to ${url} was ratelimited.`);
|
|
359
|
-
// Too many attempts, get rid of request from queue.
|
|
360
|
-
if (options.retryCount >= rest.maxRetryCount) {
|
|
361
|
-
rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
|
|
362
|
-
// rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
|
|
363
|
-
options.reject({
|
|
364
|
-
ok: false,
|
|
365
|
-
status: response.status,
|
|
366
|
-
statusText: response.statusText,
|
|
367
|
-
error: 'The request was rate limited and it maxed out the retries limit.'
|
|
368
|
-
});
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
options.retryCount += 1;
|
|
372
|
-
const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
373
|
-
if (resetAfter) await delay(Number(resetAfter) * 1000);
|
|
374
|
-
return await options.retryRequest?.(options);
|
|
375
|
-
}
|
|
376
|
-
// Discord sometimes sends a response with no content
|
|
377
|
-
options.resolve({
|
|
378
|
-
ok: true,
|
|
379
|
-
status: response.status,
|
|
380
|
-
body: response.status === 204 ? undefined : body
|
|
381
|
-
});
|
|
382
|
-
},
|
|
383
|
-
simplifyUrl (url, method) {
|
|
384
|
-
const parts = url.split('/');
|
|
385
|
-
const secondLastPart = parts[parts.length - 2];
|
|
386
|
-
if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
|
|
387
|
-
return url;
|
|
388
|
-
}
|
|
389
|
-
if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
|
|
390
|
-
parts.splice(-2);
|
|
391
|
-
parts.push('reactions');
|
|
392
|
-
} else {
|
|
393
|
-
parts.splice(-1);
|
|
394
|
-
parts.push('x');
|
|
395
|
-
}
|
|
396
|
-
if (parts[parts.length - 3] === 'reactions') {
|
|
397
|
-
parts.splice(-2);
|
|
398
|
-
}
|
|
399
|
-
if (method === 'DELETE' && secondLastPart === 'messages') {
|
|
400
|
-
return `D${parts.join('/')}`;
|
|
401
|
-
}
|
|
402
|
-
return parts.join('/');
|
|
403
|
-
},
|
|
404
|
-
async processRequest (request) {
|
|
405
|
-
const url = rest.simplifyUrl(request.route, request.method);
|
|
406
|
-
if (request.runThroughQueue === false) {
|
|
407
|
-
await rest.sendRequest(request);
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
// If we the request has a token, use it
|
|
411
|
-
// Else fallback to prefix with the bot token
|
|
412
|
-
const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
|
|
413
|
-
const queue = rest.queues.get(`${queueIdentifier}${url}`);
|
|
414
|
-
if (queue !== undefined) {
|
|
415
|
-
queue.makeRequest(request);
|
|
416
|
-
} else {
|
|
417
|
-
// CREATES A NEW QUEUE
|
|
418
|
-
const bucketQueue = new Queue(rest, {
|
|
419
|
-
url,
|
|
420
|
-
deleteQueueDelay: rest.deleteQueueDelay,
|
|
421
|
-
identifier: queueIdentifier
|
|
422
|
-
});
|
|
423
|
-
// Save queue
|
|
424
|
-
rest.queues.set(`${queueIdentifier}${url}`, bucketQueue);
|
|
425
|
-
// Add request to queue
|
|
426
|
-
bucketQueue.makeRequest(request);
|
|
427
|
-
}
|
|
428
|
-
},
|
|
429
|
-
async makeRequest (method, route, options) {
|
|
430
|
-
// This error needs to be created here because of how stack traces get calculated
|
|
431
|
-
const error = new Error();
|
|
432
|
-
if (rest.isProxied) {
|
|
433
|
-
if (rest.authorization) {
|
|
434
|
-
options ??= {};
|
|
435
|
-
options.headers ??= {};
|
|
436
|
-
options.headers[rest.authorizationHeader] = rest.authorization;
|
|
437
|
-
}
|
|
438
|
-
const request = new Request(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
|
|
439
|
-
rest.events.request(request, {
|
|
440
|
-
body: options?.body
|
|
441
|
-
});
|
|
442
|
-
const result = await fetch(request);
|
|
443
|
-
// Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
|
|
444
|
-
const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>null);
|
|
445
|
-
rest.events.response(request, result, {
|
|
446
|
-
requestBody: options?.body,
|
|
447
|
-
responseBody: body
|
|
448
|
-
});
|
|
449
|
-
if (!result.ok) {
|
|
450
|
-
error.cause = Object.assign(Object.create(baseErrorPrototype), {
|
|
451
|
-
ok: false,
|
|
452
|
-
status: result.status,
|
|
453
|
-
body
|
|
454
|
-
});
|
|
455
|
-
throw error;
|
|
456
|
-
}
|
|
457
|
-
return result.status !== 204 ? typeof body === 'string' ? JSON.parse(body) : body : undefined;
|
|
458
|
-
}
|
|
459
|
-
return await new Promise(async (resolve, reject)=>{
|
|
460
|
-
const payload = {
|
|
461
|
-
route,
|
|
462
|
-
method,
|
|
463
|
-
requestBodyOptions: options,
|
|
464
|
-
retryCount: 0,
|
|
465
|
-
retryRequest: async (payload)=>{
|
|
466
|
-
await rest.processRequest(payload);
|
|
467
|
-
},
|
|
468
|
-
resolve: (data)=>{
|
|
469
|
-
resolve(data.status !== 204 ? typeof data.body === 'string' ? JSON.parse(data.body) : data.body : undefined);
|
|
470
|
-
},
|
|
471
|
-
reject: (reason)=>{
|
|
472
|
-
let errorText;
|
|
473
|
-
switch(reason.status){
|
|
474
|
-
case 400:
|
|
475
|
-
errorText = "The options was improperly formatted, or the server couldn't understand it.";
|
|
476
|
-
break;
|
|
477
|
-
case 401:
|
|
478
|
-
errorText = 'The Authorization header was missing or invalid.';
|
|
479
|
-
break;
|
|
480
|
-
case 403:
|
|
481
|
-
errorText = 'The Authorization token you passed did not have permission to the resource.';
|
|
482
|
-
break;
|
|
483
|
-
case 404:
|
|
484
|
-
errorText = "The resource at the location specified doesn't exist.";
|
|
485
|
-
break;
|
|
486
|
-
case 405:
|
|
487
|
-
errorText = 'The HTTP method used is not valid for the location specified.';
|
|
488
|
-
break;
|
|
489
|
-
case 429:
|
|
490
|
-
errorText = "You're being ratelimited.";
|
|
491
|
-
break;
|
|
492
|
-
case 502:
|
|
493
|
-
errorText = 'There was not a gateway available to process your options. Wait a bit and retry.';
|
|
494
|
-
break;
|
|
495
|
-
default:
|
|
496
|
-
errorText = reason.statusText ?? 'Unknown error';
|
|
497
|
-
}
|
|
498
|
-
error.message = `[${reason.status}] ${errorText}`;
|
|
499
|
-
// If discord sent us JSON, it is probably going to be an error message from which we can get and add some information about the error to the error message, the full body will be in the error.cause
|
|
500
|
-
// https://discord.com/developers/docs/reference#error-messages
|
|
501
|
-
if (typeof reason.body === 'object' && hasProperty(reason.body, 'code') && hasProperty(reason.body, 'message')) {
|
|
502
|
-
error.message += `\nDiscord error: [${reason.body.code}] ${reason.body.message}`;
|
|
503
|
-
}
|
|
504
|
-
error.cause = Object.assign(Object.create(baseErrorPrototype), reason);
|
|
505
|
-
reject(error);
|
|
506
|
-
},
|
|
507
|
-
runThroughQueue: options?.runThroughQueue
|
|
508
|
-
};
|
|
509
|
-
await rest.processRequest(payload);
|
|
510
|
-
});
|
|
511
|
-
},
|
|
512
|
-
async get (url, options) {
|
|
513
|
-
return camelize(await rest.makeRequest('GET', url, options));
|
|
514
|
-
},
|
|
515
|
-
async post (url, options) {
|
|
516
|
-
return camelize(await rest.makeRequest('POST', url, options));
|
|
517
|
-
},
|
|
518
|
-
async delete (url, options) {
|
|
519
|
-
camelize(await rest.makeRequest('DELETE', url, options));
|
|
520
|
-
},
|
|
521
|
-
async patch (url, options) {
|
|
522
|
-
return camelize(await rest.makeRequest('PATCH', url, options));
|
|
523
|
-
},
|
|
524
|
-
async put (url, options) {
|
|
525
|
-
return camelize(await rest.makeRequest('PUT', url, options));
|
|
526
|
-
},
|
|
527
|
-
async addReaction (channelId, messageId, reaction) {
|
|
528
|
-
reaction = processReactionString(reaction);
|
|
529
|
-
await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
530
|
-
},
|
|
531
|
-
async addReactions (channelId, messageId, reactions, ordered = false) {
|
|
532
|
-
if (!ordered) {
|
|
533
|
-
await Promise.all(reactions.map(async (reaction)=>{
|
|
534
|
-
await rest.addReaction(channelId, messageId, reaction);
|
|
535
|
-
}));
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
for (const reaction of reactions){
|
|
539
|
-
await rest.addReaction(channelId, messageId, reaction);
|
|
540
|
-
}
|
|
541
|
-
},
|
|
542
|
-
async addRole (guildId, userId, roleId, reason) {
|
|
543
|
-
await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
544
|
-
reason
|
|
545
|
-
});
|
|
546
|
-
},
|
|
547
|
-
async addThreadMember (channelId, userId) {
|
|
548
|
-
await rest.put(rest.routes.channels.threads.user(channelId, userId));
|
|
549
|
-
},
|
|
550
|
-
async addDmRecipient (channelId, userId, body) {
|
|
551
|
-
await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
|
|
552
|
-
body
|
|
553
|
-
});
|
|
554
|
-
},
|
|
555
|
-
async createAutomodRule (guildId, body, reason) {
|
|
556
|
-
return await rest.post(rest.routes.guilds.automod.rules(guildId), {
|
|
557
|
-
body,
|
|
558
|
-
reason
|
|
559
|
-
});
|
|
560
|
-
},
|
|
561
|
-
async createChannel (guildId, body, reason) {
|
|
562
|
-
return await rest.post(rest.routes.guilds.channels(guildId), {
|
|
563
|
-
body,
|
|
564
|
-
reason
|
|
565
|
-
});
|
|
566
|
-
},
|
|
567
|
-
async createEmoji (guildId, body, reason) {
|
|
568
|
-
return await rest.post(rest.routes.guilds.emojis(guildId), {
|
|
569
|
-
body,
|
|
570
|
-
reason
|
|
571
|
-
});
|
|
572
|
-
},
|
|
573
|
-
async createApplicationEmoji (body) {
|
|
574
|
-
return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
|
|
575
|
-
body
|
|
576
|
-
});
|
|
577
|
-
},
|
|
578
|
-
async createGlobalApplicationCommand (body, options) {
|
|
579
|
-
const restOptions = {
|
|
580
|
-
body
|
|
581
|
-
};
|
|
582
|
-
if (options?.bearerToken) {
|
|
583
|
-
restOptions.unauthorized = true;
|
|
584
|
-
restOptions.headers = {
|
|
585
|
-
authorization: `Bearer ${options.bearerToken}`
|
|
586
|
-
};
|
|
587
|
-
}
|
|
588
|
-
return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
|
|
589
|
-
},
|
|
590
|
-
async createGuildApplicationCommand (body, guildId, options) {
|
|
591
|
-
const restOptions = {
|
|
592
|
-
body
|
|
593
|
-
};
|
|
594
|
-
if (options?.bearerToken) {
|
|
595
|
-
restOptions.unauthorized = true;
|
|
596
|
-
restOptions.headers = {
|
|
597
|
-
authorization: `Bearer ${options.bearerToken}`
|
|
598
|
-
};
|
|
599
|
-
}
|
|
600
|
-
return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
|
|
601
|
-
},
|
|
602
|
-
async createGuildSticker (guildId, options, reason) {
|
|
603
|
-
const form = new FormData();
|
|
604
|
-
form.append('file', options.file.blob, options.file.name);
|
|
605
|
-
form.append('name', options.name);
|
|
606
|
-
form.append('description', options.description);
|
|
607
|
-
form.append('tags', options.tags);
|
|
608
|
-
return await rest.post(rest.routes.guilds.stickers(guildId), {
|
|
609
|
-
body: form,
|
|
610
|
-
reason
|
|
611
|
-
});
|
|
612
|
-
},
|
|
613
|
-
async createGuildTemplate (guildId, body) {
|
|
614
|
-
return await rest.post(rest.routes.guilds.templates.all(guildId), {
|
|
615
|
-
body
|
|
616
|
-
});
|
|
617
|
-
},
|
|
618
|
-
async createForumThread (channelId, body, reason) {
|
|
619
|
-
return await rest.post(rest.routes.channels.forum(channelId), {
|
|
620
|
-
body,
|
|
621
|
-
files: body.files,
|
|
622
|
-
reason
|
|
623
|
-
});
|
|
624
|
-
},
|
|
625
|
-
async createInvite (channelId, body = {}, reason) {
|
|
626
|
-
return await rest.post(rest.routes.channels.invites(channelId), {
|
|
627
|
-
body,
|
|
628
|
-
reason
|
|
629
|
-
});
|
|
630
|
-
},
|
|
631
|
-
async createRole (guildId, body, reason) {
|
|
632
|
-
return await rest.post(rest.routes.guilds.roles.all(guildId), {
|
|
633
|
-
body,
|
|
634
|
-
reason
|
|
635
|
-
});
|
|
636
|
-
},
|
|
637
|
-
async createScheduledEvent (guildId, body, reason) {
|
|
638
|
-
return await rest.post(rest.routes.guilds.events.events(guildId), {
|
|
639
|
-
body,
|
|
640
|
-
reason
|
|
641
|
-
});
|
|
642
|
-
},
|
|
643
|
-
async createStageInstance (body, reason) {
|
|
644
|
-
return await rest.post(rest.routes.channels.stages(), {
|
|
645
|
-
body,
|
|
646
|
-
reason
|
|
647
|
-
});
|
|
648
|
-
},
|
|
649
|
-
async createWebhook (channelId, options, reason) {
|
|
650
|
-
return await rest.post(rest.routes.channels.webhooks(channelId), {
|
|
651
|
-
body: {
|
|
652
|
-
name: options.name,
|
|
653
|
-
avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
|
|
654
|
-
},
|
|
655
|
-
reason
|
|
656
|
-
});
|
|
657
|
-
},
|
|
658
|
-
async deleteAutomodRule (guildId, ruleId, reason) {
|
|
659
|
-
await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
660
|
-
reason
|
|
661
|
-
});
|
|
662
|
-
},
|
|
663
|
-
async deleteChannel (channelId, reason) {
|
|
664
|
-
await rest.delete(rest.routes.channels.channel(channelId), {
|
|
665
|
-
reason
|
|
666
|
-
});
|
|
667
|
-
},
|
|
668
|
-
async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
|
|
669
|
-
await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
|
|
670
|
-
reason
|
|
671
|
-
});
|
|
672
|
-
},
|
|
673
|
-
async deleteEmoji (guildId, id, reason) {
|
|
674
|
-
await rest.delete(rest.routes.guilds.emoji(guildId, id), {
|
|
675
|
-
reason
|
|
676
|
-
});
|
|
677
|
-
},
|
|
678
|
-
async deleteApplicationEmoji (id) {
|
|
679
|
-
await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
|
|
680
|
-
},
|
|
681
|
-
async deleteFollowupMessage (token, messageId) {
|
|
682
|
-
await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
683
|
-
unauthorized: true
|
|
684
|
-
});
|
|
685
|
-
},
|
|
686
|
-
async deleteGlobalApplicationCommand (commandId) {
|
|
687
|
-
await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
688
|
-
},
|
|
689
|
-
async deleteGuildApplicationCommand (commandId, guildId) {
|
|
690
|
-
await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
691
|
-
},
|
|
692
|
-
async deleteGuildSticker (guildId, stickerId, reason) {
|
|
693
|
-
await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
694
|
-
reason
|
|
695
|
-
});
|
|
696
|
-
},
|
|
697
|
-
async deleteGuildTemplate (guildId, templateCode) {
|
|
698
|
-
await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
|
|
699
|
-
},
|
|
700
|
-
async deleteIntegration (guildId, integrationId, reason) {
|
|
701
|
-
await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
|
|
702
|
-
reason
|
|
703
|
-
});
|
|
704
|
-
},
|
|
705
|
-
async deleteInvite (inviteCode, reason) {
|
|
706
|
-
await rest.delete(rest.routes.guilds.invite(inviteCode), {
|
|
707
|
-
reason
|
|
708
|
-
});
|
|
709
|
-
},
|
|
710
|
-
async deleteMessage (channelId, messageId, reason) {
|
|
711
|
-
await rest.delete(rest.routes.channels.message(channelId, messageId), {
|
|
712
|
-
reason
|
|
713
|
-
});
|
|
714
|
-
},
|
|
715
|
-
async deleteMessages (channelId, messageIds, reason) {
|
|
716
|
-
await rest.post(rest.routes.channels.bulk(channelId), {
|
|
717
|
-
body: {
|
|
718
|
-
messages: messageIds.slice(0, 100).map((id)=>id.toString())
|
|
719
|
-
},
|
|
720
|
-
reason
|
|
721
|
-
});
|
|
722
|
-
},
|
|
723
|
-
async deleteOriginalInteractionResponse (token) {
|
|
724
|
-
await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
725
|
-
unauthorized: true
|
|
726
|
-
});
|
|
727
|
-
},
|
|
728
|
-
async deleteOwnReaction (channelId, messageId, reaction) {
|
|
729
|
-
reaction = processReactionString(reaction);
|
|
730
|
-
await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
731
|
-
},
|
|
732
|
-
async deleteReactionsAll (channelId, messageId) {
|
|
733
|
-
await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
|
|
734
|
-
},
|
|
735
|
-
async deleteReactionsEmoji (channelId, messageId, reaction) {
|
|
736
|
-
reaction = processReactionString(reaction);
|
|
737
|
-
await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
|
|
738
|
-
},
|
|
739
|
-
async deleteRole (guildId, roleId, reason) {
|
|
740
|
-
await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
741
|
-
reason
|
|
742
|
-
});
|
|
743
|
-
},
|
|
744
|
-
async deleteScheduledEvent (guildId, eventId) {
|
|
745
|
-
await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
|
|
746
|
-
},
|
|
747
|
-
async deleteStageInstance (channelId, reason) {
|
|
748
|
-
await rest.delete(rest.routes.channels.stage(channelId), {
|
|
749
|
-
reason
|
|
750
|
-
});
|
|
751
|
-
},
|
|
752
|
-
async deleteUserReaction (channelId, messageId, userId, reaction) {
|
|
753
|
-
reaction = processReactionString(reaction);
|
|
754
|
-
await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
|
|
755
|
-
},
|
|
756
|
-
async deleteWebhook (webhookId, reason) {
|
|
757
|
-
await rest.delete(rest.routes.webhooks.id(webhookId), {
|
|
758
|
-
reason
|
|
759
|
-
});
|
|
760
|
-
},
|
|
761
|
-
async deleteWebhookMessage (webhookId, token, messageId, options) {
|
|
762
|
-
await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
763
|
-
unauthorized: true
|
|
764
|
-
});
|
|
765
|
-
},
|
|
766
|
-
async deleteWebhookWithToken (webhookId, token) {
|
|
767
|
-
await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
|
|
768
|
-
unauthorized: true
|
|
769
|
-
});
|
|
770
|
-
},
|
|
771
|
-
async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
|
|
772
|
-
return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
|
|
773
|
-
body: {
|
|
774
|
-
permissions
|
|
775
|
-
},
|
|
776
|
-
headers: {
|
|
777
|
-
authorization: `Bearer ${bearerToken}`
|
|
778
|
-
}
|
|
779
|
-
});
|
|
780
|
-
},
|
|
781
|
-
async editAutomodRule (guildId, ruleId, body, reason) {
|
|
782
|
-
return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
783
|
-
body,
|
|
784
|
-
reason
|
|
785
|
-
});
|
|
786
|
-
},
|
|
787
|
-
async editBotProfile (options) {
|
|
788
|
-
const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
|
|
789
|
-
const banner = options?.botBannerURL ? await urlToBase64(options?.botBannerURL) : options?.botBannerURL;
|
|
790
|
-
return await rest.patch(rest.routes.currentUser(), {
|
|
791
|
-
body: {
|
|
792
|
-
username: options.username?.trim(),
|
|
793
|
-
avatar,
|
|
794
|
-
banner
|
|
795
|
-
}
|
|
796
|
-
});
|
|
797
|
-
},
|
|
798
|
-
async editChannel (channelId, body, reason) {
|
|
799
|
-
return await rest.patch(rest.routes.channels.channel(channelId), {
|
|
800
|
-
body,
|
|
801
|
-
reason
|
|
802
|
-
});
|
|
803
|
-
},
|
|
804
|
-
async editChannelPermissionOverrides (channelId, body, reason) {
|
|
805
|
-
await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
|
|
806
|
-
body,
|
|
807
|
-
reason
|
|
808
|
-
});
|
|
809
|
-
},
|
|
810
|
-
async editChannelPositions (guildId, body) {
|
|
811
|
-
await rest.patch(rest.routes.guilds.channels(guildId), {
|
|
812
|
-
body
|
|
813
|
-
});
|
|
814
|
-
},
|
|
815
|
-
async editEmoji (guildId, id, body, reason) {
|
|
816
|
-
return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
|
|
817
|
-
body,
|
|
818
|
-
reason
|
|
819
|
-
});
|
|
820
|
-
},
|
|
821
|
-
async editApplicationEmoji (id, body) {
|
|
822
|
-
return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
|
|
823
|
-
body
|
|
824
|
-
});
|
|
825
|
-
},
|
|
826
|
-
async editFollowupMessage (token, messageId, body) {
|
|
827
|
-
return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
828
|
-
body,
|
|
829
|
-
files: body.files,
|
|
830
|
-
unauthorized: true
|
|
831
|
-
});
|
|
832
|
-
},
|
|
833
|
-
async editGlobalApplicationCommand (commandId, body) {
|
|
834
|
-
return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
|
|
835
|
-
body
|
|
836
|
-
});
|
|
837
|
-
},
|
|
838
|
-
async editGuild (guildId, body, reason) {
|
|
839
|
-
return await rest.patch(rest.routes.guilds.guild(guildId), {
|
|
840
|
-
body,
|
|
841
|
-
reason
|
|
842
|
-
});
|
|
843
|
-
},
|
|
844
|
-
async editGuildApplicationCommand (commandId, guildId, body) {
|
|
845
|
-
return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
|
|
846
|
-
body
|
|
847
|
-
});
|
|
848
|
-
},
|
|
849
|
-
async editGuildSticker (guildId, stickerId, body, reason) {
|
|
850
|
-
return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
851
|
-
body,
|
|
852
|
-
reason
|
|
853
|
-
});
|
|
854
|
-
},
|
|
855
|
-
async editGuildTemplate (guildId, templateCode, body) {
|
|
856
|
-
return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
|
|
857
|
-
body
|
|
858
|
-
});
|
|
859
|
-
},
|
|
860
|
-
async editMessage (channelId, messageId, body) {
|
|
861
|
-
return await rest.patch(rest.routes.channels.message(channelId, messageId), {
|
|
862
|
-
body,
|
|
863
|
-
files: body.files
|
|
864
|
-
});
|
|
865
|
-
},
|
|
866
|
-
async editOriginalInteractionResponse (token, body) {
|
|
867
|
-
return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
868
|
-
body,
|
|
869
|
-
files: body.files,
|
|
870
|
-
unauthorized: true
|
|
871
|
-
});
|
|
872
|
-
},
|
|
873
|
-
async editOwnVoiceState (guildId, options) {
|
|
874
|
-
await rest.patch(rest.routes.guilds.voice(guildId), {
|
|
875
|
-
body: {
|
|
876
|
-
...options,
|
|
877
|
-
requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
|
|
878
|
-
}
|
|
879
|
-
});
|
|
880
|
-
},
|
|
881
|
-
async editScheduledEvent (guildId, eventId, body, reason) {
|
|
882
|
-
return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
|
|
883
|
-
body,
|
|
884
|
-
reason
|
|
885
|
-
});
|
|
886
|
-
},
|
|
887
|
-
async editRole (guildId, roleId, body, reason) {
|
|
888
|
-
return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
|
|
889
|
-
body,
|
|
890
|
-
reason
|
|
891
|
-
});
|
|
892
|
-
},
|
|
893
|
-
async editRolePositions (guildId, body, reason) {
|
|
894
|
-
return await rest.patch(rest.routes.guilds.roles.all(guildId), {
|
|
895
|
-
body,
|
|
896
|
-
reason
|
|
897
|
-
});
|
|
898
|
-
},
|
|
899
|
-
async editStageInstance (channelId, topic, reason) {
|
|
900
|
-
return await rest.patch(rest.routes.channels.stage(channelId), {
|
|
901
|
-
body: {
|
|
902
|
-
topic
|
|
903
|
-
},
|
|
904
|
-
reason
|
|
905
|
-
});
|
|
906
|
-
},
|
|
907
|
-
async editUserVoiceState (guildId, options) {
|
|
908
|
-
await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
|
|
909
|
-
body: options
|
|
910
|
-
});
|
|
911
|
-
},
|
|
912
|
-
async editWebhook (webhookId, body, reason) {
|
|
913
|
-
return await rest.patch(rest.routes.webhooks.id(webhookId), {
|
|
914
|
-
body,
|
|
915
|
-
reason
|
|
916
|
-
});
|
|
917
|
-
},
|
|
918
|
-
async editWebhookMessage (webhookId, token, messageId, options) {
|
|
919
|
-
return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
920
|
-
body: options,
|
|
921
|
-
files: options.files,
|
|
922
|
-
unauthorized: true
|
|
923
|
-
});
|
|
924
|
-
},
|
|
925
|
-
async editWebhookWithToken (webhookId, token, body) {
|
|
926
|
-
return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
|
|
927
|
-
body,
|
|
928
|
-
unauthorized: true
|
|
929
|
-
});
|
|
930
|
-
},
|
|
931
|
-
async editWelcomeScreen (guildId, body, reason) {
|
|
932
|
-
return await rest.patch(rest.routes.guilds.welcome(guildId), {
|
|
933
|
-
body,
|
|
934
|
-
reason
|
|
935
|
-
});
|
|
936
|
-
},
|
|
937
|
-
async editWidgetSettings (guildId, body, reason) {
|
|
938
|
-
return await rest.patch(rest.routes.guilds.widget(guildId), {
|
|
939
|
-
body,
|
|
940
|
-
reason
|
|
941
|
-
});
|
|
942
|
-
},
|
|
943
|
-
async executeWebhook (webhookId, token, options) {
|
|
944
|
-
return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
|
|
945
|
-
body: options,
|
|
946
|
-
unauthorized: true
|
|
947
|
-
});
|
|
948
|
-
},
|
|
949
|
-
async followAnnouncement (sourceChannelId, targetChannelId, reason) {
|
|
950
|
-
return await rest.post(rest.routes.channels.follow(sourceChannelId), {
|
|
951
|
-
body: {
|
|
952
|
-
webhookChannelId: targetChannelId
|
|
953
|
-
},
|
|
954
|
-
reason
|
|
955
|
-
});
|
|
956
|
-
},
|
|
957
|
-
async getActiveThreads (guildId) {
|
|
958
|
-
return await rest.get(rest.routes.channels.threads.active(guildId));
|
|
959
|
-
},
|
|
960
|
-
async getApplicationCommandPermission (guildId, commandId, options) {
|
|
961
|
-
const restOptions = {};
|
|
962
|
-
if (options?.accessToken) {
|
|
963
|
-
restOptions.unauthorized = true;
|
|
964
|
-
restOptions.headers = {
|
|
965
|
-
authorization: `Bearer ${options.accessToken}`
|
|
966
|
-
};
|
|
967
|
-
}
|
|
968
|
-
return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
|
|
969
|
-
},
|
|
970
|
-
async getApplicationCommandPermissions (guildId, options) {
|
|
971
|
-
const restOptions = {};
|
|
972
|
-
if (options?.accessToken) {
|
|
973
|
-
restOptions.unauthorized = true;
|
|
974
|
-
restOptions.headers = {
|
|
975
|
-
authorization: `Bearer ${options.accessToken}`
|
|
976
|
-
};
|
|
977
|
-
}
|
|
978
|
-
return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
|
|
979
|
-
},
|
|
980
|
-
async getApplicationInfo () {
|
|
981
|
-
return await rest.get(rest.routes.oauth2.application());
|
|
982
|
-
},
|
|
983
|
-
async editApplicationInfo (body) {
|
|
984
|
-
return await rest.patch(rest.routes.application(), {
|
|
985
|
-
body
|
|
986
|
-
});
|
|
987
|
-
},
|
|
988
|
-
async getCurrentAuthenticationInfo (token) {
|
|
989
|
-
return await rest.get(rest.routes.oauth2.currentAuthorization(), {
|
|
990
|
-
headers: {
|
|
991
|
-
authorization: `Bearer ${token}`
|
|
992
|
-
},
|
|
993
|
-
unauthorized: true
|
|
994
|
-
});
|
|
995
|
-
},
|
|
996
|
-
async exchangeToken (clientId, clientSecret, body) {
|
|
997
|
-
const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
|
|
998
|
-
const restOptions = {
|
|
999
|
-
body,
|
|
1000
|
-
headers: {
|
|
1001
|
-
'content-type': 'application/x-www-form-urlencoded',
|
|
1002
|
-
authorization: `Basic ${basicCredentials.toString('base64')}`
|
|
1003
|
-
},
|
|
1004
|
-
runThroughQueue: false,
|
|
1005
|
-
unauthorized: true
|
|
1006
|
-
};
|
|
1007
|
-
if (body.grantType === 'client_credentials') {
|
|
1008
|
-
restOptions.body.scope = body.scope.join(' ');
|
|
1009
|
-
}
|
|
1010
|
-
return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
|
|
1011
|
-
},
|
|
1012
|
-
async revokeToken (clientId, clientSecret, body) {
|
|
1013
|
-
const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
|
|
1014
|
-
await rest.post(rest.routes.oauth2.tokenRevoke(), {
|
|
1015
|
-
body,
|
|
1016
|
-
headers: {
|
|
1017
|
-
'content-type': 'application/x-www-form-urlencoded',
|
|
1018
|
-
authorization: `Basic ${basicCredentials.toString('base64')}`
|
|
1019
|
-
},
|
|
1020
|
-
unauthorized: true
|
|
1021
|
-
});
|
|
1022
|
-
},
|
|
1023
|
-
async getAuditLog (guildId, options) {
|
|
1024
|
-
return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
|
|
1025
|
-
},
|
|
1026
|
-
async getAutomodRule (guildId, ruleId) {
|
|
1027
|
-
return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
|
|
1028
|
-
},
|
|
1029
|
-
async getAutomodRules (guildId) {
|
|
1030
|
-
return await rest.get(rest.routes.guilds.automod.rules(guildId));
|
|
1031
|
-
},
|
|
1032
|
-
async getAvailableVoiceRegions () {
|
|
1033
|
-
return await rest.get(rest.routes.regions());
|
|
1034
|
-
},
|
|
1035
|
-
async getBan (guildId, userId) {
|
|
1036
|
-
return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
|
|
1037
|
-
},
|
|
1038
|
-
async getBans (guildId, options) {
|
|
1039
|
-
return await rest.get(rest.routes.guilds.members.bans(guildId, options));
|
|
1040
|
-
},
|
|
1041
|
-
async getChannel (id) {
|
|
1042
|
-
return await rest.get(rest.routes.channels.channel(id));
|
|
1043
|
-
},
|
|
1044
|
-
async getChannelInvites (channelId) {
|
|
1045
|
-
return await rest.get(rest.routes.channels.invites(channelId));
|
|
1046
|
-
},
|
|
1047
|
-
async getChannels (guildId) {
|
|
1048
|
-
return await rest.get(rest.routes.guilds.channels(guildId));
|
|
1049
|
-
},
|
|
1050
|
-
async getChannelWebhooks (channelId) {
|
|
1051
|
-
return await rest.get(rest.routes.channels.webhooks(channelId));
|
|
1052
|
-
},
|
|
1053
|
-
async getDmChannel (userId) {
|
|
1054
|
-
return await rest.post(rest.routes.channels.dm(), {
|
|
1055
|
-
body: {
|
|
1056
|
-
recipientId: userId
|
|
1057
|
-
}
|
|
1058
|
-
});
|
|
1059
|
-
},
|
|
1060
|
-
async getGroupDmChannel (body) {
|
|
1061
|
-
return await rest.post(rest.routes.channels.dm(), {
|
|
1062
|
-
body
|
|
1063
|
-
});
|
|
1064
|
-
},
|
|
1065
|
-
async getEmoji (guildId, emojiId) {
|
|
1066
|
-
return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
|
|
1067
|
-
},
|
|
1068
|
-
async getApplicationEmoji (emojiId) {
|
|
1069
|
-
return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
|
|
1070
|
-
},
|
|
1071
|
-
async getEmojis (guildId) {
|
|
1072
|
-
return await rest.get(rest.routes.guilds.emojis(guildId));
|
|
1073
|
-
},
|
|
1074
|
-
async getApplicationEmojis () {
|
|
1075
|
-
return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
|
|
1076
|
-
},
|
|
1077
|
-
async getFollowupMessage (token, messageId) {
|
|
1078
|
-
return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
|
|
1079
|
-
unauthorized: true
|
|
1080
|
-
});
|
|
1081
|
-
},
|
|
1082
|
-
async getGatewayBot () {
|
|
1083
|
-
return await rest.get(rest.routes.gatewayBot());
|
|
1084
|
-
},
|
|
1085
|
-
async getGlobalApplicationCommand (commandId) {
|
|
1086
|
-
return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
1087
|
-
},
|
|
1088
|
-
async getGlobalApplicationCommands () {
|
|
1089
|
-
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
|
|
1090
|
-
},
|
|
1091
|
-
async getGuild (guildId, options = {
|
|
1092
|
-
counts: true
|
|
1093
|
-
}) {
|
|
1094
|
-
return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
|
|
1095
|
-
},
|
|
1096
|
-
async getGuilds (token, options) {
|
|
1097
|
-
const makeRequestOptions = token ? {
|
|
1098
|
-
headers: {
|
|
1099
|
-
authorization: `Bearer ${token}`
|
|
1100
|
-
},
|
|
1101
|
-
unauthorized: true
|
|
1102
|
-
} : undefined;
|
|
1103
|
-
return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
|
|
1104
|
-
},
|
|
1105
|
-
async getGuildApplicationCommand (commandId, guildId) {
|
|
1106
|
-
return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
1107
|
-
},
|
|
1108
|
-
async getGuildApplicationCommands (guildId) {
|
|
1109
|
-
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
|
|
1110
|
-
},
|
|
1111
|
-
async getGuildPreview (guildId) {
|
|
1112
|
-
return await rest.get(rest.routes.guilds.preview(guildId));
|
|
1113
|
-
},
|
|
1114
|
-
async getGuildTemplate (templateCode) {
|
|
1115
|
-
return await rest.get(rest.routes.guilds.templates.code(templateCode));
|
|
1116
|
-
},
|
|
1117
|
-
async getGuildTemplates (guildId) {
|
|
1118
|
-
return await rest.get(rest.routes.guilds.templates.all(guildId));
|
|
1119
|
-
},
|
|
1120
|
-
async getGuildWebhooks (guildId) {
|
|
1121
|
-
return await rest.get(rest.routes.guilds.webhooks(guildId));
|
|
1122
|
-
},
|
|
1123
|
-
async getIntegrations (guildId) {
|
|
1124
|
-
return await rest.get(rest.routes.guilds.integrations(guildId));
|
|
1125
|
-
},
|
|
1126
|
-
async getInvite (inviteCode, options) {
|
|
1127
|
-
return await rest.get(rest.routes.guilds.invite(inviteCode, options));
|
|
1128
|
-
},
|
|
1129
|
-
async getInvites (guildId) {
|
|
1130
|
-
return await rest.get(rest.routes.guilds.invites(guildId));
|
|
1131
|
-
},
|
|
1132
|
-
async getMessage (channelId, messageId) {
|
|
1133
|
-
return await rest.get(rest.routes.channels.message(channelId, messageId));
|
|
1134
|
-
},
|
|
1135
|
-
async getMessages (channelId, options) {
|
|
1136
|
-
return await rest.get(rest.routes.channels.messages(channelId, options));
|
|
1137
|
-
},
|
|
1138
|
-
async getStickerPack (stickerPackId) {
|
|
1139
|
-
return await rest.get(rest.routes.stickerPack(stickerPackId));
|
|
1140
|
-
},
|
|
1141
|
-
async getStickerPacks () {
|
|
1142
|
-
return await rest.get(rest.routes.stickerPacks());
|
|
1143
|
-
},
|
|
1144
|
-
async getOriginalInteractionResponse (token) {
|
|
1145
|
-
return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
1146
|
-
unauthorized: true
|
|
1147
|
-
});
|
|
1148
|
-
},
|
|
1149
|
-
async getChannelPins (channelId, options) {
|
|
1150
|
-
return await rest.get(rest.routes.channels.messagePins(channelId, options));
|
|
1151
|
-
},
|
|
1152
|
-
async getPinnedMessages (channelId) {
|
|
1153
|
-
return await rest.get(rest.routes.channels.pins(channelId));
|
|
1154
|
-
},
|
|
1155
|
-
async getPrivateArchivedThreads (channelId, options) {
|
|
1156
|
-
return await rest.get(rest.routes.channels.threads.private(channelId, options));
|
|
1157
|
-
},
|
|
1158
|
-
async getPrivateJoinedArchivedThreads (channelId, options) {
|
|
1159
|
-
return await rest.get(rest.routes.channels.threads.joined(channelId, options));
|
|
1160
|
-
},
|
|
1161
|
-
async getPruneCount (guildId, options) {
|
|
1162
|
-
return await rest.get(rest.routes.guilds.prune(guildId, options));
|
|
1163
|
-
},
|
|
1164
|
-
async getPublicArchivedThreads (channelId, options) {
|
|
1165
|
-
return await rest.get(rest.routes.channels.threads.public(channelId, options));
|
|
1166
|
-
},
|
|
1167
|
-
async getRoles (guildId) {
|
|
1168
|
-
return await rest.get(rest.routes.guilds.roles.all(guildId));
|
|
1169
|
-
},
|
|
1170
|
-
async getRole (guildId, roleId) {
|
|
1171
|
-
return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
|
|
1172
|
-
},
|
|
1173
|
-
async getScheduledEvent (guildId, eventId, options) {
|
|
1174
|
-
return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
|
|
1175
|
-
},
|
|
1176
|
-
async getScheduledEvents (guildId, options) {
|
|
1177
|
-
return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
|
|
1178
|
-
},
|
|
1179
|
-
async getScheduledEventUsers (guildId, eventId, options) {
|
|
1180
|
-
return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
|
|
1181
|
-
},
|
|
1182
|
-
async getSessionInfo () {
|
|
1183
|
-
return await rest.getGatewayBot();
|
|
1184
|
-
},
|
|
1185
|
-
async getStageInstance (channelId) {
|
|
1186
|
-
return await rest.get(rest.routes.channels.stage(channelId));
|
|
1187
|
-
},
|
|
1188
|
-
async getOwnVoiceState (guildId) {
|
|
1189
|
-
return await rest.get(rest.routes.guilds.voice(guildId));
|
|
1190
|
-
},
|
|
1191
|
-
async getUserVoiceState (guildId, userId) {
|
|
1192
|
-
return await rest.get(rest.routes.guilds.voice(guildId, userId));
|
|
1193
|
-
},
|
|
1194
|
-
async getSticker (stickerId) {
|
|
1195
|
-
return await rest.get(rest.routes.sticker(stickerId));
|
|
1196
|
-
},
|
|
1197
|
-
async getGuildSticker (guildId, stickerId) {
|
|
1198
|
-
return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
|
|
1199
|
-
},
|
|
1200
|
-
async getGuildStickers (guildId) {
|
|
1201
|
-
return await rest.get(rest.routes.guilds.stickers(guildId));
|
|
1202
|
-
},
|
|
1203
|
-
async getThreadMember (channelId, userId, options) {
|
|
1204
|
-
return await rest.get(rest.routes.channels.threads.getUser(channelId, userId, options));
|
|
1205
|
-
},
|
|
1206
|
-
async getThreadMembers (channelId, options) {
|
|
1207
|
-
return await rest.get(rest.routes.channels.threads.members(channelId, options));
|
|
1208
|
-
},
|
|
1209
|
-
async getReactions (channelId, messageId, reaction, options) {
|
|
1210
|
-
return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
|
|
1211
|
-
},
|
|
1212
|
-
async getUser (id) {
|
|
1213
|
-
return await rest.get(rest.routes.user(id));
|
|
1214
|
-
},
|
|
1215
|
-
async getCurrentUser (token) {
|
|
1216
|
-
return await rest.get(rest.routes.currentUser(), {
|
|
1217
|
-
headers: {
|
|
1218
|
-
authorization: `Bearer ${token}`
|
|
1219
|
-
},
|
|
1220
|
-
unauthorized: true
|
|
1221
|
-
});
|
|
1222
|
-
},
|
|
1223
|
-
async getUserConnections (token) {
|
|
1224
|
-
return await rest.get(rest.routes.oauth2.connections(), {
|
|
1225
|
-
headers: {
|
|
1226
|
-
authorization: `Bearer ${token}`
|
|
1227
|
-
},
|
|
1228
|
-
unauthorized: true
|
|
1229
|
-
});
|
|
1230
|
-
},
|
|
1231
|
-
async getUserApplicationRoleConnection (token, applicationId) {
|
|
1232
|
-
return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
|
|
1233
|
-
headers: {
|
|
1234
|
-
authorization: `Bearer ${token}`
|
|
1235
|
-
},
|
|
1236
|
-
unauthorized: true
|
|
1237
|
-
});
|
|
1238
|
-
},
|
|
1239
|
-
async getVanityUrl (guildId) {
|
|
1240
|
-
return await rest.get(rest.routes.guilds.vanity(guildId));
|
|
1241
|
-
},
|
|
1242
|
-
async getVoiceRegions (guildId) {
|
|
1243
|
-
return await rest.get(rest.routes.guilds.regions(guildId));
|
|
1244
|
-
},
|
|
1245
|
-
async getWebhook (webhookId) {
|
|
1246
|
-
return await rest.get(rest.routes.webhooks.id(webhookId));
|
|
1247
|
-
},
|
|
1248
|
-
async getWebhookMessage (webhookId, token, messageId, options) {
|
|
1249
|
-
return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
1250
|
-
unauthorized: true
|
|
1251
|
-
});
|
|
1252
|
-
},
|
|
1253
|
-
async getWebhookWithToken (webhookId, token) {
|
|
1254
|
-
return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
|
|
1255
|
-
unauthorized: true
|
|
1256
|
-
});
|
|
1257
|
-
},
|
|
1258
|
-
async getWelcomeScreen (guildId) {
|
|
1259
|
-
return await rest.get(rest.routes.guilds.welcome(guildId));
|
|
1260
|
-
},
|
|
1261
|
-
async getWidget (guildId) {
|
|
1262
|
-
return await rest.get(rest.routes.guilds.widgetJson(guildId));
|
|
1263
|
-
},
|
|
1264
|
-
async getWidgetSettings (guildId) {
|
|
1265
|
-
return await rest.get(rest.routes.guilds.widget(guildId));
|
|
1266
|
-
},
|
|
1267
|
-
async joinThread (channelId) {
|
|
1268
|
-
await rest.put(rest.routes.channels.threads.me(channelId));
|
|
1269
|
-
},
|
|
1270
|
-
async leaveGuild (guildId) {
|
|
1271
|
-
await rest.delete(rest.routes.guilds.leave(guildId));
|
|
1272
|
-
},
|
|
1273
|
-
async leaveThread (channelId) {
|
|
1274
|
-
await rest.delete(rest.routes.channels.threads.me(channelId));
|
|
1275
|
-
},
|
|
1276
|
-
async publishMessage (channelId, messageId) {
|
|
1277
|
-
return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
|
|
1278
|
-
},
|
|
1279
|
-
async removeRole (guildId, userId, roleId, reason) {
|
|
1280
|
-
await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
1281
|
-
reason
|
|
1282
|
-
});
|
|
1283
|
-
},
|
|
1284
|
-
async removeThreadMember (channelId, userId) {
|
|
1285
|
-
await rest.delete(rest.routes.channels.threads.user(channelId, userId));
|
|
1286
|
-
},
|
|
1287
|
-
async removeDmRecipient (channelId, userId) {
|
|
1288
|
-
await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
|
|
1289
|
-
},
|
|
1290
|
-
async sendFollowupMessage (token, options) {
|
|
1291
|
-
return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
|
|
1292
|
-
body: options,
|
|
1293
|
-
files: options.files,
|
|
1294
|
-
unauthorized: true
|
|
1295
|
-
});
|
|
1296
|
-
},
|
|
1297
|
-
async sendInteractionResponse (interactionId, token, options, params) {
|
|
1298
|
-
return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
|
|
1299
|
-
body: options,
|
|
1300
|
-
files: options.data?.files,
|
|
1301
|
-
runThroughQueue: false,
|
|
1302
|
-
unauthorized: true
|
|
1303
|
-
});
|
|
1304
|
-
},
|
|
1305
|
-
async sendMessage (channelId, body) {
|
|
1306
|
-
return await rest.post(rest.routes.channels.messages(channelId), {
|
|
1307
|
-
body,
|
|
1308
|
-
files: body.files
|
|
1309
|
-
});
|
|
1310
|
-
},
|
|
1311
|
-
async startThreadWithMessage (channelId, messageId, body, reason) {
|
|
1312
|
-
return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
|
|
1313
|
-
body,
|
|
1314
|
-
reason
|
|
1315
|
-
});
|
|
1316
|
-
},
|
|
1317
|
-
async startThreadWithoutMessage (channelId, body, reason) {
|
|
1318
|
-
return await rest.post(rest.routes.channels.threads.all(channelId), {
|
|
1319
|
-
body,
|
|
1320
|
-
reason
|
|
1321
|
-
});
|
|
1322
|
-
},
|
|
1323
|
-
async getPollAnswerVoters (channelId, messageId, answerId, options) {
|
|
1324
|
-
return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
|
|
1325
|
-
},
|
|
1326
|
-
async endPoll (channelId, messageId) {
|
|
1327
|
-
return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
|
|
1328
|
-
},
|
|
1329
|
-
async syncGuildTemplate (guildId) {
|
|
1330
|
-
return await rest.put(rest.routes.guilds.templates.all(guildId));
|
|
1331
|
-
},
|
|
1332
|
-
async banMember (guildId, userId, body, reason) {
|
|
1333
|
-
await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1334
|
-
body,
|
|
1335
|
-
reason
|
|
1336
|
-
});
|
|
1337
|
-
},
|
|
1338
|
-
async bulkBanMembers (guildId, options, reason) {
|
|
1339
|
-
return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
|
|
1340
|
-
body: options,
|
|
1341
|
-
reason
|
|
1342
|
-
});
|
|
1343
|
-
},
|
|
1344
|
-
async editBotMember (guildId, body, reason) {
|
|
1345
|
-
return await rest.patch(rest.routes.guilds.members.bot(guildId), {
|
|
1346
|
-
body,
|
|
1347
|
-
reason
|
|
1348
|
-
});
|
|
1349
|
-
},
|
|
1350
|
-
async editMember (guildId, userId, body, reason) {
|
|
1351
|
-
return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
|
|
1352
|
-
body,
|
|
1353
|
-
reason
|
|
1354
|
-
});
|
|
1355
|
-
},
|
|
1356
|
-
async getMember (guildId, userId) {
|
|
1357
|
-
return await rest.get(rest.routes.guilds.members.member(guildId, userId));
|
|
1358
|
-
},
|
|
1359
|
-
async getCurrentMember (guildId, token) {
|
|
1360
|
-
return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
|
|
1361
|
-
headers: {
|
|
1362
|
-
authorization: `Bearer ${token}`
|
|
1363
|
-
},
|
|
1364
|
-
unauthorized: true
|
|
1365
|
-
});
|
|
1366
|
-
},
|
|
1367
|
-
async getMembers (guildId, options) {
|
|
1368
|
-
return await rest.get(rest.routes.guilds.members.members(guildId, options));
|
|
1369
|
-
},
|
|
1370
|
-
async getApplicationActivityInstance (applicationId, instanceId) {
|
|
1371
|
-
return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
|
|
1372
|
-
},
|
|
1373
|
-
async kickMember (guildId, userId, reason) {
|
|
1374
|
-
await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
|
|
1375
|
-
reason
|
|
1376
|
-
});
|
|
1377
|
-
},
|
|
1378
|
-
async pinMessage (channelId, messageId, reason) {
|
|
1379
|
-
await rest.put(rest.routes.channels.messagePin(channelId, messageId), {
|
|
1380
|
-
reason
|
|
1381
|
-
});
|
|
1382
|
-
},
|
|
1383
|
-
async pruneMembers (guildId, body, reason) {
|
|
1384
|
-
return await rest.post(rest.routes.guilds.members.prune(guildId), {
|
|
1385
|
-
body,
|
|
1386
|
-
reason
|
|
1387
|
-
});
|
|
1388
|
-
},
|
|
1389
|
-
async searchMembers (guildId, query, options) {
|
|
1390
|
-
return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
|
|
1391
|
-
},
|
|
1392
|
-
async getGuildOnboarding (guildId) {
|
|
1393
|
-
return await rest.get(rest.routes.guilds.onboarding(guildId));
|
|
1394
|
-
},
|
|
1395
|
-
async editGuildOnboarding (guildId, options, reason) {
|
|
1396
|
-
return await rest.put(rest.routes.guilds.onboarding(guildId), {
|
|
1397
|
-
body: options,
|
|
1398
|
-
reason
|
|
1399
|
-
});
|
|
1400
|
-
},
|
|
1401
|
-
async modifyGuildIncidentActions (guildId, options) {
|
|
1402
|
-
return await rest.put(rest.routes.guilds.incidentActions(guildId), {
|
|
1403
|
-
body: options
|
|
1404
|
-
});
|
|
1405
|
-
},
|
|
1406
|
-
async unbanMember (guildId, userId, reason) {
|
|
1407
|
-
await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1408
|
-
reason
|
|
1409
|
-
});
|
|
1410
|
-
},
|
|
1411
|
-
async unpinMessage (channelId, messageId, reason) {
|
|
1412
|
-
await rest.delete(rest.routes.channels.messagePin(channelId, messageId), {
|
|
1413
|
-
reason
|
|
1414
|
-
});
|
|
1415
|
-
},
|
|
1416
|
-
async triggerTypingIndicator (channelId) {
|
|
1417
|
-
await rest.post(rest.routes.channels.typing(channelId));
|
|
1418
|
-
},
|
|
1419
|
-
async upsertGlobalApplicationCommands (body, options) {
|
|
1420
|
-
const restOptions = {
|
|
1421
|
-
body
|
|
1422
|
-
};
|
|
1423
|
-
if (options?.bearerToken) {
|
|
1424
|
-
restOptions.unauthorized = true;
|
|
1425
|
-
restOptions.headers = {
|
|
1426
|
-
authorization: `Bearer ${options.bearerToken}`
|
|
1427
|
-
};
|
|
1428
|
-
}
|
|
1429
|
-
return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
|
|
1430
|
-
},
|
|
1431
|
-
async upsertGuildApplicationCommands (guildId, body, options) {
|
|
1432
|
-
const restOptions = {
|
|
1433
|
-
body
|
|
1434
|
-
};
|
|
1435
|
-
if (options?.bearerToken) {
|
|
1436
|
-
restOptions.unauthorized = true;
|
|
1437
|
-
restOptions.headers = {
|
|
1438
|
-
authorization: `Bearer ${options.bearerToken}`
|
|
1439
|
-
};
|
|
1440
|
-
}
|
|
1441
|
-
return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
|
|
1442
|
-
},
|
|
1443
|
-
async editUserApplicationRoleConnection (token, applicationId, body) {
|
|
1444
|
-
return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
|
|
1445
|
-
body,
|
|
1446
|
-
headers: {
|
|
1447
|
-
authorization: `Bearer ${token}`
|
|
1448
|
-
},
|
|
1449
|
-
unauthorized: true
|
|
1450
|
-
});
|
|
1451
|
-
},
|
|
1452
|
-
async addGuildMember (guildId, userId, body) {
|
|
1453
|
-
return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
|
|
1454
|
-
body
|
|
1455
|
-
});
|
|
1456
|
-
},
|
|
1457
|
-
async createTestEntitlement (applicationId, body) {
|
|
1458
|
-
return await rest.post(rest.routes.monetization.entitlements(applicationId), {
|
|
1459
|
-
body
|
|
1460
|
-
});
|
|
1461
|
-
},
|
|
1462
|
-
async listEntitlements (applicationId, options) {
|
|
1463
|
-
return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
|
|
1464
|
-
},
|
|
1465
|
-
async getEntitlement (applicationId, entitlementId) {
|
|
1466
|
-
return await rest.get(rest.routes.monetization.entitlement(applicationId, entitlementId));
|
|
1467
|
-
},
|
|
1468
|
-
async deleteTestEntitlement (applicationId, entitlementId) {
|
|
1469
|
-
await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
|
|
1470
|
-
},
|
|
1471
|
-
async consumeEntitlement (applicationId, entitlementId) {
|
|
1472
|
-
await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
|
|
1473
|
-
},
|
|
1474
|
-
async listSkus (applicationId) {
|
|
1475
|
-
return await rest.get(rest.routes.monetization.skus(applicationId));
|
|
1476
|
-
},
|
|
1477
|
-
async listSubscriptions (skuId, options) {
|
|
1478
|
-
return await rest.get(rest.routes.monetization.subscriptions(skuId, options));
|
|
1479
|
-
},
|
|
1480
|
-
async getSubscription (skuId, subscriptionId) {
|
|
1481
|
-
return await rest.get(rest.routes.monetization.subscription(skuId, subscriptionId));
|
|
1482
|
-
},
|
|
1483
|
-
async sendSoundboardSound (channelId, options) {
|
|
1484
|
-
await rest.post(rest.routes.soundboard.sendSound(channelId), {
|
|
1485
|
-
body: options
|
|
1486
|
-
});
|
|
1487
|
-
},
|
|
1488
|
-
async listDefaultSoundboardSounds () {
|
|
1489
|
-
return await rest.get(rest.routes.soundboard.listDefault());
|
|
1490
|
-
},
|
|
1491
|
-
async listGuildSoundboardSounds (guildId) {
|
|
1492
|
-
return await rest.get(rest.routes.soundboard.guildSounds(guildId));
|
|
1493
|
-
},
|
|
1494
|
-
async getGuildSoundboardSound (guildId, soundId) {
|
|
1495
|
-
return await rest.get(rest.routes.soundboard.guildSound(guildId, soundId));
|
|
1496
|
-
},
|
|
1497
|
-
async createGuildSoundboardSound (guildId, options, reason) {
|
|
1498
|
-
return await rest.post(rest.routes.soundboard.guildSounds(guildId), {
|
|
1499
|
-
body: options,
|
|
1500
|
-
reason
|
|
1501
|
-
});
|
|
1502
|
-
},
|
|
1503
|
-
async modifyGuildSoundboardSound (guildId, soundId, options, reason) {
|
|
1504
|
-
return await rest.post(rest.routes.soundboard.guildSound(guildId, soundId), {
|
|
1505
|
-
body: options,
|
|
1506
|
-
reason
|
|
1507
|
-
});
|
|
1508
|
-
},
|
|
1509
|
-
async deleteGuildSoundboardSound (guildId, soundId, reason) {
|
|
1510
|
-
return await rest.delete(rest.routes.soundboard.guildSound(guildId, soundId), {
|
|
1511
|
-
reason
|
|
1512
|
-
});
|
|
1513
|
-
},
|
|
1514
|
-
async listApplicationRoleConnectionsMetadataRecords (applicationId) {
|
|
1515
|
-
return await rest.get(rest.routes.applicationRoleConnectionMetadata(applicationId));
|
|
1516
|
-
},
|
|
1517
|
-
async updateApplicationRoleConnectionsMetadataRecords (applicationId, options) {
|
|
1518
|
-
return await rest.put(rest.routes.applicationRoleConnectionMetadata(applicationId), {
|
|
1519
|
-
body: options
|
|
1520
|
-
});
|
|
1521
|
-
},
|
|
1522
|
-
async createLobby (options) {
|
|
1523
|
-
return await rest.post(rest.routes.lobby.create(), {
|
|
1524
|
-
body: options
|
|
1525
|
-
});
|
|
1526
|
-
},
|
|
1527
|
-
async getLobby (lobbyId) {
|
|
1528
|
-
return await rest.get(rest.routes.lobby.lobby(lobbyId));
|
|
1529
|
-
},
|
|
1530
|
-
async modifyLobby (lobbyId, options) {
|
|
1531
|
-
return await rest.patch(rest.routes.lobby.lobby(lobbyId), {
|
|
1532
|
-
body: options
|
|
1533
|
-
});
|
|
1534
|
-
},
|
|
1535
|
-
async deleteLobby (lobbyId) {
|
|
1536
|
-
return await rest.delete(rest.routes.lobby.lobby(lobbyId));
|
|
1537
|
-
},
|
|
1538
|
-
async addMemberToLobby (lobbyId, userId, options) {
|
|
1539
|
-
return await rest.put(rest.routes.lobby.member(lobbyId, userId), {
|
|
1540
|
-
body: options
|
|
1541
|
-
});
|
|
1542
|
-
},
|
|
1543
|
-
async removeMemberFromLobby (lobbyId, userId) {
|
|
1544
|
-
return await rest.delete(rest.routes.lobby.member(lobbyId, userId));
|
|
1545
|
-
},
|
|
1546
|
-
async leaveLobby (lobbyId, bearerToken) {
|
|
1547
|
-
return await rest.delete(rest.routes.lobby.leave(lobbyId), {
|
|
1548
|
-
headers: {
|
|
1549
|
-
authorization: `Bearer ${bearerToken}`
|
|
1550
|
-
},
|
|
1551
|
-
unauthorized: true
|
|
1552
|
-
});
|
|
1553
|
-
},
|
|
1554
|
-
async linkChannelToLobby (lobbyId, bearerToken, options) {
|
|
1555
|
-
return await rest.patch(rest.routes.lobby.link(lobbyId), {
|
|
1556
|
-
body: options,
|
|
1557
|
-
headers: {
|
|
1558
|
-
authorization: `Bearer ${bearerToken}`
|
|
1559
|
-
},
|
|
1560
|
-
unauthorized: true
|
|
1561
|
-
});
|
|
1562
|
-
},
|
|
1563
|
-
async unlinkChannelToLobby (lobbyId, bearerToken) {
|
|
1564
|
-
return await rest.patch(rest.routes.lobby.link(lobbyId), {
|
|
1565
|
-
headers: {
|
|
1566
|
-
authorization: `Bearer ${bearerToken}`
|
|
1567
|
-
},
|
|
1568
|
-
unauthorized: true
|
|
1569
|
-
});
|
|
1570
|
-
},
|
|
1571
|
-
preferSnakeCase (enabled) {
|
|
1572
|
-
const camelizer = enabled ? (x)=>x : camelize;
|
|
1573
|
-
rest.get = async (url, options)=>{
|
|
1574
|
-
return camelizer(await rest.makeRequest('GET', url, options));
|
|
1575
|
-
};
|
|
1576
|
-
rest.post = async (url, options)=>{
|
|
1577
|
-
return camelizer(await rest.makeRequest('POST', url, options));
|
|
1578
|
-
};
|
|
1579
|
-
rest.delete = async (url, options)=>{
|
|
1580
|
-
camelizer(await rest.makeRequest('DELETE', url, options));
|
|
1581
|
-
};
|
|
1582
|
-
rest.patch = async (url, options)=>{
|
|
1583
|
-
return camelizer(await rest.makeRequest('PATCH', url, options));
|
|
1584
|
-
};
|
|
1585
|
-
rest.put = async (url, options)=>{
|
|
1586
|
-
return camelizer(await rest.makeRequest('PUT', url, options));
|
|
1587
|
-
};
|
|
1588
|
-
return rest;
|
|
1589
|
-
}
|
|
1590
|
-
};
|
|
1591
|
-
return rest;
|
|
1592
|
-
}
|
|
1593
|
-
var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
|
|
1594
|
-
/** Minimum value of a code in oder to consider that it was successful. */ HttpResponseCode[HttpResponseCode["Success"] = 200] = "Success";
|
|
1595
|
-
/** Request completed successfully, but Discord returned an empty body. */ HttpResponseCode[HttpResponseCode["NoContent"] = 204] = "NoContent";
|
|
1596
|
-
/** Minimum value of a code in order to consider that something went wrong. */ HttpResponseCode[HttpResponseCode["Error"] = 400] = "Error";
|
|
1597
|
-
/** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
|
|
1598
|
-
return HttpResponseCode;
|
|
1599
|
-
}(HttpResponseCode || {});
|
|
1600
|
-
|
|
1601
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHsgdHlwZSBJbnNwZWN0T3B0aW9ucywgaW5zcGVjdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB0eXBlIHtcbiAgQmlnU3RyaW5nLFxuICBDYW1lbGl6ZSxcbiAgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIERpc2NvcmRBY3Rpdml0eUluc3RhbmNlLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uLFxuICBEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRCdWxrQmFuLFxuICBEaXNjb3JkQ2hhbm5lbCxcbiAgRGlzY29yZENvbm5lY3Rpb24sXG4gIERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbixcbiAgRGlzY29yZEVtb2ppLFxuICBEaXNjb3JkRW50aXRsZW1lbnQsXG4gIERpc2NvcmRGb2xsb3dlZENoYW5uZWwsXG4gIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEd1aWxkLFxuICBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEd1aWxkT25ib2FyZGluZyxcbiAgRGlzY29yZEd1aWxkUHJldmlldyxcbiAgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICBEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncyxcbiAgRGlzY29yZEluY2lkZW50c0RhdGEsXG4gIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZSxcbiAgRGlzY29yZEludml0ZSxcbiAgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICBEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHMsXG4gIERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzLFxuICBEaXNjb3JkTG9iYnksXG4gIERpc2NvcmRMb2JieU1lbWJlcixcbiAgRGlzY29yZE1lbWJlcixcbiAgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICBEaXNjb3JkTWVzc2FnZSxcbiAgRGlzY29yZFBydW5lZENvdW50LFxuICBEaXNjb3JkUm9sZSxcbiAgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICBEaXNjb3JkU2t1LFxuICBEaXNjb3JkU291bmRib2FyZFNvdW5kLFxuICBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgRGlzY29yZFN0aWNrZXIsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFZhbml0eVVybCxcbiAgRGlzY29yZFZvaWNlUmVnaW9uLFxuICBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgRGlzY29yZFdlYmhvb2ssXG4gIERpc2NvcmRXZWxjb21lU2NyZWVuLFxuICBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUJpdHMsXG4gIGNhbWVsaXplLFxuICBjYW1lbFRvU25ha2VDYXNlLFxuICBESVNDT1JERU5PX1ZFUlNJT04sXG4gIGRlbGF5LFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgaGFzUHJvcGVydHksXG4gIGxvZ2dlcixcbiAgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLFxuICB1cmxUb0Jhc2U2NCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCB9IGZyb20gJy4vaW52YWxpZEJ1Y2tldC5qcydcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZS5qcydcbmltcG9ydCB7IGNyZWF0ZVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsIENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucywgTWFrZVJlcXVlc3RPcHRpb25zLCBSZXN0TWFuYWdlciwgU2VuZFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcy5qcydcblxuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1ZFUlNJT04gPSAxMFxuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1VSTCA9ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaSdcblxuZXhwb3J0IGNvbnN0IEFVRElUX0xPR19SRUFTT05fSEVBREVSID0gJ3gtYXVkaXQtbG9nLXJlYXNvbidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIgPSAneC1yYXRlbGltaXQtcmVtYWluaW5nJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfR0xPQkFMX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1nbG9iYWwnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LWJ1Y2tldCdcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1saW1pdCdcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1zY29wZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyk6IFJlc3RNYW5hZ2VyIHtcbiAgY29uc3QgYXBwbGljYXRpb25JZCA9IG9wdGlvbnMuYXBwbGljYXRpb25JZCA/IEJpZ0ludChvcHRpb25zLmFwcGxpY2F0aW9uSWQpIDogZ2V0Qm90SWRGcm9tVG9rZW4ob3B0aW9ucy50b2tlbilcblxuICBjb25zdCBiYXNlVXJsID0gb3B0aW9ucy5wcm94eT8uYmFzZVVybCA/PyBESVNDT1JEX0FQSV9VUkxcbiAgLy8gRGlzY29yZCBlcnJvciBjYW4gZ2V0IG5lc3RlZCBhIGxvdCwgc28gd2UgdXNlIGEgY3VzdG9tIGluc3BlY3QgdG8gY2hhbmdlIHRoZSBkZXB0aCB0byBJbmZpbml0eVxuICBjb25zdCBiYXNlRXJyb3JQcm90b3R5cGUgPSB7XG4gICAgW2luc3BlY3QuY3VzdG9tXShfZGVwdGg6IG51bWJlciwgb3B0aW9uczogSW5zcGVjdE9wdGlvbnMsIF9pbnNwZWN0OiB0eXBlb2YgaW5zcGVjdCkge1xuICAgICAgcmV0dXJuIF9pbnNwZWN0KHRoaXMsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVwdGg6IEluZmluaXR5LFxuICAgICAgICAvLyBTaW5jZSB3ZSBjYWxsIGluc3BlY3Qgb24gb3Vyc2VsZiwgd2UgbmVlZCB0byBkaXNhYmxlIHRoZSBjYWxscyB0byB0aGUgaW5zcGVjdC5jdXN0b20gc3ltYm9sIG9yIGVsc2UgaXQgd2lsbCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLlxuICAgICAgICBjdXN0b21JbnNwZWN0OiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHJlc3Q6IFJlc3RNYW5hZ2VyID0ge1xuICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgYXV0aG9yaXphdGlvbjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbixcbiAgICBhdXRob3JpemF0aW9uSGVhZGVyOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uSGVhZGVyID8/ICdhdXRob3JpemF0aW9uJyxcbiAgICBiYXNlVXJsLFxuICAgIGRlbGV0ZVF1ZXVlRGVsYXk6IDYwMDAwLFxuICAgIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGZhbHNlLFxuICAgIGludmFsaWRCdWNrZXQ6IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0KHsgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciB9KSxcbiAgICBpc1Byb3hpZWQ6ICFiYXNlVXJsLnN0YXJ0c1dpdGgoRElTQ09SRF9BUElfVVJMKSxcbiAgICB1cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50OiBvcHRpb25zLnByb3h5Py51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50LFxuICAgIG1heFJldHJ5Q291bnQ6IEluZmluaXR5LFxuICAgIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBmYWxzZSxcbiAgICBxdWV1ZXM6IG5ldyBNYXAoKSxcbiAgICByYXRlTGltaXRlZFBhdGhzOiBuZXcgTWFwKCksXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IERJU0NPUkRfQVBJX1ZFUlNJT04sXG4gICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXIsXG4gICAgZXZlbnRzOiB7XG4gICAgICByZXF1ZXN0OiAoKSA9PiB7fSxcbiAgICAgIHJlc3BvbnNlOiAoKSA9PiB7fSxcbiAgICAgIHJlcXVlc3RFcnJvcjogKCkgPT4ge30sXG4gICAgICAuLi5vcHRpb25zLmV2ZW50cyxcbiAgICB9LFxuXG4gICAgcm91dGVzOiBjcmVhdGVSb3V0ZXMoKSxcblxuICAgIGNyZWF0ZUJhc2VIZWFkZXJzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7RElTQ09SREVOT19WRVJTSU9OfSlgLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja1JhdGVMaW1pdHModXJsLCBpZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCByYXRlbGltaXRlZCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gKVxuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZVRva2VuUXVldWVzKG9sZFRva2VuLCBuZXdUb2tlbikge1xuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmICghcmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJUaGUgJ3Byb3h5LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQnIG9wdGlvbiBuZWVkcyB0byBiZSBzZXQgd2hlbiB1c2luZyBhIHJlc3QgcHJveHkgYW5kIG5lZWRlZCB0byBjYWxsICd1cGRhdGVUb2tlblF1ZXVlcydcIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS8ke3Jlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludH1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb2xkVG9rZW4sXG4gICAgICAgICAgICBuZXdUb2tlbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdJZGVudGlmaWVyID0gYEJlYXJlciAke25ld1Rva2VufWBcblxuICAgICAgLy8gVXBkYXRlIGFsbCB0aGUgcXVldWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHF1ZXVlXSBvZiByZXN0LnF1ZXVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5xdWV1ZXMuZGVsZXRlKGtleSlcbiAgICAgICAgcXVldWUuaWRlbnRpZmllciA9IG5ld0lkZW50aWZpZXJcblxuICAgICAgICBjb25zdCBuZXdLZXkgPSBgJHtuZXdJZGVudGlmaWVyfSR7cXVldWUudXJsfWBcbiAgICAgICAgY29uc3QgbmV3UXVldWUgPSByZXN0LnF1ZXVlcy5nZXQobmV3S2V5KVxuXG4gICAgICAgIC8vIE1lcmdlIHRoZSBxdWV1ZXNcbiAgICAgICAgaWYgKG5ld1F1ZXVlKSB7XG4gICAgICAgICAgbmV3UXVldWUud2FpdGluZy51bnNoaWZ0KC4uLnF1ZXVlLndhaXRpbmcpXG4gICAgICAgICAgbmV3UXVldWUucGVuZGluZy51bnNoaWZ0KC4uLnF1ZXVlLnBlbmRpbmcpXG5cbiAgICAgICAgICBxdWV1ZS53YWl0aW5nID0gW11cbiAgICAgICAgICBxdWV1ZS5wZW5kaW5nID0gW11cblxuICAgICAgICAgIHF1ZXVlLmNsZWFudXAoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3QucXVldWVzLnNldChuZXdLZXksIHF1ZXVlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgcmF0ZWxpbWl0UGF0aF0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWVcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke25ld0lkZW50aWZpZXJ9JHtyYXRlbGltaXRQYXRoLnVybH1gLCByYXRlbGltaXRQYXRoKVxuXG4gICAgICAgIGlmIChyYXRlbGltaXRQYXRoLmJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC5idWNrZXRJZH1gLCByYXRlbGltaXRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoYW5nZVRvRGlzY29yZEZvcm1hdChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuXG4gICAgICAgICAgLy8gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHNuYWtlX2Nhc2Ugd2UgY2FuIGFzc3VtZSBpdCBpcyBhbHJlYWR5IGluIHRoZSBkaXNjb3JkIGZvcm1hdC5cbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfJykpIHtcbiAgICAgICAgICAgIG5ld09ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU29tZSBmYWxzeSB2YWx1ZXMgc2hvdWxkIGJlIGFsbG93ZWQgbGlrZSBudWxsIG9yIDBcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSAncGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICBjYXNlICdhbGxvdyc6XG4gICAgICAgICAgICAgIGNhc2UgJ2RlbnknOlxuICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogY2FsY3VsYXRlQml0cyh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZWZhdWx0TWVtYmVyUGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZWZhdWx0X21lbWJlcl9wZXJtaXNzaW9ucyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnbmFtZUxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5uYW1lX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLmRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3T2JqW2NhbWVsVG9TbmFrZUNhc2Uoa2V5KV0gPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPYmpcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSByZXR1cm4gb2JqLnRvU3RyaW5nKClcblxuICAgICAgcmV0dXJuIG9ialxuICAgIH0sXG5cbiAgICBjcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmNyZWF0ZUJhc2VIZWFkZXJzKClcblxuICAgICAgaWYgKG9wdGlvbnM/LnVuYXV0aG9yaXplZCAhPT0gdHJ1ZSkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnM/LnJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbQVVESVRfTE9HX1JFQVNPTl9IRUFERVJdID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnM/LnJlYXNvbilcbiAgICAgIH1cblxuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IEZvcm1EYXRhIHwgdW5kZWZpbmVkXG5cbiAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gYWRkIHNwZWNpZmljIGNoZWNrIGZvciBHRVQgbWV0aG9kXG4gICAgICAvLyBTaW5jZSBHRVQgZG9lcyBub3QgYWxsb3cgYm9kaWVzXG5cbiAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGF0dGFjaG1lbnRzIGZpcnN0LCBzaW5jZSBib2R5IHRoZW4gaGFzIHRvIGJlIHNlbmQgaW4gYSBkaWZmZXJlbnQgd2F5LlxuICAgICAgaWYgKG9wdGlvbnM/LmZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5maWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlc1ske2l9XWAsIG9wdGlvbnMuZmlsZXNbaV0uYmxvYiwgb3B0aW9ucy5maWxlc1tpXS5uYW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGF2ZSB0byB1c2UgY2hhbmdlVG9EaXNjb3JkRm9ybWF0IG9yIGVsc2UgSlNPTi5zdHJpbmdpZnkgbWF5IHRocm93IGFuIGVycm9yIGZvciB0aGUgcHJlc2VuY2Ugb2YgQmlnSW50KHMpIGluIHRoZSBqc29uXG4gICAgICAgIGZvcm0uYXBwZW5kKCdwYXlsb2FkX2pzb24nLCBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh7IC4uLm9wdGlvbnMuYm9keSwgZmlsZXM6IHVuZGVmaW5lZCB9KSkpXG5cbiAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICBib2R5ID0gZm9ybVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICYmIG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykge1xuICAgICAgICAvLyBPQXV0aDIgYm9keSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBmb3JtQm9keTogc3RyaW5nW10gPSBbXVxuXG4gICAgICAgIGNvbnN0IGRpc2NvcmRCb2R5ID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KVxuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkaXNjb3JkQm9keSkge1xuICAgICAgICAgIGZvcm1Cb2R5LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApfT0ke2VuY29kZVVSSUNvbXBvbmVudChkaXNjb3JkQm9keVtwcm9wXSl9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgPSBmb3JtQm9keS5qb2luKCcmJylcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICAgIGJvZHkgPSBvcHRpb25zLmJvZHlcbiAgICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpXG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24vanNvbmBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBtZXRob2QsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgZm9yIG9mIGxvb3AuICR7XG4gICAgICAgIC8vICAgdmFsdWUucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgICAgLy8gfWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIGhhcyBub3QgcmVhY2hlZCBjYW5jZWxcbiAgICAgICAgaWYgKHZhbHVlLnJlc2V0VGltZXN0YW1wID4gbm93KSBjb250aW51ZVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXQgaXMgb3ZlciwgZGVsZXRlIHRoZSByYXRlIGxpbWl0ZXJcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmRlbGV0ZShrZXkpXG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBBTEwgUEFUSFMgQVJFIENMRUFSRUQgQ0FOIENBTkNFTCBPVVQhXG4gICAgICBpZiAocmVzdC5yYXRlTGltaXRlZFBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gdHJ1ZVxuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgICB9LCAxMDAwKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gICAgcHJvY2Vzc0hlYWRlcnModXJsLCBoZWFkZXJzLCBpZGVudGlmaWVyKSB7XG4gICAgICBsZXQgcmF0ZUxpbWl0ZWQgPSBmYWxzZVxuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIpXG4gICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIpXG4gICAgICBjb25zdCByZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIpXG4gICAgICAvLyB1bmRlZmluZWQgb3ZlcnJpZGUgbnVsbCBuZWVkZWQgZm9yIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSKSA/PyB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9MSU1JVF9IRUFERVIpXG5cbiAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlZCB0aGUgaWRlbnRpZmllciwgZmFsbGJhY2sgdG8gdGhlIGJvdCB0b2tlblxuICAgICAgaWRlbnRpZmllciA/Pz0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICByZXN0LnF1ZXVlcy5nZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gKT8uaGFuZGxlQ29tcGxldGVkUmVxdWVzdCh7XG4gICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nID8gTnVtYmVyKHJlbWFpbmluZykgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVydmFsOiByZXRyeUFmdGVyID8gTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4OiBsaW1pdCA/IE51bWJlcihsaW1pdCkgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgUkFURSBMSU1JVCwgTUFSSyBJVCBBUyBSQVRFIExJTUlURURcbiAgICAgIGlmIChyZW1haW5pbmcgPT09ICcwJykge1xuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgQlVDS0VUIEFTIExJTUlURUQgU0lOQ0UgRElGRkVSRU5UIFVSTFMgTUFZIFNIQVJFIEEgQlVDS0VUXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7aWRlbnRpZmllcn0ke2J1Y2tldElkfWAsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIEdMT0JBTCBMSU1JVCwgTUFSSyBJVCBSQVRFIExJTUlURUQgR0xPQkFMTFlcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IE51bWJlcihoZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKSkgKiAxMDAwXG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXJcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgPSBHbG9iYWxseSBSYXRlIExpbWl0ZWRdIFVSTDogJHt1cmx9IHwgR2xvYmFsIFJlc3Q6ICR7Z2xvYmFsUmVzZXR9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gdHJ1ZVxuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgICB9LCByZXRyeUFmdGVyKVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoJ2dsb2JhbCcsIHtcbiAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXRlTGltaXRlZCAmJiAhcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocykge1xuICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXRlTGltaXRlZCA/IGJ1Y2tldElkIDogdW5kZWZpbmVkXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy5yb3V0ZX1gXG4gICAgICBjb25zdCBwYXlsb2FkID0gcmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnMpXG5cbiAgICAgIGNvbnN0IGxvZ2dpbmdIZWFkZXJzID0geyAuLi5wYXlsb2FkLmhlYWRlcnMgfVxuXG4gICAgICBpZiAocGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvblNjaGVtZSA9IHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdCgnICcpWzBdXG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRob3JpemF0aW9uU2NoZW1lfSB0b2tlbmhlcmVgXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHBheWxvYWQpXG4gICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0KHJlcXVlc3QsIHtcbiAgICAgICAgYm9keTogb3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnM/LmJvZHksXG4gICAgICB9KVxuXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1Zyhgc2VuZGluZyByZXF1ZXN0IHRvICR7dXJsfWAsICd3aXRoIHBheWxvYWQ6JywgeyAuLi5wYXlsb2FkLCBoZWFkZXJzOiBsb2dnaW5nSGVhZGVycyB9KVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIHJlc3QuZXZlbnRzLnJlcXVlc3RFcnJvcihyZXF1ZXN0LCBlcnJvciwgeyBib2R5OiBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uYm9keSB9KVxuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYXMgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpXG4gICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgZXJyb3I6ICdQb3NzaWJsZSBuZXR3b3JrIG9yIHJlcXVlc3Qgc2hhcGUgaXNzdWUgb2NjdXJyZWQuIElmIHRoaXMgaXMgcmFyZSwgaXRzIGEgbmV0d29yayBnbGl0Y2guIElmIGl0IG9jY3VycyBhIGxvdCBzb21ldGhpbmcgaXMgd3JvbmcuJyxcbiAgICAgICAgfSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0pXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaGVkIGZyb20gJHt1cmx9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfSAmICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlc3BvbnNlLmpzb24oKSA6IHJlc3BvbnNlLnRleHQoKSkuY2F0Y2goKCkgPT4gbnVsbClcblxuICAgICAgcmVzdC5ldmVudHMucmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UsIHtcbiAgICAgICAgcmVxdWVzdEJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgICByZXNwb25zZUJvZHk6IGJvZHksXG4gICAgICB9KVxuXG4gICAgICAvLyBNYXJrIHJlcXVlc3QgYXMgY29tcGxldGVkXG4gICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdChyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfU0NPUEVfSEVBREVSKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMucm91dGUsIG9wdGlvbnMubWV0aG9kKSwgcmVzcG9uc2UuaGVhZGVycywgcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pXG5cbiAgICAgIGlmIChidWNrZXRJZCkgb3B0aW9ucy5idWNrZXRJZCA9IGJ1Y2tldElkXG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCBIdHRwUmVzcG9uc2VDb2RlLlN1Y2Nlc3MgfHwgcmVzcG9uc2Uuc3RhdHVzID49IEh0dHBSZXNwb25zZUNvZGUuRXJyb3IpIHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGZhaWxlZC5gKVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IEh0dHBSZXNwb25zZUNvZGUuVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBib2R5IH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gd2FzIHJhdGVsaW1pdGVkLmApXG4gICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZClcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKGBbUkVTVCAtIFJldHJpZXNNYXhlZF0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGVycm9yOiAnVGhlIHJlcXVlc3Qgd2FzIHJhdGUgbGltaXRlZCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDFcblxuICAgICAgICBjb25zdCByZXNldEFmdGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIpXG4gICAgICAgIGlmIChyZXNldEFmdGVyKSBhd2FpdCBkZWxheShOdW1iZXIocmVzZXRBZnRlcikgKiAxMDAwKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIGEgcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50XG4gICAgICBvcHRpb25zLnJlc29sdmUoeyBvazogdHJ1ZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IHJlc3BvbnNlLnN0YXR1cyA9PT0gSHR0cFJlc3BvbnNlQ29kZS5Ob0NvbnRlbnQgPyB1bmRlZmluZWQgOiBib2R5IH0pXG4gICAgfSxcblxuICAgIHNpbXBsaWZ5VXJsKHVybCwgbWV0aG9kKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpXG4gICAgICBjb25zdCBzZWNvbmRMYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdXG5cbiAgICAgIGlmIChzZWNvbmRMYXN0UGFydCA9PT0gJ2NoYW5uZWxzJyB8fCBzZWNvbmRMYXN0UGFydCA9PT0gJ2d1aWxkcycpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdyZWFjdGlvbnMnIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSAnQG1lJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICAgIHBhcnRzLnB1c2goJ3JlYWN0aW9ucycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTEpXG4gICAgICAgIHBhcnRzLnB1c2goJ3gnKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFydHNbcGFydHMubGVuZ3RoIC0gM10gPT09ICdyZWFjdGlvbnMnKSB7XG4gICAgICAgIHBhcnRzLnNwbGljZSgtMilcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc2Vjb25kTGFzdFBhcnQgPT09ICdtZXNzYWdlcycpIHtcbiAgICAgICAgcmV0dXJuIGBEJHtwYXJ0cy5qb2luKCcvJyl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFydHMuam9pbignLycpXG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0Lm1ldGhvZClcblxuICAgICAgaWYgKHJlcXVlc3QucnVuVGhyb3VnaFF1ZXVlID09PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIHRoZSByZXF1ZXN0IGhhcyBhIHRva2VuLCB1c2UgaXRcbiAgICAgIC8vIEVsc2UgZmFsbGJhY2sgdG8gcHJlZml4IHdpdGggdGhlIGJvdCB0b2tlblxuICAgICAgY29uc3QgcXVldWVJZGVudGlmaWVyID0gcmVxdWVzdC5yZXF1ZXN0Qm9keU9wdGlvbnM/LmhlYWRlcnM/LmF1dGhvcml6YXRpb24gPz8gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICBjb25zdCBxdWV1ZSA9IHJlc3QucXVldWVzLmdldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSwgaWRlbnRpZmllcjogcXVldWVJZGVudGlmaWVyIH0pXG5cbiAgICAgICAgLy8gU2F2ZSBxdWV1ZVxuICAgICAgICByZXN0LnF1ZXVlcy5zZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWAsIGJ1Y2tldFF1ZXVlKVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgcm91dGUsIG9wdGlvbnMpIHtcbiAgICAgIC8vIFRoaXMgZXJyb3IgbmVlZHMgdG8gYmUgY3JlYXRlZCBoZXJlIGJlY2F1c2Ugb2YgaG93IHN0YWNrIHRyYWNlcyBnZXQgY2FsY3VsYXRlZFxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKVxuXG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKHJlc3QuYXV0aG9yaXphdGlvbikge1xuICAgICAgICAgIG9wdGlvbnMgPz89IHt9XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gLCByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykpXG4gICAgICAgIHJlc3QuZXZlbnRzLnJlcXVlc3QocmVxdWVzdCwge1xuICAgICAgICAgIGJvZHk6IG9wdGlvbnM/LmJvZHksXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdClcblxuICAgICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgKHJlc3VsdC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlc3VsdC5qc29uKCkgOiByZXN1bHQudGV4dCgpKS5jYXRjaCgoKSA9PiBudWxsKVxuXG4gICAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3VsdCwge1xuICAgICAgICAgIHJlcXVlc3RCb2R5OiBvcHRpb25zPy5ib2R5LFxuICAgICAgICAgIHJlc3BvbnNlQm9keTogYm9keSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIGVycm9yLmNhdXNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGJhc2VFcnJvclByb3RvdHlwZSksIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnN0YXR1cyAhPT0gMjA0ID8gKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoYm9keSkgOiBib2R5KSA6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHJlcXVlc3RCb2R5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgKHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/ICh0eXBlb2YgZGF0YS5ib2R5ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YS5ib2R5KSA6IGRhdGEuYm9keSkgOiB1bmRlZmluZWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBlcnJvclRleHQ6IHN0cmluZ1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHJlYXNvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgb3B0aW9ucyB3YXMgaW1wcm9wZXJseSBmb3JtYXR0ZWQsIG9yIHRoZSBzZXJ2ZXIgY291bGRuJ3QgdW5kZXJzdGFuZCBpdC5cIlxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgd2FzIG1pc3Npbmcgb3IgaW52YWxpZC4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gJ1RoZSBBdXRob3JpemF0aW9uIHRva2VuIHlvdSBwYXNzZWQgZGlkIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdGhlIHJlc291cmNlLidcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSBcIlRoZSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3QuXCJcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDQwNTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEhUVFAgbWV0aG9kIHVzZWQgaXMgbm90IHZhbGlkIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLidcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDQyOTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSBcIllvdSdyZSBiZWluZyByYXRlbGltaXRlZC5cIlxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgNTAyOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGVyZSB3YXMgbm90IGEgZ2F0ZXdheSBhdmFpbGFibGUgdG8gcHJvY2VzcyB5b3VyIG9wdGlvbnMuIFdhaXQgYSBiaXQgYW5kIHJldHJ5LidcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IHJlYXNvbi5zdGF0dXNUZXh0ID8/ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlID0gYFske3JlYXNvbi5zdGF0dXN9XSAke2Vycm9yVGV4dH1gXG5cbiAgICAgICAgICAgIC8vIElmIGRpc2NvcmQgc2VudCB1cyBKU09OLCBpdCBpcyBwcm9iYWJseSBnb2luZyB0byBiZSBhbiBlcnJvciBtZXNzYWdlIGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbmQgYWRkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRvIHRoZSBlcnJvciBtZXNzYWdlLCB0aGUgZnVsbCBib2R5IHdpbGwgYmUgaW4gdGhlIGVycm9yLmNhdXNlXG4gICAgICAgICAgICAvLyBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZWZlcmVuY2UjZXJyb3ItbWVzc2FnZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhc29uLmJvZHkgPT09ICdvYmplY3QnICYmIGhhc1Byb3BlcnR5KHJlYXNvbi5ib2R5LCAnY29kZScpICYmIGhhc1Byb3BlcnR5KHJlYXNvbi5ib2R5LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcbkRpc2NvcmQgZXJyb3I6IFske3JlYXNvbi5ib2R5LmNvZGV9XSAke3JlYXNvbi5ib2R5Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCByZWFzb24pXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydW5UaHJvdWdoUXVldWU6IG9wdGlvbnM/LnJ1blRocm91Z2hRdWV1ZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnREVMRVRFJywgdXJsLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcGF0Y2g8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmJvdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9ucywgb3JkZXJlZCA9IGZhbHNlKSB7XG4gICAgICBpZiAoIW9yZGVyZWQpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVhY3Rpb25zLm1hcChhc3luYyAocmVhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKVxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlYWN0aW9uIG9mIHJlYWN0aW9ucykge1xuICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGREbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVFbW9qaShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBcHBsaWNhdGlvbkVtb2ppKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGJvZHksIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICBmb3JtLmFwcGVuZCgnZmlsZScsIG9wdGlvbnMuZmlsZS5ibG9iLCBvcHRpb25zLmZpbGUubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ2Rlc2NyaXB0aW9uJywgb3B0aW9ucy5kZXNjcmlwdGlvbilcbiAgICAgIGZvcm0uYXBwZW5kKCd0YWdzJywgb3B0aW9ucy50YWdzKVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCksIHsgYm9keTogZm9ybSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvcnVtKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBib2R5ID0ge30sIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkSW52aXRlPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVJvbGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU3RhZ2VJbnN0YW5jZShib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUFwcGxpY2F0aW9uRW1vamkoaWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZXMoY2hhbm5lbElkLCBtZXNzYWdlSWRzLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy5idWxrKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlSWRzLnNsaWNlKDAsIDEwMCkubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3duUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmJvdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNBbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5hbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuZW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUm9sZShndWlsZElkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVVc2VyUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHVzZXJJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQsIGNvbW1hbmRJZCwgYmVhcmVyVG9rZW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHtcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkxcbiAgICAgIGNvbnN0IGJhbm5lciA9IG9wdGlvbnM/LmJvdEJhbm5lclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEJhbm5lclVSTCkgOiBvcHRpb25zPy5ib3RCYW5uZXJVUkxcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgICAgYXZhdGFyLFxuICAgICAgICAgIGJhbm5lcixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIGJvZHkuaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkVtb2ppKGlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgYm9keTogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3duVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0VG9TcGVha1RpbWVzdGFtcDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcFxuICAgICAgICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZVBvc2l0aW9ucyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgdG9waWMsIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgYm9keTogeyB0b3BpYyB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB3ZWJob29rQ2hhbm5lbElkOiB0YXJnZXRDaGFubmVsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkluZm8oYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbigpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuY3VycmVudEF1dGhvcml6YXRpb24oKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGV4Y2hhbmdlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkuZ3JhbnRUeXBlID09PSAnY2xpZW50X2NyZWRlbnRpYWxzJykge1xuICAgICAgICByZXN0T3B0aW9ucy5ib2R5LnNjb3BlID0gYm9keS5zY29wZS5qb2luKCcgJylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQWNjZXNzVG9rZW5SZXNwb25zZT4ocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuRXhjaGFuZ2UoKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHJldm9rZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlblJldm9rZSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXVkaXRMb2coZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdWRpdExvZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1ZGl0bG9ncyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMucmVnaW9ucygpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW4oZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFucyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbChpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsW10+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbFdlYmhvb2tzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keTogeyByZWNpcGllbnRJZDogdXNlcklkIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHcm91cERtQ2hhbm5lbChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamkoZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkRW1vamlbXSB9PihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2F0ZXdheUJvdCgpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0R2F0ZXdheUJvdD4ocmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCwgb3B0aW9ucy5jb3VudHMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZHModG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1ha2VSZXF1ZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zIHwgdW5kZWZpbmVkID0gdG9rZW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxQYXJ0aWFsPERpc2NvcmRHdWlsZD5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnVzZXJHdWlsZHMob3B0aW9ucyksIG1ha2VSZXF1ZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRQcmV2aWV3KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRQcmV2aWV3PihyZXN0LnJvdXRlcy5ndWlsZHMucHJldmlldyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZSh0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuY29kZSh0ZW1wbGF0ZUNvZGUpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlW10+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFdlYmhvb2tzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5ndWlsZHMud2ViaG9va3MoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludGVncmF0aW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludGVncmF0aW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrKHN0aWNrZXJQYWNrSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2s+KHJlc3Qucm91dGVzLnN0aWNrZXJQYWNrKHN0aWNrZXJQYWNrSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFja3MoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrW10+KHJlc3Qucm91dGVzLnN0aWNrZXJQYWNrcygpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbFBpbnMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbnMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UGlubmVkTWVzc2FnZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGlucyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5qb2luZWQoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJ1bmVDb3VudChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFBydW5lZENvdW50PihyZXN0LnJvdXRlcy5ndWlsZHMucHJ1bmUoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wdWJsaWMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGUoZ3VpbGRJZCwgcm9sZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnRbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PEFycmF5PHsgdXNlcjogRGlzY29yZFVzZXI7IG1lbWJlcj86IERpc2NvcmRNZW1iZXIgfT4+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMudXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2F0ZXdheUJvdCgpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE93blZvaWNlU3RhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlcihzdGlja2VySWQ6IEJpZ1N0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5zdGlja2VyKHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmdldFVzZXIoY2hhbm5lbElkLCB1c2VySWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXIoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50VXNlcih0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy5jdXJyZW50VXNlcigpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckNvbm5lY3Rpb25zKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENvbm5lY3Rpb25bXT4ocmVzdC5yb3V0ZXMub2F1dGgyLmNvbm5lY3Rpb25zKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VmFuaXR5VXJsKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVmFuaXR5VXJsPihyZXN0LnJvdXRlcy5ndWlsZHMudmFuaXR5KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWb2ljZVJlZ2lvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMucmVnaW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9vayh3ZWJob29rSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWxjb21lU2NyZWVuKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0PihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0SnNvbihndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5sZWF2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5jcm9zc3Bvc3QoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZURtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMsIHBhcmFtcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx2b2lkIHwgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiwgcGFyYW1zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5kYXRhPy5maWxlcyxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UG9sbEFuc3dlclZvdGVycyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYW5zd2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0QW5zd2VyVm90ZXNSZXNwb25zZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucG9sbHMudm90ZXMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5kUG9sbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucG9sbHMuZXhwaXJlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQ8dm9pZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGJ1bGtCYW5NZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQnVsa0Jhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYnVsa0JhbihndWlsZElkKSwgeyBib2R5OiBvcHRpb25zLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJvdChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRNZW1iZXIoZ3VpbGRJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmN1cnJlbnRNZW1iZXIoZ3VpbGRJZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVycyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQWN0aXZpdHlJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBraWNrTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VQaW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnNlYXJjaChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkT25ib2FyZGluZyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRJbmNpZGVudEFjdGlvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRJbmNpZGVudHNEYXRhPihyZXN0LnJvdXRlcy5ndWlsZHMuaW5jaWRlbnRBY3Rpb25zKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMudHlwaW5nKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZEd1aWxkTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVUZXN0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RFbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudFtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50PihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFNrdXMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTa3VbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnNrdXMoYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbltdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRTb3VuZGJvYXJkU291bmQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuc291bmRib2FyZC5zZW5kU291bmQoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmRbXT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5saXN0RGVmYXVsdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkU291bmRib2FyZFNvdW5kW10gfT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzKGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YShhcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVMb2JieShvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkuY3JlYXRlKCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldExvYmJ5KGxvYmJ5SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBtb2RpZnlMb2JieShsb2JieUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVMb2JieShsb2JieUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMubG9iYnkubG9iYnkobG9iYnlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZE1lbWJlclRvTG9iYnkobG9iYnlJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZExvYmJ5TWVtYmVyPihyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXIobG9iYnlJZCwgdXNlcklkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlTWVtYmVyRnJvbUxvYmJ5KGxvYmJ5SWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmxvYmJ5Lm1lbWJlcihsb2JieUlkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZUxvYmJ5KGxvYmJ5SWQsIGJlYXJlclRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMubG9iYnkubGVhdmUobG9iYnlJZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaW5rQ2hhbm5lbFRvTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubGluayhsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVubGlua0NoYW5uZWxUb0xvYmJ5KGxvYmJ5SWQsIGJlYXJlclRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxpbmsobG9iYnlJZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBwcmVmZXJTbmFrZUNhc2UoZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgY29uc3QgY2FtZWxpemVyID0gZW5hYmxlZCA/ICh4OiBhbnkpID0+IHggOiBjYW1lbGl6ZVxuXG4gICAgICByZXN0LmdldCA9IGFzeW5jICh1cmwsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnBvc3QgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QuZGVsZXRlID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnREVMRVRFJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wYXRjaCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucHV0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0XG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiByZXN0XG59XG5cbmVudW0gSHR0cFJlc3BvbnNlQ29kZSB7XG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvZGVyIHRvIGNvbnNpZGVyIHRoYXQgaXQgd2FzIHN1Y2Nlc3NmdWwuICovXG4gIFN1Y2Nlc3MgPSAyMDAsXG4gIC8qKiBSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBEaXNjb3JkIHJldHVybmVkIGFuIGVtcHR5IGJvZHkuICovXG4gIE5vQ29udGVudCA9IDIwNCxcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9yZGVyIHRvIGNvbnNpZGVyIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcuICovXG4gIEVycm9yID0gNDAwLFxuICAvKiogVGhpcyByZXF1ZXN0IGdvdCByYXRlIGxpbWl0ZWQuICovXG4gIFRvb01hbnlSZXF1ZXN0cyA9IDQyOSxcbn1cbiJdLCJuYW1lcyI6WyJCdWZmZXIiLCJpbnNwZWN0IiwiY2FsY3VsYXRlQml0cyIsImNhbWVsaXplIiwiY2FtZWxUb1NuYWtlQ2FzZSIsIkRJU0NPUkRFTk9fVkVSU0lPTiIsImRlbGF5IiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJoYXNQcm9wZXJ0eSIsImxvZ2dlciIsInByb2Nlc3NSZWFjdGlvblN0cmluZyIsInVybFRvQmFzZTY0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJRdWV1ZSIsImNyZWF0ZVJvdXRlcyIsIkRJU0NPUkRfQVBJX1ZFUlNJT04iLCJESVNDT1JEX0FQSV9VUkwiLCJBVURJVF9MT0dfUkVBU09OX0hFQURFUiIsIlJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiIsIlJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ0b2tlbiIsImJhc2VVcmwiLCJwcm94eSIsImJhc2VFcnJvclByb3RvdHlwZSIsImN1c3RvbSIsIl9kZXB0aCIsIl9pbnNwZWN0IiwiZGVwdGgiLCJJbmZpbml0eSIsImN1c3RvbUluc3BlY3QiLCJyZXN0IiwiYXV0aG9yaXphdGlvbiIsImF1dGhvcml6YXRpb25IZWFkZXIiLCJkZWxldGVRdWV1ZURlbGF5IiwiZ2xvYmFsbHlSYXRlTGltaXRlZCIsImludmFsaWRCdWNrZXQiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwidXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCIsIm1heFJldHJ5Q291bnQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJ2ZXJzaW9uIiwiZXZlbnRzIiwicmVxdWVzdCIsInJlc3BvbnNlIiwicmVxdWVzdEVycm9yIiwicm91dGVzIiwiY3JlYXRlQmFzZUhlYWRlcnMiLCJjaGVja1JhdGVMaW1pdHMiLCJ1cmwiLCJpZGVudGlmaWVyIiwicmF0ZWxpbWl0ZWQiLCJnZXQiLCJnbG9iYWwiLCJub3ciLCJEYXRlIiwicmVzZXRUaW1lc3RhbXAiLCJ1cGRhdGVUb2tlblF1ZXVlcyIsIm9sZFRva2VuIiwibmV3VG9rZW4iLCJFcnJvciIsImhlYWRlcnMiLCJ1bmRlZmluZWQiLCJmZXRjaCIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibmV3SWRlbnRpZmllciIsImtleSIsInF1ZXVlIiwiZW50cmllcyIsImRlbGV0ZSIsIm5ld0tleSIsIm5ld1F1ZXVlIiwid2FpdGluZyIsInVuc2hpZnQiLCJwZW5kaW5nIiwiY2xlYW51cCIsInNldCIsInJhdGVsaW1pdFBhdGgiLCJidWNrZXRJZCIsImNoYW5nZVRvRGlzY29yZEZvcm1hdCIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0ZW0iLCJuZXdPYmoiLCJPYmplY3QiLCJrZXlzIiwidmFsdWUiLCJpbmNsdWRlcyIsImRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zIiwibmFtZV9sb2NhbGl6YXRpb25zIiwiZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyIsInRvU3RyaW5nIiwiY3JlYXRlUmVxdWVzdEJvZHkiLCJ1bmF1dGhvcml6ZWQiLCJyZWFzb24iLCJlbmNvZGVVUklDb21wb25lbnQiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImZvcm1Cb2R5IiwiZGlzY29yZEJvZHkiLCJwcm9wIiwicHVzaCIsImpvaW4iLCJhc3NpZ24iLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aG9yaXphdGlvblNjaGVtZSIsInNwbGl0IiwiUmVxdWVzdCIsImRlYnVnIiwiY2F0Y2giLCJlcnJvciIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImpzb24iLCJ0ZXh0IiwicmVxdWVzdEJvZHkiLCJyZXNwb25zZUJvZHkiLCJzaW1wbGlmeVVybCIsInJldHJ5Q291bnQiLCJyZXNldEFmdGVyIiwicmV0cnlSZXF1ZXN0IiwicmVzb2x2ZSIsInBhcnRzIiwic2Vjb25kTGFzdFBhcnQiLCJzcGxpY2UiLCJwcm9jZXNzUmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJyZXN1bHQiLCJjYXVzZSIsImNyZWF0ZSIsInBhcnNlIiwiUHJvbWlzZSIsImRhdGEiLCJlcnJvclRleHQiLCJtZXNzYWdlIiwiY29kZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwiY2hhbm5lbElkIiwibWVzc2FnZUlkIiwicmVhY3Rpb24iLCJjaGFubmVscyIsInJlYWN0aW9ucyIsImJvdCIsImFkZFJlYWN0aW9ucyIsIm9yZGVyZWQiLCJhbGwiLCJhZGRSb2xlIiwiZ3VpbGRJZCIsInVzZXJJZCIsInJvbGVJZCIsImd1aWxkcyIsInJvbGVzIiwibWVtYmVyIiwiYWRkVGhyZWFkTWVtYmVyIiwidGhyZWFkcyIsInVzZXIiLCJhZGREbVJlY2lwaWVudCIsImRtUmVjaXBpZW50IiwiY3JlYXRlQXV0b21vZFJ1bGUiLCJhdXRvbW9kIiwicnVsZXMiLCJjcmVhdGVDaGFubmVsIiwiY3JlYXRlRW1vamkiLCJlbW9qaXMiLCJjcmVhdGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaXMiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJyZXN0T3B0aW9ucyIsImJlYXJlclRva2VuIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJ0ZW1wbGF0ZXMiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwiaW52aXRlcyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJkZWxldGVBdXRvbW9kUnVsZSIsInJ1bGVJZCIsInJ1bGUiLCJkZWxldGVDaGFubmVsIiwiY2hhbm5lbCIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJvdmVyd3JpdGVJZCIsIm92ZXJ3cml0ZSIsImRlbGV0ZUVtb2ppIiwiaWQiLCJlbW9qaSIsImRlbGV0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwib25lIiwiZGVsZXRlR3VpbGRTdGlja2VyIiwic3RpY2tlcklkIiwic3RpY2tlciIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJ0ZW1wbGF0ZUNvZGUiLCJndWlsZCIsImRlbGV0ZUludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9uIiwiZGVsZXRlSW52aXRlIiwiaW52aXRlQ29kZSIsImludml0ZSIsImRlbGV0ZU1lc3NhZ2UiLCJkZWxldGVNZXNzYWdlcyIsIm1lc3NhZ2VJZHMiLCJidWxrIiwibWVzc2FnZXMiLCJzbGljZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsIm9yaWdpbmFsIiwiZGVsZXRlT3duUmVhY3Rpb24iLCJkZWxldGVSZWFjdGlvbnNBbGwiLCJkZWxldGVSZWFjdGlvbnNFbW9qaSIsImRlbGV0ZVJvbGUiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImV2ZW50SWQiLCJldmVudCIsImRlbGV0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZSIsImRlbGV0ZVVzZXJSZWFjdGlvbiIsImRlbGV0ZVdlYmhvb2siLCJ3ZWJob29rSWQiLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJ3ZWJob29rIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJiYW5uZXIiLCJib3RCYW5uZXJVUkwiLCJjdXJyZW50VXNlciIsInVzZXJuYW1lIiwidHJpbSIsImVkaXRDaGFubmVsIiwiZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJlZGl0RW1vamkiLCJlZGl0QXBwbGljYXRpb25FbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZHMiLCJtYWtlUmVxdWVzdE9wdGlvbnMiLCJ1c2VyR3VpbGRzIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZFByZXZpZXciLCJwcmV2aWV3IiwiZ2V0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGVzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldEludGVncmF0aW9ucyIsImludGVncmF0aW9ucyIsImdldEludml0ZSIsImdldEludml0ZXMiLCJnZXRNZXNzYWdlIiwiZ2V0TWVzc2FnZXMiLCJnZXRTdGlja2VyUGFjayIsInN0aWNrZXJQYWNrSWQiLCJzdGlja2VyUGFjayIsImdldFN0aWNrZXJQYWNrcyIsInN0aWNrZXJQYWNrcyIsImdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImdldENoYW5uZWxQaW5zIiwibWVzc2FnZVBpbnMiLCJnZXRQaW5uZWRNZXNzYWdlcyIsInBpbnMiLCJnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzIiwicHJpdmF0ZSIsImdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMiLCJqb2luZWQiLCJnZXRQcnVuZUNvdW50IiwicHJ1bmUiLCJnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMiLCJwdWJsaWMiLCJnZXRSb2xlcyIsImdldFJvbGUiLCJnZXRTY2hlZHVsZWRFdmVudCIsIndpdGhVc2VyQ291bnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwidXNlcnMiLCJnZXRTZXNzaW9uSW5mbyIsImdldFN0YWdlSW5zdGFuY2UiLCJnZXRPd25Wb2ljZVN0YXRlIiwiZ2V0VXNlclZvaWNlU3RhdGUiLCJnZXRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VyIiwiZ2V0R3VpbGRTdGlja2VycyIsImdldFRocmVhZE1lbWJlciIsImdldFVzZXIiLCJnZXRUaHJlYWRNZW1iZXJzIiwiZ2V0UmVhY3Rpb25zIiwiZ2V0Q3VycmVudFVzZXIiLCJnZXRVc2VyQ29ubmVjdGlvbnMiLCJjb25uZWN0aW9ucyIsImdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwicm9sZUNvbm5lY3Rpb25zIiwiZ2V0VmFuaXR5VXJsIiwidmFuaXR5IiwiZ2V0Vm9pY2VSZWdpb25zIiwiZ2V0V2ViaG9vayIsImdldFdlYmhvb2tNZXNzYWdlIiwiZ2V0V2ViaG9va1dpdGhUb2tlbiIsImdldFdlbGNvbWVTY3JlZW4iLCJnZXRXaWRnZXQiLCJ3aWRnZXRKc29uIiwiZ2V0V2lkZ2V0U2V0dGluZ3MiLCJqb2luVGhyZWFkIiwibWUiLCJsZWF2ZUd1aWxkIiwibGVhdmUiLCJsZWF2ZVRocmVhZCIsInB1Ymxpc2hNZXNzYWdlIiwiY3Jvc3Nwb3N0IiwicmVtb3ZlUm9sZSIsInJlbW92ZVRocmVhZE1lbWJlciIsInJlbW92ZURtUmVjaXBpZW50Iiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwiaW50ZXJhY3Rpb25JZCIsInBhcmFtcyIsImNhbGxiYWNrIiwic2VuZE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSIsImdldFBvbGxBbnN3ZXJWb3RlcnMiLCJhbnN3ZXJJZCIsInBvbGxzIiwidm90ZXMiLCJlbmRQb2xsIiwiZXhwaXJlIiwic3luY0d1aWxkVGVtcGxhdGUiLCJiYW5NZW1iZXIiLCJidWxrQmFuTWVtYmVycyIsImJ1bGtCYW4iLCJlZGl0Qm90TWVtYmVyIiwiZWRpdE1lbWJlciIsImdldE1lbWJlciIsImdldEN1cnJlbnRNZW1iZXIiLCJjdXJyZW50TWVtYmVyIiwiZ2V0TWVtYmVycyIsImdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImluc3RhbmNlSWQiLCJhcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UiLCJraWNrTWVtYmVyIiwicGluTWVzc2FnZSIsIm1lc3NhZ2VQaW4iLCJwcnVuZU1lbWJlcnMiLCJzZWFyY2hNZW1iZXJzIiwicXVlcnkiLCJzZWFyY2giLCJnZXRHdWlsZE9uYm9hcmRpbmciLCJvbmJvYXJkaW5nIiwiZWRpdEd1aWxkT25ib2FyZGluZyIsIm1vZGlmeUd1aWxkSW5jaWRlbnRBY3Rpb25zIiwiaW5jaWRlbnRBY3Rpb25zIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidHlwaW5nIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsImFkZEd1aWxkTWVtYmVyIiwiY3JlYXRlVGVzdEVudGl0bGVtZW50IiwibW9uZXRpemF0aW9uIiwiZW50aXRsZW1lbnRzIiwibGlzdEVudGl0bGVtZW50cyIsImdldEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwibGlzdFN1YnNjcmlwdGlvbnMiLCJza3VJZCIsInN1YnNjcmlwdGlvbnMiLCJnZXRTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25JZCIsInN1YnNjcmlwdGlvbiIsInNlbmRTb3VuZGJvYXJkU291bmQiLCJzb3VuZGJvYXJkIiwic2VuZFNvdW5kIiwibGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzIiwibGlzdERlZmF1bHQiLCJsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRTb3VuZHMiLCJnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kSWQiLCJndWlsZFNvdW5kIiwiY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwibGlzdEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzIiwiYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhIiwidXBkYXRlQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMiLCJjcmVhdGVMb2JieSIsImxvYmJ5IiwiZ2V0TG9iYnkiLCJsb2JieUlkIiwibW9kaWZ5TG9iYnkiLCJkZWxldGVMb2JieSIsImFkZE1lbWJlclRvTG9iYnkiLCJyZW1vdmVNZW1iZXJGcm9tTG9iYnkiLCJsZWF2ZUxvYmJ5IiwibGlua0NoYW5uZWxUb0xvYmJ5IiwibGluayIsInVubGlua0NoYW5uZWxUb0xvYmJ5IiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxNQUFNLFFBQVEsY0FBYTtBQUNwQyxTQUE4QkMsT0FBTyxRQUFRLFlBQVc7QUEyRHhELFNBQ0VDLGFBQWEsRUFDYkMsUUFBUSxFQUNSQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsS0FBSyxFQUNMQyxpQkFBaUIsRUFDakJDLFdBQVcsRUFDWEMsTUFBTSxFQUNOQyxxQkFBcUIsRUFDckJDLFdBQVcs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
|