@discordeno/rest 22.0.1-next.bd98b3e → 22.0.1-next.bfec01a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manager.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Buffer } from 'node:buffer';
2
2
  import { inspect } from 'node:util';
3
- import { calculateBits, camelize, camelToSnakeCase, DISCORDENO_VERSION, delay, getBotIdFromToken, hasProperty, logger, processReactionString, snowflakeToTimestamp, urlToBase64 } from '@discordeno/utils';
3
+ import { camelize, camelToSnakeCase, DISCORDENO_VERSION, delay, getBotIdFromToken, hasProperty, logger, processReactionString, snowflakeToTimestamp, urlToBase64 } from '@discordeno/utils';
4
4
  import { createInvalidRequestBucket } from './invalidBucket.js';
5
5
  import { Queue } from './queue.js';
6
6
  import { createRoutes } from './routes.js';
@@ -15,7 +15,7 @@ export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
15
15
  export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
16
16
  export function createRestManager(options) {
17
17
  const applicationId = options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token);
18
- const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
18
+ const baseUrl = (options.proxy?.baseUrl ?? DISCORD_API_URL).replace(/\/$/, '');
19
19
  // Discord error can get nested a lot, so we use a custom inspect to change the depth to Infinity
20
20
  const baseErrorPrototype = {
21
21
  [inspect.custom] (_depth, options, _inspect) {
@@ -40,6 +40,7 @@ export function createRestManager(options) {
40
40
  isProxied: !baseUrl.startsWith(DISCORD_API_URL),
41
41
  updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
42
42
  maxRetryCount: Infinity,
43
+ requestTimeout: options.requestTimeout ?? 30000,
43
44
  processingRateLimitedPaths: false,
44
45
  queues: new Map(),
45
46
  rateLimitedPaths: new Map(),
@@ -132,17 +133,8 @@ export function createRestManager(options) {
132
133
  newObj[key] = value;
133
134
  continue;
134
135
  }
135
- // Some falsy values should be allowed like null or 0
136
136
  if (value !== undefined) {
137
137
  switch(key){
138
- case 'permissions':
139
- case 'allow':
140
- case 'deny':
141
- newObj[key] = typeof value === 'string' ? value : calculateBits(value);
142
- continue;
143
- case 'defaultMemberPermissions':
144
- newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
145
- continue;
146
138
  case 'nameLocalizations':
147
139
  newObj.name_localizations = value;
148
140
  continue;
@@ -237,7 +229,7 @@ export function createRestManager(options) {
237
229
  let rateLimited = false;
238
230
  // GET ALL NECESSARY HEADERS
239
231
  const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
240
- const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
232
+ const retryAfter = headers.get('Retry-After') ?? headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
241
233
  const reset = Date.now() + Number(retryAfter) * 1000;
242
234
  const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
243
235
  // undefined override null needed for typings
@@ -301,6 +293,23 @@ export function createRestManager(options) {
301
293
  async sendRequest (options) {
302
294
  const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
303
295
  const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
296
+ // Retries a request that was aborted because it hit `rest.requestTimeout`, or rejects it once the retry
297
+ // budget is exhausted. The caller is responsible for the `invalidBucket`/event bookkeeping beforehand.
298
+ const handleTimeout = async (options, error)=>{
299
+ if (options.retryCount >= rest.maxRetryCount) {
300
+ rest.logger.debug(`request to ${url} timed out and exceeded the maximum allowed retries.`);
301
+ options.reject({
302
+ ok: false,
303
+ status: 999,
304
+ error: 'The request timed out and it maxed out the retries limit.',
305
+ errorObject: error
306
+ });
307
+ return;
308
+ }
309
+ rest.logger.debug(`request to ${url} timed out after ${rest.requestTimeout}ms, retrying.`, error);
310
+ options.retryCount += 1;
311
+ await options.retryRequest?.(options);
312
+ };
304
313
  const loggingHeaders = {
305
314
  ...payload.headers
306
315
  };
@@ -308,7 +317,13 @@ export function createRestManager(options) {
308
317
  const authorizationScheme = payload.headers.authorization?.split(' ')[0];
309
318
  loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
310
319
  }
311
- const request = new Request(url, payload);
320
+ // Give this attempt a hard deadline. `AbortSignal.timeout` aborts the fetch (and any in-progress body
321
+ // read) once it fires, which makes the awaited fetch reject so a stalled connection can never keep this
322
+ // queue's `processPending` loop (and therefore the whole queue) wedged forever. Omitted when disabled.
323
+ const request = new Request(url, {
324
+ ...payload,
325
+ signal: rest.requestTimeout > 0 ? AbortSignal.timeout(rest.requestTimeout) : undefined
326
+ });
312
327
  rest.events.request(request, {
313
328
  body: options.requestBodyOptions?.body
314
329
  });
@@ -317,19 +332,24 @@ export function createRestManager(options) {
317
332
  headers: loggingHeaders
318
333
  });
319
334
  const response = await fetch(request).catch(async (error)=>{
320
- rest.logger.error(error);
321
335
  rest.events.requestError(request, error, {
322
336
  body: options.requestBodyOptions?.body
323
337
  });
324
338
  // Mark request as completed
325
339
  rest.invalidBucket.handleCompletedRequest(999, false);
340
+ // The attempt hit `rest.requestTimeout` and was aborted. Treat it like a transient failure and retry
341
+ // it through the queue, so a single stalled connection doesn't permanently fail the request.
342
+ if (isTimeoutError(error)) return await handleTimeout(options, error);
343
+ rest.logger.debug(`request fetch to ${url} failed.`, error);
326
344
  options.reject({
327
345
  ok: false,
328
346
  status: 999,
329
- error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
347
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.',
348
+ errorObject: error
330
349
  });
331
- throw error;
332
350
  });
351
+ // If response is undefined, the error has been handled in the catch block above
352
+ if (!response) return;
333
353
  rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
334
354
  // Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
335
355
  const body = await (response.headers.get('Content-Type')?.startsWith('application/json') ? response.json() : response.text()).catch(()=>null);
@@ -367,7 +387,7 @@ export function createRestManager(options) {
367
387
  return;
368
388
  }
369
389
  options.retryCount += 1;
370
- const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
390
+ const resetAfter = response.headers.get('retry-after');
371
391
  if (resetAfter) await delay(Number(resetAfter) * 1000);
372
392
  return await options.retryRequest?.(options);
373
393
  }
@@ -429,7 +449,7 @@ export function createRestManager(options) {
429
449
  await rest.sendRequest(request);
430
450
  return;
431
451
  }
432
- // If we the request has a token, use it
452
+ // If the request has a token, use it
433
453
  // Else fallback to prefix with the bot token
434
454
  const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
435
455
  const queue = rest.queues.get(`${queueIdentifier}${url}`);
@@ -457,26 +477,47 @@ export function createRestManager(options) {
457
477
  options.headers ??= {};
458
478
  options.headers[rest.authorizationHeader] = rest.authorization;
459
479
  }
460
- const request = new Request(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
461
- rest.events.request(request, {
462
- body: options?.body
463
- });
464
- const result = await fetch(request);
465
- // Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
466
- const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>null);
467
- rest.events.response(request, result, {
468
- requestBody: options?.body,
469
- responseBody: body
470
- });
471
- if (!result.ok) {
472
- error.cause = Object.assign(Object.create(baseErrorPrototype), {
473
- ok: false,
474
- status: result.status,
475
- body
480
+ const url = `${rest.baseUrl}/v${rest.version}${route}`;
481
+ // Retry on timeout up to `maxRetryCount`, mirroring the queued `sendRequest` path, so a stalled proxy
482
+ // connection doesn't permanently fail the request (and can never hang the caller forever).
483
+ for(let retryCount = 0;; retryCount++){
484
+ // Give the request to the proxy a hard deadline too via `AbortSignal.timeout` (omitted when disabled).
485
+ const request = new Request(url, {
486
+ ...rest.createRequestBody(method, options),
487
+ signal: rest.requestTimeout > 0 ? AbortSignal.timeout(rest.requestTimeout) : undefined
488
+ });
489
+ rest.events.request(request, {
490
+ body: options?.body
491
+ });
492
+ const result = await fetch(request).catch((fetchError)=>{
493
+ rest.events.requestError(request, fetchError, {
494
+ body: options?.body
495
+ });
496
+ // The attempt hit `rest.requestTimeout` and was aborted; retry it until the budget is exhausted.
497
+ if (isTimeoutError(fetchError) && retryCount < rest.maxRetryCount) {
498
+ rest.logger.debug(`request to proxy ${url} timed out after ${rest.requestTimeout}ms, retrying.`, fetchError);
499
+ return undefined;
500
+ }
501
+ throw fetchError;
476
502
  });
477
- throw error;
503
+ // If result is undefined, the attempt timed out and is being retried.
504
+ if (!result) continue;
505
+ // Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
506
+ const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>null);
507
+ rest.events.response(request, result, {
508
+ requestBody: options?.body,
509
+ responseBody: body
510
+ });
511
+ if (!result.ok) {
512
+ error.cause = Object.assign(Object.create(baseErrorPrototype), {
513
+ ok: false,
514
+ status: result.status,
515
+ body
516
+ });
517
+ throw error;
518
+ }
519
+ return result.status !== 204 ? typeof body === 'string' ? JSON.parse(body) : body : undefined;
478
520
  }
479
- return result.status !== 204 ? typeof body === 'string' ? JSON.parse(body) : body : undefined;
480
521
  }
481
522
  return await new Promise(async (resolve, reject)=>{
482
523
  const payload = {
@@ -488,7 +529,7 @@ export function createRestManager(options) {
488
529
  await rest.processRequest(payload);
489
530
  },
490
531
  resolve: (data)=>{
491
- resolve(data.status !== 204 ? typeof data.body === 'string' ? JSON.parse(data.body) : data.body : undefined);
532
+ resolve(data.status !== 204 ? data.body : undefined);
492
533
  },
493
534
  reject: (reason)=>{
494
535
  let errorText;
@@ -519,7 +560,7 @@ export function createRestManager(options) {
519
560
  }
520
561
  error.message = `[${reason.status}] ${errorText}`;
521
562
  // If discord sent us JSON, it is probably going to be an error message from which we can get and add some information about the error to the error message, the full body will be in the error.cause
522
- // https://discord.com/developers/docs/reference#error-messages
563
+ // https://docs.discord.com/developers/reference#error-messages
523
564
  if (typeof reason.body === 'object' && hasProperty(reason.body, 'code') && hasProperty(reason.body, 'message')) {
524
565
  error.message += `\nDiscord error: [${reason.body.code}] ${reason.body.message}`;
525
566
  }
@@ -645,8 +686,21 @@ export function createRestManager(options) {
645
686
  });
646
687
  },
647
688
  async createInvite (channelId, body = {}, reason) {
689
+ if (!body.targetUsersFile) {
690
+ return await rest.post(rest.routes.channels.invites(channelId), {
691
+ body,
692
+ reason
693
+ });
694
+ }
695
+ // When we have to upload a file, we need to use FormData, and all other fields need to be part of the payload_json field.
696
+ const form = new FormData();
697
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
698
+ ...body,
699
+ targetUsersFile: undefined
700
+ })));
701
+ form.append('target_users_file', body.targetUsersFile);
648
702
  return await rest.post(rest.routes.channels.invites(channelId), {
649
- body,
703
+ body: form,
650
704
  reason
651
705
  });
652
706
  },
@@ -732,6 +786,19 @@ export function createRestManager(options) {
732
786
  reason
733
787
  });
734
788
  },
789
+ async getTargetUsers (inviteCode) {
790
+ return await rest.get(rest.routes.guilds.inviteTargetUsers(inviteCode));
791
+ },
792
+ async updateTargetUsers (inviteCode, targetUsersFile) {
793
+ const form = new FormData();
794
+ form.append('target_users_file', targetUsersFile);
795
+ await rest.put(rest.routes.guilds.inviteTargetUsers(inviteCode), {
796
+ body: form
797
+ });
798
+ },
799
+ async getTargetUsersJobStatus (inviteCode) {
800
+ return await rest.get(rest.routes.guilds.inviteTargetUsersJobStatus(inviteCode));
801
+ },
735
802
  async deleteMessage (channelId, messageId, reason) {
736
803
  await rest.delete(rest.routes.channels.message(channelId, messageId), {
737
804
  reason
@@ -1366,7 +1433,7 @@ export function createRestManager(options) {
1366
1433
  reason
1367
1434
  });
1368
1435
  },
1369
- async editBotMember (guildId, body, reason) {
1436
+ async editCurrentMember (guildId, body, reason) {
1370
1437
  return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1371
1438
  body,
1372
1439
  reason
@@ -1378,9 +1445,6 @@ export function createRestManager(options) {
1378
1445
  reason
1379
1446
  });
1380
1447
  },
1381
- async getMember (guildId, userId) {
1382
- return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1383
- },
1384
1448
  async getCurrentMember (guildId, token) {
1385
1449
  return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1386
1450
  headers: {
@@ -1389,6 +1453,9 @@ export function createRestManager(options) {
1389
1453
  unauthorized: true
1390
1454
  });
1391
1455
  },
1456
+ async getMember (guildId, userId) {
1457
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1458
+ },
1392
1459
  async getMembers (guildId, options) {
1393
1460
  return await rest.get(rest.routes.guilds.members.members(guildId, options));
1394
1461
  },
@@ -1622,5 +1689,8 @@ var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
1622
1689
  /** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
1623
1690
  return HttpResponseCode;
1624
1691
  }(HttpResponseCode || {});
1692
+ /** Whether an error is the `TimeoutError` thrown by `AbortSignal.timeout()`. */ function isTimeoutError(error) {
1693
+ return error instanceof DOMException && error.name === 'TimeoutError';
1694
+ }
1625
1695
 
1626
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHsgdHlwZSBJbnNwZWN0T3B0aW9ucywgaW5zcGVjdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB0eXBlIHtcbiAgQmlnU3RyaW5nLFxuICBDYW1lbGl6ZSxcbiAgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIERpc2NvcmRBY3Rpdml0eUluc3RhbmNlLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uLFxuICBEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRCdWxrQmFuLFxuICBEaXNjb3JkQ2hhbm5lbCxcbiAgRGlzY29yZENvbm5lY3Rpb24sXG4gIERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbixcbiAgRGlzY29yZEVtb2ppLFxuICBEaXNjb3JkRW50aXRsZW1lbnQsXG4gIERpc2NvcmRGb2xsb3dlZENoYW5uZWwsXG4gIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEd1aWxkLFxuICBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEd1aWxkT25ib2FyZGluZyxcbiAgRGlzY29yZEd1aWxkUHJldmlldyxcbiAgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICBEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncyxcbiAgRGlzY29yZEluY2lkZW50c0RhdGEsXG4gIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZSxcbiAgRGlzY29yZEludml0ZSxcbiAgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICBEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHMsXG4gIERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzLFxuICBEaXNjb3JkTG9iYnksXG4gIERpc2NvcmRMb2JieU1lbWJlcixcbiAgRGlzY29yZE1lbWJlcixcbiAgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICBEaXNjb3JkTWVzc2FnZSxcbiAgRGlzY29yZFBydW5lZENvdW50LFxuICBEaXNjb3JkUm9sZSxcbiAgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICBEaXNjb3JkU2t1LFxuICBEaXNjb3JkU291bmRib2FyZFNvdW5kLFxuICBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgRGlzY29yZFN0aWNrZXIsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFZhbml0eVVybCxcbiAgRGlzY29yZFZvaWNlUmVnaW9uLFxuICBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgRGlzY29yZFdlYmhvb2ssXG4gIERpc2NvcmRXZWxjb21lU2NyZWVuLFxuICBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUJpdHMsXG4gIGNhbWVsaXplLFxuICBjYW1lbFRvU25ha2VDYXNlLFxuICBESVNDT1JERU5PX1ZFUlNJT04sXG4gIGRlbGF5LFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgaGFzUHJvcGVydHksXG4gIGxvZ2dlcixcbiAgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLFxuICBzbm93Zmxha2VUb1RpbWVzdGFtcCxcbiAgdXJsVG9CYXNlNjQsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pXG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG4gIC8vIERpc2NvcmQgZXJyb3IgY2FuIGdldCBuZXN0ZWQgYSBsb3QsIHNvIHdlIHVzZSBhIGN1c3RvbSBpbnNwZWN0IHRvIGNoYW5nZSB0aGUgZGVwdGggdG8gSW5maW5pdHlcbiAgY29uc3QgYmFzZUVycm9yUHJvdG90eXBlID0ge1xuICAgIFtpbnNwZWN0LmN1c3RvbV0oX2RlcHRoOiBudW1iZXIsIG9wdGlvbnM6IEluc3BlY3RPcHRpb25zLCBfaW5zcGVjdDogdHlwZW9mIGluc3BlY3QpIHtcbiAgICAgIHJldHVybiBfaW5zcGVjdCh0aGlzLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlcHRoOiBJbmZpbml0eSxcbiAgICAgICAgLy8gU2luY2Ugd2UgY2FsbCBpbnNwZWN0IG9uIG91cnNlbGYsIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgY2FsbHMgdG8gdGhlIGluc3BlY3QuY3VzdG9tIHN5bWJvbCBvciBlbHNlIGl0IHdpbGwgY2F1c2UgYW4gaW5maW5pdGUgbG9vcC5cbiAgICAgICAgY3VzdG9tSW5zcGVjdDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0sXG4gIH1cblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIGV2ZW50czoge1xuICAgICAgcmVxdWVzdDogKCkgPT4ge30sXG4gICAgICByZXNwb25zZTogKCkgPT4ge30sXG4gICAgICByZXF1ZXN0RXJyb3I6ICgpID0+IHt9LFxuICAgICAgLi4ub3B0aW9ucy5ldmVudHMsXG4gICAgfSxcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tSYXRlTGltaXRzKHVybCwgaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcmF0ZWxpbWl0ZWQgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVUb2tlblF1ZXVlcyhvbGRUb2tlbiwgbmV3VG9rZW4pIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAoIXJlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlICdwcm94eS51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50JyBvcHRpb24gbmVlZHMgdG8gYmUgc2V0IHdoZW4gdXNpbmcgYSByZXN0IHByb3h5IGFuZCBuZWVkZWQgdG8gY2FsbCAndXBkYXRlVG9rZW5RdWV1ZXMnXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3Jlc3QuYmFzZVVybH0vJHtyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnR9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9sZFRva2VuLFxuICAgICAgICAgICAgbmV3VG9rZW4sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gXG5cbiAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHF1ZXVlc1xuICAgICAgZm9yIChjb25zdCBba2V5LCBxdWV1ZV0gb2YgcmVzdC5xdWV1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucXVldWVzLmRlbGV0ZShrZXkpXG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyXG5cbiAgICAgICAgY29uc3QgbmV3S2V5ID0gYCR7bmV3SWRlbnRpZmllcn0ke3F1ZXVlLnVybH1gXG4gICAgICAgIGNvbnN0IG5ld1F1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KG5ld0tleSlcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKVxuICAgICAgICAgIG5ld1F1ZXVlLnBlbmRpbmcudW5zaGlmdCguLi5xdWV1ZS5wZW5kaW5nKVxuXG4gICAgICAgICAgcXVldWUud2FpdGluZyA9IFtdXG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdXG5cbiAgICAgICAgICBxdWV1ZS5jbGVhbnVwKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0LnF1ZXVlcy5zZXQobmV3S2V5LCBxdWV1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC51cmx9YCwgcmF0ZWxpbWl0UGF0aClcblxuICAgICAgICBpZiAocmF0ZWxpbWl0UGF0aC5idWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGguYnVja2V0SWR9YCwgcmF0ZWxpbWl0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cblxuICAgICAgICAgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiBzbmFrZV9jYXNlIHdlIGNhbiBhc3N1bWUgaXQgaXMgYWxyZWFkeSBpbiB0aGUgZGlzY29yZCBmb3JtYXQuXG4gICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnXycpKSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZmFsc3kgdmFsdWVzIHNob3VsZCBiZSBhbGxvd2VkIGxpa2UgbnVsbCBvciAwXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Blcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICAgICAgICBjYXNlICdkZW55JzpcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ25hbWVMb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmoubmFtZV9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JykgcmV0dXJuIG9iai50b1N0cmluZygpXG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpXG5cbiAgICAgIGlmIChvcHRpb25zPy51bmF1dGhvcml6ZWQgIT09IHRydWUpIGhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zPy5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW0FVRElUX0xPR19SRUFTT05fSEVBREVSXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zPy5yZWFzb24pXG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZFxuXG4gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhdHRhY2htZW50cyBmaXJzdCwgc2luY2UgYm9keSB0aGVuIGhhcyB0byBiZSBzZW5kIGluIGEgZGlmZmVyZW50IHdheS5cbiAgICAgIGlmIChvcHRpb25zPy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3JtLmFwcGVuZChgZmlsZXNbJHtpfV1gLCBvcHRpb25zLmZpbGVzW2ldLmJsb2IsIG9wdGlvbnMuZmlsZXNbaV0ubmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKVxuXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgYm9keSA9IGZvcm1cbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAmJiBvcHRpb25zLmhlYWRlcnMgJiYgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgLy8gT0F1dGgyIGJvZHkgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgZm9ybUJvZHk6IHN0cmluZ1tdID0gW11cblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSlcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGlzY29yZEJvZHkpIHtcbiAgICAgICAgICBmb3JtQm9keS5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX09JHtlbmNvZGVVUklDb21wb25lbnQoZGlzY29yZEJvZHlbcHJvcF0pfWApXG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gZm9ybUJvZHkuam9pbignJicpXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5XG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpKVxuICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gYGFwcGxpY2F0aW9uL2pzb25gXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycywgaWRlbnRpZmllcikge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfTElNSVRfSEVBREVSKVxuXG4gICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZWQgdGhlIGlkZW50aWZpZXIsIGZhbGxiYWNrIHRvIHRoZSBib3QgdG9rZW5cbiAgICAgIGlkZW50aWZpZXIgPz89IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7dXJsfWAsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBOdW1iZXIoaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJykpICogMTAwMFxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyByZXRyeUFmdGVyXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgcmV0cnlBZnRlcilcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMucm91dGV9YFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKVxuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH1cblxuICAgICAgaWYgKHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25TY2hlbWUgPSBwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKVswXVxuICAgICAgICBsb2dnaW5nSGVhZGVycy5hdXRob3JpemF0aW9uID0gYCR7YXV0aG9yaXphdGlvblNjaGVtZX0gdG9rZW5oZXJlYFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCBwYXlsb2FkKVxuICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgfSlcblxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0RXJyb3IocmVxdWVzdCwgZXJyb3IsIHsgYm9keTogb3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnM/LmJvZHkgfSlcbiAgICAgICAgLy8gTWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlZFxuICAgICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdCg5OTksIGZhbHNlKVxuICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgIGVycm9yOiAnUG9zc2libGUgbmV0d29yayBvciByZXF1ZXN0IHNoYXBlIGlzc3VlIG9jY3VycmVkLiBJZiB0aGlzIGlzIHJhcmUsIGl0cyBhIG5ldHdvcmsgZ2xpdGNoLiBJZiBpdCBvY2N1cnMgYSBsb3Qgc29tZXRoaW5nIGlzIHdyb25nLicsXG4gICAgICAgIH0pXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2hlZCBmcm9tICR7dXJsfSB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c30gJiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcblxuICAgICAgLy8gU29tZXRpbWVzIHRoZSBDb250ZW50LVR5cGUgbWF5IGJlIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLCBmb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXJcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykgPyByZXNwb25zZS5qc29uKCkgOiByZXNwb25zZS50ZXh0KCkpLmNhdGNoKCgpID0+IG51bGwpXG5cbiAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlLCB7XG4gICAgICAgIHJlcXVlc3RCb2R5OiBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uYm9keSxcbiAgICAgICAgcmVzcG9uc2VCb2R5OiBib2R5LFxuICAgICAgfSlcblxuICAgICAgLy8gTWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlZFxuICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1NDT1BFX0hFQURFUikgPT09ICdzaGFyZWQnKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMsIHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKVxuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgSHR0cFJlc3BvbnNlQ29kZS5TdWNjZXNzIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwUmVzcG9uc2VDb2RlLkVycm9yKSB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBmYWlsZWQuYClcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIdHRwUmVzcG9uc2VDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwgYm9keSB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IHdhcyByYXRlbGltaXRlZC5gKVxuICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Q291bnQgPj0gcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0cmllcy5gLCAnd2l0aCBwYXlsb2FkOicsIHBheWxvYWQpXG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMucmV0cnlDb3VudCArPSAxXG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcblxuICAgICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5yZXRyeVJlcXVlc3Q/LihvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICAvLyBEaXNjb3JkIHNvbWV0aW1lcyBzZW5kcyBhIHJlc3BvbnNlIHdpdGggbm8gY29udGVudFxuICAgICAgb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiByZXNwb25zZS5zdGF0dXMgPT09IEh0dHBSZXNwb25zZUNvZGUuTm9Db250ZW50ID8gdW5kZWZpbmVkIDogYm9keSB9KVxuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3Qgcm91dGVJbmZvcm1hdGlvbktleTogc3RyaW5nW10gPSBbbWV0aG9kXVxuXG4gICAgICBjb25zdCBxdWVyeVBhcmFtSW5kZXggPSB1cmwuaW5kZXhPZignPycpXG4gICAgICBjb25zdCByb3V0ZSA9IHF1ZXJ5UGFyYW1JbmRleCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlQYXJhbUluZGV4KSA6IHVybFxuXG4gICAgICAvLyBTaW5jZSB0aGUgdXJscyBzdGFydCB3aXRoIC8gdGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgZW1wdHlcbiAgICAgIGNvbnN0IHNwbGl0dGVkUm91dGUgPSByb3V0ZS5zcGxpdCgnLycpXG5cbiAgICAgIC8vIDEpIFN0cmlwIHRoZSBtaW5vciBwYXJhbXNcbiAgICAgIC8vICAgIFRoZSBvbmx5IG1ham9ycyBhcmUgY2hhbm5lbHMsIGd1aWxkcywgd2ViaG9va3MgYW5kIHdlYmhvb2tzIHdpdGggdGhlaXIgdG9rZW5cblxuICAgICAgY29uc3Qgc3RyaXBwZWRSb3V0ZSA9IHNwbGl0dGVkUm91dGVcbiAgICAgICAgLm1hcCgocGFydCwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgLy8gV2hpbGUgcGFyc2VJbnQgd2lsbCB0cnVuY2F0ZSB0aGUgc25vd2ZsYWtlIGlkLCBpdCB3aWxsIHN0aWxsIHRlbGwgdXMgaWYgaXQgaXMgYSBudW1iZXJcbiAgICAgICAgICBjb25zdCBpc051bWJlciA9IE51bWJlci5pc0Zpbml0ZShwYXJzZUludChwYXJ0LCAxMCkpXG5cbiAgICAgICAgICBpZiAoIWlzTnVtYmVyKSB7XG4gICAgICAgICAgICAvLyBSZWFjdGlvbnMgZW1vamkgbmVlZCB0byBiZSBzdHJpcHBlZCBhcyBpdCBpcyBhIG1pbm9yIHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ3JlYWN0aW9ucycpIHJldHVybiAneCdcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHdlYmhvb2sgb3IgaWYgaXQgaXMgcGFydCBvZiB0aGUgcm91dGUsIGtlZXAgaXQgYXMgaXQgaXMgYSBtYWpvciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIG9uIGEgY2hhbm5lbCBpZCwgYSBndWlsZCBpZCBvciBhIHdlYmhvb2sgaWRcbiAgICAgICAgICBjb25zdCBpc01ham9yID0gaW5kZXggPj0gMSAmJiAoYXJyYXlbaW5kZXggLSAxXSA9PT0gJ2NoYW5uZWxzJyB8fCBhcnJheVtpbmRleCAtIDFdID09PSAnZ3VpbGRzJyB8fCBhcnJheVtpbmRleCAtIDFdID09PSAnd2ViaG9va3MnKVxuXG4gICAgICAgICAgaWYgKGlzTWFqb3IpIHJldHVybiBwYXJ0XG5cbiAgICAgICAgICByZXR1cm4gJ3gnXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcvJylcblxuICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKHN0cmlwcGVkUm91dGUpXG5cbiAgICAgIC8vIDIpIEFjY291bnQgZm9yIGV4Y2VwdGlvbnNcbiAgICAgIC8vICAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgLy8gICAgLSBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZC9kaXNjb3JkLWFwaS1kb2NzL2lzc3Vlcy8xMjk1XG5cbiAgICAgIC8vIFRoZSAyIGV4Y2VwdGlvbnMgYXJlIGZvciBtZXNzYWdlIGRlbGV0ZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW4gdGhhdCByb3V0ZVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc3BsaXR0ZWRSb3V0ZS5sZW5ndGggPT09IDUgJiYgc3BsaXR0ZWRSb3V0ZVsxXSA9PT0gJ2NoYW5uZWxzJyAmJiBzdHJpcHBlZFJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHNwbGl0dGVkUm91dGVbNF1cbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gc25vd2ZsYWtlVG9UaW1lc3RhbXAobWVzc2FnZUlkKVxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wIDwgMTBfMDAwKSB7XG4gICAgICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKCdtZXNzYWdlLWRlbGV0ZS0xMHMnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTI5NVxuICAgICAgICAvLyAyIHdlZWtzID0gMiAqIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwID0gMTIwOTYwMDAwMFxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wID4gMTIwOTYwMDAwMCkge1xuICAgICAgICAgIHJvdXRlSW5mb3JtYXRpb25LZXkucHVzaCgnbWVzc2FnZS1kZWxldGUtMncnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZUluZm9ybWF0aW9uS2V5LmpvaW4oJzonKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KVxuXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gLCBidWNrZXRRdWV1ZSlcblxuICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBxdWV1ZVxuICAgICAgICBidWNrZXRRdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcblxuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7cm91dGV9YCwgcmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpKVxuICAgICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0KHJlcXVlc3QsIHtcbiAgICAgICAgICBib2R5OiBvcHRpb25zPy5ib2R5LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpXG5cbiAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBDb250ZW50LVR5cGUgbWF5IGJlIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLCBmb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IChyZXN1bHQuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykgPyByZXN1bHQuanNvbigpIDogcmVzdWx0LnRleHQoKSkuY2F0Y2goKCkgPT4gbnVsbClcblxuICAgICAgICByZXN0LmV2ZW50cy5yZXNwb25zZShyZXF1ZXN0LCByZXN1bHQsIHtcbiAgICAgICAgICByZXF1ZXN0Qm9keTogb3B0aW9ucz8uYm9keSxcbiAgICAgICAgICByZXNwb25zZUJvZHk6IGJvZHksXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgIT09IDIwNCA/ICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGJvZHkpIDogYm9keSkgOiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICByZXF1ZXN0Qm9keU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIChwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyAodHlwZW9mIGRhdGEuYm9keSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGRhdGEuYm9keSkgOiBkYXRhLmJvZHkpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXJyb3JUZXh0OiBzdHJpbmdcblxuICAgICAgICAgICAgc3dpdGNoIChyZWFzb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiVGhlIG9wdGlvbnMgd2FzIGltcHJvcGVybHkgZm9ybWF0dGVkLCBvciB0aGUgc2VydmVyIGNvdWxkbid0IHVuZGVyc3RhbmQgaXQuXCJcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIHdhcyBtaXNzaW5nIG9yIGludmFsaWQuJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiB0b2tlbiB5b3UgcGFzc2VkIGRpZCBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHRoZSByZXNvdXJjZS4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0LlwiXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0MDU6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gJ1RoZSBIVFRQIG1ldGhvZCB1c2VkIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGxvY2F0aW9uIHNwZWNpZmllZC4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0Mjk6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJZb3UncmUgYmVpbmcgcmF0ZWxpbWl0ZWQuXCJcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDUwMjpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlcmUgd2FzIG5vdCBhIGdhdGV3YXkgYXZhaWxhYmxlIHRvIHByb2Nlc3MgeW91ciBvcHRpb25zLiBXYWl0IGEgYml0IGFuZCByZXRyeS4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSByZWFzb24uc3RhdHVzVGV4dCA/PyAnVW5rbm93biBlcnJvcidcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbJHtyZWFzb24uc3RhdHVzfV0gJHtlcnJvclRleHR9YFxuXG4gICAgICAgICAgICAvLyBJZiBkaXNjb3JkIHNlbnQgdXMgSlNPTiwgaXQgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW5kIGFkZCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0byB0aGUgZXJyb3IgbWVzc2FnZSwgdGhlIGZ1bGwgYm9keSB3aWxsIGJlIGluIHRoZSBlcnJvci5jYXVzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlI2Vycm9yLW1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlYXNvbi5ib2R5ID09PSAnb2JqZWN0JyAmJiBoYXNQcm9wZXJ0eShyZWFzb24uYm9keSwgJ2NvZGUnKSAmJiBoYXNQcm9wZXJ0eShyZWFzb24uYm9keSwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5EaXNjb3JkIGVycm9yOiBbJHtyZWFzb24uYm9keS5jb2RlfV0gJHtyZWFzb24uYm9keS5tZXNzYWdlfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IuY2F1c2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYmFzZUVycm9yUHJvdG90eXBlKSwgcmVhc29uKVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBvcHRpb25zPy5ydW5UaHJvdWdoUXVldWUsXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBvcHRpb25zLmZpbGUuYmxvYiwgb3B0aW9ucy5maWxlLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnbmFtZScsIG9wdGlvbnMubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCdkZXNjcmlwdGlvbicsIG9wdGlvbnMuZGVzY3JpcHRpb24pXG4gICAgICBmb3JtLmFwcGVuZCgndGFncycsIG9wdGlvbnMudGFncylcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpLCB7IGJvZHk6IGZvcm0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgYm9keSA9IHt9LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFJvbGVNZW1iZXJDb3VudHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXJDb3VudHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVJvbGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU3RhZ2VJbnN0YW5jZShib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUFwcGxpY2F0aW9uRW1vamkoaWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZXMoY2hhbm5lbElkLCBtZXNzYWdlSWRzLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy5idWxrKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlSWRzLnNsaWNlKDAsIDEwMCkubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3duUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmJvdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNBbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5hbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuZW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUm9sZShndWlsZElkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVVc2VyUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHVzZXJJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQsIGNvbW1hbmRJZCwgYmVhcmVyVG9rZW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHtcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkxcbiAgICAgIGNvbnN0IGJhbm5lciA9IG9wdGlvbnM/LmJvdEJhbm5lclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEJhbm5lclVSTCkgOiBvcHRpb25zPy5ib3RCYW5uZXJVUkxcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgICAgYXZhdGFyLFxuICAgICAgICAgIGJhbm5lcixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIGJvZHkuaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkVtb2ppKGlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgYm9keTogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3duVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0VG9TcGVha1RpbWVzdGFtcDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcFxuICAgICAgICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZVBvc2l0aW9ucyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgdG9waWMsIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgYm9keTogeyB0b3BpYyB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB3ZWJob29rQ2hhbm5lbElkOiB0YXJnZXRDaGFubmVsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkluZm8oYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbigpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuY3VycmVudEF1dGhvcml6YXRpb24oKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGV4Y2hhbmdlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkuZ3JhbnRUeXBlID09PSAnY2xpZW50X2NyZWRlbnRpYWxzJykge1xuICAgICAgICByZXN0T3B0aW9ucy5ib2R5LnNjb3BlID0gYm9keS5zY29wZS5qb2luKCcgJylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQWNjZXNzVG9rZW5SZXNwb25zZT4ocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuRXhjaGFuZ2UoKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHJldm9rZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlblJldm9rZSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXVkaXRMb2coZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdWRpdExvZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1ZGl0bG9ncyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMucmVnaW9ucygpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW4oZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFucyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbChpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsW10+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbFdlYmhvb2tzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keTogeyByZWNpcGllbnRJZDogdXNlcklkIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHcm91cERtQ2hhbm5lbChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamkoZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkRW1vamlbXSB9PihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2F0ZXdheUJvdCgpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0R2F0ZXdheUJvdD4ocmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQsIG9wdGlvbnM/LndpdGhMb2NhbGl6YXRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkcyh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgY29uc3QgbWFrZVJlcXVlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB0b2tlblxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFBhcnRpYWw8RGlzY29yZEd1aWxkPltdPihyZXN0LnJvdXRlcy5ndWlsZHMudXNlckd1aWxkcyhvcHRpb25zKSwgbWFrZVJlcXVlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBvcHRpb25zPy53aXRoTG9jYWxpemF0aW9ucyksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrPihyZXN0LnJvdXRlcy5zdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2tzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFja1tdPihyZXN0LnJvdXRlcy5zdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBydW5lQ291bnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQcnVuZWRDb3VudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnBydW5lKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlKGd1aWxkSWQsIHJvbGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxBcnJheTx7IHVzZXI6IERpc2NvcmRVc2VyOyBtZW1iZXI/OiBEaXNjb3JkTWVtYmVyIH0+PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLnVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTZXNzaW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdhdGV3YXlCb3QoKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPd25Wb2ljZVN0YXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5nZXRVc2VyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVtYmVycyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudFVzZXIodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJDb25uZWN0aW9ucyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDb25uZWN0aW9uW10+KHJlc3Qucm91dGVzLm9hdXRoMi5jb25uZWN0aW9ucygpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbml0eVVybChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZhbml0eVVybD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZhbml0eShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJlZ2lvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldEpzb24oZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldFNldHRpbmdzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVHdWlsZChndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubGVhdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVEbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2socmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8dm9pZCB8IERpc2NvcmRJbnRlcmFjdGlvbkNhbGxiYWNrUmVzcG9uc2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4sIHBhcmFtcyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZGF0YT8uZmlsZXMsXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWxsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBvbGxBbnN3ZXJWb3RlcnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLnZvdGVzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGVuZFBvbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLmV4cGlyZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHN5bmNHdWlsZFRlbXBsYXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBidWxrQmFuTWVtYmVycyhndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEJ1bGtCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJ1bGtCYW4oZ3VpbGRJZCksIHsgYm9keTogb3B0aW9ucywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RNZW1iZXIoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50TWVtYmVyKGd1aWxkSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5jdXJyZW50TWVtYmVyKGd1aWxkSWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFjdGl2aXR5SW5zdGFuY2U+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcGluTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlUGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHJ1bmVNZW1iZXJzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZE9uYm9hcmRpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5vbmJvYXJkaW5nKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUd1aWxkSW5jaWRlbnRBY3Rpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkSW5jaWRlbnRzRGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmluY2lkZW50QWN0aW9ucyhndWlsZElkKSwgeyBib2R5OiBvcHRpb25zIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5waW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VQaW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnR5cGluZyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRHdWlsZE1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVudGl0bGVtZW50PihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnRbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVUZXN0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBjb25zdW1lRW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5jb25zdW1lRW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTa3VzKGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2t1W10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5za3VzKGFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0U3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdWJzY3JpcHRpb25bXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnN1YnNjcmlwdGlvbnMoc2t1SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdWJzY3JpcHRpb24oc2t1SWQsIHN1YnNjcmlwdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbj4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kU291bmRib2FyZFNvdW5kKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuc2VuZFNvdW5kKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3REZWZhdWx0U291bmRib2FyZFNvdW5kcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU291bmRib2FyZFNvdW5kW10+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQubGlzdERlZmF1bHQoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEd1aWxkU291bmRib2FyZFNvdW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8eyBpdGVtczogRGlzY29yZFNvdW5kYm9hcmRTb3VuZFtdIH0+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU291bmRib2FyZFNvdW5kPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU291bmRib2FyZFNvdW5kPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmRzKGd1aWxkSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU291bmRib2FyZFNvdW5kPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uc01ldGFkYXRhUmVjb3JkcyhhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEoYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZUFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YShhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlTG9iYnkob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmNyZWF0ZSgpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRMb2JieShsb2JieUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5sb2JieShsb2JieUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5TG9iYnkobG9iYnlJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5sb2JieShsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTG9iYnkobG9iYnlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRNZW1iZXJUb0xvYmJ5KGxvYmJ5SWQsIHVzZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRMb2JieU1lbWJlcj4ocmVzdC5yb3V0ZXMubG9iYnkubWVtYmVyKGxvYmJ5SWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZU1lbWJlckZyb21Mb2JieShsb2JieUlkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXIobG9iYnlJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVMb2JieShsb2JieUlkLCBiZWFyZXJUb2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmxvYmJ5LmxlYXZlKGxvYmJ5SWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlua0NoYW5uZWxUb0xvYmJ5KGxvYmJ5SWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxpbmsobG9iYnlJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmxpbmtDaGFubmVsVG9Mb2JieShsb2JieUlkLCBiZWFyZXJUb2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5saW5rKGxvYmJ5SWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemVcblxuICAgICAgcmVzdC5nZXQgPSBhc3luYyAodXJsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucGF0Y2ggPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdFxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG4iXSwibmFtZXMiOlsiQnVmZmVyIiwiaW5zcGVjdCIsImNhbGN1bGF0ZUJpdHMiLCJjYW1lbGl6ZSIsImNhbWVsVG9TbmFrZUNhc2UiLCJESVNDT1JERU5PX1ZFUlNJT04iLCJkZWxheSIsImdldEJvdElkRnJvbVRva2VuIiwiaGFzUHJvcGVydHkiLCJsb2dnZXIiLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJzbm93Zmxha2VUb1RpbWVzdGFtcCIsInVybFRvQmFzZTY0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJRdWV1ZSIsImNyZWF0ZVJvdXRlcyIsIkRJU0NPUkRfQVBJX1ZFUlNJT04iLCJESVNDT1JEX0FQSV9VUkwiLCJBVURJVF9MT0dfUkVBU09OX0hFQURFUiIsIlJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiIsIlJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ0b2tlbiIsImJhc2VVcmwiLCJwcm94eSIsImJhc2VFcnJvclByb3RvdHlwZSIsImN1c3RvbSIsIl9kZXB0aCIsIl9pbnNwZWN0IiwiZGVwdGgiLCJJbmZpbml0eSIsImN1c3RvbUluc3BlY3QiLCJyZXN0IiwiYXV0aG9yaXphdGlvbiIsImF1dGhvcml6YXRpb25IZWFkZXIiLCJkZWxldGVRdWV1ZURlbGF5IiwiZ2xvYmFsbHlSYXRlTGltaXRlZCIsImludmFsaWRCdWNrZXQiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwidXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCIsIm1heFJldHJ5Q291bnQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJ2ZXJzaW9uIiwiZXZlbnRzIiwicmVxdWVzdCIsInJlc3BvbnNlIiwicmVxdWVzdEVycm9yIiwicm91dGVzIiwiY3JlYXRlQmFzZUhlYWRlcnMiLCJjaGVja1JhdGVMaW1pdHMiLCJ1cmwiLCJpZGVudGlmaWVyIiwicmF0ZWxpbWl0ZWQiLCJnZXQiLCJnbG9iYWwiLCJub3ciLCJEYXRlIiwicmVzZXRUaW1lc3RhbXAiLCJ1cGRhdGVUb2tlblF1ZXVlcyIsIm9sZFRva2VuIiwibmV3VG9rZW4iLCJFcnJvciIsImhlYWRlcnMiLCJ1bmRlZmluZWQiLCJmZXRjaCIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibmV3SWRlbnRpZmllciIsImtleSIsInF1ZXVlIiwiZW50cmllcyIsImRlbGV0ZSIsIm5ld0tleSIsIm5ld1F1ZXVlIiwid2FpdGluZyIsInVuc2hpZnQiLCJwZW5kaW5nIiwiY2xlYW51cCIsInNldCIsInJhdGVsaW1pdFBhdGgiLCJidWNrZXRJZCIsImNoYW5nZVRvRGlzY29yZEZvcm1hdCIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0ZW0iLCJuZXdPYmoiLCJPYmplY3QiLCJrZXlzIiwidmFsdWUiLCJpbmNsdWRlcyIsImRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zIiwibmFtZV9sb2NhbGl6YXRpb25zIiwiZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyIsInRvU3RyaW5nIiwiY3JlYXRlUmVxdWVzdEJvZHkiLCJ1bmF1dGhvcml6ZWQiLCJyZWFzb24iLCJlbmNvZGVVUklDb21wb25lbnQiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImZvcm1Cb2R5IiwiZGlzY29yZEJvZHkiLCJwcm9wIiwicHVzaCIsImpvaW4iLCJhc3NpZ24iLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aG9yaXphdGlvblNjaGVtZSIsInNwbGl0IiwiUmVxdWVzdCIsImRlYnVnIiwiY2F0Y2giLCJlcnJvciIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImpzb24iLCJ0ZXh0IiwicmVxdWVzdEJvZHkiLCJyZXNwb25zZUJvZHkiLCJzaW1wbGlmeVVybCIsInJldHJ5Q291bnQiLCJyZXNldEFmdGVyIiwicmV0cnlSZXF1ZXN0IiwicmVzb2x2ZSIsInJvdXRlSW5mb3JtYXRpb25LZXkiLCJxdWVyeVBhcmFtSW5kZXgiLCJpbmRleE9mIiwic2xpY2UiLCJzcGxpdHRlZFJvdXRlIiwic3RyaXBwZWRSb3V0ZSIsInBhcnQiLCJpbmRleCIsImFycmF5IiwiaXNOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlSW50IiwiaXNNYWpvciIsImVuZHNXaXRoIiwibWVzc2FnZUlkIiwidGltZXN0YW1wIiwicHJvY2Vzc1JlcXVlc3QiLCJydW5UaHJvdWdoUXVldWUiLCJxdWV1ZUlkZW50aWZpZXIiLCJtYWtlUmVxdWVzdCIsImJ1Y2tldFF1ZXVlIiwicmVzdWx0IiwiY2F1c2UiLCJjcmVhdGUiLCJwYXJzZSIsIlByb21pc2UiLCJkYXRhIiwiZXJyb3JUZXh0IiwibWVzc2FnZSIsImNvZGUiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJhZGRSZWFjdGlvbiIsImNoYW5uZWxJZCIsInJlYWN0aW9uIiwiY2hhbm5lbHMiLCJyZWFjdGlvbnMiLCJib3QiLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWxsIiwiYWRkUm9sZSIsImd1aWxkSWQiLCJ1c2VySWQiLCJyb2xlSWQiLCJndWlsZHMiLCJyb2xlcyIsIm1lbWJlciIsImFkZFRocmVhZE1lbWJlciIsInRocmVhZHMiLCJ1c2VyIiwiYWRkRG1SZWNpcGllbnQiLCJkbVJlY2lwaWVudCIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiYXV0b21vZCIsInJ1bGVzIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiZW1vamlzIiwiY3JlYXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamlzIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwicmVzdE9wdGlvbnMiLCJiZWFyZXJUb2tlbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJjcmVhdGVHdWlsZFN0aWNrZXIiLCJmaWxlIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwic3RpY2tlcnMiLCJjcmVhdGVHdWlsZFRlbXBsYXRlIiwidGVtcGxhdGVzIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJmb3J1bSIsImNyZWF0ZUludml0ZSIsImludml0ZXMiLCJnZXRHdWlsZFJvbGVNZW1iZXJDb3VudHMiLCJtZW1iZXJDb3VudHMiLCJjcmVhdGVSb2xlIiwiY3JlYXRlU2NoZWR1bGVkRXZlbnQiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwic3RhZ2VzIiwiY3JlYXRlV2ViaG9vayIsIndlYmhvb2tzIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJydWxlSWQiLCJydWxlIiwiZGVsZXRlQ2hhbm5lbCIsImNoYW5uZWwiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwib3ZlcndyaXRlSWQiLCJvdmVyd3JpdGUiLCJkZWxldGVFbW9qaSIsImlkIiwiZW1vamkiLCJkZWxldGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsInJlc3BvbnNlcyIsImRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImNvbW1hbmRJZCIsImNvbW1hbmQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiZ3VpbGQiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImludGVncmF0aW9uSWQiLCJpbnRlZ3JhdGlvbiIsImRlbGV0ZUludml0ZSIsImludml0ZUNvZGUiLCJpbnZpdGUiLCJkZWxldGVNZXNzYWdlIiwiZGVsZXRlTWVzc2FnZXMiLCJtZXNzYWdlSWRzIiwiYnVsayIsIm1lc3NhZ2VzIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImJhbm5lciIsImJvdEJhbm5lclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRBcHBsaWNhdGlvbkVtb2ppIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRTdGlja2VyIiwiZWRpdEd1aWxkVGVtcGxhdGUiLCJlZGl0TWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJlZGl0T3duVm9pY2VTdGF0ZSIsInZvaWNlIiwicmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAiLCJ0b0lTT1N0cmluZyIsImVkaXRTY2hlZHVsZWRFdmVudCIsImVkaXRSb2xlIiwiZWRpdFJvbGVQb3NpdGlvbnMiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsInRvcGljIiwiZWRpdFVzZXJWb2ljZVN0YXRlIiwiZWRpdFdlYmhvb2siLCJlZGl0V2ViaG9va01lc3NhZ2UiLCJlZGl0V2ViaG9va1dpdGhUb2tlbiIsImVkaXRXZWxjb21lU2NyZWVuIiwid2VsY29tZSIsImVkaXRXaWRnZXRTZXR0aW5ncyIsIndpZGdldCIsImV4ZWN1dGVXZWJob29rIiwiZm9sbG93QW5ub3VuY2VtZW50Iiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwiZm9sbG93Iiwid2ViaG9va0NoYW5uZWxJZCIsImdldEFjdGl2ZVRocmVhZHMiLCJhY3RpdmUiLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uIiwiYWNjZXNzVG9rZW4iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEFwcGxpY2F0aW9uSW5mbyIsIm9hdXRoMiIsImFwcGxpY2F0aW9uIiwiZWRpdEFwcGxpY2F0aW9uSW5mbyIsImdldEN1cnJlbnRBdXRoZW50aWNhdGlvbkluZm8iLCJjdXJyZW50QXV0aG9yaXphdGlvbiIsImV4Y2hhbmdlVG9rZW4iLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsImJhc2ljQ3JlZGVudGlhbHMiLCJmcm9tIiwiZ3JhbnRUeXBlIiwic2NvcGUiLCJ0b2tlbkV4Y2hhbmdlIiwicmV2b2tlVG9rZW4iLCJ0b2tlblJldm9rZSIsImdldEF1ZGl0TG9nIiwiYXVkaXRsb2dzIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMiLCJyZWdpb25zIiwiZ2V0QmFuIiwibWVtYmVycyIsImJhbiIsImdldEJhbnMiLCJiYW5zIiwiZ2V0Q2hhbm5lbCIsImdldENoYW5uZWxJbnZpdGVzIiwiZ2V0Q2hhbm5lbHMiLCJnZXRDaGFubmVsV2ViaG9va3MiLCJnZXREbUNoYW5uZWwiLCJkbSIsInJlY2lwaWVudElkIiwiZ2V0R3JvdXBEbUNoYW5uZWwiLCJnZXRFbW9qaSIsImVtb2ppSWQiLCJnZXRBcHBsaWNhdGlvbkVtb2ppIiwiZ2V0RW1vamlzIiwiZ2V0QXBwbGljYXRpb25FbW9qaXMiLCJnZXRGb2xsb3d1cE1lc3NhZ2UiLCJnZXRHYXRld2F5Qm90IiwiZ2F0ZXdheUJvdCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ3aXRoTG9jYWxpemF0aW9ucyIsImdldEd1aWxkIiwiY291bnRzIiwiZ2V0R3VpbGRzIiwibWFrZVJlcXVlc3RPcHRpb25zIiwidXNlckd1aWxkcyIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGRQcmV2aWV3IiwicHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJpbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwiZ2V0U3RpY2tlclBhY2siLCJzdGlja2VyUGFja0lkIiwic3RpY2tlclBhY2siLCJnZXRTdGlja2VyUGFja3MiLCJzdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRDaGFubmVsUGlucyIsIm1lc3NhZ2VQaW5zIiwiZ2V0UGlubmVkTWVzc2FnZXMiLCJwaW5zIiwiZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyIsInByaXZhdGUiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiam9pbmVkIiwiZ2V0UHJ1bmVDb3VudCIsInBydW5lIiwiZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzIiwicHVibGljIiwiZ2V0Um9sZXMiLCJnZXRSb2xlIiwiZ2V0U2NoZWR1bGVkRXZlbnQiLCJ3aXRoVXNlckNvdW50IiwiZ2V0U2NoZWR1bGVkRXZlbnRzIiwiZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyIsInVzZXJzIiwiZ2V0U2Vzc2lvbkluZm8iLCJnZXRTdGFnZUluc3RhbmNlIiwiZ2V0T3duVm9pY2VTdGF0ZSIsImdldFVzZXJWb2ljZVN0YXRlIiwiZ2V0U3RpY2tlciIsImdldEd1aWxkU3RpY2tlciIsImdldEd1aWxkU3RpY2tlcnMiLCJnZXRUaHJlYWRNZW1iZXIiLCJnZXRVc2VyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldEN1cnJlbnRVc2VyIiwiZ2V0VXNlckNvbm5lY3Rpb25zIiwiY29ubmVjdGlvbnMiLCJnZXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsInJvbGVDb25uZWN0aW9ucyIsImdldFZhbml0eVVybCIsInZhbml0eSIsImdldFZvaWNlUmVnaW9ucyIsImdldFdlYmhvb2siLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJnZXRXZWxjb21lU2NyZWVuIiwiZ2V0V2lkZ2V0Iiwid2lkZ2V0SnNvbiIsImdldFdpZGdldFNldHRpbmdzIiwiam9pblRocmVhZCIsIm1lIiwibGVhdmVHdWlsZCIsImxlYXZlIiwibGVhdmVUaHJlYWQiLCJwdWJsaXNoTWVzc2FnZSIsImNyb3NzcG9zdCIsInJlbW92ZVJvbGUiLCJyZW1vdmVUaHJlYWRNZW1iZXIiLCJyZW1vdmVEbVJlY2lwaWVudCIsInNlbmRGb2xsb3d1cE1lc3NhZ2UiLCJzZW5kSW50ZXJhY3Rpb25SZXNwb25zZSIsImludGVyYWN0aW9uSWQiLCJwYXJhbXMiLCJjYWxsYmFjayIsInNlbmRNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRoTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UiLCJnZXRQb2xsQW5zd2VyVm90ZXJzIiwiYW5zd2VySWQiLCJwb2xscyIsInZvdGVzIiwiZW5kUG9sbCIsImV4cGlyZSIsInN5bmNHdWlsZFRlbXBsYXRlIiwiYmFuTWVtYmVyIiwiYnVsa0Jhbk1lbWJlcnMiLCJidWxrQmFuIiwiZWRpdEJvdE1lbWJlciIsImVkaXRNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXRDdXJyZW50TWVtYmVyIiwiY3VycmVudE1lbWJlciIsImdldE1lbWJlcnMiLCJnZXRBcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UiLCJpbnN0YW5jZUlkIiwiYXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwia2lja01lbWJlciIsInBpbk1lc3NhZ2UiLCJtZXNzYWdlUGluIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInF1ZXJ5Iiwic2VhcmNoIiwiZ2V0R3VpbGRPbmJvYXJkaW5nIiwib25ib2FyZGluZyIsImVkaXRHdWlsZE9uYm9hcmRpbmciLCJtb2RpZnlHdWlsZEluY2lkZW50QWN0aW9ucyIsImluY2lkZW50QWN0aW9ucyIsInVuYmFuTWVtYmVyIiwidW5waW5NZXNzYWdlIiwidHJpZ2dlclR5cGluZ0luZGljYXRvciIsInR5cGluZyIsInVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJlZGl0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJhZGRHdWlsZE1lbWJlciIsImNyZWF0ZVRlc3RFbnRpdGxlbWVudCIsIm1vbmV0aXphdGlvbiIsImVudGl0bGVtZW50cyIsImxpc3RFbnRpdGxlbWVudHMiLCJnZXRFbnRpdGxlbWVudCIsImVudGl0bGVtZW50SWQiLCJlbnRpdGxlbWVudCIsImRlbGV0ZVRlc3RFbnRpdGxlbWVudCIsImNvbnN1bWVFbnRpdGxlbWVudCIsImxpc3RTa3VzIiwic2t1cyIsImxpc3RTdWJzY3JpcHRpb25zIiwic2t1SWQiLCJzdWJzY3JpcHRpb25zIiwiZ2V0U3Vic2NyaXB0aW9uIiwic3Vic2NyaXB0aW9uSWQiLCJzdWJzY3JpcHRpb24iLCJzZW5kU291bmRib2FyZFNvdW5kIiwic291bmRib2FyZCIsInNlbmRTb3VuZCIsImxpc3REZWZhdWx0U291bmRib2FyZFNvdW5kcyIsImxpc3REZWZhdWx0IiwibGlzdEd1aWxkU291bmRib2FyZFNvdW5kcyIsImd1aWxkU291bmRzIiwiZ2V0R3VpbGRTb3VuZGJvYXJkU291bmQiLCJzb3VuZElkIiwiZ3VpbGRTb3VuZCIsImNyZWF0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwibW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQiLCJkZWxldGVHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImxpc3RBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uc01ldGFkYXRhUmVjb3JkcyIsImFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YSIsInVwZGF0ZUFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzIiwiY3JlYXRlTG9iYnkiLCJsb2JieSIsImdldExvYmJ5IiwibG9iYnlJZCIsIm1vZGlmeUxvYmJ5IiwiZGVsZXRlTG9iYnkiLCJhZGRNZW1iZXJUb0xvYmJ5IiwicmVtb3ZlTWVtYmVyRnJvbUxvYmJ5IiwibGVhdmVMb2JieSIsImxpbmtDaGFubmVsVG9Mb2JieSIsImxpbmsiLCJ1bmxpbmtDaGFubmVsVG9Mb2JieSIsInByZWZlclNuYWtlQ2FzZSIsImVuYWJsZWQiLCJjYW1lbGl6ZXIiLCJ4IiwiSHR0cFJlc3BvbnNlQ29kZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLGNBQWE7QUFDcEMsU0FBOEJDLE9BQU8sUUFBUSxZQUFXO0FBMkR4RCxTQUNFQyxhQUFhLEVBQ2JDLFFBQVEsRUFDUkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLEtBQUssRUFDTEMsaUJBQWlCLEVBQ2pCQyxXQUFXLEVBQ1hDLE1BQU0sRUFDTkMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLFdBQVcsUUFDTixvQkFBbUI7QUFDMUIsU0FBU0MsMEJBQTBCLFFBQVEscUJBQW9CO0FBQy9ELFNBQVNDLEtBQUssUUFBUSxhQUFZO0FBQ2xDLFNBQVNDLFlBQVksUUFBUSxjQUFhO0FBRzFDLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUU7QUFDckMsT0FBTyxNQUFNQyxrQkFBa0IsMEJBQXlCO0FBRXhELE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFvQjtBQUMzRCxPQUFPLE1BQU1DLDhCQUE4Qix3QkFBdUI7QUFDbEUsT0FBTyxNQUFNQyxnQ0FBZ0MsMEJBQXlCO0FBQ3RFLE9BQU8sTUFBTUMsMkJBQTJCLHFCQUFvQjtBQUM1RCxPQUFPLE1BQU1DLDJCQUEyQixxQkFBb0I7QUFDNUQsT0FBTyxNQUFNQywwQkFBMEIsb0JBQW1CO0FBQzFELE9BQU8sTUFBTUMsMEJBQTBCLG9CQUFtQjtBQUUxRCxPQUFPLFNBQVNDLGtCQUFrQkMsT0FBaUM7SUFDakUsTUFBTUMsZ0JBQWdCRCxRQUFRQyxhQUFhLEdBQUdDLE9BQU9GLFFBQVFDLGFBQWEsSUFBSXBCLGtCQUFrQm1CLFFBQVFHLEtBQUs7SUFFN0csTUFBTUMsVUFBVUosUUFBUUssS0FBSyxFQUFFRCxXQUFXYjtJQUMxQyxpR0FBaUc7SUFDakcsTUFBTWUs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
1696
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCB7IHR5cGUgSW5zcGVjdE9wdGlvbnMsIGluc3BlY3QgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUge1xuICBCaWdTdHJpbmcsXG4gIENhbWVsaXplLFxuICBEaXNjb3JkQWNjZXNzVG9rZW5SZXNwb25zZSxcbiAgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIERpc2NvcmRBcHBsaWNhdGlvbixcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEsXG4gIERpc2NvcmRBdWRpdExvZyxcbiAgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZSxcbiAgRGlzY29yZEJhbixcbiAgRGlzY29yZEJ1bGtCYW4sXG4gIERpc2NvcmRDaGFubmVsLFxuICBEaXNjb3JkQ29ubmVjdGlvbixcbiAgRGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbCxcbiAgRGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2UsXG4gIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICBEaXNjb3JkR3VpbGQsXG4gIERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zLFxuICBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICBEaXNjb3JkR3VpbGRQcmV2aWV3LFxuICBEaXNjb3JkR3VpbGRXaWRnZXQsXG4gIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICBEaXNjb3JkSW5jaWRlbnRzRGF0YSxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRMb2JieSxcbiAgRGlzY29yZExvYmJ5TWVtYmVyLFxuICBEaXNjb3JkTWVtYmVyLFxuICBEaXNjb3JkTWVtYmVyV2l0aFVzZXIsXG4gIERpc2NvcmRNZXNzYWdlLFxuICBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIERpc2NvcmRSb2xlLFxuICBEaXNjb3JkU2NoZWR1bGVkRXZlbnQsXG4gIERpc2NvcmRTa3UsXG4gIERpc2NvcmRTb3VuZGJvYXJkU291bmQsXG4gIERpc2NvcmRTdGFnZUluc3RhbmNlLFxuICBEaXNjb3JkU3RpY2tlcixcbiAgRGlzY29yZFN0aWNrZXJQYWNrLFxuICBEaXNjb3JkU3Vic2NyaXB0aW9uLFxuICBEaXNjb3JkVGFyZ2V0VXNlcnNKb2JTdGF0dXMsXG4gIERpc2NvcmRUZW1wbGF0ZSxcbiAgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgRGlzY29yZFVzZXIsXG4gIERpc2NvcmRWYW5pdHlVcmwsXG4gIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgRGlzY29yZFZvaWNlU3RhdGUsXG4gIERpc2NvcmRXZWJob29rLFxuICBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgTW9kaWZ5R3VpbGRUZW1wbGF0ZSxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnO1xuaW1wb3J0IHtcbiAgY2FtZWxpemUsXG4gIGNhbWVsVG9TbmFrZUNhc2UsXG4gIERJU0NPUkRFTk9fVkVSU0lPTixcbiAgZGVsYXksXG4gIGdldEJvdElkRnJvbVRva2VuLFxuICBoYXNQcm9wZXJ0eSxcbiAgbG9nZ2VyLFxuICBwcm9jZXNzUmVhY3Rpb25TdHJpbmcsXG4gIHNub3dmbGFrZVRvVGltZXN0YW1wLFxuICB1cmxUb0Jhc2U2NCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnO1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgRElTQ09SRF9BUElfVkVSU0lPTiA9IDEwO1xuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1VSTCA9ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaSc7XG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIgPSAneC1yYXRlbGltaXQtYnVja2V0JztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1saW1pdCc7XG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICBjb25zdCBhcHBsaWNhdGlvbklkID0gb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKTtcblxuICBjb25zdCBiYXNlVXJsID0gKG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMKS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAvLyBEaXNjb3JkIGVycm9yIGNhbiBnZXQgbmVzdGVkIGEgbG90LCBzbyB3ZSB1c2UgYSBjdXN0b20gaW5zcGVjdCB0byBjaGFuZ2UgdGhlIGRlcHRoIHRvIEluZmluaXR5XG4gIGNvbnN0IGJhc2VFcnJvclByb3RvdHlwZSA9IHtcbiAgICBbaW5zcGVjdC5jdXN0b21dKF9kZXB0aDogbnVtYmVyLCBvcHRpb25zOiBJbnNwZWN0T3B0aW9ucywgX2luc3BlY3Q6IHR5cGVvZiBpbnNwZWN0KSB7XG4gICAgICByZXR1cm4gX2luc3BlY3QodGhpcywge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZXB0aDogSW5maW5pdHksXG4gICAgICAgIC8vIFNpbmNlIHdlIGNhbGwgaW5zcGVjdCBvbiBvdXJzZWxmLCB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGNhbGxzIHRvIHRoZSBpbnNwZWN0LmN1c3RvbSBzeW1ib2wgb3IgZWxzZSBpdCB3aWxsIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICByZXF1ZXN0VGltZW91dDogb3B0aW9ucy5yZXF1ZXN0VGltZW91dCA/PyAzMDAwMCxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIGV2ZW50czoge1xuICAgICAgcmVxdWVzdDogKCkgPT4ge30sXG4gICAgICByZXNwb25zZTogKCkgPT4ge30sXG4gICAgICByZXF1ZXN0RXJyb3I6ICgpID0+IHt9LFxuICAgICAgLi4ub3B0aW9ucy5ldmVudHMsXG4gICAgfSxcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwsIGlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApO1xuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIGlmIChyYXRlbGltaXRlZCAmJiBub3cgPCByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXAgLSBub3c7XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3c7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVG9rZW5RdWV1ZXMob2xkVG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKCFyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZSAncHJveHkudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCcgb3B0aW9uIG5lZWRzIHRvIGJlIHNldCB3aGVuIHVzaW5nIGEgcmVzdCBwcm94eSBhbmQgbmVlZGVkIHRvIGNhbGwgJ3VwZGF0ZVRva2VuUXVldWVzJ1wiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9LyR7cmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50fWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvbGRUb2tlbixcbiAgICAgICAgICAgIG5ld1Rva2VuLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gO1xuXG4gICAgICAvLyBVcGRhdGUgYWxsIHRoZSBxdWV1ZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcXVldWVdIG9mIHJlc3QucXVldWVzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWU7XG5cbiAgICAgICAgcmVzdC5xdWV1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyO1xuXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGAke25ld0lkZW50aWZpZXJ9JHtxdWV1ZS51cmx9YDtcbiAgICAgICAgY29uc3QgbmV3UXVldWUgPSByZXN0LnF1ZXVlcy5nZXQobmV3S2V5KTtcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKTtcbiAgICAgICAgICBuZXdRdWV1ZS5wZW5kaW5nLnVuc2hpZnQoLi4ucXVldWUucGVuZGluZyk7XG5cbiAgICAgICAgICBxdWV1ZS53YWl0aW5nID0gW107XG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdO1xuXG4gICAgICAgICAgcXVldWUuY2xlYW51cCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3QucXVldWVzLnNldChuZXdLZXksIHF1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGgudXJsfWAsIHJhdGVsaW1pdFBhdGgpO1xuXG4gICAgICAgIGlmIChyYXRlbGltaXRQYXRoLmJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC5idWNrZXRJZH1gLCByYXRlbGltaXRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5tYXAoKGl0ZW0pID0+IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KGl0ZW0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgICAgICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gc25ha2VfY2FzZSB3ZSBjYW4gYXNzdW1lIGl0IGlzIGFscmVhZHkgaW4gdGhlIGRpc2NvcmQgZm9ybWF0LlxuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICBjYXNlICduYW1lTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLm5hbWVfbG9jYWxpemF0aW9ucyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3T2JqW2NhbWVsVG9TbmFrZUNhc2Uoa2V5KV0gPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpO1xuXG4gICAgICBpZiAob3B0aW9ucz8udW5hdXRob3JpemVkICE9PSB0cnVlKSBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgQm90ICR7cmVzdC50b2tlbn1gO1xuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnM/LnJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbQVVESVRfTE9HX1JFQVNPTl9IRUFERVJdID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnM/LnJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZDtcblxuICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgYXR0YWNobWVudHMgZmlyc3QsIHNpbmNlIGJvZHkgdGhlbiBoYXMgdG8gYmUgc2VuZCBpbiBhIGRpZmZlcmVudCB3YXkuXG4gICAgICBpZiAob3B0aW9ucz8uZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5maWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlc1ske2l9XWAsIG9wdGlvbnMuZmlsZXNbaV0uYmxvYiwgb3B0aW9ucy5maWxlc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKTtcblxuICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIGJvZHkgPSBmb3JtO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICYmIG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykge1xuICAgICAgICAvLyBPQXV0aDIgYm9keSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBmb3JtQm9keTogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRpc2NvcmRCb2R5KSB7XG4gICAgICAgICAgZm9ybUJvZHkucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQocHJvcCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc2NvcmRCb2R5W3Byb3BdKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgPSBmb3JtQm9keS5qb2luKCcmJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5O1xuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSk7XG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24vanNvbmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWU7XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSk7XG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlO1xuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMsIGlkZW50aWZpZXIpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIpO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpID8/IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDA7XG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIpO1xuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0xJTUlUX0hFQURFUik7XG5cbiAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlZCB0aGUgaWRlbnRpZmllciwgZmFsbGJhY2sgdG8gdGhlIGJvdCB0b2tlblxuICAgICAgaWRlbnRpZmllciA/Pz0gYEJvdCAke3Jlc3QudG9rZW59YDtcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpKSAqIDEwMDA7XG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXI7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWU7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgcmV0cnlBZnRlcik7XG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy5yb3V0ZX1gO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKTtcblxuICAgICAgLy8gUmV0cmllcyBhIHJlcXVlc3QgdGhhdCB3YXMgYWJvcnRlZCBiZWNhdXNlIGl0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAsIG9yIHJlamVjdHMgaXQgb25jZSB0aGUgcmV0cnlcbiAgICAgIC8vIGJ1ZGdldCBpcyBleGhhdXN0ZWQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBgaW52YWxpZEJ1Y2tldGAvZXZlbnQgYm9va2tlZXBpbmcgYmVmb3JlaGFuZC5cbiAgICAgIGNvbnN0IGhhbmRsZVRpbWVvdXQgPSBhc3luYyAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zLCBlcnJvcjogRXJyb3IpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCB0byAke3VybH0gdGltZWQgb3V0IGFuZCBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCk7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHRpbWVkIG91dCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgdG8gJHt1cmx9IHRpbWVkIG91dCBhZnRlciAke3Jlc3QucmVxdWVzdFRpbWVvdXR9bXMsIHJldHJ5aW5nLmAsIGVycm9yKTtcbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH07XG5cbiAgICAgIGlmIChwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF07XG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRob3JpemF0aW9uU2NoZW1lfSB0b2tlbmhlcmVgO1xuICAgICAgfVxuXG4gICAgICAvLyBHaXZlIHRoaXMgYXR0ZW1wdCBhIGhhcmQgZGVhZGxpbmUuIGBBYm9ydFNpZ25hbC50aW1lb3V0YCBhYm9ydHMgdGhlIGZldGNoIChhbmQgYW55IGluLXByb2dyZXNzIGJvZHlcbiAgICAgIC8vIHJlYWQpIG9uY2UgaXQgZmlyZXMsIHdoaWNoIG1ha2VzIHRoZSBhd2FpdGVkIGZldGNoIHJlamVjdCBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW4gbmV2ZXIga2VlcCB0aGlzXG4gICAgICAvLyBxdWV1ZSdzIGBwcm9jZXNzUGVuZGluZ2AgbG9vcCAoYW5kIHRoZXJlZm9yZSB0aGUgd2hvbGUgcXVldWUpIHdlZGdlZCBmb3JldmVyLiBPbWl0dGVkIHdoZW4gZGlzYWJsZWQuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7IC4uLnBheWxvYWQsIHNpZ25hbDogcmVzdC5yZXF1ZXN0VGltZW91dCA+IDAgPyBBYm9ydFNpZ25hbC50aW1lb3V0KHJlc3QucmVxdWVzdFRpbWVvdXQpIDogdW5kZWZpbmVkIH0pO1xuICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBzZW5kaW5nIHJlcXVlc3QgdG8gJHt1cmx9YCwgJ3dpdGggcGF5bG9hZDonLCB7IC4uLnBheWxvYWQsIGhlYWRlcnM6IGxvZ2dpbmdIZWFkZXJzIH0pO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5ldmVudHMucmVxdWVzdEVycm9yKHJlcXVlc3QsIGVycm9yLCB7IGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5IH0pO1xuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYXMgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFRoZSBhdHRlbXB0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAgYW5kIHdhcyBhYm9ydGVkLiBUcmVhdCBpdCBsaWtlIGEgdHJhbnNpZW50IGZhaWx1cmUgYW5kIHJldHJ5XG4gICAgICAgIC8vIGl0IHRocm91Z2ggdGhlIHF1ZXVlLCBzbyBhIHNpbmdsZSBzdGFsbGVkIGNvbm5lY3Rpb24gZG9lc24ndCBwZXJtYW5lbnRseSBmYWlsIHRoZSByZXF1ZXN0LlxuICAgICAgICBpZiAoaXNUaW1lb3V0RXJyb3IoZXJyb3IpKSByZXR1cm4gYXdhaXQgaGFuZGxlVGltZW91dChvcHRpb25zLCBlcnJvcik7XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2ggdG8gJHt1cmx9IGZhaWxlZC5gLCBlcnJvcik7XG4gICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgZXJyb3I6ICdQb3NzaWJsZSBuZXR3b3JrIG9yIHJlcXVlc3Qgc2hhcGUgaXNzdWUgb2NjdXJyZWQuIElmIHRoaXMgaXMgcmFyZSwgaXRzIGEgbmV0d29yayBnbGl0Y2guIElmIGl0IG9jY3VycyBhIGxvdCBzb21ldGhpbmcgaXMgd3JvbmcuJyxcbiAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCwgdGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWQgaW4gdGhlIGNhdGNoIGJsb2NrIGFib3ZlXG4gICAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuXG4gICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlc3BvbnNlLmpzb24oKSA6IHJlc3BvbnNlLnRleHQoKSkuY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlLCB7XG4gICAgICAgIHJlcXVlc3RCb2R5OiBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uYm9keSxcbiAgICAgICAgcmVzcG9uc2VCb2R5OiBib2R5LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE1hcmsgcmVxdWVzdCBhcyBjb21wbGV0ZWRcbiAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoUkFURV9MSU1JVF9TQ09QRV9IRUFERVIpID09PSAnc2hhcmVkJyk7XG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMucm91dGUsIG9wdGlvbnMubWV0aG9kKSwgcmVzcG9uc2UuaGVhZGVycywgcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pO1xuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZDtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IEh0dHBSZXNwb25zZUNvZGUuU3VjY2VzcyB8fCByZXNwb25zZS5zdGF0dXMgPj0gSHR0cFJlc3BvbnNlQ29kZS5FcnJvcikge1xuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IEh0dHBSZXNwb25zZUNvZGUuVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBib2R5IH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYCk7XG4gICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZCk7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpO1xuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIGEgcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50XG4gICAgICBvcHRpb25zLnJlc29sdmUoeyBvazogdHJ1ZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IHJlc3BvbnNlLnN0YXR1cyA9PT0gSHR0cFJlc3BvbnNlQ29kZS5Ob0NvbnRlbnQgPyB1bmRlZmluZWQgOiBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3Qgcm91dGVJbmZvcm1hdGlvbktleTogc3RyaW5nW10gPSBbbWV0aG9kXTtcblxuICAgICAgY29uc3QgcXVlcnlQYXJhbUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gcXVlcnlQYXJhbUluZGV4ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVBhcmFtSW5kZXgpIDogdXJsO1xuXG4gICAgICAvLyBTaW5jZSB0aGUgdXJscyBzdGFydCB3aXRoIC8gdGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgZW1wdHlcbiAgICAgIGNvbnN0IHNwbGl0dGVkUm91dGUgPSByb3V0ZS5zcGxpdCgnLycpO1xuXG4gICAgICAvLyAxKSBTdHJpcCB0aGUgbWlub3IgcGFyYW1zXG4gICAgICAvLyAgICBUaGUgb25seSBtYWpvcnMgYXJlIGNoYW5uZWxzLCBndWlsZHMsIHdlYmhvb2tzIGFuZCB3ZWJob29rcyB3aXRoIHRoZWlyIHRva2VuXG5cbiAgICAgIGNvbnN0IHN0cmlwcGVkUm91dGUgPSBzcGxpdHRlZFJvdXRlXG4gICAgICAgIC5tYXAoKHBhcnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgIC8vIFdoaWxlIHBhcnNlSW50IHdpbGwgdHJ1bmNhdGUgdGhlIHNub3dmbGFrZSBpZCwgaXQgd2lsbCBzdGlsbCB0ZWxsIHVzIGlmIGl0IGlzIGEgbnVtYmVyXG4gICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VJbnQocGFydCwgMTApKTtcblxuICAgICAgICAgIGlmICghaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIC8vIFJlYWN0aW9ucyBlbW9qaSBuZWVkIHRvIGJlIHN0cmlwcGVkIGFzIGl0IGlzIGEgbWlub3IgcGFyYW1ldGVyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBhcnJheVtpbmRleCAtIDFdID09PSAncmVhY3Rpb25zJykgcmV0dXJuICd4JztcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHdlYmhvb2sgb3IgaWYgaXQgaXMgcGFydCBvZiB0aGUgcm91dGUsIGtlZXAgaXQgYXMgaXQgaXMgYSBtYWpvciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBvbiBhIGNoYW5uZWwgaWQsIGEgZ3VpbGQgaWQgb3IgYSB3ZWJob29rIGlkXG4gICAgICAgICAgY29uc3QgaXNNYWpvciA9IGluZGV4ID49IDEgJiYgKGFycmF5W2luZGV4IC0gMV0gPT09ICdjaGFubmVscycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ2d1aWxkcycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ3dlYmhvb2tzJyk7XG5cbiAgICAgICAgICBpZiAoaXNNYWpvcikgcmV0dXJuIHBhcnQ7XG5cbiAgICAgICAgICByZXR1cm4gJ3gnO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLycpO1xuXG4gICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goc3RyaXBwZWRSb3V0ZSk7XG5cbiAgICAgIC8vIDIpIEFjY291bnQgZm9yIGV4Y2VwdGlvbnNcbiAgICAgIC8vICAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgLy8gICAgLSBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZC9kaXNjb3JkLWFwaS1kb2NzL2lzc3Vlcy8xMjk1XG5cbiAgICAgIC8vIFRoZSAyIGV4Y2VwdGlvbnMgYXJlIGZvciBtZXNzYWdlIGRlbGV0ZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW4gdGhhdCByb3V0ZVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc3BsaXR0ZWRSb3V0ZS5sZW5ndGggPT09IDUgJiYgc3BsaXR0ZWRSb3V0ZVsxXSA9PT0gJ2NoYW5uZWxzJyAmJiBzdHJpcHBlZFJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHNwbGl0dGVkUm91dGVbNF07XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNub3dmbGFrZVRvVGltZXN0YW1wKG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wIDwgMTBfMDAwKSB7XG4gICAgICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKCdtZXNzYWdlLWRlbGV0ZS0xMHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkL2Rpc2NvcmQtYXBpLWRvY3MvaXNzdWVzLzEyOTVcbiAgICAgICAgLy8gMiB3ZWVrcyA9IDIgKiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCA9IDEyMDk2MDAwMDBcbiAgICAgICAgaWYgKG5vdyAtIHRpbWVzdGFtcCA+IDEyMDk2MDAwMDApIHtcbiAgICAgICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goJ21lc3NhZ2UtZGVsZXRlLTJ3Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlSW5mb3JtYXRpb25LZXkuam9pbignOicpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpO1xuXG4gICAgICBpZiAocmVxdWVzdC5ydW5UaHJvdWdoUXVldWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3QocmVxdWVzdCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWA7XG5cbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gKTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KTtcblxuICAgICAgICAvLyBTYXZlIHF1ZXVlXG4gICAgICAgIHJlc3QucXVldWVzLnNldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YCwgYnVja2V0UXVldWUpO1xuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG5cbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgb3B0aW9ucyA/Pz0ge307XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID8/PSB7fTtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7cm91dGV9YDtcblxuICAgICAgICAvLyBSZXRyeSBvbiB0aW1lb3V0IHVwIHRvIGBtYXhSZXRyeUNvdW50YCwgbWlycm9yaW5nIHRoZSBxdWV1ZWQgYHNlbmRSZXF1ZXN0YCBwYXRoLCBzbyBhIHN0YWxsZWQgcHJveHlcbiAgICAgICAgLy8gY29ubmVjdGlvbiBkb2Vzbid0IHBlcm1hbmVudGx5IGZhaWwgdGhlIHJlcXVlc3QgKGFuZCBjYW4gbmV2ZXIgaGFuZyB0aGUgY2FsbGVyIGZvcmV2ZXIpLlxuICAgICAgICBmb3IgKGxldCByZXRyeUNvdW50ID0gMDsgOyByZXRyeUNvdW50KyspIHtcbiAgICAgICAgICAvLyBHaXZlIHRoZSByZXF1ZXN0IHRvIHRoZSBwcm94eSBhIGhhcmQgZGVhZGxpbmUgdG9vIHZpYSBgQWJvcnRTaWduYWwudGltZW91dGAgKG9taXR0ZWQgd2hlbiBkaXNhYmxlZCkuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgLi4ucmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpLFxuICAgICAgICAgICAgc2lnbmFsOiByZXN0LnJlcXVlc3RUaW1lb3V0ID4gMCA/IEFib3J0U2lnbmFsLnRpbWVvdXQocmVzdC5yZXF1ZXN0VGltZW91dCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgICAgICBib2R5OiBvcHRpb25zPy5ib2R5LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdCkuY2F0Y2goKGZldGNoRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlc3QuZXZlbnRzLnJlcXVlc3RFcnJvcihyZXF1ZXN0LCBmZXRjaEVycm9yLCB7IGJvZHk6IG9wdGlvbnM/LmJvZHkgfSk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBhdHRlbXB0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAgYW5kIHdhcyBhYm9ydGVkOyByZXRyeSBpdCB1bnRpbCB0aGUgYnVkZ2V0IGlzIGV4aGF1c3RlZC5cbiAgICAgICAgICAgIGlmIChpc1RpbWVvdXRFcnJvcihmZXRjaEVycm9yKSAmJiByZXRyeUNvdW50IDwgcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IHRvIHByb3h5ICR7dXJsfSB0aW1lZCBvdXQgYWZ0ZXIgJHtyZXN0LnJlcXVlc3RUaW1lb3V0fW1zLCByZXRyeWluZy5gLCBmZXRjaEVycm9yKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIElmIHJlc3VsdCBpcyB1bmRlZmluZWQsIHRoZSBhdHRlbXB0IHRpbWVkIG91dCBhbmQgaXMgYmVpbmcgcmV0cmllZC5cbiAgICAgICAgICBpZiAoIXJlc3VsdCkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAocmVzdWx0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpID8gcmVzdWx0Lmpzb24oKSA6IHJlc3VsdC50ZXh0KCkpLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgICAgcmVzdC5ldmVudHMucmVzcG9uc2UocmVxdWVzdCwgcmVzdWx0LCB7XG4gICAgICAgICAgICByZXF1ZXN0Qm9keTogb3B0aW9ucz8uYm9keSxcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keTogYm9keSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCB7XG4gICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQuc3RhdHVzICE9PSAyMDQgPyAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShib2R5KSA6IGJvZHkpIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcmVxdWVzdEJvZHlPcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyAocGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/IChkYXRhLmJvZHkgYXMgUGFyYW1ldGVyczx0eXBlb2YgcmVzb2x2ZT5bMF0pIDogdW5kZWZpbmVkISk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBlcnJvclRleHQ6IHN0cmluZztcblxuICAgICAgICAgICAgc3dpdGNoIChyZWFzb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiVGhlIG9wdGlvbnMgd2FzIGltcHJvcGVybHkgZm9ybWF0dGVkLCBvciB0aGUgc2VydmVyIGNvdWxkbid0IHVuZGVyc3RhbmQgaXQuXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgd2FzIG1pc3Npbmcgb3IgaW52YWxpZC4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQwMzpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEF1dGhvcml6YXRpb24gdG9rZW4geW91IHBhc3NlZCBkaWQgbm90IGhhdmUgcGVybWlzc2lvbiB0byB0aGUgcmVzb3VyY2UuJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0LlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQwNTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEhUVFAgbWV0aG9kIHVzZWQgaXMgbm90IHZhbGlkIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDI5OlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiWW91J3JlIGJlaW5nIHJhdGVsaW1pdGVkLlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDUwMjpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlcmUgd2FzIG5vdCBhIGdhdGV3YXkgYXZhaWxhYmxlIHRvIHByb2Nlc3MgeW91ciBvcHRpb25zLiBXYWl0IGEgYml0IGFuZCByZXRyeS4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IHJlYXNvbi5zdGF0dXNUZXh0ID8/ICdVbmtub3duIGVycm9yJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbJHtyZWFzb24uc3RhdHVzfV0gJHtlcnJvclRleHR9YDtcblxuICAgICAgICAgICAgLy8gSWYgZGlzY29yZCBzZW50IHVzIEpTT04sIGl0IGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuZCBhZGQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdG8gdGhlIGVycm9yIG1lc3NhZ2UsIHRoZSBmdWxsIGJvZHkgd2lsbCBiZSBpbiB0aGUgZXJyb3IuY2F1c2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL3JlZmVyZW5jZSNlcnJvci1tZXNzYWdlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFzb24uYm9keSA9PT0gJ29iamVjdCcgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdjb2RlJykgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuRGlzY29yZCBlcnJvcjogWyR7cmVhc29uLmJvZHkuY29kZX1dICR7cmVhc29uLmJvZHkubWVzc2FnZX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCByZWFzb24pO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1blRocm91Z2hRdWV1ZTogb3B0aW9ucz8ucnVuVGhyb3VnaFF1ZXVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pO1xuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9ucywgb3JkZXJlZCA9IGZhbHNlKSB7XG4gICAgICBpZiAoIW9yZGVyZWQpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVhY3Rpb25zLm1hcChhc3luYyAocmVhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlYWN0aW9uIG9mIHJlYWN0aW9ucykge1xuICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGREbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVFbW9qaShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9O1xuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGJvZHksIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWU7XG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlLmJsb2IsIG9wdGlvbnMuZmlsZS5uYW1lKTtcbiAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKTtcbiAgICAgIGZvcm0uYXBwZW5kKCdkZXNjcmlwdGlvbicsIG9wdGlvbnMuZGVzY3JpcHRpb24pO1xuICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLnRhZ3MpO1xuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCksIHsgYm9keTogZm9ybSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcywgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBib2R5ID0ge30sIHJlYXNvbikge1xuICAgICAgaWYgKCFib2R5LnRhcmdldFVzZXJzRmlsZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gd2UgaGF2ZSB0byB1cGxvYWQgYSBmaWxlLCB3ZSBuZWVkIHRvIHVzZSBGb3JtRGF0YSwgYW5kIGFsbCBvdGhlciBmaWVsZHMgbmVlZCB0byBiZSBwYXJ0IG9mIHRoZSBwYXlsb2FkX2pzb24gZmllbGQuXG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgIGZvcm0uYXBwZW5kKCdwYXlsb2FkX2pzb24nLCBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh7IC4uLmJvZHksIHRhcmdldFVzZXJzRmlsZTogdW5kZWZpbmVkIH0pKSk7XG4gICAgICBmb3JtLmFwcGVuZCgndGFyZ2V0X3VzZXJzX2ZpbGUnLCBib2R5LnRhcmdldFVzZXJzRmlsZSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCB7IGJvZHk6IGZvcm0sIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRSb2xlTWVtYmVyQ291bnRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyQ291bnRzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2UoYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZXMoKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICBhdmF0YXI6IG9wdGlvbnMuYXZhdGFyID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucy5hdmF0YXIpIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWwoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBcHBsaWNhdGlvbkVtb2ppKGlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnZpdGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCB7IHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGFyZ2V0VXNlcnMoaW52aXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHN0cmluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZVRhcmdldFVzZXJzKGludml0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVGFyZ2V0VXNlcnMoaW52aXRlQ29kZSwgdGFyZ2V0VXNlcnNGaWxlKSB7XG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtLmFwcGVuZCgndGFyZ2V0X3VzZXJzX2ZpbGUnLCB0YXJnZXRVc2Vyc0ZpbGUpO1xuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlVGFyZ2V0VXNlcnMoaW52aXRlQ29kZSksIHsgYm9keTogZm9ybSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGFyZ2V0VXNlcnNKb2JTdGF0dXMoaW52aXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUYXJnZXRVc2Vyc0pvYlN0YXR1cz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZVRhcmdldFVzZXJzSm9iU3RhdHVzKGludml0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3duUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbik7XG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmFsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKTtcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pO1xuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkw7XG4gICAgICBjb25zdCBiYW5uZXIgPSBvcHRpb25zPy5ib3RCYW5uZXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RCYW5uZXJVUkwpIDogb3B0aW9ucz8uYm90QmFubmVyVVJMO1xuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdXNlcm5hbWU6IG9wdGlvbnMudXNlcm5hbWU/LnRyaW0oKSxcbiAgICAgICAgICBhdmF0YXIsXG4gICAgICAgICAgYmFubmVyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25FbW9qaShpZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIGJvZHk6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgcmVxdWVzdFRvU3BlYWtUaW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICAgID8gbmV3IERhdGUob3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGVQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCB0b3BpYywgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyBib2R5OiB7IHRvcGljIH0sIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWxjb21lU2NyZWVuKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdpZGdldFNldHRpbmdzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBmb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgd2ViaG9va0NoYW5uZWxJZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWU7XG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge307XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuYXBwbGljYXRpb24oKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkluZm8oYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbigpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmN1cnJlbnRBdXRob3JpemF0aW9uKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhjaGFuZ2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApO1xuXG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChib2R5LmdyYW50VHlwZSA9PT0gJ2NsaWVudF9jcmVkZW50aWFscycpIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuYm9keS5zY29wZSA9IGJvZHkuc2NvcGUuam9pbignICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlPihyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5FeGNoYW5nZSgpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJldm9rZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YCk7XG5cbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5SZXZva2UoKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5yZWdpb25zKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW4oZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keTogeyByZWNpcGllbnRJZDogdXNlcklkIH0sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3JvdXBEbUNoYW5uZWwoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBlbW9qaUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamkoZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGVtb2ppSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamlzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRFbW9qaVtdIH0+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQsIG9wdGlvbnM/LndpdGhMb2NhbGl6YXRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCwgb3B0aW9ucy5jb3VudHMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRzKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBtYWtlUmVxdWVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFBhcnRpYWw8RGlzY29yZEd1aWxkPltdPihyZXN0LnJvdXRlcy5ndWlsZHMudXNlckd1aWxkcyhvcHRpb25zKSwgbWFrZVJlcXVlc3RPcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIG9wdGlvbnM/LndpdGhMb2NhbGl6YXRpb25zKSxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlW10+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrPihyZXN0LnJvdXRlcy5zdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2tzKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wdWJsaWMoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZShndWlsZElkLCByb2xlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2F0ZXdheUJvdCgpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3duVm9pY2VTdGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5nZXRVc2VyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckNvbm5lY3Rpb25zKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENvbm5lY3Rpb25bXT4ocmVzdC5yb3V0ZXMub2F1dGgyLmNvbm5lY3Rpb25zKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWb2ljZVJlZ2lvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMucmVnaW9ucyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXQ+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXRKc29uKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmxlYXZlKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVEbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMsIHBhcmFtcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx2b2lkIHwgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiwgcGFyYW1zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5kYXRhPy5maWxlcyxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBvbGxBbnN3ZXJWb3RlcnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLnZvdGVzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbmRQb2xsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy5leHBpcmUoY2hhbm5lbElkLCBtZXNzYWdlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa0Jhbk1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRCdWxrQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5idWxrQmFuKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMsIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEN1cnJlbnRNZW1iZXIoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQWN0aXZpdHlJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUd1aWxkSW5jaWRlbnRBY3Rpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkSW5jaWRlbnRzRGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmluY2lkZW50QWN0aW9ucyhndWlsZElkKSwgeyBib2R5OiBvcHRpb25zIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnR5cGluZyhjaGFubmVsSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH07XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH07XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkR3VpbGRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVUZXN0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnRbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjb25zdW1lRW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5jb25zdW1lRW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0U2t1cyhhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNrdVtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc2t1cyhhcHBsaWNhdGlvbklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbltdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9ucyhza3VJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdWJzY3JpcHRpb24oc2t1SWQsIHN1YnNjcmlwdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN1YnNjcmlwdGlvbj4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLnN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFNvdW5kYm9hcmRTb3VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLnNlbmRTb3VuZChjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTb3VuZGJvYXJkU291bmRbXT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5saXN0RGVmYXVsdCgpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEd1aWxkU291bmRib2FyZFNvdW5kcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8eyBpdGVtczogRGlzY29yZFNvdW5kYm9hcmRTb3VuZFtdIH0+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZHMoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU291bmRib2FyZFNvdW5kPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzKGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YShhcHBsaWNhdGlvbklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZUFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YShhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUxvYmJ5KG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5jcmVhdGUoKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldExvYmJ5KGxvYmJ5SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5TG9iYnkobG9iYnlJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5sb2JieShsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUxvYmJ5KGxvYmJ5SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5sb2JieShsb2JieUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZE1lbWJlclRvTG9iYnkobG9iYnlJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZExvYmJ5TWVtYmVyPihyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXIobG9iYnlJZCwgdXNlcklkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZU1lbWJlckZyb21Mb2JieShsb2JieUlkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXIobG9iYnlJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5sZWF2ZShsb2JieUlkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaW5rQ2hhbm5lbFRvTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubGluayhsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bmxpbmtDaGFubmVsVG9Mb2JieShsb2JieUlkLCBiZWFyZXJUb2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5saW5rKGxvYmJ5SWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHByZWZlclNuYWtlQ2FzZShlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBjYW1lbGl6ZXIgPSBlbmFibGVkID8gKHg6IGFueSkgPT4geCA6IGNhbWVsaXplO1xuXG4gICAgICByZXN0LmdldCA9IGFzeW5jICh1cmwsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJlc3QucG9zdCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmVzdC5wYXRjaCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmVzdC5wdXQgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzdDtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiByZXN0O1xufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG5cbi8qKiBXaGV0aGVyIGFuIGVycm9yIGlzIHRoZSBgVGltZW91dEVycm9yYCB0aHJvd24gYnkgYEFib3J0U2lnbmFsLnRpbWVvdXQoKWAuICovXG5mdW5jdGlvbiBpc1RpbWVvdXRFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyb3IubmFtZSA9PT0gJ1RpbWVvdXRFcnJvcic7XG59XG4iXSwibmFtZXMiOlsiQnVmZmVyIiwiaW5zcGVjdCIsImNhbWVsaXplIiwiY2FtZWxUb1NuYWtlQ2FzZSIsIkRJU0NPUkRFTk9fVkVSU0lPTiIsImRlbGF5IiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJoYXNQcm9wZXJ0eSIsImxvZ2dlciIsInByb2Nlc3NSZWFjdGlvblN0cmluZyIsInNub3dmbGFrZVRvVGltZXN0YW1wIiwidXJsVG9CYXNlNjQiLCJjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCIsIlF1ZXVlIiwiY3JlYXRlUm91dGVzIiwiRElTQ09SRF9BUElfVkVSU0lPTiIsIkRJU0NPUkRfQVBJX1VSTCIsIkFVRElUX0xPR19SRUFTT05fSEVBREVSIiwiUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSIiwiUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIiLCJSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIiLCJSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIiLCJSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiIsIlJBVEVfTElNSVRfU0NPUEVfSEVBREVSIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJvcHRpb25zIiwiYXBwbGljYXRpb25JZCIsIkJpZ0ludCIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwicmVwbGFjZSIsImJhc2VFcnJvclByb3RvdHlwZSIsImN1c3RvbSIsIl9kZXB0aCIsIl9pbnNwZWN0IiwiZGVwdGgiLCJJbmZpbml0eSIsImN1c3RvbUluc3BlY3QiLCJyZXN0IiwiYXV0aG9yaXphdGlvbiIsImF1dGhvcml6YXRpb25IZWFkZXIiLCJkZWxldGVRdWV1ZURlbGF5IiwiZ2xvYmFsbHlSYXRlTGltaXRlZCIsImludmFsaWRCdWNrZXQiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwidXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCIsIm1heFJldHJ5Q291bnQiLCJyZXF1ZXN0VGltZW91dCIsInByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzIiwicXVldWVzIiwiTWFwIiwicmF0ZUxpbWl0ZWRQYXRocyIsInZlcnNpb24iLCJldmVudHMiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJyZXF1ZXN0RXJyb3IiLCJyb3V0ZXMiLCJjcmVhdGVCYXNlSGVhZGVycyIsImNoZWNrUmF0ZUxpbWl0cyIsInVybCIsImlkZW50aWZpZXIiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsIkRhdGUiLCJyZXNldFRpbWVzdGFtcCIsInVwZGF0ZVRva2VuUXVldWVzIiwib2xkVG9rZW4iLCJuZXdUb2tlbiIsIkVycm9yIiwiaGVhZGVycyIsInVuZGVmaW5lZCIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXdJZGVudGlmaWVyIiwia2V5IiwicXVldWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwibmV3S2V5IiwibmV3UXVldWUiLCJ3YWl0aW5nIiwidW5zaGlmdCIsInBlbmRpbmciLCJjbGVhbnVwIiwic2V0IiwicmF0ZWxpbWl0UGF0aCIsImJ1Y2tldElkIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsIm5ld09iaiIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluY2x1ZGVzIiwibmFtZV9sb2NhbGl6YXRpb25zIiwiZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyIsInRvU3RyaW5nIiwiY3JlYXRlUmVxdWVzdEJvZHkiLCJ1bmF1dGhvcml6ZWQiLCJyZWFzb24iLCJlbmNvZGVVUklDb21wb25lbnQiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImZvcm1Cb2R5IiwiZGlzY29yZEJvZHkiLCJwcm9wIiwicHVzaCIsImpvaW4iLCJhc3NpZ24iLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImhhbmRsZVRpbWVvdXQiLCJlcnJvciIsInJldHJ5Q291bnQiLCJkZWJ1ZyIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwiZXJyb3JPYmplY3QiLCJyZXRyeVJlcXVlc3QiLCJsb2dnaW5nSGVhZGVycyIsImF1dGhvcml6YXRpb25TY2hlbWUiLCJzcGxpdCIsIlJlcXVlc3QiLCJzaWduYWwiLCJBYm9ydFNpZ25hbCIsInRpbWVvdXQiLCJjYXRjaCIsImlzVGltZW91dEVycm9yIiwic3RhdHVzVGV4dCIsImpzb24iLCJ0ZXh0IiwicmVxdWVzdEJvZHkiLCJyZXNwb25zZUJvZHkiLCJzaW1wbGlmeVVybCIsInJlc2V0QWZ0ZXIiLCJyZXNvbHZlIiwicm91dGVJbmZvcm1hdGlvbktleSIsInF1ZXJ5UGFyYW1JbmRleCIsImluZGV4T2YiLCJzbGljZSIsInNwbGl0dGVkUm91dGUiLCJzdHJpcHBlZFJvdXRlIiwicGFydCIsImluZGV4IiwiYXJyYXkiLCJpc051bWJlciIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJpc01ham9yIiwiZW5kc1dpdGgiLCJtZXNzYWdlSWQiLCJ0aW1lc3RhbXAiLCJwcm9jZXNzUmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJyZXN1bHQiLCJmZXRjaEVycm9yIiwiY2F1c2UiLCJjcmVhdGUiLCJwYXJzZSIsIlByb21pc2UiLCJkYXRhIiwiZXJyb3JUZXh0IiwibWVzc2FnZSIsImNvZGUiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJhZGRSZWFjdGlvbiIsImNoYW5uZWxJZCIsInJlYWN0aW9uIiwiY2hhbm5lbHMiLCJyZWFjdGlvbnMiLCJib3QiLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWxsIiwiYWRkUm9sZSIsImd1aWxkSWQiLCJ1c2VySWQiLCJyb2xlSWQiLCJndWlsZHMiLCJyb2xlcyIsIm1lbWJlciIsImFkZFRocmVhZE1lbWJlciIsInRocmVhZHMiLCJ1c2VyIiwiYWRkRG1SZWNpcGllbnQiLCJkbVJlY2lwaWVudCIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiYXV0b21vZCIsInJ1bGVzIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiZW1vamlzIiwiY3JlYXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamlzIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwicmVzdE9wdGlvbnMiLCJiZWFyZXJUb2tlbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJjcmVhdGVHdWlsZFN0aWNrZXIiLCJmaWxlIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwic3RpY2tlcnMiLCJjcmVhdGVHdWlsZFRlbXBsYXRlIiwidGVtcGxhdGVzIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJmb3J1bSIsImNyZWF0ZUludml0ZSIsInRhcmdldFVzZXJzRmlsZSIsImludml0ZXMiLCJnZXRHdWlsZFJvbGVNZW1iZXJDb3VudHMiLCJtZW1iZXJDb3VudHMiLCJjcmVhdGVSb2xlIiwiY3JlYXRlU2NoZWR1bGVkRXZlbnQiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwic3RhZ2VzIiwiY3JlYXRlV2ViaG9vayIsIndlYmhvb2tzIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJydWxlSWQiLCJydWxlIiwiZGVsZXRlQ2hhbm5lbCIsImNoYW5uZWwiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwib3ZlcndyaXRlSWQiLCJvdmVyd3JpdGUiLCJkZWxldGVFbW9qaSIsImlkIiwiZW1vamkiLCJkZWxldGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsInJlc3BvbnNlcyIsImRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImNvbW1hbmRJZCIsImNvbW1hbmQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiZ3VpbGQiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImludGVncmF0aW9uSWQiLCJpbnRlZ3JhdGlvbiIsImRlbGV0ZUludml0ZSIsImludml0ZUNvZGUiLCJpbnZpdGUiLCJnZXRUYXJnZXRVc2VycyIsImludml0ZVRhcmdldFVzZXJzIiwidXBkYXRlVGFyZ2V0VXNlcnMiLCJnZXRUYXJnZXRVc2Vyc0pvYlN0YXR1cyIsImludml0ZVRhcmdldFVzZXJzSm9iU3RhdHVzIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsIm9yaWdpbmFsIiwiZGVsZXRlT3duUmVhY3Rpb24iLCJkZWxldGVSZWFjdGlvbnNBbGwiLCJkZWxldGVSZWFjdGlvbnNFbW9qaSIsImRlbGV0ZVJvbGUiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImV2ZW50SWQiLCJldmVudCIsImRlbGV0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZSIsImRlbGV0ZVVzZXJSZWFjdGlvbiIsImRlbGV0ZVdlYmhvb2siLCJ3ZWJob29rSWQiLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJ3ZWJob29rIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJiYW5uZXIiLCJib3RCYW5uZXJVUkwiLCJjdXJyZW50VXNlciIsInVzZXJuYW1lIiwidHJpbSIsImVkaXRDaGFubmVsIiwiZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJlZGl0RW1vamkiLCJlZGl0QXBwbGljYXRpb25FbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwid2l0aExvY2FsaXphdGlvbnMiLCJnZXRHdWlsZCIsImNvdW50cyIsImdldEd1aWxkcyIsIm1ha2VSZXF1ZXN0T3B0aW9ucyIsInVzZXJHdWlsZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkUHJldmlldyIsInByZXZpZXciLCJnZXRHdWlsZFRlbXBsYXRlIiwiZ2V0R3VpbGRUZW1wbGF0ZXMiLCJnZXRHdWlsZFdlYmhvb2tzIiwiZ2V0SW50ZWdyYXRpb25zIiwiaW50ZWdyYXRpb25zIiwiZ2V0SW52aXRlIiwiZ2V0SW52aXRlcyIsImdldE1lc3NhZ2UiLCJnZXRNZXNzYWdlcyIsImdldFN0aWNrZXJQYWNrIiwic3RpY2tlclBhY2tJZCIsInN0aWNrZXJQYWNrIiwiZ2V0U3RpY2tlclBhY2tzIiwic3RpY2tlclBhY2tzIiwiZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZ2V0Q2hhbm5lbFBpbnMiLCJtZXNzYWdlUGlucyIsImdldFBpbm5lZE1lc3NhZ2VzIiwicGlucyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJwcml2YXRlIiwiZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyIsImpvaW5lZCIsImdldFBydW5lQ291bnQiLCJwcnVuZSIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsInB1YmxpYyIsImdldFJvbGVzIiwiZ2V0Um9sZSIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldE93blZvaWNlU3RhdGUiLCJnZXRVc2VyVm9pY2VTdGF0ZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VXNlciIsImdldFRocmVhZE1lbWJlcnMiLCJnZXRSZWFjdGlvbnMiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwicGFyYW1zIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0UG9sbEFuc3dlclZvdGVycyIsImFuc3dlcklkIiwicG9sbHMiLCJ2b3RlcyIsImVuZFBvbGwiLCJleHBpcmUiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImJ1bGtCYW5NZW1iZXJzIiwiYnVsa0JhbiIsImVkaXRDdXJyZW50TWVtYmVyIiwiZWRpdE1lbWJlciIsImdldEN1cnJlbnRNZW1iZXIiLCJjdXJyZW50TWVtYmVyIiwiZ2V0TWVtYmVyIiwiZ2V0TWVtYmVycyIsImdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImluc3RhbmNlSWQiLCJhcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UiLCJraWNrTWVtYmVyIiwicGluTWVzc2FnZSIsIm1lc3NhZ2VQaW4iLCJwcnVuZU1lbWJlcnMiLCJzZWFyY2hNZW1iZXJzIiwicXVlcnkiLCJzZWFyY2giLCJnZXRHdWlsZE9uYm9hcmRpbmciLCJvbmJvYXJkaW5nIiwiZWRpdEd1aWxkT25ib2FyZGluZyIsIm1vZGlmeUd1aWxkSW5jaWRlbnRBY3Rpb25zIiwiaW5jaWRlbnRBY3Rpb25zIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidHlwaW5nIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsImFkZEd1aWxkTWVtYmVyIiwiY3JlYXRlVGVzdEVudGl0bGVtZW50IiwibW9uZXRpemF0aW9uIiwiZW50aXRsZW1lbnRzIiwibGlzdEVudGl0bGVtZW50cyIsImdldEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwibGlzdFN1YnNjcmlwdGlvbnMiLCJza3VJZCIsInN1YnNjcmlwdGlvbnMiLCJnZXRTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25JZCIsInN1YnNjcmlwdGlvbiIsInNlbmRTb3VuZGJvYXJkU291bmQiLCJzb3VuZGJvYXJkIiwic2VuZFNvdW5kIiwibGlzdERlZmF1bHRTb3VuZGJvYXJkU291bmRzIiwibGlzdERlZmF1bHQiLCJsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRTb3VuZHMiLCJnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kSWQiLCJndWlsZFNvdW5kIiwiY3JlYXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZCIsImRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kIiwibGlzdEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25zTWV0YWRhdGFSZWNvcmRzIiwiYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhIiwidXBkYXRlQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMiLCJjcmVhdGVMb2JieSIsImxvYmJ5IiwiZ2V0TG9iYnkiLCJsb2JieUlkIiwibW9kaWZ5TG9iYnkiLCJkZWxldGVMb2JieSIsImFkZE1lbWJlclRvTG9iYnkiLCJyZW1vdmVNZW1iZXJGcm9tTG9iYnkiLCJsZWF2ZUxvYmJ5IiwibGlua0NoYW5uZWxUb0xvYmJ5IiwibGluayIsInVubGlua0NoYW5uZWxUb0xvYmJ5IiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIiwiRE9NRXhjZXB0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxNQUFNLFFBQVEsY0FBYztBQUNyQyxTQUE4QkMsT0FBTyxRQUFRLFlBQVk7QUE0RHpELFNBQ0VDLFFBQVEsRUFDUkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLEtBQUssRUFDTEMsaUJBQWlCLEVBQ2pCQyxXQUFXLEVBQ1hDLE1BQU0sRUFDTkMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLFdBQVcsUUFDTixvQkFBb0I7QUFDM0IsU0FBU0MsMEJBQTBCLFFBQVEscUJBQXFCO0FBQ2hFLFNBQVNDLEtBQUssUUFBUSxhQUFhO0FBQ25DLFNBQVNDLFlBQVksUUFBUSxjQUFjO0FBRzNDLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUc7QUFDdEMsT0FBTyxNQUFNQyxrQkFBa0IsMEJBQTBCO0FBRXpELE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFxQjtBQUM1RCxPQUFPLE1BQU1DLDhCQUE4Qix3QkFBd0I7QUFDbkUsT0FBTyxNQUFNQyxnQ0FBZ0MsMEJBQTBCO0FBQ3ZFLE9BQU8sTUFBTUMsMkJBQTJCLHFCQUFxQjtBQUM3RCxPQUFPLE1BQU1DLDJCQUEyQixxQkFBcUI7QUFDN0QsT0FBTyxNQUFNQywwQkFBMEIsb0JBQW9CO0FBQzNELE9BQU8sTUFBTUMsMEJBQTBCLG9CQUFvQjtBQUUzRCxPQUFPLFNBQVND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