@discordeno/rest 19.0.0-next.b2f65c2 → 19.0.0-next.b567c13

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.
Files changed (50) hide show
  1. package/dist/cjs/index.cjs +23 -0
  2. package/dist/cjs/invalidBucket.cjs +84 -0
  3. package/dist/cjs/manager.cjs +1325 -0
  4. package/dist/cjs/queue.cjs +165 -0
  5. package/dist/cjs/routes.cjs +533 -0
  6. package/dist/cjs/types.cjs +6 -0
  7. package/dist/cjs/typings/routes.cjs +6 -0
  8. package/dist/esm/index.js +8 -0
  9. package/dist/esm/invalidBucket.js +82 -0
  10. package/dist/esm/manager.js +1303 -0
  11. package/dist/esm/queue.js +157 -0
  12. package/dist/esm/routes.js +525 -0
  13. package/dist/esm/types.js +3 -0
  14. package/dist/esm/typings/routes.js +3 -0
  15. package/dist/types/index.d.ts.map +1 -0
  16. package/dist/types/invalidBucket.d.ts.map +1 -0
  17. package/dist/types/manager.d.ts.map +1 -0
  18. package/dist/{queue.d.ts → types/queue.d.ts} +5 -0
  19. package/dist/types/queue.d.ts.map +1 -0
  20. package/dist/types/routes.d.ts.map +1 -0
  21. package/dist/{types.d.ts → types/types.d.ts} +212 -13
  22. package/dist/types/types.d.ts.map +1 -0
  23. package/dist/{typings → types/typings}/routes.d.ts +24 -4
  24. package/dist/types/typings/routes.d.ts.map +1 -0
  25. package/package.json +13 -7
  26. package/dist/index.d.ts.map +0 -1
  27. package/dist/index.js +0 -8
  28. package/dist/index.js.map +0 -1
  29. package/dist/invalidBucket.d.ts.map +0 -1
  30. package/dist/invalidBucket.js +0 -82
  31. package/dist/invalidBucket.js.map +0 -1
  32. package/dist/manager.d.ts.map +0 -1
  33. package/dist/manager.js +0 -1139
  34. package/dist/manager.js.map +0 -1
  35. package/dist/queue.d.ts.map +0 -1
  36. package/dist/queue.js +0 -153
  37. package/dist/queue.js.map +0 -1
  38. package/dist/routes.d.ts.map +0 -1
  39. package/dist/routes.js +0 -487
  40. package/dist/routes.js.map +0 -1
  41. package/dist/types.d.ts.map +0 -1
  42. package/dist/types.js +0 -3
  43. package/dist/types.js.map +0 -1
  44. package/dist/typings/routes.d.ts.map +0 -1
  45. package/dist/typings/routes.js +0 -3
  46. package/dist/typings/routes.js.map +0 -1
  47. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  48. /package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +0 -0
  49. /package/dist/{manager.d.ts → types/manager.d.ts} +0 -0
  50. /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
