obsidian-integration-testing 8.2.0 → 8.3.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 (38) hide show
  1. package/dist/lib/cjs/compatibility-options.cjs +51 -0
  2. package/dist/lib/cjs/compatibility-options.d.cts +71 -0
  3. package/dist/lib/cjs/connect-to-cdp.cjs +11 -2
  4. package/dist/lib/cjs/connect-to-cdp.d.cts +39 -2
  5. package/dist/lib/cjs/electron-compatibility.cjs +46 -0
  6. package/dist/lib/cjs/electron-compatibility.d.cts +74 -0
  7. package/dist/lib/cjs/index.cjs +4 -1
  8. package/dist/lib/cjs/index.d.cts +2 -0
  9. package/dist/lib/cjs/installer-compatibility.cjs +1 -1
  10. package/dist/lib/cjs/installer-compatibility.d.cts +4 -1
  11. package/dist/lib/cjs/library.cjs +1 -1
  12. package/dist/lib/cjs/spawn-options.cjs +42 -0
  13. package/dist/lib/cjs/spawn-options.d.cts +60 -0
  14. package/dist/lib/cjs/transport-desktop-cdp.cjs +55 -1
  15. package/dist/lib/cjs/transport-desktop-cdp.d.cts +46 -1
  16. package/dist/lib/cjs/transport-factory.cjs +34 -11
  17. package/dist/lib/cjs/transport-options.cjs +1 -1
  18. package/dist/lib/cjs/transport-options.d.cts +32 -0
  19. package/dist/lib/esm/compatibility-options.d.mts +71 -0
  20. package/dist/lib/esm/compatibility-options.mjs +25 -0
  21. package/dist/lib/esm/connect-to-cdp.d.mts +39 -2
  22. package/dist/lib/esm/connect-to-cdp.mjs +11 -2
  23. package/dist/lib/esm/electron-compatibility.d.mts +74 -0
  24. package/dist/lib/esm/electron-compatibility.mjs +22 -0
  25. package/dist/lib/esm/index.d.mts +2 -0
  26. package/dist/lib/esm/index.mjs +3 -1
  27. package/dist/lib/esm/installer-compatibility.d.mts +4 -1
  28. package/dist/lib/esm/installer-compatibility.mjs +1 -1
  29. package/dist/lib/esm/library.mjs +1 -1
  30. package/dist/lib/esm/spawn-options.d.mts +60 -0
  31. package/dist/lib/esm/spawn-options.mjs +17 -0
  32. package/dist/lib/esm/transport-desktop-cdp.d.mts +46 -1
  33. package/dist/lib/esm/transport-desktop-cdp.mjs +55 -1
  34. package/dist/lib/esm/transport-factory.mjs +41 -11
  35. package/dist/lib/esm/transport-options.d.mts +32 -0
  36. package/dist/obsidian-integration-testing-8.3.0.tgz +0 -0
  37. package/package.json +9 -9
  38. package/dist/obsidian-integration-testing-8.2.0.tgz +0 -0
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var spawn_options_exports = {};
20
+ __export(spawn_options_exports, {
21
+ resolveAppiumSpawnFlags: () => resolveAppiumSpawnFlags,
22
+ resolveEmulatorSpawnFlags: () => resolveEmulatorSpawnFlags
23
+ });
24
+ module.exports = __toCommonJS(spawn_options_exports);
25
+ function resolveAppiumSpawnFlags(isConsoleHidden) {
26
+ return {
27
+ detached: !isConsoleHidden,
28
+ windowsHide: isConsoleHidden
29
+ };
30
+ }
31
+ function resolveEmulatorSpawnFlags(isWindowHidden) {
32
+ return {
33
+ detached: false,
34
+ windowsHide: isWindowHidden
35
+ };
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ resolveAppiumSpawnFlags,
40
+ resolveEmulatorSpawnFlags
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NwYXduLW9wdGlvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIHJlc29sdXRpb24gb2YgdGhlIGBkZXRhY2hlZGAgLyBgd2luZG93c0hpZGVgIHNwYXduIGZsYWdzIGZvciB0aGVcbiAqIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFuZCBBbmRyb2lkIGVtdWxhdG9yLCBkZXJpdmVkIGZyb20gd2hldGhlciB0aGVpclxuICogY29uc29sZSB3aW5kb3dzIHNob3VsZCBiZSBoaWRkZW4uXG4gKlxuICogS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi1vbmx5IGxhdW5jaCBjb2RlIChgdHJhbnNwb3J0LWZhY3RvcnlgLFxuICogZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKSBzbyB0aGUgZmxhZyByZXNvbHV0aW9uIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZVxuICogbGF1bmNoZXIgaXRzZWxmIG5lZWRzIGEgcmVhbCBBcHBpdW0gc2VydmVyIC8gZW11bGF0b3IuIE1pcnJvcnMgdGhlIHNwbGl0IGluXG4gKiBgdmlzaWJpbGl0eS50c2AgYW5kIGBlbXVsYXRvci1hcmdzLnRzYC5cbiAqXG4gKiAqKldoeSB0aGVzZSBleGFjdCBmbGFncyoqIChlbXBpcmljYWxseSB2ZXJpZmllZCBvbiBXaW5kb3dzKTpcbiAqIC0gYGRldGFjaGVkOiB0cnVlYCBzZXRzIGBERVRBQ0hFRF9QUk9DRVNTYCwgd2hpY2ggZ2l2ZXMgdGhlIGNoaWxkIG5vIGNvbnNvbGUuXG4gKiAgIEZvciBhIGNvbnNvbGUtc3Vic3lzdGVtIGNoaWxkIHRoYXQgbWVhbnMgV2luZG93cy90aGUgY2hpbGQgbGF0ZXIgYWxsb2NhdGVzIGFcbiAqICAgKipmcmVzaCwgdmlzaWJsZSoqIGNvbnNvbGUgXHUyMDE0IGFuZCBgd2luZG93c0hpZGVgICh3aGljaCBvbmx5IHNldHMgYFNXX0hJREVgIG9uXG4gKiAgIGFuIGluaGVyaXRlZC9uZXcgY29uc29sZSBhdCBgQ3JlYXRlUHJvY2Vzc2AgdGltZSkgaXMgc2lsZW50bHkgZGVmZWF0ZWQuIFNvIGFcbiAqICAgcHJvY2VzcyB3ZSB3YW50IGhpZGRlbiBtdXN0IE5PVCBiZSBkZXRhY2hlZC5cbiAqIC0gTm90IGRldGFjaGluZyBsZXRzIHRoZSBjaGlsZCBpbmhlcml0IHRoZSBwYXJlbnQncyAoaGlkZGVuKSBjb25zb2xlLCBhbmQgYW55XG4gKiAgIGNvbnNvbGUtYXBwICoqZ3JhbmRjaGlsZHJlbioqIGl0IHNwYXducyAoZS5nLiB0aGUgZW11bGF0b3IncyBuZXRzaW0vcWVtdVxuICogICBoZWxwZXJzKSBpbmhlcml0IHRoYXQgaGlkZGVuIGNvbnNvbGUgdG9vLCBpbnN0ZWFkIG9mIGVhY2ggcG9wcGluZyB0aGVpciBvd24uXG4gKiAtIFRlYXJkb3duIGRvZXMgbm90IHJlbHkgb24gYGRldGFjaGVkYDogYGtpbGxQcm9jZXNzVHJlZWAgdXNlc1xuICogICBgdGFza2tpbGwgL0YgL1QgL1BJRGAsIGFuZCBgY2hpbGQudW5yZWYoKWAgYWxvbmUgbGV0cyB0aGUgcGFyZW50IGV2ZW50IGxvb3BcbiAqICAgZXhpdCB3aXRob3V0IHdhaXRpbmcgb24gdGhlIGNoaWxkLlxuICovXG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBzcGF3biBvcHRpb25zIHRoYXQgY29udHJvbCBjb25zb2xlLXdpbmRvdyB2aXNpYmlsaXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduVmlzaWJpbGl0eUZsYWdzIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBjaGlsZCBpbiBpdHMgb3duIHByb2Nlc3MgZ3JvdXAgLyBkZXRhY2hlZCBmcm9tIHRoZVxuICAgKiBwYXJlbnQgY29uc29sZSAoYERFVEFDSEVEX1BST0NFU1NgIG9uIFdpbmRvd3MpLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV0YWNoZWQ6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdG8gaGlkZSB0aGUgY2hpbGQncyBjb25zb2xlIHdpbmRvdyAoYHdpbmRvd3NIaWRlYCkuICovXG4gIHJlYWRvbmx5IHdpbmRvd3NIaWRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSB2aXNpYmlsaXR5IHNwYXduIGZsYWdzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIuXG4gKlxuICogV2hlbiBoaWRkZW4sIHRoZSBzZXJ2ZXIgbXVzdCBOT1QgYmUgZGV0YWNoZWQgKG90aGVyd2lzZSBhIGNvbnNvbGUgd2luZG93XG4gKiBhcHBlYXJzIGRlc3BpdGUgYHdpbmRvd3NIaWRlYCkuIFdoZW4gdGhlIHVzZXIgb3B0cyB0byBzZWUgdGhlIGNvbnNvbGUsIGl0IGlzXG4gKiBkZXRhY2hlZCBzbyBpdCBnZXRzIGl0cyBvd24gZGVkaWNhdGVkIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gaXNDb25zb2xlSGlkZGVuIC0gV2hldGhlciB0aGUgQXBwaXVtIGNvbnNvbGUgc2hvdWxkIGJlIGhpZGRlbi5cbiAqIEByZXR1cm5zIFRoZSBgZGV0YWNoZWRgIC8gYHdpbmRvd3NIaWRlYCBmbGFncyB0byBwYXNzIHRvIGBzcGF3bmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyhpc0NvbnNvbGVIaWRkZW46IGJvb2xlYW4pOiBTcGF3blZpc2liaWxpdHlGbGFncyB7XG4gIHJldHVybiB7XG4gICAgZGV0YWNoZWQ6ICFpc0NvbnNvbGVIaWRkZW4sXG4gICAgd2luZG93c0hpZGU6IGlzQ29uc29sZUhpZGRlblxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSB2aXNpYmlsaXR5IHNwYXduIGZsYWdzIGZvciB0aGUgYXV0by1zdGFydGVkIEFuZHJvaWQgZW11bGF0b3IuXG4gKlxuICogVGhlIGVtdWxhdG9yIGlzIG5ldmVyIGRldGFjaGVkOiBkZXRhY2hpbmcgb25seSBjYXVzZXMgaXRzIGNvbnNvbGUtYXBwXG4gKiBncmFuZGNoaWxkcmVuIChuZXRzaW0vcWVtdSkgdG8gYWxsb2NhdGUgdGhlaXIgb3duIHZpc2libGUgY29uc29sZXMuIEl0c1xuICogb24tc2NyZWVuIGRldmljZSB3aW5kb3cgaXMgYSBHVUkgd2luZG93IGNvbnRyb2xsZWQgYnkgdGhlIGAtbm8td2luZG93YFxuICogYXJndW1lbnQgKHNlZSBgZW11bGF0b3ItYXJncy50c2ApLCBpbmRlcGVuZGVudCBvZiB0aGVzZSBjb25zb2xlIGZsYWdzLlxuICpcbiAqIEBwYXJhbSBpc1dpbmRvd0hpZGRlbiAtIFdoZXRoZXIgdGhlIGVtdWxhdG9yIChhbmQgaXRzIGNvbnNvbGUpIHNob3VsZCBiZSBoaWRkZW4uXG4gKiBAcmV0dXJucyBUaGUgYGRldGFjaGVkYCAvIGB3aW5kb3dzSGlkZWAgZmxhZ3MgdG8gcGFzcyB0byBgc3Bhd25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFncyhpc1dpbmRvd0hpZGRlbjogYm9vbGVhbik6IFNwYXduVmlzaWJpbGl0eUZsYWdzIHtcbiAgcmV0dXJuIHtcbiAgICBkZXRhY2hlZDogZmFsc2UsXG4gICAgd2luZG93c0hpZGU6IGlzV2luZG93SGlkZGVuXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrRE8sU0FBUyx3QkFBd0IsaUJBQWdEO0FBQ3RGLFNBQU87QUFBQSxJQUNMLFVBQVUsQ0FBQztBQUFBLElBQ1gsYUFBYTtBQUFBLEVBQ2Y7QUFDRjtBQWFPLFNBQVMsMEJBQTBCLGdCQUErQztBQUN2RixTQUFPO0FBQUEsSUFDTCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure resolution of the `detached` / `windowsHide` spawn flags for the
5
+ * auto-started Appium server and Android emulator, derived from whether their
6
+ * console windows should be hidden.
7
+ *
8
+ * Kept separate from the integration-only launch code (`transport-factory`,
9
+ * excluded from unit tests) so the flag resolution stays unit-testable — the
10
+ * launcher itself needs a real Appium server / emulator. Mirrors the split in
11
+ * `visibility.ts` and `emulator-args.ts`.
12
+ *
13
+ * **Why these exact flags** (empirically verified on Windows):
14
+ * - `detached: true` sets `DETACHED_PROCESS`, which gives the child no console.
15
+ * For a console-subsystem child that means Windows/the child later allocates a
16
+ * **fresh, visible** console — and `windowsHide` (which only sets `SW_HIDE` on
17
+ * an inherited/new console at `CreateProcess` time) is silently defeated. So a
18
+ * process we want hidden must NOT be detached.
19
+ * - Not detaching lets the child inherit the parent's (hidden) console, and any
20
+ * console-app **grandchildren** it spawns (e.g. the emulator's netsim/qemu
21
+ * helpers) inherit that hidden console too, instead of each popping their own.
22
+ * - Teardown does not rely on `detached`: `killProcessTree` uses
23
+ * `taskkill /F /T /PID`, and `child.unref()` alone lets the parent event loop
24
+ * exit without waiting on the child.
25
+ */
26
+ /**
27
+ * The subset of spawn options that control console-window visibility.
28
+ */
29
+ export interface SpawnVisibilityFlags {
30
+ /**
31
+ * Whether to run the child in its own process group / detached from the
32
+ * parent console (`DETACHED_PROCESS` on Windows).
33
+ */
34
+ readonly detached: boolean;
35
+ /** Whether to hide the child's console window (`windowsHide`). */
36
+ readonly windowsHide: boolean;
37
+ }
38
+ /**
39
+ * Resolves the visibility spawn flags for the auto-started Appium server.
40
+ *
41
+ * When hidden, the server must NOT be detached (otherwise a console window
42
+ * appears despite `windowsHide`). When the user opts to see the console, it is
43
+ * detached so it gets its own dedicated window.
44
+ *
45
+ * @param isConsoleHidden - Whether the Appium console should be hidden.
46
+ * @returns The `detached` / `windowsHide` flags to pass to `spawn`.
47
+ */
48
+ export declare function resolveAppiumSpawnFlags(isConsoleHidden: boolean): SpawnVisibilityFlags;
49
+ /**
50
+ * Resolves the visibility spawn flags for the auto-started Android emulator.
51
+ *
52
+ * The emulator is never detached: detaching only causes its console-app
53
+ * grandchildren (netsim/qemu) to allocate their own visible consoles. Its
54
+ * on-screen device window is a GUI window controlled by the `-no-window`
55
+ * argument (see `emulator-args.ts`), independent of these console flags.
56
+ *
57
+ * @param isWindowHidden - Whether the emulator (and its console) should be hidden.
58
+ * @returns The `detached` / `windowsHide` flags to pass to `spawn`.
59
+ */
60
+ export declare function resolveEmulatorSpawnFlags(isWindowHidden: boolean): SpawnVisibilityFlags;
@@ -36,12 +36,14 @@ var import_node_fs = require("node:fs");
36
36
  var import_node_path = require("node:path");
37
37
  var import_node_process = __toESM(require("node:process"), 1);
38
38
  var import_dismiss_trust_dialog = require("./dismiss-trust-dialog.cjs");
39
+ var import_electron_compatibility = require("./electron-compatibility.cjs");
39
40
  var import_exec = require("./exec.cjs");
40
41
  var import_log = require("./log.cjs");
41
42
  var import_namespace_bootstrap = require("./namespace-bootstrap.cjs");
42
43
  var import_obsidian_config = require("./obsidian-config.cjs");
43
44
  var import_obsidian_executable = require("./obsidian-executable.cjs");
44
45
  var import_obsidian_instance = require("./obsidian-instance.cjs");
46
+ var import_obsidian_metadata = require("./obsidian-metadata.cjs");
45
47
  var import_obsidian_version_switch = require("./obsidian-version-switch.cjs");
46
48
  var import_renderer_boot_detection = require("./renderer-boot-detection.cjs");
47
49
  var import_renderer_failed_to_initialize_error = require("./renderer-failed-to-initialize-error.cjs");
@@ -72,12 +74,14 @@ class DesktopCdpTransport {
72
74
  cdpUrl;
73
75
  commandTimeoutInMilliseconds;
74
76
  deadBootGraceInMilliseconds;
77
+ electronCompatibility;
75
78
  isHarnessOwnedInstance;
76
79
  isObsidianAppVisible;
77
80
  messageId = 0;
78
81
  ownedConfig;
79
82
  ownedInstance;
80
83
  shouldDisableSandbox;
84
+ shouldWarnOnCompatibilityIssues;
81
85
  ws = null;
82
86
  /**
83
87
  * Creates a new CDP transport.
@@ -92,6 +96,7 @@ class DesktopCdpTransport {
92
96
  this.isObsidianAppVisible = config?.isObsidianAppVisible ?? true;
93
97
  this.ownedConfig = config?.ownedInstance;
94
98
  this.shouldDisableSandbox = config?.shouldDisableSandbox ?? false;
99
+ this.shouldWarnOnCompatibilityIssues = config?.shouldWarnOnCompatibilityIssues ?? true;
95
100
  this.cdpPort = config?.cdpPort ?? 0;
96
101
  this.cdpUrl = config?.cdpPort === void 0 ? "" : `http://${this.cdpHost}:${String(config.cdpPort)}`;
97
102
  }
@@ -171,6 +176,19 @@ class DesktopCdpTransport {
171
176
  getCompatibility() {
172
177
  return this.ownedConfig?.compatibility;
173
178
  }
179
+ /**
180
+ * Returns the runtime Electron compatibility verdict for this owned instance —
181
+ * whether the Electron version it is actually running is new enough for the
182
+ * running app version (read live post-boot; see {@link ObsidianVersionMetadata.minRecommendedElectronVersion}).
183
+ * Returns `undefined` when this is not an owned instance, the instance has not
184
+ * booted yet, or the verdict could not be determined (the live version was
185
+ * unreadable, or the app version carries no recommended Electron version).
186
+ *
187
+ * @returns The runtime Electron compatibility verdict, or `undefined`.
188
+ */
189
+ getElectronCompatibility() {
190
+ return this.electronCompatibility;
191
+ }
174
192
  /**
175
193
  * Returns the CDP endpoint of the owned, launched instance so the global setup
176
194
  * can hand it to test workers (which then **attach** to it instead of
@@ -276,6 +294,41 @@ class DesktopCdpTransport {
276
294
  (0, import_obsidian_config.removeVaultFromConfig)(vaultPath);
277
295
  }
278
296
  }
297
+ /**
298
+ * Best-effort tier-2 runtime nag: reads the live Electron version and running
299
+ * app version from the booted owned renderer and warns when the Electron the
300
+ * instance is actually running is older than the app's recommended minimum.
301
+ * Stores the verdict on {@link getElectronCompatibility}.
302
+ *
303
+ * The app version is read **live** — the running app version from the main
304
+ * process (`ipcRenderer.sendSync('version')`, the same IPC channel the namespace
305
+ * bootstrap uses) rather than from the resolved config — so the nag reflects the
306
+ * version genuinely running across every owned sub-path (asar-swap / downgrade /
307
+ * own-installer) and stays truthful even under a silent asar fallback.
308
+ * `process.versions.electron` gives the shell's live Electron. Both are read at
309
+ * the renderer top level (no `require('obsidian')`, which resolves only inside a
310
+ * plugin-load context). Never throws — a read failure is logged and ignored, so
311
+ * it cannot break an otherwise-ready boot.
312
+ *
313
+ * @param vaultPath - The vault path to evaluate in.
314
+ */
315
+ async checkRuntimeElectronCompatibility(vaultPath) {
316
+ try {
317
+ const appVersion = await this.evaluate("String(window.electron.ipcRenderer.sendSync('version'))", { cwd: vaultPath });
318
+ const actualElectronVersion = await this.evaluate("String(process.versions.electron)", { cwd: vaultPath });
319
+ const verdict = (0, import_electron_compatibility.checkElectronCompatibility)({
320
+ actualElectronVersion,
321
+ appVersion,
322
+ metadata: (0, import_obsidian_metadata.getVersionMetadata)(appVersion)
323
+ });
324
+ this.electronCompatibility = verdict;
325
+ if (verdict.tier === "nagged" && this.shouldWarnOnCompatibilityIssues) {
326
+ (0, import_log.log)(`[cdp-transport] ${(0, import_type_guards.ensureNonNullable)(verdict.message)}`);
327
+ }
328
+ } catch (error) {
329
+ (0, import_log.log)(`[cdp-transport] Could not check runtime Electron compatibility (non-fatal): ${String(error)}`);
330
+ }
331
+ }
279
332
  /**
280
333
  * Connects to a CDP target's WebSocket endpoint.
281
334
  *
@@ -715,6 +768,7 @@ class DesktopCdpTransport {
715
768
  await this.findTargetForVault(vaultPath);
716
769
  await this.waitForLayoutReady(vaultPath);
717
770
  await this.dismissTrustDialog(vaultPath);
771
+ await this.checkRuntimeElectronCompatibility(vaultPath);
718
772
  (0, import_log.log)("[cdp-transport] Owned vault is ready.");
719
773
  return;
720
774
  } catch {
@@ -762,4 +816,4 @@ function tryRemoveDir(dir) {
762
816
  0 && (module.exports = {
763
817
  DesktopCdpTransport
764
818
  });
765
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHsgT3duZWRPYnNpZGlhbkluc3RhbmNlIH0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YW5jZS5janMnO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLmNqcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLmNqcyc7XG5pbXBvcnQge1xuICBnZXRWYXVsdElkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2guY2pzJztcbmltcG9ydCB7XG4gIGNoZWNrUmVuZGVyZXJCb290U3RhdGUsXG4gIERFRkFVTFRfREVBRF9CT09UX0dSQUNFX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgeyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIH0gZnJvbSAnLi9yZW5kZXJlci1mYWlsZWQtdG8taW5pdGlhbGl6ZS1lcnJvci5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmdzLFxuICByZXNvbHZlU2FuZGJveExhdW5jaEFyZ3MsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkuY2pzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gYDMwMDAwYC5cbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGFzYXIgdG8gcHJvdmlzaW9uIGludG8gYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlJ3MgdXNlci1kYXRhIGRpciBiZWZvcmUgbGF1bmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VBc2FyIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGNhY2hlZC9zb3VyY2UgYXNhciBmaWxlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLiAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgaXRzIG93biBPYnNpZGlhbiBwcm9jZXNzXG4gKiBhZ2FpbnN0IGFuIGlzb2xhdGVkIHVzZXItZGF0YSBkaXIgaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VDb25maWcge1xuICAvKiogT3B0aW9uYWwgYXNhciB0byBwcm92aXNpb24gaW50byB7QGxpbmsgdXNlckRhdGFEaXJ9IGJlZm9yZSBsYXVuY2guICovXG4gIHJlYWRvbmx5IGFzYXI/OiBPd25lZEluc3RhbmNlQXNhciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIHdoZW4gaXQgY291bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiAoYW4gYXNhci1zd2FwIG9udG8gYSBrbm93biBzaGVsbCB2ZXJzaW9uKS4gU3VyZmFjZWQgYnlcbiAgICoge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnQuZ2V0Q29tcGF0aWJpbGl0eX0uXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpci4gQ3JlYXRlZCBhbmQgb3duZWQgYnkgdGhlXG4gICAqIHRyYW5zcG9ydCwgYW5kIGRlbGV0ZWQgb24gZGlzcG9zZS5cbiAgICovXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25EZXRhaWxzIHtcbiAgZXhjZXB0aW9uPzogQ2RwRXhjZXB0aW9uT2JqZWN0O1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25PYmplY3Qge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlIHtcbiAgaWQ6IG51bWJlcjtcbiAgcmVzdWx0PzogQ2RwUmVzcG9uc2VSZXN1bHQ7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIFRoZSBDRFAgZW5kcG9pbnQgb2YgYSBsYXVuY2hlZCwgaGFybmVzcy1vd25lZCBpbnN0YW5jZS5cbiAqL1xuaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKiBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS4gKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDAwO1xuY29uc3QgVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjAwMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogQ29ubmVjdHMgdG8gT2JzaWRpYW4ncyBDRFAgV2ViU29ja2V0IGVuZHBvaW50LCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWBcbiAqIGNvbW1hbmRzLCBhbmQgcm91dGVzIGV4cHJlc3Npb25zIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDZHBUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgZmFsc2VgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVZhdWx0UGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RwSG9zdDogc3RyaW5nO1xuICBwcml2YXRlIGNkcFBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjZHBVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IG93bmVkQ29uZmlnOiBPd25lZEluc3RhbmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bmVkSW5zdGFuY2U6IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveDogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3czogbnVsbCB8IFdlYlNvY2tldCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ0RQIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIENEUCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnPzogRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuY2RwSG9zdCA9IGNvbmZpZz8uY2RwSG9zdCA/PyAnbG9jYWxob3N0JztcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWc/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVBRF9CT09UX0dSQUNFX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBjb25maWc/LmlzSGFybmVzc093bmVkSW5zdGFuY2UgPz8gZmFsc2U7XG4gICAgdGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSA9IGNvbmZpZz8uaXNPYnNpZGlhbkFwcFZpc2libGUgPz8gdHJ1ZTtcbiAgICB0aGlzLm93bmVkQ29uZmlnID0gY29uZmlnPy5vd25lZEluc3RhbmNlO1xuICAgIHRoaXMuc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBjb25maWc/LnNob3VsZERpc2FibGVTYW5kYm94ID8/IGZhbHNlO1xuICAgIC8vIE93bmVkIG1vZGUgcGlja3MgYSBmcmVlIHBvcnQgYXQgbGF1bmNoIChhc3NpZ25lZCBpbiByZWdpc3RlclZhdWx0KS5cbiAgICAvLyBBdHRhY2ggbW9kZSBjb25uZWN0cyB0byB0aGUgY29uZmlndXJlZCBwb3J0OyBubyBwb3J0IGlzIGhhcmRjb2RlZC5cbiAgICB0aGlzLmNkcFBvcnQgPSBjb25maWc/LmNkcFBvcnQgPz8gMDtcbiAgICB0aGlzLmNkcFVybCA9IGNvbmZpZz8uY2RwUG9ydCA9PT0gdW5kZWZpbmVkID8gJycgOiBgaHR0cDovLyR7dGhpcy5jZHBIb3N0fToke1N0cmluZyhjb25maWcuY2RwUG9ydCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIGFuZCwgaW4gb3duZWQtaW5zdGFuY2UgbW9kZSxcbiAgICoga2lsbHMgdGhlIG93bmVkIE9ic2lkaWFuIHByb2Nlc3MgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXIuXG4gICAqXG4gICAqIFRoZSByZW1vdmFsIGlzIHJldHJpZWQgYmVjYXVzZSBXaW5kb3dzIGJyaWVmbHkgaG9sZHMgdGhlIGp1c3Qta2lsbGVkXG4gICAqIHByb2Nlc3MncyBmaWxlIGhhbmRsZXMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmYWlsIGBybVN5bmNgIHdpdGggYEVQRVJNYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgIGNvbnN0IHsgdXNlckRhdGFEaXIgfSA9IHRoaXMub3duZWRDb25maWc7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGlmICh0cnlSZW1vdmVEaXIodXNlckRhdGFEaXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBpZiAoIXRyeVJlbW92ZURpcih1c2VyRGF0YURpcikpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZW1vdmUgb3duZWQgdXNlci1kYXRhIGRpciB3aXRoaW4gJHtTdHJpbmcoVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsKTogJHt1c2VyRGF0YURpcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwgXHUyMDE0IGtpbGxzIHRoZSBvd25lZCBpbnN0YW5jZSBhbmQgbWFrZXMgYSBiZXN0LWVmZm9ydFxuICAgKiByZW1vdmFsIG9mIGl0cyB1c2VyLWRhdGEgZGlyLiBTYWZlIHRvIGNhbGwgZnJvbSBhIHByb2Nlc3MgYGV4aXRgIGhhbmRsZXJcbiAgICogKHdoZXJlIGFzeW5jIHJldHJpZXMgYXJlIGltcG9zc2libGU7IGEgbGVmdG92ZXIgdGVtcCBkaXIgaXMgYWNjZXB0YWJsZSkuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgICAgaWYgKCF0cnlSZW1vdmVEaXIodGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcikpIHtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdXNlci1kYXRhIGRpciBub3QgcmVtb3ZlZCBzeW5jaHJvbm91c2x5IChwcm9jZXNzIG1heSBzdGlsbCBob2xkIGhhbmRsZXMpOiAke3RoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIENEUCBgUnVudGltZS5ldmFsdWF0ZWAuXG4gICAqXG4gICAqIFJvdXRlcyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQgYmFzZWQgb24gYG9wdGlvbnMuY3dkYC5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihvcHRpb25zLmN3ZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgIGV4cHJlc3Npb24sXG4gICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5leGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMuZXhjZXB0aW9uPy5kZXNjcmlwdGlvblxuICAgICAgICA/PyByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy50ZXh0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDRFAgZXZhbHVhdGlvbiBlcnJvcjogJHtkZXNjfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdE9iaiA9IHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0O1xuICAgIGlmICghcmVzdWx0T2JqIHx8IHJlc3VsdE9iai50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHJlc3VsdE9iai52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgdGhpcyBvd25lZFxuICAgKiBpbnN0YW5jZSwgc28gY2FsbGVycyBjYW4gYXNzZXJ0IG9uIGl0LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3RcbiAgICogYW4gb3duZWQgaW5zdGFuY2UsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChlLmcuIGFuXG4gICAqIHVuZGV0ZWN0YWJsZSBzaGVsbCB2ZXJzaW9uLCBvciB0aGUgYXBwIHZlcnNpb24gaXMgYWJzZW50IGZyb20gdGhlIHRhYmxlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcGF0aWJpbGl0eSgpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vd25lZENvbmZpZz8uY29tcGF0aWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDRFAgZW5kcG9pbnQgb2YgdGhlIG93bmVkLCBsYXVuY2hlZCBpbnN0YW5jZSBzbyB0aGUgZ2xvYmFsIHNldHVwXG4gICAqIGNhbiBoYW5kIGl0IHRvIHRlc3Qgd29ya2VycyAod2hpY2ggdGhlbiAqKmF0dGFjaCoqIHRvIGl0IGluc3RlYWQgb2ZcbiAgICogbGF1bmNoaW5nIHRoZWlyIG93bikuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHRyYW5zcG9ydCBpcyBub3QgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIGl0cyBpbnN0YW5jZSBoYXMgbm90IGJlZW4gbGF1bmNoZWQgeWV0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgb3duZWQgaW5zdGFuY2UncyBDRFAgaG9zdCBhbmQgcG9ydCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk6IE93bmVkSW5zdGFuY2VFbmRwb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnIHx8ICF0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3Q6IHRoaXMuY2RwSG9zdCwgcG9ydDogdGhpcy5jZHBQb3J0IH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgQ0RQIGVuZHBvaW50IGlzIHJlYWNoYWJsZSBhbmQgaGFzIE9ic2lkaWFuIHRhcmdldHMuXG4gICAqXG4gICAqIElmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBhdHRlbXB0cyB0byBhdXRvLXN0YXJ0IGl0IHZpYSBVUkkgcHJvdG9jb2xcbiAgICogYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGZvciB2YXVsdCByZWdpc3RyYXRpb24gY2hlY2spLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcgfHwgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICAvLyBPd25lZCBpbnN0YW5jZSAobGF1bmNoZWQgaGVyZSkgb3IgYSB3b3JrZXIgYXR0YWNoZWQgdG8gb25lOiByZWFkaW5lc3MgaXNcbiAgICAgIC8vIEd1YXJhbnRlZWQgYnkgdGhlIGdsb2JhbCBzZXR1cCdzIHJlZ2lzdGVyVmF1bHQsIGFuZCB0aGUgdmF1bHQgbGl2ZXMgaW5cbiAgICAgIC8vIFRoZSBpc29sYXRlZCBjb25maWcgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gdmVyaWZ5IGFnYWluc3QgdGhlIHVzZXItc2NvcGVcbiAgICAgIC8vIFJlZ2lzdHJ5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgaWYgKCFpc1ZhdWx0UmVnaXN0ZXJlZCh2YXVsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWYXVsdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbjogJHt2YXVsdFBhdGh9LiBSZWdpc3RlciB0aGUgdmF1bHQgZmlyc3Qgd2l0aCByZWdpc3RlclZhdWx0KCkgb3IgVGVtcFZhdWx0LnJlZ2lzdGVyKCkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhZ2UgdGFyZ2V0cycpO1xuICAgICAgfVxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ0RQIHJlYWNoYWJsZSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCB2aWEgRWxlY3Ryb24gSVBDIGV2YWx1YXRlZCB0aHJvdWdoIENEUC5cbiAgICpcbiAgICogVXNlcyBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQgdG8gc2VuZCB0aGUgYHZhdWx0LW9wZW5gIElQQyBjb21tYW5kLFxuICAgKiB0aGVuIHBvbGxzIHVudGlsIHRoZSBuZXcgdmF1bHQncyB0YXJnZXQgYXBwZWFycy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBieSBkZXN0cm95aW5nIGl0cyB3aW5kb3cgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZTsgbm8gcGVyLXZhdWx0XG4gICAgICAvLyBVbnJlZ2lzdGVyIGlzIG5lZWRlZCAoYW5kIHRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgaXNvbGF0ZWQgY29uZmlnKS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiBkZXN0cm95RXhwcixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdpbmRvdyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQoZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHJlbW92ZUV4cHIsXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE5vIENEUCB0YXJnZXRzIGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3RzIHRvIGEgQ0RQIHRhcmdldCdzIFdlYlNvY2tldCBlbmRwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBDRFAgdGFyZ2V0IHRvIGNvbm5lY3QgdG8uXG4gICAqIEByZXR1cm5zIFRoZSBvcGVuIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9UYXJnZXQodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPFdlYlNvY2tldD4ge1xuICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdzLm9ub3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICAgIHdzLm9uZXJyb3IgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBjb25uZWN0IHRvIENEUCB0YXJnZXQ6ICR7dGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsfWApKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHdzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMud3MgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQWN0cyBhcyBhIHNhZmV0eSBuZXQgd2hlbiBgZW5hYmxlLXBsdWdpbi08aWQ+YCBpcyB3cml0dGVuIGluIG9uZSByZW5kZXJlclxuICAgKiBidXQgbm90IHlldCB2aXNpYmxlIHRvIHRoZSBuZXdseS1vcGVuZWQgdmF1bHQncyByZW5kZXJlciAocmFjZSBvYnNlcnZlZFxuICAgKiBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gQW4gb3BlbiBXZWJTb2NrZXQgdG8gYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0LlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHdzOiBXZWJTb2NrZXQsIHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZXJlIGlzIGFuIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gICAqXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgdmF1bHQuXG4gICAqIE90aGVyd2lzZSwgZmluZHMgdGhlIGNvcnJlY3QgdGFyZ2V0IGFuZCByZWNvbm5lY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMud3M7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgIHRoaXMud3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICAgIHJldHVybiB0aGlzLndzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIHdpdGggYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIG5vdCByZWFjaGFibGUuIFN0YXJ0aW5nIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZy4uLicpO1xuXG4gICAgY29uc3QgbGF1bmNoQ29tbWFuZCA9IGF3YWl0IGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCh0aGlzLmNkcFBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGxhdW5jaENvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIENEUCBlbmRwb2ludCBhdCAke3RoaXMuY2RwVXJsfSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCByZWFkeSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ0RQIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ0RQIHRhcmdldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdmF1bHQgb3Blbi5cbiAgICpcbiAgICogRm9yIGEgc2luZ2xlIHRhcmdldCwgcmV0dXJucyBpdCBkaXJlY3RseS4gRm9yIG11bHRpcGxlIHRhcmdldHMsXG4gICAqIHByb2JlcyBlYWNoIGJ5IGV2YWx1YXRpbmcgYGdldEJhc2VQYXRoKClgIHRvIGZpbmQgdGhlIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gbWF0Y2guXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBDRFAgdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgZm91bmQnKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgodGFyZ2V0KTtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGEgdmF1bHQgdGFyZ2V0IG9yIG5vdCByZWFkeS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENEUCB0YXJnZXQgZm91bmQgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIHBhZ2UtdHlwZSB0YXJnZXRzIGZyb20gdGhlIENEUCBgL2pzb25gIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBwYWdlIHRhcmdldHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFBhZ2VUYXJnZXRzKCk6IFByb21pc2U8Q2RwVGFyZ2V0W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY2RwVXJsfS9qc29uYCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXTtcbiAgICByZXR1cm4gdGFyZ2V0cy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgb3duZWQgaW5zdGFuY2UncyB3aW5kb3cgb2ZmLXNjcmVlbiBzbyBhIGhpZGRlbiBydW4gbmV2ZXIgc3RlYWxzXG4gICAqIGZvY3VzLiBVc2VzIEVsZWN0cm9uJ3MgcmVtb3RlIGJyaWRnZSAoYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgKSBcdTIwMTQgdGhlIG9ubHlcbiAgICogY3Jvc3MtcGxhdGZvcm0gd2F5IHRvIHJlcG9zaXRpb24gdGhlIHdpbmRvdyBcdTIwMTQgcGxhY2luZyBpdCBqdXN0IGJleW9uZCB0aGVcbiAgICogcmlnaHQgZWRnZSBvZiBhbGwgZGlzcGxheXMuIFRoZSB3aW5kb3cgc3RheXMgXCJ2aXNpYmxlXCIgdG8gQ2hyb21pdW0gKHNvXG4gICAqIHRpbWVycywgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIGA6aG92ZXJgLCBhbmQgdHJ1c3RlZCBpbnB1dCBrZWVwIHdvcmtpbmcpLFxuICAgKiB1bmxpa2UgbWluaW1pemluZywgd2hpY2ggd291bGQgZnJlZXplIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLlxuICAgKlxuICAgKiBUaGUgcmVtb3RlIGJyaWRnZSBpcyBub3QgYXZhaWxhYmxlIHRoZSBpbnN0YW50IENEUCBzdGFydHMgc2VydmluZywgc28gdGhpc1xuICAgKiBwb2xscyB1bnRpbCB0aGUgbW92ZSBzdWNjZWVkcy4gQmVzdC1lZmZvcnQ6IGlmIHRoZSB3aW5kb3cgY2Fubm90IGJlIG1vdmVkXG4gICAqIHdpdGhpbiB0aGUgdGltZW91dCwgdGhlIGtlZXAtYWxpdmUgbGF1bmNoIGZsYWdzIHN0aWxsIGFwcGx5IGFuZCB0aGUgcnVuXG4gICAqIHByb2NlZWRzICh3b3JzdCBjYXNlIHRoZSB3aW5kb3cgaXMgYnJpZWZseSB2aXNpYmxlKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vdmVFeHByID0gYCgoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdGUgPSB3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLnJlbW90ZTtcbiAgICAgIGlmICghcmVtb3RlIHx8IHR5cGVvZiByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gJ25vLWJyaWRnZSc7IH1cbiAgICAgIGNvbnN0IHdpbiA9IHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCk7XG4gICAgICBjb25zdCBkaXNwbGF5cyA9IHJlbW90ZS5zY3JlZW4uZ2V0QWxsRGlzcGxheXMoKTtcbiAgICAgIGNvbnN0IG1heFJpZ2h0ID0gTWF0aC5tYXgoLi4uZGlzcGxheXMubWFwKChkaXNwbGF5KSA9PiBkaXNwbGF5LmJvdW5kcy54ICsgZGlzcGxheS5ib3VuZHMud2lkdGgpKTtcbiAgICAgIHdpbi5zZXRQb3NpdGlvbihtYXhSaWdodCArICR7U3RyaW5nKE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyl9LCAwKTtcbiAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH0pKClgO1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gKGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKSlbMF07XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IG1vdmVFeHByLFxuICAgICAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09ICdtb3ZlZCcpIHtcbiAgICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTW92ZWQgb3duZWQgT2JzaWRpYW4gd2luZG93IG9mZi1zY3JlZW4gKGhpZGRlbiBtb2RlKS4nKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIENEUCBlbmRwb2ludCAvIHRhcmdldCAvIHJlbW90ZSBicmlkZ2Ugbm90IHJlYWR5IHlldCBcdTIwMTQga2VlcCBwb2xsaW5nLlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgbW92ZSBvd25lZCB3aW5kb3cgb2ZmLXNjcmVlbiB3aXRoaW4gJHtTdHJpbmcoT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWw7IGtlZXAtYWxpdmUgZmxhZ3Mgc3RpbGwgYXBwbGllZCkuYCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSB2YXVsdCBpbiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIHRoZSBgdmF1bHQtb3BlbmBcbiAgICogRWxlY3Ryb24gSVBDIChldmFsdWF0ZWQgdGhyb3VnaCBDRFAgb24gYW4gZXhpc3RpbmcgdGFyZ2V0KSwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgbmV3IHZhdWx0J3Mgd2luZG93IHRhcmdldCBhcHBlYXJzLCBpcyBsYXlvdXQtcmVhZHksIGFuZCBpdHMgdHJ1c3QgZGlhbG9nXG4gICAqIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogU2hhcmVkIGJ5IHRoZSBhdHRhY2gtbW9kZSB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0gYW5kIHRoZSBvd25lZC1tb2RlXG4gICAqIFwiaW5zdGFuY2UgYWxyZWFkeSBsYXVuY2hlZFwiIHBhdGgsIHNvIG9wZW5pbmcgYW4gYWRkaXRpb25hbCB2YXVsdCBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSBwcm9jZXNzICh3aGljaCB3b3VsZCBzdXJmYWNlIHRoZSB2YXVsdCBwaWNrZXIpLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgYXZhaWxhYmxlLiBJcyBPYnNpZGlhbiBydW5uaW5nPycpO1xuICAgIH1cblxuICAgIGNvbnN0IGlwY1dzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQoZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSkpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IGlwY0V4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGgsIGZhbHNlXSwgY2hhbm5lbDogJ3ZhdWx0LW9wZW4nIH0pfSlgO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChpcGNXcywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgZXhwcmVzc2lvbjogaXBjRXhwcixcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKGlwY1dzLCB2YXVsdFBhdGgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpcGNXcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHRhcmdldCAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFZhdWx0IHRhcmdldCBmb3VuZC4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IHRhcmdldCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGVzIHRoZSB2YXVsdCByZW5kZXJlcidzIGJvb3RzdHJhcCBzdGF0ZSBcdTIwMTQgd2hldGhlciB0aGUgZG9jdW1lbnQgaXNcbiAgICogYGNvbXBsZXRlYCwgd2hldGhlciBgd2luZG93LmFwcGAgZXhpc3RzLCBhbmQgdGhlIGA8Ym9keT5gIGNoaWxkIGNvdW50IFx1MjAxNCBmcm9tXG4gICAqIHRoZSBmaXJzdCBwYWdlIHRhcmdldCwgZm9yIGRlYWQtYm9vdCBkZXRlY3Rpb24uIFRoaXMgd29ya3MgZXZlbiB3aGVuIHRoZSBhcHBcbiAgICogbmV2ZXIgYm9vdHN0cmFwcGVkICh0aGUgcmVuZGVyZXIgcGFnZSB0YXJnZXQgc3RpbGwgZXhpc3RzKSwgd2hpY2ggaXMgZXhhY3RseVxuICAgKiB0aGUgc3RhdGUgaXQgbXVzdCBvYnNlcnZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2FtcGxlZCBvYnNlcnZhdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyB0YXJnZXQgaXMgcmVhY2hhYmxlXG4gICAqICAgb3IgdGhlIHByb2JlIGZhaWxlZCAoc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nIHJhdGhlciB0aGFuIGZhc3QtZmFpbGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlUmVuZGVyZXJCb290U3RhdGUoKTogUHJvbWlzZTxSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAoYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpKVswXTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2JlRXhwciA9IGBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYm9keUNoaWxkRWxlbWVudENvdW50OiBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5jaGlsZEVsZW1lbnRDb3VudCA6IDAsXG4gICAgICAgICAgaGFzV2luZG93QXBwOiB0eXBlb2Ygd2luZG93LmFwcCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgaXNEb2N1bWVudENvbXBsZXRlOiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnXG4gICAgICAgIH0pYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBleHByZXNzaW9uOiBwcm9iZUV4cHIsXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgUmVuZGVyZXJCb290T2JzZXJ2YXRpb247XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIGEgdGFyZ2V0IHRvIGRpc2NvdmVyIHdoaWNoIHZhdWx0IHBhdGggaXQgaGFzIG9wZW4uXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgV2ViU29ja2V0IGNvbm5lY3Rpb24sIGV2YWx1YXRlcyBgZ2V0QmFzZVBhdGgoKWAsXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBwcm9iZS5cbiAgICogQHJldHVybnMgVGhlIHZhdWx0J3MgYmFzZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVZhdWx0UGF0aCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiAnYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKScsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFN0cmluZyhyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBhbmQgY29ubmVjdHMgdG8gYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZSBmb3IgYVxuICAgKiB2YXVsdDogcHJvdmlzaW9ucyB0aGUgYXNhciAoaWYgYW55KSwgcHJlLXNlZWRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmBcbiAgICogc28gdGhlIHZhdWx0IG9wZW5zIGRpcmVjdGx5LCBsYXVuY2hlcyB0aGUgaW5zdGFuY2Ugb24gYSBmcmVlIENEUCBwb3J0LCB0aGVuXG4gICAqIHdhaXRzIHVudGlsIHRoZSB2YXVsdCB3aW5kb3cgaXMgcmVhZHkgYW5kIGRpc21pc3NlcyB0aGUgdHJ1c3QgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuc3VyZU5vbk51bGxhYmxlKHRoaXMub3duZWRDb25maWcpO1xuXG4gICAgaWYgKHRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgLy8gQSBwcmlvciB2YXVsdCdzIGluc3RhbmNlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhpcyAocGVyLXdvcmtlciBjYWNoZWQpXG4gICAgICAvLyBUcmFuc3BvcnQuIFJlbGF1bmNoIGZyZXNoIGZvciB0aGUgbmV3IHZhdWx0OiByZWxhdW5jaGluZyBvdmVyIHRoZSBsaXZlXG4gICAgICAvLyBJbnN0YW5jZSBpcyBmb3J3YXJkZWQgYnkgRWxlY3Ryb24ncyBzaW5nbGUtaW5zdGFuY2UgbG9jayBvbiB0aGUgc2hhcmVkXG4gICAgICAvLyBVc2VyLWRhdGEgZGlyIGFuZCBzdXJmYWNlcyB0aGUgdmF1bHQgcGlja2VyLCBhbmQgb3BlbmluZyBhIHNlY29uZCB3aW5kb3dcbiAgICAgIC8vIFZpYSBJUEMgbGVhdmVzIHN0YWxlIHdpbmRvd3MgdGhhdCBicmVhayB2YXVsdC10YXJnZXQgcm91dGluZy4gU28ga2lsbCB0aGVcbiAgICAgIC8vIFJ1bm5pbmcgaW5zdGFuY2UsIHdhaXQgZm9yIGl0IHRvIGV4aXQgKHJlbGVhc2luZyB0aGUgbG9jayksIHRoZW4gbGF1bmNoXG4gICAgICAvLyBBZ2FpbiBiZWxvdyB3aXRoIHRoZSBuZXcgdmF1bHQgcHJlLXNlZWRlZCBcdTIwMTQgZWFjaCB2YXVsdCBnZXRzIGEgcHJpc3RpbmVcbiAgICAgIC8vIFNpbmdsZS13aW5kb3cgaW5zdGFuY2Ugb3BlbmVkIGRpcmVjdGx5LCBuZXZlciB0aGUgc2VsZWN0b3IuXG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSZWxhdW5jaGluZyBvd25lZCBpbnN0YW5jZSBmb3IgbmV3IHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgY29uc3QgcHJldmlvdXNDZHBVcmwgPSB0aGlzLmNkcFVybDtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZS5raWxsKCk7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbnN0YW5jZUV4aXQocHJldmlvdXNDZHBVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBMYXVuY2hpbmcgb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICB9XG5cbiAgICBta2RpclN5bmMoY29uZmlnLnVzZXJEYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBpZiAoY29uZmlnLmFzYXIpIHtcbiAgICAgIGNvcHlBc2FySW50b1VzZXJEYXRhKGNvbmZpZy5hc2FyLnBhdGgsIGNvbmZpZy5hc2FyLnZlcnNpb24sIGNvbmZpZy51c2VyRGF0YURpcik7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRJZCA9IHJhbmRvbUJ5dGVzKFZBVUxUX0lEX0JZVEVfTEVOR1RIKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgb2JzaWRpYW5Kc29uID0ge1xuICAgICAgdXBkYXRlRGlzYWJsZWQ6IHRydWUsXG4gICAgICB2YXVsdHM6IHsgW3ZhdWx0SWRdOiB7IG9wZW46IHRydWUsIHBhdGg6IHZhdWx0UGF0aCwgdHM6IERhdGUubm93KCkgfSB9XG4gICAgfTtcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oY29uZmlnLnVzZXJEYXRhRGlyLCAnb2JzaWRpYW4uanNvbicpLCBKU09OLnN0cmluZ2lmeShvYnNpZGlhbkpzb24pKTtcblxuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKHtcbiAgICAgIGNkcEhvc3Q6IHRoaXMuY2RwSG9zdCxcbiAgICAgIGV4ZVBhdGg6IGNvbmZpZy5leGVQYXRoLFxuICAgICAgZXh0cmFBcmdzOiBbXG4gICAgICAgIC4uLnJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3ModGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSksXG4gICAgICAgIC4uLnJlc29sdmVTYW5kYm94TGF1bmNoQXJncyh0aGlzLnNob3VsZERpc2FibGVTYW5kYm94KVxuICAgICAgXSxcbiAgICAgIHVzZXJEYXRhRGlyOiBjb25maWcudXNlckRhdGFEaXJcbiAgICB9KTtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB0aGlzLmNkcFBvcnQgPSBpbnN0YW5jZS5wb3J0O1xuICAgIHRoaXMuY2RwVXJsID0gaW5zdGFuY2UuY2RwVXJsO1xuXG4gICAgaWYgKHNob3VsZEhpZGVPYnNpZGlhbkFwcCh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSkge1xuICAgICAgYXdhaXQgdGhpcy5tb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIG92ZXIgV2ViU29ja2V0IGFuZCB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBUaGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIENEUCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZENvbW1hbmQod3M6IFdlYlNvY2tldCwgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPENkcFJlc3BvbnNlPiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPENkcFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM6ICR7bWV0aG9kfWApKTtcbiAgICAgIH0sIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtc2cgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5kYXRhKSkgYXMgQ2RwUmVzcG9uc2U7XG4gICAgICAgIGlmIChtc2cuaWQgPT09IGlkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHdzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICByZXNvbHZlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgYSBraWxsZWQgb3duZWQgaW5zdGFuY2UncyBDRFAgZW5kcG9pbnQgdW50aWwgaXQgc3RvcHMgcmVzcG9uZGluZyxcbiAgICogY29uZmlybWluZyB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpciBiZWZvcmUgYSBmcmVzaCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBpbnRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY2RwVXJsIC0gVGhlIENEUCBVUkwgb2YgdGhlIGluc3RhbmNlIHRoYXQgd2FzIGp1c3Qga2lsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5zdGFuY2VFeGl0KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgcHJldmlvdXMgb3duZWQgaW5zdGFuY2UgYXQgJHtjZHBVcmx9IHRvIGV4aXQuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBlbmRwb2ludCBpcyBnb25lOiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCB0aGUgbG9jay5cbiAgICAgICAgYXdhaXQgZGVsYXkoSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBQcmV2aW91cyBpbnN0YW5jZSBzdGlsbCByZXNwb25kZWQgYmVmb3JlIHRpbWVvdXQ7IHJlbGF1bmNoaW5nIGFueXdheS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHZhdWx0J3MgYGFwcC53b3Jrc3BhY2VgIHRvIHJlYWNoIGxheW91dC1yZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogYGZpbmRUYXJnZXRGb3JWYXVsdGAgcmV0dXJucyBhcyBzb29uIGFzIGBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpYFxuICAgKiBtYXRjaGVzIFx1MjAxNCB3aGljaCBpcyB0cnVlIHNob3J0bHkgYWZ0ZXIgdGhlIGBBcHBgIGNvbnN0cnVjdG9yIHJ1bnMsIGJlZm9yZVxuICAgKiBgcGx1Z2lucy5pbml0aWFsaXplKClgIChhbmQgYW55IHRydXN0IGRpYWxvZykgaGFzIGV4ZWN1dGVkLiBCb290c3RyYXBwaW5nXG4gICAqIHRoZSBuYW1lc3BhY2UgYW5kIGNhbGxpbmcgYHBvbGxWYXVsdEJhc2VQYXRoKClgIGF3YWl0cyBgbGF5b3V0UmVhZHlgLCBzb1xuICAgKiBieSB0aGUgdGltZSB0aGlzIHJldHVybnMgdGhlIGRpYWxvZyBoYXMgZWl0aGVyIHJlbmRlcmVkIG9yIGlzIG5vdCBnb2luZ1xuICAgKiB0byByZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZSgnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIG93bmVkIGluc3RhbmNlIHVudGlsIHRoZSB2YXVsdCB0YXJnZXQgZXhpc3RzLCBsYXlvdXQgaXMgcmVhZHksIGFuZFxuICAgKiB0aGUgdHJ1c3QgZGlhbG9nIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogQmV0d2VlbiByZWFkaW5lc3MgYXR0ZW1wdHMgaXQgYWxzbyBjaGVja3MgZm9yIGEgKipkZWFkIGJvb3QqKiBcdTIwMTQgdGhlIHJlbmRlcmVyXG4gICAqIGxvYWRlZCAoYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkgYnV0IHRoZSBhcHAgbmV2ZXIgYm9vdHN0cmFwcGVkXG4gICAqIChlbXB0eSBgPGJvZHk+YCwgbm8gYHdpbmRvdy5hcHBgKSwgdGhlIHRlcm1pbmFsIHN0YXRlIHdoZW4gdGhlIGFzYXIgY2Fubm90XG4gICAqIHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwuIE9uY2UgdGhhdCBzdGF0ZSBoYXMgaGVsZCBmb3IgdGhlXG4gICAqIGNvbmZpZ3VyZWQgZ3JhY2Ugd2luZG93IGl0IHRocm93cyBhIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzcyB0aW1lb3V0LiBBIGdyYWNlIG9mXG4gICAqIGAwYCBkaXNhYmxlcyB0aGUgZmFzdC1mYWlsLiBUaGUgZ3JhY2UgY2xvY2sgc3RhcnRzIHdoZW4gdGhlIHJlbmRlcmVyIGZpcnN0XG4gICAqIHJlcG9ydHMgYGNvbXBsZXRlYCwgc28gYSBzbG93IGxvYWQgYmVmb3JlIHRoZW4gaXMgbmV2ZXIgY291bnRlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIG93bmVkIHZhdWx0IHRvIGJlY29tZSByZWFkeSAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBkb2N1bWVudENvbXBsZXRlU2luY2U6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IGlzIHJlYWR5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgdGFyZ2V0IG5vdCByZWFkeSB5ZXQuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YXRpb24gPSBhd2FpdCB0aGlzLnByb2JlUmVuZGVyZXJCb290U3RhdGUoKTtcbiAgICAgICAgaWYgKG9ic2VydmF0aW9uKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmF0aW9uLmlzRG9jdW1lbnRDb21wbGV0ZSAmJiBkb2N1bWVudENvbXBsZXRlU2luY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGhhc0dyYWNlRWxhcHNlZCA9IGRvY3VtZW50Q29tcGxldGVTaW5jZSAhPT0gbnVsbFxuICAgICAgICAgICAgJiYgRGF0ZS5ub3coKSAtIGRvY3VtZW50Q29tcGxldGVTaW5jZSA+PSB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICBpZiAoY2hlY2tSZW5kZXJlckJvb3RTdGF0ZSh7IC4uLm9ic2VydmF0aW9uLCBoYXNHcmFjZUVsYXBzZWQgfSkgPT09ICdkZWFkJykge1xuICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgcmVuZGVyZXIgZmFpbGVkIHRvIGluaXRpYWxpemUgKGRlYWQgYm9vdCk7IGZhaWxpbmcgZmFzdC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yKHZhdWx0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPd25lZCB2YXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcgZW5hYmxlZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gIGNvbnN0IGZsYWcgPSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnQ9JHtTdHJpbmcocG9ydCl9YDtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9YDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfSAmYDtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byByZW1vdmUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHksIHJldHVybmluZyB3aGV0aGVyIGl0IHN1Y2NlZWRlZC5cbiAqXG4gKiBAcGFyYW0gZGlyIC0gVGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiB0aGUgcmVtb3ZhbCB0aHJldyAoZS5nLiBoYW5kbGVzIGhlbGQpLlxuICovXG5mdW5jdGlvbiB0cnlSZW1vdmVEaXIoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBybVN5bmMoZGlyLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQkEseUJBQTRCO0FBQzVCLHFCQUlPO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQVVwQixrQ0FBMEM7QUFDMUMsa0JBQXFCO0FBQ3JCLGlCQUFvQjtBQUNwQixpQ0FBNEM7QUFDNUMsNkJBSU87QUFDUCxpQ0FBMEM7QUFDMUMsK0JBQTRDO0FBQzVDLHFDQUFxQztBQUNyQyxxQ0FHTztBQUNQLGlEQUFnRDtBQUNoRCx5QkFBa0M7QUFDbEMsd0JBSU87QUFvSlAsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sNkNBQTZDO0FBQ25ELE1BQU0sMENBQTBDO0FBQ2hELE1BQU0sNENBQTRDO0FBQ2xELE1BQU0sa0RBQWtEO0FBUWpELE1BQU0sb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJNUMsV0FBVztBQUFBLEVBQ25CLGtCQUFpQztBQUFBLEVBQ3hCO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNTO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDVCxZQUFZO0FBQUEsRUFDSDtBQUFBLEVBQ1Q7QUFBQSxFQUNTO0FBQUEsRUFDVCxLQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU94QixZQUFZLFFBQW9DO0FBQ3JELFNBQUssVUFBVSxRQUFRLFdBQVc7QUFDbEMsU0FBSywrQkFBK0IsUUFBUSxnQ0FBZ0M7QUFDNUUsU0FB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
819
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB9IGZyb20gJy4vb2JzaWRpYW4taW5zdGFuY2UuY2pzJztcbmltcG9ydCB0eXBlIHsgUmVuZGVyZXJCb290T2JzZXJ2YXRpb24gfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSIH0gZnJvbSAnLi9kaXNtaXNzLXRydXN0LWRpYWxvZy5janMnO1xuaW1wb3J0IHsgY2hlY2tFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7XG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUuY2pzJztcbmltcG9ydCB7IGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZSB9IGZyb20gJy4vb2JzaWRpYW4taW5zdGFuY2UuY2pzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmltcG9ydCB7IGNvcHlBc2FySW50b1VzZXJEYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5janMnO1xuaW1wb3J0IHtcbiAgY2hlY2tSZW5kZXJlckJvb3RTdGF0ZSxcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTXG59IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3MsXG4gIHJlc29sdmVTYW5kYm94TGF1bmNoQXJncyxcbiAgc2hvdWxkSGlkZU9ic2lkaWFuQXBwXG59IGZyb20gJy4vdmlzaWJpbGl0eS5janMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBDRFAgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcge1xuICAvKipcbiAgICogQ0RQIGhvc3QuIERlZmF1bHRzIHRvIGAnbG9jYWxob3N0J2AuXG4gICAqL1xuICBjZHBIb3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBmb3IgKiphdHRhY2gqKiBtb2RlICh0aGUgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCB0aGUgcnVubmluZ1xuICAgKiBPYnNpZGlhbiB3YXMgbGF1bmNoZWQgd2l0aCkuIEluIG93bmVkLWluc3RhbmNlIG1vZGUgdGhpcyBpcyBpZ25vcmVkIFx1MjAxNCBhXG4gICAqIGZyZWUgcG9ydCBpcyBjaG9zZW4gYXQgbGF1bmNoLlxuICAgKi9cbiAgY2RwUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byBgMzAwMDBgLlxuICAgKi9cbiAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSAoZW1wdHkgYDxib2R5PmAgd2l0aCBubyBgd2luZG93LmFwcGAgYWZ0ZXIgdGhlIHJlbmRlcmVyIHJlYWNoZWRcbiAgICogYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFN9LiBgMGAgZGlzYWJsZXMgZmFzdC1mYWlsLlxuICAgKi9cbiAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGF0dGFjaGluZyAoaS5lLiB7QGxpbmsgY2RwUG9ydH0gaXMgc2V0KSwgbWFya3MgdGhlIHRhcmdldCBhcyBhXG4gICAqICoqaGFybmVzcy1vd25lZCwgYWxyZWFkeS1wcmVwYXJlZCoqIGluc3RhbmNlLiBTdXBwcmVzc2VzIHRoZSB1c2VyLXNjb3BlXG4gICAqIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQsIHNpbmNlIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuXG4gICAqIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcgcmF0aGVyIHRoYW4gdGhlIHVzZXItc2NvcGUgcmVnaXN0cnkuXG4gICAqL1xuICBpc0hhcm5lc3NPd25lZEluc3RhbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3duZWQgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi4gV2hlbiBgZmFsc2VgICh0aGVcbiAgICogZGVmYXVsdCksIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCB3aXRoIGtlZXAtYWxpdmUgQ2hyb21pdW0gZmxhZ3MgYW5kXG4gICAqIGl0cyB3aW5kb3cgaXMgbW92ZWQgb2ZmLXNjcmVlbiBhZnRlciBsYXVuY2guIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlO1xuICAgKiBhdHRhY2ggbW9kZSBuZXZlciB0b3VjaGVzIHRoZSAodXNlcidzKSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNPYnNpZGlhbkFwcFZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICAgKiBpbnN0ZWFkIG9mIGF0dGFjaGluZyB0byBhIHJ1bm5pbmcgb25lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgbW9kZS5cbiAgICovXG4gIG93bmVkSW5zdGFuY2U/OiBPd25lZEluc3RhbmNlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS4gTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkXG4gICAqIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBleHRyYWN0ZWQgcG9ydGFibGUgc2hlbGwsIG9yIENJIGFzIGFcbiAgICogbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyIGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGFzYXIncyBgeC55LnpgIHZlcnNpb24uICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlLlxuICpcbiAqIFdoZW4gcHJlc2VudCwgdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBpdHMgb3duIE9ic2lkaWFuIHByb2Nlc3NcbiAqIGFnYWluc3QgYW4gaXNvbGF0ZWQgdXNlci1kYXRhIGRpciBpbnN0ZWFkIG9mIGF0dGFjaGluZyB0byBhIHJ1bm5pbmcgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUNvbmZpZyB7XG4gIC8qKiBPcHRpb25hbCBhc2FyIHRvIHByb3Zpc2lvbiBpbnRvIHtAbGluayB1c2VyRGF0YURpcn0gYmVmb3JlIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpci4gQ3JlYXRlZCBhbmQgb3duZWQgYnkgdGhlXG4gICAqIHRyYW5zcG9ydCwgYW5kIGRlbGV0ZWQgb24gZGlzcG9zZS5cbiAgICovXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25EZXRhaWxzIHtcbiAgZXhjZXB0aW9uPzogQ2RwRXhjZXB0aW9uT2JqZWN0O1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25PYmplY3Qge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlIHtcbiAgaWQ6IG51bWJlcjtcbiAgcmVzdWx0PzogQ2RwUmVzcG9uc2VSZXN1bHQ7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIFRoZSBDRFAgZW5kcG9pbnQgb2YgYSBsYXVuY2hlZCwgaGFybmVzcy1vd25lZCBpbnN0YW5jZS5cbiAqL1xuaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKiBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS4gKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDAwO1xuY29uc3QgVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjAwMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogQ29ubmVjdHMgdG8gT2JzaWRpYW4ncyBDRFAgV2ViU29ja2V0IGVuZHBvaW50LCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWBcbiAqIGNvbW1hbmRzLCBhbmQgcm91dGVzIGV4cHJlc3Npb25zIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDZHBUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgZmFsc2VgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVZhdWx0UGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RwSG9zdDogc3RyaW5nO1xuICBwcml2YXRlIGNkcFBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjZHBVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgZWxlY3Ryb25Db21wYXRpYmlsaXR5OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IG93bmVkQ29uZmlnOiBPd25lZEluc3RhbmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bmVkSW5zdGFuY2U6IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xuICBwcml2YXRlIHdzOiBudWxsIHwgV2ViU29ja2V0ID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDRFAgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ0RQIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgdGhpcy5jZHBIb3N0ID0gY29uZmlnPy5jZHBIb3N0ID8/ICdsb2NhbGhvc3QnO1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZz8uY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID0gY29uZmlnPy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA9IGNvbmZpZz8uaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/PyBmYWxzZTtcbiAgICB0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlID0gY29uZmlnPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyB0cnVlO1xuICAgIHRoaXMub3duZWRDb25maWcgPSBjb25maWc/Lm93bmVkSW5zdGFuY2U7XG4gICAgdGhpcy5zaG91bGREaXNhYmxlU2FuZGJveCA9IGNvbmZpZz8uc2hvdWxkRGlzYWJsZVNhbmRib3ggPz8gZmFsc2U7XG4gICAgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID0gY29uZmlnPy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID8/IHRydWU7XG4gICAgLy8gT3duZWQgbW9kZSBwaWNrcyBhIGZyZWUgcG9ydCBhdCBsYXVuY2ggKGFzc2lnbmVkIGluIHJlZ2lzdGVyVmF1bHQpLlxuICAgIC8vIEF0dGFjaCBtb2RlIGNvbm5lY3RzIHRvIHRoZSBjb25maWd1cmVkIHBvcnQ7IG5vIHBvcnQgaXMgaGFyZGNvZGVkLlxuICAgIHRoaXMuY2RwUG9ydCA9IGNvbmZpZz8uY2RwUG9ydCA/PyAwO1xuICAgIHRoaXMuY2RwVXJsID0gY29uZmlnPy5jZHBQb3J0ID09PSB1bmRlZmluZWQgPyAnJyA6IGBodHRwOi8vJHt0aGlzLmNkcEhvc3R9OiR7U3RyaW5nKGNvbmZpZy5jZHBQb3J0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIG9mIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kLCBpbiBvd25lZC1pbnN0YW5jZSBtb2RlLFxuICAgKiBraWxscyB0aGUgb3duZWQgT2JzaWRpYW4gcHJvY2VzcyBhbmQgcmVtb3ZlcyBpdHMgaXNvbGF0ZWQgdXNlci1kYXRhIGRpci5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgaXMgcmV0cmllZCBiZWNhdXNlIFdpbmRvd3MgYnJpZWZseSBob2xkcyB0aGUganVzdC1raWxsZWRcbiAgICogcHJvY2VzcydzIGZpbGUgaGFuZGxlcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGZhaWwgYHJtU3luY2Agd2l0aCBgRVBFUk1gLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgY29uc3QgeyB1c2VyRGF0YURpciB9ID0gdGhpcy5vd25lZENvbmZpZztcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKHRyeVJlbW92ZURpcih1c2VyRGF0YURpcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGlmICghdHJ5UmVtb3ZlRGlyKHVzZXJEYXRhRGlyKSkge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IHJlbW92ZSBvd25lZCB1c2VyLWRhdGEgZGlyIHdpdGhpbiAke1N0cmluZyhVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWwpOiAke3VzZXJEYXRhRGlyfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCBcdTIwMTQga2lsbHMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBtYWtlcyBhIGJlc3QtZWZmb3J0XG4gICAqIHJlbW92YWwgb2YgaXRzIHVzZXItZGF0YSBkaXIuIFNhZmUgdG8gY2FsbCBmcm9tIGEgcHJvY2VzcyBgZXhpdGAgaGFuZGxlclxuICAgKiAod2hlcmUgYXN5bmMgcmV0cmllcyBhcmUgaW1wb3NzaWJsZTsgYSBsZWZ0b3ZlciB0ZW1wIGRpciBpcyBhY2NlcHRhYmxlKS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgICBpZiAoIXRyeVJlbW92ZURpcih0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyKSkge1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB1c2VyLWRhdGEgZGlyIG5vdCByZW1vdmVkIHN5bmNocm9ub3VzbHkgKHByb2Nlc3MgbWF5IHN0aWxsIGhvbGQgaGFuZGxlcyk6ICR7dGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgQ0RQIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAgICpcbiAgICogUm91dGVzIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCBiYXNlZCBvbiBgb3B0aW9ucy5jd2RgLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKG9wdGlvbnMuY3dkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LmV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24/LmRlc2NyaXB0aW9uXG4gICAgICAgID8/IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLnRleHQ7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENEUCBldmFsdWF0aW9uIGVycm9yOiAke2Rlc2N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0T2JqID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHRPYmogfHwgcmVzdWx0T2JqLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gTk9fT1VUUFVUO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcocmVzdWx0T2JqLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkXG4gICAqIGluc3RhbmNlLCBzbyBjYWxsZXJzIGNhbiBhc3NlcnQgb24gaXQuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdFxuICAgKiBhbiBvd25lZCBpbnN0YW5jZSwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKGUuZy4gYW5cbiAgICogdW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGUgdGFibGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wYXRpYmlsaXR5KCk6IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm93bmVkQ29uZmlnPy5jb21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkIGluc3RhbmNlIFx1MjAxNFxuICAgKiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaCBmb3IgdGhlXG4gICAqIHJ1bm5pbmcgYXBwIHZlcnNpb24gKHJlYWQgbGl2ZSBwb3N0LWJvb3Q7IHNlZSB7QGxpbmsgT2JzaWRpYW5WZXJzaW9uTWV0YWRhdGEubWluUmVjb21tZW5kZWRFbGVjdHJvblZlcnNpb259KS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90IGFuIG93bmVkIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaGFzIG5vdFxuICAgKiBib290ZWQgeWV0LCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAodGhlIGxpdmUgdmVyc2lvbiB3YXNcbiAgICogdW5yZWFkYWJsZSwgb3IgdGhlIGFwcCB2ZXJzaW9uIGNhcnJpZXMgbm8gcmVjb21tZW5kZWQgRWxlY3Ryb24gdmVyc2lvbikuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5KCk6IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIENEUCBlbmRwb2ludCBvZiB0aGUgb3duZWQsIGxhdW5jaGVkIGluc3RhbmNlIHNvIHRoZSBnbG9iYWwgc2V0dXBcbiAgICogY2FuIGhhbmQgaXQgdG8gdGVzdCB3b3JrZXJzICh3aGljaCB0aGVuICoqYXR0YWNoKiogdG8gaXQgaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgdGhlaXIgb3duKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgdHJhbnNwb3J0IGlzIG5vdCBhblxuICAgKiBvd25lZCBpbnN0YW5jZSwgb3IgaXRzIGluc3RhbmNlIGhhcyBub3QgYmVlbiBsYXVuY2hlZCB5ZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvd25lZCBpbnN0YW5jZSdzIENEUCBob3N0IGFuZCBwb3J0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTogT3duZWRJbnN0YW5jZUVuZHBvaW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcgfHwgIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdDogdGhpcy5jZHBIb3N0LCBwb3J0OiB0aGlzLmNkcFBvcnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBDRFAgZW5kcG9pbnQgaXMgcmVhY2hhYmxlIGFuZCBoYXMgT2JzaWRpYW4gdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcsIGF0dGVtcHRzIHRvIGF1dG8tc3RhcnQgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgZm9yIHZhdWx0IHJlZ2lzdHJhdGlvbiBjaGVjaykuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZyB8fCB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UpIHtcbiAgICAgIC8vIE93bmVkIGluc3RhbmNlIChsYXVuY2hlZCBoZXJlKSBvciBhIHdvcmtlciBhdHRhY2hlZCB0byBvbmU6IHJlYWRpbmVzcyBpc1xuICAgICAgLy8gR3VhcmFudGVlZCBieSB0aGUgZ2xvYmFsIHNldHVwJ3MgcmVnaXN0ZXJWYXVsdCwgYW5kIHRoZSB2YXVsdCBsaXZlcyBpblxuICAgICAgLy8gVGhlIGlzb2xhdGVkIGNvbmZpZyBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkgYWdhaW5zdCB0aGUgdXNlci1zY29wZVxuICAgICAgLy8gUmVnaXN0cnkuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGFnZSB0YXJnZXRzJyk7XG4gICAgICB9XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDRFAgcmVhY2hhYmxlLCAke1N0cmluZyh0YXJnZXRzLmxlbmd0aCl9IHRhcmdldChzKSBmb3VuZC5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IHZpYSBFbGVjdHJvbiBJUEMgZXZhbHVhdGVkIHRocm91Z2ggQ0RQLlxuICAgKlxuICAgKiBVc2VzIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldCB0byBzZW5kIHRoZSBgdmF1bHQtb3BlbmAgSVBDIGNvbW1hbmQsXG4gICAqIHRoZW4gcG9sbHMgdW50aWwgdGhlIG5ldyB2YXVsdCdzIHRhcmdldCBhcHBlYXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGJ5IGRlc3Ryb3lpbmcgaXRzIHdpbmRvdyBhbmQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICAvLyBUaGUgb3duZWQgaW5zdGFuY2UgaXMga2lsbGVkIHdob2xlc2FsZSBvbiBkaXNwb3NlOyBubyBwZXItdmF1bHRcbiAgICAgIC8vIFVucmVnaXN0ZXIgaXMgbmVlZGVkIChhbmQgdGhlIHJlZ2lzdHJ5IGxpdmVzIGluIHRoZSBpc29sYXRlZCBjb25maWcpLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZXN0cm95RXhwciA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5kZXN0cm95Q3VycmVudFdpbmRvdygpJztcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IGRlc3Ryb3lFeHByLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2luZG93IG1heSBhbHJlYWR5IGJlIGNsb3NlZC5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgYXJnczogW3ZhdWx0UGF0aF0sIGNoYW5uZWw6ICd2YXVsdC1yZW1vdmUnIH0pfSlgO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogcmVtb3ZlRXhwcixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTm8gQ0RQIHRhcmdldHMgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCByZW1vdmluZyBkaXJlY3RseSBmcm9tIG9ic2lkaWFuLmpzb24uJyk7XG4gICAgICByZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmVzdC1lZmZvcnQgdGllci0yIHJ1bnRpbWUgbmFnOiByZWFkcyB0aGUgbGl2ZSBFbGVjdHJvbiB2ZXJzaW9uIGFuZCBydW5uaW5nXG4gICAqIGFwcCB2ZXJzaW9uIGZyb20gdGhlIGJvb3RlZCBvd25lZCByZW5kZXJlciBhbmQgd2FybnMgd2hlbiB0aGUgRWxlY3Ryb24gdGhlXG4gICAqIGluc3RhbmNlIGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgb2xkZXIgdGhhbiB0aGUgYXBwJ3MgcmVjb21tZW5kZWQgbWluaW11bS5cbiAgICogU3RvcmVzIHRoZSB2ZXJkaWN0IG9uIHtAbGluayBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9LlxuICAgKlxuICAgKiBUaGUgYXBwIHZlcnNpb24gaXMgcmVhZCAqKmxpdmUqKiBcdTIwMTQgdGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZnJvbSB0aGUgbWFpblxuICAgKiBwcm9jZXNzIChgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZlcnNpb24nKWAsIHRoZSBzYW1lIElQQyBjaGFubmVsIHRoZSBuYW1lc3BhY2VcbiAgICogYm9vdHN0cmFwIHVzZXMpIHJhdGhlciB0aGFuIGZyb20gdGhlIHJlc29sdmVkIGNvbmZpZyBcdTIwMTQgc28gdGhlIG5hZyByZWZsZWN0cyB0aGVcbiAgICogdmVyc2lvbiBnZW51aW5lbHkgcnVubmluZyBhY3Jvc3MgZXZlcnkgb3duZWQgc3ViLXBhdGggKGFzYXItc3dhcCAvIGRvd25ncmFkZSAvXG4gICAqIG93bi1pbnN0YWxsZXIpIGFuZCBzdGF5cyB0cnV0aGZ1bCBldmVuIHVuZGVyIGEgc2lsZW50IGFzYXIgZmFsbGJhY2suXG4gICAqIGBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uYCBnaXZlcyB0aGUgc2hlbGwncyBsaXZlIEVsZWN0cm9uLiBCb3RoIGFyZSByZWFkIGF0XG4gICAqIHRoZSByZW5kZXJlciB0b3AgbGV2ZWwgKG5vIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggcmVzb2x2ZXMgb25seSBpbnNpZGUgYVxuICAgKiBwbHVnaW4tbG9hZCBjb250ZXh0KS4gTmV2ZXIgdGhyb3dzIFx1MjAxNCBhIHJlYWQgZmFpbHVyZSBpcyBsb2dnZWQgYW5kIGlnbm9yZWQsIHNvXG4gICAqIGl0IGNhbm5vdCBicmVhayBhbiBvdGhlcndpc2UtcmVhZHkgYm9vdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1J1bnRpbWVFbGVjdHJvbkNvbXBhdGliaWxpdHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyh3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoXFwndmVyc2lvblxcJykpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGNvbnN0IGFjdHVhbEVsZWN0cm9uVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyhwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gY2hlY2tFbGVjdHJvbkNvbXBhdGliaWxpdHkoe1xuICAgICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24sXG4gICAgICAgIGFwcFZlcnNpb24sXG4gICAgICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgICAgIH0pO1xuICAgICAgdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB2ZXJkaWN0O1xuICAgICAgaWYgKHZlcmRpY3QudGllciA9PT0gJ25hZ2dlZCcgJiYgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKSB7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IGNoZWNrIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0byBhIENEUCB0YXJnZXQncyBXZWJTb2NrZXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBjb25uZWN0IHRvLlxuICAgKiBAcmV0dXJucyBUaGUgb3BlbiBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvVGFyZ2V0KHRhcmdldDogQ2RwVGFyZ2V0KTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3cy5vbm9wZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG4gICAgICB3cy5vbmVycm9yID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byBDRFAgdGFyZ2V0OiAke3RhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybH1gKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB3cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLndzID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEFjdHMgYXMgYSBzYWZldHkgbmV0IHdoZW4gYGVuYWJsZS1wbHVnaW4tPGlkPmAgaXMgd3JpdHRlbiBpbiBvbmUgcmVuZGVyZXJcbiAgICogYnV0IG5vdCB5ZXQgdmlzaWJsZSB0byB0aGUgbmV3bHktb3BlbmVkIHZhdWx0J3MgcmVuZGVyZXIgKHJhY2Ugb2JzZXJ2ZWRcbiAgICogaW4gT2JzaWRpYW4gMS4xMy4wKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIEFuIG9wZW4gV2ViU29ja2V0IHRvIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldC5cbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh3czogV2ViU29ja2V0LCB2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgaWYgKCF2YXVsdElkKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgZmluZCB2YXVsdCBJRCBcdTIwMTQgc2tpcHBpbmcgbG9jYWxTdG9yYWdlIHRydXN0IGZsYWcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2AsXG4gICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGVyZSBpcyBhbiBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0LlxuICAgKlxuICAgKiBSZXVzZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gaWYgaXQgdGFyZ2V0cyB0aGUgcmVxdWVzdGVkIHZhdWx0LlxuICAgKiBPdGhlcndpc2UsIGZpbmRzIHRoZSBjb3JyZWN0IHRhcmdldCBhbmQgcmVjb25uZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHRhcmdldC5cbiAgICogQHJldHVybnMgVGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQ29ubmVjdGlvbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOICYmIHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLndzO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICB0aGlzLndzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IHZhdWx0UGF0aDtcbiAgICByZXR1cm4gdGhpcy53cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiB3aXRoIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCBub3QgcmVhY2hhYmxlLiBTdGFydGluZyBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcuLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQodGhpcy5jZHBQb3J0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBDRFAgZW5kcG9pbnQgYXQgJHt0aGlzLmNkcFVybH0gKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPYnNpZGlhbiBDRFAgcmVhZHksICR7U3RyaW5nKHRhcmdldHMubGVuZ3RoKX0gdGFyZ2V0KHMpIGZvdW5kLmApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENEUCBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGFjY2Vzc2libGUuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIENEUCB0YXJnZXQgdGhhdCBoYXMgdGhlIGdpdmVuIHZhdWx0IG9wZW4uXG4gICAqXG4gICAqIEZvciBhIHNpbmdsZSB0YXJnZXQsIHJldHVybnMgaXQgZGlyZWN0bHkuIEZvciBtdWx0aXBsZSB0YXJnZXRzLFxuICAgKiBwcm9iZXMgZWFjaCBieSBldmFsdWF0aW5nIGBnZXRCYXNlUGF0aCgpYCB0byBmaW5kIHRoZSBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIG1hdGNoLlxuICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgQ0RQIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuXG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGZvdW5kJyk7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHRhcmdldCk7XG4gICAgICAgIGlmIChiYXNlUGF0aCA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdCBhIHZhdWx0IHRhcmdldCBvciBub3QgcmVhZHkuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDRFAgdGFyZ2V0IGZvdW5kIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBwYWdlLXR5cGUgdGFyZ2V0cyBmcm9tIHRoZSBDRFAgYC9qc29uYCBlbmRwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgcGFnZSB0YXJnZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlVGFyZ2V0cygpOiBQcm9taXNlPENkcFRhcmdldFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmNkcFVybH0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuZmlsdGVyKCh0KSA9PiB0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIG93bmVkIGluc3RhbmNlJ3Mgd2luZG93IG9mZi1zY3JlZW4gc28gYSBoaWRkZW4gcnVuIG5ldmVyIHN0ZWFsc1xuICAgKiBmb2N1cy4gVXNlcyBFbGVjdHJvbidzIHJlbW90ZSBicmlkZ2UgKGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYCkgXHUyMDE0IHRoZSBvbmx5XG4gICAqIGNyb3NzLXBsYXRmb3JtIHdheSB0byByZXBvc2l0aW9uIHRoZSB3aW5kb3cgXHUyMDE0IHBsYWNpbmcgaXQganVzdCBiZXlvbmQgdGhlXG4gICAqIHJpZ2h0IGVkZ2Ugb2YgYWxsIGRpc3BsYXlzLiBUaGUgd2luZG93IHN0YXlzIFwidmlzaWJsZVwiIHRvIENocm9taXVtIChzb1xuICAgKiB0aW1lcnMsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQga2VlcCB3b3JraW5nKSxcbiAgICogdW5saWtlIG1pbmltaXppbmcsIHdoaWNoIHdvdWxkIGZyZWV6ZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAgICpcbiAgICogVGhlIHJlbW90ZSBicmlkZ2UgaXMgbm90IGF2YWlsYWJsZSB0aGUgaW5zdGFudCBDRFAgc3RhcnRzIHNlcnZpbmcsIHNvIHRoaXNcbiAgICogcG9sbHMgdW50aWwgdGhlIG1vdmUgc3VjY2VlZHMuIEJlc3QtZWZmb3J0OiBpZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtb3ZlZFxuICAgKiB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBrZWVwLWFsaXZlIGxhdW5jaCBmbGFncyBzdGlsbCBhcHBseSBhbmQgdGhlIHJ1blxuICAgKiBwcm9jZWVkcyAod29yc3QgY2FzZSB0aGUgd2luZG93IGlzIGJyaWVmbHkgdmlzaWJsZSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb3ZlRXhwciA9IGAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVtb3RlID0gd2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGU7XG4gICAgICBpZiAoIXJlbW90ZSB8fCB0eXBlb2YgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3cgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuICduby1icmlkZ2UnOyB9XG4gICAgICBjb25zdCB3aW4gPSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpO1xuICAgICAgY29uc3QgZGlzcGxheXMgPSByZW1vdGUuc2NyZWVuLmdldEFsbERpc3BsYXlzKCk7XG4gICAgICBjb25zdCBtYXhSaWdodCA9IE1hdGgubWF4KC4uLmRpc3BsYXlzLm1hcCgoZGlzcGxheSkgPT4gZGlzcGxheS5ib3VuZHMueCArIGRpc3BsYXkuYm91bmRzLndpZHRoKSk7XG4gICAgICB3aW4uc2V0UG9zaXRpb24obWF4UmlnaHQgKyAke1N0cmluZyhPV05FRF9XSU5ET1dfT0ZGU0NSRUVOX01BUkdJTl9JTl9QSVhFTFMpfSwgMCk7XG4gICAgICByZXR1cm4gJ21vdmVkJztcbiAgICB9KSgpYDtcblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IChhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCkpWzBdO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiBtb3ZlRXhwcixcbiAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE1vdmVkIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBvZmYtc2NyZWVuIChoaWRkZW4gbW9kZSkuJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDRFAgZW5kcG9pbnQgLyB0YXJnZXQgLyByZW1vdGUgYnJpZGdlIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1dJTkRPV19ISURFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IG1vdmUgb3duZWQgd2luZG93IG9mZi1zY3JlZW4gd2l0aGluICR7U3RyaW5nKE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsOyBrZWVwLWFsaXZlIGZsYWdzIHN0aWxsIGFwcGxpZWQpLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgdmF1bHQgaW4gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSB0aGUgYHZhdWx0LW9wZW5gXG4gICAqIEVsZWN0cm9uIElQQyAoZXZhbHVhdGVkIHRocm91Z2ggQ0RQIG9uIGFuIGV4aXN0aW5nIHRhcmdldCksIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIG5ldyB2YXVsdCdzIHdpbmRvdyB0YXJnZXQgYXBwZWFycywgaXMgbGF5b3V0LXJlYWR5LCBhbmQgaXRzIHRydXN0IGRpYWxvZ1xuICAgKiAoaWYgYW55KSBoYXMgYmVlbiBkaXNtaXNzZWQuXG4gICAqXG4gICAqIFNoYXJlZCBieSB0aGUgYXR0YWNoLW1vZGUge0BsaW5rIHJlZ2lzdGVyVmF1bHR9IGFuZCB0aGUgb3duZWQtbW9kZVxuICAgKiBcImluc3RhbmNlIGFscmVhZHkgbGF1bmNoZWRcIiBwYXRoLCBzbyBvcGVuaW5nIGFuIGFkZGl0aW9uYWwgdmF1bHQgbmV2ZXJcbiAgICogcmVsYXVuY2hlcyB0aGUgcHJvY2VzcyAod2hpY2ggd291bGQgc3VyZmFjZSB0aGUgdmF1bHQgcGlja2VyKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGF2YWlsYWJsZS4gSXMgT2JzaWRpYW4gcnVubmluZz8nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpcGNXcyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCBpcGNFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJyB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoaXBjV3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgIGV4cHJlc3Npb246IGlwY0V4cHIsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZShpcGNXcywgdmF1bHRQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXBjV3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCB0YXJnZXQgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBWYXVsdCB0YXJnZXQgZm91bmQuJyk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCB0YXJnZXQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlcyB0aGUgdmF1bHQgcmVuZGVyZXIncyBib290c3RyYXAgc3RhdGUgXHUyMDE0IHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzXG4gICAqIGBjb21wbGV0ZWAsIHdoZXRoZXIgYHdpbmRvdy5hcHBgIGV4aXN0cywgYW5kIHRoZSBgPGJvZHk+YCBjaGlsZCBjb3VudCBcdTIwMTQgZnJvbVxuICAgKiB0aGUgZmlyc3QgcGFnZSB0YXJnZXQsIGZvciBkZWFkLWJvb3QgZGV0ZWN0aW9uLiBUaGlzIHdvcmtzIGV2ZW4gd2hlbiB0aGUgYXBwXG4gICAqIG5ldmVyIGJvb3RzdHJhcHBlZCAodGhlIHJlbmRlcmVyIHBhZ2UgdGFyZ2V0IHN0aWxsIGV4aXN0cyksIHdoaWNoIGlzIGV4YWN0bHlcbiAgICogdGhlIHN0YXRlIGl0IG11c3Qgb2JzZXJ2ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNhbXBsZWQgb2JzZXJ2YXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdGFyZ2V0IGlzIHJlYWNoYWJsZVxuICAgKiAgIG9yIHRoZSBwcm9iZSBmYWlsZWQgKHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZyByYXRoZXIgdGhhbiBmYXN0LWZhaWxpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk6IFByb21pc2U8UmVuZGVyZXJCb290T2JzZXJ2YXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gKGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKSlbMF07XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9iZUV4cHIgPSBgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGJvZHlDaGlsZEVsZW1lbnRDb3VudDogZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuY2hpbGRFbGVtZW50Q291bnQgOiAwLFxuICAgICAgICAgIGhhc1dpbmRvd0FwcDogdHlwZW9mIHdpbmRvdy5hcHAgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgIGlzRG9jdW1lbnRDb21wbGV0ZTogZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJ1xuICAgICAgICB9KWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogcHJvYmVFeHByLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyBhIHRhcmdldCB0byBkaXNjb3ZlciB3aGljaCB2YXVsdCBwYXRoIGl0IGhhcyBvcGVuLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IFdlYlNvY2tldCBjb25uZWN0aW9uLCBldmFsdWF0ZXMgYGdldEJhc2VQYXRoKClgLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFRoZSB2YXVsdCdzIGJhc2UgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVWYXVsdFBhdGgodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogJ2FwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCknLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBTdHJpbmcocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd3MuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgYW5kIGNvbm5lY3RzIHRvIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIGFcbiAgICogdmF1bHQ6IHByb3Zpc2lvbnMgdGhlIGFzYXIgKGlmIGFueSksIHByZS1zZWVkcyB0aGUgaXNvbGF0ZWQgYG9ic2lkaWFuLmpzb25gXG4gICAqIHNvIHRoZSB2YXVsdCBvcGVucyBkaXJlY3RseSwgbGF1bmNoZXMgdGhlIGluc3RhbmNlIG9uIGEgZnJlZSBDRFAgcG9ydCwgdGhlblxuICAgKiB3YWl0cyB1bnRpbCB0aGUgdmF1bHQgd2luZG93IGlzIHJlYWR5IGFuZCBkaXNtaXNzZXMgdGhlIHRydXN0IGRpYWxvZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLm93bmVkQ29uZmlnKTtcblxuICAgIGlmICh0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIC8vIEEgcHJpb3IgdmF1bHQncyBpbnN0YW5jZSBpcyBzdGlsbCBydW5uaW5nIGluIHRoaXMgKHBlci13b3JrZXIgY2FjaGVkKVxuICAgICAgLy8gVHJhbnNwb3J0LiBSZWxhdW5jaCBmcmVzaCBmb3IgdGhlIG5ldyB2YXVsdDogcmVsYXVuY2hpbmcgb3ZlciB0aGUgbGl2ZVxuICAgICAgLy8gSW5zdGFuY2UgaXMgZm9yd2FyZGVkIGJ5IEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlIGxvY2sgb24gdGhlIHNoYXJlZFxuICAgICAgLy8gVXNlci1kYXRhIGRpciBhbmQgc3VyZmFjZXMgdGhlIHZhdWx0IHBpY2tlciwgYW5kIG9wZW5pbmcgYSBzZWNvbmQgd2luZG93XG4gICAgICAvLyBWaWEgSVBDIGxlYXZlcyBzdGFsZSB3aW5kb3dzIHRoYXQgYnJlYWsgdmF1bHQtdGFyZ2V0IHJvdXRpbmcuIFNvIGtpbGwgdGhlXG4gICAgICAvLyBSdW5uaW5nIGluc3RhbmNlLCB3YWl0IGZvciBpdCB0byBleGl0IChyZWxlYXNpbmcgdGhlIGxvY2spLCB0aGVuIGxhdW5jaFxuICAgICAgLy8gQWdhaW4gYmVsb3cgd2l0aCB0aGUgbmV3IHZhdWx0IHByZS1zZWVkZWQgXHUyMDE0IGVhY2ggdmF1bHQgZ2V0cyBhIHByaXN0aW5lXG4gICAgICAvLyBTaW5nbGUtd2luZG93IGluc3RhbmNlIG9wZW5lZCBkaXJlY3RseSwgbmV2ZXIgdGhlIHNlbGVjdG9yLlxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUmVsYXVuY2hpbmcgb3duZWQgaW5zdGFuY2UgZm9yIG5ldyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQ2RwVXJsID0gdGhpcy5jZHBVcmw7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2Uua2lsbCgpO1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5zdGFuY2VFeGl0KHByZXZpb3VzQ2RwVXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gTGF1bmNoaW5nIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgfVxuXG4gICAgbWtkaXJTeW5jKGNvbmZpZy51c2VyRGF0YURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgaWYgKGNvbmZpZy5hc2FyKSB7XG4gICAgICBjb3B5QXNhckludG9Vc2VyRGF0YShjb25maWcuYXNhci5wYXRoLCBjb25maWcuYXNhci52ZXJzaW9uLCBjb25maWcudXNlckRhdGFEaXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0SWQgPSByYW5kb21CeXRlcyhWQVVMVF9JRF9CWVRFX0xFTkdUSCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG9ic2lkaWFuSnNvbiA9IHtcbiAgICAgIHVwZGF0ZURpc2FibGVkOiB0cnVlLFxuICAgICAgdmF1bHRzOiB7IFt2YXVsdElkXTogeyBvcGVuOiB0cnVlLCBwYXRoOiB2YXVsdFBhdGgsIHRzOiBEYXRlLm5vdygpIH0gfVxuICAgIH07XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGNvbmZpZy51c2VyRGF0YURpciwgJ29ic2lkaWFuLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkob2JzaWRpYW5Kc29uKSk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZSh7XG4gICAgICBjZHBIb3N0OiB0aGlzLmNkcEhvc3QsXG4gICAgICBleGVQYXRoOiBjb25maWcuZXhlUGF0aCxcbiAgICAgIGV4dHJhQXJnczogW1xuICAgICAgICAuLi5yZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmdzKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpLFxuICAgICAgICAuLi5yZXNvbHZlU2FuZGJveExhdW5jaEFyZ3ModGhpcy5zaG91bGREaXNhYmxlU2FuZGJveClcbiAgICAgIF0sXG4gICAgICB1c2VyRGF0YURpcjogY29uZmlnLnVzZXJEYXRhRGlyXG4gICAgfSk7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgdGhpcy5jZHBQb3J0ID0gaW5zdGFuY2UucG9ydDtcbiAgICB0aGlzLmNkcFVybCA9IGluc3RhbmNlLmNkcFVybDtcblxuICAgIGlmIChzaG91bGRIaWRlT2JzaWRpYW5BcHAodGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMubW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBDRFAgY29tbWFuZCBvdmVyIFdlYlNvY2tldCBhbmQgd2FpdHMgZm9yIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gVGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBDRFAgcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRDb21tYW5kKHdzOiBXZWJTb2NrZXQsIG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxDZHBSZXNwb25zZT4ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLm1lc3NhZ2VJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDZHBSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENEUCBjb21tYW5kIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOiAke21ldGhvZH1gKSk7XG4gICAgICB9LCB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbXNnID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcFJlc3BvbnNlO1xuICAgICAgICBpZiAobXNnLmlkID09PSBpZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB3cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgcmVzb2x2ZShtc2cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBpZCwgbWV0aG9kLCBwYXJhbXMgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIGEga2lsbGVkIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGVuZHBvaW50IHVudGlsIGl0IHN0b3BzIHJlc3BvbmRpbmcsXG4gICAqIGNvbmZpcm1pbmcgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBhbmQgcmVsZWFzZWQgRWxlY3Ryb24ncyBzaW5nbGUtaW5zdGFuY2VcbiAgICogbG9jayBvbiB0aGUgc2hhcmVkIHVzZXItZGF0YSBkaXIgYmVmb3JlIGEgZnJlc2ggaW5zdGFuY2UgaXMgbGF1bmNoZWQgaW50byBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNkcFVybCAtIFRoZSBDRFAgVVJMIG9mIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBqdXN0IGtpbGxlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluc3RhbmNlRXhpdChjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHByZXZpb3VzIG93bmVkIGluc3RhbmNlIGF0ICR7Y2RwVXJsfSB0byBleGl0Li4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZW5kcG9pbnQgaXMgZ29uZTogdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBhbmQgcmVsZWFzZWQgdGhlIGxvY2suXG4gICAgICAgIGF3YWl0IGRlbGF5KElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gUHJldmlvdXMgaW5zdGFuY2Ugc3RpbGwgcmVzcG9uZGVkIGJlZm9yZSB0aW1lb3V0OyByZWxhdW5jaGluZyBhbnl3YXkuJyk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSB2YXVsdCdzIGBhcHAud29ya3NwYWNlYCB0byByZWFjaCBsYXlvdXQtcmVhZHkgc3RhdGUuXG4gICAqXG4gICAqIGBmaW5kVGFyZ2V0Rm9yVmF1bHRgIHJldHVybnMgYXMgc29vbiBhcyBgYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKWBcbiAgICogbWF0Y2hlcyBcdTIwMTQgd2hpY2ggaXMgdHJ1ZSBzaG9ydGx5IGFmdGVyIHRoZSBgQXBwYCBjb25zdHJ1Y3RvciBydW5zLCBiZWZvcmVcbiAgICogYHBsdWdpbnMuaW5pdGlhbGl6ZSgpYCAoYW5kIGFueSB0cnVzdCBkaWFsb2cpIGhhcyBleGVjdXRlZC4gQm9vdHN0cmFwcGluZ1xuICAgKiB0aGUgbmFtZXNwYWNlIGFuZCBjYWxsaW5nIGBwb2xsVmF1bHRCYXNlUGF0aCgpYCBhd2FpdHMgYGxheW91dFJlYWR5YCwgc29cbiAgICogYnkgdGhlIHRpbWUgdGhpcyByZXR1cm5zIHRoZSBkaWFsb2cgaGFzIGVpdGhlciByZW5kZXJlZCBvciBpcyBub3QgZ29pbmdcbiAgICogdG8gcmVuZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnBvbGxWYXVsdEJhc2VQYXRoKCknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHRoZSBvd25lZCBpbnN0YW5jZSB1bnRpbCB0aGUgdmF1bHQgdGFyZ2V0IGV4aXN0cywgbGF5b3V0IGlzIHJlYWR5LCBhbmRcbiAgICogdGhlIHRydXN0IGRpYWxvZyAoaWYgYW55KSBoYXMgYmVlbiBkaXNtaXNzZWQuXG4gICAqXG4gICAqIEJldHdlZW4gcmVhZGluZXNzIGF0dGVtcHRzIGl0IGFsc28gY2hlY2tzIGZvciBhICoqZGVhZCBib290KiogXHUyMDE0IHRoZSByZW5kZXJlclxuICAgKiBsb2FkZWQgKGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApIGJ1dCB0aGUgYXBwIG5ldmVyIGJvb3RzdHJhcHBlZFxuICAgKiAoZW1wdHkgYDxib2R5PmAsIG5vIGB3aW5kb3cuYXBwYCksIHRoZSB0ZXJtaW5hbCBzdGF0ZSB3aGVuIHRoZSBhc2FyIGNhbm5vdFxuICAgKiBydW4gb24gdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsLiBPbmNlIHRoYXQgc3RhdGUgaGFzIGhlbGQgZm9yIHRoZVxuICAgKiBjb25maWd1cmVkIGdyYWNlIHdpbmRvdyBpdCB0aHJvd3MgYSB7QGxpbmsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcn1cbiAgICogaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbCByZWFkaW5lc3MgdGltZW91dC4gQSBncmFjZSBvZlxuICAgKiBgMGAgZGlzYWJsZXMgdGhlIGZhc3QtZmFpbC4gVGhlIGdyYWNlIGNsb2NrIHN0YXJ0cyB3aGVuIHRoZSByZW5kZXJlciBmaXJzdFxuICAgKiByZXBvcnRzIGBjb21wbGV0ZWAsIHNvIGEgc2xvdyBsb2FkIGJlZm9yZSB0aGVuIGlzIG5ldmVyIGNvdW50ZWQgYWdhaW5zdCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBvd25lZCB2YXVsdCB0byBiZWNvbWUgcmVhZHkgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICBsZXQgZG9jdW1lbnRDb21wbGV0ZVNpbmNlOiBudWxsIHwgbnVtYmVyID0gbnVsbDtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUnVudGltZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGgpO1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBPd25lZCB2YXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IHRhcmdldCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmF0aW9uID0gYXdhaXQgdGhpcy5wcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZhdGlvbikge1xuICAgICAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0RvY3VtZW50Q29tcGxldGUgJiYgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkb2N1bWVudENvbXBsZXRlU2luY2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBoYXNHcmFjZUVsYXBzZWQgPSBkb2N1bWVudENvbXBsZXRlU2luY2UgIT09IG51bGxcbiAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBkb2N1bWVudENvbXBsZXRlU2luY2UgPj0gdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgaWYgKGNoZWNrUmVuZGVyZXJCb290U3RhdGUoeyAuLi5vYnNlcnZhdGlvbiwgaGFzR3JhY2VFbGFwc2VkIH0pID09PSAnZGVhZCcpIHtcbiAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHJlbmRlcmVyIGZhaWxlZCB0byBpbml0aWFsaXplIChkZWFkIGJvb3QpOyBmYWlsaW5nIGZhc3QuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcih2YXVsdFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggT2JzaWRpYW4gd2l0aCByZW1vdGUgZGVidWdnaW5nIGVuYWJsZWQuXG4gKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBpbnN0YWxsZWQgT2JzaWRpYW4gZXhlY3V0YWJsZSAoY292ZXJpbmcgaW5zdGFsbGVyLWJhc2VkXG4gKiBhbmQgYFBBVEhgLWJhc2VkIGluc3RhbGxzIHN1Y2ggYXMgYHNjb29wYCkgYW5kIHZlcmlmaWVzIGl0IGV4aXN0cyBiZWZvcmVcbiAqIHJldHVybmluZyBhIGNvbW1hbmQuIFRocm93cyBpZiBPYnNpZGlhbiBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0IHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgT2JzaWRpYW4gY2Fubm90IGJlIGxvY2F0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICBjb25zdCBmbGFnID0gYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0PSR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfWA7XG4gIH1cblxuICByZXR1cm4gYFwiJHtleGVQYXRofVwiICR7ZmxhZ30gJmA7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgdGhlIHJlbW92YWwgdGhyZXcgKGUuZy4gaGFuZGxlcyBoZWxkKS5cbiAqL1xuZnVuY3Rpb24gdHJ5UmVtb3ZlRGlyKGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcm1TeW5jKGRpciwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJBLHlCQUE0QjtBQUM1QixxQkFJTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFXcEIsa0NBQTBDO0FBQzFDLG9DQUEyQztBQUMzQyxrQkFBcUI7QUFDckIsaUJBQW9CO0FBQ3BCLGlDQUE0QztBQUM1Qyw2QkFJTztBQUNQLGlDQUEwQztBQUMxQywrQkFBNEM7QUFDNUMsK0JBQW1DO0FBQ25DLHFDQUFxQztBQUNyQyxxQ0FHTztBQUNQLGlEQUFnRDtBQUNoRCx5QkFBa0M7QUFDbEMsd0JBSU87QUFpS1AsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sNkNBQTZDO0FBQ25ELE1BQU0sMENBQTBDO0FBQ2hELE1BQU0sNENBQTRDO0FBQ2xELE1BQU0sa0RBQWtEO0FBUWpELE1BQU0sb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJNUMsV0FBVztBQUFBLEVBQ25CLGtCQUFpQztBQUFBLEVBQ3hCO0FBQUEsRUFDVDtBQUFBLEVBQ0E7QUFBQSxFQUNTO0FBQUEsRUFDQTtBQUFBLEVBQ1Q7QUFBQSxFQUNTO0FBQUEsRUFDQTtBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ0g7QUFBQSxFQUNUO0FBQUEsRUFDUztBQUFBLEVBQ0E7QUFBQSxFQUNULEtBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3hCLFlBQVksUUFBb0M7QUFDckQsU0FBSyxVQUFVLFFBQVEsV0FBVztBQUNsQyxTQUFLLCtCQUErQixRQUFRLGdDQUFnQztBQUM1RSxTQUFLLDhCQUE4QixRQUFRLCtCQUErQjtBQUMxRSxTQUFLLHlCQUF5QixRQUFRLDBCQUEwQjtBQUNoRSxTQUFLLHVCQUF1QixRQUFRLHdCQUF3QjtBQUM1RCxTQUFLLGNBQWMsUUFBUTtBQUMzQixTQUFLLHVCQUF1QixRQUFRLHdCQUF3QjtBQUM1RCxTQUFLLGtDQUFrQyxRQUFRLG1DQUFtQztBQUdsRixTQUFLLFVBQVUsUUFBUSxXQUFXO0FBQ2xDLFNBQUssU0FBUyxRQUFRLFlBQVksU0FBWSxLQUFLLFVBQVUsS0FBSyxPQUFPLElBQUksT0FBTyxPQUFPLE9BQU8sQ0FBQztBQUFBLEVBQ3JHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE1BQWEsVUFBeUI7QUFDcEMsU0FBSyxXQUFXO0FBQ2hCLFFBQUksQ0FBQyxLQUFLLGFBQWE7QUFDckI7QUFBQSxJQUNGO0FBRUEsU0FBSyxlQUFlLEtBQUs7QUFDekIsVUFBTSxFQUFFLFlBQVksSUFBSSxLQUFLO0FBQzdCLFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBSSxhQUFhLFdBQVcsR0FBRztBQUM3QjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLE1BQU0sMkNBQTJDO0FBQUEsSUFDekQ7QUFDQSxRQUFJLENBQUMsYUFBYSxXQUFXLEdBQUc7QUFDOUIsMEJBQUksK0RBQStELE9BQU8sb0NBQW9DLENBQUMsbUJBQW1CLFdBQVcsRUFBRTtBQUFBLElBQ2pKO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQW9CO0FBQ3pCLFNBQUssV0FBVztBQUNoQixRQUFJLEtBQUssYUFBYTtBQUNwQixXQUFLLGVBQWUsS0FBSztBQUN6QixVQUFJLENBQUMsYUFBYSxLQUFLLFlBQVksV0FBVyxHQUFHO0FBQy9DLDRCQUFJLG1HQUFtRyxLQUFLLFlBQVksV0FBVyxFQUFFO0FBQUEsTUFDdkk7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsTUFBYSxTQUFTLFlBQW9CLFNBQWdEO0FBQ3hGLFVBQU0sS0FBSyxNQUFNLEtBQUssaUJBQWlCLFFBQVEsR0FBRztBQUNsRCxVQUFNLFdBQVcsTUFBTSxLQUFLLFlBQVksSUFBSSxvQkFBb0I7QUFBQSxNQUM5RCxjQUFjO0FBQUEsTUFDZDtBQUFBLE1BQ0EsZUFBZTtBQUFBLElBQ2pCLENBQUM7QUFFRCxRQUFJLFNBQVMsUUFBUSxrQkFBa0I7QUFDckMsWUFBTSxPQUFPLFNBQVMsT0FBTyxpQkFBaUIsV0FBVyxlQUNwRCxTQUFTLE9BQU8saUJBQWlCO0FBQ3RDLFlBQU0sSUFBSSxNQUFNLHlCQUF5QixJQUFJLEVBQUU7QUFBQSxJQUNqRDtBQUVBLFVBQU0sWUFBWSxTQUFTLFFBQVE7QUFDbkMsUUFBSSxDQUFDLGFBQWEsVUFBVSxTQUFTLGFBQWE7QUFDaEQsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLE9BQU8sVUFBVSxLQUFLO0FBQUEsRUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyxtQkFBdUQ7QUFDNUQsV0FBTyxLQUFLLGFBQWE7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZTywyQkFBOEQ7QUFDbkUsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVPLDJCQUE4RDtBQUNuRSxRQUFJLENBQUMsS0FBSyxlQUFlLENBQUMsS0FBSyxlQUFlO0FBQzVDLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxFQUFFLE1BQU0sS0FBSyxTQUFTLE1BQU0sS0FBSyxRQUFRO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxNQUFhLGVBQWUsV0FBa0M7QUFDNUQsUUFBSSxLQUFLLGVBQWUsS0FBSyx3QkFBd0I7QUFLbkQ7QUFBQSxJQUNGO0FBRUEsd0JBQUksc0RBQXNELFNBQVMsRUFBRTtBQUNyRSxRQUFJLEtBQUMsMENBQWtCLFNBQVMsR0FBRztBQUNqQyxZQUFNLElBQUk7QUFBQSxRQUNSLHdDQUF3QyxTQUFTO0FBQUEsTUFDbkQ7QUFBQSxJQUNGO0FBRUEsUUFBSTtBQUNGLFlBQU0sVUFBVSxNQUFNLEtBQUssZUFBZTtBQUMxQyxVQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLGNBQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBLE1BQ25DO0FBQ0EsMEJBQUksa0NBQWtDLE9BQU8sUUFBUSxNQUFNLENBQUMsbUJBQW1CO0FBQUEsSUFDakYsUUFBUTtBQUNOLFlBQU0sS0FBSyxzQkFBc0I7QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxNQUFhLGNBQWMsV0FBa0M7QUFDM0QsUUFBSSxLQUFLLGFBQWE7QUFDcEIsWUFBTSxLQUFLLDZCQUE2QixTQUFTO0FBQ2pEO0FBQUEsSUFDRjtBQUVBLFVBQU0sS0FBSywyQkFBMkIsU0FBUztBQUFBLEVBQ2pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxnQkFBZ0IsV0FBa0M7QUFDN0QsUUFBSSxLQUFLLGFBQWE7QUFHcEI7QUFBQSxJQUNGO0FBRUEsUUFBSTtBQUNGLGdCQUFNLHdEQUE0QixNQUFNLFNBQVM7QUFDakQsWUFBTSxTQUFTLE1BQU0sS0FBSyxtQkFBbUIsU0FBUztBQUN0RCxZQUFNLEtBQUssTUFBTSxLQUFLLGdCQUFnQixNQUFNO0FBQzVDLFVBQUk7QUFDRixjQUFNLGNBQWM7QUFDcEIsY0FBTSxLQUFLLFlBQVksSUFBSSxvQkFBb0I7QUFBQSxVQUM3QyxjQUFjO0FBQUEsVUFDZCxZQUFZO0FBQUEsVUFDWixlQUFlO0FBQUEsUUFDakIsQ0FBQztBQUFBLE1BQ0gsVUFBRTtBQUNBLFdBQUcsTUFBTTtBQUFBLE1BQ1g7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBRUEsUUFBSSxLQUFLLG9CQUFvQixXQUFXO0FBQ3RDLFdBQUssV0FBVztBQUFBLElBQ2xCO0FBRUEsVUFBTSxNQUFNLGlDQUFpQztBQUU3QyxVQUFNLFVBQVUsTUFBTSxLQUFLLGVBQWU7QUFDMUMsUUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixZQUFNLEtBQUssTUFBTSxLQUFLLG9CQUFnQixzQ0FBa0IsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNuRSxVQUFJO0FBQ0Ysa0JBQU0sd0RBQTRCLE1BQU0sU0FBUztBQUNqRCxjQUFNLGFBQWEsbURBQW1ELEtBQUssVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxlQUFlLENBQUMsQ0FBQztBQUNwSSxjQUFNLEtBQUssWUFBWSxJQUFJLG9CQUFvQjtBQUFBLFVBQzdDLGNBQWM7QUFBQSxVQUNkLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxRQUNqQixDQUFDO0FBQUEsTUFDSCxVQUFFO0FBQ0EsV0FBRyxNQUFNO0FBQUEsTUFDWDtBQUFBLElBQ0YsT0FBTztBQUNMLDBCQUFJLDZGQUF3RjtBQUM1Rix3REFBc0IsU0FBUztBQUFBLElBQ2pDO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBb0JBLE1BQWMsa0NBQWtDLFdBQWtDO0FBQ2hGLFFBQUk7QUFDRixZQUFNLGFBQWEsTUFBTSxLQUFLLFNBQVMsMkRBQTZELEVBQUUsS0FBSyxVQUFVLENBQUM7QUFDdEgsWUFBTSx3QkFBd0IsTUFBTSxLQUFLLFNBQVMscUNBQXFDLEVBQUUsS0FBSyxVQUFVLENBQUM7QUFDekcsWUFBTSxjQUFVLDBEQUEyQjtBQUFBLFFBQ3pDO0FBQUEsUUFDQTtBQUFBLFFBQ0EsY0FBVSw2Q0FBbUIsVUFBVTtBQUFBLE1BQ3pDLENBQUM7QUFDRCxXQUFLLHdCQUF3QjtBQUM3QixVQUFJLFFBQVEsU0FBUyxZQUFZLEtBQUssaUNBQWlDO0FBQ3JFLDRCQUFJLHVCQUFtQixzQ0FBa0IsUUFBUSxPQUFPLENBQUMsRUFBRTtBQUFBLE1BQzdEO0FBQUEsSUFDRixTQUFTLE9BQU87QUFDZCwwQkFBSSwrRUFBK0UsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLElBQ3BHO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYyxnQkFBZ0IsUUFBdUM7QUFDbkUsVUFBTSxLQUFLLElBQUksVUFBVSxPQUFPLG9CQUFvQjtBQUNwRCxVQUFNLElBQUksUUFBYyxDQUFDLFNBQVMsV0FBVztBQUMzQyxTQUFHLFNBQVMsTUFBWTtBQUN0QixnQkFBUTtBQUFBLE1BQ1Y7QUFDQSxTQUFHLFVBQVUsTUFBWTtBQUN2QixlQUFPLElBQUksTUFBTSxvQ0FBb0MsT0FBTyxvQkFBb0IsRUFBRSxDQUFDO0FBQUEsTUFDckY7QUFBQSxJQUNGLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsYUFBbUI7QUFDekIsUUFBSSxLQUFLLElBQUksZUFBZSxVQUFVLE1BQU07QUFDMUMsV0FBSyxHQUFHLE1BQU07QUFBQSxJQUNoQjtBQUNBLFNBQUssS0FBSztBQUNWLFNBQUssa0JBQWtCO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLE1BQWMsbUJBQW1CLFdBQWtDO0FBQ2pFLFVBQU0sU0FBUyxNQUFNLEtBQUssU0FBUyx1REFBMkIsRUFBRSxLQUFLLFVBQVUsQ0FBQztBQUNoRixRQUFJLFdBQVcsUUFBUTtBQUNyQiwwQkFBSSw2REFBNkQ7QUFBQSxJQUNuRTtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhQSxNQUFjLDRCQUE0QixJQUFlLFdBQWtDO0FBQ3pGLFVBQU0sY0FBVSxtQ0FBVyxTQUFTO0FBQ3BDLFFBQUksQ0FBQyxTQUFTO0FBQ1osMEJBQUksa0ZBQTZFO0FBQ2pGO0FBQUEsSUFDRjtBQUVBLFVBQU0sS0FBSyxZQUFZLElBQUksb0JBQW9CO0FBQUEsTUFDN0MsWUFBWSx3QkFBd0IsS0FBSyxVQUFVLGlCQUFpQixPQUFPLEVBQUUsQ0FBQztBQUFBLE1BQzlFLGVBQWU7QUFBQSxJQUNqQixDQUFDO0FBQ0Qsd0JBQUkscUNBQXFDLE9BQU8sbUJBQW1CO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLE1BQWMsaUJBQWlCLFdBQXVDO0FBQ3BFLFFBQUksS0FBSyxJQUFJLGVBQWUsVUFBVSxRQUFRLEtBQUssb0JBQW9CLFdBQVc7QUFDaEYsYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUVBLFNBQUssV0FBVztBQUVoQixVQUFNLFNBQVMsTUFBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3RELFNBQUssS0FBSyxNQUFNLEtBQUssZ0JBQWdCLE1BQU07QUFDM0MsU0FBSyxrQkFBa0I7QUFDdkIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYyx3QkFBdUM7QUFDbkQsd0JBQUksd0ZBQXdGO0FBRTVGLFVBQU0sZ0JBQWdCLE1BQU0seUJBQXlCLEtBQUssT0FBTztBQUNqRSxRQUFJO0FBQ0YsZ0JBQU0sa0JBQUssZUFBZSxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDN0MsUUFBUTtBQUFBLElBRVI7QUFFQSx3QkFBSSwrQ0FBK0MsS0FBSyxNQUFNLGFBQWEsT0FBTyxrQ0FBa0MsQ0FBQyxRQUFRO0FBQzdILFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsWUFBTSxNQUFNLHdDQUF3QztBQUNwRCxVQUFJO0FBQ0YsY0FBTSxVQUFVLE1BQU0sS0FBSyxlQUFlO0FBQzFDLFlBQUksUUFBUSxTQUFTLEdBQUc7QUFDdEIsOEJBQUksdUNBQXVDLE9BQU8sUUFBUSxNQUFNLENBQUMsbUJBQW1CO0FBQ3BGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsUUFBUTtBQUNOLDRCQUFJLGdEQUFnRDtBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUVBLFVBQU0sSUFBSSxNQUFNLGlDQUFpQyxPQUFPLGtDQUFrQyxDQUFDLGtEQUFrRDtBQUFBLEVBQy9JO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxNQUFjLG1CQUFtQixXQUF1QztBQUN0RSxVQUFNLFVBQVUsTUFBTSxLQUFLLGVBQWU7QUFFMUMsUUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixZQUFNLElBQUksTUFBTSwrQkFBK0I7QUFBQSxJQUNqRDtBQUVBLFFBQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsaUJBQU8sc0NBQWtCLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDckM7QUFFQSxlQUFXLFVBQVUsU0FBUztBQUM1QixVQUFJO0FBQ0YsY0FBTSxXQUFXLE1BQU0sS0FBSyxlQUFlLE1BQU07QUFDakQsWUFBSSxhQUFhLFdBQVc7QUFDMUIsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRixRQUFRO0FBQUEsTUFFUjtBQUFBLElBQ0Y7QUFFQSxVQUFNLElBQUksTUFBTSxrQ0FBa0MsU0FBUyxFQUFFO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFjLGlCQUF1QztBQUNuRCxVQUFNLFdBQVcsTUFBTSxNQUFNLEdBQUcsS0FBSyxNQUFNLE9BQU87QUFDbEQsVUFBTSxVQUFVLE1BQU0sU0FBUyxLQUFLO0FBQ3BDLFdBQU8sUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVBLE1BQWMsMkJBQTBDO0FBQ3RELFVBQU0sV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FNYyxPQUFPLHVDQUF1QyxDQUFDO0FBQUE7QUFBQTtBQUk5RSxVQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsV0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFVBQUk7QUFDRixjQUFNLFVBQVUsTUFBTSxLQUFLLGVBQWUsR0FBRyxDQUFDO0FBQzlDLFlBQUksUUFBUTtBQUNWLGdCQUFNLEtBQUssTUFBTSxLQUFLLGdCQUFnQixNQUFNO0FBQzVDLGNBQUk7QUFDRixrQkFBTSxXQUFXLE1BQU0sS0FBSyxZQUFZLElBQUksb0JBQW9CO0FBQUEsY0FDOUQsWUFBWTtBQUFBLGNBQ1osZUFBZTtBQUFBLFlBQ2pCLENBQUM7QUFDRCxnQkFBSSxTQUFTLFFBQVEsUUFBUSxVQUFVLFNBQVM7QUFDOUMsa0NBQUksdUVBQXVFO0FBQzNFO0FBQUEsWUFDRjtBQUFBLFVBQ0YsVUFBRTtBQUNBLGVBQUcsTUFBTTtBQUFBLFVBQ1g7QUFBQSxRQUNGO0FBQUEsTUFDRixRQUFRO0FBQUEsTUFFUjtBQUNBLFlBQU0sTUFBTSwrQ0FBK0M7QUFBQSxJQUM3RDtBQUNBLHdCQUFJLGlFQUFpRSxPQUFPLHlDQUF5QyxDQUFDLGlEQUFpRDtBQUFBLEVBQ3pLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjQSxNQUFjLDJCQUEyQixXQUFrQztBQUN6RSx3QkFBSSxzQ0FBc0MsU0FBUyxFQUFFO0FBQ3JELFVBQU0sVUFBVSxNQUFNLEtBQUssZUFBZTtBQUMxQyxRQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFlBQU0sSUFBSSxNQUFNLHlEQUF5RDtBQUFBLElBQzNFO0FBRUEsVUFBTSxRQUFRLE1BQU0sS0FBSyxvQkFBZ0Isc0NBQWtCLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDdEUsUUFBSTtBQUNGLGdCQUFNLHdEQUE0QixNQUFNLFNBQVM7QUFDakQsWUFBTSxVQUFVLG1EQUFtRCxLQUFLLFVBQVUsRUFBRSxNQUFNLENBQUMsV0FBVyxLQUFLLEdBQUcsU0FBUyxhQUFhLENBQUMsQ0FBQztBQUN0SSxZQUFNLEtBQUssWUFBWSxPQUFPLG9CQUFvQjtBQUFBLFFBQ2hELGNBQWM7QUFBQSxRQUNkLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxNQUNqQixDQUFDO0FBRUQsWUFBTSxLQUFLLDRCQUE0QixPQUFPLFNBQVM7QUFBQSxJQUN6RCxVQUFFO0FBQ0EsWUFBTSxNQUFNO0FBQUEsSUFDZDtBQUVBLHdCQUFJLHFEQUFxRCxPQUFPLGtDQUFrQyxDQUFDLFFBQVE7QUFDM0csVUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFdBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFJO0FBQ0YsY0FBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3ZDLDRCQUFJLHFDQUFxQztBQUN6QyxjQUFNLEtBQUssbUJBQW1CLFNBQVM7QUFDdkMsY0FBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3ZDO0FBQUEsTUFDRixRQUFRO0FBQUEsTUFFUjtBQUNBLFlBQU0sTUFBTSxtQ0FBbUM7QUFBQSxJQUNqRDtBQUNBLFVBQU0sSUFBSSxNQUFNLFlBQVksU0FBUyxnQ0FBZ0MsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJO0FBQUEsRUFDckg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsTUFBYyx5QkFBdUU7QUFDbkYsUUFBSTtBQUNGLFlBQU0sVUFBVSxNQUFNLEtBQUssZUFBZSxHQUFHLENBQUM7QUFDOUMsVUFBSSxDQUFDLFFBQVE7QUFDWCxlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sS0FBSyxNQUFNLEtBQUssZ0JBQWdCLE1BQU07QUFDNUMsVUFBSTtBQUNGLGNBQU0sWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS2xCLGNBQU0sV0FBVyxNQUFNLEtBQUssWUFBWSxJQUFJLG9CQUFvQjtBQUFBLFVBQzlELFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxRQUNqQixDQUFDO0FBQ0QsY0FBTSxRQUFRLFNBQVMsUUFBUSxRQUFRO0FBQ3ZDLFlBQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTyxLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ3pCLFVBQUU7QUFDQSxXQUFHLE1BQU07QUFBQSxNQUNYO0FBQUEsSUFDRixRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxNQUFjLGVBQWUsUUFBb0M7QUFDL0QsVUFBTSxLQUFLLE1BQU0sS0FBSyxnQkFBZ0IsTUFBTTtBQUM1QyxRQUFJO0FBQ0YsWUFBTSxXQUFXLE1BQU0sS0FBSyxZQUFZLElBQUksb0JBQW9CO0FBQUEsUUFDOUQsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2pCLENBQUM7QUFDRCxhQUFPLE9BQU8sU0FBUyxRQUFRLFFBQVEsS0FBSztBQUFBLElBQzlDLFVBQUU7QUFDQSxTQUFHLE1BQU07QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWMsNkJBQTZCLFdBQWtDO0FBQzNFLFVBQU0sYUFBUyxzQ0FBa0IsS0FBSyxXQUFXO0FBRWpELFFBQUksS0FBSyxlQUFlO0FBU3RCLDBCQUFJLDZEQUE2RCxTQUFTLEVBQUU7QUFDNUUsV0FBSyxXQUFXO0FBQ2hCLFlBQU0saUJBQWlCLEtBQUs7QUFDNUIsV0FBSyxjQUFjLEtBQUs7QUFDeEIsV0FBSyxnQkFBZ0I7QUFDckIsWUFBTSxLQUFLLG9CQUFvQixjQUFjO0FBQUEsSUFDL0MsT0FBTztBQUNMLDBCQUFJLGdFQUFnRSxTQUFTLEVBQUU7QUFBQSxJQUNqRjtBQUVBLGtDQUFVLE9BQU8sYUFBYSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFFBQUksT0FBTyxNQUFNO0FBQ2YsK0RBQXFCLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxTQUFTLE9BQU8sV0FBVztBQUFBLElBQ2hGO0FBRUEsVUFBTSxjQUFVLGdDQUFZLG9CQUFvQixFQUFFLFNBQVMsS0FBSztBQUNoRSxVQUFNLGVBQWU7QUFBQSxNQUNuQixnQkFBZ0I7QUFBQSxNQUNoQixRQUFRLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxNQUFNLE1BQU0sTUFBTSxXQUFXLElBQUksS0FBSyxJQUFJLEVBQUUsRUFBRTtBQUFBLElBQ3ZFO0FBQ0EsMENBQWMsdUJBQUssT0FBTyxhQUFhLGVBQWUsR0FBRyxLQUFLLFVBQVUsWUFBWSxDQUFDO0FBRXJGLFVBQU0sV0FBVyxVQUFNLHNEQUE0QjtBQUFBLE1BQ2pELFNBQVMsS0FBSztBQUFBLE1BQ2QsU0FBUyxPQUFPO0FBQUEsTUFDaEIsV0FBVztBQUFBLFFBQ1QsT0FBRyxnREFBNkIsS0FBSyxvQkFBb0I7QUFBQSxRQUN6RCxPQUFHLDRDQUF5QixLQUFLLG9CQUFvQjtBQUFBLE1BQ3ZEO0FBQUEsTUFDQSxhQUFhLE9BQU87QUFBQSxJQUN0QixDQUFDO0FBQ0QsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxVQUFVLFNBQVM7QUFDeEIsU0FBSyxTQUFTLFNBQVM7QUFFdkIsWUFBSSx5Q0FBc0IsS0FBSyxvQkFBb0IsR0FBRztBQUNwRCxZQUFNLEtBQUsseUJBQXlCO0FBQUEsSUFDdEM7QUFFQSxVQUFNLEtBQUssdUJBQXVCLFNBQVM7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWMsWUFBWSxJQUFlLFFBQWdCLFFBQXVEO0FBQzlHLFVBQU0sS0FBSyxFQUFFLEtBQUs7QUFFbEIsV0FBTyxJQUFJLFFBQXFCLENBQUMsU0FBUyxXQUFXO0FBQ25ELFlBQU0sVUFBVSxXQUFXLE1BQU07QUFDL0IsV0FBRyxvQkFBb0IsV0FBVyxPQUFPO0FBQ3pDLGVBQU8sSUFBSSxNQUFNLCtCQUErQixPQUFPLEtBQUssNEJBQTRCLENBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztBQUFBLE1BQzNHLEdBQUcsS0FBSyw0QkFBNEI7QUFFcEMsZUFBUyxRQUFRLE9BQTJCO0FBQzFDLGNBQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxNQUFNLElBQUksQ0FBQztBQUN6QyxZQUFJLElBQUksT0FBTyxJQUFJO0FBQ2pCLHVCQUFhLE9BQU87QUFDcEIsYUFBRyxvQkFBb0IsV0FBVyxPQUFPO0FBQ3pDLGtCQUFRLEdBQUc7QUFBQSxRQUNiO0FBQUEsTUFDRjtBQUVBLFNBQUcsaUJBQWlCLFdBQVcsT0FBTztBQUN0QyxTQUFHLEtBQUssS0FBSyxVQUFVLEVBQUUsSUFBSSxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQUEsSUFDaEQsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYyxvQkFBb0IsUUFBK0I7QUFDL0Qsd0JBQUksMERBQTBELE1BQU0sYUFBYTtBQUNqRixVQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsV0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFVBQUk7QUFDRixjQUFNLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQzdDLGNBQU0sU0FBUyxNQUFNLE9BQU87QUFBQSxNQUM5QixRQUFRO0FBRU4sY0FBTSxNQUFNLDBDQUEwQztBQUN0RDtBQUFBLE1BQ0Y7QUFDQSxZQUFNLE1BQU0sbUNBQW1DO0FBQUEsSUFDakQ7QUFDQSx3QkFBSSx1RkFBdUY7QUFBQSxFQUM3RjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY0EsTUFBYyxtQkFBbUIsV0FBa0M7QUFDakUsY0FBTSx3REFBNEIsTUFBTSxTQUFTO0FBQ2pELFVBQU0sS0FBSyxTQUFTLDJEQUEyRCxFQUFFLEtBQUssVUFBVSxDQUFDO0FBQUEsRUFDbkc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCQSxNQUFjLHVCQUF1QixXQUFrQztBQUNyRSx3QkFBSSxvRUFBb0UsT0FBTyxrQ0FBa0MsQ0FBQyxRQUFRO0FBQzFILFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixRQUFJLHdCQUF1QztBQUMzQyxXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBSTtBQUNGLGNBQU0sS0FBSyxtQkFBbUIsU0FBUztBQUN2QyxjQUFNLEtBQUssbUJBQW1CLFNBQVM7QUFDdkMsY0FBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3ZDLGNBQU0sS0FBSyxrQ0FBa0MsU0FBUztBQUN0RCw0QkFBSSx1Q0FBdUM7QUFDM0M7QUFBQSxNQUNGLFFBQVE7QUFBQSxNQUVSO0FBRUEsVUFBSSxLQUFLLDhCQUE4QixHQUFHO0FBQ3hDLGNBQU0sY0FBYyxNQUFNLEtBQUssdUJBQXVCO0FBQ3RELFlBQUksYUFBYTtBQUNmLGNBQUksWUFBWSxzQkFBc0IsMEJBQTBCLE1BQU07QUFDcEUsb0NBQXdCLEtBQUssSUFBSTtBQUFBLFVBQ25DO0FBQ0EsZ0JBQU0sa0JBQWtCLDBCQUEwQixRQUM3QyxLQUFLLElBQUksSUFBSSx5QkFBeUIsS0FBSztBQUNoRCxrQkFBSSx1REFBdUIsRUFBRSxHQUFHLGFBQWEsZ0JBQWdCLENBQUMsTUFBTSxRQUFRO0FBQzFFLGdDQUFJLGdGQUFnRjtBQUNwRixrQkFBTSxJQUFJLDJFQUFnQyxTQUFTO0FBQUEsVUFDckQ7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLFlBQU0sTUFBTSxtQ0FBbUM7QUFBQSxJQUNqRDtBQUNBLFVBQU0sSUFBSSxNQUFNLGtCQUFrQixTQUFTLGdDQUFnQyxPQUFPLGtDQUFrQyxDQUFDLElBQUk7QUFBQSxFQUMzSDtBQUNGO0FBUUEsU0FBUyxNQUFNLElBQTJCO0FBQ3hDLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixlQUFXLFNBQVMsRUFBRTtBQUFBLEVBQ3hCLENBQUM7QUFDSDtBQWFBLGVBQWUseUJBQXlCLE1BQStCO0FBQ3JFLFFBQU0sVUFBVSxVQUFNLHNEQUEwQjtBQUNoRCxRQUFNLE9BQU8sMkJBQTJCLE9BQU8sSUFBSSxDQUFDO0FBRXBELE1BQUksb0JBQUFBLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFdBQU8sYUFBYSxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ3RDO0FBRUEsU0FBTyxJQUFJLE9BQU8sS0FBSyxJQUFJO0FBQzdCO0FBUUEsU0FBUyxhQUFhLEtBQXNCO0FBQzFDLE1BQUk7QUFDRiwrQkFBTyxLQUFLLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQzVDLFdBQU87QUFBQSxFQUNULFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIl0KfQo=