system-testing 1.0.103 → 1.0.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/browser.js CHANGED
@@ -27,6 +27,65 @@ import AppiumDriver from "./drivers/appium-driver.js";
27
27
  * @typedef {object} BrowserPathWaitArgs
28
28
  * @property {number} [timeout] Override the timeout for this path wait.
29
29
  */
30
+ /**
31
+ * @typedef {object} BrowserTextWaitArgs
32
+ * @property {number} [timeout] Override the timeout for this text wait.
33
+ */
34
+ /**
35
+ * @typedef {object} BrowserCurrentUrlWaitArgs
36
+ * @property {number} [timeout] Override the timeout for this URL wait.
37
+ */
38
+ /**
39
+ * @typedef {object} BrowserTestIDInputArgs
40
+ * @property {number} [timeout] Override timeout for the input lookup.
41
+ */
42
+ /**
43
+ * Builds a data-testid CSS selector.
44
+ * @param {string} testID Raw value from a `data-testid` attribute.
45
+ * @returns {string} CSS attribute selector.
46
+ */
47
+ function testIdSelector(testID) {
48
+ return `[data-testid="${cssAttributeValue(testID)}"]`;
49
+ }
50
+ /**
51
+ * Escapes a value for use inside a double-quoted CSS attribute selector.
52
+ * @param {string | number} value Raw attribute value.
53
+ * @returns {string} Escaped selector value.
54
+ */
55
+ function cssAttributeValue(value) {
56
+ return String(value).replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
57
+ }
58
+ /**
59
+ * Extracts the RGB channels from CSS `rgb(...)`/`rgba(...)` values or an RGB fragment.
60
+ * @param {string} value CSS color value or RGB fragment like `30, 41, 59`.
61
+ * @returns {[number, number, number] | undefined}
62
+ */
63
+ function cssRgbChannels(value) {
64
+ const rgbMatch = value.match(/rgba?\(([^)]+)\)/);
65
+ const channelsValue = rgbMatch ? rgbMatch[1] : value;
66
+ const channels = channelsValue
67
+ .replace(/\s*\/.*$/, "")
68
+ .split(/[,\s]+/)
69
+ .filter(Boolean)
70
+ .slice(0, 3)
71
+ .map((channel) => Number(channel));
72
+ if (channels.length !== 3 || channels.some((channel) => !Number.isFinite(channel)))
73
+ return undefined;
74
+ return /** @type {[number, number, number]} */ (channels);
75
+ }
76
+ /**
77
+ * Checks whether a browser-normalized CSS color matches the RGB triplet.
78
+ * @param {string} actualValue Browser-normalized CSS color.
79
+ * @param {string} rgbFragment RGB fragment like `30, 41, 59`.
80
+ * @returns {boolean} Whether the RGB channels match.
81
+ */
82
+ function cssValueMatchesRgb(actualValue, rgbFragment) {
83
+ const actualChannels = cssRgbChannels(actualValue);
84
+ const expectedChannels = cssRgbChannels(rgbFragment);
85
+ if (!actualChannels || !expectedChannels)
86
+ return false;
87
+ return actualChannels.every((actualChannel, index) => actualChannel === expectedChannels[index]);
88
+ }
30
89
  /** Generic browser session wrapper around the configured driver. */
31
90
  export default class Browser {
32
91
  /** @param {BrowserArgs} [args] */
@@ -178,6 +237,48 @@ export default class Browser {
178
237
  }
179
238
  });
180
239
  }