@@ -0,0 +1,1325 @@
1
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ DISCORD_API_VERSION: ()=>DISCORD_API_VERSION,
13
+ DISCORD_API_URL: ()=>DISCORD_API_URL,
14
+ AUDIT_LOG_REASON_HEADER: ()=>AUDIT_LOG_REASON_HEADER,
15
+ RATE_LIMIT_REMAINING_HEADER: ()=>RATE_LIMIT_REMAINING_HEADER,
16
+ RATE_LIMIT_RESET_AFTER_HEADER: ()=>RATE_LIMIT_RESET_AFTER_HEADER,
17
+ RATE_LIMIT_GLOBAL_HEADER: ()=>RATE_LIMIT_GLOBAL_HEADER,
18
+ RATE_LIMIT_BUCKET_HEADER: ()=>RATE_LIMIT_BUCKET_HEADER,
19
+ RATE_LIMIT_LIMIT_HEADER: ()=>RATE_LIMIT_LIMIT_HEADER,
20
+ RATE_LIMIT_SCOPE_HEADER: ()=>RATE_LIMIT_SCOPE_HEADER,
21
+ createRestManager: ()=>createRestManager
22
+ });
23
+ const _nodeBuffer = require("node:buffer");
24
+ const _utils = require("@discordeno/utils");
25
+ const _invalidBucketJs = require("./invalidBucket.cjs");
26
+ const _queueJs = require("./queue.cjs");
27
+ const _types = require("@discordeno/types");
28
+ const _routesJs = require("./routes.cjs");
29
+ // TODO: make dynamic based on package.cjson file
30
+ const version = '19.0.0-alpha.1';
31
+ const DISCORD_API_VERSION = 10;
32
+ const DISCORD_API_URL = 'https://discord.com/api';
33
+ const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
34
+ const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
35
+ const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
36
+ const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
37
+ const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
38
+ const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
39
+ const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
40
+ function createRestManager(options) {
41
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : options.token ? (0, _utils.getBotIdFromToken)(options.token) : undefined;
42
+ if (!applicationId) {
43
+ throw new Error('`applicationId` was not provided and was not able to extract the id from the bots token. Please explicitly pass `applicationId` to the rest manager.');
44
+ }
45
+ const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
46
+ const rest = {
47
+ applicationId,
48
+ authorization: options.proxy?.authorization,
49
+ authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
50
+ baseUrl,
51
+ deleteQueueDelay: 60000,
52
+ globallyRateLimited: false,
53
+ invalidBucket: (0, _invalidBucketJs.createInvalidRequestBucket)({}),
54
+ isProxied: !baseUrl.startsWith(DISCORD_API_URL),
55
+ maxRetryCount: Infinity,
56
+ processingRateLimitedPaths: false,
57
+ queues: new Map(),
58
+ rateLimitedPaths: new Map(),
59
+ token: options.token,
60
+ version: options.version ?? DISCORD_API_VERSION,
61
+ routes: (0, _routesJs.createRoutes)(),
62
+ createBaseHeaders () {
63
+ return {
64
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
65
+ };
66
+ },
67
+ checkRateLimits (url, headers) {
68
+ const authHeader = headers?.authorization ?? '';
69
+ const ratelimited = rest.rateLimitedPaths.get(`${authHeader}${url}`);
70
+ const global = rest.rateLimitedPaths.get('global');
71
+ const now = Date.now();
72
+ if (ratelimited && now < ratelimited.resetTimestamp) {
73
+ return ratelimited.resetTimestamp - now;
74
+ }
75
+ if (global && now < global.resetTimestamp) {
76
+ return global.resetTimestamp - now;
77
+ }
78
+ return false;
79
+ },
80
+ changeToDiscordFormat (obj) {
81
+ if (obj === null) return null;
82
+ if (typeof obj === 'object') {
83
+ if (Array.isArray(obj)) {
84
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
85
+ }
86
+ const newObj = {};
87
+ for (const key of Object.keys(obj)){
88
+ const value = obj[key];
89
+ // Some falsy values should be allowed like null or 0
90
+ if (value !== undefined) {
91
+ switch(key){
92
+ case 'permissions':
93
+ case 'allow':
94
+ case 'deny':
95
+ newObj[key] = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
96
+ continue;
97
+ case 'defaultMemberPermissions':
98
+ newObj.default_member_permissions = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
99
+ continue;
100
+ case 'nameLocalizations':
101
+ newObj.name_localizations = value;
102
+ continue;
103
+ case 'descriptionLocalizations':
104
+ newObj.description_localizations = value;
105
+ continue;
106
+ }
107
+ }
108
+ newObj[(0, _utils.camelToSnakeCase)(key)] = rest.changeToDiscordFormat(value);
109
+ }
110
+ return newObj;
111
+ }
112
+ if (typeof obj === 'bigint') return obj.toString();
113
+ return obj;
114
+ },
115
+ createRequestBody (method, options) {
116
+ const headers = this.createBaseHeaders();
117
+ if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
118
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
119
+ if (options?.reason !== undefined) {
120
+ headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
121
+ }
122
+ let body;
123
+ // TODO: check if we need to add specific check for GET method
124
+ // Since GET does not allow bodies
125
+ // Have to check for attachments first, since body then has to be send in a different way.
126
+ if (options?.files !== undefined) {
127
+ const form = new FormData();
128
+ for(let i = 0; i < options.files.length; ++i){
129
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
130
+ }
131
+ // Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
132
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
133
+ ...options.body,
134
+ files: undefined
135
+ })));
136
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
137
+ body = form;
138
+ } else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
139
+ // OAuth2 body handling
140
+ const formBody = [];
141
+ const discordBody = rest.changeToDiscordFormat(options.body);
142
+ for(const prop in discordBody){
143
+ formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
144
+ }
145
+ body = formBody.join('&');
146
+ } else if (options?.body !== undefined) {
147
+ if (options.body instanceof FormData) {
148
+ body = options.body;
149
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
150
+ } else {
151
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
152
+ headers['content-type'] = `application/json`;
153
+ }
154
+ }
155
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
156
+ if (options?.headers) {
157
+ Object.assign(headers, options.headers);
158
+ }
159
+ return {
160
+ body,
161
+ headers,
162
+ method
163
+ };
164
+ },
165
+ processRateLimitedPaths () {
166
+ const now = Date.now();
167
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
168
+ // rest.debug(
169
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
170
+ // value.resetTimestamp - now
171
+ // }`
172
+ // )
173
+ // If the time has not reached cancel
174
+ if (value.resetTimestamp > now) continue;
175
+ // Rate limit is over, delete the rate limiter
176
+ rest.rateLimitedPaths.delete(key);
177
+ // If it was global, also mark the global value as false
178
+ if (key === 'global') rest.globallyRateLimited = false;
179
+ }
180
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
181
+ if (rest.rateLimitedPaths.size === 0) {
182
+ rest.processingRateLimitedPaths = false;
183
+ } else {
184
+ rest.processingRateLimitedPaths = true;
185
+ // RECHECK IN 1 SECOND
186
+ setTimeout(()=>{
187
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
188
+ rest.processRateLimitedPaths();
189
+ }, 1000);
190
+ }
191
+ },
192
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, requestAuthorization) {
193
+ let rateLimited = false;
194
+ // GET ALL NECESSARY HEADERS
195
+ const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
196
+ const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
197
+ const reset = Date.now() + Number(retryAfter) * 1000;
198
+ const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
199
+ // undefined override null needed for typings
200
+ const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
201
+ const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
202
+ rest.queues.get(`${requestAuthorization}${url}`)?.handleCompletedRequest({
203
+ remaining: remaining ? Number(remaining) : undefined,
204
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
205
+ max: limit ? Number(limit) : undefined
206
+ });
207
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
208
+ if (remaining === '0') {
209
+ rateLimited = true;
210
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
211
+ rest.rateLimitedPaths.set(`${requestAuthorization}${url}`, {
212
+ url,
213
+ resetTimestamp: reset,
214
+ bucketId
215
+ });
216
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
217
+ if (bucketId) {
218
+ rest.rateLimitedPaths.set(`${requestAuthorization}${bucketId}`, {
219
+ url,
220
+ resetTimestamp: reset,
221
+ bucketId
222
+ });
223
+ }
224
+ }
225
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
226
+ if (global) {
227
+ const retryAfter = Number(headers.get('retry-after')) * 1000;
228
+ const globalReset = Date.now() + retryAfter;
229
+ // rest.debug(
230
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
231
+ // )
232
+ rest.globallyRateLimited = true;
233
+ rateLimited = true;
234
+ setTimeout(()=>{
235
+ rest.globallyRateLimited = false;
236
+ }, retryAfter);
237
+ rest.rateLimitedPaths.set('global', {
238
+ url: 'global',
239
+ resetTimestamp: globalReset,
240
+ bucketId
241
+ });
242
+ if (bucketId) {
243
+ rest.rateLimitedPaths.set(`${requestAuthorization}${bucketId}`, {
244
+ url: 'global',
245
+ resetTimestamp: globalReset,
246
+ bucketId
247
+ });
248
+ }
249
+ }
250
+ if (rateLimited && !rest.processingRateLimitedPaths) {
251
+ rest.processRateLimitedPaths();
252
+ }
253
+ return rateLimited ? bucketId : undefined;
254
+ },
255
+ async sendRequest (options) {
256
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
257
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
258
+ const loggingHeaders = {
259
+ ...payload.headers
260
+ };
261
+ const authenticationScheme = payload.headers.authorization?.split(' ')[0];
262
+ if (payload.headers.authorization) {
263
+ loggingHeaders.authorization = `${authenticationScheme} tokenhere`;
264
+ }
265
+ _utils.logger.debug(`sending request to ${url}`, 'with payload:', {
266
+ ...payload,
267
+ headers: loggingHeaders
268
+ });
269
+ const response = await fetch(url, payload).catch(async (error)=>{
270
+ _utils.logger.error(error);
271
+ // Mark request and completed
272
+ rest.invalidBucket.handleCompletedRequest(999, false);
273
+ options.reject({
274
+ ok: false,
275
+ status: 999,
276
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
277
+ });
278
+ throw error;
279
+ });
280
+ _utils.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
281
+ // Mark request and completed
282
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
283
+ // Set the bucket id if it was available on the headers
284
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, authenticationScheme === 'Bearer' ? payload.headers.authorization : '');
285
+ if (bucketId) options.bucketId = bucketId;
286
+ if (response.status < 200 || response.status >= 400) {
287
+ _utils.logger.debug(`Request to ${url} failed.`);
288
+ if (response.status !== 429) {
289
+ options.reject({
290
+ ok: false,
291
+ status: response.status,
292
+ body: await response.text()
293
+ });
294
+ return;
295
+ }
296
+ _utils.logger.debug(`Request to ${url} was ratelimited.`);
297
+ // Too many attempts, get rid of request from queue.
298
+ if (options.retryCount >= rest.maxRetryCount) {
299
+ _utils.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
300
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
301
+ options.reject({
302
+ ok: false,
303
+ status: response.status,
304
+ error: 'The request was rate limited and it maxed out the retries limit.'
305
+ });
306
+ return;
307
+ }
308
+ options.retryCount += 1;
309
+ const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
310
+ if (resetAfter) await (0, _utils.delay)(Number(resetAfter) * 1000);
311
+ // process the response to prevent mem leak
312
+ await response.arrayBuffer();
313
+ return await options.retryRequest?.(options);
314
+ }
315
+ // Discord sometimes sends no response with no content.
316
+ options.resolve({
317
+ ok: true,
318
+ status: response.status,
319
+ body: response.status === 204 ? undefined : await response.text()
320
+ });
321
+ },
322
+ simplifyUrl (url, method) {
323
+ const parts = url.split('/');
324
+ const secondLastPart = parts[parts.length - 2];
325
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
326
+ return url;
327
+ }
328
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
329
+ parts.splice(-2);
330
+ parts.push('reactions');
331
+ } else {
332
+ parts.splice(-1);
333
+ parts.push('x');
334
+ }
335
+ if (parts[parts.length - 3] === 'reactions') {
336
+ parts.splice(-2);
337
+ }
338
+ if (method === 'DELETE' && secondLastPart === 'messages') {
339
+ return `D${parts.join('/')}`;
340
+ }
341
+ return parts.join('/');
342
+ },
343
+ async processRequest (request) {
344
+ const url = rest.simplifyUrl(request.route, request.method);
345
+ if (request.runThroughQueue === false) {
346
+ await rest.sendRequest(request);
347
+ return;
348
+ }
349
+ const authHeader = request.requestBodyOptions?.headers?.authorization ?? '';
350
+ const queue = rest.queues.get(`${authHeader}${url}`);
351
+ if (queue !== undefined) {
352
+ queue.makeRequest(request);
353
+ } else {
354
+ // CREATES A NEW QUEUE
355
+ const bucketQueue = new _queueJs.Queue(rest, {
356
+ url,
357
+ deleteQueueDelay: rest.deleteQueueDelay,
358
+ authentication: authHeader
359
+ });
360
+ // Add request to queue
361
+ bucketQueue.makeRequest(request);
362
+ // Save queue
363
+ rest.queues.set(`${authHeader}${url}`, bucketQueue);
364
+ }
365
+ },
366
+ async makeRequest (method, route, options) {
367
+ if (rest.isProxied) {
368
+ if (rest.authorization !== undefined) {
369
+ options ??= {};
370
+ options.headers ??= {};
371
+ options.headers[rest.authorizationHeader] = rest.authorization;
372
+ }
373
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
374
+ if (!result.ok) {
375
+ const err = await result.cjson().catch(()=>{});
376
+ // Legacy Handling to not break old code or when body is missing
377
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
378
+ throw new Error(JSON.stringify(err));
379
+ }
380
+ return result.status !== 204 ? await result.cjson() : undefined;
381
+ }
382
+ // eslint-disable-next-line no-async-promise-executor
383
+ return await new Promise(async (resolve, reject)=>{
384
+ const payload = {
385
+ route,
386
+ method,
387
+ requestBodyOptions: options,
388
+ retryCount: 0,
389
+ retryRequest: async function(payload) {
390
+ await rest.processRequest(payload);
391
+ },
392
+ resolve: (data)=>{
393
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
394
+ },
395
+ reject,
396
+ runThroughQueue: options?.runThroughQueue
397
+ };
398
+ await rest.processRequest(payload);
399
+ });
400
+ },
401
+ async get (url, options) {
402
+ return (0, _utils.camelize)(await rest.makeRequest('GET', url, options));
403
+ },
404
+ async post (url, options) {
405
+ return (0, _utils.camelize)(await rest.makeRequest('POST', url, options));
406
+ },
407
+ async delete (url, options) {
408
+ (0, _utils.camelize)(await rest.makeRequest('DELETE', url, options));
409
+ },
410
+ async patch (url, options) {
411
+ return (0, _utils.camelize)(await rest.makeRequest('PATCH', url, options));
412
+ },
413
+ async put (url, options) {
414
+ return (0, _utils.camelize)(await rest.makeRequest('PUT', url, options));
415
+ },
416
+ async addReaction (channelId, messageId, reaction) {
417
+ reaction = (0, _utils.processReactionString)(reaction);
418
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
419
+ },
420
+ async addReactions (channelId, messageId, reactions, ordered = false) {
421
+ if (!ordered) {
422
+ await Promise.all(reactions.map(async (reaction)=>{
423
+ await rest.addReaction(channelId, messageId, reaction);
424
+ }));
425
+ return;
426
+ }
427
+ for (const reaction of reactions){
428
+ await rest.addReaction(channelId, messageId, reaction);
429
+ }
430
+ },
431
+ async addRole (guildId, userId, roleId, reason) {
432
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
433
+ reason
434
+ });
435
+ },
436
+ async addThreadMember (channelId, userId) {
437
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
438
+ },
439
+ async addDmRecipient (channelId, userId, body) {
440
+ await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
441
+ body
442
+ });
443
+ },
444
+ async createAutomodRule (guildId, body, reason) {
445
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
446
+ body,
447
+ reason
448
+ });
449
+ },
450
+ async createChannel (guildId, body, reason) {
451
+ return await rest.post(rest.routes.guilds.channels(guildId), {
452
+ body,
453
+ reason
454
+ });
455
+ },
456
+ async createEmoji (guildId, body, reason) {
457
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
458
+ body,
459
+ reason
460
+ });
461
+ },
462
+ async createGlobalApplicationCommand (body, options) {
463
+ const restOptions = {
464
+ body
465
+ };
466
+ if (options?.bearerToken) {
467
+ restOptions.unauthorized = true;
468
+ restOptions.headers = {
469
+ authorization: `Bearer ${options.bearerToken}`
470
+ };
471
+ }
472
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
473
+ },
474
+ async createGuild (body) {
475
+ return await rest.post(rest.routes.guilds.all(), {
476
+ body
477
+ });
478
+ },
479
+ async createGuildApplicationCommand (body, guildId, options) {
480
+ const restOptions = {
481
+ body
482
+ };
483
+ if (options?.bearerToken) {
484
+ restOptions.unauthorized = true;
485
+ restOptions.headers = {
486
+ authorization: `Bearer ${options.bearerToken}`
487
+ };
488
+ }
489
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
490
+ },
491
+ async createGuildFromTemplate (templateCode, body) {
492
+ if (body.icon) {
493
+ body.icon = await (0, _utils.urlToBase64)(body.icon);
494
+ }
495
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
496
+ body
497
+ });
498
+ },
499
+ async createGuildSticker (guildId, options, reason) {
500
+ const form = new FormData();
501
+ form.append('file', options.file.blob, options.file.name);
502
+ form.append('name', options.name);
503
+ form.append('description', options.description);
504
+ form.append('tags', options.tags);
505
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
506
+ body: form,
507
+ reason
508
+ });
509
+ },
510
+ async createGuildTemplate (guildId, body) {
511
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
512
+ body
513
+ });
514
+ },
515
+ async createForumThread (channelId, body, reason) {
516
+ return await rest.post(rest.routes.channels.forum(channelId), {
517
+ body,
518
+ files: body.files,
519
+ reason
520
+ });
521
+ },
522
+ async createInvite (channelId, body = {}, reason) {
523
+ return await rest.post(rest.routes.channels.invites(channelId), {
524
+ body,
525
+ reason
526
+ });
527
+ },
528
+ async createRole (guildId, body, reason) {
529
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
530
+ body,
531
+ reason
532
+ });
533
+ },
534
+ async createScheduledEvent (guildId, body, reason) {
535
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
536
+ body,
537
+ reason
538
+ });
539
+ },
540
+ async createStageInstance (body, reason) {
541
+ return await rest.post(rest.routes.channels.stages(), {
542
+ body,
543
+ reason
544
+ });
545
+ },
546
+ async createWebhook (channelId, options, reason) {
547
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
548
+ body: {
549
+ name: options.name,
550
+ avatar: options.avatar ? await (0, _utils.urlToBase64)(options.avatar) : undefined
551
+ },
552
+ reason
553
+ });
554
+ },
555
+ async deleteAutomodRule (guildId, ruleId, reason) {
556
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
557
+ reason
558
+ });
559
+ },
560
+ async deleteChannel (channelId, reason) {
561
+ await rest.delete(rest.routes.channels.channel(channelId), {
562
+ reason
563
+ });
564
+ },
565
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
566
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
567
+ reason
568
+ });
569
+ },
570
+ async deleteEmoji (guildId, id, reason) {
571
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
572
+ reason
573
+ });
574
+ },
575
+ async deleteFollowupMessage (token, messageId) {
576
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
577
+ unauthorized: true
578
+ });
579
+ },
580
+ async deleteGlobalApplicationCommand (commandId) {
581
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
582
+ },
583
+ async deleteGuild (guildId) {
584
+ await rest.delete(rest.routes.guilds.guild(guildId));
585
+ },
586
+ async deleteGuildApplicationCommand (commandId, guildId) {
587
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
588
+ },
589
+ async deleteGuildSticker (guildId, stickerId, reason) {
590
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
591
+ reason
592
+ });
593
+ },
594
+ async deleteGuildTemplate (guildId, templateCode) {
595
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
596
+ },
597
+ async deleteIntegration (guildId, integrationId, reason) {
598
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
599
+ reason
600
+ });
601
+ },
602
+ async deleteInvite (inviteCode, reason) {
603
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
604
+ reason
605
+ });
606
+ },
607
+ async deleteMessage (channelId, messageId, reason) {
608
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
609
+ reason
610
+ });
611
+ },
612
+ async deleteMessages (channelId, messageIds, reason) {
613
+ await rest.post(rest.routes.channels.bulk(channelId), {
614
+ body: {
615
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
616
+ },
617
+ reason
618
+ });
619
+ },
620
+ async deleteOriginalInteractionResponse (token) {
621
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
622
+ unauthorized: true
623
+ });
624
+ },
625
+ async deleteOwnReaction (channelId, messageId, reaction) {
626
+ reaction = (0, _utils.processReactionString)(reaction);
627
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
628
+ },
629
+ async deleteReactionsAll (channelId, messageId) {
630
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
631
+ },
632
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
633
+ reaction = (0, _utils.processReactionString)(reaction);
634
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
635
+ },
636
+ async deleteRole (guildId, roleId, reason) {
637
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
638
+ reason
639
+ });
640
+ },
641
+ async deleteScheduledEvent (guildId, eventId) {
642
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
643
+ },
644
+ async deleteStageInstance (channelId, reason) {
645
+ await rest.delete(rest.routes.channels.stage(channelId), {
646
+ reason
647
+ });
648
+ },
649
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
650
+ reaction = (0, _utils.processReactionString)(reaction);
651
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
652
+ },
653
+ async deleteWebhook (webhookId, reason) {
654
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
655
+ reason
656
+ });
657
+ },
658
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
659
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
660
+ },
661
+ async deleteWebhookWithToken (webhookId, token) {
662
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
663
+ },
664
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
665
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
666
+ body: {
667
+ permissions
668
+ },
669
+ headers: {
670
+ authorization: `Bearer ${bearerToken}`
671
+ }
672
+ });
673
+ },
674
+ async editAutomodRule (guildId, ruleId, body, reason) {
675
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
676
+ body,
677
+ reason
678
+ });
679
+ },
680
+ async editBotProfile (options) {
681
+ const avatar = options?.botAvatarURL ? await (0, _utils.urlToBase64)(options?.botAvatarURL) : options?.botAvatarURL;
682
+ return await rest.patch(rest.routes.currentUser(), {
683
+ body: {
684
+ username: options.username?.trim(),
685
+ avatar
686
+ }
687
+ });
688
+ },
689
+ async editChannel (channelId, body, reason) {
690
+ return await rest.patch(rest.routes.channels.channel(channelId), {
691
+ body,
692
+ reason
693
+ });
694
+ },
695
+ async editChannelPermissionOverrides (channelId, body, reason) {
696
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
697
+ body,
698
+ reason
699
+ });
700
+ },
701
+ async editChannelPositions (guildId, body) {
702
+ await rest.patch(rest.routes.guilds.channels(guildId), {
703
+ body
704
+ });
705
+ },
706
+ async editEmoji (guildId, id, body, reason) {
707
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
708
+ body,
709
+ reason
710
+ });
711
+ },
712
+ async editFollowupMessage (token, messageId, body) {
713
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
714
+ body,
715
+ files: body.files,
716
+ unauthorized: true
717
+ });
718
+ },
719
+ async editGlobalApplicationCommand (commandId, body) {
720
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
721
+ body
722
+ });
723
+ },
724
+ async editGuild (guildId, body, reason) {
725
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
726
+ body,
727
+ reason
728
+ });
729
+ },
730
+ async editGuildApplicationCommand (commandId, guildId, body) {
731
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
732
+ body
733
+ });
734
+ },
735
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
736
+ await rest.post(rest.routes.guilds.mfa(guildId), {
737
+ body: {
738
+ level: mfaLevel
739
+ },
740
+ reason
741
+ });
742
+ },
743
+ async editGuildSticker (guildId, stickerId, body, reason) {
744
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
745
+ body,
746
+ reason
747
+ });
748
+ },
749
+ async editGuildTemplate (guildId, templateCode, body) {
750
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
751
+ body
752
+ });
753
+ },
754
+ async editMessage (channelId, messageId, body) {
755
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
756
+ body,
757
+ files: body.files
758
+ });
759
+ },
760
+ async editOriginalInteractionResponse (token, body) {
761
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
762
+ body,
763
+ files: body.files
764
+ });
765
+ },
766
+ async editOriginalWebhookMessage (webhookId, token, options) {
767
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
768
+ body: {
769
+ type: _types.InteractionResponseTypes.UpdateMessage,
770
+ data: options
771
+ },
772
+ files: options.files,
773
+ unauthorized: true
774
+ });
775
+ },
776
+ async editOwnVoiceState (guildId, options) {
777
+ await rest.patch(rest.routes.guilds.voice(guildId), {
778
+ body: {
779
+ ...options,
780
+ request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
781
+ }
782
+ });
783
+ },
784
+ async editScheduledEvent (guildId, eventId, body, reason) {
785
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
786
+ body,
787
+ reason
788
+ });
789
+ },
790
+ async editRole (guildId, roleId, body, reason) {
791
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
792
+ body,
793
+ reason
794
+ });
795
+ },
796
+ async editRolePositions (guildId, body, reason) {
797
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
798
+ body,
799
+ reason
800
+ });
801
+ },
802
+ async editStageInstance (channelId, topic, reason) {
803
+ return await rest.patch(rest.routes.channels.stage(channelId), {
804
+ body: {
805
+ topic
806
+ },
807
+ reason
808
+ });
809
+ },
810
+ async editUserVoiceState (guildId, options) {
811
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
812
+ body: options
813
+ });
814
+ },
815
+ async editWebhook (webhookId, body, reason) {
816
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
817
+ body,
818
+ reason
819
+ });
820
+ },
821
+ async editWebhookMessage (webhookId, token, messageId, options) {
822
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
823
+ body: options,
824
+ files: options.files
825
+ });
826
+ },
827
+ async editWebhookWithToken (webhookId, token, body) {
828
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
829
+ body
830
+ });
831
+ },
832
+ async editWelcomeScreen (guildId, body, reason) {
833
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
834
+ body,
835
+ reason
836
+ });
837
+ },
838
+ async editWidgetSettings (guildId, body, reason) {
839
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
840
+ body,
841
+ reason
842
+ });
843
+ },
844
+ async executeWebhook (webhookId, token, options) {
845
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
846
+ body: options
847
+ });
848
+ },
849
+ async followAnnouncement (sourceChannelId, targetChannelId) {
850
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
851
+ body: {
852
+ webhook_channel_id: targetChannelId
853
+ }
854
+ });
855
+ },
856
+ async getActiveThreads (guildId) {
857
+ return await rest.get(rest.routes.channels.threads.active(guildId));
858
+ },
859
+ async getApplicationCommandPermission (guildId, commandId, options) {
860
+ const restOptions = {};
861
+ if (options?.accessToken) {
862
+ restOptions.unauthorized = true;
863
+ restOptions.headers = {
864
+ authorization: `Bearer ${options.accessToken}`
865
+ };
866
+ }
867
+ return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
868
+ },
869
+ async getApplicationCommandPermissions (guildId, options) {
870
+ const restOptions = {};
871
+ if (options?.accessToken) {
872
+ restOptions.unauthorized = true;
873
+ restOptions.headers = {
874
+ authorization: `Bearer ${options.accessToken}`
875
+ };
876
+ }
877
+ return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
878
+ },
879
+ async getApplicationInfo () {
880
+ return await rest.get(rest.routes.oauth2.application());
881
+ },
882
+ async getCurrentAuthenticationInfo (token) {
883
+ return await rest.get(rest.routes.oauth2.currentAuthorization(), {
884
+ headers: {
885
+ authorization: `Bearer ${token}`
886
+ },
887
+ unauthorized: true
888
+ });
889
+ },
890
+ async exchangeToken (clientId, clientSecret, body) {
891
+ const basicCredentials = _nodeBuffer.Buffer.from(`${clientId}:${clientSecret}`);
892
+ const restOptions = {
893
+ body,
894
+ headers: {
895
+ 'content-type': 'application/x-www-form-urlencoded',
896
+ authorization: `Basic ${basicCredentials.toString('base64')}`
897
+ },
898
+ unauthorized: true
899
+ };
900
+ if (body.grantType === 'client_credentials') {
901
+ restOptions.body.scope = body.scope.join(' ');
902
+ }
903
+ return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
904
+ },
905
+ async revokeToken (clientId, clientSecret, body) {
906
+ const basicCredentials = _nodeBuffer.Buffer.from(`${clientId}:${clientSecret}`);
907
+ await rest.post(rest.routes.oauth2.tokenRevoke(), {
908
+ body,
909
+ headers: {
910
+ 'content-type': 'application/x-www-form-urlencoded',
911
+ authorization: `Basic ${basicCredentials.toString('base64')}`
912
+ },
913
+ unauthorized: true
914
+ });
915
+ },
916
+ async getAuditLog (guildId, options) {
917
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
918
+ },
919
+ async getAutomodRule (guildId, ruleId) {
920
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
921
+ },
922
+ async getAutomodRules (guildId) {
923
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
924
+ },
925
+ async getAvailableVoiceRegions () {
926
+ return await rest.get(rest.routes.regions());
927
+ },
928
+ async getBan (guildId, userId) {
929
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
930
+ },
931
+ async getBans (guildId, options) {
932
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
933
+ },
934
+ async getChannel (id) {
935
+ return await rest.get(rest.routes.channels.channel(id));
936
+ },
937
+ async getChannelInvites (channelId) {
938
+ return await rest.get(rest.routes.channels.invites(channelId));
939
+ },
940
+ async getChannels (guildId) {
941
+ return await rest.get(rest.routes.guilds.channels(guildId));
942
+ },
943
+ async getChannelWebhooks (channelId) {
944
+ return await rest.get(rest.routes.channels.webhooks(channelId));
945
+ },
946
+ async getDmChannel (userId) {
947
+ return await rest.post(rest.routes.channels.dm(), {
948
+ body: {
949
+ recipient_id: userId
950
+ }
951
+ });
952
+ },
953
+ async getGroupDmChannel (body) {
954
+ return await rest.post(rest.routes.channels.dm(), {
955
+ body
956
+ });
957
+ },
958
+ async getEmoji (guildId, emojiId) {
959
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
960
+ },
961
+ async getEmojis (guildId) {
962
+ return await rest.get(rest.routes.guilds.emojis(guildId));
963
+ },
964
+ async getFollowupMessage (token, messageId) {
965
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
966
+ unauthorized: true
967
+ });
968
+ },
969
+ async getGatewayBot () {
970
+ return await rest.get(rest.routes.gatewayBot());
971
+ },
972
+ async getGlobalApplicationCommand (commandId) {
973
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
974
+ },
975
+ async getGlobalApplicationCommands () {
976
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
977
+ },
978
+ async getGuild (guildId, options = {
979
+ counts: true
980
+ }) {
981
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
982
+ },
983
+ async getGuilds (token, options) {
984
+ return await rest.get(rest.routes.guilds.userGuilds(options), {
985
+ headers: {
986
+ authorization: `Bearer ${token}`
987
+ },
988
+ unauthorized: true
989
+ });
990
+ },
991
+ async getGuildApplicationCommand (commandId, guildId) {
992
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
993
+ },
994
+ async getGuildApplicationCommands (guildId) {
995
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
996
+ },
997
+ async getGuildPreview (guildId) {
998
+ return await rest.get(rest.routes.guilds.preview(guildId));
999
+ },
1000
+ async getGuildTemplate (templateCode) {
1001
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1002
+ },
1003
+ async getGuildTemplates (guildId) {
1004
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1005
+ },
1006
+ async getGuildWebhooks (guildId) {
1007
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1008
+ },
1009
+ async getIntegrations (guildId) {
1010
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1011
+ },
1012
+ async getInvite (inviteCode, options) {
1013
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1014
+ },
1015
+ async getInvites (guildId) {
1016
+ return await rest.get(rest.routes.guilds.invites(guildId));
1017
+ },
1018
+ async getMessage (channelId, messageId) {
1019
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1020
+ },
1021
+ async getMessages (channelId, options) {
1022
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1023
+ },
1024
+ async getNitroStickerPacks () {
1025
+ return await rest.get(rest.routes.nitroStickerPacks());
1026
+ },
1027
+ async getOriginalInteractionResponse (token) {
1028
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
1029
+ unauthorized: true
1030
+ });
1031
+ },
1032
+ async getPinnedMessages (channelId) {
1033
+ return await rest.get(rest.routes.channels.pins(channelId));
1034
+ },
1035
+ async getPrivateArchivedThreads (channelId, options) {
1036
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1037
+ },
1038
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1039
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1040
+ },
1041
+ async getPruneCount (guildId, options) {
1042
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1043
+ },
1044
+ async getPublicArchivedThreads (channelId, options) {
1045
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1046
+ },
1047
+ async getRoles (guildId) {
1048
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1049
+ },
1050
+ async getScheduledEvent (guildId, eventId, options) {
1051
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1052
+ },
1053
+ async getScheduledEvents (guildId, options) {
1054
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1055
+ },
1056
+ async getScheduledEventUsers (guildId, eventId, options) {
1057
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1058
+ },
1059
+ async getSessionInfo () {
1060
+ return await rest.getGatewayBot();
1061
+ },
1062
+ async getStageInstance (channelId) {
1063
+ return await rest.get(rest.routes.channels.stage(channelId));
1064
+ },
1065
+ async getSticker (stickerId) {
1066
+ return await rest.get(rest.routes.sticker(stickerId));
1067
+ },
1068
+ async getGuildSticker (guildId, stickerId) {
1069
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1070
+ },
1071
+ async getGuildStickers (guildId) {
1072
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1073
+ },
1074
+ async getThreadMember (channelId, userId) {
1075
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1076
+ },
1077
+ async getThreadMembers (channelId) {
1078
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1079
+ },
1080
+ async getReactions (channelId, messageId, reaction, options) {
1081
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1082
+ },
1083
+ async getUser (id) {
1084
+ return await rest.get(rest.routes.user(id));
1085
+ },
1086
+ async getCurrentUser (token) {
1087
+ return await rest.get(rest.routes.currentUser(), {
1088
+ headers: {
1089
+ authorization: `Bearer ${token}`
1090
+ },
1091
+ unauthorized: true
1092
+ });
1093
+ },
1094
+ async getUserConnections (token) {
1095
+ return await rest.get(rest.routes.oauth2.connections(), {
1096
+ headers: {
1097
+ authorization: `Bearer ${token}`
1098
+ },
1099
+ unauthorized: true
1100
+ });
1101
+ },
1102
+ async getUserApplicationRoleConnection (token, applicationId) {
1103
+ return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
1104
+ headers: {
1105
+ authorization: `Bearer ${token}`
1106
+ },
1107
+ unauthorized: true
1108
+ });
1109
+ },
1110
+ async getVanityUrl (guildId) {
1111
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1112
+ },
1113
+ async getVoiceRegions (guildId) {
1114
+ return await rest.get(rest.routes.guilds.regions(guildId));
1115
+ },
1116
+ async getWebhook (webhookId) {
1117
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1118
+ },
1119
+ async getWebhookMessage (webhookId, token, messageId, options) {
1120
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
1121
+ },
1122
+ async getWebhookWithToken (webhookId, token) {
1123
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
1124
+ },
1125
+ async getWelcomeScreen (guildId) {
1126
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1127
+ },
1128
+ async getWidget (guildId) {
1129
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1130
+ },
1131
+ async getWidgetSettings (guildId) {
1132
+ return await rest.get(rest.routes.guilds.widget(guildId));
1133
+ },
1134
+ async joinThread (channelId) {
1135
+ await rest.put(rest.routes.channels.threads.me(channelId));
1136
+ },
1137
+ async leaveGuild (guildId) {
1138
+ await rest.delete(rest.routes.guilds.leave(guildId));
1139
+ },
1140
+ async leaveThread (channelId) {
1141
+ await rest.delete(rest.routes.channels.threads.me(channelId));
1142
+ },
1143
+ async publishMessage (channelId, messageId) {
1144
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1145
+ },
1146
+ async removeRole (guildId, userId, roleId, reason) {
1147
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1148
+ reason
1149
+ });
1150
+ },
1151
+ async removeThreadMember (channelId, userId) {
1152
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1153
+ },
1154
+ async removeDmRecipient (channelId, userId) {
1155
+ await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
1156
+ },
1157
+ async sendFollowupMessage (token, options) {
1158
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1159
+ body: options,
1160
+ files: options.files,
1161
+ unauthorized: true
1162
+ });
1163
+ },
1164
+ async sendInteractionResponse (interactionId, token, options) {
1165
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token), {
1166
+ body: options,
1167
+ files: options.data?.files,
1168
+ runThroughQueue: false,
1169
+ unauthorized: true
1170
+ });
1171
+ },
1172
+ async sendMessage (channelId, body) {
1173
+ return await rest.post(rest.routes.channels.messages(channelId), {
1174
+ body,
1175
+ files: body.files
1176
+ });
1177
+ },
1178
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1179
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1180
+ body,
1181
+ reason
1182
+ });
1183
+ },
1184
+ async startThreadWithoutMessage (channelId, body, reason) {
1185
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1186
+ body,
1187
+ reason
1188
+ });
1189
+ },
1190
+ async syncGuildTemplate (guildId) {
1191
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1192
+ },
1193
+ async banMember (guildId, userId, body, reason) {
1194
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1195
+ body,
1196
+ reason
1197
+ });
1198
+ },
1199
+ async editBotMember (guildId, body, reason) {
1200
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1201
+ body,
1202
+ reason
1203
+ });
1204
+ },
1205
+ async editMember (guildId, userId, body, reason) {
1206
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1207
+ body,
1208
+ reason
1209
+ });
1210
+ },
1211
+ async getMember (guildId, userId) {
1212
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1213
+ },
1214
+ async getCurrentMember (guildId, token) {
1215
+ return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1216
+ headers: {
1217
+ authorization: `Bearer ${token}`
1218
+ },
1219
+ unauthorized: true
1220
+ });
1221
+ },
1222
+ async getMembers (guildId, options) {
1223
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1224
+ },
1225
+ async kickMember (guildId, userId, reason) {
1226
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1227
+ reason
1228
+ });
1229
+ },
1230
+ async pinMessage (channelId, messageId, reason) {
1231
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1232
+ reason
1233
+ });
1234
+ },
1235
+ async pruneMembers (guildId, body, reason) {
1236
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1237
+ body,
1238
+ reason
1239
+ });
1240
+ },
1241
+ async searchMembers (guildId, query, options) {
1242
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1243
+ },
1244
+ async unbanMember (guildId, userId, reason) {
1245
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1246
+ reason
1247
+ });
1248
+ },
1249
+ async unpinMessage (channelId, messageId, reason) {
1250
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1251
+ reason
1252
+ });
1253
+ },
1254
+ async triggerTypingIndicator (channelId) {
1255
+ await rest.post(rest.routes.channels.typing(channelId));
1256
+ },
1257
+ async upsertGlobalApplicationCommands (body, options) {
1258
+ const restOptions = {
1259
+ body
1260
+ };
1261
+ if (options?.bearerToken) {
1262
+ restOptions.unauthorized = true;
1263
+ restOptions.headers = {
1264
+ authorization: `Bearer ${options.bearerToken}`
1265
+ };
1266
+ }
1267
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
1268
+ },
1269
+ async upsertGuildApplicationCommands (guildId, body, options) {
1270
+ const restOptions = {
1271
+ body
1272
+ };
1273
+ if (options?.bearerToken) {
1274
+ restOptions.unauthorized = true;
1275
+ restOptions.headers = {
1276
+ authorization: `Bearer ${options.bearerToken}`
1277
+ };
1278
+ }
1279
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
1280
+ },
1281
+ async editUserApplicationRoleConnection (token, applicationId, body) {
1282
+ return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
1283
+ body,
1284
+ headers: {
1285
+ authorization: `Bearer ${token}`
1286
+ },
1287
+ unauthorized: true
1288
+ });
1289
+ },
1290
+ async addGuildMember (guildId, userId, body) {
1291
+ return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
1292
+ body
1293
+ });
1294
+ },
1295
+ preferSnakeCase (enabled) {
1296
+ const camelizer = enabled ? (x)=>x : _utils.camelize;
1297
+ rest.get = async (url, options)=>{
1298
+ return camelizer(await rest.makeRequest('GET', url, options));
1299
+ };
1300
+ rest.post = async (url, options)=>{
1301
+ return camelizer(await rest.makeRequest('POST', url, options));
1302
+ };
1303
+ rest.delete = async (url, options)=>{
1304
+ camelizer(await rest.makeRequest('DELETE', url, options));
1305
+ };
1306
+ rest.patch = async (url, options)=>{
1307
+ return camelizer(await rest.makeRequest('PATCH', url, options));
1308
+ };
1309
+ rest.put = async (url, options)=>{
1310
+ return camelizer(await rest.makeRequest('PUT', url, options));
1311
+ };
1312
+ return rest;
1313
+ }
1314
+ };
1315
+ return rest;
1316
+ }
1317
+ var HttpResponseCode;
1318
+ (function(HttpResponseCode) {
1319
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in oder to consider that it was successful. */ "Success"] = 200] = "Success";
1320
+ HttpResponseCode[HttpResponseCode[/** Request completed successfully, but Discord returned an empty body. */ "NoContent"] = 204] = "NoContent";
1321
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in order to consider that something went wrong. */ "Error"] = 400] = "Error";
1322
+ HttpResponseCode[HttpResponseCode[/** This request got rate limited. */ "TooManyRequests"] = 429] = "TooManyRequests";
1323
+ })(HttpResponseCode || (HttpResponseCode = {}));
1324
+
1325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3QtYXNzaWduICovXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcblxuaW1wb3J0IHsgY2FsY3VsYXRlQml0cywgY2FtZWxpemUsIGNhbWVsVG9TbmFrZUNhc2UsIGRlbGF5LCBnZXRCb3RJZEZyb21Ub2tlbiwgbG9nZ2VyLCBwcm9jZXNzUmVhY3Rpb25TdHJpbmcsIHVybFRvQmFzZTY0IH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5cbmltcG9ydCB7IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IH0gZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJ1xuXG5pbXBvcnQge1xuICBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMsXG4gIHR5cGUgQmlnU3RyaW5nLFxuICB0eXBlIENhbWVsaXplLFxuICB0eXBlIERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbixcbiAgdHlwZSBEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uLFxuICB0eXBlIERpc2NvcmRBdWRpdExvZyxcbiAgdHlwZSBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlLFxuICB0eXBlIERpc2NvcmRCYW4sXG4gIHR5cGUgRGlzY29yZENoYW5uZWwsXG4gIHR5cGUgRGlzY29yZENvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uLFxuICB0eXBlIERpc2NvcmRFbW9qaSxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRQcmV2aWV3LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncyxcbiAgdHlwZSBEaXNjb3JkSW50ZWdyYXRpb24sXG4gIHR5cGUgRGlzY29yZEludml0ZSxcbiAgdHlwZSBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIHR5cGUgRGlzY29yZExpc3RBY3RpdmVUaHJlYWRzLFxuICB0eXBlIERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzLFxuICB0eXBlIERpc2NvcmRNZW1iZXIsXG4gIHR5cGUgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICB0eXBlIERpc2NvcmRNZXNzYWdlLFxuICB0eXBlIERpc2NvcmRQYXJ0aWFsR3VpbGQsXG4gIHR5cGUgRGlzY29yZFBydW5lZENvdW50LFxuICB0eXBlIERpc2NvcmRSb2xlLFxuICB0eXBlIERpc2NvcmRTY2hlZHVsZWRFdmVudCxcbiAgdHlwZSBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgdHlwZSBEaXNjb3JkU3RpY2tlcixcbiAgdHlwZSBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIHR5cGUgRGlzY29yZFRlbXBsYXRlLFxuICB0eXBlIERpc2NvcmRUaHJlYWRNZW1iZXIsXG4gIHR5cGUgRGlzY29yZFVzZXIsXG4gIHR5cGUgRGlzY29yZFZhbml0eVVybCxcbiAgdHlwZSBEaXNjb3JkVm9pY2VSZWdpb24sXG4gIHR5cGUgRGlzY29yZFdlYmhvb2ssXG4gIHR5cGUgRGlzY29yZFdlbGNvbWVTY3JlZW4sXG4gIHR5cGUgTWZhTGV2ZWxzLFxuICB0eXBlIE1vZGlmeUd1aWxkVGVtcGxhdGUsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY3JlYXRlUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zLCBNYWtlUmVxdWVzdE9wdGlvbnMsIFJlc3RNYW5hZ2VyLCBTZW5kUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG4vLyBUT0RPOiBtYWtlIGR5bmFtaWMgYmFzZWQgb24gcGFja2FnZS5qc29uIGZpbGVcbmNvbnN0IHZlcnNpb24gPSAnMTkuMC4wLWFscGhhLjEnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IG9wdGlvbnMudG9rZW4gPyBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKSA6IHVuZGVmaW5lZFxuICBpZiAoIWFwcGxpY2F0aW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYGFwcGxpY2F0aW9uSWRgIHdhcyBub3QgcHJvdmlkZWQgYW5kIHdhcyBub3QgYWJsZSB0byBleHRyYWN0IHRoZSBpZCBmcm9tIHRoZSBib3RzIHRva2VuLiBQbGVhc2UgZXhwbGljaXRseSBwYXNzIGBhcHBsaWNhdGlvbklkYCB0byB0aGUgcmVzdCBtYW5hZ2VyLicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG5cbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgYXBwbGljYXRpb25JZCxcbiAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uLFxuICAgIGF1dGhvcml6YXRpb25IZWFkZXI6IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb25IZWFkZXIgPz8gJ2F1dGhvcml6YXRpb24nLFxuICAgIGJhc2VVcmwsXG4gICAgZGVsZXRlUXVldWVEZWxheTogNjAwMDAsXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoe30pLFxuICAgIGlzUHJveGllZDogIWJhc2VVcmwuc3RhcnRzV2l0aChESVNDT1JEX0FQSV9VUkwpLFxuICAgIG1heFJldHJ5Q291bnQ6IEluZmluaXR5LFxuICAgIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBmYWxzZSxcbiAgICBxdWV1ZXM6IG5ldyBNYXAoKSxcbiAgICByYXRlTGltaXRlZFBhdGhzOiBuZXcgTWFwKCksXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IERJU0NPUkRfQVBJX1ZFUlNJT04sXG5cbiAgICByb3V0ZXM6IGNyZWF0ZVJvdXRlcygpLFxuXG4gICAgY3JlYXRlQmFzZUhlYWRlcnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAndXNlci1hZ2VudCc6IGBEaXNjb3JkQm90IChodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vLCB2JHt2ZXJzaW9ufSlgLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja1JhdGVMaW1pdHModXJsLCBoZWFkZXJzKSB7XG4gICAgICBjb25zdCBhdXRoSGVhZGVyID0gaGVhZGVycz8uYXV0aG9yaXphdGlvbiA/PyAnJ1xuXG4gICAgICBjb25zdCByYXRlbGltaXRlZCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQoYCR7YXV0aEhlYWRlcn0ke3VybH1gKVxuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGNoYW5nZVRvRGlzY29yZEZvcm1hdChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuXG4gICAgICAgICAgLy8gU29tZSBmYWxzeSB2YWx1ZXMgc2hvdWxkIGJlIGFsbG93ZWQgbGlrZSBudWxsIG9yIDBcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSAncGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICBjYXNlICdhbGxvdyc6XG4gICAgICAgICAgICAgIGNhc2UgJ2RlbnknOlxuICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogY2FsY3VsYXRlQml0cyh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZWZhdWx0TWVtYmVyUGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZWZhdWx0X21lbWJlcl9wZXJtaXNzaW9ucyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnbmFtZUxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5uYW1lX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLmRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3T2JqW2NhbWVsVG9TbmFrZUNhc2Uoa2V5KV0gPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPYmpcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSByZXR1cm4gb2JqLnRvU3RyaW5nKClcblxuICAgICAgcmV0dXJuIG9ialxuICAgIH0sXG5cbiAgICBjcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmNyZWF0ZUJhc2VIZWFkZXJzKClcblxuICAgICAgaWYgKG9wdGlvbnM/LnVuYXV0aG9yaXplZCAhPT0gdHJ1ZSkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnM/LnJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbQVVESVRfTE9HX1JFQVNPTl9IRUFERVJdID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnM/LnJlYXNvbilcbiAgICAgIH1cblxuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IEZvcm1EYXRhIHwgdW5kZWZpbmVkXG5cbiAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gYWRkIHNwZWNpZmljIGNoZWNrIGZvciBHRVQgbWV0aG9kXG4gICAgICAvLyBTaW5jZSBHRVQgZG9lcyBub3QgYWxsb3cgYm9kaWVzXG5cbiAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGF0dGFjaG1lbnRzIGZpcnN0LCBzaW5jZSBib2R5IHRoZW4gaGFzIHRvIGJlIHNlbmQgaW4gYSBkaWZmZXJlbnQgd2F5LlxuICAgICAgaWYgKG9wdGlvbnM/LmZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5maWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlJHtpfWAsIG9wdGlvbnMuZmlsZXNbaV0uYmxvYiwgb3B0aW9ucy5maWxlc1tpXS5uYW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGF2ZSB0byB1c2UgY2hhbmdlVG9EaXNjb3JkRm9ybWF0IG9yIGVsc2UgSlNPTi5zdHJpbmdpZnkgbWF5IHRocm93IGFuIGVycm9yIGZvciB0aGUgcHJlc2VuY2Ugb2YgQmlnSW50KHMpIGluIHRoZSBqc29uXG4gICAgICAgIGZvcm0uYXBwZW5kKCdwYXlsb2FkX2pzb24nLCBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh7IC4uLm9wdGlvbnMuYm9keSwgZmlsZXM6IHVuZGVmaW5lZCB9KSkpXG5cbiAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICBib2R5ID0gZm9ybVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICYmIG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykge1xuICAgICAgICAvLyBPQXV0aDIgYm9keSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBmb3JtQm9keTogc3RyaW5nW10gPSBbXVxuXG4gICAgICAgIGNvbnN0IGRpc2NvcmRCb2R5ID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KVxuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkaXNjb3JkQm9keSkge1xuICAgICAgICAgIGZvcm1Cb2R5LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApfT0ke2VuY29kZVVSSUNvbXBvbmVudChkaXNjb3JkQm9keVtwcm9wXSl9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgPSBmb3JtQm9keS5qb2luKCcmJylcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICAgIGJvZHkgPSBvcHRpb25zLmJvZHlcbiAgICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpXG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24vanNvbmBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBtZXRob2QsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgZm9yIG9mIGxvb3AuICR7XG4gICAgICAgIC8vICAgdmFsdWUucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgICAgLy8gfWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIGhhcyBub3QgcmVhY2hlZCBjYW5jZWxcbiAgICAgICAgaWYgKHZhbHVlLnJlc2V0VGltZXN0YW1wID4gbm93KSBjb250aW51ZVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXQgaXMgb3ZlciwgZGVsZXRlIHRoZSByYXRlIGxpbWl0ZXJcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmRlbGV0ZShrZXkpXG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBBTEwgUEFUSFMgQVJFIENMRUFSRUQgQ0FOIENBTkNFTCBPVVQhXG4gICAgICBpZiAocmVzdC5yYXRlTGltaXRlZFBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gdHJ1ZVxuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgICB9LCAxMDAwKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gICAgcHJvY2Vzc0hlYWRlcnModXJsLCBoZWFkZXJzLCByZXF1ZXN0QXV0aG9yaXphdGlvbikge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfTElNSVRfSEVBREVSKVxuXG4gICAgICByZXN0LnF1ZXVlcy5nZXQoYCR7cmVxdWVzdEF1dGhvcml6YXRpb259JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtyZXF1ZXN0QXV0aG9yaXphdGlvbn0ke3VybH1gLCB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTQVZFIFRIRSBCVUNLRVQgQVMgTElNSVRFRCBTSU5DRSBESUZGRVJFTlQgVVJMUyBNQVkgU0hBUkUgQSBCVUNLRVRcbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtyZXF1ZXN0QXV0aG9yaXphdGlvbn0ke2J1Y2tldElkfWAsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIEdMT0JBTCBMSU1JVCwgTUFSSyBJVCBSQVRFIExJTUlURUQgR0xPQkFMTFlcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IE51bWJlcihoZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKSkgKiAxMDAwXG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXJcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgPSBHbG9iYWxseSBSYXRlIExpbWl0ZWRdIFVSTDogJHt1cmx9IHwgR2xvYmFsIFJlc3Q6ICR7Z2xvYmFsUmVzZXR9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gdHJ1ZVxuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgICB9LCByZXRyeUFmdGVyKVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoJ2dsb2JhbCcsIHtcbiAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke3JlcXVlc3RBdXRob3JpemF0aW9ufSR7YnVja2V0SWR9YCwge1xuICAgICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhdGVMaW1pdGVkICYmICFyZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtvcHRpb25zLnJvdXRlfWBcbiAgICAgIGNvbnN0IHBheWxvYWQgPSByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG9wdGlvbnMubWV0aG9kLCBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucylcblxuICAgICAgY29uc3QgbG9nZ2luZ0hlYWRlcnMgPSB7IC4uLnBheWxvYWQuaGVhZGVycyB9XG5cbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF1cblxuICAgICAgaWYgKHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRoZW50aWNhdGlvblNjaGVtZX0gdG9rZW5oZXJlYFxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYW5kIGNvbXBsZXRlZFxuICAgICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdCg5OTksIGZhbHNlKVxuICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgIGVycm9yOiAnUG9zc2libGUgbmV0d29yayBvciByZXF1ZXN0IHNoYXBlIGlzc3VlIG9jY3VycmVkLiBJZiB0aGlzIGlzIHJhcmUsIGl0cyBhIG5ldHdvcmsgZ2xpdGNoLiBJZiBpdCBvY2N1cnMgYSBsb3Qgc29tZXRoaW5nIGlzIHdyb25nLicsXG4gICAgICAgIH0pXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuICAgICAgbG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG5cbiAgICAgIC8vIE1hcmsgcmVxdWVzdCBhbmQgY29tcGxldGVkXG4gICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdChyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfU0NPUEVfSEVBREVSKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhcbiAgICAgICAgcmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uU2NoZW1lID09PSAnQmVhcmVyJyA/IHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uIDogJycsXG4gICAgICApXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgSHR0cFJlc3BvbnNlQ29kZS5TdWNjZXNzIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwUmVzcG9uc2VDb2RlLkVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gSHR0cFJlc3BvbnNlQ29kZS5Ub29NYW55UmVxdWVzdHMpIHtcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7IG9rOiBmYWxzZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYClcbiAgICAgICAgLy8gVG9vIG1hbnkgYXR0ZW1wdHMsIGdldCByaWQgb2YgcmVxdWVzdCBmcm9tIHF1ZXVlLlxuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeUNvdW50ID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZClcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKGBbUkVTVCAtIFJldHJpZXNNYXhlZF0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6ICdUaGUgcmVxdWVzdCB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnJldHJ5Q291bnQgKz0gMVxuXG4gICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUilcbiAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG4gICAgICAgIC8vIHByb2Nlc3MgdGhlIHJlc3BvbnNlIHRvIHByZXZlbnQgbWVtIGxlYWtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIG5vIHJlc3BvbnNlIHdpdGggbm8gY29udGVudC5cbiAgICAgIG9wdGlvbnMucmVzb2x2ZSh7IG9rOiB0cnVlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgYm9keTogcmVzcG9uc2Uuc3RhdHVzID09PSBIdHRwUmVzcG9uc2VDb2RlLk5vQ29udGVudCA/IHVuZGVmaW5lZCA6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9KVxuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3QgcGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICAgICAgY29uc3Qgc2Vjb25kTGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdjaGFubmVscycgfHwgc2Vjb25kTGFzdFBhcnQgPT09ICdndWlsZHMnKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cblxuICAgICAgaWYgKHNlY29uZExhc3RQYXJ0ID09PSAncmVhY3Rpb25zJyB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PT0gJ0BtZScpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0yKVxuICAgICAgICBwYXJ0cy5wdXNoKCdyZWFjdGlvbnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0xKVxuICAgICAgICBwYXJ0cy5wdXNoKCd4JylcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDNdID09PSAncmVhY3Rpb25zJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHNlY29uZExhc3RQYXJ0ID09PSAnbWVzc2FnZXMnKSB7XG4gICAgICAgIHJldHVybiBgRCR7cGFydHMuam9pbignLycpfWBcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy8nKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoSGVhZGVyID0gcmVxdWVzdC5yZXF1ZXN0Qm9keU9wdGlvbnM/LmhlYWRlcnM/LmF1dGhvcml6YXRpb24gPz8gJydcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7YXV0aEhlYWRlcn0ke3VybH1gKVxuXG4gICAgICBpZiAocXVldWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ1JFQVRFUyBBIE5FVyBRVUVVRVxuICAgICAgICBjb25zdCBidWNrZXRRdWV1ZSA9IG5ldyBRdWV1ZShyZXN0LCB7IHVybCwgZGVsZXRlUXVldWVEZWxheTogcmVzdC5kZWxldGVRdWV1ZURlbGF5LCBhdXRoZW50aWNhdGlvbjogYXV0aEhlYWRlciB9KVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke2F1dGhIZWFkZXJ9JHt1cmx9YCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgcm91dGUsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gLCByZXN0LmNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSAoYXdhaXQgcmVzdWx0Lmpzb24oKS5jYXRjaCgoKSA9PiB7fSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAvLyBMZWdhY3kgSGFuZGxpbmcgdG8gbm90IGJyZWFrIG9sZCBjb2RlIG9yIHdoZW4gYm9keSBpcyBtaXNzaW5nXG4gICAgICAgICAgaWYgKCFlcnI/LmJvZHkpIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7ZXJyLm1lc3NhZ2UgPz8gcmVzdWx0LnN0YXR1c1RleHR9YClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZXJyKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQuc3RhdHVzICE9PSAyMDQgPyBhd2FpdCByZXN1bHQuanNvbigpIDogdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHJlcXVlc3RCb2R5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgZnVuY3Rpb24gKHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/IEpTT04ucGFyc2UoZGF0YS5ib2R5ID8/ICd7fScpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIHJ1blRocm91Z2hRdWV1ZTogb3B0aW9ucz8ucnVuVGhyb3VnaFF1ZXVlLFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcG9zdDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb25zLCBvcmRlcmVkID0gZmFsc2UpIHtcbiAgICAgIGlmICghb3JkZXJlZCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByZWFjdGlvbnMubWFwKGFzeW5jIChyZWFjdGlvbikgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVhY3Rpb24gb2YgcmVhY3Rpb25zKSB7XG4gICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZERtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBdXRvbW9kUnVsZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmFsbCgpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUNvZGUsIGJvZHkpIHtcbiAgICAgIGlmIChib2R5Lmljb24pIHtcbiAgICAgICAgYm9keS5pY29uID0gYXdhaXQgdXJsVG9CYXNlNjQoYm9keS5pY29uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlLmJsb2IsIG9wdGlvbnMuZmlsZS5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ25hbWUnLCBvcHRpb25zLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnZGVzY3JpcHRpb24nLCBvcHRpb25zLmRlc2NyaXB0aW9uKVxuICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLnRhZ3MpXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSwgeyBib2R5OiBmb3JtLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUludml0ZShjaGFubmVsSWQsIGJvZHkgPSB7fSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICBhdmF0YXI6IG9wdGlvbnMuYXZhdGFyID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucy5hdmF0YXIpIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zQWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zRW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVXNlclJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCB1c2VySWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLnVzZXIoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgY29tbWFuZElkLCBiZWFyZXJUb2tlbiwgcGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAge1xuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczogeyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdXNlcm5hbWU6IG9wdGlvbnMudXNlcm5hbWU/LnRyaW0oKSxcbiAgICAgICAgICBhdmF0YXIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE1mYUxldmVsKGd1aWxkSWQ6IEJpZ1N0cmluZywgbWZhTGV2ZWw6IE1mYUxldmVscywgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuZ3VpbGRzLm1mYShndWlsZElkKSwgeyBib2R5OiB7IGxldmVsOiBtZmFMZXZlbCB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBib2R5OiBNb2RpZnlHdWlsZFRlbXBsYXRlKTogUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgZmlsZXM6IGJvZHkuZmlsZXMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mub3JpZ2luYWwod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3duVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0X3RvX3NwZWFrX3RpbWVzdGFtcDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcFxuICAgICAgICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZVBvc2l0aW9ucyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgdG9waWMsIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgYm9keTogeyB0b3BpYyB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7IGJvZHk6IG9wdGlvbnMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB3ZWJob29rX2NoYW5uZWxfaWQ6IHRhcmdldENoYW5uZWxJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRBdXRoZW50aWNhdGlvbkluZm8odG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5jdXJyZW50QXV0aG9yaXphdGlvbigpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhjaGFuZ2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5ncmFudFR5cGUgPT09ICdjbGllbnRfY3JlZGVudGlhbHMnKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmJvZHkuc2NvcGUgPSBib2R5LnNjb3BlLmpvaW4oJyAnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlPihyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5FeGNoYW5nZSgpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgcmV2b2tlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuUmV2b2tlKCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5yZWdpb25zKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW5zKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsSW52aXRlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVscyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWxbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RG1DaGFubmVsKHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5OiB7IHJlY2lwaWVudF9pZDogdXNlcklkIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHcm91cERtQ2hhbm5lbChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkcyh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQYXJ0aWFsR3VpbGRbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnVzZXJHdWlsZHMob3B0aW9ucyksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFByZXZpZXcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFByZXZpZXc+KHJlc3Qucm91dGVzLmd1aWxkcy5wcmV2aWV3KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWJob29rcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Tml0cm9TdGlja2VyUGFja3MoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrW10+KHJlc3Qucm91dGVzLm5pdHJvU3RpY2tlclBhY2tzKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnRbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PEFycmF5PHsgdXNlcjogRGlzY29yZFVzZXI7IG1lbWJlcj86IERpc2NvcmRNZW1iZXIgfT4+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMudXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2F0ZXdheUJvdCgpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVtYmVycyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudFVzZXIodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJDb25uZWN0aW9ucyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDb25uZWN0aW9uW10+KHJlc3Qucm91dGVzLm9hdXRoMi5jb25uZWN0aW9ucygpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbml0eVVybChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZhbml0eVVybD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZhbml0eShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJlZ2lvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWxjb21lU2NyZWVuKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0PihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0SnNvbihndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5sZWF2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5jcm9zc3Bvc3QoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZURtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZGF0YT8uZmlsZXMsXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWxsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN5bmNHdWlsZFRlbXBsYXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYm90KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBraWNrTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBydW5lTWVtYmVycyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMucHJ1bmUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlYXJjaE1lbWJlcnMoZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuc2VhcmNoKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkR3VpbGRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHByZWZlclNuYWtlQ2FzZShlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBjYW1lbGl6ZXIgPSBlbmFibGVkID8gKHg6IGFueSkgPT4geCA6IGNhbWVsaXplXG5cbiAgICAgIHJlc3QuZ2V0ID0gYXN5bmMgKHVybCwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucG9zdCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5kZWxldGUgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnBhdGNoID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wdXQgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3RcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIHJlc3Rcbn1cblxuZW51bSBIdHRwUmVzcG9uc2VDb2RlIHtcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9kZXIgdG8gY29uc2lkZXIgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1bC4gKi9cbiAgU3VjY2VzcyA9IDIwMCxcbiAgLyoqIFJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgYnV0IERpc2NvcmQgcmV0dXJuZWQgYW4gZW1wdHkgYm9keS4gKi9cbiAgTm9Db250ZW50ID0gMjA0LFxuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb3JkZXIgdG8gY29uc2lkZXIgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi9cbiAgRXJyb3IgPSA0MDAsXG4gIC8qKiBUaGlzIHJlcXVlc3QgZ290IHJhdGUgbGltaXRlZC4gKi9cbiAgVG9vTWFueVJlcXVlc3RzID0gNDI5LFxufVxuIl0sIm5hbWVzIjpbIkRJU0NPUkRfQVBJX1ZFUlNJT04iLCJESVNDT1JEX0FQSV9VUkwiLCJBVURJVF9MT0dfUkVBU09OX0hFQURFUiIsIlJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiIsIlJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwidmVyc2lvbiIsIm9wdGlvbnMiLCJhcHBsaWNhdGlvbklkIiwiQmlnSW50IiwidG9rZW4iLCJnZXRCb3RJZEZyb21Ub2tlbiIsInVuZGVmaW5lZCIsIkVycm9yIiwiYmFzZVVybCIsInByb3h5IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwibWF4UmV0cnlDb3VudCIsIkluZmluaXR5IiwicHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwicm91dGVzIiwiY3JlYXRlUm91dGVzIiwiY3JlYXRlQmFzZUhlYWRlcnMiLCJjaGVja1JhdGVMaW1pdHMiLCJ1cmwiLCJoZWFkZXJzIiwiYXV0aEhlYWRlciIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwiRGF0ZSIsInJlc2V0VGltZXN0YW1wIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsIm5ld09iaiIsImtleSIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImNhbGN1bGF0ZUJpdHMiLCJkZWZhdWx0X21lbWJlcl9wZXJtaXNzaW9ucyIsIm5hbWVfbG9jYWxpemF0aW9ucyIsImRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMiLCJjYW1lbFRvU25ha2VDYXNlIiwidG9TdHJpbmciLCJjcmVhdGVSZXF1ZXN0Qm9keSIsIm1ldGhvZCIsInVuYXV0aG9yaXplZCIsInJlYXNvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImJvZHkiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJmb3JtQm9keSIsImRpc2NvcmRCb2R5IiwicHJvcCIsInB1c2giLCJqb2luIiwiYXNzaWduIiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJlbnRyaWVzIiwiZGVsZXRlIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJlcXVlc3RBdXRob3JpemF0aW9uIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJidWNrZXRJZCIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4Iiwic2V0IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aGVudGljYXRpb25TY2hlbWUiLCJzcGxpdCIsImxvZ2dlciIsImRlYnVnIiwicmVzcG9uc2UiLCJmZXRjaCIsImNhdGNoIiwiZXJyb3IiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJzaW1wbGlmeVVybCIsInRleHQiLCJyZXRyeUNvdW50IiwicmVzZXRBZnRlciIsImRlbGF5IiwiYXJyYXlCdWZmZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwicGFydHMiLCJzZWNvbmRMYXN0UGFydCIsInNwbGljZSIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlIiwibWFrZVJlcXVlc3QiLCJidWNrZXRRdWV1ZSIsIlF1ZXVlIiwiYXV0aGVudGljYXRpb24iLCJyZXN1bHQiLCJlcnIiLCJqc29uIiwibWVzc2FnZSIsIlByb21pc2UiLCJkYXRhIiwicGFyc2UiLCJjYW1lbGl6ZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwiY2hhbm5lbElkIiwibWVzc2FnZUlkIiwicmVhY3Rpb24iLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJjaGFubmVscyIsInJlYWN0aW9ucyIsImJvdCIsImFkZFJlYWN0aW9ucyIsIm9yZGVyZWQiLCJhbGwiLCJhZGRSb2xlIiwiZ3VpbGRJZCIsInVzZXJJZCIsInJvbGVJZCIsImd1aWxkcyIsInJvbGVzIiwibWVtYmVyIiwiYWRkVGhyZWFkTWVtYmVyIiwidGhyZWFkcyIsInVzZXIiLCJhZGREbVJlY2lwaWVudCIsImRtUmVjaXBpZW50IiwiY3JlYXRlQXV0b21vZFJ1bGUiLCJhdXRvbW9kIiwicnVsZXMiLCJjcmVhdGVDaGFubmVsIiwiY3JlYXRlRW1vamkiLCJlbW9qaXMiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJyZXN0T3B0aW9ucyIsImJlYXJlclRva2VuIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJjcmVhdGVHdWlsZCIsImNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGRGcm9tVGVtcGxhdGUiLCJ0ZW1wbGF0ZUNvZGUiLCJpY29uIiwidXJsVG9CYXNlNjQiLCJ0ZW1wbGF0ZXMiLCJjb2RlIiwiY3JlYXRlR3VpbGRTdGlja2VyIiwiZmlsZSIsImRlc2NyaXB0aW9uIiwidGFncyIsInN0aWNrZXJzIiwiY3JlYXRlR3VpbGRUZW1wbGF0ZSIsImNyZWF0ZUZvcnVtVGhyZWFkIiwiZm9ydW0iLCJjcmVhdGVJbnZpdGUiLCJpbnZpdGVzIiwiY3JlYXRlUm9sZSIsImNyZWF0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRzIiwiY3JlYXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlcyIsImNyZWF0ZVdlYmhvb2siLCJ3ZWJob29rcyIsImF2YXRhciIsImRlbGV0ZUF1dG9tb2RSdWxlIiwicnVsZUlkIiwicnVsZSIsImRlbGV0ZUNoYW5uZWwiLCJjaGFubmVsIiwiZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZSIsIm92ZXJ3cml0ZUlkIiwib3ZlcndyaXRlIiwiZGVsZXRlRW1vamkiLCJpZCIsImVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkIiwiZ3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb24iLCJkZWxldGVJbnZpdGUiLCJpbnZpdGVDb2RlIiwiaW52aXRlIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsInNsaWNlIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkTWZhTGV2ZWwiLCJtZmFMZXZlbCIsIm1mYSIsImxldmVsIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2UiLCJ0eXBlIiwiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiVXBkYXRlTWVzc2FnZSIsImVkaXRPd25Wb2ljZVN0YXRlIiwidm9pY2UiLCJyZXF1ZXN0X3RvX3NwZWFrX3RpbWVzdGFtcCIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tfY2hhbm5lbF9pZCIsImdldEFjdGl2ZVRocmVhZHMiLCJhY3RpdmUiLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uIiwiYWNjZXNzVG9rZW4iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEFwcGxpY2F0aW9uSW5mbyIsIm9hdXRoMiIsImFwcGxpY2F0aW9uIiwiZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyIsImN1cnJlbnRBdXRob3JpemF0aW9uIiwiZXhjaGFuZ2VUb2tlbiIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiYmFzaWNDcmVkZW50aWFscyIsIkJ1ZmZlciIsImZyb20iLCJncmFudFR5cGUiLCJzY29wZSIsInRva2VuRXhjaGFuZ2UiLCJyZXZva2VUb2tlbiIsInRva2VuUmV2b2tlIiwiZ2V0QXVkaXRMb2ciLCJhdWRpdGxvZ3MiLCJnZXRBdXRvbW9kUnVsZSIsImdldEF1dG9tb2RSdWxlcyIsImdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucyIsInJlZ2lvbnMiLCJnZXRCYW4iLCJtZW1iZXJzIiwiYmFuIiwiZ2V0QmFucyIsImJhbnMiLCJnZXRDaGFubmVsIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJnZXRDaGFubmVscyIsImdldENoYW5uZWxXZWJob29rcyIsImdldERtQ2hhbm5lbCIsImRtIiwicmVjaXBpZW50X2lkIiwiZ2V0R3JvdXBEbUNoYW5uZWwiLCJnZXRFbW9qaSIsImVtb2ppSWQiLCJnZXRFbW9qaXMiLCJnZXRGb2xsb3d1cE1lc3NhZ2UiLCJnZXRHYXRld2F5Qm90IiwiZ2F0ZXdheUJvdCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZCIsImNvdW50cyIsImdldEd1aWxkcyIsInVzZXJHdWlsZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkUHJldmlldyIsInByZXZpZXciLCJnZXRHdWlsZFRlbXBsYXRlIiwiZ2V0R3VpbGRUZW1wbGF0ZXMiLCJnZXRHdWlsZFdlYmhvb2tzIiwiZ2V0SW50ZWdyYXRpb25zIiwiaW50ZWdyYXRpb25zIiwiZ2V0SW52aXRlIiwiZ2V0SW52aXRlcyIsImdldE1lc3NhZ2UiLCJnZXRNZXNzYWdlcyIsImdldE5pdHJvU3RpY2tlclBhY2tzIiwibml0cm9TdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRQaW5uZWRNZXNzYWdlcyIsInBpbnMiLCJnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzIiwicHJpdmF0ZSIsImdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMiLCJqb2luZWQiLCJnZXRQcnVuZUNvdW50IiwicHJ1bmUiLCJnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMiLCJwdWJsaWMiLCJnZXRSb2xlcyIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldFVzZXIiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwic3luY0d1aWxkVGVtcGxhdGUiLCJiYW5NZW1iZXIiLCJlZGl0Qm90TWVtYmVyIiwiZWRpdE1lbWJlciIsImdldE1lbWJlciIsImdldEN1cnJlbnRNZW1iZXIiLCJjdXJyZW50TWVtYmVyIiwiZ2V0TWVtYmVycyIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwicGluIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInF1ZXJ5Iiwic2VhcmNoIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidHlwaW5nIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsImFkZEd1aWxkTWVtYmVyIiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIiwiU3VjY2VzcyIsIk5vQ29udGVudCIsIlRvb01hbnlSZXF1ZXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsbUVBQW1FLEdBQ25FLGtDQUFrQzs7Ozs7Ozs7Ozs7SUE2RHJCQSxtQkFBbUIsTUFBbkJBO0lBQ0FDLGVBQWUsTUFBZkE7SUFFQUMsdUJBQXVCLE1BQXZCQTtJQUNBQywyQkFBMkIsTUFBM0JBO0lBQ0FDLDZCQUE2QixNQUE3QkE7SUFDQUMsd0JBQXdCLE1BQXhCQTtJQUNBQyx3QkFBd0IsTUFBeEJBO0lBQ0FDLHVCQUF1QixNQUF2QkE7SUFDQUMsdUJBQXVCLE1BQXZCQTtJQUVHQyxpQkFBaUIsTUFBakJBOzs0QkF2RU87dUJBRXlHO2lDQUVyRjt5QkFDckI7dUJBZ0RmOzBCQUNzQjtBQUc3QixnREFBZ0Q7QUFDaEQsTUFBTUMsVUFBVTtBQUVULE1BQU1WLHNCQUFzQjtBQUM1QixNQUFNQyxrQkFBa0I7QUFFeEIsTUFBTUMsMEJBQTBCO0FBQ2hDLE1BQU1DLDhCQUE4QjtBQUNwQyxNQUFNQyxnQ0FBZ0M7QUFDdEMsTUFBTUMsMkJBQTJCO0FBQ2pDLE1BQU1DLDJCQUEyQjtBQUNqQyxNQUFNQywwQkFBMEI7QUFDaEMsTUFBTUMsMEJBQTBCO0FBRWhDLFNBQVNDLGtCQUFrQkUsT0FBaUMsRUFBZTtJQUNoRixNQUFNQyxnQkFBZ0JELFFBQVFDLGFBQWEsR0FBR0MsT0FBT0YsUUFBUUMsYUFBYSxJQUFJRCxRQUFRRyxLQUFLLEdBQUdDLElBQUFBLHdCQUFpQixFQUFDSixRQUFRRyxLQUFLLElBQUlFLFNBQVM7SUFDMUksSUFBSSxDQUFDSixlQUFlO1FBQ2xCLE1BQU0sSUFBSUssTUFD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