@discordeno/rest 19.0.0-next.e2d86ea → 19.0.0-next.e33b44e

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