sliftutils 1.7.129 → 1.7.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/misc/dist/ownIPs.ts.cache +30 -4
  2. package/misc/dist/strings.ts.cache +2 -2
  3. package/misc/https/dist/certs.ts.cache +2 -2
  4. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  5. package/misc/ownIPs.ts +29 -1
  6. package/package.json +1 -1
  7. package/security/authorizedKeys/daemon/dist/paths.ts.cache +3 -6
  8. package/security/authorizedKeys/daemon/dist/revocation.ts.cache +0 -0
  9. package/security/authorizedKeys/daemon/dist/state.ts.cache +5 -3
  10. package/security/authorizedKeys/daemon/paths.ts +0 -3
  11. package/security/authorizedKeys/daemon/revocation.ts +0 -0
  12. package/security/authorizedKeys/daemon/state.ts +4 -8
  13. package/security/authorizedKeys/dist/keysRepo.ts.cache +111 -0
  14. package/security/authorizedKeys/dist/secureSSH.ts.cache +147 -71
  15. package/security/authorizedKeys/dist/unrevoke.ts.cache +70 -51
  16. package/security/authorizedKeys/keysRepo.ts +111 -0
  17. package/security/authorizedKeys/secureSSH.ts +28 -38
  18. package/security/authorizedKeys/unrevoke.ts +9 -36
  19. package/security/machines/addMachine.ts +4 -3
  20. package/security/machines/dist/identity.ts.cache +2 -2
  21. package/security/machines/dist/machines.ts.cache +36 -94
  22. package/security/machines/machines.ts +39 -90
  23. package/security/machines/trustServer.ts +5 -3
  24. package/security/notifications/dist/remoteWebhook.ts.cache +78 -0
  25. package/security/notifications/dist/setupNotify.ts.cache +39 -0
  26. package/security/signedFiles/dist/signFiles.ts.cache +8 -10
  27. package/security/signedFiles/signFiles.ts +6 -10
  28. package/security/machines/trustState.ts +0 -53
@@ -11,7 +11,9 @@ const discord_1 = require("../notifications/discord");
11
11
  const authorizedKeys_1 = require("./authorizedKeys");
12
12
  const sources_1 = require("./sources");
13
13
  const revokeSource_1 = require("./revokeSource");
14
+ const sources_2 = require("./sources");
14
15
  const unrevoke_1 = require("./unrevoke");
16
+ const keysRepo_1 = require("./keysRepo");
15
17
  const paths_1 = require("../helpers/paths");
16
18
  const spawn_1 = require("../helpers/spawn");
17
19
  const remoteSSH_1 = require("../helpers/remoteSSH");
@@ -27,12 +29,16 @@ const ROOT_AUTHORIZED_KEYS = "/root/.ssh/authorized_keys";
27
29
  const SERVICE_NAME = "portsecure";
28
30
  const MAX_ERROR_BODY_LENGTH = 500;
29
31
  const VERBS = ["add", "remove", "list", "update"];
30
- // The repo url is optional, and defaults to the repo the command is run from.
32
+ // The host is optional, and without one everything happens on this machine. The repo url is
33
+ // optional too, and defaults to the repo the command is run from.
31
34
  const USAGE = `Usage:
32
- yarn securessh <host> add <repo-private-key> [repo-url]
33
- yarn securessh <host> remove [repo-url]
34
- yarn securessh <host> list
35
- yarn securessh <host> update`;
35
+ yarn securessh [host] add <repo-private-key> [repo-url]
36
+ yarn securessh [host] remove [repo-url]
37
+ yarn securessh [host] list
38
+ yarn securessh [host] update
39
+
40
+ With no host it acts on this machine, and still installs from github rather than from wherever
41
+ this was run.`;
36
42
  async function pathExists(filePath) {
37
43
  try {
38
44
  await promises_1.default.access(filePath);
@@ -114,6 +120,25 @@ async function fingerprintKeys(keys) {
114
120
  }
115
121
  return fingerprints;
116
122
  }
123
+ /** Where the daemon on that machine keeps its keys: the home of the user it runs as. Asked of the
124
+ machine itself, because the answer is not the same everywhere and certainly not the same as the
125
+ home of whoever is running this. */
126
+ async function daemonKeysDir(host) {
127
+ let result = await (0, remoteSSH_1.runOverSSH)({
128
+ host,
129
+ script: `${remoteSSH_1.SUDO_PREAMBLE}\n$SUDO getent passwd root | cut -d: -f6`,
130
+ });
131
+ let home = result.stdout.trim();
132
+ if (!home) {
133
+ throw new Error(`Expected ${(0, remoteSSH_1.describeHost)(host)} to report a home directory for root, it reported nothing`);
134
+ }
135
+ return `${home}/${sources_1.KEYS_DIR_NAME}`;
136
+ }
137
+ /** The public half of a private key, as ssh-keygen derives it. */
138
+ async function publicKeyOf(privateKeyPath) {
139
+ let result = await runLocal({ command: "ssh-keygen", args: ["-y", "-f", privateKeyPath] });
140
+ return `${result.stdout.trim()}\n`;
141
+ }
117
142
  async function cloneRepoForInspection(config) {
118
143
  let { repoURL, keyPath } = config;
119
144
  let temporaryDirectory = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "portsecure-repo-"));
@@ -121,35 +146,15 @@ async function cloneRepoForInspection(config) {
121
146
  await gitWithKey({ keyPath, args: ["clone", "--depth", "1", repoURL, repoPath] });
122
147
  return repoPath;
123
148
  }
124
- /** With no repo url given, the repo we are standing in is used. It has to actually hold keys
125
- before we hand it to a host, so a stray working directory cannot be deployed by accident. */
149
+ /** With no repo url given, the keys repo this machine resolves to is used - the one we are
150
+ standing in when that holds keys, and this machine's own otherwise. */
126
151
  async function resolveRepoURL(passedURL) {
127
152
  if (passedURL) {
128
153
  return normalizeRepoURL(passedURL);
129
154
  }
130
- let topLevel = await runLocal({ command: "git", args: ["rev-parse", "--show-toplevel"], allowFailure: true });
131
- if (topLevel.status !== 0) {
132
- throw new Error(`Expected a repo url, or the current directory to be inside a git repo, it is not.\n${USAGE}`);
133
- }
134
- let repoPath = topLevel.stdout.trim();
135
- try {
136
- await (0, authorizedKeys_1.readRepoKeys)(repoPath);
137
- }
138
- catch (e) {
139
- throw new Error(`Expected a repo url, or the current repo (${repoPath}) to hold keys, it does not.\n${e}\n${USAGE}`);
140
- }
141
- let origin = await runLocal({
142
- command: "git",
143
- args: ["remote", "get-url", "origin"],
144
- cwd: repoPath,
145
- allowFailure: true,
146
- });
147
- if (origin.status !== 0 || !origin.stdout.trim()) {
148
- throw new Error(`Expected the current repo (${repoPath}) to have an origin remote, it has none.`
149
- + ` The host clones the source itself, so a local path is no use to it.`);
150
- }
151
- let repoURL = normalizeRepoURL(origin.stdout.trim());
152
- console.log(`No repo url given, using the current repo: ${repoURL}`);
155
+ let { repoPath, sourceURL } = await (0, keysRepo_1.resolveKeysRepo)();
156
+ let repoURL = normalizeRepoURL(sourceURL);
157
+ console.log(`No repo url given, using ${repoPath}: ${repoURL}`);
153
158
  return repoURL;
154
159
  }
155
160
  /** Every source's revoke repo has to exist and hold at least one commit, or the hosts using it
@@ -164,7 +169,20 @@ async function ensureRevokeReposExist(repoSources) {
164
169
  let revokeURL = (0, revokeSource_1.revokeRepoURL)(repoURL);
165
170
  let temporaryDirectory = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "portsecure-revoke-"));
166
171
  let checkoutPath = path_1.default.join(temporaryDirectory, "repo");
167
- let clone = await runLocal({ command: "git", args: ["clone", revokeURL, checkoutPath], allowFailure: true });
172
+ // On a machine that is already a portsecure host, the source's deploy key is right there,
173
+ // and the key derived from it is the one credential that repo is guaranteed to accept.
174
+ // Anywhere else, a person is running this and has their own access.
175
+ let ownKey = "";
176
+ let localSourceKey = await (0, sources_1.findSourceKey)(repoURL);
177
+ if (localSourceKey) {
178
+ let derived = (0, revokeSource_1.deriveRevokeKey)(await promises_1.default.readFile(localSourceKey, "utf8"));
179
+ ownKey = path_1.default.join(temporaryDirectory, "key");
180
+ await promises_1.default.writeFile(ownKey, derived.privateKeyFile, { mode: 0o600 });
181
+ }
182
+ let cloneRevoke = async (allowFailure) => ownKey
183
+ && await gitWithKey({ keyPath: ownKey, args: ["clone", revokeURL, checkoutPath], allowFailure })
184
+ || await runLocal({ command: "git", args: ["clone", revokeURL, checkoutPath], allowFailure });
185
+ let clone = await cloneRevoke(true);
168
186
  if (clone.status !== 0) {
169
187
  await promises_1.default.rm(temporaryDirectory, { recursive: true, force: true });
170
188
  throw new Error(`Expected ${revokeURL} to exist, it does not, so ${repoURL} has nowhere to record a`
@@ -179,10 +197,16 @@ async function ensureRevokeReposExist(repoSources) {
179
197
  for (let args of [
180
198
  ["-C", checkoutPath, "add", "-A"],
181
199
  ["-C", checkoutPath, "-c", "user.email=portsecure@localhost", "-c", "user.name=portsecure", "commit", "-m", "initialise revoke repo"],
182
- ["-C", checkoutPath, "push", "origin", "HEAD"],
183
200
  ]) {
184
201
  await runLocal({ command: "git", args });
185
202
  }
203
+ let push = ["-C", checkoutPath, "push", "origin", "HEAD"];
204
+ if (ownKey) {
205
+ await gitWithKey({ keyPath: ownKey, args: push });
206
+ }
207
+ else {
208
+ await runLocal({ command: "git", args: push });
209
+ }
186
210
  }
187
211
  await promises_1.default.rm(temporaryDirectory, { recursive: true, force: true });
188
212
  console.log(`${revokeURL} is ready`);
@@ -269,7 +293,7 @@ async function installDaemon(config) {
269
293
  }
270
294
  // The checkout is brought to the latest commit rather than a copy being pushed, so what runs on
271
295
  // the host is exactly what is on github.
272
- console.log(`Updating ${REMOTE_CHECKOUT_PATH} on ${host}`);
296
+ console.log(`Updating ${REMOTE_CHECKOUT_PATH} on ${(0, remoteSSH_1.describeHost)(host)}`);
273
297
  await (0, remoteSSH_1.runOverSSH)({
274
298
  host,
275
299
  script: `${remoteSSH_1.SUDO_PREAMBLE}
@@ -345,7 +369,7 @@ async function requireRemoteWebhook(host) {
345
369
  if (!contents) {
346
370
  throw new Error(`Expected a Discord webhook at ${discord_1.DEFAULT_WEBHOOK_FILE_PATH} on ${host}, no such file exists.`
347
371
  + ` The daemon will not start without one.\n`
348
- + `Set it up first:\n yarn setupnotify ${host} <discord-webhook-url>`);
372
+ + `Set it up first:\n yarn setupnotify ${host} <discord-webhook-url>`.replace(" <discord", host && " <discord" || "<discord"));
349
373
  }
350
374
  return (0, discord_1.parseWebhookFile)({ contents, sourceName: `${host}:${discord_1.DEFAULT_WEBHOOK_FILE_PATH}` });
351
375
  }
@@ -363,24 +387,54 @@ async function addSource(config) {
363
387
  }
364
388
  let remoteConfig = await readRemoteConfig(host);
365
389
  if (remoteConfig.repoSources.includes(repoURL)) {
366
- console.log(`${host} already has ${repoURL}, refreshing its key and the daemon.`);
390
+ console.log(`${(0, remoteSSH_1.describeHost)(host)} already has ${repoURL}, refreshing its key and the daemon.`);
391
+ }
392
+ // Copied into place before anything else needs it. The checks below look this source's key up
393
+ // where the machine keeps it, not at the path it was handed on the command line, so a key that
394
+ // is still only sitting in the caller's directory reads as no key at all.
395
+ //
396
+ // Into the home of whoever the daemon runs as, which is where it looks. Asked of the host
397
+ // rather than worked out here: this may be running on a machine with no such user, and with a
398
+ // home directory in an entirely different shape.
399
+ let hostKeysDirectory = await daemonKeysDir(host);
400
+ await (0, remoteSSH_1.writeRemoteFile)({
401
+ host,
402
+ filePath: `${hostKeysDirectory}/${(0, sources_1.sourceName)(repoURL)}`,
403
+ contents: await promises_1.default.readFile(keyPath, "utf8"),
404
+ fileMode: "600",
405
+ directoryMode: "700",
406
+ });
407
+ // The public half too, so the deploy key that a repo was given can be looked up on the machine
408
+ // using it, rather than only in whatever github shows.
409
+ await (0, remoteSSH_1.writeRemoteFile)({
410
+ host,
411
+ filePath: `${hostKeysDirectory}/${(0, sources_1.sourceName)(repoURL)}.pub`,
412
+ contents: await publicKeyOf(keyPath),
413
+ fileMode: "644",
414
+ directoryMode: "700",
415
+ });
416
+ // The merged result is what root ends up with, so our own key has to be somewhere in it. On
417
+ // this machine there is no ssh session to preserve, so there is nothing to check.
418
+ let ourFingerprint = "";
419
+ if (host) {
420
+ console.log(`Checking our access to ${(0, remoteSSH_1.describeHost)(host)} survives the merged keys`);
421
+ ourFingerprint = await findAuthenticatingFingerprint(host);
367
422
  }
368
- // The merged result is what root ends up with, so our own key has to be somewhere in it.
369
- console.log(`Checking our access to ${host} survives the merged keys`);
370
- let ourFingerprint = await findAuthenticatingFingerprint(host);
371
423
  let inspectionPath = await cloneRepoForInspection({ repoURL, keyPath });
372
424
  let newKeys = await (0, authorizedKeys_1.readRepoKeys)(inspectionPath);
373
425
  // Whatever is applied on the host came from the existing sources, so it stays in the merge.
374
426
  let existingKeys = (0, authorizedKeys_1.normalizeKeys)(await (0, remoteSSH_1.readRemoteFile)({ host, filePath: ROOT_AUTHORIZED_KEYS }) || "");
375
427
  let mergedFingerprints = await fingerprintKeys([...existingKeys, ...newKeys]);
376
- if (!mergedFingerprints.includes(ourFingerprint)) {
428
+ if (ourFingerprint && !mergedFingerprints.includes(ourFingerprint)) {
377
429
  throw new Error(`Expected the key we use for ${host} to be in the merged keys, it is not.\n`
378
430
  + `Ours: ${ourFingerprint}\n`
379
431
  + `Merged: ${mergedFingerprints.join("\n ") || "(none)"}\n`
380
432
  + `The daemon replaces root's authorized_keys with the merged sources, so this would`
381
433
  + ` lock you out of ${host}. Add your public key to ${repoURL} first.`);
382
434
  }
383
- console.log(`Our key ${ourFingerprint} is in the merged keys, access will survive.`);
435
+ if (ourFingerprint) {
436
+ console.log(`Our key ${ourFingerprint} is in the merged keys, access will survive.`);
437
+ }
384
438
  await ensureRevokeRepo({ keyPath, repoURL });
385
439
  // Deploying a repo that still holds a revoked key would hand it back to every machine.
386
440
  let revoked = await (0, unrevoke_1.revokedKeysInRepo)({ repoPath: inspectionPath, sourceURL: repoURL });
@@ -394,18 +448,11 @@ async function addSource(config) {
394
448
  + `\nDelete them from the repo, or run "yarn unrevoke" there to allow them again.`);
395
449
  }
396
450
  let webhookURL = await requireRemoteWebhook(host);
397
- console.log(`${host} notifies ${webhookURL}`);
398
- await (0, remoteSSH_1.writeRemoteFile)({
399
- host,
400
- filePath: (0, sources_1.sourceKeyPath)(repoURL),
401
- contents: await promises_1.default.readFile(keyPath, "utf8"),
402
- fileMode: "600",
403
- directoryMode: "700",
404
- });
451
+ console.log(`${(0, remoteSSH_1.describeHost)(host)} notifies ${webhookURL}`);
405
452
  let repoSources = remoteConfig.repoSources.filter(source => source !== repoURL);
406
453
  repoSources.push(repoURL);
407
454
  await installDaemon({ host, hostLabel: remoteConfig.hostLabel, repoSources });
408
- console.log(`${repoURL} added to ${host}. ${repoSources.length} source(s) now merged.`);
455
+ console.log(`${repoURL} added to ${(0, remoteSSH_1.describeHost)(host)}. ${repoSources.length} source(s) now merged.`);
409
456
  }
410
457
  async function removeSource(config) {
411
458
  let { host, repoURL } = config;
@@ -415,9 +462,10 @@ async function removeSource(config) {
415
462
  + `Configured:\n ${remoteConfig.repoSources.join("\n ") || "(none)"}`);
416
463
  }