240
+ /**
241
+ * Waits until the current URL exactly matches the expected URL.
242
+ * @param {string} expectedUrl Exact URL expected.
243
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
244
+ * @returns {Promise<void>}
245
+ */
246
+ async waitForCurrentUrl(expectedUrl, args = {}) {
247
+ await waitFor({ timeout: this.getCommandTimeout(args.timeout) }, async () => {
248
+ const currentUrl = await this.getCurrentUrl();
249
+ if (currentUrl !== expectedUrl) {
250
+ throw new Error(`Timed out waiting for URL ${expectedUrl}. Current URL: ${currentUrl}`);
251
+ }
252
+ });
253
+ }
254
+ /**
255
+ * Waits until the current URL contains a fragment.
256
+ * @param {string} expectedFragment Fragment that should appear.
257
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
258
+ * @returns {Promise<void>}
259
+ */
260
+ async waitForUrlContains(expectedFragment, args = {}) {
261
+ await waitFor({ timeout: this.getCommandTimeout(args.timeout) }, async () => {
262
+ const currentUrl = await this.getCurrentUrl();
263
+ if (!currentUrl.includes(expectedFragment)) {
264
+ throw new Error(`Timed out waiting for URL to include ${expectedFragment}. Current URL: ${currentUrl}`);
265
+ }
266
+ });
267
+ }
268
+ /**
269
+ * Waits until the current URL does not contain a fragment.
270
+ * @param {string} unexpectedFragment Fragment that should disappear.
271
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
272
+ * @returns {Promise<void>}
273
+ */
274
+ async waitForUrlExcludes(unexpectedFragment, args = {}) {
275
+ await waitFor({ timeout: this.getCommandTimeout(args.timeout) }, async () => {
276
+ const currentUrl = await this.getCurrentUrl();
277
+ if (currentUrl.includes(unexpectedFragment)) {
278
+ throw new Error(`Timed out waiting for URL to exclude ${unexpectedFragment}. Current URL: ${currentUrl}`);
279
+ }
280
+ });
281
+ }
181
282
  /**
182
283
  * @param {string} selector
183
284
  * @param {import("./system-test.js").FindArgs} [args]
@@ -237,6 +338,71 @@ export default class Browser {
237
338
  await this.interact(elementOrIdentifier, "click");
238
339
  await this.interact(elementOrIdentifier, "sendKeys", Key.chord(Key.CONTROL, "a"), Key.BACK_SPACE, nextValue);
239
340
  }
341
+ /**
342
+ * Replaces an input-like element's value by test id.
343
+ * @param {string} testID Field `data-testid` to target.
344
+ * @param {string} nextValue Text to leave in the field.
345
+ * @param {BrowserTestIDInputArgs} [args] Optional lookup timeout.
346
+ * @returns {Promise<void>}
347
+ */
348
+ async replaceTestIDInputValue(testID, nextValue, args = {}) {
349
+ await this.clearAndSendKeys({
350
+ selector: testIdSelector(testID),
351
+ timeout: args.timeout,
352
+ withFallback: true
353
+ }, nextValue);
354
+ }
355
+ /**
356
+ * Waits until a test id contains expected visible text.
357
+ * @param {string} testID Element `data-testid` to inspect.
358
+ * @param {string} expectedText Fragment that must appear in the element text.
359
+ * @param {BrowserTextWaitArgs} [args] Optional timeout.
360
+ * @returns {Promise<void>}
361
+ */
362
+ async waitForTestIDText(testID, expectedText, args = {}) {
363
+ await waitFor({ timeout: this.getCommandTimeout(args.timeout) }, async () => {
364
+ const element = await this.findByTestID(testID, { timeout: 0 });
365
+ const actualText = await element.getText();
366
+ if (!actualText.includes(expectedText)) {
367
+ throw new Error(`Timed out waiting for text ${expectedText}. Last text was ${actualText}`);
368
+ }
369
+ });
370
+ }
371
+ /**
372
+ * Waits until a test id no longer contains excluded visible text.
373
+ * @param {string} testID Element `data-testid` to inspect.
374
+ * @param {string} excludedText Fragment that should disappear from the element text.
375
+ * @param {BrowserTextWaitArgs} [args] Optional timeout.
376
+ * @returns {Promise<void>}
377
+ */
378
+ async waitForTestIDTextExcludes(testID, excludedText, args = {}) {
379
+ await waitFor({ timeout: this.getCommandTimeout(args.timeout) }, async () => {
380
+ const element = await this.findByTestID(testID, { timeout: 0 });
381
+ const actualText = await element.getText();
382
+ if (actualText.includes(excludedText)) {
383
+ throw new Error(`Timed out waiting for text to exclude ${excludedText}. Last text was ${actualText}`);
384
+ }
385
+ });
386
+ }
387
+ /**
388
+ * Asserts a rendered element has a CSS color from the expected palette.
389
+ * @param {string} testID Element `data-testid` to inspect.
390
+ * @param {string} propertyName CSS property to read.
391
+ * @param {string} expectedRgb Expected RGB fragment.
392
+ * @param {string} lightRgb Disallowed RGB fragment.
393
+ * @param {string} description Human-readable element description.
394
+ * @returns {Promise<void>}
395
+ */
396
+ async expectTestIDCssColor(testID, propertyName, expectedRgb, lightRgb, description) {
397
+ const element = await this.findByTestID(testID);
398
+ const actualValue = await element.getCssValue(propertyName);
399
+ if (cssValueMatchesRgb(actualValue, lightRgb)) {
400
+ throw new Error(`Expected ${description} to avoid the light palette, got ${propertyName} ${actualValue}`);
401
+ }
402
+ if (!cssValueMatchesRgb(actualValue, expectedRgb)) {
403
+ throw new Error(`Expected ${description} to include rgb(${expectedRgb}), got ${propertyName} ${actualValue}`);
404
+ }
405
+ }
240
406
  /**
241
407
  * Scrolls an element into view.
242
408
  * @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").FindArgs} elementOrIdentifier
@@ -311,6 +477,46 @@ export default class Browser {
311
477
  async deleteAllCookies() {
312
478
  await this.getDriverAdapter().deleteAllCookies();
313
479
  }
480
+ /**
481
+ * Add a cookie to the active driver session for the current document
482
+ * origin. Useful when an out-of-band login (curl, fetch, etc.) returned
483
+ * a `Set-Cookie` value and the test needs the browser to start
484
+ * authenticated without driving the sign-in UI.
485
+ *
486
+ * The driver must already be on a page whose origin/domain matches the
487
+ * cookie domain, otherwise Selenium will reject the call.
488
+ * @param {{name: string, value: string, domain?: string, path?: string, secure?: boolean, httpOnly?: boolean, expiry?: number, sameSite?: "Strict" | "Lax" | "None"}} cookie
489
+ * @returns {Promise<void>}
490
+ */
491
+ async addCookie(cookie) {
492
+ if (!cookie || typeof cookie.name !== "string" || cookie.name.length === 0) {
493
+ throw new Error("addCookie requires a non-empty `name`");
494
+ }
495
+ if (typeof cookie.value !== "string") {
496
+ throw new Error("addCookie requires a string `value`");
497
+ }
498
+ await this.getDriver().manage().addCookie(cookie);
499
+ }
500
+ /**
501
+ * Run an arbitrary script in the active browser session and return the
502
+ * resolved value. `script` is the function body executed in the browser
503
+ * (`new Function("...")`-style); `args` are forwarded as `arguments[i]`.
504
+ * Asynchronous scripts must `return` a Promise, which Selenium awaits.
505
+ *
506
+ * Useful for verification flows that need to call into application code
507
+ * (e.g. `fetch("/development/sign-in", {...})`) without going through the
508
+ * UI, or to read browser state the existing finder/interact commands
509
+ * don't expose.
510
+ * @param {string} script
511
+ * @param {...any} args
512
+ * @returns {Promise<any>}
513
+ */
514
+ async executeScript(script, ...args) {
515
+ if (typeof script !== "string" || script.length === 0) {
516
+ throw new Error("executeScript requires a non-empty `script` string");
517
+ }
518
+ return await this.getDriver().executeScript(script, ...args);
519
+ }
314
520
  /**
315
521
  * @param {string} type
316
522
  * @param {string} path
@@ -425,4 +631,4 @@ export default class Browser {
425
631
  }
426
632
  }
427
633
  }
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNoQyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUgsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxPQUFPLE9BQU8sT0FBTztJQWExQixrQ0FBa0M7SUFDbEMsWUFBWSxFQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxlQUFlLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQWJ6SCxpRUFBaUU7UUFDakUsV0FBTSxHQUFHLFNBQVMsQ0FBQTtRQUVsQiwwRUFBMEU7UUFDMUUsa0JBQWEsR0FBRyxTQUFTLENBQUE7UUFFekIsV0FBTSxHQUFHLEtBQUssQ0FBQTtRQUNkLDhDQUE4QztRQUM5QyxrQkFBYSxHQUFHLFNBQVMsQ0FBQTtRQUN6QixnQ0FBZ0M7UUFDaEMscUJBQWdCLEdBQUcsU0FBUyxDQUFBO1FBK0Y1Qjs7O1dBR0c7UUFDSCxzQkFBaUIsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVCLE1BQU0sWUFBWSxHQUFHLEtBQUss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QUMvQixLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQge0tleX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIlxuaW1wb3J0IHtwcmV0dGlmeX0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQge3dhaXRGb3J9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgU2VsZW5pdW1Ecml2ZXIgZnJvbSBcIi4vZHJpdmVycy9zZWxlbml1bS1kcml2ZXIuanNcIlxuaW1wb3J0IEFwcGl1bURyaXZlciBmcm9tIFwiLi9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0fSBbY29tbXVuaWNhdG9yXSBPcHRpb25hbCBjb21tYW5kIGNvbW11bmljYXRvciBmb3IgaGVscGVyLWRyaXZlbiBuYXZpZ2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JlZW5zaG90c1BhdGhdIERpcmVjdG9yeSB1c2VkIGZvciBzYXZlZCBzY3JlZW5zaG90cyBhbmQgYnJvd3NlciBhcnRpZmFjdHMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlckRyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtcInNlbGVuaXVtXCJ8XCJhcHBpdW1cIn0gW3R5cGVdIERyaXZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSBEcml2ZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyTmF2aWdhdGlvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgbmF2aWdhdGlvbiBjb21tYW5kLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJQYXRoV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgcGF0aCB3YWl0LlxuICovXG5cbi8qKiBHZW5lcmljIGJyb3dzZXIgc2Vzc2lvbiB3cmFwcGVyIGFyb3VuZCB0aGUgY29uZmlndXJlZCBkcml2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyIHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXIgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gIGRyaXZlckFkYXB0ZXIgPSB1bmRlZmluZWRcblxuICBfZGVidWcgPSBmYWxzZVxuICAvKiogQHR5cGUge0Jyb3dzZXJEcml2ZXJDb25maWcgfCB1bmRlZmluZWR9ICovXG4gIF9kcml2ZXJDb25maWcgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgX2h0dHBTZXJ2ZXJFcnJvciA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAcGFyYW0ge0Jyb3dzZXJBcmdzfSBbYXJnc10gKi9cbiAgY29uc3RydWN0b3Ioe2RlYnVnID0gZmFsc2UsIGRyaXZlciwgY29tbXVuaWNhdG9yLCBzY3JlZW5zaG90c1BhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS90bXAvc2NyZWVuc2hvdHNgLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9kcml2ZXJDb25maWcgPSBkcml2ZXJcbiAgICB0aGlzLl9zY3JlZW5zaG90c1BhdGggPSBzY3JlZW5zaG90c1BhdGhcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IGNvbW11bmljYXRvclxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKGRyaXZlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJDb25maWddXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgY3JlYXRlRHJpdmVyKGRyaXZlckNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3Qge3R5cGUgPSBcInNlbGVuaXVtXCIsIG9wdGlvbnMsIC4uLnJlc3RBcmdzfSA9IGRyaXZlckNvbmZpZ1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHJpdmVyIGFyZ3M6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcInNlbGVuaXVtXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZW5pdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImFwcGl1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGl1bURyaXZlcih7YnJvd3NlcjogdGhpcywgb3B0aW9uc30pXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkcml2ZXIgdHlwZTogJHt0eXBlfWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb21tdW5pY2F0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDb21tdW5pY2F0b3IoY29tbXVuaWNhdG9yKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgY29tbXVuaWNhdG9yRXhpc3RzKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU2VsZWN0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRCYXNlU2VsZWN0b3IoYmFzZVNlbGVjdG9yKSB7IHRoaXMuX2Jhc2VTZWxlY3RvciA9IGJhc2VTZWxlY3RvciB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGdldEJhc2VTZWxlY3RvcigpIHsgcmV0dXJuIHRoaXMuX2Jhc2VTZWxlY3RvciB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCYXNlU2VsZWN0b3IoKSA/IGAke3RoaXMuZ2V0QmFzZVNlbGVjdG9yKCl9ICR7c2VsZWN0b3J9YCA6IHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0Vycm9yKC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW0Jyb3dzZXIgZXJyb3JdXCIsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0xvZyguLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltCcm93c2VyIGRlYnVnXVwiLCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgdGhyb3dJZkh0dHBTZXJ2ZXJFcnJvcigpIHtcbiAgICBpZiAodGhpcy5faHR0cFNlcnZlckVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke3RoaXMuX2h0dHBTZXJ2ZXJFcnJvci5tZXNzYWdlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25IdHRwU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcblxuICAgIHRoaXMuX2h0dHBTZXJ2ZXJFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgY29uc29sZS5lcnJvcihgSFRUUCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9ICovXG4gIGdldERyaXZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0V2ViRHJpdmVyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH0gKi9cbiAgZ2V0RHJpdmVyQWRhcHRlcigpIHtcbiAgICBpZiAoIXRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRyaXZlckFkYXB0ZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFRpbWVvdXRzKCkgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRUaW1lb3V0cyhuZXdUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldEJyb3dzZXJMb2dzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgcGF0aG5hbWUgZXhhY3RseSBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRQYXRoXG4gICAqIEBwYXJhbSB7QnJvd3NlclBhdGhXYWl0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclBhdGgoZXhwZWN0ZWRQYXRoLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gbmV3IFVSTChjdXJyZW50VXJsKS5wYXRobmFtZVxuXG4gICAgICBpZiAoY3VycmVudFBhdGggIT09IGV4cGVjdGVkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBwYXRoICR7ZXhwZWN0ZWRQYXRofS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuSW50ZXJhY3RBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFuIGlucHV0IGFuZCBzZW5kcyByZXBsYWNlbWVudCBrZXlzIHRocm91Z2ggcmV0cnlhYmxlIGJyb3dzZXIgaW50ZXJhY3Rpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dFZhbHVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xlYXJBbmRTZW5kS2V5cyhlbGVtZW50T3JJZGVudGlmaWVyLCBuZXh0VmFsdWUpIHtcbiAgICBhd2FpdCB0aGlzLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIFwiY2xpY2tcIilcbiAgICBhd2FpdCB0aGlzLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIFwic2VuZEtleXNcIiwgS2V5LmNob3JkKEtleS5DT05UUk9MLCBcImFcIiksIEtleS5CQUNLX1NQQUNFLCBuZXh0VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhbiBlbGVtZW50IGludG8gdmlldy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxJbnRvVmlldyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5XYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3ROb0VsZW1lbnQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgICAgZm91bmQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm90IHRvIGZpbmQ6ICR7c2VsZWN0b3J9YClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0SFRNTCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0SFRNTCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IHRpbWVvdXRPdmVycmlkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Q29tbWFuZFRpbWVvdXQodGltZW91dE92ZXJyaWRlKSB7XG4gICAgaWYgKHRpbWVvdXRPdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGltZW91dE92ZXJyaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyVmlzaXQocGF0aCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclZpc2l0KHBhdGgpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNlbmRCcm93c2VyQ29tbWFuZCh0eXBlLCBwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuY29tbXVuaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tdW5pY2F0b3IgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGltZW91dChcbiAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgc2VuZGluZyBicm93c2VyIGNvbW1hbmQgJHt0eXBlfTogJHtwYXRofWB9LFxuICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5jb21tdW5pY2F0b3I+fSAqLyAodGhpcy5jb21tdW5pY2F0b3IpLnNlbmRDb21tYW5kKHt0eXBlLCBwYXRofSlcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogVmlzaXRzIGEgcGF0aCB1c2luZyB0aGUgaW5qZWN0ZWQgYnJvd3NlciBoZWxwZXIgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZSBuYXZpZ2F0ZXMgZGlyZWN0bHkgd2l0aCB0aGUgZHJpdmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXQocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29tbXVuaWNhdG9yRXhpc3RzKCkgJiYgKCF0aGlzLmNvbW11bmljYXRvcj8ud3MgfHwgdGhpcy5jb21tdW5pY2F0b3Iud3MucmVhZHlTdGF0ZSA9PT0gMSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEJyb3dzZXJDb21tYW5kKFwidmlzaXRcIiwgcGF0aCwgYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGltZW91dChcbiAgICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocGF0aClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRvIGEgcGF0aCB2aWEgdGhlIGluamVjdGVkIGJyb3dzZXIgaGVscGVyIHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgbmF2aWdhdGVzIGRpcmVjdGx5IHdpdGggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRpc21pc3NUbyhwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5jb21tdW5pY2F0b3JFeGlzdHMoKSAmJiAoIXRoaXMuY29tbXVuaWNhdG9yPy53cyB8fCB0aGlzLmNvbW11bmljYXRvci53cy5yZWFkeVN0YXRlID09PSAxKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQnJvd3NlckNvbW1hbmQoXCJkaXNtaXNzVG9cIiwgcGF0aCwgYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGltZW91dChcbiAgICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBkaXNtaXNzaW5nIHRvIHBhdGg6ICR7cGF0aH1gfSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChwYXRoKVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGJyb3dzZXIgbG9ncyBmb3IgY29uc29sZSBvdXRwdXQgYW5kIHRydW5jYXRlcyBvdmVybHkgbG9uZyBvdXRwdXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGxvZ3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhMaW5lc11cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZm9ybWF0QnJvd3NlckxvZ3NGb3JDb25zb2xlKGxvZ3MsIG1heExpbmVzID0gMjAwKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxvZ3MpIHx8IGxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW1wiKG5vIGJyb3dzZXIgbG9ncylcIl1cbiAgICB9XG5cbiAgICBpZiAobG9ncy5sZW5ndGggPD0gbWF4TGluZXMpIHtcbiAgICAgIHJldHVybiBsb2dzXG4gICAgfVxuXG4gICAgY29uc3Qga2VwdExvZ3MgPSBsb2dzLnNsaWNlKGxvZ3MubGVuZ3RoIC0gbWF4TGluZXMpXG4gICAgY29uc3QgaGlkZGVuQ291bnQgPSBsb2dzLmxlbmd0aCAtIG1heExpbmVzXG5cbiAgICByZXR1cm4gW2Aoc2hvd2luZyBsYXN0ICR7bWF4TGluZXN9IG9mICR7bG9ncy5sZW5ndGh9IGJyb3dzZXIgbG9ncywgJHtoaWRkZW5Db3VudH0gb21pdHRlZClgLCAuLi5rZXB0TG9nc11cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsb2dzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJpbnRCcm93c2VyTG9nc0ZvckZhaWx1cmUobG9ncykge1xuICAgIGNvbnNvbGUubG9nKFwiQnJvd3NlciBsb2dzOlwiKVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuZm9ybWF0QnJvd3NlckxvZ3NGb3JDb25zb2xlKGxvZ3MpKSB7XG4gICAgICBjb25zb2xlLmxvZyhsaW5lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHNjcmVlbnNob3QsIHdyaXRlcyBIVE1ML2Jyb3dzZXIgbG9ncyB0byBkaXNrLCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGVkIGFydGlmYWN0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2N1cnJlbnRVcmw6IHN0cmluZywgaHRtbDogc3RyaW5nLCBodG1sUGF0aDogc3RyaW5nLCBsb2dzOiBzdHJpbmdbXSwgbG9nc1BhdGg6IHN0cmluZywgc2NyZWVuc2hvdFBhdGg6IHN0cmluZ30+fVxuICAgKi9cbiAgYXN5bmMgdGFrZVNjcmVlbnNob3QoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgcGF0aCBmb3Igc2NyZWVuc2hvdHNcIilcbiAgICBjb25zdCBwYXRoID0gdGhpcy5fc2NyZWVuc2hvdHNQYXRoXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBDcmVhdGluZyBkaXIgd2l0aCByZWN1cnNpdmU6ICR7cGF0aH1gKVxuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGgsIHtyZWN1cnNpdmU6IHRydWV9KVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgc2NyZWVuc2hvdCBpbWFnZSBjb250ZW50XCIpXG4gICAgY29uc3QgaW1hZ2VDb250ZW50ID0gYXdhaXQgdGltZW91dCh7dGltZW91dDogNTAwMCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgdGFraW5nIHNjcmVlbnNob3RcIn0sIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnRha2VTY3JlZW5zaG90KCkpXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiR2VuZXJhdGluZyBkYXRlIHZhcmlhYmxlc1wiKVxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLURELUhILU1NLVNTXCIpXG4gICAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBgJHtwYXRofS8ke3RpbWVzdGFtcH0ucG5nYFxuICAgIGNvbnN0IGh0bWxQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9Lmh0bWxgXG4gICAgY29uc3QgbG9nc1BhdGggPSBgJHtwYXRofS8ke3RpbWVzdGFtcH0ubG9ncy50eHRgXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiR2V0dGluZyBicm93c2VyIGxvZ3NcIilcbiAgICBjb25zdCBsb2dzID0gYXdhaXQgdGltZW91dCh7dGltZW91dDogNTAwMCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcmVhZGluZyBicm93c2VyIGxvZ3NcIn0sIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKSlcbiAgICBjb25zdCBodG1sID0gYXdhaXQgdGltZW91dCh7dGltZW91dDogNTAwMCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcmVhZGluZyBwYWdlIEhUTUxcIn0sIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZ2V0SFRNTCgpKVxuICAgIGNvbnN0IGh0bWxQcmV0dHkgPSBwcmV0dGlmeShodG1sKVxuICAgIHRoaXMucHJpbnRCcm93c2VyTG9nc0ZvckZhaWx1cmUobG9ncylcblxuICAgIHRoaXMuZGVidWdMb2coXCJXcml0aW5nIGZpbGVzXCIpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGh0bWxQYXRoLCBodG1sUHJldHR5KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShsb2dzUGF0aCwgbG9ncy5qb2luKFwiXFxuXCIpKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShzY3JlZW5zaG90UGF0aCwgaW1hZ2VDb250ZW50LCBcImJhc2U2NFwiKVxuXG4gICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICBjb25zb2xlLmxvZyhcIkN1cnJlbnQgVVJMOlwiLCBjdXJyZW50VXJsKVxuICAgIGNvbnNvbGUubG9nKFwiTG9nczpcIiwgbG9nc1BhdGgpXG4gICAgY29uc29sZS5sb2coXCJTY3JlZW5zaG90OlwiLCBzY3JlZW5zaG90UGF0aClcbiAgICBjb25zb2xlLmxvZyhcIkhUTUw6XCIsIGh0bWxQYXRoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRVcmwsXG4gICAgICBodG1sLFxuICAgICAgaHRtbFBhdGgsXG4gICAgICBsb2dzLFxuICAgICAgbG9nc1BhdGgsXG4gICAgICBzY3JlZW5zaG90UGF0aFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgc3RvcERyaXZlcigpIHtcbiAgICBpZiAodGhpcy5kcml2ZXJBZGFwdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmRyaXZlckFkYXB0ZXIuc3RvcCgpXG4gICAgfVxuICB9XG59XG4iXX0=
634
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNoQyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQU07SUFDNUIsT0FBTyxpQkFBaUIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQTtBQUN2RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBSztJQUM5QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFLO0lBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUNoRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENB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QUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRTlCLE9BQU87WUFDTCxVQUFVO1lBQ1YsSUFBSTtZQUNKLFFBQVE7WUFDUixJQUFJO1lBQ0osUUFBUTtZQUNSLGNBQWM7U0FDZixDQUFBO0lBQ0gsQ0FBQztJQUVELCtCQUErQjtJQUMvQixLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQge0tleX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIlxuaW1wb3J0IHtwcmV0dGlmeX0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQge3dhaXRGb3J9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgU2VsZW5pdW1Ecml2ZXIgZnJvbSBcIi4vZHJpdmVycy9zZWxlbml1bS1kcml2ZXIuanNcIlxuaW1wb3J0IEFwcGl1bURyaXZlciBmcm9tIFwiLi9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0fSBbY29tbXVuaWNhdG9yXSBPcHRpb25hbCBjb21tYW5kIGNvbW11bmljYXRvciBmb3IgaGVscGVyLWRyaXZlbiBuYXZpZ2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JlZW5zaG90c1BhdGhdIERpcmVjdG9yeSB1c2VkIGZvciBzYXZlZCBzY3JlZW5zaG90cyBhbmQgYnJvd3NlciBhcnRpZmFjdHMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlckRyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtcInNlbGVuaXVtXCJ8XCJhcHBpdW1cIn0gW3R5cGVdIERyaXZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSBEcml2ZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyTmF2aWdhdGlvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgbmF2aWdhdGlvbiBjb21tYW5kLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJQYXRoV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgcGF0aCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJUZXh0V2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgdGV4dCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgVVJMIHdhaXQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclRlc3RJRElucHV0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciB0aGUgaW5wdXQgbG9va3VwLlxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgZGF0YS10ZXN0aWQgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBSYXcgdmFsdWUgZnJvbSBhIGBkYXRhLXRlc3RpZGAgYXR0cmlidXRlLlxuICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gdGVzdElkU2VsZWN0b3IodGVzdElEKSB7XG4gIHJldHVybiBgW2RhdGEtdGVzdGlkPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh0ZXN0SUQpfVwiXWBcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHVzZSBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgUmF3IGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVzY2FwZWQgc2VsZWN0b3IgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpXG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIFJHQiBjaGFubmVscyBmcm9tIENTUyBgcmdiKC4uLilgL2ByZ2JhKC4uLilgIHZhbHVlcyBvciBhbiBSR0IgZnJhZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQ1NTIGNvbG9yIHZhbHVlIG9yIFJHQiBmcmFnbWVudCBsaWtlIGAzMCwgNDEsIDU5YC5cbiAqIEByZXR1cm5zIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGNzc1JnYkNoYW5uZWxzKHZhbHVlKSB7XG4gIGNvbnN0IHJnYk1hdGNoID0gdmFsdWUubWF0Y2goL3JnYmE/XFwoKFteKV0rKVxcKS8pXG4gIGNvbnN0IGNoYW5uZWxzVmFsdWUgPSByZ2JNYXRjaCA/IHJnYk1hdGNoWzFdIDogdmFsdWVcbiAgY29uc3QgY2hhbm5lbHMgPSBjaGFubmVsc1ZhbHVlXG4gICAgLnJlcGxhY2UoL1xccypcXC8uKiQvLCBcIlwiKVxuICAgIC5zcGxpdCgvWyxcXHNdKy8pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCAzKVxuICAgIC5tYXAoKGNoYW5uZWwpID0+IE51bWJlcihjaGFubmVsKSlcblxuICBpZiAoY2hhbm5lbHMubGVuZ3RoICE9PSAzIHx8IGNoYW5uZWxzLnNvbWUoKGNoYW5uZWwpID0+ICFOdW1iZXIuaXNGaW5pdGUoY2hhbm5lbCkpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdfSAqLyAoY2hhbm5lbHMpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBicm93c2VyLW5vcm1hbGl6ZWQgQ1NTIGNvbG9yIG1hdGNoZXMgdGhlIFJHQiB0cmlwbGV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdHVhbFZhbHVlIEJyb3dzZXItbm9ybWFsaXplZCBDU1MgY29sb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmdiRnJhZ21lbnQgUkdCIGZyYWdtZW50IGxpa2UgYDMwLCA0MSwgNTlgLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFJHQiBjaGFubmVscyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY3NzVmFsdWVNYXRjaGVzUmdiKGFjdHVhbFZhbHVlLCByZ2JGcmFnbWVudCkge1xuICBjb25zdCBhY3R1YWxDaGFubmVscyA9IGNzc1JnYkNoYW5uZWxzKGFjdHVhbFZhbHVlKVxuICBjb25zdCBleHBlY3RlZENoYW5uZWxzID0gY3NzUmdiQ2hhbm5lbHMocmdiRnJhZ21lbnQpXG5cbiAgaWYgKCFhY3R1YWxDaGFubmVscyB8fCAhZXhwZWN0ZWRDaGFubmVscykgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIGFjdHVhbENoYW5uZWxzLmV2ZXJ5KChhY3R1YWxDaGFubmVsLCBpbmRleCkgPT4gYWN0dWFsQ2hhbm5lbCA9PT0gZXhwZWN0ZWRDaGFubmVsc1tpbmRleF0pXG59XG5cbi8qKiBHZW5lcmljIGJyb3dzZXIgc2Vzc2lvbiB3cmFwcGVyIGFyb3VuZCB0aGUgY29uZmlndXJlZCBkcml2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyIHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXIgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gIGRyaXZlckFkYXB0ZXIgPSB1bmRlZmluZWRcblxuICBfZGVidWcgPSBmYWxzZVxuICAvKiogQHR5cGUge0Jyb3dzZXJEcml2ZXJDb25maWcgfCB1bmRlZmluZWR9ICovXG4gIF9kcml2ZXJDb25maWcgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgX2h0dHBTZXJ2ZXJFcnJvciA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAcGFyYW0ge0Jyb3dzZXJBcmdzfSBbYXJnc10gKi9cbiAgY29uc3RydWN0b3Ioe2RlYnVnID0gZmFsc2UsIGRyaXZlciwgY29tbXVuaWNhdG9yLCBzY3JlZW5zaG90c1BhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS90bXAvc2NyZWVuc2hvdHNgLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9kcml2ZXJDb25maWcgPSBkcml2ZXJcbiAgICB0aGlzLl9zY3JlZW5zaG90c1BhdGggPSBzY3JlZW5zaG90c1BhdGhcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IGNvbW11bmljYXRvclxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKGRyaXZlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJDb25maWddXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgY3JlYXRlRHJpdmVyKGRyaXZlckNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3Qge3R5cGUgPSBcInNlbGVuaXVtXCIsIG9wdGlvbnMsIC4uLnJlc3RBcmdzfSA9IGRyaXZlckNvbmZpZ1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHJpdmVyIGFyZ3M6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcInNlbGVuaXVtXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZW5pdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImFwcGl1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGl1bURyaXZlcih7YnJvd3NlcjogdGhpcywgb3B0aW9uc30pXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkcml2ZXIgdHlwZTogJHt0eXBlfWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb21tdW5pY2F0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDb21tdW5pY2F0b3IoY29tbXVuaWNhdG9yKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgY29tbXVuaWNhdG9yRXhpc3RzKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU2VsZWN0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRCYXNlU2VsZWN0b3IoYmFzZVNlbGVjdG9yKSB7IHRoaXMuX2Jhc2VTZWxlY3RvciA9IGJhc2VTZWxlY3RvciB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGdldEJhc2VTZWxlY3RvcigpIHsgcmV0dXJuIHRoaXMuX2Jhc2VTZWxlY3RvciB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCYXNlU2VsZWN0b3IoKSA/IGAke3RoaXMuZ2V0QmFzZVNlbGVjdG9yKCl9ICR7c2VsZWN0b3J9YCA6IHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0Vycm9yKC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW0Jyb3dzZXIgZXJyb3JdXCIsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0xvZyguLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltCcm93c2VyIGRlYnVnXVwiLCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgdGhyb3dJZkh0dHBTZXJ2ZXJFcnJvcigpIHtcbiAgICBpZiAodGhpcy5faHR0cFNlcnZlckVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke3RoaXMuX2h0dHBTZXJ2ZXJFcnJvci5tZXNzYWdlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25IdHRwU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcblxuICAgIHRoaXMuX2h0dHBTZXJ2ZXJFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgY29uc29sZS5lcnJvcihgSFRUUCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9ICovXG4gIGdldERyaXZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0V2ViRHJpdmVyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH0gKi9cbiAgZ2V0RHJpdmVyQWRhcHRlcigpIHtcbiAgICBpZiAoIXRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRyaXZlckFkYXB0ZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFRpbWVvdXRzKCkgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRUaW1lb3V0cyhuZXdUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldEJyb3dzZXJMb2dzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgcGF0aG5hbWUgZXhhY3RseSBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRQYXRoXG4gICAqIEBwYXJhbSB7QnJvd3NlclBhdGhXYWl0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclBhdGgoZXhwZWN0ZWRQYXRoLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gbmV3IFVSTChjdXJyZW50VXJsKS5wYXRobmFtZVxuXG4gICAgICBpZiAoY3VycmVudFBhdGggIT09IGV4cGVjdGVkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBwYXRoICR7ZXhwZWN0ZWRQYXRofS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgVVJMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRVcmwgRXhhY3QgVVJMIGV4cGVjdGVkLlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3N9IFthcmdzXSBPcHRpb25hbCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDdXJyZW50VXJsKGV4cGVjdGVkVXJsLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwgIT09IGV4cGVjdGVkVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIFVSTCAke2V4cGVjdGVkVXJsfS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGFwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsQ29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmICghY3VycmVudFVybC5pbmNsdWRlcyhleHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gaW5jbHVkZSAke2V4cGVjdGVkRnJhZ21lbnR9LiBDdXJyZW50IFVSTDogJHtjdXJyZW50VXJsfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgZG9lcyBub3QgY29udGFpbiBhIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5leHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGRpc2FwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsRXhjbHVkZXModW5leHBlY3RlZEZyYWdtZW50LCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwuaW5jbHVkZXModW5leHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gZXhjbHVkZSAke3VuZXhwZWN0ZWRGcmFnbWVudH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmFsbChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgaW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbiBpbnB1dCBhbmQgc2VuZHMgcmVwbGFjZW1lbnQga2V5cyB0aHJvdWdoIHJldHJ5YWJsZSBicm93c2VyIGludGVyYWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRWYWx1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsZWFyQW5kU2VuZEtleXMoZWxlbWVudE9ySWRlbnRpZmllciwgbmV4dFZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcImNsaWNrXCIpXG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcInNlbmRLZXlzXCIsIEtleS5jaG9yZChLZXkuQ09OVFJPTCwgXCJhXCIpLCBLZXkuQkFDS19TUEFDRSwgbmV4dFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFuIGlucHV0LWxpa2UgZWxlbWVudCdzIHZhbHVlIGJ5IHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRmllbGQgYGRhdGEtdGVzdGlkYCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0VmFsdWUgVGV4dCB0byBsZWF2ZSBpbiB0aGUgZmllbGQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRlc3RJRElucHV0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VUZXN0SURJbnB1dFZhbHVlKHRlc3RJRCwgbmV4dFZhbHVlLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFyQW5kU2VuZEtleXMoe1xuICAgICAgc2VsZWN0b3I6IHRlc3RJZFNlbGVjdG9yKHRlc3RJRCksXG4gICAgICB0aW1lb3V0OiBhcmdzLnRpbWVvdXQsXG4gICAgICB3aXRoRmFsbGJhY2s6IHRydWVcbiAgICB9LCBuZXh0VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgYSB0ZXN0IGlkIGNvbnRhaW5zIGV4cGVjdGVkIHZpc2libGUgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBGcmFnbWVudCB0aGF0IG11c3QgYXBwZWFyIGluIHRoZSBlbGVtZW50IHRleHQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRleHRXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElELCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KX0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHt0aW1lb3V0OiAwfSlcbiAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBpZiAoIWFjdHVhbFRleHQuaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBubyBsb25nZXIgY29udGFpbnMgZXhjbHVkZWQgdmlzaWJsZSB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjbHVkZWRUZXh0IEZyYWdtZW50IHRoYXQgc2hvdWxkIGRpc2FwcGVhciBmcm9tIHRoZSBlbGVtZW50IHRleHQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRleHRXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHRFeGNsdWRlcyh0ZXN0SUQsIGV4Y2x1ZGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwge3RpbWVvdXQ6IDB9KVxuICAgICAgY29uc3QgYWN0dWFsVGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIGlmIChhY3R1YWxUZXh0LmluY2x1ZGVzKGV4Y2x1ZGVkVGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdGV4dCB0byBleGNsdWRlICR7ZXhjbHVkZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydHMgYSByZW5kZXJlZCBlbGVtZW50IGhhcyBhIENTUyBjb2xvciBmcm9tIHRoZSBleHBlY3RlZCBwYWxldHRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIENTUyBwcm9wZXJ0eSB0byByZWFkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRSZ2IgRXhwZWN0ZWQgUkdCIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlnaHRSZ2IgRGlzYWxsb3dlZCBSR0IgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBIdW1hbi1yZWFkYWJsZSBlbGVtZW50IGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdFRlc3RJRENzc0NvbG9yKHRlc3RJRCwgcHJvcGVydHlOYW1lLCBleHBlY3RlZFJnYiwgbGlnaHRSZ2IsIGRlc2NyaXB0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRClcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGF3YWl0IGVsZW1lbnQuZ2V0Q3NzVmFsdWUocHJvcGVydHlOYW1lKVxuXG4gICAgaWYgKGNzc1ZhbHVlTWF0Y2hlc1JnYihhY3R1YWxWYWx1ZSwgbGlnaHRSZ2IpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpcHRpb259IHRvIGF2b2lkIHRoZSBsaWdodCBwYWxldHRlLCBnb3QgJHtwcm9wZXJ0eU5hbWV9ICR7YWN0dWFsVmFsdWV9YClcbiAgICB9XG4gICAgaWYgKCFjc3NWYWx1ZU1hdGNoZXNSZ2IoYWN0dWFsVmFsdWUsIGV4cGVjdGVkUmdiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2Rlc2NyaXB0aW9ufSB0byBpbmNsdWRlIHJnYigke2V4cGVjdGVkUmdifSksIGdvdCAke3Byb3BlcnR5TmFtZX0gJHthY3R1YWxWYWx1ZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGFuIGVsZW1lbnQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLldhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLndhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRIVE1MKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gdGltZW91dE92ZXJyaWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRDb21tYW5kVGltZW91dCh0aW1lb3V0T3ZlcnJpZGUpIHtcbiAgICBpZiAodGltZW91dE92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0T3ZlcnJpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyVmlzaXQocGF0aClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ29va2llcygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb29raWUgdG8gdGhlIGFjdGl2ZSBkcml2ZXIgc2Vzc2lvbiBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICogb3JpZ2luLiBVc2VmdWwgd2hlbiBhbiBvdXQtb2YtYmFuZCBsb2dpbiAoY3VybCwgZmV0Y2gsIGV0Yy4pIHJldHVybmVkXG4gICAqIGEgYFNldC1Db29raWVgIHZhbHVlIGFuZCB0aGUgdGVzdCBuZWVkcyB0aGUgYnJvd3NlciB0byBzdGFydFxuICAgKiBhdXRoZW50aWNhdGVkIHdpdGhvdXQgZHJpdmluZyB0aGUgc2lnbi1pbiBVSS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBtdXN0IGFscmVhZHkgYmUgb24gYSBwYWdlIHdob3NlIG9yaWdpbi9kb21haW4gbWF0Y2hlcyB0aGVcbiAgICogY29va2llIGRvbWFpbiwgb3RoZXJ3aXNlIFNlbGVuaXVtIHdpbGwgcmVqZWN0IHRoZSBjYWxsLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZywgcGF0aD86IHN0cmluZywgc2VjdXJlPzogYm9vbGVhbiwgaHR0cE9ubHk/OiBib29sZWFuLCBleHBpcnk/OiBudW1iZXIsIHNhbWVTaXRlPzogXCJTdHJpY3RcIiB8IFwiTGF4XCIgfCBcIk5vbmVcIn19IGNvb2tpZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZENvb2tpZShjb29raWUpIHtcbiAgICBpZiAoIWNvb2tpZSB8fCB0eXBlb2YgY29va2llLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgYSBub24tZW1wdHkgYG5hbWVgXCIpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb29raWUudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZENvb2tpZSByZXF1aXJlcyBhIHN0cmluZyBgdmFsdWVgXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5hZGRDb29raWUoY29va2llKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhbiBhcmJpdHJhcnkgc2NyaXB0IGluIHRoZSBhY3RpdmUgYnJvd3NlciBzZXNzaW9uIGFuZCByZXR1cm4gdGhlXG4gICAqIHJlc29sdmVkIHZhbHVlLiBgc2NyaXB0YCBpcyB0aGUgZnVuY3Rpb24gYm9keSBleGVjdXRlZCBpbiB0aGUgYnJvd3NlclxuICAgKiAoYG5ldyBGdW5jdGlvbihcIi4uLlwiKWAtc3R5bGUpOyBgYXJnc2AgYXJlIGZvcndhcmRlZCBhcyBgYXJndW1lbnRzW2ldYC5cbiAgICogQXN5bmNocm9ub3VzIHNjcmlwdHMgbXVzdCBgcmV0dXJuYCBhIFByb21pc2UsIHdoaWNoIFNlbGVuaXVtIGF3YWl0cy5cbiAgICpcbiAgICogVXNlZnVsIGZvciB2ZXJpZmljYXRpb24gZmxvd3MgdGhhdCBuZWVkIHRvIGNhbGwgaW50byBhcHBsaWNhdGlvbiBjb2RlXG4gICAqIChlLmcuIGBmZXRjaChcIi9kZXZlbG9wbWVudC9zaWduLWluXCIsIHsuLi59KWApIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGVcbiAgICogVUksIG9yIHRvIHJlYWQgYnJvd3NlciBzdGF0ZSB0aGUgZXhpc3RpbmcgZmluZGVyL2ludGVyYWN0IGNvbW1hbmRzXG4gICAqIGRvbid0IGV4cG9zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVNjcmlwdChzY3JpcHQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gXCJzdHJpbmdcIiB8fCBzY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleGVjdXRlU2NyaXB0IHJlcXVpcmVzIGEgbm9uLWVtcHR5IGBzY3JpcHRgIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlcigpLmV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZW5kQnJvd3NlckNvbW1hbmQodHlwZSwgcGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIHNlbmRpbmcgYnJvd3NlciBjb21tYW5kICR7dHlwZX06ICR7cGF0aH1gfSxcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY29tbXVuaWNhdG9yPn0gKi8gKHRoaXMuY29tbXVuaWNhdG9yKS5zZW5kQ29tbWFuZCh7dHlwZSwgcGF0aH0pXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggdXNpbmcgdGhlIGluamVjdGVkIGJyb3dzZXIgaGVscGVyIHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgbmF2aWdhdGVzIGRpcmVjdGx5IHdpdGggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHZpc2l0KHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpICYmICghdGhpcy5jb21tdW5pY2F0b3I/LndzIHx8IHRoaXMuY29tbXVuaWNhdG9yLndzLnJlYWR5U3RhdGUgPT09IDEpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcInZpc2l0XCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgdmlzaXRpbmcgcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0byBhIHBhdGggdmlhIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkaXNtaXNzVG8ocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29tbXVuaWNhdG9yRXhpc3RzKCkgJiYgKCF0aGlzLmNvbW11bmljYXRvcj8ud3MgfHwgdGhpcy5jb21tdW5pY2F0b3Iud3MucmVhZHlTdGF0ZSA9PT0gMSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEJyb3dzZXJDb21tYW5kKFwiZGlzbWlzc1RvXCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgZGlzbWlzc2luZyB0byBwYXRoOiAke3BhdGh9YH0sXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocGF0aClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBicm93c2VyIGxvZ3MgZm9yIGNvbnNvbGUgb3V0cHV0IGFuZCB0cnVuY2F0ZXMgb3Zlcmx5IGxvbmcgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsb2dzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4TGluZXNdXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzLCBtYXhMaW5lcyA9IDIwMCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsb2dzKSB8fCBsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtcIihubyBicm93c2VyIGxvZ3MpXCJdXG4gICAgfVxuXG4gICAgaWYgKGxvZ3MubGVuZ3RoIDw9IG1heExpbmVzKSB7XG4gICAgICByZXR1cm4gbG9nc1xuICAgIH1cblxuICAgIGNvbnN0IGtlcHRMb2dzID0gbG9ncy5zbGljZShsb2dzLmxlbmd0aCAtIG1heExpbmVzKVxuICAgIGNvbnN0IGhpZGRlbkNvdW50ID0gbG9ncy5sZW5ndGggLSBtYXhMaW5lc1xuXG4gICAgcmV0dXJuIFtgKHNob3dpbmcgbGFzdCAke21heExpbmVzfSBvZiAke2xvZ3MubGVuZ3RofSBicm93c2VyIGxvZ3MsICR7aGlkZGVuQ291bnR9IG9taXR0ZWQpYCwgLi4ua2VwdExvZ3NdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpIHtcbiAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nczpcIilcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzKSkge1xuICAgICAgY29uc29sZS5sb2cobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzY3JlZW5zaG90LCB3cml0ZXMgSFRNTC9icm93c2VyIGxvZ3MgdG8gZGlzaywgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBhcnRpZmFjdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjdXJyZW50VXJsOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgaHRtbFBhdGg6IHN0cmluZywgbG9nczogc3RyaW5nW10sIGxvZ3NQYXRoOiBzdHJpbmcsIHNjcmVlbnNob3RQYXRoOiBzdHJpbmd9Pn1cbiAgICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHBhdGggZm9yIHNjcmVlbnNob3RzXCIpXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3NjcmVlbnNob3RzUGF0aFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgQ3JlYXRpbmcgZGlyIHdpdGggcmVjdXJzaXZlOiAke3BhdGh9YClcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHNjcmVlbnNob3QgaW1hZ2UgY29udGVudFwiKVxuICAgIGNvbnN0IGltYWdlQ29udGVudCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHRha2luZyBzY3JlZW5zaG90XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50YWtlU2NyZWVuc2hvdCgpKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdlbmVyYXRpbmcgZGF0ZSB2YXJpYWJsZXNcIilcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgdGltZXN0YW1wID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKVxuICAgIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LnBuZ2BcbiAgICBjb25zdCBodG1sUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5odG1sYFxuICAgIGNvbnN0IGxvZ3NQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LmxvZ3MudHh0YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgYnJvd3NlciBsb2dzXCIpXG4gICAgY29uc3QgbG9ncyA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgYnJvd3NlciBsb2dzXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCkpXG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgcGFnZSBIVE1MXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEhUTUwoKSlcbiAgICBjb25zdCBodG1sUHJldHR5ID0gcHJldHRpZnkoaHRtbClcbiAgICB0aGlzLnByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiV3JpdGluZyBmaWxlc1wiKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShodG1sUGF0aCwgaHRtbFByZXR0eSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9nc1BhdGgsIGxvZ3Muam9pbihcIlxcblwiKSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoc2NyZWVuc2hvdFBhdGgsIGltYWdlQ29udGVudCwgXCJiYXNlNjRcIilcblxuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFVSTDpcIiwgY3VycmVudFVybClcbiAgICBjb25zb2xlLmxvZyhcIkxvZ3M6XCIsIGxvZ3NQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiU2NyZWVuc2hvdDpcIiwgc2NyZWVuc2hvdFBhdGgpXG4gICAgY29uc29sZS5sb2coXCJIVE1MOlwiLCBodG1sUGF0aClcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgaHRtbCxcbiAgICAgIGh0bWxQYXRoLFxuICAgICAgbG9ncyxcbiAgICAgIGxvZ3NQYXRoLFxuICAgICAgc2NyZWVuc2hvdFBhdGhcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3BEcml2ZXIoKSB7XG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -192,8 +192,29 @@ export function resolveBrowserCommand(flags) {
192
192
  args.visible = flags.visible;
193
193
  if (flags["use-base-selector"] !== undefined)
194
194
  args.useBaseSelector = flags["use-base-selector"];
195
+ if (flags.script)
196
+ args.script = flags.script;
197
+ // Cookie flags use a `cookie-` prefix so the cookie name does not
198
+ // collide with the daemon-level `--name <my-browser>` flag the CLI
199
+ // already consumes for routing.
200
+ if (flags["cookie-name"])
201
+ args.name = flags["cookie-name"];
202
+ if (flags["cookie-value"] !== undefined)
203
+ args.value = flags["cookie-value"];
204
+ if (flags["cookie-domain"])
205
+ args.domain = flags["cookie-domain"];
206
+ if (flags["cookie-path"])
207
+ args.path = flags["cookie-path"];
208
+ if (flags["cookie-secure"] !== undefined)
209
+ args.secure = flags["cookie-secure"];
210
+ if (flags["cookie-http-only"] !== undefined)
211
+ args.httpOnly = flags["cookie-http-only"];
212
+ if (flags["cookie-expiry"] !== undefined)
213
+ args.expiry = flags["cookie-expiry"];
214
+ if (flags["cookie-same-site"])
215
+ args.sameSite = flags["cookie-same-site"];
195
216
  return { args, command: flags.command };
196
217
  }
197
218
  throw new Error("No browser command was given");
198
219
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWhlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFJO0lBQzVCLHdEQUF3RDtJQUN4RCxNQUFNLE1BQU0sR0FBRyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3RFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUN6QixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDekMsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQTtJQUVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXpCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFB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Q0FBQyxNQUFNLENBQUE7UUFDaEQsSUFBSSxLQUFLLENBQUMsR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzdFLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNwRixJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDakQsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hFLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1FBQzdELElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFFL0YsT0FBTyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJndlxuICogQHJldHVybnMge3tfOiBzdHJpbmdbXSwgZmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT59fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBcmd2KGFyZ3YpIHtcbiAgLyoqIEB0eXBlIHt7Xzogc3RyaW5nW10sIGZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gKi9cbiAgY29uc3QgcmVzdWx0ID0ge186IFtdLCBmbGFnczoge319XG4gIGNvbnN0IHNldEZsYWcgPSAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGtleSwgLyoqIEB0eXBlIHthbnl9ICovIHZhbHVlKSA9PiB7XG4gICAgaWYgKCEoa2V5IGluIHJlc3VsdC5mbGFncykpIHtcbiAgICAgIHJlc3VsdC5mbGFnc1trZXldID0gdmFsdWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQuZmxhZ3Nba2V5XSkpIHtcbiAgICAgIHJlc3VsdC5mbGFnc1trZXldID0gW3Jlc3VsdC5mbGFnc1trZXldXVxuICAgIH1cblxuICAgIHJlc3VsdC5mbGFnc1trZXldLnB1c2godmFsdWUpXG4gIH1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJndi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IGFyZ3ZbaW5kZXhdXG5cbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgcmVzdWx0Ll8ucHVzaCh2YWx1ZSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgZmxhZyA9IHZhbHVlLnNsaWNlKDIpXG5cbiAgICBpZiAoZmxhZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gZmxhZy5zcGxpdChcIj1cIilcblxuICAgICAgc2V0RmxhZyhrZXksIHJlc3Quam9pbihcIj1cIikpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRWYWx1ZSA9IGFyZ3ZbaW5kZXggKyAxXVxuXG4gICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc2V0RmxhZyhmbGFnLCBuZXh0VmFsdWUpXG4gICAgICBpbmRleCArPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEZsYWcoZmxhZywgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUGFyc2VzIGEgQ0xJIHRpbWVvdXQgZmxhZyBpbnRvIG1pbGxpc2Vjb25kcy5cbiAqIEJhcmUgbnVtZXJpYyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgc2Vjb25kcyBmb3IgQ0xJIGVyZ29ub21pY3MuXG4gKiBAcGFyYW0ge2FueX0gdGltZW91dEZsYWdcbiAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDbGlUaW1lb3V0KHRpbWVvdXRGbGFnKSB7XG4gIGlmICh0aW1lb3V0RmxhZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKHR5cGVvZiB0aW1lb3V0RmxhZyA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB0aW1lb3V0RmxhZyAqIDEwMDBcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXRTdHJpbmcgPSBTdHJpbmcodGltZW91dEZsYWcpLnRyaW0oKVxuXG4gIGlmICgvXlxcZCsoXFwuXFxkKyk/bXMkL2kudGVzdCh0aW1lb3V0U3RyaW5nKSkge1xuICAgIHJldHVybiBOdW1iZXIodGltZW91dFN0cmluZy5zbGljZSgwLCAtMikpXG4gIH1cblxuICBpZiAoL15cXGQrKFxcLlxcZCspP3MkL2kudGVzdCh0aW1lb3V0U3RyaW5nKSkge1xuICAgIHJldHVybiBOdW1iZXIodGltZW91dFN0cmluZy5zbGljZSgwLCAtMSkpICogMTAwMFxuICB9XG5cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT8kLy50ZXN0KHRpbWVvdXRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aW1lb3V0U3RyaW5nKSAqIDEwMDBcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lb3V0IGZsYWc6ICR7dGltZW91dEZsYWd9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGZsYWdzXG4gKiBAcmV0dXJucyB7e2NvbW1hbmQ6IHN0cmluZywgYXJnczogUmVjb3JkPHN0cmluZywgYW55Pn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnJvd3NlckNvbW1hbmQoZmxhZ3MpIHtcbiAgY29uc3QgdGltZW91dCA9IHJlc29sdmVDbGlUaW1lb3V0KGZsYWdzLnRpbWVvdXQpXG5cbiAgaWYgKGZsYWdzLnZpc2l0KSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IGFyZ3MgPSB7dXJsOiBmbGFncy52aXNpdH1cblxuICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MudGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICByZXR1cm4ge2FyZ3MsIGNvbW1hbmQ6IFwidmlzaXRcIn1cbiAgfVxuXG4gIGlmIChmbGFnc1tcImRpc21pc3MtdG9cIl0pIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgYXJncyA9IHtwYXRoOiBmbGFnc1tcImRpc21pc3MtdG9cIl19XG5cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgcmV0dXJuIHthcmdzLCBjb21tYW5kOiBcImRpc21pc3NUb1wifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZmluZC1ieS10ZXN0LWlkXCJdKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICB0ZXN0SUQ6IGZsYWdzW1wiZmluZC1ieS10ZXN0LWlkXCJdLFxuICAgICAgdGltZW91dCxcbiAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXSxcbiAgICAgIHZpc2libGU6IGZsYWdzLnZpc2libGVcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbXCJzY3JvbGwtdG9cIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5zY3JvbGxUbyA9IGZsYWdzW1wic2Nyb2xsLXRvXCJdXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3MsXG4gICAgICBjb21tYW5kOiBcImZpbmRCeVRlc3RJRFwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZsYWdzLmZpbmQpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIHNlbGVjdG9yOiBmbGFncy5maW5kLFxuICAgICAgdGltZW91dCxcbiAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXSxcbiAgICAgIHZpc2libGU6IGZsYWdzLnZpc2libGVcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbXCJzY3JvbGwtdG9cIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5zY3JvbGxUbyA9IGZsYWdzW1wic2Nyb2xsLXRvXCJdXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3MsXG4gICAgICBjb21tYW5kOiBcImZpbmRcIlxuICAgIH1cbiAgfVxuXG4gIGlmIChmbGFncy5jbGljaykge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgc2VsZWN0b3I6IGZsYWdzLmNsaWNrLFxuICAgICAgdGltZW91dCxcbiAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXSxcbiAgICAgIHZpc2libGU6IGZsYWdzLnZpc2libGVcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbXCJzY3JvbGwtdG9cIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5zY3JvbGxUbyA9IGZsYWdzW1wic2Nyb2xsLXRvXCJdXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3MsXG4gICAgICBjb21tYW5kOiBcImNsaWNrXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJ3YWl0LWZvci1uby1zZWxlY3RvclwiXSkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIHNlbGVjdG9yOiBmbGFnc1tcIndhaXQtZm9yLW5vLXNlbGVjdG9yXCJdLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICB1c2VCYXNlU2VsZWN0b3I6IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl1cbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBcIndhaXRGb3JOb1NlbGVjdG9yXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJleHBlY3Qtbm8tZWxlbWVudFwiXSkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIHNlbGVjdG9yOiBmbGFnc1tcImV4cGVjdC1uby1lbGVtZW50XCJdLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICB1c2VCYXNlU2VsZWN0b3I6IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl1cbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBcImV4cGVjdE5vRWxlbWVudFwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZsYWdzW1wic2V0LWJhc2Utc2VsZWN0b3JcIl0pIHtcbiAgICByZXR1cm4ge2FyZ3M6IHtzZWxlY3RvcjogZmxhZ3NbXCJzZXQtYmFzZS1zZWxlY3RvclwiXX0sIGNvbW1hbmQ6IFwic2V0QmFzZVNlbGVjdG9yXCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJnZXQtaHRtbFwiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0SFRNTFwifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZ2V0LWJyb3dzZXItbG9nc1wiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0QnJvd3NlckxvZ3NcIn1cbiAgfVxuXG4gIGlmIChmbGFnc1tcImdldC1jdXJyZW50LXVybFwiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0Q3VycmVudFVybFwifVxuICB9XG5cbiAgaWYgKGZsYWdzW1widGFrZS1zY3JlZW5zaG90XCJdKSB7XG4gICAgcmV0dXJuIHthcmdzOiB7fSwgY29tbWFuZDogXCJ0YWtlU2NyZWVuc2hvdFwifVxuICB9XG5cbiAgaWYgKGZsYWdzLmNvbW1hbmQpIHtcbiAgICBjb25zdCBhcmdzID0ge31cblxuICAgIGlmIChmbGFncy51cmwpIGFyZ3MudXJsID0gZmxhZ3MudXJsXG4gICAgaWYgKGZsYWdzLnBhdGgpIGFyZ3MucGF0aCA9IGZsYWdzLnBhdGhcbiAgICBpZiAoZmxhZ3Muc2VsZWN0b3IpIGFyZ3Muc2VsZWN0b3IgPSBmbGFncy5zZWxlY3RvclxuICAgIGlmIChmbGFnc1tcInRlc3QtaWRcIl0pIGFyZ3MudGVzdElEID0gZmxhZ3NbXCJ0ZXN0LWlkXCJdXG4gICAgaWYgKGZsYWdzLm1ldGhvZCkgYXJncy5tZXRob2ROYW1lID0gZmxhZ3MubWV0aG9kXG4gICAgaWYgKGZsYWdzLmFyZykgYXJncy5hcmdzID0gQXJyYXkuaXNBcnJheShmbGFncy5hcmcpID8gZmxhZ3MuYXJnIDogW2ZsYWdzLmFyZ11cbiAgICBpZiAoZmxhZ3NbXCJ3aXRoLWZhbGxiYWNrXCJdICE9PSB1bmRlZmluZWQpIGFyZ3Mud2l0aEZhbGxiYWNrID0gZmxhZ3NbXCJ3aXRoLWZhbGxiYWNrXCJdXG4gICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkgYXJncy50aW1lb3V0ID0gdGltZW91dFxuICAgIGlmIChmbGFnc1tcInNjcm9sbC10b1wiXSAhPT0gdW5kZWZpbmVkKSBhcmdzLnNjcm9sbFRvID0gZmxhZ3NbXCJzY3JvbGwtdG9cIl1cbiAgICBpZiAoZmxhZ3MudmlzaWJsZSAhPT0gdW5kZWZpbmVkKSBhcmdzLnZpc2libGUgPSBmbGFncy52aXNpYmxlXG4gICAgaWYgKGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl0gIT09IHVuZGVmaW5lZCkgYXJncy51c2VCYXNlU2VsZWN0b3IgPSBmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdXG5cbiAgICByZXR1cm4ge2FyZ3MsIGNvbW1hbmQ6IGZsYWdzLmNvbW1hbmR9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJObyBicm93c2VyIGNvbW1hbmQgd2FzIGdpdmVuXCIpXG59XG4iXX0=
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWhlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFJO0lBQzVCLHdEQUF3RDtJQUN4RCxNQUFNLE1BQU0sR0FBRyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3RFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUN6QixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDekMsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQTtJQUVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXpCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFB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QUMsZUFBZSxDQUFDO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDaEUsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDMUQsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzlFLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDdEYsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzlFLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDO1lBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUV4RSxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmd2XG4gKiBAcmV0dXJucyB7e186IHN0cmluZ1tdLCBmbGFnczogUmVjb3JkPHN0cmluZywgYW55Pn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFyZ3YoYXJndikge1xuICAvKiogQHR5cGUge3tfOiBzdHJpbmdbXSwgZmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT59fSAqL1xuICBjb25zdCByZXN1bHQgPSB7XzogW10sIGZsYWdzOiB7fX1cbiAgY29uc3Qgc2V0RmxhZyA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICBpZiAoIShrZXkgaW4gcmVzdWx0LmZsYWdzKSkge1xuICAgICAgcmVzdWx0LmZsYWdzW2tleV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdC5mbGFnc1trZXldKSkge1xuICAgICAgcmVzdWx0LmZsYWdzW2tleV0gPSBbcmVzdWx0LmZsYWdzW2tleV1dXG4gICAgfVxuXG4gICAgcmVzdWx0LmZsYWdzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJndltpbmRleF1cblxuICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICByZXN1bHQuXy5wdXNoKHZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBmbGFnID0gdmFsdWUuc2xpY2UoMilcblxuICAgIGlmIChmbGFnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBmbGFnLnNwbGl0KFwiPVwiKVxuXG4gICAgICBzZXRGbGFnKGtleSwgcmVzdC5qb2luKFwiPVwiKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFZhbHVlID0gYXJndltpbmRleCArIDFdXG5cbiAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBzZXRGbGFnKGZsYWcsIG5leHRWYWx1ZSlcbiAgICAgIGluZGV4ICs9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RmxhZyhmbGFnLCB0cnVlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBDTEkgdGltZW91dCBmbGFnIGludG8gbWlsbGlzZWNvbmRzLlxuICogQmFyZSBudW1lcmljIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBzZWNvbmRzIGZvciBDTEkgZXJnb25vbWljcy5cbiAqIEBwYXJhbSB7YW55fSB0aW1lb3V0RmxhZ1xuICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNsaVRpbWVvdXQodGltZW91dEZsYWcpIHtcbiAgaWYgKHRpbWVvdXRGbGFnID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBpZiAodHlwZW9mIHRpbWVvdXRGbGFnID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHRpbWVvdXRGbGFnICogMTAwMFxuICB9XG5cbiAgY29uc3QgdGltZW91dFN0cmluZyA9IFN0cmluZyh0aW1lb3V0RmxhZykudHJpbSgpXG5cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT9tcyQvaS50ZXN0KHRpbWVvdXRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aW1lb3V0U3RyaW5nLnNsaWNlKDAsIC0yKSlcbiAgfVxuXG4gIGlmICgvXlxcZCsoXFwuXFxkKyk/cyQvaS50ZXN0KHRpbWVvdXRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aW1lb3V0U3RyaW5nLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gIH1cblxuICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodGltZW91dFN0cmluZykpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRpbWVvdXRTdHJpbmcpICogMTAwMFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRpbWVvdXQgZmxhZzogJHt0aW1lb3V0RmxhZ31gKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZmxhZ3NcbiAqIEByZXR1cm5zIHt7Y29tbWFuZDogc3RyaW5nLCBhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCcm93c2VyQ29tbWFuZChmbGFncykge1xuICBjb25zdCB0aW1lb3V0ID0gcmVzb2x2ZUNsaVRpbWVvdXQoZmxhZ3MudGltZW91dClcblxuICBpZiAoZmxhZ3MudmlzaXQpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgYXJncyA9IHt1cmw6IGZsYWdzLnZpc2l0fVxuXG4gICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy50aW1lb3V0ID0gdGltZW91dFxuICAgIH1cblxuICAgIHJldHVybiB7YXJncywgY29tbWFuZDogXCJ2aXNpdFwifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZGlzbWlzcy10b1wiXSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBhcmdzID0ge3BhdGg6IGZsYWdzW1wiZGlzbWlzcy10b1wiXX1cblxuICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MudGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICByZXR1cm4ge2FyZ3MsIGNvbW1hbmQ6IFwiZGlzbWlzc1RvXCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJmaW5kLWJ5LXRlc3QtaWRcIl0pIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIHRlc3RJRDogZmxhZ3NbXCJmaW5kLWJ5LXRlc3QtaWRcIl0sXG4gICAgICB0aW1lb3V0LFxuICAgICAgdXNlQmFzZVNlbGVjdG9yOiBmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdLFxuICAgICAgdmlzaWJsZTogZmxhZ3MudmlzaWJsZVxuICAgIH1cblxuICAgIGlmIChmbGFnc1tcInNjcm9sbC10b1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnNjcm9sbFRvID0gZmxhZ3NbXCJzY3JvbGwtdG9cIl1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJncyxcbiAgICAgIGNvbW1hbmQ6IFwiZmluZEJ5VGVzdElEXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3MuZmluZCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgc2VsZWN0b3I6IGZsYWdzLmZpbmQsXG4gICAgICB0aW1lb3V0LFxuICAgICAgdXNlQmFzZVNlbGVjdG9yOiBmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdLFxuICAgICAgdmlzaWJsZTogZmxhZ3MudmlzaWJsZVxuICAgIH1cblxuICAgIGlmIChmbGFnc1tcInNjcm9sbC10b1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnNjcm9sbFRvID0gZmxhZ3NbXCJzY3JvbGwtdG9cIl1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJncyxcbiAgICAgIGNvbW1hbmQ6IFwiZmluZFwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZsYWdzLmNsaWNrKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBzZWxlY3RvcjogZmxhZ3MuY2xpY2ssXG4gICAgICB0aW1lb3V0LFxuICAgICAgdXNlQmFzZVNlbGVjdG9yOiBmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdLFxuICAgICAgdmlzaWJsZTogZmxhZ3MudmlzaWJsZVxuICAgIH1cblxuICAgIGlmIChmbGFnc1tcInNjcm9sbC10b1wiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnNjcm9sbFRvID0gZmxhZ3NbXCJzY3JvbGwtdG9cIl1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJncyxcbiAgICAgIGNvbW1hbmQ6IFwiY2xpY2tcIlxuICAgIH1cbiAgfVxuXG4gIGlmIChmbGFnc1tcIndhaXQtZm9yLW5vLXNlbGVjdG9yXCJdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgc2VsZWN0b3I6IGZsYWdzW1wid2FpdC1mb3Itbm8tc2VsZWN0b3JcIl0sXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXVxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFwid2FpdEZvck5vU2VsZWN0b3JcIlxuICAgIH1cbiAgfVxuXG4gIGlmIChmbGFnc1tcImV4cGVjdC1uby1lbGVtZW50XCJdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgc2VsZWN0b3I6IGZsYWdzW1wiZXhwZWN0LW5vLWVsZW1lbnRcIl0sXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXVxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFwiZXhwZWN0Tm9FbGVtZW50XCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJzZXQtYmFzZS1zZWxlY3RvclwiXSkge1xuICAgIHJldHVybiB7YXJnczoge3NlbGVjdG9yOiBmbGFnc1tcInNldC1iYXNlLXNlbGVjdG9yXCJdfSwgY29tbWFuZDogXCJzZXRCYXNlU2VsZWN0b3JcIn1cbiAgfVxuXG4gIGlmIChmbGFnc1tcImdldC1odG1sXCJdKSB7XG4gICAgcmV0dXJuIHthcmdzOiB7fSwgY29tbWFuZDogXCJnZXRIVE1MXCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJnZXQtYnJvd3Nlci1sb2dzXCJdKSB7XG4gICAgcmV0dXJuIHthcmdzOiB7fSwgY29tbWFuZDogXCJnZXRCcm93c2VyTG9nc1wifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZ2V0LWN1cnJlbnQtdXJsXCJdKSB7XG4gICAgcmV0dXJuIHthcmdzOiB7fSwgY29tbWFuZDogXCJnZXRDdXJyZW50VXJsXCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJ0YWtlLXNjcmVlbnNob3RcIl0pIHtcbiAgICByZXR1cm4ge2FyZ3M6IHt9LCBjb21tYW5kOiBcInRha2VTY3JlZW5zaG90XCJ9XG4gIH1cblxuICBpZiAoZmxhZ3MuY29tbWFuZCkge1xuICAgIGNvbnN0IGFyZ3MgPSB7fVxuXG4gICAgaWYgKGZsYWdzLnVybCkgYXJncy51cmwgPSBmbGFncy51cmxcbiAgICBpZiAoZmxhZ3MucGF0aCkgYXJncy5wYXRoID0gZmxhZ3MucGF0aFxuICAgIGlmIChmbGFncy5zZWxlY3RvcikgYXJncy5zZWxlY3RvciA9IGZsYWdzLnNlbGVjdG9yXG4gICAgaWYgKGZsYWdzW1widGVzdC1pZFwiXSkgYXJncy50ZXN0SUQgPSBmbGFnc1tcInRlc3QtaWRcIl1cbiAgICBpZiAoZmxhZ3MubWV0aG9kKSBhcmdzLm1ldGhvZE5hbWUgPSBmbGFncy5tZXRob2RcbiAgICBpZiAoZmxhZ3MuYXJnKSBhcmdzLmFyZ3MgPSBBcnJheS5pc0FycmF5KGZsYWdzLmFyZykgPyBmbGFncy5hcmcgOiBbZmxhZ3MuYXJnXVxuICAgIGlmIChmbGFnc1tcIndpdGgtZmFsbGJhY2tcIl0gIT09IHVuZGVmaW5lZCkgYXJncy53aXRoRmFsbGJhY2sgPSBmbGFnc1tcIndpdGgtZmFsbGJhY2tcIl1cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSBhcmdzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgaWYgKGZsYWdzW1wic2Nyb2xsLXRvXCJdICE9PSB1bmRlZmluZWQpIGFyZ3Muc2Nyb2xsVG8gPSBmbGFnc1tcInNjcm9sbC10b1wiXVxuICAgIGlmIChmbGFncy52aXNpYmxlICE9PSB1bmRlZmluZWQpIGFyZ3MudmlzaWJsZSA9IGZsYWdzLnZpc2libGVcbiAgICBpZiAoZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXSAhPT0gdW5kZWZpbmVkKSBhcmdzLnVzZUJhc2VTZWxlY3RvciA9IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl1cbiAgICBpZiAoZmxhZ3Muc2NyaXB0KSBhcmdzLnNjcmlwdCA9IGZsYWdzLnNjcmlwdFxuICAgIC8vIENvb2tpZSBmbGFncyB1c2UgYSBgY29va2llLWAgcHJlZml4IHNvIHRoZSBjb29raWUgbmFtZSBkb2VzIG5vdFxuICAgIC8vIGNvbGxpZGUgd2l0aCB0aGUgZGFlbW9uLWxldmVsIGAtLW5hbWUgPG15LWJyb3dzZXI+YCBmbGFnIHRoZSBDTElcbiAgICAvLyBhbHJlYWR5IGNvbnN1bWVzIGZvciByb3V0aW5nLlxuICAgIGlmIChmbGFnc1tcImNvb2tpZS1uYW1lXCJdKSBhcmdzLm5hbWUgPSBmbGFnc1tcImNvb2tpZS1uYW1lXCJdXG4gICAgaWYgKGZsYWdzW1wiY29va2llLXZhbHVlXCJdICE9PSB1bmRlZmluZWQpIGFyZ3MudmFsdWUgPSBmbGFnc1tcImNvb2tpZS12YWx1ZVwiXVxuICAgIGlmIChmbGFnc1tcImNvb2tpZS1kb21haW5cIl0pIGFyZ3MuZG9tYWluID0gZmxhZ3NbXCJjb29raWUtZG9tYWluXCJdXG4gICAgaWYgKGZsYWdzW1wiY29va2llLXBhdGhcIl0pIGFyZ3MucGF0aCA9IGZsYWdzW1wiY29va2llLXBhdGhcIl1cbiAgICBpZiAoZmxhZ3NbXCJjb29raWUtc2VjdXJlXCJdICE9PSB1bmRlZmluZWQpIGFyZ3Muc2VjdXJlID0gZmxhZ3NbXCJjb29raWUtc2VjdXJlXCJdXG4gICAgaWYgKGZsYWdzW1wiY29va2llLWh0dHAtb25seVwiXSAhPT0gdW5kZWZpbmVkKSBhcmdzLmh0dHBPbmx5ID0gZmxhZ3NbXCJjb29raWUtaHR0cC1vbmx5XCJdXG4gICAgaWYgKGZsYWdzW1wiY29va2llLWV4cGlyeVwiXSAhPT0gdW5kZWZpbmVkKSBhcmdzLmV4cGlyeSA9IGZsYWdzW1wiY29va2llLWV4cGlyeVwiXVxuICAgIGlmIChmbGFnc1tcImNvb2tpZS1zYW1lLXNpdGVcIl0pIGFyZ3Muc2FtZVNpdGUgPSBmbGFnc1tcImNvb2tpZS1zYW1lLXNpdGVcIl1cblxuICAgIHJldHVybiB7YXJncywgY29tbWFuZDogZmxhZ3MuY29tbWFuZH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIk5vIGJyb3dzZXIgY29tbWFuZCB3YXMgZ2l2ZW5cIilcbn1cbiJdfQ==
package/build/cli.js CHANGED
@@ -12,6 +12,8 @@ function printHelp() {
12
12
  system-testing browser-command [--name my-browser] [--port 1991] --visit=https://example.com
13
13
  system-testing browser-command [--name my-browser] --find-by-test-id someID [--timeout 15]
14
14
  system-testing browser-command [--name my-browser] --take-screenshot
15
+ system-testing browser-command [--name my-browser] --command=executeScript --script='return document.title' [--arg ...]
16
+ system-testing browser-command [--name my-browser] --command=addCookie --cookie-name=auth --cookie-value=... [--cookie-domain=127.0.0.1] [--cookie-path=/]
15
17
  `);
16
18
  }
17
19
  /**
@@ -78,4 +80,4 @@ main(process.argv.slice(2)).catch((error) => {
78
80
  console.error(error instanceof Error ? error.message : String(error));
79
81
  process.exit(1);
80
82
  });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxvQkFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUM5RCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFFLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFakUsc0JBQXNCO0FBQ3RCLFNBQVMsU0FBUztJQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDOzs7Ozs7O0NBT2IsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxJQUFJLENBQUMsSUFBSTtJQUN0QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUUvQixJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsU0FBUyxFQUFFLENBQUE7UUFDWCxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFeEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQzVDLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQztZQUN4QyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDakMsV0FBVyxFQUFFO2dCQUNYLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FB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QUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsV0FBVyxFQUFFLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IEJyb3dzZXJDb21tYW5kQ2xpZW50IGZyb20gXCIuL2Jyb3dzZXItY29tbWFuZC1jbGllbnQuanNcIlxuaW1wb3J0IEJyb3dzZXJQcm9jZXNzIGZyb20gXCIuL2Jyb3dzZXItcHJvY2Vzcy5qc1wiXG5pbXBvcnQgQnJvd3NlclJlZ2lzdHJ5IGZyb20gXCIuL2Jyb3dzZXItcmVnaXN0cnkuanNcIlxuaW1wb3J0IHtwYXJzZUFyZ3YsIHJlc29sdmVCcm93c2VyQ29tbWFuZH0gZnJvbSBcIi4vY2xpLWhlbHBlcnMuanNcIlxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5mdW5jdGlvbiBwcmludEhlbHAoKSB7XG4gIGNvbnNvbGUubG9nKGBVc2FnZTpcbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3NlciA8bmFtZT4gWy0tcG9ydCAxOTkxXSBbLS1iYXNlLXVybCBodHRwczovL2V4YW1wbGUuY29tXVxuICBzeXN0ZW0tdGVzdGluZyBicm93c2VyLWxpc3RcbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1zdG9wIFstLW5hbWUgbXktYnJvd3Nlcl1cbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1jb21tYW5kIFstLW5hbWUgbXktYnJvd3Nlcl0gWy0tcG9ydCAxOTkxXSAtLXZpc2l0PWh0dHBzOi8vZXhhbXBsZS5jb21cbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1jb21tYW5kIFstLW5hbWUgbXktYnJvd3Nlcl0gLS1maW5kLWJ5LXRlc3QtaWQgc29tZUlEIFstLXRpbWVvdXQgMTVdXG4gIHN5c3RlbS10ZXN0aW5nIGJyb3dzZXItY29tbWFuZCBbLS1uYW1lIG15LWJyb3dzZXJdIC0tdGFrZS1zY3JlZW5zaG90XG5gKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBtYWluKGFyZ3YpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VBcmd2KGFyZ3YpXG4gIGNvbnN0IG1haW5Db21tYW5kID0gcGFyc2VkLl9bMF1cblxuICBpZiAoIW1haW5Db21tYW5kIHx8IHBhcnNlZC5mbGFncy5oZWxwKSB7XG4gICAgcHJpbnRIZWxwKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChtYWluQ29tbWFuZCA9PT0gXCJicm93c2VyXCIpIHtcbiAgICBjb25zdCBuYW1lID0gcGFyc2VkLl9bMV1cblxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYnJvd3NlciByZXF1aXJlcyBhIG5hbWVcIilcbiAgICB9XG5cbiAgICBjb25zdCBicm93c2VyUHJvY2VzcyA9IG5ldyBCcm93c2VyUHJvY2Vzcyh7XG4gICAgICBiYXNlVXJsOiBwYXJzZWQuZmxhZ3NbXCJiYXNlLXVybFwiXSxcbiAgICAgIGJyb3dzZXJBcmdzOiB7XG4gICAgICAgIGRyaXZlcjogcGFyc2VkLmZsYWdzLmRyaXZlciA/IHt0eXBlOiBwYXJzZWQuZmxhZ3MuZHJpdmVyfSA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIGRlYnVnOiBwYXJzZWQuZmxhZ3MuZGVidWcgPT09IHRydWUgfHwgcGFyc2VkLmZsYWdzLmRlYnVnID09PSBcInRydWVcIixcbiAgICAgIG5hbWUsXG4gICAgICBwb3J0OiBwYXJzZWQuZmxhZ3MucG9ydCA/IE51bWJlcihwYXJzZWQuZmxhZ3MucG9ydCkgOiAwXG4gICAgfSlcblxuICAgIGF3YWl0IGJyb3dzZXJQcm9jZXNzLnN0YXJ0KClcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7bmFtZSwgcGlkOiBwcm9jZXNzLnBpZCwgcG9ydDogYnJvd3NlclByb2Nlc3MucG9ydH0pKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHt9KVxuICB9IGVsc2UgaWYgKG1haW5Db21tYW5kID09PSBcImJyb3dzZXItbGlzdFwiKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IEJyb3dzZXJSZWdpc3RyeS5saXN0KClcblxuICAgIGlmIChwYXJzZWQuZmxhZ3MuanNvbikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZW50cmllcywgbnVsbCwgMikpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAke2VudHJ5Lm5hbWV9XFx0JHtlbnRyeS5wb3J0fVxcdHBpZD0ke2VudHJ5LnBpZH1gKVxuICAgIH1cbiAgfSBlbHNlIGlmIChtYWluQ29tbWFuZCA9PT0gXCJicm93c2VyLXN0b3BcIikge1xuICAgIGNvbnN0IHN0b3BwZWRFbnRyeSA9IGF3YWl0IEJyb3dzZXJSZWdpc3RyeS5zdG9wKHBhcnNlZC5mbGFncy5uYW1lKVxuXG4gICAgaWYgKHBhcnNlZC5mbGFncy5qc29uKSB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzdG9wcGVkRW50cnksIG51bGwsIDIpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFN0b3BwZWQgJHtzdG9wcGVkRW50cnkubmFtZX1cXHRwaWQ9JHtzdG9wcGVkRW50cnkucGlkfWApXG4gIH0gZWxzZSBpZiAobWFpbkNvbW1hbmQgPT09IFwiYnJvd3Nlci1jb21tYW5kXCIpIHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQnJvd3NlckNvbW1hbmRDbGllbnQoe1xuICAgICAgbmFtZTogcGFyc2VkLmZsYWdzLm5hbWUsXG4gICAgICBwb3J0OiBwYXJzZWQuZmxhZ3MucG9ydCA/IE51bWJlcihwYXJzZWQuZmxhZ3MucG9ydCkgOiB1bmRlZmluZWRcbiAgICB9KVxuICAgIGNvbnN0IHthcmdzLCBjb21tYW5kfSA9IHJlc29sdmVCcm93c2VyQ29tbWFuZChwYXJzZWQuZmxhZ3MpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoe2FyZ3MsIGNvbW1hbmQsIHR5cGU6IFwiYnJvd3Nlci1jb21tYW5kXCJ9KVxuXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSlcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHttYWluQ29tbWFuZH1gKVxuICB9XG59XG5cbm1haW4ocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpXG4gIHByb2Nlc3MuZXhpdCgxKVxufSlcbiJdfQ==
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxvQkFBb0IsTUFBTSw2QkFBNkIsQ0FBQTtBQUM5RCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFFLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFFakUsc0JBQXNCO0FBQ3RCLFNBQVMsU0FBUztJQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDOzs7Ozs7Ozs7Q0FTYixDQUFDLENBQUE7QUFDRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM5QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRS9CLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxTQUFTLEVBQUUsQ0FBQTtRQUNYLE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNqQyxXQUFXLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxD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SUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3BELENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNyRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pCLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgQnJvd3NlckNvbW1hbmRDbGllbnQgZnJvbSBcIi4vYnJvd3Nlci1jb21tYW5kLWNsaWVudC5qc1wiXG5pbXBvcnQgQnJvd3NlclByb2Nlc3MgZnJvbSBcIi4vYnJvd3Nlci1wcm9jZXNzLmpzXCJcbmltcG9ydCBCcm93c2VyUmVnaXN0cnkgZnJvbSBcIi4vYnJvd3Nlci1yZWdpc3RyeS5qc1wiXG5pbXBvcnQge3BhcnNlQXJndiwgcmVzb2x2ZUJyb3dzZXJDb21tYW5kfSBmcm9tIFwiLi9jbGktaGVscGVycy5qc1wiXG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmZ1bmN0aW9uIHByaW50SGVscCgpIHtcbiAgY29uc29sZS5sb2coYFVzYWdlOlxuICBzeXN0ZW0tdGVzdGluZyBicm93c2VyIDxuYW1lPiBbLS1wb3J0IDE5OTFdIFstLWJhc2UtdXJsIGh0dHBzOi8vZXhhbXBsZS5jb21dXG4gIHN5c3RlbS10ZXN0aW5nIGJyb3dzZXItbGlzdFxuICBzeXN0ZW0tdGVzdGluZyBicm93c2VyLXN0b3AgWy0tbmFtZSBteS1icm93c2VyXVxuICBzeXN0ZW0tdGVzdGluZyBicm93c2VyLWNvbW1hbmQgWy0tbmFtZSBteS1icm93c2VyXSBbLS1wb3J0IDE5OTFdIC0tdmlzaXQ9aHR0cHM6Ly9leGFtcGxlLmNvbVxuICBzeXN0ZW0tdGVzdGluZyBicm93c2VyLWNvbW1hbmQgWy0tbmFtZSBteS1icm93c2VyXSAtLWZpbmQtYnktdGVzdC1pZCBzb21lSUQgWy0tdGltZW91dCAxNV1cbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1jb21tYW5kIFstLW5hbWUgbXktYnJvd3Nlcl0gLS10YWtlLXNjcmVlbnNob3RcbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1jb21tYW5kIFstLW5hbWUgbXktYnJvd3Nlcl0gLS1jb21tYW5kPWV4ZWN1dGVTY3JpcHQgLS1zY3JpcHQ9J3JldHVybiBkb2N1bWVudC50aXRsZScgWy0tYXJnIC4uLl1cbiAgc3lzdGVtLXRlc3RpbmcgYnJvd3Nlci1jb21tYW5kIFstLW5hbWUgbXktYnJvd3Nlcl0gLS1jb21tYW5kPWFkZENvb2tpZSAtLWNvb2tpZS1uYW1lPWF1dGggLS1jb29raWUtdmFsdWU9Li4uIFstLWNvb2tpZS1kb21haW49MTI3LjAuMC4xXSBbLS1jb29raWUtcGF0aD0vXVxuYClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmd2XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFpbihhcmd2KSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQXJndihhcmd2KVxuICBjb25zdCBtYWluQ29tbWFuZCA9IHBhcnNlZC5fWzBdXG5cbiAgaWYgKCFtYWluQ29tbWFuZCB8fCBwYXJzZWQuZmxhZ3MuaGVscCkge1xuICAgIHByaW50SGVscCgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobWFpbkNvbW1hbmQgPT09IFwiYnJvd3NlclwiKSB7XG4gICAgY29uc3QgbmFtZSA9IHBhcnNlZC5fWzFdXG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJyb3dzZXIgcmVxdWlyZXMgYSBuYW1lXCIpXG4gICAgfVxuXG4gICAgY29uc3QgYnJvd3NlclByb2Nlc3MgPSBuZXcgQnJvd3NlclByb2Nlc3Moe1xuICAgICAgYmFzZVVybDogcGFyc2VkLmZsYWdzW1wiYmFzZS11cmxcIl0sXG4gICAgICBicm93c2VyQXJnczoge1xuICAgICAgICBkcml2ZXI6IHBhcnNlZC5mbGFncy5kcml2ZXIgPyB7dHlwZTogcGFyc2VkLmZsYWdzLmRyaXZlcn0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICBkZWJ1ZzogcGFyc2VkLmZsYWdzLmRlYnVnID09PSB0cnVlIHx8IHBhcnNlZC5mbGFncy5kZWJ1ZyA9PT0gXCJ0cnVlXCIsXG4gICAgICBuYW1lLFxuICAgICAgcG9ydDogcGFyc2VkLmZsYWdzLnBvcnQgPyBOdW1iZXIocGFyc2VkLmZsYWdzLnBvcnQpIDogMFxuICAgIH0pXG5cbiAgICBhd2FpdCBicm93c2VyUHJvY2Vzcy5zdGFydCgpXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe25hbWUsIHBpZDogcHJvY2Vzcy5waWQsIHBvcnQ6IGJyb3dzZXJQcm9jZXNzLnBvcnR9KSlcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoKSA9PiB7fSlcbiAgfSBlbHNlIGlmIChtYWluQ29tbWFuZCA9PT0gXCJicm93c2VyLWxpc3RcIikge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBCcm93c2VyUmVnaXN0cnkubGlzdCgpXG5cbiAgICBpZiAocGFyc2VkLmZsYWdzLmpzb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGVudHJpZXMsIG51bGwsIDIpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtlbnRyeS5uYW1lfVxcdCR7ZW50cnkucG9ydH1cXHRwaWQ9JHtlbnRyeS5waWR9YClcbiAgICB9XG4gIH0gZWxzZSBpZiAobWFpbkNvbW1hbmQgPT09IFwiYnJvd3Nlci1zdG9wXCIpIHtcbiAgICBjb25zdCBzdG9wcGVkRW50cnkgPSBhd2FpdCBCcm93c2VyUmVnaXN0cnkuc3RvcChwYXJzZWQuZmxhZ3MubmFtZSlcblxuICAgIGlmIChwYXJzZWQuZmxhZ3MuanNvbikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3RvcHBlZEVudHJ5LCBudWxsLCAyKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTdG9wcGVkICR7c3RvcHBlZEVudHJ5Lm5hbWV9XFx0cGlkPSR7c3RvcHBlZEVudHJ5LnBpZH1gKVxuICB9IGVsc2UgaWYgKG1haW5Db21tYW5kID09PSBcImJyb3dzZXItY29tbWFuZFwiKSB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEJyb3dzZXJDb21tYW5kQ2xpZW50KHtcbiAgICAgIG5hbWU6IHBhcnNlZC5mbGFncy5uYW1lLFxuICAgICAgcG9ydDogcGFyc2VkLmZsYWdzLnBvcnQgPyBOdW1iZXIocGFyc2VkLmZsYWdzLnBvcnQpIDogdW5kZWZpbmVkXG4gICAgfSlcbiAgICBjb25zdCB7YXJncywgY29tbWFuZH0gPSByZXNvbHZlQnJvd3NlckNvbW1hbmQocGFyc2VkLmZsYWdzKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZW5kKHthcmdzLCBjb21tYW5kLCB0eXBlOiBcImJyb3dzZXItY29tbWFuZFwifSlcblxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7bWFpbkNvbW1hbmR9YClcbiAgfVxufVxuXG5tYWluKHByb2Nlc3MuYXJndi5zbGljZSgyKSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXX0=