obsidian-integration-testing 4.1.5 → 4.2.0

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 (33) hide show
  1. package/dist/lib/cjs/context-id.cjs +1 -1
  2. package/dist/lib/cjs/context-provider.cjs +17 -6
  3. package/dist/lib/cjs/context-provider.d.cts +21 -4
  4. package/dist/lib/cjs/enable-plugin.cjs +1 -1
  5. package/dist/lib/cjs/eval-in-obsidian.cjs +2 -2
  6. package/dist/lib/cjs/index.cjs +3 -1
  7. package/dist/lib/cjs/index.d.cts +2 -2
  8. package/dist/lib/cjs/jest/global-setup.cjs +2 -1
  9. package/dist/lib/cjs/library.cjs +1 -1
  10. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  11. package/dist/lib/cjs/obsidian-executable.cjs +95 -0
  12. package/dist/lib/cjs/obsidian-executable.d.cts +24 -0
  13. package/dist/lib/cjs/transport-desktop-cdp.cjs +8 -9
  14. package/dist/lib/cjs/transport-desktop-cli.cjs +8 -9
  15. package/dist/lib/cjs/vitest/global-setup.cjs +2 -1
  16. package/dist/lib/esm/context-id.mjs +1 -1
  17. package/dist/lib/esm/context-provider.d.mts +21 -4
  18. package/dist/lib/esm/context-provider.mjs +14 -5
  19. package/dist/lib/esm/enable-plugin.mjs +1 -1
  20. package/dist/lib/esm/eval-in-obsidian.mjs +6 -3
  21. package/dist/lib/esm/index.d.mts +2 -2
  22. package/dist/lib/esm/index.mjs +6 -2
  23. package/dist/lib/esm/jest/global-setup.mjs +6 -2
  24. package/dist/lib/esm/library.mjs +1 -1
  25. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  26. package/dist/lib/esm/obsidian-executable.d.mts +24 -0
  27. package/dist/lib/esm/obsidian-executable.mjs +61 -0
  28. package/dist/lib/esm/transport-desktop-cdp.mjs +8 -9
  29. package/dist/lib/esm/transport-desktop-cli.mjs +8 -9
  30. package/dist/lib/esm/vitest/global-setup.mjs +6 -2
  31. package/dist/obsidian-integration-testing-4.2.0.tgz +0 -0
  32. package/package.json +7 -7
  33. package/dist/obsidian-integration-testing-4.1.5.tgz +0 -0
@@ -24,6 +24,7 @@ import {
24
24
  registerVaultInConfig,
25
25
  removeVaultFromConfig
26
26
  } from "./obsidian-config.mjs";
27
+ import { resolveObsidianExecutable } from "./obsidian-executable.mjs";
27
28
  import { serializeError } from "./serialize-error.mjs";
28
29
  const UNABLE_TO_FIND_OBSIDIAN = "unable to find Obsidian";
29
30
  const AUTO_START_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