417
464
  let repoSources = remoteConfig.repoSources.filter(source => source !== repoURL);
418
- if (repoSources.length) {
465
+ // On this machine there is no ssh session to preserve, so there is nothing to check.
466
+ if (repoSources.length && host) {
419
467
  // The keys left over are what root gets, so our own key has to be among them.
420
- console.log(`Checking our access to ${host} survives without ${repoURL}`);
468
+ console.log(`Checking our access to ${(0, remoteSSH_1.describeHost)(host)} survives without ${repoURL}`);
421
469
  let ourFingerprint = await findAuthenticatingFingerprint(host);
422
470
  let remainingKeys = [];
423
471
  for (let source of repoSources) {
@@ -439,11 +487,11 @@ async function removeSource(config) {
439
487
  await (0, remoteSSH_1.runOverSSH)({
440
488
  host,
441
489
  script: `${remoteSSH_1.SUDO_PREAMBLE}
442
- $SUDO rm -f "${(0, sources_1.sourceKeyPath)(repoURL)}"
490
+ $SUDO rm -f "${(0, sources_1.sourceKeyPath)(repoURL)}" "${(0, sources_1.sourceKeyPath)(repoURL)}.pub" "${(0, sources_2.legacySourceKeyPath)(repoURL)}"
443
491
  $SUDO rm -rf "${(0, sources_1.sourceRepoPath)(repoURL)}"`,
444
492
  });
445
493
  await installDaemon({ host, hostLabel: remoteConfig.hostLabel, repoSources });
446
- console.log(`${repoURL} removed from ${host}. ${repoSources.length} source(s) left.`);
494
+ console.log(`${repoURL} removed from ${(0, remoteSSH_1.describeHost)(host)}. ${repoSources.length} source(s) left.`);
447
495
  }
448
496
  /** Answers "who can log into this box, and which repo says so". The paths the daemon uses are
449
497
  left out on purpose, they are plumbing rather than something to act on. */
@@ -460,7 +508,7 @@ async function updateDaemon(host) {
460
508
  await requireRemoteWebhook(host);
461
509
  await ensureRevokeReposExist(repoSources);
462
510
  await installDaemon({ host, hostLabel: parsed.hostLabel || host, repoSources });
463
- console.log(`Updated the daemon on ${host}, and restarted it.`);
511
+ console.log(`Updated the daemon on ${(0, remoteSSH_1.describeHost)(host)}, and restarted it.`);
464
512
  console.log(`Its ${repoSources.length} key source(s) were left as they are, along with the keys and`);
465
513
  console.log(`signers it has already accepted. Only the daemon itself changed:`);
466
514
  for (let repoURL of repoSources) {
@@ -470,10 +518,10 @@ async function updateDaemon(host) {
470
518
  async function listSources(host) {
471
519
  let remoteConfig = await readRemoteConfig(host);
472
520
  if (!remoteConfig.repoSources.length) {
473
- console.log(`${host} has no key sources. root's authorized_keys is left exactly as it is.`);
521
+ console.log(`${(0, remoteSSH_1.describeHost)(host)} has no key sources. root's authorized_keys is left exactly as it is.`);
474
522
  return;
475
523
  }
476
- console.log(`${host} lets root log in with the keys from ${remoteConfig.repoSources.length} repo(s):`);
524
+ console.log(`${(0, remoteSSH_1.describeHost)(host)} lets root log in with the keys from ${remoteConfig.repoSources.length} repo(s):`);
477
525
  let merged = new Set();
478
526
  for (let repoURL of remoteConfig.repoSources) {
479
527
  let keys = await readRemoteSourceKeys({ host, repoURL });
@@ -503,37 +551,65 @@ function parseArgs(argv) {
503
551
  throw new Error(`Expected one of ${VERBS.join(", ")}, was ${verbs.join(" and ")}\n${USAGE}`);
504
552
  }
505
553
  let verb = verbs[0];
506
- let [host, ...rest] = argv.filter(arg => arg !== verb);
507
- if (!host) {
508
- throw new Error(`Expected a host, was nothing\n${USAGE}`);
554
+ let positional = argv.filter(arg => arg !== verb);
555
+ // A host, when there is one, comes first and is a bare name or address. Everything else that
556
+ // can appear here is a path or a repo url, and those all carry a slash, which is what tells
557
+ // them apart. So no host at all means this machine.
558
+ let host = remoteSSH_1.THIS_MACHINE;
559
+ if (positional.length && !/[\/~\\]/.test(positional[0])) {
560
+ host = positional[0];
561
+ positional = positional.slice(1);
562
+ }
563
+ // How many arguments each verb takes, checked here rather than where the verb is acted on, so
564
+ // that a command which was typed wrong says so before anything else is complained about.
565
+ if (verb === "list" && positional.length) {
566
+ throw new Error(`Expected nothing after list, was ${positional.length} argument(s)\n${USAGE}`);
567
+ }
568
+ if (verb === "update" && positional.length) {
569
+ throw new Error(`Expected nothing after update, was ${positional.length} argument(s)\n${USAGE}`);
570
+ }
571
+ if (verb === "add" && (!positional.length || positional.length > 2)) {
572
+ throw new Error(`Expected a private key and optionally a repo url, was ${positional.length} argument(s)\n${USAGE}`);
573
+ }
574
+ if (verb === "remove" && positional.length > 1) {
575
+ throw new Error(`Expected at most a repo url to remove, was ${positional.length} argument(s)\n${USAGE}`);
576
+ }
577
+ return { verb, host, rest: positional };
578
+ }
579
+ /** Everything here is root's: root's authorized_keys, root's keys directory, the sshd config, the
580
+ systemd unit. Run as anyone else it reads a different home and writes files the daemon will
581
+ never see, and it gets there several steps in rather than failing at the start. */
582
+ function requireRoot() {
583
+ var _a;
584
+ let uid = (_a = process.getuid) === null || _a === void 0 ? void 0 : _a.call(process);
585
+ if (uid !== 0) {
586
+ throw new Error(`Expected to be running as root, is uid ${uid !== null && uid !== void 0 ? uid : "unknown"}.\n`
587
+ + `Rerun this with sudo.`);
509
588
  }
510
- return { verb, host, rest };
511
589
  }
512
590
  async function main() {
591
+ // What was typed is checked before anything about this machine is. A command that does not
592
+ // make sense is worth saying so about whoever is running it, and being told to find sudo only
593
+ // to then be told the arguments were wrong is two trips for one mistake.
513
594
  let { verb, host, rest } = parseArgs(process.argv.slice(2));
595
+ // With a host, everything root-owned happens on that host through $SUDO over ssh, so being root here proves nothing and would block running this from a workstation.
596
+ if (host === remoteSSH_1.THIS_MACHINE) {
597
+ requireRoot();
598
+ }
514
599
  if (verb === "list") {
515
600
  await listSources(host);
516
601
  return;
517
602
  }
518
603
  if (verb === "update") {
519
- if (rest.length) {
520
- throw new Error(`Expected nothing after update, was ${rest.length} argument(s)\n${USAGE}`);
521
- }
522
604
  await updateDaemon(host);
523
605
  return;
524
606
  }
525
607
  if (verb === "add") {
526
- if (!rest.length || rest.length > 2) {
527
- throw new Error(`Expected a private key and optionally a repo url, was ${rest.length} argument(s)\n${USAGE}`);
528
- }
529
608
  await addSource({ host, keyPath: (0, paths_1.expandHome)(rest[0]), repoURL: await resolveRepoURL(rest[1]) });
530
609
  return;
531
610
  }
532
- if (rest.length > 1) {
533
- throw new Error(`Expected at most a repo url to remove, was ${rest.length} argument(s)\n${USAGE}`);
534
- }
535
611
  await removeSource({ host, repoURL: await resolveRepoURL(rest[0]) });
536
612
  }
537
613
  exports.main = main;
538
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHNEQUF1RjtBQUN2RixxREFBNkU7QUFDN0UsdUNBQTBEO0FBQzFELGlEQUFrRjtBQUNsRix5Q0FBK0M7QUFDL0MsNENBQThDO0FBQzlDLDRDQUFnRDtBQUNoRCxvREFBdUg7QUFFdkgsTUFBTSxjQUFjLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFDNUUsa0dBQWtHO0FBQ2xHLG1HQUFtRztBQUNuRyxnQkFBZ0I7QUFDaEIsTUFBTSxjQUFjLEdBQUcsNENBQTRDLENBQUM7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsNkJBQTZCLENBQUM7QUFDekQsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDbEMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCw4RUFBOEU7QUFDOUUsTUFBTSxLQUFLLEdBQUc7Ozs7K0JBSWlCLENBQUM7QUFFaEMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxNQUFNLGtCQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1QsT0FBTyxLQUFLLENBQUM7SUFDakIs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Q0FBQztRQUNoRyxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxJQUFJLENBQUMsTUFBTSxpQkFBaUIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBQ0QsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBekJELG9CQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBwYXJzZVdlYmhvb2tGaWxlIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplS2V5cywgcmVhZFJlcG9LZXlzLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgc291cmNlS2V5UGF0aCwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIFJFVk9LRV9LRVlfTEFCRUwsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IHJldm9rZWRLZXlzSW5SZXBvIH0gZnJvbSBcIi4vdW5yZXZva2VcIjtcbmltcG9ydCB7IGV4cGFuZEhvbWUgfSBmcm9tIFwiLi4vaGVscGVycy9wYXRoc1wiO1xuaW1wb3J0IHsgc3Bhd25Qcm9taXNlIH0gZnJvbSBcIi4uL2hlbHBlcnMvc3Bhd25cIjtcbmltcG9ydCB7IHJlYWRSZW1vdGVGaWxlLCByZW1vdGVDb21tYW5kRXhpc3RzLCBydW5PdmVyU1NILCBTVURPX1BSRUFNQkxFLCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcblxuY29uc3QgU0VSVklDRV9TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRhZW1vblwiLCBcInBvcnRzZWN1cmUuc2VydmljZVwiKTtcbi8vIFRoZSBkYWVtb24gcnVucyBmcm9tIGEgY2hlY2tvdXQgb2YgdGhpcyByZXBvIG9uIHRoZSBob3N0LCByYXRoZXIgdGhhbiBmcm9tIGEgY29weSB3ZSB1cGxvYWQsIHNvXG4vLyBhIGhvc3QgdXBkYXRlcyBpdHNlbGYgZnJvbSBnaXRodWIgdGhlIHNhbWUgd2F5IGFueXRoaW5nIGVsc2UgZG9lcy4gc2xpZnR1dGlscyBpcyBwdWJsaWMsIHNvIHRoaXNcbi8vIG5lZWRzIG5vIGtleS5cbmNvbnN0IFNMSUZUVVRJTFNfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3Qvc2xpZnR1dGlscy5naXRcIjtcbmNvbnN0IFJFTU9URV9DSEVDS09VVF9QQVRIID0gXCIvb3B0L3BvcnRzZWN1cmUvc2xpZnR1dGlsc1wiO1xuY29uc3QgUkVNT1RFX1NFUlZJQ0VfUEFUSCA9IFwiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9wb3J0c2VjdXJlLnNlcnZpY2VcIjtcbmNvbnN0IFJFTU9URV9DT05GSUdfUEFUSCA9IFwiL2V0Yy9wb3J0c2VjdXJlL2RhZW1vbi5qc29uXCI7XG5jb25zdCBST09UX0FVVEhPUklaRURfS0VZUyA9IFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIjtcbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IFwicG9ydHNlY3VyZVwiO1xuY29uc3QgTUFYX0VSUk9SX0JPRFlfTEVOR1RIID0gNTAwO1xuY29uc3QgVkVSQlMgPSBbXCJhZGRcIiwgXCJyZW1vdmVcIiwgXCJsaXN0XCIsIFwidXBkYXRlXCJdO1xuLy8gVGhlIHJlcG8gdXJsIGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gdGhlIHJlcG8gdGhlIGNvbW1hbmQgaXMgcnVuIGZyb20uXG5jb25zdCBVU0FHRSA9IGBVc2FnZTpcbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IGFkZCA8cmVwby1wcml2YXRlLWtleT4gW3JlcG8tdXJsXVxuICB5YXJuIHNlY3VyZXNzaCA8aG9zdD4gcmVtb3ZlIFtyZXBvLXVybF1cbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IGxpc3RcbiAgeWFybiBzZWN1cmVzc2ggPGhvc3Q+IHVwZGF0ZWA7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9jYWwoY29uZmlnOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgY29tbWFuZCwgYXJncywgY3dkLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZCwgYXJncywgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2NvbW1hbmR9IHRvIHJ1biwgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDAgJiYgIWFsbG93RmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBIHByaXZhdGUga2V5IGNhbm5vdCBhdXRoZW50aWNhdGUgYW4gaHR0cHMgcmVtb3RlLCBzbyBnaXRodWIgdXJscyBhcmUgY29udmVydGVkIHRvIHRoZSBzc2ggZm9ybVxuICAgIHRoZSBrZXkgY2FuIGFjdHVhbGx5IGJlIHVzZWQgd2l0aC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9VUkwocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IGh0dHBzTWF0Y2ggPSByZXBvVVJMLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylcXC8oLis/KSg/OlxcLmdpdCk/XFwvPyQvKTtcbiAgICBpZiAoIWh0dHBzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9VUkw7XG4gICAgfVxuICAgIGxldCBbLCBob3N0LCByZXBvUGF0aF0gPSBodHRwc01hdGNoO1xuICAgIHJldHVybiBgZ2l0QCR7aG9zdH06JHtyZXBvUGF0aH0uZ2l0YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2l0V2l0aEtleShjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIC8vIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyBrZXkgc2VsZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAgbGV0IHNzaENvbW1hbmQgPSBgc3NoIC1pICR7a2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5hcmdzXSwgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQXNrcyBzc2ggd2hpY2gga2V5IGl0IGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQgd2l0aC4gVGhpcyBpcyB0aGUga2V5IHRoYXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIGRhZW1vbiB0YWtpbmcgb3ZlciBhdXRob3JpemVkX2tleXMsIG90aGVyd2lzZSBhIGRlcGxveSBsb2NrcyB1cyBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJzc2hcIixcbiAgICAgICAgYXJnczogW1wiLXZcIiwgXCItb1wiLCBcIkJhdGNoTW9kZT15ZXNcIiwgXCItb1wiLCBcIkNvbm5lY3RUaW1lb3V0PTEwXCIsIGhvc3QsIFwidHJ1ZVwiXSxcbiAgICB9KTtcbiAgICBsZXQgdmVyYm9zZU91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgXCJcIjtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIHNzaCBpbnRvICR7aG9zdH0sIGZhaWxlZC4gJHt2ZXJib3NlT3V0cHV0LnNsaWNlKC1NQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBsZXQgYWNjZXB0ZWRNYXRjaCA9IHZlcmJvc2VPdXRwdXQubWF0Y2goL1NlcnZlciBhY2NlcHRzIGtleTouKj8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICBpZiAoIWFjY2VwdGVkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gYWNjZXB0IGEgcHVibGljIGtleSwgYnV0IHRoZSBzZXNzaW9uIGRpZCBub3QgYXV0aGVudGljYXRlIHdpdGggb25lLmBcbiAgICAgICAgICAgICsgYCBwb3J0c2VjdXJlIGRpc2FibGVzIHBhc3N3b3JkIGxvZ2luLCBzbyBrZXkgYmFzZWQgYWNjZXNzIGhhcyB0byB3b3JrIGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2VwdGVkTWF0Y2hbMV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50S2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1rZXlzLVwiKSk7XG4gICAgbGV0IGtleXNQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJhdXRob3JpemVkX2tleXNcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGtleXNQYXRoLCBgJHtrZXlzLmpvaW4oXCJcXG5cIil9XFxuYCk7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJzc2gta2V5Z2VuXCIsIGFyZ3M6IFtcIi1sZlwiLCBrZXlzUGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBsZXQgZmluZ2VycHJpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBmaW5nZXJwcmludHMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbmdlcnByaW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVSZXBvRm9ySW5zcGVjdGlvbihjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXBvLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJlcG9VUkwsIHJlcG9QYXRoXSB9KTtcbiAgICByZXR1cm4gcmVwb1BhdGg7XG59XG5cbi8qKiBXaXRoIG5vIHJlcG8gdXJsIGdpdmVuLCB0aGUgcmVwbyB3ZSBhcmUgc3RhbmRpbmcgaW4gaXMgdXNlZC4gSXQgaGFzIHRvIGFjdHVhbGx5IGhvbGQga2V5c1xuICAgIGJlZm9yZSB3ZSBoYW5kIGl0IHRvIGEgaG9zdCwgc28gYSBzdHJheSB3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGVwbG95ZWQgYnkgYWNjaWRlbnQuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1VSTChwYXNzZWRVUkw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwYXNzZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlcG9VUkwocGFzc2VkVVJMKTtcbiAgICB9XG4gICAgbGV0IHRvcExldmVsID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAodG9wTGV2ZWwuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSByZXBvIHVybCwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIGJlIGluc2lkZSBhIGdpdCByZXBvLCBpdCBpcyBub3QuXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHJlcG9QYXRoID0gdG9wTGV2ZWwuc3Rkb3V0LnRyaW0oKTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkUmVwb0tleXMocmVwb1BhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgcmVwbyB1cmwsIG9yIHRoZSBjdXJyZW50IHJlcG8gKCR7cmVwb1BhdGh9KSB0byBob2xkIGtleXMsIGl0IGRvZXMgbm90LlxcbiR7ZX1cXG4ke1VTQUdFfWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG9yaWdpbiA9IGF3YWl0IHJ1bkxvY2FsKHtcbiAgICAgICAgY29tbWFuZDogXCJnaXRcIixcbiAgICAgICAgYXJnczogW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSxcbiAgICAgICAgY3dkOiByZXBvUGF0aCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChvcmlnaW4uc3RhdHVzICE9PSAwIHx8ICFvcmlnaW4uc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdGhlIGN1cnJlbnQgcmVwbyAoJHtyZXBvUGF0aH0pIHRvIGhhdmUgYW4gb3JpZ2luIHJlbW90ZSwgaXQgaGFzIG5vbmUuYFxuICAgICAgICAgICAgKyBgIFRoZSBob3N0IGNsb25lcyB0aGUgc291cmNlIGl0c2VsZiwgc28gYSBsb2NhbCBwYXRoIGlzIG5vIHVzZSB0byBpdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvVVJMID0gbm9ybWFsaXplUmVwb1VSTChvcmlnaW4uc3Rkb3V0LnRyaW0oKSk7XG4gICAgY29uc29sZS5sb2coYE5vIHJlcG8gdXJsIGdpdmVuLCB1c2luZyB0aGUgY3VycmVudCByZXBvOiAke3JlcG9VUkx9YCk7XG4gICAgcmV0dXJuIHJlcG9VUkw7XG59XG5cbi8qKiBFdmVyeSBzb3VyY2UncyByZXZva2UgcmVwbyBoYXMgdG8gZXhpc3QgYW5kIGhvbGQgYXQgbGVhc3Qgb25lIGNvbW1pdCwgb3IgdGhlIGhvc3RzIHVzaW5nIGl0XG4gICAgY2Fubm90IHJlY29yZCBhIHJldm9jYXRpb24uIENoZWNrZWQgd2l0aCB0aGlzIG1hY2hpbmUncyBvd24gZ2l0IGNyZWRlbnRpYWxzLCBzaW5jZSB1cGRhdGUgaXNcbiAgICBub3QgZ2l2ZW4gYW55IGRlcGxveSBrZXksIGFuZCBhbiBlbXB0eSByZXBvIGlzIGluaXRpYWxpc2VkIHJhdGhlciB0aGFuIG1lcmVseSBjb21wbGFpbmVkIGFib3V0LlxuXG4gICAgQSBob3N0IHRoYXQgY2Fubm90IHdyaXRlIGEgcmV2b2NhdGlvbiBzaWxlbnRseSBrZWVwcyBhY2NlcHRpbmcgYSBrZXkgaXQganVzdCBzYXcgYmVpbmcgbWlzdXNlZCxcbiAgICB3aGljaCBpcyB0aGUgb25lIGZhaWx1cmUgdGhpcyB3aG9sZSB0aGluZyBleGlzdHMgdG8gcHJldmVudCwgc28gaXQgaXMgY2hlY2tlZCBvbiBldmVyeSBkZXBsb3lcbiAgICBhbmQgbm90IG9ubHkgd2hlbiBhIHNvdXJjZSBpcyBmaXJzdCBhZGRlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG9zRXhpc3QocmVwb1NvdXJjZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZXBvU291cmNlcykge1xuICAgICAgICBsZXQgcmV2b2tlVVJMID0gcmV2b2tlUmVwb1VSTChyZXBvVVJMKTtcbiAgICAgICAgbGV0IHRlbXBvcmFyeURpcmVjdG9yeSA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInBvcnRzZWN1cmUtcmV2b2tlLVwiKSk7XG4gICAgICAgIGxldCBjaGVja291dFBhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcInJlcG9cIik7XG4gICAgICAgIGxldCBjbG9uZSA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChjbG9uZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gZXhpc3QsIGl0IGRvZXMgbm90LCBzbyAke3JlcG9VUkx9IGhhcyBub3doZXJlIHRvIHJlY29yZCBhYFxuICAgICAgICAgICAgICAgICsgYCByZXZvY2F0aW9uLlxcbkNyZWF0ZSBpdCwgdGhlbiBydW4gXCJ5YXJuIHNlY3VyZXNzaCA8aG9zdD4gYWRkXCIgZm9yIHRoYXQgc291cmNlIHRvYFxuICAgICAgICAgICAgICAgICsgYCByZWdpc3RlciBpdHMgZGVwbG95IGtleS5cXG4keyhjbG9uZS5zdGRvdXQgKyBjbG9uZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhlYWQgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChoZWFkLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7cmV2b2tlVVJMfSBpcyBlbXB0eSwgZ2l2aW5nIGl0IGEgZmlyc3QgY29tbWl0YCk7XG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNoZWNrb3V0UGF0aCwgXCJSRUFETUUubWRcIiksXG4gICAgICAgICAgICAgICAgYCMgcmV2b2tlZCBrZXlzXFxuXFxuV3JpdHRlbiBieSBwb3J0c2VjdXJlLiBFYWNoIGZpbGUgdW5kZXIgcmV2b2NhdGlvbnMvIGlzIG9uZSBrZXkgdGhhdCB3YXMgdXNlZCBmcm9tIGFuXFxuYFxuICAgICAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgICAgIGZvciAobGV0IGFyZ3Mgb2YgW1xuICAgICAgICAgICAgICAgIFtcIi1DXCIsIGNoZWNrb3V0UGF0aCwgXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIFwiaW5pdGlhbGlzZSByZXZva2UgcmVwb1wiXSxcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHJlYWR5YCk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgYmUgd3JpdGFibGUgYmVmb3JlIGEgaG9zdCBpcyBzZXQgdXAsIGJlY2F1c2UgYSBob3N0IHRoYXRcbiAgICBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIGNhbm5vdCByZXZva2UgYSBrZXkgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiBUaGUga2V5IGZvciBpdCBpcyBkZXJpdmVkXG4gICAgZnJvbSB0aGUgc291cmNlJ3MsIHNpbmNlIGdpdGh1YiB3aWxsIG5vdCB0YWtlIG9uZSBwdWJsaWMga2V5IG9uIHR3byByZXBvcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG8oY29uZmlnOiB7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpKTtcblxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkZXJpdmVkS2V5UGF0aCwgZGVyaXZlZC5wcml2YXRlS2V5RmlsZSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuXG4gICAgbGV0IGV4cGxhaW4gPSAocHJvYmxlbTogc3RyaW5nKSA9PiBuZXcgRXJyb3IoXG4gICAgICAgIGAke3Byb2JsZW19XFxuYFxuICAgICAgICArIGBDcmVhdGUgJHtyZXZva2VVUkx9IGFuZCBhZGQgdGhpcyBhcyBhIGRlcGxveSBrZXkgV0lUSCBXUklURSBBQ0NFU1M6XFxuYFxuICAgICAgICArIGAgICR7ZGVyaXZlZC5wdWJsaWNLZXl9ICR7UkVWT0tFX0tFWV9MQUJFTH1cXG5gXG4gICAgICAgICsgYEl0IGhhcyB0byBiZSB0aGlzIGtleTogaXQgaXMgZGVyaXZlZCBmcm9tICR7a2V5UGF0aH0sIGFuZCBnaXRodWIgd2lsbCBub3QgYWNjZXB0IHRoZSBzYW1lYFxuICAgICAgICArIGAgcHVibGljIGtleSBvbiB0d28gcmVwb3NpdG9yaWVzLmBcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmV2b2tlVVJMfWApO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gYmUgcmVhZGFibGUgd2l0aCB0aGUgZGVyaXZlZCBrZXksIGl0IGlzIG5vdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbXB0eSByZXBvIGhhcyBubyBicmFuY2ggZm9yIHRoZSBkYWVtb24gdG8gY2xvbmUsIHNvIGl0IGdldHMgaXRzIGZpcnN0IGNvbW1pdCBoZXJlLiBUaGF0XG4gICAgLy8gZG91YmxlcyBhcyB0aGUgcHJvb2YgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gaXQuXG4gICAgbGV0IGhlYWQgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICBbXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgIFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJncywgY3dkOiBjaGVja291dFBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2ggPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IGNoZWNrb3V0UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIHRoZSBmaXJzdCBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRyeVJ1biA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIi0tZHJ5LXJ1blwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChkcnlSdW4uc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCB3cml0ZSBhY2Nlc3MgdG8gJHtyZXZva2VVUkx9LCBhIGRyeSBydW4gcHVzaCB3YXMgcmVmdXNlZC5cXG4keyhkcnlSdW4uc3Rkb3V0ICsgZHJ5UnVuLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHdyaXRhYmxlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVDb25maWcoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaG9zdExhYmVsOiBob3N0LCByZXBvU291cmNlczogW10gYXMgc3RyaW5nW10gfTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgcmV0dXJuIHsgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzOiBwYXJzZWQucmVwb1NvdXJjZXMgfHwgW10gfTtcbn1cblxuLyoqIFJlYWRzIHRoZSBrZXlzIGEgc291cmNlJ3MgY2hlY2tvdXQgY3VycmVudGx5IGhvbGRzIG9uIHRoZSBob3N0LCBzbyB0aGUgbWVyZ2VkIHJlc3VsdCBjYW4gYmVcbiAgICB3b3JrZWQgb3V0IHdpdGhvdXQgbmVlZGluZyB0aGF0IHNvdXJjZSdzIHByaXZhdGUga2V5IGxvY2FsbHkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUmVtb3RlU291cmNlS2V5cyhjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbmlmICRTVURPIHRlc3QgLWYgXCIke3JlcG9QYXRofS9hdXRob3JpemVkX2tleXNcIjsgdGhlblxuICAgICRTVURPIGNhdCBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiXG5lbGlmICRTVURPIHRlc3QgLWQgXCIke3JlcG9QYXRofVwiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH1cIi8qLnB1YiAyPi9kZXYvbnVsbCB8fCB0cnVlXG5maWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbm9ybWFsaXplS2V5cyhvdXRwdXQuc3Rkb3V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERhZW1vbihjb25maWc6IHsgaG9zdDogc3RyaW5nOyBob3N0TGFiZWw6IHN0cmluZzsgcmVwb1NvdXJjZXM6IHN0cmluZ1tdIH0pIHtcbiAgICBsZXQgeyBob3N0LCBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0gPSBjb25maWc7XG4gICAgZm9yIChsZXQgY29tbWFuZCBvZiBbXCJub2RlXCIsIFwiZ2l0XCIsIFwieWFyblwiXSkge1xuICAgICAgICBpZiAoIWF3YWl0IHJlbW90ZUNvbW1hbmRFeGlzdHMoeyBob3N0LCBjb21tYW5kIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gYmUgaW5zdGFsbGVkIG9uICR7aG9zdH0sIGl0IGlzIG5vdC4gSW5zdGFsbCBpdCBhbmQgcmVydW4uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY2hlY2tvdXQgaXMgYnJvdWdodCB0byB0aGUgbGF0ZXN0IGNvbW1pdCByYXRoZXIgdGhhbiBhIGNvcHkgYmVpbmcgcHVzaGVkLCBzbyB3aGF0IHJ1bnMgb25cbiAgICAvLyB0aGUgaG9zdCBpcyBleGFjdGx5IHdoYXQgaXMgb24gZ2l0aHViLlxuICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyAke1JFTU9URV9DSEVDS09VVF9QQVRIfSBvbiAke2hvc3R9YCk7XG4gICAgYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbnNldCAtZVxuJFNVRE8gbWtkaXIgLXAgXCIke3BhdGgucG9zaXguZGlybmFtZShSRU1PVEVfQ0hFQ0tPVVRfUEFUSCl9XCJcbmlmICRTVURPIHRlc3QgLWQgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfS8uZ2l0XCI7IHRoZW5cbiAgICAjIFN0YXNoZWQgZmlyc3QsIHRoZSB3YXkgbWFjaGluZS1hbHdheXN1cCBkb2VzIGl0LiBBbnl0aGluZyBzaXR0aW5nIG1vZGlmaWVkIGluIGEgaG9zdCdzXG4gICAgIyBjaGVja291dCBpcyBlaXRoZXIgYW4gYWNjaWRlbnQgb3Igc29tZWJvZHkgZWRpdGluZyB0aGUgZGFlbW9uIGluIHBsYWNlLCBhbmQgZWl0aGVyIHdheSBpdCBpc1xuICAgICMgd29ydGgga2VlcGluZyByYXRoZXIgdGhhbiBxdWlldGx5IGVyYXNpbmcuIFRoZSBpZGVudGl0eSBpcyBwYXNzZWQgaW5saW5lIGJlY2F1c2UgYSBob3N0IGhhc1xuICAgICMgbm8gZ2l0IGNvbmZpZyBvZiBpdHMgb3duIGFuZCBzdGFzaCB3cml0ZXMgYSBjb21taXQuXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiBhZGQgLS1hbGxcbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIC1jIHVzZXIuZW1haWw9cG9ydHNlY3VyZUBsb2NhbGhvc3QgLWMgdXNlci5uYW1lPXBvcnRzZWN1cmUgc3Rhc2hcbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGZldGNoIC0tcHJ1bmUgb3JpZ2luXG4gICAgIyBBIHN0YXNoIGFuZCBhIHB1bGwgY2Fubm90IGNyb3NzIGEgYnJhbmNoIHRoYXQgaGFzIGRpdmVyZ2VkLCBhbmQgYSBkcmlmdGVkIGNoZWNrb3V0IG11c3Qgbm90IGJlXG4gICAgIyBhYmxlIHRvIGxlYXZlIGEgaG9zdCBydW5uaW5nIG9sZCBjb2RlLCBzbyBpdCBpcyBwdXQgb24gdGhlIHJlbW90ZSdzIHN0YXRlIHJhdGhlciB0aGFuIG1lcmdlZFxuICAgICMgd2l0aCBpdC4gc2V0LWhlYWQgc28gdGhhdCBpcyB0aGUgcmVtb3RlJ3MgZGVmYXVsdCBicmFuY2ggbm93LCBub3QgdGhlIG9uZSBpdCBoYWQgYXQgY2xvbmUuXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiByZW1vdGUgc2V0LWhlYWQgb3JpZ2luIC0tYXV0b1xuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgcmVzZXQgLS1oYXJkIG9yaWdpbi9IRUFEXG5lbHNlXG4gICAgJFNVRE8gcm0gLXJmIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIlxuICAgICRTVURPIGdpdCBjbG9uZSBcIiR7U0xJRlRVVElMU19VUkx9XCIgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiXG5maVxuJFNVRE8geWFybiAtLWN3ZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgaW5zdGFsbCAtLXByb2R1Y3Rpb24gLS1ub24taW50ZXJhY3RpdmVcbiMgVGhlIHNpbmdsZSBmaWxlIGRhZW1vbiB0aGlzIHJlcGxhY2VkLCBsZWZ0IG92ZXIgb24gYSBob3N0IHNldCB1cCBieSBhbiBvbGRlciB2ZXJzaW9uLlxuJFNVRE8gcm0gLWYgL29wdC9wb3J0c2VjdXJlL3BvcnRzZWN1cmUtZGFlbW9uLmpzYCxcbiAgICB9KTtcbiAgICBhd2FpdCB3cml0ZVJlbW90ZUZpbGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRILFxuICAgICAgICAvLyBPbmx5IHdoYXQgZGlmZmVycyBiZXR3ZWVuIG1hY2hpbmVzLiBFdmVyeSBwYXRoIHRoZSBkYWVtb24gdXNlcyBpcyBkZXJpdmVkIGluIHRoZSBkYWVtb25cbiAgICAgICAgLy8gaXRzZWxmLCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgdG8gZHJpZnQgb3V0IG9mIHN5bmMuXG4gICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeSh7IGhvc3RMYWJlbCwgcmVwb1NvdXJjZXMgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIsXG4gICAgICAgIGZpbGVNb2RlOiBcIjYwMFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjcwMFwiLFxuICAgIH0pO1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBSRU1PVEVfU0VSVklDRV9QQVRILFxuICAgICAgICBjb250ZW50czogYXdhaXQgZnMucmVhZEZpbGUoU0VSVklDRV9TT1VSQ0UsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjQ0XCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzU1XCIsXG4gICAgfSk7XG4gICAgYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbnNldCAtZVxuJFNVRE8gc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWRcbiRTVURPIHN5c3RlbWN0bCBlbmFibGUgJHtTRVJWSUNFX05BTUV9XG4kU1VETyBzeXN0ZW1jdGwgcmVzdGFydCAke1NFUlZJQ0VfTkFNRX1gLFxuICAgIH0pO1xuXG4gICAgbGV0IHN0YXR1cyA9IChhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgc3lzdGVtY3RsIGlzLWFjdGl2ZSAke1NFUlZJQ0VfTkFNRX0gfHwgdHJ1ZWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAoc3RhdHVzICE9PSBcImFjdGl2ZVwiKSB7XG4gICAgICAgIGxldCBqb3VybmFsID0gKGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbiRTVURPIGpvdXJuYWxjdGwgLXUgJHtTRVJWSUNFX05BTUV9IC1uIDQwIC0tbm8tcGFnZXIgfHwgdHJ1ZWAsXG4gICAgICAgICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgICAgIH0pKS5zdGRvdXQ7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtTRVJWSUNFX05BTUV9IHRvIGJlIGFjdGl2ZSBvbiAke2hvc3R9LCB3YXMgJHtzdGF0dXN9LlxcbiR7am91cm5hbC5zbGljZSgtMjAwMCl9YCk7XG4gICAgfVxuXG4gICAgbGV0IHN0aWxsUmVhY2hhYmxlID0gYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogXCJlY2hvIHJlYWNoYWJsZVwiLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHN0aWxsUmVhY2hhYmxlLnN0ZG91dC50cmltKCkgIT09IFwicmVhY2hhYmxlXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gc3RpbGwgYmUgcmVhY2hhYmxlIGFmdGVyIHRoZSBkYWVtb24gc3RhcnRlZCwgaXQgaXMgbm90LmBcbiAgICAgICAgICAgICsgYCBDaGVjayBjb25zb2xlIGFjY2VzcyBpbW1lZGlhdGVseS5gXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgRGlzY29yZCB3ZWJob29rIGF0ICR7REVGQVVMVF9XRUJIT09LX0ZJTEVfUEFUSH0gb24gJHtob3N0fSwgbm8gc3VjaCBmaWxlIGV4aXN0cy5gXG4gICAgICAgICAgICArIGAgVGhlIGRhZW1vbiB3aWxsIG5vdCBzdGFydCB3aXRob3V0IG9uZS5cXG5gXG4gICAgICAgICAgICArIGBTZXQgaXQgdXAgZmlyc3Q6XFxuICB5YXJuIHNldHVwbm90aWZ5ICR7aG9zdH0gPGRpc2NvcmQtd2ViaG9vay11cmw+YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VXZWJob29rRmlsZSh7IGNvbnRlbnRzLCBzb3VyY2VOYW1lOiBgJHtob3N0fToke0RFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEh9YCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkU291cmNlKGNvbmZpZzogeyBob3N0OiBzdHJpbmc7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgaWYgKCFhd2FpdCBwYXRoRXhpc3RzKGtleVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhdCAke2tleVBhdGh9LCBubyBzdWNoIGZpbGUgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmVwb1VSTH0gaXMgcmVhY2hhYmxlIHdpdGggJHtrZXlQYXRofWApO1xuICAgIGxldCByZWFjaGFibGUgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aCwgYXJnczogW1wibHMtcmVtb3RlXCIsIHJlcG9VUkxdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKHJlYWNoYWJsZS5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgcmVhY2hhYmxlIHdpdGggJHtrZXlQYXRofSwgZ2l0IGxzLXJlbW90ZSBmYWlsZWQuYFxuICAgICAgICAgICAgKyBgIFRoZSBkYWVtb24gd291bGQgaGF2ZSBubyB3YXkgdG8gZmV0Y2gga2V5cy5cXG5gXG4gICAgICAgICAgICArIGAkeyhyZWFjaGFibGUuc3Rkb3V0ICsgcmVhY2hhYmxlLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCByZW1vdGVDb25maWcgPSBhd2FpdCByZWFkUmVtb3RlQ29uZmlnKGhvc3QpO1xuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7aG9zdH0gYWxyZWFkeSBoYXMgJHtyZXBvVVJMfSwgcmVmcmVzaGluZyBpdHMga2V5IGFuZCB0aGUgZGFlbW9uLmApO1xuICAgIH1cblxuICAgIC8vIFRoZSBtZXJnZWQgcmVzdWx0IGlzIHdoYXQgcm9vdCBlbmRzIHVwIHdpdGgsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBzb21ld2hlcmUgaW4gaXQuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nIG91ciBhY2Nlc3MgdG8gJHtob3N0fSBzdXJ2aXZlcyB0aGUgbWVyZ2VkIGtleXNgKTtcbiAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICBsZXQgaW5zcGVjdGlvblBhdGggPSBhd2FpdCBjbG9uZVJlcG9Gb3JJbnNwZWN0aW9uKHsgcmVwb1VSTCwga2V5UGF0aCB9KTtcbiAgICBsZXQgbmV3S2V5cyA9IGF3YWl0IHJlYWRSZXBvS2V5cyhpbnNwZWN0aW9uUGF0aCk7XG4gICAgLy8gV2hhdGV2ZXIgaXMgYXBwbGllZCBvbiB0aGUgaG9zdCBjYW1lIGZyb20gdGhlIGV4aXN0aW5nIHNvdXJjZXMsIHNvIGl0IHN0YXlzIGluIHRoZSBtZXJnZS5cbiAgICBsZXQgZXhpc3RpbmdLZXlzID0gbm9ybWFsaXplS2V5cyhhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBST09UX0FVVEhPUklaRURfS0VZUyB9KSB8fCBcIlwiKTtcbiAgICBsZXQgbWVyZ2VkRmluZ2VycHJpbnRzID0gYXdhaXQgZmluZ2VycHJpbnRLZXlzKFsuLi5leGlzdGluZ0tleXMsIC4uLm5ld0tleXNdKTtcbiAgICBpZiAoIW1lcmdlZEZpbmdlcnByaW50cy5pbmNsdWRlcyhvdXJGaW5nZXJwcmludCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIHRoZSBrZXkgd2UgdXNlIGZvciAke2hvc3R9IHRvIGJlIGluIHRoZSBtZXJnZWQga2V5cywgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYE91cnM6ICAgJHtvdXJGaW5nZXJwcmludH1cXG5gXG4gICAgICAgICAgICArIGBNZXJnZWQ6ICR7bWVyZ2VkRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICsgYFRoZSBkYWVtb24gcmVwbGFjZXMgcm9vdCdzIGF1dGhvcml6ZWRfa2V5cyB3aXRoIHRoZSBtZXJnZWQgc291cmNlcywgc28gdGhpcyB3b3VsZGBcbiAgICAgICAgICAgICsgYCBsb2NrIHlvdSBvdXQgb2YgJHtob3N0fS4gQWRkIHlvdXIgcHVibGljIGtleSB0byAke3JlcG9VUkx9IGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYE91ciBrZXkgJHtvdXJGaW5nZXJwcmludH0gaXMgaW4gdGhlIG1lcmdlZCBrZXlzLCBhY2Nlc3Mgd2lsbCBzdXJ2aXZlLmApO1xuXG4gICAgYXdhaXQgZW5zdXJlUmV2b2tlUmVwbyh7IGtleVBhdGgsIHJlcG9VUkwgfSk7XG5cbiAgICAvLyBEZXBsb3lpbmcgYSByZXBvIHRoYXQgc3RpbGwgaG9sZHMgYSByZXZva2VkIGtleSB3b3VsZCBoYW5kIGl0IGJhY2sgdG8gZXZlcnkgbWFjaGluZS5cbiAgICBsZXQgcmV2b2tlZCA9IGF3YWl0IHJldm9rZWRLZXlzSW5SZXBvKHsgcmVwb1BhdGg6IGluc3BlY3Rpb25QYXRoLCBzb3VyY2VVUkw6IHJlcG9VUkwgfSk7XG4gICAgaWYgKHJldm9rZWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGhvbGQgbm8gcmV2b2tlZCBrZXlzLCBpdCBob2xkcyAke3Jldm9rZWQubGVuZ3RofTpcXG5gXG4gICAgICAgICAgICArIHJldm9rZWQubWFwKGVudHJ5ID0+IGAgICR7ZW50cnkucmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieWBcbiAgICAgICAgICAgICAgICArIGAgJHtlbnRyeS5yZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gYWZ0ZXIgdXNlIGZyb20gJHtlbnRyeS5yZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiP1wifWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICsgYFxcbkRlbGV0ZSB0aGVtIGZyb20gdGhlIHJlcG8sIG9yIHJ1biBcInlhcm4gdW5yZXZva2VcIiB0aGVyZSB0byBhbGxvdyB0aGVtIGFnYWluLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2ViaG9va1VSTCA9IGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IG5vdGlmaWVzICR7d2ViaG9va1VSTH1gKTtcblxuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBzb3VyY2VLZXlQYXRoKHJlcG9VUkwpLFxuICAgICAgICBjb250ZW50czogYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpLFxuICAgICAgICBmaWxlTW9kZTogXCI2MDBcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3MDBcIixcbiAgICB9KTtcblxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG4gICAgcmVwb1NvdXJjZXMucHVzaChyZXBvVVJMKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSBhZGRlZCB0byAke2hvc3R9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIG5vdyBtZXJnZWQuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAoIXJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5pbmNsdWRlcyhyZXBvVVJMKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXBvVVJMfSB0byBiZSBhIHNvdXJjZSBvbiAke2hvc3R9LCBpdCBpcyBub3QuXFxuYFxuICAgICAgICAgICAgKyBgQ29uZmlndXJlZDpcXG4gICR7cmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmpvaW4oXCJcXG4gIFwiKSB8fCBcIihub25lKVwifWBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmZpbHRlcihzb3VyY2UgPT4gc291cmNlICE9PSByZXBvVVJMKTtcblxuICAgIGlmIChyZXBvU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVGhlIGtleXMgbGVmdCBvdmVyIGFyZSB3aGF0IHJvb3QgZ2V0cywgc28gb3VyIG93biBrZXkgaGFzIHRvIGJlIGFtb25nIHRoZW0uXG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7aG9zdH0gc3Vydml2ZXMgd2l0aG91dCAke3JlcG9VUkx9YCk7XG4gICAgICAgIGxldCBvdXJGaW5nZXJwcmludCA9IGF3YWl0IGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3QpO1xuICAgICAgICBsZXQgcmVtYWluaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgICAgICByZW1haW5pbmdLZXlzLnB1c2goLi4uYXdhaXQgcmVhZFJlbW90ZVNvdXJjZUtleXMoeyBob3N0LCByZXBvVVJMOiBzb3VyY2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1haW5pbmdGaW5nZXJwcmludHMgPSBhd2FpdCBmaW5nZXJwcmludEtleXMocmVtYWluaW5nS2V5cyk7XG4gICAgICAgIGlmICghcmVtYWluaW5nRmluZ2VycHJpbnRzLmluY2x1ZGVzKG91ckZpbmdlcnByaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBzdGlsbCBiZSBpbiB0aGUgcmVtYWluaW5nIHNvdXJjZXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICAgICAgKyBgT3VyczogICAgICAke291ckZpbmdlcnByaW50fVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1haW5pbmc6ICR7cmVtYWluaW5nRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1vdmluZyAke3JlcG9VUkx9IHdvdWxkIGxvY2sgeW91IG91dCBvZiAke2hvc3R9LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWVyZ2UsIHNvIHRoZSBkYWVtb24gbGVhdmVzIHJvb3QncyBhdXRob3JpemVkX2tleXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gaXMgdGhlIGxhc3Qgc291cmNlLCBzbyByb290J3MgYXV0aG9yaXplZF9rZXlzIHN0YXlzIGFzIGl0IGlzIG5vdy5gKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gcm0gLWYgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9XCJcbiRTVURPIHJtIC1yZiBcIiR7c291cmNlUmVwb1BhdGgocmVwb1VSTCl9XCJgLFxuICAgIH0pO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHJlbW90ZUNvbmZpZy5ob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IHJlbW92ZWQgZnJvbSAke2hvc3R9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIGxlZnQuYCk7XG59XG5cbi8qKiBBbnN3ZXJzIFwid2hvIGNhbiBsb2cgaW50byB0aGlzIGJveCwgYW5kIHdoaWNoIHJlcG8gc2F5cyBzb1wiLiBUaGUgcGF0aHMgdGhlIGRhZW1vbiB1c2VzIGFyZVxuICAgIGxlZnQgb3V0IG9uIHB1cnBvc2UsIHRoZXkgYXJlIHBsdW1iaW5nIHJhdGhlciB0aGFuIHNvbWV0aGluZyB0byBhY3Qgb24uICovXG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhbHJlYWR5IGhhdmUgcG9ydHNlY3VyZSwgJHtSRU1PVEVfQ09ORklHX1BBVEh9IGRvZXMgbm90IGV4aXN0LlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCB3aXRoOlxcbiAgeWFybiBzZWN1cmVzc2ggJHtob3N0fSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB7IGhvc3RMYWJlbD86IHN0cmluZzsgcmVwb1NvdXJjZXM/OiBzdHJpbmdbXSB9O1xuICAgIGxldCByZXBvU291cmNlcyA9IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXTtcbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGBVcGRhdGVkIHRoZSBkYWVtb24gb24gJHtob3N0fSwgYW5kIHJlc3RhcnRlZCBpdC5gKTtcbiAgICBjb25zb2xlLmxvZyhgSXRzICR7cmVwb1NvdXJjZXMubGVuZ3RofSBrZXkgc291cmNlKHMpIHdlcmUgbGVmdCBhcyB0aGV5IGFyZSwgYWxvbmcgd2l0aCB0aGUga2V5cyBhbmRgKTtcbiAgICBjb25zb2xlLmxvZyhgc2lnbmVycyBpdCBoYXMgYWxyZWFkeSBhY2NlcHRlZC4gT25seSB0aGUgZGFlbW9uIGl0c2VsZiBjaGFuZ2VkOmApO1xuICAgIGZvciAobGV0IHJlcG9VUkwgb2YgcmVwb1NvdXJjZXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtyZXBvVVJMfWApO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdFNvdXJjZXMoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2hvc3R9IGhhcyBubyBrZXkgc291cmNlcy4gcm9vdCdzIGF1dGhvcml6ZWRfa2V5cyBpcyBsZWZ0IGV4YWN0bHkgYXMgaXQgaXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYCR7aG9zdH0gbGV0cyByb290IGxvZyBpbiB3aXRoIHRoZSBrZXlzIGZyb20gJHtyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RofSByZXBvKHMpOmApO1xuICAgIGxldCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcykge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTCB9KTtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtyZXBvVVJMfWApO1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyBubyBrZXlzIC0gdGhlIGNoZWNrb3V0IGlzIG1pc3Npbmcgb3IgZW1wdHlgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgZ3JhbnRzICR7a2V5cy5sZW5ndGh9IGtleShzKTpgKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAke3N1bW1hcml6ZUtleShrZXkpfWApO1xuICAgICAgICAgICAgbWVyZ2VkLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuJHttZXJnZWQuc2l6ZX0ga2V5KHMpIGluIHRvdGFsIG9uY2UgZHVwbGljYXRlcyBhcmUgbWVyZ2VkLmApO1xuICAgIH1cbn1cblxuLyoqIFRoZSB2ZXJiIGlzIGEgZml4ZWQgd29yZCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uLCBzbyBpdCBpcyBwdWxsZWQgb3V0IG9mIHRoZSBhcmd1bWVudHMgd2hlcmV2ZXJcbiAgICBpdCB3YXMgdHlwZWQgYW5kIGV2ZXJ5dGhpbmcgbGVmdCBvdmVyIGlzIHBvc2l0aW9uYWwuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgdmVyYnMgPSBhcmd2LmZpbHRlcihhcmcgPT4gVkVSQlMuaW5jbHVkZXMoYXJnKSk7XG4gICAgaWYgKCF2ZXJicy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9IHNvbWV3aGVyZSBpbiB0aGUgYXJndW1lbnRzLCB3YXMgJHthcmd2LmpvaW4oXCIgXCIpIHx8IFwiKG5vdGhpbmcpXCJ9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9LCB3YXMgJHt2ZXJicy5qb2luKFwiIGFuZCBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHZlcmIgPSB2ZXJic1swXTtcbiAgICBsZXQgW2hvc3QsIC4uLnJlc3RdID0gYXJndi5maWx0ZXIoYXJnID0+IGFyZyAhPT0gdmVyYik7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0LCB3YXMgbm90aGluZ1xcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHZlcmIsIGhvc3QsIHJlc3QgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgbGV0IHsgdmVyYiwgaG9zdCwgcmVzdCB9ID0gcGFyc2VBcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG5cbiAgICBpZiAodmVyYiA9PT0gXCJsaXN0XCIpIHtcbiAgICAgICAgYXdhaXQgbGlzdFNvdXJjZXMoaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdGhpbmcgYWZ0ZXIgdXBkYXRlLCB3YXMgJHtyZXN0Lmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHVwZGF0ZURhZW1vbihob3N0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJhZGRcIikge1xuICAgICAgICBpZiAoIXJlc3QubGVuZ3RoIHx8IHJlc3QubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHByaXZhdGUga2V5IGFuZCBvcHRpb25hbGx5IGEgcmVwbyB1cmwsIHdhcyAke3Jlc3QubGVuZ3RofSBhcmd1bWVudChzKVxcbiR7VVNBR0V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYWRkU291cmNlKHsgaG9zdCwga2V5UGF0aDogZXhwYW5kSG9tZShyZXN0WzBdKSwgcmVwb1VSTDogYXdhaXQgcmVzb2x2ZVJlcG9VUkwocmVzdFsxXSkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3QubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgYSByZXBvIHVybCB0byByZW1vdmUsIHdhcyAke3Jlc3QubGVuZ3RofSBhcmd1bWVudChzKVxcbiR7VVNBR0V9YCk7XG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVNvdXJjZSh7IGhvc3QsIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMF0pIH0pO1xufVxuIl19
539
- /* _JS_SOURCE_HASH = "3c90444025671cc3213dcfd869a36bc1c8cca2b502d5ce035d38986a40c7cf9f"; */
614
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlU1NILmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlU1NILnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJEQUE2QjtBQUM3Qiw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHNEQUF1RjtBQUN2RixxREFBNkU7QUFDN0UsdUNBQW9HO0FBQ3BHLGlEQUFrRjtBQUNsRix1Q0FBZ0Q7QUFDaEQseUNBQStDO0FBQy9DLHlDQUE2QztBQUM3Qyw0Q0FBOEM7QUFDOUMsNENBQWdEO0FBQ2hELG9EQUFtSjtBQUVuSixNQUFNLGNBQWMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUM1RSxrR0FBa0c7QUFDbEcsbUdBQW1HO0FBQ25HLGdCQUFnQjtBQUNoQixNQUFNLGNBQWMsR0FBRyw0Q0FBNEMsQ0FBQztBQUNwRSxNQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDO0FBQzFELE1BQU0sbUJBQW1CLEdBQUcsd0NBQXdDLENBQUM7QUFDckUsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztBQUN6RCxNQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDO0FBQzFELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQztBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELDRGQUE0RjtBQUM1RixrRUFBa0U7QUFDbEUsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Y0FPQSxDQUFDO0FBRWYsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN0QyxJQUFJLENBQUM7UUFDRCxNQUFNLGtCQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLENB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QzdELHVCQUF1QixDQUM1QixDQUFDO0lBQ04sQ0FBQztBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSTtJQUN0QiwyRkFBMkY7SUFDM0YsOEZBQThGO0lBQzlGLHlFQUF5RTtJQUN6RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxS0FBcUs7SUFDckssSUFBSSxJQUFJLEtBQUssd0JBQVksRUFBRSxDQUFDO1FBQ3hCLFdBQVcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU87SUFDWCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDakIsTUFBTSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUEsa0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLE9BQU87SUFDWCxDQUFDO0lBQ0QsTUFBTSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBdkJELG9CQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRILCBwYXJzZVdlYmhvb2tGaWxlIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplS2V5cywgcmVhZFJlcG9LZXlzLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgZmluZFNvdXJjZUtleSwgS0VZU19ESVJfTkFNRSwgc291cmNlS2V5UGF0aCwgc291cmNlTmFtZSwgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIFJFVk9LRV9LRVlfTEFCRUwsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IGxlZ2FjeVNvdXJjZUtleVBhdGggfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyByZXZva2VkS2V5c0luUmVwbyB9IGZyb20gXCIuL3VucmV2b2tlXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi9rZXlzUmVwb1wiO1xuaW1wb3J0IHsgZXhwYW5kSG9tZSB9IGZyb20gXCIuLi9oZWxwZXJzL3BhdGhzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCByZWFkUmVtb3RlRmlsZSwgcmVtb3RlQ29tbWFuZEV4aXN0cywgcnVuT3ZlclNTSCwgU1VET19QUkVBTUJMRSwgVEhJU19NQUNISU5FLCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcblxuY29uc3QgU0VSVklDRV9TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImRhZW1vblwiLCBcInBvcnRzZWN1cmUuc2VydmljZVwiKTtcbi8vIFRoZSBkYWVtb24gcnVucyBmcm9tIGEgY2hlY2tvdXQgb2YgdGhpcyByZXBvIG9uIHRoZSBob3N0LCByYXRoZXIgdGhhbiBmcm9tIGEgY29weSB3ZSB1cGxvYWQsIHNvXG4vLyBhIGhvc3QgdXBkYXRlcyBpdHNlbGYgZnJvbSBnaXRodWIgdGhlIHNhbWUgd2F5IGFueXRoaW5nIGVsc2UgZG9lcy4gc2xpZnR1dGlscyBpcyBwdWJsaWMsIHNvIHRoaXNcbi8vIG5lZWRzIG5vIGtleS5cbmNvbnN0IFNMSUZUVVRJTFNfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vc2xpZnRpc3Qvc2xpZnR1dGlscy5naXRcIjtcbmNvbnN0IFJFTU9URV9DSEVDS09VVF9QQVRIID0gXCIvb3B0L3BvcnRzZWN1cmUvc2xpZnR1dGlsc1wiO1xuY29uc3QgUkVNT1RFX1NFUlZJQ0VfUEFUSCA9IFwiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9wb3J0c2VjdXJlLnNlcnZpY2VcIjtcbmNvbnN0IFJFTU9URV9DT05GSUdfUEFUSCA9IFwiL2V0Yy9wb3J0c2VjdXJlL2RhZW1vbi5qc29uXCI7XG5jb25zdCBST09UX0FVVEhPUklaRURfS0VZUyA9IFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIjtcbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IFwicG9ydHNlY3VyZVwiO1xuY29uc3QgTUFYX0VSUk9SX0JPRFlfTEVOR1RIID0gNTAwO1xuY29uc3QgVkVSQlMgPSBbXCJhZGRcIiwgXCJyZW1vdmVcIiwgXCJsaXN0XCIsIFwidXBkYXRlXCJdO1xuLy8gVGhlIGhvc3QgaXMgb3B0aW9uYWwsIGFuZCB3aXRob3V0IG9uZSBldmVyeXRoaW5nIGhhcHBlbnMgb24gdGhpcyBtYWNoaW5lLiBUaGUgcmVwbyB1cmwgaXNcbi8vIG9wdGlvbmFsIHRvbywgYW5kIGRlZmF1bHRzIHRvIHRoZSByZXBvIHRoZSBjb21tYW5kIGlzIHJ1biBmcm9tLlxuY29uc3QgVVNBR0UgPSBgVXNhZ2U6XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1cbiAgeWFybiBzZWN1cmVzc2ggW2hvc3RdIHJlbW92ZSBbcmVwby11cmxdXG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSBsaXN0XG4gIHlhcm4gc2VjdXJlc3NoIFtob3N0XSB1cGRhdGVcblxuV2l0aCBubyBob3N0IGl0IGFjdHMgb24gdGhpcyBtYWNoaW5lLCBhbmQgc3RpbGwgaW5zdGFsbHMgZnJvbSBnaXRodWIgcmF0aGVyIHRoYW4gZnJvbSB3aGVyZXZlclxudGhpcyB3YXMgcnVuLmA7XG5cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTG9jYWwoY29uZmlnOiB7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGN3ZD86IHN0cmluZzsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9KSB7XG4gICAgbGV0IHsgY29tbWFuZCwgYXJncywgY3dkLCBhbGxvd0ZhaWx1cmUgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZCwgYXJncywgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2NvbW1hbmR9IHRvIHJ1biwgZmFpbGVkIHdpdGggJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDAgJiYgIWFsbG93RmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9IHRvIGV4aXQgMCwgd2FzICR7cmVzdWx0LnN0YXR1c30uIGBcbiAgICAgICAgICAgICsgYCR7KHJlc3VsdC5zdGRvdXQgKyByZXN1bHQuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBBIHByaXZhdGUga2V5IGNhbm5vdCBhdXRoZW50aWNhdGUgYW4gaHR0cHMgcmVtb3RlLCBzbyBnaXRodWIgdXJscyBhcmUgY29udmVydGVkIHRvIHRoZSBzc2ggZm9ybVxuICAgIHRoZSBrZXkgY2FuIGFjdHVhbGx5IGJlIHVzZWQgd2l0aC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9VUkwocmVwb1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IGh0dHBzTWF0Y2ggPSByZXBvVVJMLm1hdGNoKC9eaHR0cHM/OlxcL1xcLyhbXi9dKylcXC8oLis/KSg/OlxcLmdpdCk/XFwvPyQvKTtcbiAgICBpZiAoIWh0dHBzTWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9VUkw7XG4gICAgfVxuICAgIGxldCBbLCBob3N0LCByZXBvUGF0aF0gPSBodHRwc01hdGNoO1xuICAgIHJldHVybiBgZ2l0QCR7aG9zdH06JHtyZXBvUGF0aH0uZ2l0YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2l0V2l0aEtleShjb25maWc6IHsga2V5UGF0aDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgY3dkPzogc3RyaW5nOyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCBhcmdzLCBjd2QsIGFsbG93RmFpbHVyZSB9ID0gY29uZmlnO1xuICAgIC8vIGNvcmUuc3NoQ29tbWFuZCBrZWVwcyBrZXkgc2VsZWN0aW9uIHdpdGggdGhlIGNvbW1hbmQgaW5zdGVhZCBvZiBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAgbGV0IHNzaENvbW1hbmQgPSBgc3NoIC1pICR7a2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5hcmdzXSwgY3dkIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBnaXQgdG8gcnVuLCBmYWlsZWQgd2l0aCAke3Jlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCAmJiAhYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBnaXQgJHthcmdzLmpvaW4oXCIgXCIpfSB0byBleGl0IDAsIHdhcyAke3Jlc3VsdC5zdGF0dXN9LiBgXG4gICAgICAgICAgICArIGAkeyhyZXN1bHQuc3Rkb3V0ICsgcmVzdWx0LnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQXNrcyBzc2ggd2hpY2gga2V5IGl0IGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQgd2l0aC4gVGhpcyBpcyB0aGUga2V5IHRoYXQgbXVzdCBzdXJ2aXZlIHRoZVxuICAgIGRhZW1vbiB0YWtpbmcgb3ZlciBhdXRob3JpemVkX2tleXMsIG90aGVyd2lzZSBhIGRlcGxveSBsb2NrcyB1cyBvdXQuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKHtcbiAgICAgICAgY29tbWFuZDogXCJzc2hcIixcbiAgICAgICAgYXJnczogW1wiLXZcIiwgXCItb1wiLCBcIkJhdGNoTW9kZT15ZXNcIiwgXCItb1wiLCBcIkNvbm5lY3RUaW1lb3V0PTEwXCIsIGhvc3QsIFwidHJ1ZVwiXSxcbiAgICB9KTtcbiAgICBsZXQgdmVyYm9zZU91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgXCJcIjtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIHNzaCBpbnRvICR7aG9zdH0sIGZhaWxlZC4gJHt2ZXJib3NlT3V0cHV0LnNsaWNlKC1NQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBsZXQgYWNjZXB0ZWRNYXRjaCA9IHZlcmJvc2VPdXRwdXQubWF0Y2goL1NlcnZlciBhY2NlcHRzIGtleTouKj8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICBpZiAoIWFjY2VwdGVkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7aG9zdH0gdG8gYWNjZXB0IGEgcHVibGljIGtleSwgYnV0IHRoZSBzZXNzaW9uIGRpZCBub3QgYXV0aGVudGljYXRlIHdpdGggb25lLmBcbiAgICAgICAgICAgICsgYCBwb3J0c2VjdXJlIGRpc2FibGVzIHBhc3N3b3JkIGxvZ2luLCBzbyBrZXkgYmFzZWQgYWNjZXNzIGhhcyB0byB3b3JrIGZpcnN0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY2VwdGVkTWF0Y2hbMV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50S2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1rZXlzLVwiKSk7XG4gICAgbGV0IGtleXNQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJhdXRob3JpemVkX2tleXNcIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGtleXNQYXRoLCBgJHtrZXlzLmpvaW4oXCJcXG5cIil9XFxuYCk7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJzc2gta2V5Z2VuXCIsIGFyZ3M6IFtcIi1sZlwiLCBrZXlzUGF0aF0sIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBsZXQgZmluZ2VycHJpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC8oU0hBMjU2OltBLVphLXowLTkrLz1dKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBmaW5nZXJwcmludHMucHVzaChtYXRjaFsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbmdlcnByaW50cztcbn1cblxuLyoqIFdoZXJlIHRoZSBkYWVtb24gb24gdGhhdCBtYWNoaW5lIGtlZXBzIGl0cyBrZXlzOiB0aGUgaG9tZSBvZiB0aGUgdXNlciBpdCBydW5zIGFzLiBBc2tlZCBvZiB0aGVcbiAgICBtYWNoaW5lIGl0c2VsZiwgYmVjYXVzZSB0aGUgYW5zd2VyIGlzIG5vdCB0aGUgc2FtZSBldmVyeXdoZXJlIGFuZCBjZXJ0YWlubHkgbm90IHRoZSBzYW1lIGFzIHRoZVxuICAgIGhvbWUgb2Ygd2hvZXZlciBpcyBydW5uaW5nIHRoaXMuICovXG5hc3luYyBmdW5jdGlvbiBkYWVtb25LZXlzRGlyKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxcbiRTVURPIGdldGVudCBwYXNzd2Qgcm9vdCB8IGN1dCAtZDogLWY2YCxcbiAgICB9KTtcbiAgICBsZXQgaG9tZSA9IHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSB0byByZXBvcnQgYSBob21lIGRpcmVjdG9yeSBmb3Igcm9vdCwgaXQgcmVwb3J0ZWQgbm90aGluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aG9tZX0vJHtLRVlTX0RJUl9OQU1FfWA7XG59XG5cbi8qKiBUaGUgcHVibGljIGhhbGYgb2YgYSBwcml2YXRlIGtleSwgYXMgc3NoLWtleWdlbiBkZXJpdmVzIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVibGljS2V5T2YocHJpdmF0ZUtleVBhdGg6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5Mb2NhbCh7IGNvbW1hbmQ6IFwic3NoLWtleWdlblwiLCBhcmdzOiBbXCIteVwiLCBcIi1mXCIsIHByaXZhdGVLZXlQYXRoXSB9KTtcbiAgICByZXR1cm4gYCR7cmVzdWx0LnN0ZG91dC50cmltKCl9XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVSZXBvRm9ySW5zcGVjdGlvbihjb25maWc6IHsgcmVwb1VSTDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHJlcG9VUkwsIGtleVBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdGVtcG9yYXJ5RGlyZWN0b3J5ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicG9ydHNlY3VyZS1yZXBvLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoLCBhcmdzOiBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJlcG9VUkwsIHJlcG9QYXRoXSB9KTtcbiAgICByZXR1cm4gcmVwb1BhdGg7XG59XG5cbi8qKiBXaXRoIG5vIHJlcG8gdXJsIGdpdmVuLCB0aGUga2V5cyByZXBvIHRoaXMgbWFjaGluZSByZXNvbHZlcyB0byBpcyB1c2VkIC0gdGhlIG9uZSB3ZSBhcmVcbiAgICBzdGFuZGluZyBpbiB3aGVuIHRoYXQgaG9sZHMga2V5cywgYW5kIHRoaXMgbWFjaGluZSdzIG93biBvdGhlcndpc2UuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1VSTChwYXNzZWRVUkw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwYXNzZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJlcG9VUkwocGFzc2VkVVJMKTtcbiAgICB9XG4gICAgbGV0IHsgcmVwb1BhdGgsIHNvdXJjZVVSTCB9ID0gYXdhaXQgcmVzb2x2ZUtleXNSZXBvKCk7XG4gICAgbGV0IHJlcG9VUkwgPSBub3JtYWxpemVSZXBvVVJMKHNvdXJjZVVSTCk7XG4gICAgY29uc29sZS5sb2coYE5vIHJlcG8gdXJsIGdpdmVuLCB1c2luZyAke3JlcG9QYXRofTogJHtyZXBvVVJMfWApO1xuICAgIHJldHVybiByZXBvVVJMO1xufVxuXG4vKiogRXZlcnkgc291cmNlJ3MgcmV2b2tlIHJlcG8gaGFzIHRvIGV4aXN0IGFuZCBob2xkIGF0IGxlYXN0IG9uZSBjb21taXQsIG9yIHRoZSBob3N0cyB1c2luZyBpdFxuICAgIGNhbm5vdCByZWNvcmQgYSByZXZvY2F0aW9uLiBDaGVja2VkIHdpdGggdGhpcyBtYWNoaW5lJ3Mgb3duIGdpdCBjcmVkZW50aWFscywgc2luY2UgdXBkYXRlIGlzXG4gICAgbm90IGdpdmVuIGFueSBkZXBsb3kga2V5LCBhbmQgYW4gZW1wdHkgcmVwbyBpcyBpbml0aWFsaXNlZCByYXRoZXIgdGhhbiBtZXJlbHkgY29tcGxhaW5lZCBhYm91dC5cblxuICAgIEEgaG9zdCB0aGF0IGNhbm5vdCB3cml0ZSBhIHJldm9jYXRpb24gc2lsZW50bHkga2VlcHMgYWNjZXB0aW5nIGEga2V5IGl0IGp1c3Qgc2F3IGJlaW5nIG1pc3VzZWQsXG4gICAgd2hpY2ggaXMgdGhlIG9uZSBmYWlsdXJlIHRoaXMgd2hvbGUgdGhpbmcgZXhpc3RzIHRvIHByZXZlbnQsIHNvIGl0IGlzIGNoZWNrZWQgb24gZXZlcnkgZGVwbG95XG4gICAgYW5kIG5vdCBvbmx5IHdoZW4gYSBzb3VyY2UgaXMgZmlyc3QgYWRkZWQuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IHJlcG9VUkwgb2YgcmVwb1NvdXJjZXMpIHtcbiAgICAgICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgICAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgICAgICAvLyBPbiBhIG1hY2hpbmUgdGhhdCBpcyBhbHJlYWR5IGEgcG9ydHNlY3VyZSBob3N0LCB0aGUgc291cmNlJ3MgZGVwbG95IGtleSBpcyByaWdodCB0aGVyZSxcbiAgICAgICAgLy8gYW5kIHRoZSBrZXkgZGVyaXZlZCBmcm9tIGl0IGlzIHRoZSBvbmUgY3JlZGVudGlhbCB0aGF0IHJlcG8gaXMgZ3VhcmFudGVlZCB0byBhY2NlcHQuXG4gICAgICAgIC8vIEFueXdoZXJlIGVsc2UsIGEgcGVyc29uIGlzIHJ1bm5pbmcgdGhpcyBhbmQgaGFzIHRoZWlyIG93biBhY2Nlc3MuXG4gICAgICAgIGxldCBvd25LZXkgPSBcIlwiO1xuICAgICAgICBsZXQgbG9jYWxTb3VyY2VLZXkgPSBhd2FpdCBmaW5kU291cmNlS2V5KHJlcG9VUkwpO1xuICAgICAgICBpZiAobG9jYWxTb3VyY2VLZXkpIHtcbiAgICAgICAgICAgIGxldCBkZXJpdmVkID0gZGVyaXZlUmV2b2tlS2V5KGF3YWl0IGZzLnJlYWRGaWxlKGxvY2FsU291cmNlS2V5LCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgb3duS2V5ID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJrZXlcIik7XG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUob3duS2V5LCBkZXJpdmVkLnByaXZhdGVLZXlGaWxlLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbG9uZVJldm9rZSA9IGFzeW5jIChhbGxvd0ZhaWx1cmU6IGJvb2xlYW4pID0+IG93bktleVxuICAgICAgICAgICAgJiYgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSlcbiAgICAgICAgICAgIHx8IGF3YWl0IHJ1bkxvY2FsKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmUgfSk7XG4gICAgICAgIGxldCBjbG9uZSA9IGF3YWl0IGNsb25lUmV2b2tlKHRydWUpO1xuICAgICAgICBpZiAoY2xvbmUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgJHtyZXZva2VVUkx9IHRvIGV4aXN0LCBpdCBkb2VzIG5vdCwgc28gJHtyZXBvVVJMfSBoYXMgbm93aGVyZSB0byByZWNvcmQgYWBcbiAgICAgICAgICAgICAgICArIGAgcmV2b2NhdGlvbi5cXG5DcmVhdGUgaXQsIHRoZW4gcnVuIFwieWFybiBzZWN1cmVzc2ggPGhvc3Q+IGFkZFwiIGZvciB0aGF0IHNvdXJjZSB0b2BcbiAgICAgICAgICAgICAgICArIGAgcmVnaXN0ZXIgaXRzIGRlcGxveSBrZXkuXFxuJHsoY2xvbmUuc3Rkb3V0ICsgY2xvbmUuc3RkZXJyKS50cmltKCkuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWFkID0gYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoaGVhZC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3Jldm9rZVVSTH0gaXMgZW1wdHksIGdpdmluZyBpdCBhIGZpcnN0IGNvbW1pdGApO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjaGVja291dFBhdGgsIFwiUkVBRE1FLm1kXCIpLFxuICAgICAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICAgICArIGBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20sIGFuZCBpcyBubyBsb25nZXIgYWNjZXB0ZWQgYW55d2hlcmUuXFxuYCk7XG4gICAgICAgICAgICBmb3IgKGxldCBhcmdzIG9mIFtcbiAgICAgICAgICAgICAgICBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwiYWRkXCIsIFwiLUFcIl0sXG4gICAgICAgICAgICAgICAgW1wiLUNcIiwgY2hlY2tvdXRQYXRoLCBcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHB1c2ggPSBbXCItQ1wiLCBjaGVja291dFBhdGgsIFwicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl07XG4gICAgICAgICAgICBpZiAob3duS2V5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGg6IG93bktleSwgYXJnczogcHVzaCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuTG9jYWwoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBwdXNoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHJlYWR5YCk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJldm9rZSByZXBvIGhhcyB0byBleGlzdCBhbmQgYmUgd3JpdGFibGUgYmVmb3JlIGEgaG9zdCBpcyBzZXQgdXAsIGJlY2F1c2UgYSBob3N0IHRoYXRcbiAgICBjYW5ub3Qgd3JpdGUgYSByZXZvY2F0aW9uIGNhbm5vdCByZXZva2UgYSBrZXkgdGhhdCBpcyBiZWluZyBtaXN1c2VkLiBUaGUga2V5IGZvciBpdCBpcyBkZXJpdmVkXG4gICAgZnJvbSB0aGUgc291cmNlJ3MsIHNpbmNlIGdpdGh1YiB3aWxsIG5vdCB0YWtlIG9uZSBwdWJsaWMga2V5IG9uIHR3byByZXBvcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVJldm9rZVJlcG8oY29uZmlnOiB7IGtleVBhdGg6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBrZXlQYXRoLCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9rZVVSTCA9IHJldm9rZVJlcG9VUkwocmVwb1VSTCk7XG4gICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoa2V5UGF0aCwgXCJ1dGY4XCIpKTtcblxuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJwb3J0c2VjdXJlLXJldm9rZS1cIikpO1xuICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkZXJpdmVkS2V5UGF0aCwgZGVyaXZlZC5wcml2YXRlS2V5RmlsZSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICBsZXQgY2hlY2tvdXRQYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuXG4gICAgbGV0IGV4cGxhaW4gPSAocHJvYmxlbTogc3RyaW5nKSA9PiBuZXcgRXJyb3IoXG4gICAgICAgIGAke3Byb2JsZW19XFxuYFxuICAgICAgICArIGBDcmVhdGUgJHtyZXZva2VVUkx9IGFuZCBhZGQgdGhpcyBhcyBhIGRlcGxveSBrZXkgV0lUSCBXUklURSBBQ0NFU1M6XFxuYFxuICAgICAgICArIGAgICR7ZGVyaXZlZC5wdWJsaWNLZXl9ICR7UkVWT0tFX0tFWV9MQUJFTH1cXG5gXG4gICAgICAgICsgYEl0IGhhcyB0byBiZSB0aGlzIGtleTogaXQgaXMgZGVyaXZlZCBmcm9tICR7a2V5UGF0aH0sIGFuZCBnaXRodWIgd2lsbCBub3QgYWNjZXB0IHRoZSBzYW1lYFxuICAgICAgICArIGAgcHVibGljIGtleSBvbiB0d28gcmVwb3NpdG9yaWVzLmBcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nICR7cmV2b2tlVVJMfWApO1xuICAgIGxldCBjbG9uZSA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wiY2xvbmVcIiwgcmV2b2tlVVJMLCBjaGVja291dFBhdGhdLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCAke3Jldm9rZVVSTH0gdG8gYmUgcmVhZGFibGUgd2l0aCB0aGUgZGVyaXZlZCBrZXksIGl0IGlzIG5vdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbXB0eSByZXBvIGhhcyBubyBicmFuY2ggZm9yIHRoZSBkYWVtb24gdG8gY2xvbmUsIHNvIGl0IGdldHMgaXRzIGZpcnN0IGNvbW1pdCBoZXJlLiBUaGF0XG4gICAgLy8gZG91YmxlcyBhcyB0aGUgcHJvb2YgdGhhdCB3ZSBjYW4gd3JpdGUgdG8gaXQuXG4gICAgbGV0IGhlYWQgPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgaWYgKGhlYWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY2hlY2tvdXRQYXRoLCBcIlJFQURNRS5tZFwiKSxcbiAgICAgICAgICAgIGAjIHJldm9rZWQga2V5c1xcblxcbldyaXR0ZW4gYnkgcG9ydHNlY3VyZS4gRWFjaCBmaWxlIHVuZGVyIHJldm9jYXRpb25zLyBpcyBvbmUga2V5IHRoYXQgd2FzIHVzZWQgZnJvbSBhblxcbmBcbiAgICAgICAgICAgICsgYGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kIGlzIG5vIGxvbmdlciBhY2NlcHRlZCBhbnl3aGVyZS5cXG5gKTtcbiAgICAgICAgZm9yIChsZXQgYXJncyBvZiBbXG4gICAgICAgICAgICBbXCJhZGRcIiwgXCItQVwiXSxcbiAgICAgICAgICAgIFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBcImluaXRpYWxpc2UgcmV2b2tlIHJlcG9cIl0sXG4gICAgICAgIF0pIHtcbiAgICAgICAgICAgIGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJncywgY3dkOiBjaGVja291dFBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2ggPSBhd2FpdCBnaXRXaXRoS2V5KHsga2V5UGF0aDogZGVyaXZlZEtleVBhdGgsIGFyZ3M6IFtcInB1c2hcIiwgXCJvcmlnaW5cIiwgXCJIRUFEXCJdLCBjd2Q6IGNoZWNrb3V0UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IGV4cGxhaW4oYEV4cGVjdGVkIHdyaXRlIGFjY2VzcyB0byAke3Jldm9rZVVSTH0sIHRoZSBmaXJzdCBwdXNoIHdhcyByZWZ1c2VkLlxcbiR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRyeVJ1biA9IGF3YWl0IGdpdFdpdGhLZXkoeyBrZXlQYXRoOiBkZXJpdmVkS2V5UGF0aCwgYXJnczogW1wicHVzaFwiLCBcIi0tZHJ5LXJ1blwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogY2hlY2tvdXRQYXRoLCBhbGxvd0ZhaWx1cmU6IHRydWUgfSk7XG4gICAgICAgIGlmIChkcnlSdW4uc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBleHBsYWluKGBFeHBlY3RlZCB3cml0ZSBhY2Nlc3MgdG8gJHtyZXZva2VVUkx9LCBhIGRyeSBydW4gcHVzaCB3YXMgcmVmdXNlZC5cXG4keyhkcnlSdW4uc3Rkb3V0ICsgZHJ5UnVuLnN0ZGVycikudHJpbSgpLnNsaWNlKDAsIE1BWF9FUlJPUl9CT0RZX0xFTkdUSCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXZva2VVUkx9IGlzIHdyaXRhYmxlYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVDb25maWcoaG9zdDogc3RyaW5nKSB7XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUkVNT1RFX0NPTkZJR19QQVRIIH0pO1xuICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgaG9zdExhYmVsOiBob3N0LCByZXBvU291cmNlczogW10gYXMgc3RyaW5nW10gfTtcbiAgICB9XG4gICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMpIGFzIHsgaG9zdExhYmVsPzogc3RyaW5nOyByZXBvU291cmNlcz86IHN0cmluZ1tdIH07XG4gICAgcmV0dXJuIHsgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzOiBwYXJzZWQucmVwb1NvdXJjZXMgfHwgW10gfTtcbn1cblxuLyoqIFJlYWRzIHRoZSBrZXlzIGEgc291cmNlJ3MgY2hlY2tvdXQgY3VycmVudGx5IGhvbGRzIG9uIHRoZSBob3N0LCBzbyB0aGUgbWVyZ2VkIHJlc3VsdCBjYW4gYmVcbiAgICB3b3JrZWQgb3V0IHdpdGhvdXQgbmVlZGluZyB0aGF0IHNvdXJjZSdzIHByaXZhdGUga2V5IGxvY2FsbHkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUmVtb3RlU291cmNlS2V5cyhjb25maWc6IHsgaG9zdDogc3RyaW5nOyByZXBvVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IGhvc3QsIHJlcG9VUkwgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBzb3VyY2VSZXBvUGF0aChyZXBvVVJMKTtcbiAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIHNjcmlwdDogYCR7U1VET19QUkVBTUJMRX1cbmlmICRTVURPIHRlc3QgLWYgXCIke3JlcG9QYXRofS9hdXRob3JpemVkX2tleXNcIjsgdGhlblxuICAgICRTVURPIGNhdCBcIiR7cmVwb1BhdGh9L2F1dGhvcml6ZWRfa2V5c1wiXG5lbGlmICRTVURPIHRlc3QgLWQgXCIke3JlcG9QYXRofVwiOyB0aGVuXG4gICAgJFNVRE8gY2F0IFwiJHtyZXBvUGF0aH1cIi8qLnB1YiAyPi9kZXYvbnVsbCB8fCB0cnVlXG5maWAsXG4gICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbm9ybWFsaXplS2V5cyhvdXRwdXQuc3Rkb3V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERhZW1vbihjb25maWc6IHsgaG9zdDogc3RyaW5nOyBob3N0TGFiZWw6IHN0cmluZzsgcmVwb1NvdXJjZXM6IHN0cmluZ1tdIH0pIHtcbiAgICBsZXQgeyBob3N0LCBob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0gPSBjb25maWc7XG4gICAgZm9yIChsZXQgY29tbWFuZCBvZiBbXCJub2RlXCIsIFwiZ2l0XCIsIFwieWFyblwiXSkge1xuICAgICAgICBpZiAoIWF3YWl0IHJlbW90ZUNvbW1hbmRFeGlzdHMoeyBob3N0LCBjb21tYW5kIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7Y29tbWFuZH0gdG8gYmUgaW5zdGFsbGVkIG9uICR7aG9zdH0sIGl0IGlzIG5vdC4gSW5zdGFsbCBpdCBhbmQgcmVydW4uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY2hlY2tvdXQgaXMgYnJvdWdodCB0byB0aGUgbGF0ZXN0IGNvbW1pdCByYXRoZXIgdGhhbiBhIGNvcHkgYmVpbmcgcHVzaGVkLCBzbyB3aGF0IHJ1bnMgb25cbiAgICAvLyB0aGUgaG9zdCBpcyBleGFjdGx5IHdoYXQgaXMgb24gZ2l0aHViLlxuICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyAke1JFTU9URV9DSEVDS09VVF9QQVRIfSBvbiAke2Rlc2NyaWJlSG9zdChob3N0KX1gKTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBta2RpciAtcCBcIiR7cGF0aC5wb3NpeC5kaXJuYW1lKFJFTU9URV9DSEVDS09VVF9QQVRIKX1cIlxuaWYgJFNVRE8gdGVzdCAtZCBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9Ly5naXRcIjsgdGhlblxuICAgICMgU3Rhc2hlZCBmaXJzdCwgdGhlIHdheSBtYWNoaW5lLWFsd2F5c3VwIGRvZXMgaXQuIEFueXRoaW5nIHNpdHRpbmcgbW9kaWZpZWQgaW4gYSBob3N0J3NcbiAgICAjIGNoZWNrb3V0IGlzIGVpdGhlciBhbiBhY2NpZGVudCBvciBzb21lYm9keSBlZGl0aW5nIHRoZSBkYWVtb24gaW4gcGxhY2UsIGFuZCBlaXRoZXIgd2F5IGl0IGlzXG4gICAgIyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHkgZXJhc2luZy4gVGhlIGlkZW50aXR5IGlzIHBhc3NlZCBpbmxpbmUgYmVjYXVzZSBhIGhvc3QgaGFzXG4gICAgIyBubyBnaXQgY29uZmlnIG9mIGl0cyBvd24gYW5kIHN0YXNoIHdyaXRlcyBhIGNvbW1pdC5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIGFkZCAtLWFsbFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgLWMgdXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdCAtYyB1c2VyLm5hbWU9cG9ydHNlY3VyZSBzdGFzaFxuICAgICRTVURPIGdpdCAtQyBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCIgZmV0Y2ggLS1wcnVuZSBvcmlnaW5cbiAgICAjIEEgc3Rhc2ggYW5kIGEgcHVsbCBjYW5ub3QgY3Jvc3MgYSBicmFuY2ggdGhhdCBoYXMgZGl2ZXJnZWQsIGFuZCBhIGRyaWZ0ZWQgY2hlY2tvdXQgbXVzdCBub3QgYmVcbiAgICAjIGFibGUgdG8gbGVhdmUgYSBob3N0IHJ1bm5pbmcgb2xkIGNvZGUsIHNvIGl0IGlzIHB1dCBvbiB0aGUgcmVtb3RlJ3Mgc3RhdGUgcmF0aGVyIHRoYW4gbWVyZ2VkXG4gICAgIyB3aXRoIGl0LiBzZXQtaGVhZCBzbyB0aGF0IGlzIHRoZSByZW1vdGUncyBkZWZhdWx0IGJyYW5jaCBub3csIG5vdCB0aGUgb25lIGl0IGhhZCBhdCBjbG9uZS5cbiAgICAkU1VETyBnaXQgLUMgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiIHJlbW90ZSBzZXQtaGVhZCBvcmlnaW4gLS1hdXRvXG4gICAgJFNVRE8gZ2l0IC1DIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiByZXNldCAtLWhhcmQgb3JpZ2luL0hFQURcbmVsc2VcbiAgICAkU1VETyBybSAtcmYgXCIke1JFTU9URV9DSEVDS09VVF9QQVRIfVwiXG4gICAgJFNVRE8gZ2l0IGNsb25lIFwiJHtTTElGVFVUSUxTX1VSTH1cIiBcIiR7UkVNT1RFX0NIRUNLT1VUX1BBVEh9XCJcbmZpXG4kU1VETyB5YXJuIC0tY3dkIFwiJHtSRU1PVEVfQ0hFQ0tPVVRfUEFUSH1cIiBpbnN0YWxsIC0tcHJvZHVjdGlvbiAtLW5vbi1pbnRlcmFjdGl2ZVxuIyBUaGUgc2luZ2xlIGZpbGUgZGFlbW9uIHRoaXMgcmVwbGFjZWQsIGxlZnQgb3ZlciBvbiBhIGhvc3Qgc2V0IHVwIGJ5IGFuIG9sZGVyIHZlcnNpb24uXG4kU1VETyBybSAtZiAvb3B0L3BvcnRzZWN1cmUvcG9ydHNlY3VyZS1kYWVtb24uanNgLFxuICAgIH0pO1xuICAgIGF3YWl0IHdyaXRlUmVtb3RlRmlsZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEgsXG4gICAgICAgIC8vIE9ubHkgd2hhdCBkaWZmZXJzIGJldHdlZW4gbWFjaGluZXMuIEV2ZXJ5IHBhdGggdGhlIGRhZW1vbiB1c2VzIGlzIGRlcml2ZWQgaW4gdGhlIGRhZW1vblxuICAgICAgICAvLyBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byBkcmlmdCBvdXQgb2Ygc3luYy5cbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHsgaG9zdExhYmVsLCByZXBvU291cmNlcyB9LCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIixcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IFJFTU9URV9TRVJWSUNFX1BBVEgsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBmcy5yZWFkRmlsZShTRVJWSUNFX1NPVVJDRSwgXCJ1dGY4XCIpLFxuICAgICAgICBmaWxlTW9kZTogXCI2NDRcIixcbiAgICAgICAgZGlyZWN0b3J5TW9kZTogXCI3NTVcIixcbiAgICB9KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuc2V0IC1lXG4kU1VETyBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZFxuJFNVRE8gc3lzdGVtY3RsIGVuYWJsZSAke1NFUlZJQ0VfTkFNRX1cbiRTVURPIHN5c3RlbWN0bCByZXN0YXJ0ICR7U0VSVklDRV9OQU1FfWAsXG4gICAgfSk7XG5cbiAgICBsZXQgc3RhdHVzID0gKGF3YWl0IHJ1bk92ZXJTU0goe1xuICAgICAgICBob3N0LFxuICAgICAgICBzY3JpcHQ6IGBzeXN0ZW1jdGwgaXMtYWN0aXZlICR7U0VSVklDRV9OQU1FfSB8fCB0cnVlYCxcbiAgICAgICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICAgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChzdGF0dXMgIT09IFwiYWN0aXZlXCIpIHtcbiAgICAgICAgbGV0IGpvdXJuYWwgPSAoYXdhaXQgcnVuT3ZlclNTSCh7XG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gam91cm5hbGN0bCAtdSAke1NFUlZJQ0VfTkFNRX0gLW4gNDAgLS1uby1wYWdlciB8fCB0cnVlYCxcbiAgICAgICAgICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgICAgICAgfSkpLnN0ZG91dDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke1NFUlZJQ0VfTkFNRX0gdG8gYmUgYWN0aXZlIG9uICR7aG9zdH0sIHdhcyAke3N0YXR1c30uXFxuJHtqb3VybmFsLnNsaWNlKC0yMDAwKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgc3RpbGxSZWFjaGFibGUgPSBhd2FpdCBydW5PdmVyU1NIKHsgaG9zdCwgc2NyaXB0OiBcImVjaG8gcmVhY2hhYmxlXCIsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAoc3RpbGxSZWFjaGFibGUuc3Rkb3V0LnRyaW0oKSAhPT0gXCJyZWFjaGFibGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBzdGlsbCBiZSByZWFjaGFibGUgYWZ0ZXIgdGhlIGRhZW1vbiBzdGFydGVkLCBpdCBpcyBub3QuYFxuICAgICAgICAgICAgKyBgIENoZWNrIGNvbnNvbGUgYWNjZXNzIGltbWVkaWF0ZWx5LmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3Q6IHN0cmluZykge1xuICAgIGxldCBjb250ZW50cyA9IGF3YWl0IHJlYWRSZW1vdGVGaWxlKHsgaG9zdCwgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSBEaXNjb3JkIHdlYmhvb2sgYXQgJHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfSBvbiAke2hvc3R9LCBubyBzdWNoIGZpbGUgZXhpc3RzLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdpbGwgbm90IHN0YXJ0IHdpdGhvdXQgb25lLlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCBmaXJzdDpcXG4gIHlhcm4gc2V0dXBub3RpZnkgJHtob3N0fSA8ZGlzY29yZC13ZWJob29rLXVybD5gLnJlcGxhY2UoXCIgPGRpc2NvcmRcIiwgaG9zdCAmJiBcIiA8ZGlzY29yZFwiIHx8IFwiPGRpc2NvcmRcIilcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50cywgc291cmNlTmFtZTogYCR7aG9zdH06JHtERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIfWAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZFNvdXJjZShjb25maWc6IHsgaG9zdDogc3RyaW5nOyBrZXlQYXRoOiBzdHJpbmc7IHJlcG9VUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgaG9zdCwga2V5UGF0aCwgcmVwb1VSTCB9ID0gY29uZmlnO1xuICAgIGlmICghYXdhaXQgcGF0aEV4aXN0cyhrZXlQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgcHJpdmF0ZSBrZXkgYXQgJHtrZXlQYXRofSwgbm8gc3VjaCBmaWxlIGV4aXN0c2ApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyAke3JlcG9VUkx9IGlzIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH1gKTtcbiAgICBsZXQgcmVhY2hhYmxlID0gYXdhaXQgZ2l0V2l0aEtleSh7IGtleVBhdGgsIGFyZ3M6IFtcImxzLXJlbW90ZVwiLCByZXBvVVJMXSwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChyZWFjaGFibGUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGJlIHJlYWNoYWJsZSB3aXRoICR7a2V5UGF0aH0sIGdpdCBscy1yZW1vdGUgZmFpbGVkLmBcbiAgICAgICAgICAgICsgYCBUaGUgZGFlbW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGZldGNoIGtleXMuXFxuYFxuICAgICAgICAgICAgKyBgJHsocmVhY2hhYmxlLnN0ZG91dCArIHJlYWNoYWJsZS5zdGRlcnIpLnRyaW0oKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAocmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmluY2x1ZGVzKHJlcG9VUkwpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gYWxyZWFkeSBoYXMgJHtyZXBvVVJMfSwgcmVmcmVzaGluZyBpdHMga2V5IGFuZCB0aGUgZGFlbW9uLmApO1xuICAgIH1cblxuICAgIC8vIENvcGllZCBpbnRvIHBsYWNlIGJlZm9yZSBhbnl0aGluZyBlbHNlIG5lZWRzIGl0LiBUaGUgY2hlY2tzIGJlbG93IGxvb2sgdGhpcyBzb3VyY2UncyBrZXkgdXBcbiAgICAvLyB3aGVyZSB0aGUgbWFjaGluZSBrZWVwcyBpdCwgbm90IGF0IHRoZSBwYXRoIGl0IHdhcyBoYW5kZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgc28gYSBrZXkgdGhhdFxuICAgIC8vIGlzIHN0aWxsIG9ubHkgc2l0dGluZyBpbiB0aGUgY2FsbGVyJ3MgZGlyZWN0b3J5IHJlYWRzIGFzIG5vIGtleSBhdCBhbGwuXG4gICAgLy9cbiAgICAvLyBJbnRvIHRoZSBob21lIG9mIHdob2V2ZXIgdGhlIGRhZW1vbiBydW5zIGFzLCB3aGljaCBpcyB3aGVyZSBpdCBsb29rcy4gQXNrZWQgb2YgdGhlIGhvc3RcbiAgICAvLyByYXRoZXIgdGhhbiB3b3JrZWQgb3V0IGhlcmU6IHRoaXMgbWF5IGJlIHJ1bm5pbmcgb24gYSBtYWNoaW5lIHdpdGggbm8gc3VjaCB1c2VyLCBhbmQgd2l0aCBhXG4gICAgLy8gaG9tZSBkaXJlY3RvcnkgaW4gYW4gZW50aXJlbHkgZGlmZmVyZW50IHNoYXBlLlxuICAgIGxldCBob3N0S2V5c0RpcmVjdG9yeSA9IGF3YWl0IGRhZW1vbktleXNEaXIoaG9zdCk7XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9YCxcbiAgICAgICAgY29udGVudHM6IGF3YWl0IGZzLnJlYWRGaWxlKGtleVBhdGgsIFwidXRmOFwiKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjAwXCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG4gICAgLy8gVGhlIHB1YmxpYyBoYWxmIHRvbywgc28gdGhlIGRlcGxveSBrZXkgdGhhdCBhIHJlcG8gd2FzIGdpdmVuIGNhbiBiZSBsb29rZWQgdXAgb24gdGhlIG1hY2hpbmVcbiAgICAvLyB1c2luZyBpdCwgcmF0aGVyIHRoYW4gb25seSBpbiB3aGF0ZXZlciBnaXRodWIgc2hvd3MuXG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvc3RLZXlzRGlyZWN0b3J5fS8ke3NvdXJjZU5hbWUocmVwb1VSTCl9LnB1YmAsXG4gICAgICAgIGNvbnRlbnRzOiBhd2FpdCBwdWJsaWNLZXlPZihrZXlQYXRoKSxcbiAgICAgICAgZmlsZU1vZGU6IFwiNjQ0XCIsXG4gICAgICAgIGRpcmVjdG9yeU1vZGU6IFwiNzAwXCIsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbWVyZ2VkIHJlc3VsdCBpcyB3aGF0IHJvb3QgZW5kcyB1cCB3aXRoLCBzbyBvdXIgb3duIGtleSBoYXMgdG8gYmUgc29tZXdoZXJlIGluIGl0LiBPblxuICAgIC8vIHRoaXMgbWFjaGluZSB0aGVyZSBpcyBubyBzc2ggc2Vzc2lvbiB0byBwcmVzZXJ2ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBjaGVjay5cbiAgICBsZXQgb3VyRmluZ2VycHJpbnQgPSBcIlwiO1xuICAgIGlmIChob3N0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBvdXIgYWNjZXNzIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBzdXJ2aXZlcyB0aGUgbWVyZ2VkIGtleXNgKTtcbiAgICAgICAgb3VyRmluZ2VycHJpbnQgPSBhd2FpdCBmaW5kQXV0aGVudGljYXRpbmdGaW5nZXJwcmludChob3N0KTtcbiAgICB9XG4gICAgbGV0IGluc3BlY3Rpb25QYXRoID0gYXdhaXQgY2xvbmVSZXBvRm9ySW5zcGVjdGlvbih7IHJlcG9VUkwsIGtleVBhdGggfSk7XG4gICAgbGV0IG5ld0tleXMgPSBhd2FpdCByZWFkUmVwb0tleXMoaW5zcGVjdGlvblBhdGgpO1xuICAgIC8vIFdoYXRldmVyIGlzIGFwcGxpZWQgb24gdGhlIGhvc3QgY2FtZSBmcm9tIHRoZSBleGlzdGluZyBzb3VyY2VzLCBzbyBpdCBzdGF5cyBpbiB0aGUgbWVyZ2UuXG4gICAgbGV0IGV4aXN0aW5nS2V5cyA9IG5vcm1hbGl6ZUtleXMoYXdhaXQgcmVhZFJlbW90ZUZpbGUoeyBob3N0LCBmaWxlUGF0aDogUk9PVF9BVVRIT1JJWkVEX0tFWVMgfSkgfHwgXCJcIik7XG4gICAgbGV0IG1lcmdlZEZpbmdlcnByaW50cyA9IGF3YWl0IGZpbmdlcnByaW50S2V5cyhbLi4uZXhpc3RpbmdLZXlzLCAuLi5uZXdLZXlzXSk7XG4gICAgaWYgKG91ckZpbmdlcnByaW50ICYmICFtZXJnZWRGaW5nZXJwcmludHMuaW5jbHVkZXMob3VyRmluZ2VycHJpbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBiZSBpbiB0aGUgbWVyZ2VkIGtleXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICArIGBPdXJzOiAgICR7b3VyRmluZ2VycHJpbnR9XFxuYFxuICAgICAgICAgICAgKyBgTWVyZ2VkOiAke21lcmdlZEZpbmdlcnByaW50cy5qb2luKFwiXFxuICAgICAgICBcIikgfHwgXCIobm9uZSlcIn1cXG5gXG4gICAgICAgICAgICArIGBUaGUgZGFlbW9uIHJlcGxhY2VzIHJvb3QncyBhdXRob3JpemVkX2tleXMgd2l0aCB0aGUgbWVyZ2VkIHNvdXJjZXMsIHNvIHRoaXMgd291bGRgXG4gICAgICAgICAgICArIGAgbG9jayB5b3Ugb3V0IG9mICR7aG9zdH0uIEFkZCB5b3VyIHB1YmxpYyBrZXkgdG8gJHtyZXBvVVJMfSBmaXJzdC5gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChvdXJGaW5nZXJwcmludCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgT3VyIGtleSAke291ckZpbmdlcnByaW50fSBpcyBpbiB0aGUgbWVyZ2VkIGtleXMsIGFjY2VzcyB3aWxsIHN1cnZpdmUuYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlUmV2b2tlUmVwbyh7IGtleVBhdGgsIHJlcG9VUkwgfSk7XG5cbiAgICAvLyBEZXBsb3lpbmcgYSByZXBvIHRoYXQgc3RpbGwgaG9sZHMgYSByZXZva2VkIGtleSB3b3VsZCBoYW5kIGl0IGJhY2sgdG8gZXZlcnkgbWFjaGluZS5cbiAgICBsZXQgcmV2b2tlZCA9IGF3YWl0IHJldm9rZWRLZXlzSW5SZXBvKHsgcmVwb1BhdGg6IGluc3BlY3Rpb25QYXRoLCBzb3VyY2VVUkw6IHJlcG9VUkwgfSk7XG4gICAgaWYgKHJldm9rZWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCAke3JlcG9VUkx9IHRvIGhvbGQgbm8gcmV2b2tlZCBrZXlzLCBpdCBob2xkcyAke3Jldm9rZWQubGVuZ3RofTpcXG5gXG4gICAgICAgICAgICArIHJldm9rZWQubWFwKGVudHJ5ID0+IGAgICR7ZW50cnkucmV2b2NhdGlvbi5maW5nZXJwcmludH0gcmV2b2tlZCBieWBcbiAgICAgICAgICAgICAgICArIGAgJHtlbnRyeS5yZXZvY2F0aW9uLnJldm9rZWRCeSB8fCBcIj9cIn0gYWZ0ZXIgdXNlIGZyb20gJHtlbnRyeS5yZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiP1wifWApLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICAgICsgYFxcbkRlbGV0ZSB0aGVtIGZyb20gdGhlIHJlcG8sIG9yIHJ1biBcInlhcm4gdW5yZXZva2VcIiB0aGVyZSB0byBhbGxvdyB0aGVtIGFnYWluLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgd2ViaG9va1VSTCA9IGF3YWl0IHJlcXVpcmVSZW1vdGVXZWJob29rKGhvc3QpO1xuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbm90aWZpZXMgJHt3ZWJob29rVVJMfWApO1xuXG4gICAgbGV0IHJlcG9Tb3VyY2VzID0gcmVtb3RlQ29uZmlnLnJlcG9Tb3VyY2VzLmZpbHRlcihzb3VyY2UgPT4gc291cmNlICE9PSByZXBvVVJMKTtcbiAgICByZXBvU291cmNlcy5wdXNoKHJlcG9VUkwpO1xuICAgIGF3YWl0IGluc3RhbGxEYWVtb24oeyBob3N0LCBob3N0TGFiZWw6IHJlbW90ZUNvbmZpZy5ob3N0TGFiZWwsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke3JlcG9VUkx9IGFkZGVkIHRvICR7ZGVzY3JpYmVIb3N0KGhvc3QpfS4gJHtyZXBvU291cmNlcy5sZW5ndGh9IHNvdXJjZShzKSBub3cgbWVyZ2VkLmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVTb3VyY2UoY29uZmlnOiB7IGhvc3Q6IHN0cmluZzsgcmVwb1VSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBob3N0LCByZXBvVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJlbW90ZUNvbmZpZyA9IGF3YWl0IHJlYWRSZW1vdGVDb25maWcoaG9zdCk7XG4gICAgaWYgKCFyZW1vdGVDb25maWcucmVwb1NvdXJjZXMuaW5jbHVkZXMocmVwb1VSTCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkICR7cmVwb1VSTH0gdG8gYmUgYSBzb3VyY2Ugb24gJHtob3N0fSwgaXQgaXMgbm90LlxcbmBcbiAgICAgICAgICAgICsgYENvbmZpZ3VyZWQ6XFxuICAke3JlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5qb2luKFwiXFxuICBcIikgfHwgXCIobm9uZSlcIn1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXBvU291cmNlcyA9IHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5maWx0ZXIoc291cmNlID0+IHNvdXJjZSAhPT0gcmVwb1VSTCk7XG5cbiAgICAvLyBPbiB0aGlzIG1hY2hpbmUgdGhlcmUgaXMgbm8gc3NoIHNlc3Npb24gdG8gcHJlc2VydmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2suXG4gICAgaWYgKHJlcG9Tb3VyY2VzLmxlbmd0aCAmJiBob3N0KSB7XG4gICAgICAgIC8vIFRoZSBrZXlzIGxlZnQgb3ZlciBhcmUgd2hhdCByb290IGdldHMsIHNvIG91ciBvd24ga2V5IGhhcyB0byBiZSBhbW9uZyB0aGVtLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgb3VyIGFjY2VzcyB0byAke2Rlc2NyaWJlSG9zdChob3N0KX0gc3Vydml2ZXMgd2l0aG91dCAke3JlcG9VUkx9YCk7XG4gICAgICAgIGxldCBvdXJGaW5nZXJwcmludCA9IGF3YWl0IGZpbmRBdXRoZW50aWNhdGluZ0ZpbmdlcnByaW50KGhvc3QpO1xuICAgICAgICBsZXQgcmVtYWluaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHJlcG9Tb3VyY2VzKSB7XG4gICAgICAgICAgICByZW1haW5pbmdLZXlzLnB1c2goLi4uYXdhaXQgcmVhZFJlbW90ZVNvdXJjZUtleXMoeyBob3N0LCByZXBvVVJMOiBzb3VyY2UgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1haW5pbmdGaW5nZXJwcmludHMgPSBhd2FpdCBmaW5nZXJwcmludEtleXMocmVtYWluaW5nS2V5cyk7XG4gICAgICAgIGlmICghcmVtYWluaW5nRmluZ2VycHJpbnRzLmluY2x1ZGVzKG91ckZpbmdlcnByaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUga2V5IHdlIHVzZSBmb3IgJHtob3N0fSB0byBzdGlsbCBiZSBpbiB0aGUgcmVtYWluaW5nIHNvdXJjZXMsIGl0IGlzIG5vdC5cXG5gXG4gICAgICAgICAgICAgICAgKyBgT3VyczogICAgICAke291ckZpbmdlcnByaW50fVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1haW5pbmc6ICR7cmVtYWluaW5nRmluZ2VycHJpbnRzLmpvaW4oXCJcXG4gICAgICAgICAgIFwiKSB8fCBcIihub25lKVwifVxcbmBcbiAgICAgICAgICAgICAgICArIGBSZW1vdmluZyAke3JlcG9VUkx9IHdvdWxkIGxvY2sgeW91IG91dCBvZiAke2hvc3R9LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWVyZ2UsIHNvIHRoZSBkYWVtb24gbGVhdmVzIHJvb3QncyBhdXRob3JpemVkX2tleXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgY29uc29sZS5sb2coYCR7cmVwb1VSTH0gaXMgdGhlIGxhc3Qgc291cmNlLCBzbyByb290J3MgYXV0aG9yaXplZF9rZXlzIHN0YXlzIGFzIGl0IGlzIG5vdy5gKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBydW5PdmVyU1NIKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgc2NyaXB0OiBgJHtTVURPX1BSRUFNQkxFfVxuJFNVRE8gcm0gLWYgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9XCIgXCIke3NvdXJjZUtleVBhdGgocmVwb1VSTCl9LnB1YlwiIFwiJHtsZWdhY3lTb3VyY2VLZXlQYXRoKHJlcG9VUkwpfVwiXG4kU1VETyBybSAtcmYgXCIke3NvdXJjZVJlcG9QYXRoKHJlcG9VUkwpfVwiYCxcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiByZW1vdGVDb25maWcuaG9zdExhYmVsLCByZXBvU291cmNlcyB9KTtcbiAgICBjb25zb2xlLmxvZyhgJHtyZXBvVVJMfSByZW1vdmVkIGZyb20gJHtkZXNjcmliZUhvc3QoaG9zdCl9LiAke3JlcG9Tb3VyY2VzLmxlbmd0aH0gc291cmNlKHMpIGxlZnQuYCk7XG59XG5cbi8qKiBBbnN3ZXJzIFwid2hvIGNhbiBsb2cgaW50byB0aGlzIGJveCwgYW5kIHdoaWNoIHJlcG8gc2F5cyBzb1wiLiBUaGUgcGF0aHMgdGhlIGRhZW1vbiB1c2VzIGFyZVxuICAgIGxlZnQgb3V0IG9uIHB1cnBvc2UsIHRoZXkgYXJlIHBsdW1iaW5nIHJhdGhlciB0aGFuIHNvbWV0aGluZyB0byBhY3Qgb24uICovXG5cbi8qKiBQdXNoZXMgdGhlIGN1cnJlbnQgZGFlbW9uIG9udG8gYSBob3N0IHRoYXQgYWxyZWFkeSBoYXMgb25lLCBmb3Igd2hlbiB0aGlzIGNvZGUgaGFzIG1vdmVkIG9uLlxuICAgIE5vdGhpbmcgYWJvdXQgd2hpY2gga2V5cyB0aGUgaG9zdCB0cnVzdHMgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhZW1vbihob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkUmVtb3RlRmlsZSh7IGhvc3QsIGZpbGVQYXRoOiBSRU1PVEVfQ09ORklHX1BBVEggfSk7XG4gICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgJHtob3N0fSB0byBhbHJlYWR5IGhhdmUgcG9ydHNlY3VyZSwgJHtSRU1PVEVfQ09ORklHX1BBVEh9IGRvZXMgbm90IGV4aXN0LlxcbmBcbiAgICAgICAgICAgICsgYFNldCBpdCB1cCB3aXRoOlxcbiAgeWFybiBzZWN1cmVzc2ggJHtob3N0fSBhZGQgPHJlcG8tcHJpdmF0ZS1rZXk+IFtyZXBvLXVybF1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzKSBhcyB7IGhvc3RMYWJlbD86IHN0cmluZzsgcmVwb1NvdXJjZXM/OiBzdHJpbmdbXSB9O1xuICAgIGxldCByZXBvU291cmNlcyA9IHBhcnNlZC5yZXBvU291cmNlcyB8fCBbXTtcbiAgICBhd2FpdCByZXF1aXJlUmVtb3RlV2ViaG9vayhob3N0KTtcbiAgICBhd2FpdCBlbnN1cmVSZXZva2VSZXBvc0V4aXN0KHJlcG9Tb3VyY2VzKTtcbiAgICBhd2FpdCBpbnN0YWxsRGFlbW9uKHsgaG9zdCwgaG9zdExhYmVsOiBwYXJzZWQuaG9zdExhYmVsIHx8IGhvc3QsIHJlcG9Tb3VyY2VzIH0pO1xuICAgIGNvbnNvbGUubG9nKGBVcGRhdGVkIHRoZSBkYWVtb24gb24gJHtkZXNjcmliZUhvc3QoaG9zdCl9LCBhbmQgcmVzdGFydGVkIGl0LmApO1xuICAgIGNvbnNvbGUubG9nKGBJdHMgJHtyZXBvU291cmNlcy5sZW5ndGh9IGtleSBzb3VyY2Uocykgd2VyZSBsZWZ0IGFzIHRoZXkgYXJlLCBhbG9uZyB3aXRoIHRoZSBrZXlzIGFuZGApO1xuICAgIGNvbnNvbGUubG9nKGBzaWduZXJzIGl0IGhhcyBhbHJlYWR5IGFjY2VwdGVkLiBPbmx5IHRoZSBkYWVtb24gaXRzZWxmIGNoYW5nZWQ6YCk7XG4gICAgZm9yIChsZXQgcmVwb1VSTCBvZiByZXBvU291cmNlcykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke3JlcG9VUkx9YCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0U291cmNlcyhob3N0OiBzdHJpbmcpIHtcbiAgICBsZXQgcmVtb3RlQ29uZmlnID0gYXdhaXQgcmVhZFJlbW90ZUNvbmZpZyhob3N0KTtcbiAgICBpZiAoIXJlbW90ZUNvbmZpZy5yZXBvU291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7ZGVzY3JpYmVIb3N0KGhvc3QpfSBoYXMgbm8ga2V5IHNvdXJjZXMuIHJvb3QncyBhdXRob3JpemVkX2tleXMgaXMgbGVmdCBleGFjdGx5IGFzIGl0IGlzLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAke2Rlc2NyaWJlSG9zdChob3N0KX0gbGV0cyByb290IGxvZyBpbiB3aXRoIHRoZSBrZXlzIGZyb20gJHtyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RofSByZXBvKHMpOmApO1xuICAgIGxldCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByZXBvVVJMIG9mIHJlbW90ZUNvbmZpZy5yZXBvU291cmNlcykge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHJlYWRSZW1vdGVTb3VyY2VLZXlzKHsgaG9zdCwgcmVwb1VSTCB9KTtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtyZXBvVVJMfWApO1xuICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIGdyYW50cyBubyBrZXlzIC0gdGhlIGNoZWNrb3V0IGlzIG1pc3Npbmcgb3IgZW1wdHlgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgZ3JhbnRzICR7a2V5cy5sZW5ndGh9IGtleShzKTpgKTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAke3N1bW1hcml6ZUtleShrZXkpfWApO1xuICAgICAgICAgICAgbWVyZ2VkLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdGVDb25maWcucmVwb1NvdXJjZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgXFxuJHttZXJnZWQuc2l6ZX0ga2V5KHMpIGluIHRvdGFsIG9uY2UgZHVwbGljYXRlcyBhcmUgbWVyZ2VkLmApO1xuICAgIH1cbn1cblxuLyoqIFRoZSB2ZXJiIGlzIGEgZml4ZWQgd29yZCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uLCBzbyBpdCBpcyBwdWxsZWQgb3V0IG9mIHRoZSBhcmd1bWVudHMgd2hlcmV2ZXJcbiAgICBpdCB3YXMgdHlwZWQgYW5kIGV2ZXJ5dGhpbmcgbGVmdCBvdmVyIGlzIHBvc2l0aW9uYWwuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgdmVyYnMgPSBhcmd2LmZpbHRlcihhcmcgPT4gVkVSQlMuaW5jbHVkZXMoYXJnKSk7XG4gICAgaWYgKCF2ZXJicy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9IHNvbWV3aGVyZSBpbiB0aGUgYXJndW1lbnRzLCB3YXMgJHthcmd2LmpvaW4oXCIgXCIpIHx8IFwiKG5vdGhpbmcpXCJ9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbmUgb2YgJHtWRVJCUy5qb2luKFwiLCBcIil9LCB3YXMgJHt2ZXJicy5qb2luKFwiIGFuZCBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgbGV0IHZlcmIgPSB2ZXJic1swXTtcbiAgICBsZXQgcG9zaXRpb25hbCA9IGFyZ3YuZmlsdGVyKGFyZyA9PiBhcmcgIT09IHZlcmIpO1xuICAgIC8vIEEgaG9zdCwgd2hlbiB0aGVyZSBpcyBvbmUsIGNvbWVzIGZpcnN0IGFuZCBpcyBhIGJhcmUgbmFtZSBvciBhZGRyZXNzLiBFdmVyeXRoaW5nIGVsc2UgdGhhdFxuICAgIC8vIGNhbiBhcHBlYXIgaGVyZSBpcyBhIHBhdGggb3IgYSByZXBvIHVybCwgYW5kIHRob3NlIGFsbCBjYXJyeSBhIHNsYXNoLCB3aGljaCBpcyB3aGF0IHRlbGxzXG4gICAgLy8gdGhlbSBhcGFydC4gU28gbm8gaG9zdCBhdCBhbGwgbWVhbnMgdGhpcyBtYWNoaW5lLlxuICAgIGxldCBob3N0ID0gVEhJU19NQUNISU5FO1xuICAgIGlmIChwb3NpdGlvbmFsLmxlbmd0aCAmJiAhL1tcXC9+XFxcXF0vLnRlc3QocG9zaXRpb25hbFswXSkpIHtcbiAgICAgICAgaG9zdCA9IHBvc2l0aW9uYWxbMF07XG4gICAgICAgIHBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IGFyZ3VtZW50cyBlYWNoIHZlcmIgdGFrZXMsIGNoZWNrZWQgaGVyZSByYXRoZXIgdGhhbiB3aGVyZSB0aGUgdmVyYiBpcyBhY3RlZCBvbiwgc29cbiAgICAvLyB0aGF0IGEgY29tbWFuZCB3aGljaCB3YXMgdHlwZWQgd3Jvbmcgc2F5cyBzbyBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb21wbGFpbmVkIGFib3V0LlxuICAgIGlmICh2ZXJiID09PSBcImxpc3RcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdGhpbmcgYWZ0ZXIgbGlzdCwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIgJiYgcG9zaXRpb25hbC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3RoaW5nIGFmdGVyIHVwZGF0ZSwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpXFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwiYWRkXCIgJiYgKCFwb3NpdGlvbmFsLmxlbmd0aCB8fCBwb3NpdGlvbmFsLmxlbmd0aCA+IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBwcml2YXRlIGtleSBhbmQgb3B0aW9uYWxseSBhIHJlcG8gdXJsLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICBpZiAodmVyYiA9PT0gXCJyZW1vdmVcIiAmJiBwb3NpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0IGEgcmVwbyB1cmwgdG8gcmVtb3ZlLCB3YXMgJHtwb3NpdGlvbmFsLmxlbmd0aH0gYXJndW1lbnQocylcXG4ke1VTQUdFfWApO1xuICAgIH1cbiAgICByZXR1cm4geyB2ZXJiLCBob3N0LCByZXN0OiBwb3NpdGlvbmFsIH07XG59XG5cbi8qKiBFdmVyeXRoaW5nIGhlcmUgaXMgcm9vdCdzOiByb290J3MgYXV0aG9yaXplZF9rZXlzLCByb290J3Mga2V5cyBkaXJlY3RvcnksIHRoZSBzc2hkIGNvbmZpZywgdGhlXG4gICAgc3lzdGVtZCB1bml0LiBSdW4gYXMgYW55b25lIGVsc2UgaXQgcmVhZHMgYSBkaWZmZXJlbnQgaG9tZSBhbmQgd3JpdGVzIGZpbGVzIHRoZSBkYWVtb24gd2lsbFxuICAgIG5ldmVyIHNlZSwgYW5kIGl0IGdldHMgdGhlcmUgc2V2ZXJhbCBzdGVwcyBpbiByYXRoZXIgdGhhbiBmYWlsaW5nIGF0IHRoZSBzdGFydC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVSb290KCkge1xuICAgIGxldCB1aWQgPSBwcm9jZXNzLmdldHVpZD8uKCk7XG4gICAgaWYgKHVpZCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdG8gYmUgcnVubmluZyBhcyByb290LCBpcyB1aWQgJHt1aWQgPz8gXCJ1bmtub3duXCJ9LlxcbmBcbiAgICAgICAgICAgICsgYFJlcnVuIHRoaXMgd2l0aCBzdWRvLmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIC8vIFdoYXQgd2FzIHR5cGVkIGlzIGNoZWNrZWQgYmVmb3JlIGFueXRoaW5nIGFib3V0IHRoaXMgbWFjaGluZSBpcy4gQSBjb21tYW5kIHRoYXQgZG9lcyBub3RcbiAgICAvLyBtYWtlIHNlbnNlIGlzIHdvcnRoIHNheWluZyBzbyBhYm91dCB3aG9ldmVyIGlzIHJ1bm5pbmcgaXQsIGFuZCBiZWluZyB0b2xkIHRvIGZpbmQgc3VkbyBvbmx5XG4gICAgLy8gdG8gdGhlbiBiZSB0b2xkIHRoZSBhcmd1bWVudHMgd2VyZSB3cm9uZyBpcyB0d28gdHJpcHMgZm9yIG9uZSBtaXN0YWtlLlxuICAgIGxldCB7IHZlcmIsIGhvc3QsIHJlc3QgfSA9IHBhcnNlQXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuICAgIC8vIFdpdGggYSBob3N0LCBldmVyeXRoaW5nIHJvb3Qtb3duZWQgaGFwcGVucyBvbiB0aGF0IGhvc3QgdGhyb3VnaCAkU1VETyBvdmVyIHNzaCwgc28gYmVpbmcgcm9vdCBoZXJlIHByb3ZlcyBub3RoaW5nIGFuZCB3b3VsZCBibG9jayBydW5uaW5nIHRoaXMgZnJvbSBhIHdvcmtzdGF0aW9uLlxuICAgIGlmIChob3N0ID09PSBUSElTX01BQ0hJTkUpIHtcbiAgICAgICAgcmVxdWlyZVJvb3QoKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYiA9PT0gXCJsaXN0XCIpIHtcbiAgICAgICAgYXdhaXQgbGlzdFNvdXJjZXMoaG9zdCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZlcmIgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlRGFlbW9uKGhvc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2ZXJiID09PSBcImFkZFwiKSB7XG4gICAgICAgIGF3YWl0IGFkZFNvdXJjZSh7IGhvc3QsIGtleVBhdGg6IGV4cGFuZEhvbWUocmVzdFswXSksIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMV0pIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVNvdXJjZSh7IGhvc3QsIHJlcG9VUkw6IGF3YWl0IHJlc29sdmVSZXBvVVJMKHJlc3RbMF0pIH0pO1xufVxuIl19
615
+ /* _JS_SOURCE_HASH = "c0e9a0f32fba6a35cf6b2f90b3887a3cf5174cfaa9758d11e43b148ad66349c3"; */