@@ -271,8 +272,9 @@ ${diagnostics}`);
271
272
  */
272
273
  async ensureObsidianRunningAndRetry(command, cwd) {
273
274
  log("[cli-transport] Obsidian is not running. Starting Obsidian...");
275
+ const launchCommand = await getObsidianLaunchCommand();
274
276
  try {
275
- await exec(getObsidianLaunchCommand(), { isQuiet: true });
277
+ await exec(launchCommand, { isQuiet: true });
276
278
  } catch {
277
279
  }
278
280
  log(`[cli-transport] Polling for Obsidian CLI (timeout=${String(AUTO_START_TIMEOUT_IN_MILLISECONDS)}ms)...`);
@@ -436,15 +438,12 @@ function getKillObsidianCommand() {
436
438
  }
437
439
  return "pkill -f Obsidian";
438
440
  }
439
- function getObsidianLaunchCommand() {
441
+ async function getObsidianLaunchCommand() {
442
+ const exePath = await resolveObsidianExecutable();
440
443
  if (process.platform === "win32") {
441
- const localAppData = process.env["LOCALAPPDATA"] ?? "";
442
- return `start "" "${localAppData}\\Programs\\Obsidian\\Obsidian.exe"`;
444
+ return `start "" "${exePath}"`;
443
445
  }
444
- if (process.platform === "darwin") {
445
- return "/Applications/Obsidian.app/Contents/MacOS/Obsidian &";
446
- }
447
- return "obsidian &";
446
+ return `"${exePath}" &`;
448
447
  }
449
448
  function getOpenUriCommand(uri) {
450
449
  if (process.platform === "win32") {
@@ -485,4 +484,4 @@ export {
485
484
  DesktopCliTransport,
486
485
  invokeAndWriteResult
487
486
  };
488
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAubWpzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL25vb3AubWpzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNsaUluQ29uZmlnLFxuICBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoLFxuICBnZXRSZWdpc3RlcmVkVmF1bHRzLFxuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRPcGVuLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcubWpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IubWpzJztcblxuaW50ZXJmYWNlIEV4ZWN1dGVTY3JpcHRGaWxlRnNQcm9taXNlcyB7XG4gIGFjY2VzcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICByZWFkRmlsZShwYXRoOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXMge1xuICB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRQYXJhbXMge1xuICBldmFsdWF0ZSgpOiBQcm9taXNlPHVua25vd24+O1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNlcmlhbGl6ZUVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuaW50ZXJmYWNlIEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgY3dkOiBzdHJpbmc7XG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdFBhdGg6IHN0cmluZztcbiAgc2NyaXB0Q29udGVudDogc3RyaW5nO1xuICBzY3JpcHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgdGhlIGBvYnNpZGlhbiBldmFsYCBDTEkgY29tbWFuZFxuICogYW5kIG1hbmFnZXMgdmF1bHRzIHZpYSBFbGVjdHJvbiBJUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2xpVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5qc2ApO1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBqb2luKHNjcmlwdERpciwgYCR7c2NyaXB0SWR9LnJlc3VsdC5qc29uYCk7XG5cbiAgICBhd2FpdCBta2RpcihzY3JpcHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uLCByZXN1bHRQYXRoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyaXB0UGF0aCwgc2NyaXB0Q29udGVudCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FmZVNjcmlwdFBhdGggPSBzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IGNsaUV4cHIgPSBgKCR7Z2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGV4ZWN1dGVTY3JpcHRGaWxlKX0pKCR7SlNPTi5zdHJpbmdpZnkoc2FmZVNjcmlwdFBhdGgpfSlgO1xuICAgICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQob3B0aW9ucy5jd2QpO1xuICAgICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4odmF1bHRJZCA/IFtgdmF1bHQ9JHt2YXVsdElkfWBdIDogW10pLCAnZXZhbCcsICctLWFsbG93LWZvY3VzLXN0ZWFsJywgYGNvZGU9JHtjbGlFeHByfWBdO1xuXG4gICAgICBsZXQgZXhlY1Jlc3VsdDogRXhlY1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgYnVpbGREaWFnbm9zdGljcyh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGV4ZWNSZXN1bHQsXG4gICAgICAgICAgcmVzdWx0UGF0aCxcbiAgICAgICAgICBzY3JpcHRDb250ZW50LFxuICAgICAgICAgIHNjcmlwdFBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH1cXG4ke2RpYWdub3N0aWNzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC4gSWYgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWRcbiAgICogYnV0IG5vdCBvcGVuLCBvcGVucyBpdCB2aWEgVVJJIHByb3RvY29sIGFuZCBwb2xscyB1bnRpbCBpdCBpcyByZWFkeS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ0xJIGlzIGRpc2FibGVkIGluIG9ic2lkaWFuLmpzb24uIEVuYWJsaW5nIGFuZCByZXN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG4gICAgICBlbmFibGVDbGlJbkNvbmZpZygpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFzc2VydENsaUF2YWlsYWJsZSgpO1xuXG4gICAgaWYgKCFpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWdpc3RlcmVkIGJ1dCBub3Qgb3BlbjogJHt2YXVsdFBhdGh9LiBPcGVuaW5nIHZpYSBVUkkuLi5gKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIEVsZWN0cm9uIElQQy5cbiAgICpcbiAgICogVXNlcyBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgdmF1bHQncyBDTEkgaXMgcmVhZHkgYW5kIGBnZXRCYXNlUGF0aCgpYCBtYXRjaGVzIGB2YXVsdFBhdGhgLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKGV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJyB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVnaXN0ZXJFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgcmVnaXN0ZXJlZC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHRvIHRhcmdldCBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQ2xpY2tzIHRoZSBcIlRydXN0IGF1dGhvciBhbmQgZW5hYmxlIHBsdWdpbnNcIiBidXR0b24gKGAubW9kLWN0YWApIGluc2lkZSBhbnlcbiAgICogbW9kYWwgd2hvc2UgdGV4dCBpbmNsdWRlcyBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIuIFRoaXMgaXMgbmVlZGVkIHdoZW4gYVxuICAgKiB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCB3aXRob3V0IGEgcHJpb3IgYGVuYWJsZS1wbHVnaW4tPGlkPmBcbiAgICogZW50cnkgaW4gbG9jYWxTdG9yYWdlIChlLmcuLCB0aGUgdmVyeSBmaXJzdCB2YXVsdCByZWdpc3RlcmVkIHZpYSBjb25maWcgZmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgY29uc3QgZGlzbWlzc0V4cHIgPSBgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1jb250YWluZXInKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtb2RhbHNbaV0udGV4dENvbnRlbnQuaW5jbHVkZXMoJ0RvIHlvdSB0cnVzdCB0aGUgYXV0aG9yJykpIHtcbiAgICAgICAgICB2YXIgYnRuID0gbW9kYWxzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5tb2QtY3RhJyk7XG4gICAgICAgICAgaWYgKGJ0bikgeyBidG4uY2xpY2soKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKClgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZGlzbWlzc0V4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKiBAcGFyYW0gZXZhbFRhcmdldFZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBhcyBldmFsIHRhcmdldCAoYW4gZXhpc3RpbmcsIGxvYWRlZCB2YXVsdCkuXG4gICAqICAgbG9jYWxTdG9yYWdlIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIE9ic2lkaWFuIHdpbmRvd3MgKHNhbWUgRWxlY3Ryb24gb3JpZ2luKSwgc28gdGhlXG4gICAqICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtYCBjYWxsIGNhbiBydW4gaW4gYW55IGxvYWRlZCB2YXVsdCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGg6IHN0cmluZywgZXZhbFRhcmdldFZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXZhbFRhcmdldFZhdWx0UGF0aCk7XG4gICAgY29uc3QgZW5hYmxlRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5zZXRMb2NhbFN0b3JhZ2VJdGVtKCR7SlNPTi5zdHJpbmdpZnkoeyBrZXk6IGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gLCB2YWx1ZTogJ3RydWUnIH0pfSlgO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSB2YXVsdCBpcyByZWFkeSBhbmQgcmVzcG9uZGluZyB0byBldmFsIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXhwciA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJztcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNCb290c3RyYXBwZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKHBvbGxFeHByLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShiYXNlUGF0aCkgPT09IHZhdWx0UGF0aCkge1xuICAgICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGlzIHJlYWR5LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IG5vdCByZWFkeSB5ZXQgXHUyMDE0IG5hbWVzcGFjZSBtYXkgbm90IGJlIGJvb3RzdHJhcHBlZCB5ZXQgZWl0aGVyLlxuICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0cyBPYnNpZGlhbiBieSBraWxsaW5nIHRoZSBydW5uaW5nIHByb2Nlc3MgYW5kIHJlbGF1bmNoaW5nIGl0LlxuICAgKlxuICAgKiBVc2VkIHdoZW4gYSBjb25maWcgY2hhbmdlIChsaWtlIGVuYWJsaW5nIENMSSkgcmVxdWlyZXMgYSByZXN0YXJ0IHRvIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGZvciBwb2xsaW5nIGFmdGVyIHJlc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3RhcnRPYnNpZGlhbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIEtpbGxpbmcgT2JzaWRpYW4gcHJvY2Vzcy4uLicpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHJvY2VzcyBtYXkgbm90IGJlIHJ1bm5pbmcgXHUyMDE0IHRoYXQncyBmaW5lLlxuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCByZXN0YXJ0VmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsIC4uLihyZXN0YXJ0VmF1bHRJZCA/IFtgdmF1bHQ9JHtyZXN0YXJ0VmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnY29kZT1cIjFcIiddO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgdmF1bHRQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhIEpTT04gZmlsZS5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbnZvY2F0aW9uIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VBbmRXcml0ZVJlc3VsdChwYXJhbXM6IEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSB3aW5kb3cuYXBwIGlzIHNldCBieSBPYnNpZGlhbiBhdCBydW50aW1lLlxuICBjb25zdCBmc1Byb21pc2VzID0gUmVmbGVjdC5nZXQod2luZG93LmFwcC52YXVsdC5hZGFwdGVyLCAnZnNQcm9taXNlcycpIGFzIEludm9rZUFuZFdyaXRlUmVzdWx0RnNQcm9taXNlcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZXZhbHVhdGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnbnVsbCcsIHZhbHVlOiAnJyB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmcgLS0gSW50ZW50aW9uYWw6IHJlc3VsdCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24uXG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogU3RyaW5nKHJlc3VsdCkgfSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHBhcmFtcy5zZXJpYWxpemVFcnJvcihlcnIpIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGFpbGVkIGRpYWdub3N0aWMgc3RyaW5nIGZvciB0aGUgXCJTY3JpcHQgZGlkIG5vdCBleGVjdXRlXCIgZXJyb3IuXG4gKlxuICogUGVyZm9ybXMgbGl2ZSBlbnZpcm9ubWVudCBjaGVja3MgKHByb2Nlc3MgbGlzdCwgdmF1bHQgcmVnaXN0cnksIENMSSBjb25maWcpXG4gKiBhbmQgaW5jbHVkZXMgdGhlIGNvbW1hbmQsIGV4ZWMgb3V0cHV0LCBhbmQgc2NyaXB0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaWFnbm9zdGljIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkaWFnbm9zdGljIHN0cmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGREaWFnbm9zdGljcyhwYXJhbXM6IEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKGAgIENvbW1hbmQ6ICR7cGFyYW1zLmNvbW1hbmQuam9pbignICcpfWApO1xuICBsaW5lcy5wdXNoKGAgIFdvcmtpbmcgZGlyZWN0b3J5OiAke3BhcmFtcy5jd2R9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IHBhdGg6ICR7cGFyYW1zLnNjcmlwdFBhdGh9YCk7XG4gIGxpbmVzLnB1c2goYCAgRXhwZWN0ZWQgcmVzdWx0IGZpbGU6ICR7cGFyYW1zLnJlc3VsdFBhdGh9YCk7XG5cbiAgaWYgKHBhcmFtcy5leGVjUmVzdWx0KSB7XG4gICAgbGluZXMucHVzaChgICBFeGl0IGNvZGU6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUgPT09IG51bGwgPyAnKG51bGwgXHUyMDE0IHByb2Nlc3MgZGlkIG5vdCBleGl0IG5vcm1hbGx5KScgOiBTdHJpbmcocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUpfWApO1xuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIEV4aXQgc2lnbmFsOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRTaWduYWx9YCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0ZG91dDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRlcnI6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpICYmICFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKCcgIHN0ZG91dC9zdGRlcnI6IChlbXB0eSknKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICBleGVjIHJlc3VsdDogKG5vdCBhdmFpbGFibGUgXHUyMDE0IE9ic2lkaWFuIHdhcyBhdXRvLXN0YXJ0ZWQgYW5kIHJldHJpZWQpJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdFbnZpcm9ubWVudCBjaGVja3M6Jyk7XG4gIGxpbmVzLnB1c2goYCAgT2JzaWRpYW4gcnVubmluZzogJHthd2FpdCBpc09ic2lkaWFuUnVubmluZygpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIENMSSBlbmFibGVkIGluIG9ic2lkaWFuLmpzb246ICR7aXNDbGlFbmFibGVkKCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgVmF1bHQgcmVnaXN0ZXJlZDogJHtpc1ZhdWx0UmVnaXN0ZXJlZChwYXJhbXMuY3dkKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBTY3JpcHQgZmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhwYXJhbXMuc2NyaXB0UGF0aCkgPyAneWVzJyA6ICdubyAoYWxyZWFkeSBjbGVhbmVkIHVwKSd9YCk7XG4gIGxpbmVzLnB1c2goYCAgUmVzdWx0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnJlc3VsdFBhdGgpID8gJ3llcycgOiAnbm8nfWApO1xuXG4gIGNvbnN0IHJlZ2lzdGVyZWRWYXVsdHMgPSBnZXRSZWdpc3RlcmVkVmF1bHRzKCk7XG4gIGlmIChyZWdpc3RlcmVkVmF1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6IChub25lKScpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6Jyk7XG4gICAgZm9yIChjb25zdCB2YXVsdCBvZiByZWdpc3RlcmVkVmF1bHRzKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgLSAke3ZhdWx0LnBhdGh9IChvcGVuOiAke1N0cmluZyh2YXVsdC5vcGVuKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaChgICBTY3JpcHQgY29udGVudDpcXG4ke3BhcmFtcy5zY3JpcHRDb250ZW50fWApO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUuXG4gKlxuICogU2VyaWFsaXplcyB7QGxpbmsgaW52b2tlQW5kV3JpdGVSZXN1bHR9IGludG8gYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXRcbiAqIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgKG9yIGVycm9yKSB0byBgcmVzdWx0UGF0aGAuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIHJlc3VsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcmVzdWx0IGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm5TdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoaW52b2tlQW5kV3JpdGVSZXN1bHQpO1xuICBjb25zdCBzZXJpYWxpemVFcnJvclN0ciA9IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcik7XG4gIGNvbnN0IHJlc3VsdFBhdGhKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICByZXR1cm4gYCgke2ZuU3RyfSkoeyBldmFsdWF0ZTogYXN5bmMgKCkgPT4gKCR7ZXhwcmVzc2lvbn0pLCByZXN1bHRQYXRoOiAke3Jlc3VsdFBhdGhKc29ufSwgc2VyaWFsaXplRXJyb3I6ICR7c2VyaWFsaXplRXJyb3JTdHJ9IH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIHNjcmlwdCBmaWxlIGZyb20gZGlzaywgbG9ncyBpdHMgY29udGVudCwgYW5kIGV4ZWN1dGVzIGl0IHZpYSBgbmV3IEZ1bmN0aW9uYC5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjcmlwdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgc2NyaXB0IGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHRGaWxlKHNjcmlwdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXM7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmc1Byb21pc2VzLmFjY2VzcyhzY3JpcHRQYXRoKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBmaWxlIG5vdCBmb3VuZDogJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cblxuICBjb25zdCBzY3JpcHQgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKHNjcmlwdFBhdGgsICd1dGYtOCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBEaWFnbm9zdGljIGxvZ2dpbmcgaW5zaWRlIE9ic2lkaWFuIHByb2Nlc3M7IG5vIGxvZ2dlciBhdmFpbGFibGUuXG4gIGNvbnNvbGUuZGVidWcoYEV4ZWN1dGluZyAke3NjcmlwdFBhdGh9OlxcbiR7c2NyaXB0fWApO1xuXG4gIGxldCBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbCwgbm8tbmV3LWZ1bmMgLS0gVGhlIHNjcmlwdCBpcyBhIHRydXN0ZWQsIHNlbGYtZ2VuZXJhdGVkIElJRkUgZXhwcmVzc2lvbi5cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7c2NyaXB0fWApIGFzICgpID0+IFByb21pc2U8dm9pZD47XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZXhlY3V0aW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBraWxsIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiAndGFza2tpbGwgL0lNIE9ic2lkaWFuLmV4ZSAvRic7XG4gIH1cblxuICByZXR1cm4gJ3BraWxsIC1mIE9ic2lkaWFuJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCB0aGUgT2JzaWRpYW4gYmluYXJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgbG9jYWxBcHBEYXRhID0gcHJvY2Vzcy5lbnZbJ0xPQ0FMQVBQREFUQSddID8/ICcnO1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7bG9jYWxBcHBEYXRhfVxcXFxQcm9ncmFtc1xcXFxPYnNpZGlhblxcXFxPYnNpZGlhbi5leGVcImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuICYnO1xuICB9XG5cbiAgcmV0dXJuICdvYnNpZGlhbiAmJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIG9wZW4gYSBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gb3Blbi5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblVyaUNvbW1hbmQodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBgb3BlbiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIHJldHVybiBgeGRnLW9wZW4gXCIke3VyaX1cImA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyAndGFza2xpc3QgL0ZJIFwiSU1BR0VOQU1FIGVxIE9ic2lkaWFuLmV4ZVwiIC9OSCdcbiAgICA6ICdwZ3JlcCAtZiBPYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIHJldHVybiBvdXRwdXQuaW5jbHVkZXMoJ09ic2lkaWFuLmV4ZScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVucyBhIHZhdWx0IGluIE9ic2lkaWFuIHVzaW5nIHRoZSBgb2JzaWRpYW46Ly9vcGVuYCBVUkkgcHJvdG9jb2wuXG4gKlxuICogVGhpcyB3b3JrcyB3aGV0aGVyIE9ic2lkaWFuIGlzIGFscmVhZHkgcnVubmluZyAoc2lnbmFscyBpdCB0byBvcGVuIHRoZSB2YXVsdClcbiAqIG9yIG5vdCAobGF1bmNoZXMgT2JzaWRpYW4gd2l0aCB0aGUgdmF1bHQpLiBUaGUgVVJJIHByb3RvY29sIGlzIGhhbmRsZWQgYnkgdGhlXG4gKiBPUywgd2hpY2ggcm91dGVzIGl0IHRvIHRoZSByZWdpc3RlcmVkIE9ic2lkaWFuIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICBpZiAoIXZhdWx0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIHZhdWx0IHZpYSBVUkk6IHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIG9ic2lkaWFuLmpzb246ICR7dmF1bHRQYXRofWApO1xuICB9XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/dmF1bHQ9JHtlbmNvZGVVUklDb21wb25lbnQodmF1bHRJZCl9YDtcbiAgY29uc3QgY29tbWFuZCA9IGdldE9wZW5VcmlDb21tYW5kKHVyaSk7XG4gIGxvZyhgW2NsaS10cmFuc3BvcnRdIE9wZW5pbmcgdmF1bHQgdmlhIFVSSTogJHt1cml9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVVJJIG9wZW4gZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBU0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBUXBCLFNBQVMsWUFBWTtBQUNyQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsc0JBQXNCO0FBNkIvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQWVwQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVDLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCM0IsTUFBYSxTQUFTLFlBQW9CLFNBQWdEO0FBQ3hGLFVBQU0sY0FBYztBQUNwQixVQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLE1BQU0sV0FBVztBQUN4RCxVQUFNLFlBQVksS0FBSyxPQUFPLEdBQUcsOEJBQThCO0FBQy9ELFVBQU0sYUFBYSxLQUFLLFdBQVcsR0FBRyxRQUFRLEtBQUs7QUFDbkQsVUFBTSxhQUFhLEtBQUssV0FBVyxHQUFHLFFBQVEsY0FBYztBQUU1RCxVQUFNLE1BQU0sV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRTFDLFVBQU0sZ0JBQWdCLGdCQUFnQixZQUFZLFVBQVU7QUFDNUQsVUFBTSxVQUFVLFlBQVksYUFBYTtBQUV6QyxRQUFJO0FBQ0YsWUFBTSxpQkFBaUIsV0FBVyxRQUFRLE9BQU8sR0FBRztBQUNwRCxZQUFNLFVBQVUsSUFBSSw0QkFBNEIsaUJBQWlCLENBQUMsS0FBSyxLQUFLLFVBQVUsY0FBYyxDQUFDO0FBQ3JHLFlBQU0sVUFBVSxXQUFXLFFBQVEsR0FBRztBQUN0QyxZQUFNLFVBQVUsQ0FBQyxZQUFZLEdBQUksVUFBVSxDQUFDLFNBQVMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFJLFFBQVEsdUJBQXVCLFFBQVEsT0FBTyxFQUFFO0FBRXZILFVBQUk7QUFDSixVQUFJO0FBQ0YscUJBQWEsTUFBTSxLQUFLLFNBQVM7QUFBQSxVQUMvQixLQUFLLFFBQVE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULHNCQUFzQjtBQUFBLFVBQ3RCLEdBQUksUUFBUSwwQkFBMEIsVUFBYSxFQUFFLHVCQUF1QixRQUFRLHNCQUFzQjtBQUFBLFFBQzVHLENBQUM7QUFBQSxNQUNILFNBQVMsT0FBTztBQUNkLGNBQU0sVUFBVSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQ3JFLFlBQUksUUFBUSxTQUFTLHVCQUF1QixHQUFHO0FBQzdDLGdCQUFNLEtBQUssOEJBQThCLFNBQVMsUUFBUSxHQUFHO0FBQUEsUUFDL0QsT0FBTztBQUNMLGdCQUFNO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLENBQUMsV0FBVyxVQUFVLEdBQUc7QUFDM0IsY0FBTSxjQUFjLE1BQU0saUJBQWlCO0FBQUEsVUFDekM7QUFBQSxVQUNBLEtBQUssUUFBUTtBQUFBLFVBQ2I7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNGLENBQUM7QUFDRCxjQUFNLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxHQUFHO0FBQUEsRUFBSyxXQUFXLEVBQUU7QUFBQSxNQUNuRjtBQUVBLFlBQU0sWUFBWSxNQUFNLFNBQVMsWUFBWSxPQUFPO0FBQ3BELFlBQU0sV0FBVyxLQUFLLE1BQU0sU0FBUztBQUVyQyxVQUFJLFVBQVUsVUFBVTtBQUN0QixZQUFJLFNBQVMsU0FBUyxTQUFTO0FBQzdCLGdCQUFNLElBQUksTUFBTSxzQ0FBc0MsUUFBUSxHQUFHLEtBQUssU0FBUyxLQUFLLEVBQUU7QUFBQSxRQUN4RjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTyxTQUFTO0FBQUEsSUFDbEIsVUFBRTtBQUNBLFlBQU0sT0FBTyxVQUFVLEVBQUUsTUFBTSxJQUFJO0FBQ25DLFlBQU0sT0FBTyxVQUFVLEVBQUUsTUFBTSxJQUFJO0FBQUEsSUFDckM7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxNQUFhLGVBQWUsV0FBa0M7QUFDNUQsUUFBSSxzREFBc0QsU0FBUyxFQUFFO0FBQ3JFLFFBQUksQ0FBQyxrQkFBa0IsU0FBUyxHQUFHO0FBQ2pDLFlBQU0sSUFBSTtBQUFBLFFBQ1Isd0NBQXdDLFNBQVM7QUFBQSxNQUNuRDtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsYUFBYSxHQUFHO0FBQ25CLFVBQUksdUZBQXVGO0FBQzNGLHdCQUFrQjtBQUNsQixZQUFNLEtBQUssZ0JBQWdCLFNBQVM7QUFBQSxJQUN0QztBQUVBLFVBQU0sS0FBSyxtQkFBbUI7QUFFOUIsUUFBSSxDQUFDLFlBQVksU0FBUyxHQUFHO0FBQzNCLFVBQUkscURBQXFELFNBQVMsc0JBQXNCO0FBQ3hGLFlBQU0sZ0JBQWdCLFNBQVM7QUFDL0IsWUFBTSxLQUFLLGVBQWUsU0FBUztBQUFBLElBQ3JDO0FBRUEsUUFBSSx5Q0FBeUM7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsY0FBYyxXQUFrQztBQUMzRCxRQUFJLHNDQUFzQyxTQUFTLEVBQUU7QUFDckQsVUFBTSxvQkFBb0IsMEJBQTBCO0FBRXBELFFBQUksbUJBQW1CO0FBQ3JCLFlBQU0sNEJBQTRCLE1BQU0saUJBQWlCO0FBQ3pELFlBQU0sZUFBZSxtREFBbUQsS0FBSyxVQUFVLEVBQUUsTUFBTSxDQUFDLFdBQVcsS0FBSyxHQUFHLFNBQVMsYUFBYSxDQUFDLENBQUM7QUFDM0ksWUFBTSxLQUFLLFNBQVMsY0FBYyxFQUFFLEtBQUssa0JBQWtCLENBQUM7QUFDNUQsWUFBTSxLQUFLLDRCQUE0QixXQUFXLGlCQUFpQjtBQUFBLElBQ3JFLE9BQU87QUFDTCxVQUFJLGdHQUFnRztBQUNwRyw0QkFBc0IsU0FBUztBQUMvQixVQUFJLHdFQUF3RTtBQUM1RSxZQUFNLGdCQUFnQixTQUFTO0FBQy9CLFlBQU0sS0FBSyxlQUFlLFNBQVM7QUFDbkMsWUFBTSxLQUFLLDRCQUE0QixXQUFXLFNBQVM7QUFDM0QsWUFBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3ZDO0FBQUEsSUFDRjtBQUVBLFVBQU0sS0FBSyxlQUFlLFNBQVM7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsZ0JBQWdCLFdBQWtDO0FBQzdELFFBQUksMkRBQTJELFNBQVMsS0FBSztBQUM3RSxRQUFJO0FBQ0YsWUFBTSw0QkFBNEIsTUFBTSxTQUFTO0FBQ2pELFlBQU0sY0FBYztBQUNwQixZQUFNLEtBQUssU0FBUyxhQUFhLEVBQUUsS0FBSyxXQUFXLHVCQUF1QixtQ0FBbUMsQ0FBQztBQUM5RyxVQUFJLDhDQUE4QztBQUFBLElBQ3BELFNBQVMsT0FBZ0I7QUFDdkIsVUFBSSxzREFBc0QsZUFBZSxLQUFLLENBQUMsRUFBRTtBQUFBLElBQ25GO0FBRUEsUUFBSSxnREFBZ0Q7QUFDcEQsVUFBTSxNQUFNLGlDQUFpQztBQUU3QyxRQUFJLGlEQUFpRDtBQUNyRCxVQUFNLDBCQUEwQiwwQkFBMEI7QUFDMUQsUUFBSTtBQUNGLFVBQUkseUJBQXlCO0FBQzNCLGNBQU0sNEJBQTRCLE1BQU0sdUJBQXVCO0FBQy9ELGNBQU0sYUFBYSxtREFBbUQsS0FBSyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLGVBQWUsQ0FBQyxDQUFDO0FBQ3BJLGNBQU0sS0FBSyxTQUFTLFlBQVksRUFBRSxLQUFLLHlCQUF5Qix1QkFBdUIsbUNBQW1DLENBQUM7QUFBQSxNQUM3SCxPQUFPO0FBQ0wsWUFBSSwwR0FBcUc7QUFDekcsOEJBQXNCLFNBQVM7QUFBQSxNQUNqQztBQUNBLFVBQUksOENBQThDO0FBQUEsSUFDcEQsU0FBUyxPQUFnQjtBQUN2QixVQUFJLDhEQUE4RCxlQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDM0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFjLHFCQUFvQztBQUNoRCxVQUFNLFVBQVUsUUFBUSxhQUFhLFVBQVUsdUJBQXVCO0FBQ3RFLFFBQUk7QUFDRixZQUFNLEtBQUssU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDdkMsUUFBUTtBQUNOLFlBQU0sSUFBSSxNQUFNLDBGQUEwRjtBQUFBLElBQzVHO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZQSxNQUFjLG1CQUFtQixXQUFrQztBQUNqRSxVQUFNLDRCQUE0QixNQUFNLFNBQVM7QUFDakQsVUFBTSxjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVXBCLFVBQU0sU0FBUyxNQUFNLEtBQUssU0FBUyxhQUFhLEVBQUUsS0FBSyxVQUFVLENBQUM7QUFDbEUsUUFBSSxXQUFXLFFBQVE7QUFDckIsVUFBSSw2REFBNkQ7QUFBQSxJQUNuRTtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZUEsTUFBYyw0QkFBNEIsV0FBbUIscUJBQTRDO0FBQ3ZHLFVBQU0sVUFBVSxXQUFXLFNBQVM7QUFDcEMsUUFBSSxDQUFDLFNBQVM7QUFDWixVQUFJLGtGQUE2RTtBQUNqRjtBQUFBLElBQ0Y7QUFFQSxVQUFNLDRCQUE0QixNQUFNLG1CQUFtQjtBQUMzRCxVQUFNLGFBQWEsMkRBQTJELEtBQUssVUFBVSxFQUFFLEtBQUssaUJBQWlCLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQ2hKLFVBQU0sS0FBSyxTQUFTLFlBQVksRUFBRSxLQUFLLG9CQUFvQixDQUFDO0FBQzVELFFBQUkscUNBQXFDLE9BQU8sbUJBQW1CO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWMsOEJBQThCLFNBQW1CLEtBQTRCO0FBQ3pGLFFBQUksK0RBQStEO0FBRW5FLFFBQUk7QUFDRixZQUFNLEtBQUsseUJBQXlCLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQzFELFFBQVE7QUFBQSxJQUVSO0FBRUEsUUFBSSxxREFBcUQsT0FBTyxrQ0FBa0MsQ0FBQyxRQUFRO0FBQzNHLFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsWUFBTSxNQUFNLHdDQUF3QztBQUNwRCxVQUFJO0FBQ0YsY0FBTSxLQUFLLFNBQVMsRUFBRSxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQzFDLFlBQUkseUNBQXlDO0FBQzdDO0FBQUEsTUFDRixTQUFTLE9BQU87QUFDZCxjQUFNLFVBQVUsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSztBQUNyRSxZQUFJLENBQUMsUUFBUSxTQUFTLHVCQUF1QixHQUFHO0FBQzlDLGdCQUFNO0FBQUEsUUFDUjtBQUNBLFlBQUkscURBQXFEO0FBQUEsTUFDM0Q7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLE1BQU0saUNBQWlDLE9BQU8sa0NBQWtDLENBQUMsS0FBSztBQUFBLEVBQ2xHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYyxlQUFlLFdBQWtDO0FBQzdELFVBQU0sV0FBVztBQUVqQixRQUFJLHdEQUF3RCxPQUFPLGtDQUFrQyxDQUFDLFFBQVE7QUFDOUcsVUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFFBQUksaUJBQWlCO0FBQ3JCLFdBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFJO0FBQ0YsWUFBSSxDQUFDLGdCQUFnQjtBQUNuQixnQkFBTSw0QkFBNEIsTUFBTSxTQUFTO0FBQ2pELDJCQUFpQjtBQUFBLFFBQ25CO0FBQ0EsY0FBTSxXQUFXLE1BQU0sS0FBSyxTQUFTLFVBQVUsRUFBRSxLQUFLLFVBQVUsQ0FBQztBQUNqRSxZQUFJLEtBQUssTUFBTSxRQUFRLE1BQU0sV0FBVztBQUN0QyxjQUFJLGlDQUFpQztBQUNyQztBQUFBLFFBQ0Y7QUFBQSxNQUNGLFFBQVE7QUFFTix5QkFBaUI7QUFBQSxNQUNuQjtBQUNBLFlBQU0sTUFBTSxtQ0FBbUM7QUFBQSxJQUNqRDtBQUNBLFVBQU0sSUFBSSxNQUFNLFlBQVksU0FBUyxnQ0FBZ0MsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJO0FBQUEsRUFDckg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYyxnQkFBZ0IsV0FBa0M7QUFDOUQsUUFBSSw2Q0FBNkM7QUFDakQsUUFBSTtBQUNGLFlBQU0sS0FBSyx1QkFBdUIsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDeEQsUUFBUTtBQUFBLElBRVI7QUFFQSxVQUFNLE1BQU0saUNBQWlDO0FBRTdDLFVBQU0saUJBQWlCLFdBQVcsU0FBUztBQUMzQyxVQUFNLFVBQVUsQ0FBQyxZQUFZLEdBQUksaUJBQWlCLENBQUMsU0FBUyxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUksUUFBUSxVQUFVO0FBQ3ZHLFVBQU0sS0FBSyw4QkFBOEIsU0FBUyxTQUFTO0FBQUEsRUFDN0Q7QUFDRjtBQVVBLGVBQXNCLHFCQUFxQixRQUFtRDtBQUU1RixRQUFNLGFBQWEsUUFBUSxJQUFJLE9BQU8sSUFBSSxNQUFNLFNBQVMsWUFBWTtBQUNyRSxNQUFJO0FBQ0YsVUFBTSxTQUFTLE1BQU0sT0FBTyxTQUFTO0FBQ3JDLFFBQUksV0FBVyxRQUFXO0FBQ3hCLFlBQU0sV0FBVyxVQUFVLE9BQU8sWUFBWSxLQUFLLFVBQVUsRUFBRSxNQUFNLGFBQWEsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQ2hHLFdBQVcsV0FBVyxNQUFNO0FBQzFCLFlBQU0sV0FBVyxVQUFVLE9BQU8sWUFBWSxLQUFLLFVBQVUsRUFBRSxNQUFNLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQzNGLE9BQU87QUFFTCxZQUFNLFdBQVcsVUFBVSxPQUFPLFlBQVksS0FBSyxVQUFVLEVBQUUsT0FBTyxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFBQSxJQUN6RjtBQUFBLEVBQ0YsU0FBUyxLQUFLO0FBQ1osVUFBTSxXQUFXLFVBQVUsT0FBTyxZQUFZLEtBQUssVUFBVSxFQUFFLE1BQU0sU0FBUyxPQUFPLE9BQU8sZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQUEsRUFDcEg7QUFDRjtBQVdBLGVBQWUsaUJBQWlCLFFBQWlEO0FBQy9FLFFBQU0sUUFBa0IsQ0FBQztBQUV6QixRQUFNLEtBQUssY0FBYyxPQUFPLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRTtBQUNuRCxRQUFNLEtBQUssd0JBQXdCLE9BQU8sR0FBRyxFQUFFO0FBQy9DLFFBQU0sS0FBSyxrQkFBa0IsT0FBTyxVQUFVLEVBQUU7QUFDaEQsUUFBTSxLQUFLLDJCQUEyQixPQUFPLFVBQVUsRUFBRTtBQUV6RCxNQUFJLE9BQU8sWUFBWTtBQUNyQixVQUFNLEtBQUssZ0JBQWdCLE9BQU8sV0FBVyxhQUFhLE9BQU8sZ0RBQTJDLE9BQU8sT0FBTyxXQUFXLFFBQVEsQ0FBQyxFQUFFO0FBQ2hKLFFBQUksT0FBTyxXQUFXLFlBQVk7QUFDaEMsWUFBTSxLQUFLLGtCQUFrQixPQUFPLFdBQVcsVUFBVSxFQUFFO0FBQUEsSUFDN0Q7QUFDQSxRQUFJLE9BQU8sV0FBVyxPQUFPLEtBQUssR0FBRztBQUNuQyxZQUFNLEtBQUssYUFBYSxPQUFPLFdBQVcsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLElBQzNEO0FBQ0EsUUFBSSxPQUFPLFdBQVcsT0FBTyxLQUFLLEdBQUc7QUFDbkMsWUFBTSxLQUFLLGFBQWEsT0FBTyxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUMzRDtBQUNBLFFBQUksQ0FBQyxPQUFPLFdBQVcsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLFdBQVcsT0FBTyxLQUFLLEdBQUc7QUFDeEUsWUFBTSxLQUFLLDBCQUEwQjtBQUFBLElBQ3ZDO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxLQUFLLDZFQUF3RTtBQUFBLEVBQ3JGO0FBRUEsUUFBTSxLQUFLLHFCQUFxQjtBQUNoQyxRQUFNLEtBQUssdUJBQXVCLE1BQU0sa0JBQWtCLElBQUksUUFBUSxJQUFJLEVBQUU7QUFDNUUsUUFBTSxLQUFLLG1DQUFtQyxhQUFhLElBQUksUUFBUSxJQUFJLEVBQUU7QUFDN0UsUUFBTSxLQUFLLHVCQUF1QixrQkFBa0IsT0FBTyxHQUFHLElBQUksUUFBUSxJQUFJLEVBQUU7QUFDaEYsUUFBTSxLQUFLLHlCQUF5QixXQUFXLE9BQU8sVUFBVSxJQUFJLFFBQVEseUJBQXlCLEVBQUU7QUFDdkcsUUFBTSxLQUFLLHlCQUF5QixXQUFXLE9BQU8sVUFBVSxJQUFJLFFBQVEsSUFBSSxFQUFFO0FBRWxGLFFBQU0sbUJBQW1CLG9CQUFvQjtBQUM3QyxNQUFJLGlCQUFpQixXQUFXLEdBQUc7QUFDakMsVUFBTSxLQUFLLDZCQUE2QjtBQUFBLEVBQzFDLE9BQU87QUFDTCxVQUFNLEtBQUssc0JBQXNCO0FBQ2pDLGVBQVcsU0FBUyxrQkFBa0I7QUFDcEMsWUFBTSxLQUFLLFNBQVMsTUFBTSxJQUFJLFdBQVcsT0FBTyxNQUFNLElBQUksQ0FBQyxHQUFHO0FBQUEsSUFDaEU7QUFBQSxFQUNGO0FBRUEsUUFBTSxLQUFLO0FBQUEsRUFBc0IsT0FBTyxhQUFhLEVBQUU7QUFFdkQsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQVlBLFNBQVMsZ0JBQWdCLFlBQW9CLFlBQTRCO0FBQ3ZFLFFBQU0sUUFBUSw0QkFBNEIsb0JBQW9CO0FBQzlELFFBQU0sb0JBQW9CLDRCQUE0QixjQUFjO0FBQ3BFLFFBQU0saUJBQWlCLEtBQUssVUFBVSxXQUFXLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDcEUsU0FBTyxJQUFJLEtBQUssOEJBQThCLFVBQVUsa0JBQWtCLGNBQWMscUJBQXFCLGlCQUFpQjtBQUNoSTtBQVFBLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxTQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDOUIsZUFBVyxTQUFTLEVBQUU7QUFBQSxFQUN4QixDQUFDO0FBQ0g7QUFVQSxlQUFlLGtCQUFrQixZQUFtQztBQUVsRSxRQUFNLGFBQWEsUUFBUSxJQUFJLE9BQU8sSUFBSSxNQUFNLFNBQVMsWUFBWTtBQUVyRSxNQUFJO0FBQ0YsVUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ3BDLFNBQVMsT0FBTztBQUNkLFVBQU0sSUFBSSxNQUFNLDBCQUEwQixVQUFVLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxFQUNuRTtBQUVBLFFBQU0sU0FBUyxNQUFNLFdBQVcsU0FBUyxZQUFZLE9BQU87QUFFNUQsVUFBUSxNQUFNLGFBQWEsVUFBVTtBQUFBLEVBQU0sTUFBTSxFQUFFO0FBRW5ELE1BQUk7QUFDSixNQUFJO0FBRUYsU0FBSyxJQUFJLFNBQVMsVUFBVSxNQUFNLEVBQUU7QUFBQSxFQUN0QyxTQUFTLE9BQU87QUFDZCxVQUFNLElBQUksTUFBTSxpQkFBaUIsVUFBVSxJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQUEsRUFDMUQ7QUFFQSxNQUFJO0FBQ0YsVUFBTSxHQUFHO0FBQUEsRUFDWCxTQUFTLE9BQU87QUFDZCxVQUFNLElBQUksTUFBTSxtQkFBbUIsVUFBVSxJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQUEsRUFDNUQ7QUFDRjtBQU9BLFNBQVMseUJBQWlDO0FBQ3hDLE1BQUksUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLDJCQUFtQztBQUMxQyxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0sZUFBZSxRQUFRLElBQUksY0FBYyxLQUFLO0FBQ3BELFdBQU8sYUFBYSxZQUFZO0FBQUEsRUFDbEM7QUFFQSxNQUFJLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUNUO0FBUUEsU0FBUyxrQkFBa0IsS0FBcUI7QUFDOUMsTUFBSSxRQUFRLGFBQWEsU0FBUztBQUNoQyxXQUFPLGFBQWEsR0FBRztBQUFBLEVBQ3pCO0FBRUEsTUFBSSxRQUFRLGFBQWEsVUFBVTtBQUNqQyxXQUFPLFNBQVMsR0FBRztBQUFBLEVBQ3JCO0FBRUEsU0FBTyxhQUFhLEdBQUc7QUFDekI7QUFPQSxlQUFlLG9CQUFzQztBQUNuRCxRQUFNLFVBQVUsUUFBUSxhQUFhLFVBQ2pDLGlEQUNBO0FBQ0osTUFBSTtBQUNGLFVBQU0sU0FBUyxNQUFNLEtBQUssU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3BELFFBQUksUUFBUSxhQUFhLFNBQVM7QUFDaEMsYUFBTyxPQUFPLFNBQVMsY0FBYztBQUFBLElBQ3ZDO0FBQ0EsV0FBTyxPQUFPLEtBQUssRUFBRSxTQUFTO0FBQUEsRUFDaEMsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFXQSxlQUFlLGdCQUFnQixXQUFrQztBQUMvRCxRQUFNLFVBQVUsV0FBVyxTQUFTO0FBQ3BDLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJLE1BQU0sd0VBQXdFLFNBQVMsRUFBRTtBQUFBLEVBQ3JHO0FBQ0EsUUFBTSxNQUFNLHlCQUF5QixtQkFBbUIsT0FBTyxDQUFDO0FBQ2hFLFFBQU0sVUFBVSxrQkFBa0IsR0FBRztBQUNyQyxNQUFJLDBDQUEwQyxHQUFHLEVBQUU7QUFDbkQsTUFBSTtBQUNGLFVBQU0sS0FBSyxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN2QyxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksZ0RBQWdELGVBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUM3RTtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
487
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAubWpzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL25vb3AubWpzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNsaUluQ29uZmlnLFxuICBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoLFxuICBnZXRSZWdpc3RlcmVkVmF1bHRzLFxuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRPcGVuLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcubWpzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUubWpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IubWpzJztcblxuaW50ZXJmYWNlIEV4ZWN1dGVTY3JpcHRGaWxlRnNQcm9taXNlcyB7XG4gIGFjY2VzcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICByZWFkRmlsZShwYXRoOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXMge1xuICB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRQYXJhbXMge1xuICBldmFsdWF0ZSgpOiBQcm9taXNlPHVua25vd24+O1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNlcmlhbGl6ZUVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuaW50ZXJmYWNlIEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgY3dkOiBzdHJpbmc7XG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdFBhdGg6IHN0cmluZztcbiAgc2NyaXB0Q29udGVudDogc3RyaW5nO1xuICBzY3JpcHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgdGhlIGBvYnNpZGlhbiBldmFsYCBDTEkgY29tbWFuZFxuICogYW5kIG1hbmFnZXMgdmF1bHRzIHZpYSBFbGVjdHJvbiBJUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2xpVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5qc2ApO1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBqb2luKHNjcmlwdERpciwgYCR7c2NyaXB0SWR9LnJlc3VsdC5qc29uYCk7XG5cbiAgICBhd2FpdCBta2RpcihzY3JpcHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uLCByZXN1bHRQYXRoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyaXB0UGF0aCwgc2NyaXB0Q29udGVudCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FmZVNjcmlwdFBhdGggPSBzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IGNsaUV4cHIgPSBgKCR7Z2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGV4ZWN1dGVTY3JpcHRGaWxlKX0pKCR7SlNPTi5zdHJpbmdpZnkoc2FmZVNjcmlwdFBhdGgpfSlgO1xuICAgICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQob3B0aW9ucy5jd2QpO1xuICAgICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4odmF1bHRJZCA/IFtgdmF1bHQ9JHt2YXVsdElkfWBdIDogW10pLCAnZXZhbCcsICctLWFsbG93LWZvY3VzLXN0ZWFsJywgYGNvZGU9JHtjbGlFeHByfWBdO1xuXG4gICAgICBsZXQgZXhlY1Jlc3VsdDogRXhlY1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgYnVpbGREaWFnbm9zdGljcyh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGV4ZWNSZXN1bHQsXG4gICAgICAgICAgcmVzdWx0UGF0aCxcbiAgICAgICAgICBzY3JpcHRDb250ZW50LFxuICAgICAgICAgIHNjcmlwdFBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH1cXG4ke2RpYWdub3N0aWNzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC4gSWYgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWRcbiAgICogYnV0IG5vdCBvcGVuLCBvcGVucyBpdCB2aWEgVVJJIHByb3RvY29sIGFuZCBwb2xscyB1bnRpbCBpdCBpcyByZWFkeS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ0xJIGlzIGRpc2FibGVkIGluIG9ic2lkaWFuLmpzb24uIEVuYWJsaW5nIGFuZCByZXN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG4gICAgICBlbmFibGVDbGlJbkNvbmZpZygpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFzc2VydENsaUF2YWlsYWJsZSgpO1xuXG4gICAgaWYgKCFpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWdpc3RlcmVkIGJ1dCBub3Qgb3BlbjogJHt2YXVsdFBhdGh9LiBPcGVuaW5nIHZpYSBVUkkuLi5gKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIEVsZWN0cm9uIElQQy5cbiAgICpcbiAgICogVXNlcyBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgdmF1bHQncyBDTEkgaXMgcmVhZHkgYW5kIGBnZXRCYXNlUGF0aCgpYCBtYXRjaGVzIGB2YXVsdFBhdGhgLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKGV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJyB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVnaXN0ZXJFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgcmVnaXN0ZXJlZC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHRvIHRhcmdldCBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQ2xpY2tzIHRoZSBcIlRydXN0IGF1dGhvciBhbmQgZW5hYmxlIHBsdWdpbnNcIiBidXR0b24gKGAubW9kLWN0YWApIGluc2lkZSBhbnlcbiAgICogbW9kYWwgd2hvc2UgdGV4dCBpbmNsdWRlcyBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIuIFRoaXMgaXMgbmVlZGVkIHdoZW4gYVxuICAgKiB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCB3aXRob3V0IGEgcHJpb3IgYGVuYWJsZS1wbHVnaW4tPGlkPmBcbiAgICogZW50cnkgaW4gbG9jYWxTdG9yYWdlIChlLmcuLCB0aGUgdmVyeSBmaXJzdCB2YXVsdCByZWdpc3RlcmVkIHZpYSBjb25maWcgZmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgY29uc3QgZGlzbWlzc0V4cHIgPSBgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1jb250YWluZXInKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtb2RhbHNbaV0udGV4dENvbnRlbnQuaW5jbHVkZXMoJ0RvIHlvdSB0cnVzdCB0aGUgYXV0aG9yJykpIHtcbiAgICAgICAgICB2YXIgYnRuID0gbW9kYWxzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5tb2QtY3RhJyk7XG4gICAgICAgICAgaWYgKGJ0bikgeyBidG4uY2xpY2soKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKClgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZGlzbWlzc0V4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKiBAcGFyYW0gZXZhbFRhcmdldFZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBhcyBldmFsIHRhcmdldCAoYW4gZXhpc3RpbmcsIGxvYWRlZCB2YXVsdCkuXG4gICAqICAgbG9jYWxTdG9yYWdlIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIE9ic2lkaWFuIHdpbmRvd3MgKHNhbWUgRWxlY3Ryb24gb3JpZ2luKSwgc28gdGhlXG4gICAqICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtYCBjYWxsIGNhbiBydW4gaW4gYW55IGxvYWRlZCB2YXVsdCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGg6IHN0cmluZywgZXZhbFRhcmdldFZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXZhbFRhcmdldFZhdWx0UGF0aCk7XG4gICAgY29uc3QgZW5hYmxlRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5zZXRMb2NhbFN0b3JhZ2VJdGVtKCR7SlNPTi5zdHJpbmdpZnkoeyBrZXk6IGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gLCB2YWx1ZTogJ3RydWUnIH0pfSlgO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICBjb25zdCBsYXVuY2hDb21tYW5kID0gYXdhaXQgZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMobGF1bmNoQ29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSB2YXVsdCBpcyByZWFkeSBhbmQgcmVzcG9uZGluZyB0byBldmFsIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXhwciA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJztcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNCb290c3RyYXBwZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKHBvbGxFeHByLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShiYXNlUGF0aCkgPT09IHZhdWx0UGF0aCkge1xuICAgICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGlzIHJlYWR5LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IG5vdCByZWFkeSB5ZXQgXHUyMDE0IG5hbWVzcGFjZSBtYXkgbm90IGJlIGJvb3RzdHJhcHBlZCB5ZXQgZWl0aGVyLlxuICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0cyBPYnNpZGlhbiBieSBraWxsaW5nIHRoZSBydW5uaW5nIHByb2Nlc3MgYW5kIHJlbGF1bmNoaW5nIGl0LlxuICAgKlxuICAgKiBVc2VkIHdoZW4gYSBjb25maWcgY2hhbmdlIChsaWtlIGVuYWJsaW5nIENMSSkgcmVxdWlyZXMgYSByZXN0YXJ0IHRvIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGZvciBwb2xsaW5nIGFmdGVyIHJlc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3RhcnRPYnNpZGlhbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIEtpbGxpbmcgT2JzaWRpYW4gcHJvY2Vzcy4uLicpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHJvY2VzcyBtYXkgbm90IGJlIHJ1bm5pbmcgXHUyMDE0IHRoYXQncyBmaW5lLlxuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCByZXN0YXJ0VmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsIC4uLihyZXN0YXJ0VmF1bHRJZCA/IFtgdmF1bHQ9JHtyZXN0YXJ0VmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnY29kZT1cIjFcIiddO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgdmF1bHRQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhIEpTT04gZmlsZS5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbnZvY2F0aW9uIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VBbmRXcml0ZVJlc3VsdChwYXJhbXM6IEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSB3aW5kb3cuYXBwIGlzIHNldCBieSBPYnNpZGlhbiBhdCBydW50aW1lLlxuICBjb25zdCBmc1Byb21pc2VzID0gUmVmbGVjdC5nZXQod2luZG93LmFwcC52YXVsdC5hZGFwdGVyLCAnZnNQcm9taXNlcycpIGFzIEludm9rZUFuZFdyaXRlUmVzdWx0RnNQcm9taXNlcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZXZhbHVhdGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnbnVsbCcsIHZhbHVlOiAnJyB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmcgLS0gSW50ZW50aW9uYWw6IHJlc3VsdCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24uXG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogU3RyaW5nKHJlc3VsdCkgfSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHBhcmFtcy5zZXJpYWxpemVFcnJvcihlcnIpIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGFpbGVkIGRpYWdub3N0aWMgc3RyaW5nIGZvciB0aGUgXCJTY3JpcHQgZGlkIG5vdCBleGVjdXRlXCIgZXJyb3IuXG4gKlxuICogUGVyZm9ybXMgbGl2ZSBlbnZpcm9ubWVudCBjaGVja3MgKHByb2Nlc3MgbGlzdCwgdmF1bHQgcmVnaXN0cnksIENMSSBjb25maWcpXG4gKiBhbmQgaW5jbHVkZXMgdGhlIGNvbW1hbmQsIGV4ZWMgb3V0cHV0LCBhbmQgc2NyaXB0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaWFnbm9zdGljIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkaWFnbm9zdGljIHN0cmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGREaWFnbm9zdGljcyhwYXJhbXM6IEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKGAgIENvbW1hbmQ6ICR7cGFyYW1zLmNvbW1hbmQuam9pbignICcpfWApO1xuICBsaW5lcy5wdXNoKGAgIFdvcmtpbmcgZGlyZWN0b3J5OiAke3BhcmFtcy5jd2R9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IHBhdGg6ICR7cGFyYW1zLnNjcmlwdFBhdGh9YCk7XG4gIGxpbmVzLnB1c2goYCAgRXhwZWN0ZWQgcmVzdWx0IGZpbGU6ICR7cGFyYW1zLnJlc3VsdFBhdGh9YCk7XG5cbiAgaWYgKHBhcmFtcy5leGVjUmVzdWx0KSB7XG4gICAgbGluZXMucHVzaChgICBFeGl0IGNvZGU6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUgPT09IG51bGwgPyAnKG51bGwgXHUyMDE0IHByb2Nlc3MgZGlkIG5vdCBleGl0IG5vcm1hbGx5KScgOiBTdHJpbmcocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUpfWApO1xuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIEV4aXQgc2lnbmFsOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRTaWduYWx9YCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0ZG91dDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRlcnI6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpICYmICFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKCcgIHN0ZG91dC9zdGRlcnI6IChlbXB0eSknKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICBleGVjIHJlc3VsdDogKG5vdCBhdmFpbGFibGUgXHUyMDE0IE9ic2lkaWFuIHdhcyBhdXRvLXN0YXJ0ZWQgYW5kIHJldHJpZWQpJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdFbnZpcm9ubWVudCBjaGVja3M6Jyk7XG4gIGxpbmVzLnB1c2goYCAgT2JzaWRpYW4gcnVubmluZzogJHthd2FpdCBpc09ic2lkaWFuUnVubmluZygpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIENMSSBlbmFibGVkIGluIG9ic2lkaWFuLmpzb246ICR7aXNDbGlFbmFibGVkKCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgVmF1bHQgcmVnaXN0ZXJlZDogJHtpc1ZhdWx0UmVnaXN0ZXJlZChwYXJhbXMuY3dkKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBTY3JpcHQgZmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhwYXJhbXMuc2NyaXB0UGF0aCkgPyAneWVzJyA6ICdubyAoYWxyZWFkeSBjbGVhbmVkIHVwKSd9YCk7XG4gIGxpbmVzLnB1c2goYCAgUmVzdWx0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnJlc3VsdFBhdGgpID8gJ3llcycgOiAnbm8nfWApO1xuXG4gIGNvbnN0IHJlZ2lzdGVyZWRWYXVsdHMgPSBnZXRSZWdpc3RlcmVkVmF1bHRzKCk7XG4gIGlmIChyZWdpc3RlcmVkVmF1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6IChub25lKScpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6Jyk7XG4gICAgZm9yIChjb25zdCB2YXVsdCBvZiByZWdpc3RlcmVkVmF1bHRzKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgLSAke3ZhdWx0LnBhdGh9IChvcGVuOiAke1N0cmluZyh2YXVsdC5vcGVuKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaChgICBTY3JpcHQgY29udGVudDpcXG4ke3BhcmFtcy5zY3JpcHRDb250ZW50fWApO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUuXG4gKlxuICogU2VyaWFsaXplcyB7QGxpbmsgaW52b2tlQW5kV3JpdGVSZXN1bHR9IGludG8gYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXRcbiAqIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgKG9yIGVycm9yKSB0byBgcmVzdWx0UGF0aGAuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIHJlc3VsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcmVzdWx0IGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm5TdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoaW52b2tlQW5kV3JpdGVSZXN1bHQpO1xuICBjb25zdCBzZXJpYWxpemVFcnJvclN0ciA9IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcik7XG4gIGNvbnN0IHJlc3VsdFBhdGhKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICByZXR1cm4gYCgke2ZuU3RyfSkoeyBldmFsdWF0ZTogYXN5bmMgKCkgPT4gKCR7ZXhwcmVzc2lvbn0pLCByZXN1bHRQYXRoOiAke3Jlc3VsdFBhdGhKc29ufSwgc2VyaWFsaXplRXJyb3I6ICR7c2VyaWFsaXplRXJyb3JTdHJ9IH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIHNjcmlwdCBmaWxlIGZyb20gZGlzaywgbG9ncyBpdHMgY29udGVudCwgYW5kIGV4ZWN1dGVzIGl0IHZpYSBgbmV3IEZ1bmN0aW9uYC5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjcmlwdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgc2NyaXB0IGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHRGaWxlKHNjcmlwdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXM7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmc1Byb21pc2VzLmFjY2VzcyhzY3JpcHRQYXRoKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBmaWxlIG5vdCBmb3VuZDogJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cblxuICBjb25zdCBzY3JpcHQgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKHNjcmlwdFBhdGgsICd1dGYtOCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBEaWFnbm9zdGljIGxvZ2dpbmcgaW5zaWRlIE9ic2lkaWFuIHByb2Nlc3M7IG5vIGxvZ2dlciBhdmFpbGFibGUuXG4gIGNvbnNvbGUuZGVidWcoYEV4ZWN1dGluZyAke3NjcmlwdFBhdGh9OlxcbiR7c2NyaXB0fWApO1xuXG4gIGxldCBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbCwgbm8tbmV3LWZ1bmMgLS0gVGhlIHNjcmlwdCBpcyBhIHRydXN0ZWQsIHNlbGYtZ2VuZXJhdGVkIElJRkUgZXhwcmVzc2lvbi5cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7c2NyaXB0fWApIGFzICgpID0+IFByb21pc2U8dm9pZD47XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZXhlY3V0aW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBraWxsIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiAndGFza2tpbGwgL0lNIE9ic2lkaWFuLmV4ZSAvRic7XG4gIH1cblxuICByZXR1cm4gJ3BraWxsIC1mIE9ic2lkaWFuJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCB0aGUgT2JzaWRpYW4gYmluYXJ5LlxuICpcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgaW5zdGFsbGVkIE9ic2lkaWFuIGV4ZWN1dGFibGUgKGNvdmVyaW5nIGluc3RhbGxlci1iYXNlZFxuICogYW5kIGBQQVRIYC1iYXNlZCBpbnN0YWxscyBzdWNoIGFzIGBzY29vcGApIGFuZCB2ZXJpZmllcyBpdCBleGlzdHMgYmVmb3JlXG4gKiByZXR1cm5pbmcgYSBjb21tYW5kLiBUaHJvd3MgaWYgT2JzaWRpYW4gaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIE9ic2lkaWFuIGNhbm5vdCBiZSBsb2NhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cImA7XG4gIH1cblxuICByZXR1cm4gYFwiJHtleGVQYXRofVwiICZgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gb3BlbiBhIFVSSS5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gVGhlIFVSSSB0byBvcGVuLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBnZXRPcGVuVXJpQ29tbWFuZCh1cmk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHt1cml9XCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGBvcGVuIFwiJHt1cml9XCJgO1xuICB9XG5cbiAgcmV0dXJuIGB4ZGctb3BlbiBcIiR7dXJpfVwiYDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gcHJvY2VzcyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgZm91bmQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc09ic2lkaWFuUnVubmluZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICA/ICd0YXNrbGlzdCAvRkkgXCJJTUFHRU5BTUUgZXEgT2JzaWRpYW4uZXhlXCIgL05IJ1xuICAgIDogJ3BncmVwIC1mIE9ic2lkaWFuJztcbiAgdHJ5IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgcmV0dXJuIG91dHB1dC5pbmNsdWRlcygnT2JzaWRpYW4uZXhlJyk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQudHJpbSgpLmxlbmd0aCA+IDA7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9wZW5zIGEgdmF1bHQgaW4gT2JzaWRpYW4gdXNpbmcgdGhlIGBvYnNpZGlhbjovL29wZW5gIFVSSSBwcm90b2NvbC5cbiAqXG4gKiBUaGlzIHdvcmtzIHdoZXRoZXIgT2JzaWRpYW4gaXMgYWxyZWFkeSBydW5uaW5nIChzaWduYWxzIGl0IHRvIG9wZW4gdGhlIHZhdWx0KVxuICogb3Igbm90IChsYXVuY2hlcyBPYnNpZGlhbiB3aXRoIHRoZSB2YXVsdCkuIFRoZSBVUkkgcHJvdG9jb2wgaXMgaGFuZGxlZCBieSB0aGVcbiAqIE9TLCB3aGljaCByb3V0ZXMgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgT2JzaWRpYW4gaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gIGlmICghdmF1bHRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG9wZW4gdmF1bHQgdmlhIFVSSTogdmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gb2JzaWRpYW4uanNvbjogJHt2YXVsdFBhdGh9YCk7XG4gIH1cbiAgY29uc3QgdXJpID0gYG9ic2lkaWFuOi8vb3Blbj92YXVsdD0ke2VuY29kZVVSSUNvbXBvbmVudCh2YXVsdElkKX1gO1xuICBjb25zdCBjb21tYW5kID0gZ2V0T3BlblVyaUNvbW1hbmQodXJpKTtcbiAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gT3BlbmluZyB2YXVsdCB2aWEgVVJJOiAke3VyaX1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVUkkgb3BlbiBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFTQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFRcEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsV0FBVztBQUNwQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyxzQkFBc0I7QUE2Qi9CLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMkNB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
@@ -1,5 +1,8 @@
1
1
  import { inject } from "vitest";
2
- import { setTransportOptionsResolver } from "../context-provider.mjs";
2
+ import {
3
+ setTransportOptionsResolver,
4
+ setVaultPathResolver
5
+ } from "../context-provider.mjs";
3
6
  import {
4
7
  coreSetup,
5
8
  coreTeardown
@@ -8,6 +11,7 @@ import { log } from "../log.mjs";
8
11
  import { serializeError } from "../serialize-error.mjs";
9
12
  import { TempVault } from "../temp-vault.mjs";
10
13
  setTransportOptionsResolver(() => inject("obsidianTransport"));
14
+ setVaultPathResolver(() => inject("tempVaultPath"));
11
15
  let setupResult;
12
16
  function getTempVault() {
13
17
  const tempVaultPath = inject("tempVaultPath");
@@ -39,4 +43,4 @@ export {
39
43
  setup,
40
44
  teardown
41
45
  };
42
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7IHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciB9IGZyb20gJy4uL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7XG4gIGNvcmVTZXR1cCxcbiAgY29yZVRlYXJkb3duXG59IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuLi9sb2cubWpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5cbnNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcigoKSA9PiBpbmplY3QoJ29ic2lkaWFuVHJhbnNwb3J0JykpO1xuXG5sZXQgc2V0dXBSZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvck1lc3NhZ2UgPSBpbmplY3QoJ3NldHVwRXJyb3InKTtcbiAgaWYgKHNldHVwRXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlZ3JhdGlvbiBzZXR1cCBmYWlsZWQgXHUyMDE0IGNhbm5vdCBnZXQgdGVtcCB2YXVsdDogJHtzZXR1cEVycm9yTWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFRlbXBWYXVsdCh0ZW1wVmF1bHRQYXRoKTtcbn1cblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uLlxuICpcbiAqIENvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIGVuYWJsZXMgaXQgdmlhIHRoZSBPYnNpZGlhbiBDTEksXG4gKiBhbmQgcHJvdmlkZXMgYHRlbXBWYXVsdFBhdGhgIHRvIHRlc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0IC0gVGhlIFZpdGVzdCBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAocHJvamVjdDogVGVzdFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zID0gcHJvamVjdC5jb25maWcuZW52aXJvbm1lbnRPcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gZW52aXJvbm1lbnRPcHRpb25zPy5bJ29ic2lkaWFuVHJhbnNwb3J0J10gYXMgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gJ29ic2lkaWFuLWNsaSc7XG5cbiAgdHJ5IHtcbiAgICBzZXR1cFJlc3VsdCA9IGF3YWl0IGNvcmVTZXR1cCh7IHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLy8gQ2F0Y2ggc2V0dXAgZXJyb3JzIHNvIHRoYXQgb3RoZXIgcHJvamVjdHMnIHRlc3RzIGNhbiBzdGlsbCBydW4uXG4gICAgLy8gSW5kaXZpZHVhbCB0ZXN0cyBpbiB0aGlzIHByb2plY3Qgd2lsbCBmYWlsIHdpdGggdGhlIHN0b3JlZCBlcnJvclxuICAgIC8vIFdoZW4gdGhleSB0cnkgdG8gaW5qZWN0IHRoZSB0ZW1wIHZhdWx0IHBhdGguXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCAodGVzdHMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIHNraXBwZWQpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICBwcm9qZWN0LnByb3ZpZGUoJ3NldHVwRXJyb3InLCBzZXJpYWxpemVFcnJvcihlcnJvcikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb2plY3QucHJvdmlkZSgnb2JzaWRpYW5UcmFuc3BvcnQnLCBzZXR1cFJlc3VsdC50cmFuc3BvcnRPcHRpb25zKTtcbiAgcHJvamVjdC5wcm92aWRlKCd0ZW1wVmF1bHRQYXRoJywgc2V0dXBSZXN1bHQudGVtcFZhdWx0LnBhdGgpO1xufVxuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFhQSxTQUFTLGNBQWM7QUFLdkIsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFdBQVc7QUFDcEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxpQkFBaUI7QUFFMUIsNEJBQTRCLE1BQU0sT0FBTyxtQkFBbUIsQ0FBQztBQUU3RCxJQUFJO0FBT0csU0FBUyxlQUEwQjtBQUN4QyxRQUFNLGdCQUFnQixPQUFPLGVBQWU7QUFDNUMsUUFBTSxvQkFBb0IsT0FBTyxZQUFZO0FBQzdDLE1BQUksbUJBQW1CO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBEQUFxRCxpQkFBaUIsRUFBRTtBQUFBLEVBQzFGO0FBQ0EsU0FBTyxJQUFJLFVBQVUsYUFBYTtBQUNwQztBQVVBLGVBQXNCLE1BQU0sU0FBcUM7QUFDL0QsUUFBTSxxQkFBcUIsUUFBUSxPQUFPO0FBQzFDLFFBQU0sbUJBQW1CLHFCQUFxQixtQkFBbUI7QUFDakUsUUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBRXhDLE1BQUk7QUFDRixrQkFBYyxNQUFNLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztBQUFBLEVBQ3BELFNBQVMsT0FBZ0I7QUFJdkIsUUFBSSxzQkFBc0IsS0FBSyw0REFBNEQsZUFBZSxLQUFLLENBQUMsRUFBRTtBQUNsSCxZQUFRLFFBQVEsY0FBYyxlQUFlLEtBQUssQ0FBQztBQUNuRDtBQUFBLEVBQ0Y7QUFFQSxVQUFRLFFBQVEscUJBQXFCLFlBQVksZ0JBQWdCO0FBQ2pFLFVBQVEsUUFBUSxpQkFBaUIsWUFBWSxVQUFVLElBQUk7QUFDN0Q7QUFPQSxlQUFzQixXQUEwQjtBQUM5QyxRQUFNLGFBQWEsV0FBVztBQUNoQzsiLAogICJuYW1lcyI6IFtdCn0K
46
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemUtZXJyb3IubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQubWpzJztcblxuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKSk7XG5cbmxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRlbXBvcmFyeSB2YXVsdCBwcm92aWRlZCBieSB0aGUgZ2xvYmFsIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0ZW1wb3JhcnkgdmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wVmF1bHQoKTogVGVtcFZhdWx0IHtcbiAgY29uc3QgdGVtcFZhdWx0UGF0aCA9IGluamVjdCgndGVtcFZhdWx0UGF0aCcpO1xuICBjb25zdCBzZXR1cEVycm9yTWVzc2FnZSA9IGluamVjdCgnc2V0dXBFcnJvcicpO1xuICBpZiAoc2V0dXBFcnJvck1lc3NhZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVncmF0aW9uIHNldHVwIGZhaWxlZCBcdTIwMTQgY2Fubm90IGdldCB0ZW1wIHZhdWx0OiAke3NldHVwRXJyb3JNZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBuZXcgVGVtcFZhdWx0KHRlbXBWYXVsdFBhdGgpO1xufVxuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgc2V0dXAgZnVuY3Rpb24uXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnMgPSBwcm9qZWN0LmNvbmZpZy5lbnZpcm9ubWVudE9wdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBlbnZpcm9ubWVudE9wdGlvbnM/Llsnb2JzaWRpYW5UcmFuc3BvcnQnXSBhcyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyAnb2JzaWRpYW4tY2xpJztcblxuICB0cnkge1xuICAgIHNldHVwUmVzdWx0ID0gYXdhaXQgY29yZVNldHVwKHsgdHJhbnNwb3J0T3B0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAvLyBDYXRjaCBzZXR1cCBlcnJvcnMgc28gdGhhdCBvdGhlciBwcm9qZWN0cycgdGVzdHMgY2FuIHN0aWxsIHJ1bi5cbiAgICAvLyBJbmRpdmlkdWFsIHRlc3RzIGluIHRoaXMgcHJvamVjdCB3aWxsIGZhaWwgd2l0aCB0aGUgc3RvcmVkIGVycm9yXG4gICAgLy8gV2hlbiB0aGV5IHRyeSB0byBpbmplY3QgdGhlIHRlbXAgdmF1bHQgcGF0aC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkICh0ZXN0cyBmb3IgdGhpcyBwcm9qZWN0IHdpbGwgYmUgc2tpcHBlZCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIHByb2plY3QucHJvdmlkZSgnc2V0dXBFcnJvcicsIHNlcmlhbGl6ZUVycm9yKGVycm9yKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBwcm9qZWN0LnByb3ZpZGUoJ3RlbXBWYXVsdFBhdGgnLCBzZXR1cFJlc3VsdC50ZW1wVmF1bHQucGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY29yZVRlYXJkb3duKHNldHVwUmVzdWx0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWFBLFNBQVMsY0FBYztBQUt2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUJBQWlCO0FBRTFCLDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFDN0QscUJBQXFCLE1BQU0sT0FBTyxlQUFlLENBQUM7QUFFbEQsSUFBSTtBQU9HLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsT0FBTyxlQUFlO0FBQzVDLFFBQU0sb0JBQW9CLE9BQU8sWUFBWTtBQUM3QyxNQUFJLG1CQUFtQjtBQUNyQixVQUFNLElBQUksTUFBTSwwREFBcUQsaUJBQWlCLEVBQUU7QUFBQSxFQUMxRjtBQUNBLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFVQSxlQUFzQixNQUFNLFNBQXFDO0FBQy9ELFFBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxRQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFFBQU0sUUFBUSxrQkFBa0IsUUFBUTtBQUV4QyxNQUFJO0FBQ0Ysa0JBQWMsTUFBTSxVQUFVLEVBQUUsaUJBQWlCLENBQUM7QUFBQSxFQUNwRCxTQUFTLE9BQWdCO0FBSXZCLFFBQUksc0JBQXNCLEtBQUssNERBQTRELGVBQWUsS0FBSyxDQUFDLEVBQUU7QUFDbEgsWUFBUSxRQUFRLGNBQWMsZUFBZSxLQUFLLENBQUM7QUFDbkQ7QUFBQSxFQUNGO0FBRUEsVUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxVQUFRLFFBQVEsaUJBQWlCLFlBQVksVUFBVSxJQUFJO0FBQzdEO0FBT0EsZUFBc0IsV0FBMEI7QUFDOUMsUUFBTSxhQUFhLFdBQVc7QUFDaEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "4.1.5",
3
+ "version": "4.2.0",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -108,18 +108,18 @@
108
108
  "urlpattern-polyfill": "npm:dry-uninstall"
109
109
  },
110
110
  "dependencies": {
111
- "puppeteer-core": "^25.0.4",
111
+ "puppeteer-core": "^25.1.0",
112
112
  "webdriverio": "9.27.0"
113
113
  },
114
114
  "devDependencies": {
115
115
  "@commitlint/cli": "^21.0.1",
116
116
  "@commitlint/config-conventional": "^21.0.1",
117
117
  "@commitlint/types": "^21.0.1",
118
- "@eslint-community/eslint-plugin-eslint-comments": "^4.7.1",
118
+ "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2",
119
119
  "@eslint/compat": "^2.1.0",
120
120
  "@eslint/config-helpers": "^0.6.0",
121
121
  "@eslint/js": "^10.0.1",
122
- "@obsidian-typings/obsidian-public-latest": "^6.10.0",
122
+ "@obsidian-typings/obsidian-public-latest": "^6.12.0",
123
123
  "@stylistic/eslint-plugin": "^5.10.0",
124
124
  "@total-typescript/ts-reset": "^0.6.1",
125
125
  "@tsconfig/strictest": "^2.0.8",
@@ -127,8 +127,8 @@
127
127
  "@types/markdown-it": "^14.1.2",
128
128
  "@types/semver": "^7.7.1",
129
129
  "@types/turndown": "^5.0.6",
130
- "@typescript-eslint/rule-tester": "^8.59.4",
131
- "@typescript-eslint/utils": "^8.59.4",
130
+ "@typescript-eslint/rule-tester": "^8.60.0",
131
+ "@typescript-eslint/utils": "^8.60.0",
132
132
  "@vitest/coverage-v8": "^4.1.7",
133
133
  "@vitest/runner": "4.1.0",
134
134
  "@wdio/protocols": "9.27.0",
@@ -159,7 +159,7 @@
159
159
  "ts-jest": "^29.4.11",
160
160
  "type-fest": "^5.6.0",
161
161
  "typescript": "^6.0.3",
162
- "typescript-eslint": "^8.59.4",
162
+ "typescript-eslint": "^8.60.0",
163
163
  "vite": "8.0.12",
164
164
  "vitest": "^4.1.7"
165
165
  },