system-testing 1.0.108 → 1.0.109

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.
@@ -25,18 +25,28 @@ export default class SystemTest extends Browser {
25
25
  * Creates a new SystemTest instance
26
26
  * @param {SystemTestArgs} [args]
27
27
  */
28
- constructor({ clientWsPort, host, port, httpHost, httpPort, httpConnectHost, debug, errorFilter, scoundrelPort, urlArgs, driver, ...restArgs }?: SystemTestArgs);
28
+ constructor({ clientWsPort, host, port, httpHost, httpPort, httpConnectHost, debug, errorFilter, failOnBrowserError, failOnConsoleError, scoundrelPort, urlArgs, driver, ...restArgs }?: SystemTestArgs);
29
29
  _started: boolean;
30
30
  _clientWsPort: number;
31
31
  _httpHost: string;
32
32
  _httpPort: number;
33
+ _failOnBrowserError: boolean;
34
+ _failOnConsoleError: boolean;
33
35
  /** @type {((error: any) => boolean) | undefined} */
34
36
  _errorFilter: ((error: any) => boolean) | undefined;
37
+ /** @type {Error[]} */
38
+ _browserErrors: Error[];
35
39
  _scoundrelPort: number;
36
40
  /** @type {WebSocketServer | undefined} */
37
41
  scoundrelWss: WebSocketServer | undefined;
38
42
  /** @type {WebSocketServer | undefined} */
39
43
  clientWss: WebSocketServer | undefined;
44
+ /**
45
+ * Applies mutable options to an already-running singleton SystemTest.
46
+ * @param {Partial<SystemTestArgs>} args
47
+ * @returns {void}
48
+ */
49
+ applyArgs(args?: Partial<SystemTestArgs>): void;
40
50
  /** @returns {SystemTestCommunicator} */
41
51
  getCommunicator(): SystemTestCommunicator;
42
52
  /**
@@ -176,6 +186,17 @@ export default class SystemTest extends Browser {
176
186
  * @returns {void}
177
187
  */
178
188
  handleError(data: Record<string, any>): void;
189
+ /**
190
+ * Registers an error reported from the browser.
191
+ * @param {Record<string, any>} data Error payload.
192
+ * @returns {Error} Registered error.
193
+ */
194
+ registerBrowserError(data: Record<string, any>): Error;
195
+ /**
196
+ * Throws the first registered browser error when fail-fast is enabled.
197
+ * @returns {void}
198
+ */
199
+ throwRegisteredBrowserError(): void;
179
200
  /**
180
201
  * Stops the system test
181
202
  * @returns {Promise<void>}
@@ -222,6 +243,14 @@ export type SystemTestArgs = {
222
243
  * Filter for browser errors (return false to ignore).
223
244
  */
224
245
  errorFilter?: ((error: any) => boolean) | undefined;
246
+ /**
247
+ * Throw registered browser errors from finder/interact helpers.
248
+ */
249
+ failOnBrowserError?: boolean | undefined;
250
+ /**
251
+ * Treat browser console.error calls as registered browser errors.
252
+ */
253
+ failOnConsoleError?: boolean | undefined;
225
254
  /**
226
255
  * Port for the browser-command WebSocket server.
227
256
  */
@@ -17,6 +17,8 @@ import Browser from "./browser.js";
17
17
  * @property {string} [httpConnectHost] Hostname used by the driver to reach the HTTP server.
18
18
  * @property {boolean} [debug] Enable debug logging.
19
19
  * @property {(error: any) => boolean} [errorFilter] Filter for browser errors (return false to ignore).
20
+ * @property {boolean} [failOnBrowserError] Throw registered browser errors from finder/interact helpers.
21
+ * @property {boolean} [failOnConsoleError] Treat browser console.error calls as registered browser errors.
20
22
  * @property {number} [clientWsPort] Port for the browser-command WebSocket server.
21
23
  * @property {number} [scoundrelPort] Port for the Scoundrel WebSocket server.
22
24
  * @property {Record<string, any>} [urlArgs] Query params appended to the root path.
@@ -68,8 +70,26 @@ class SystemTest extends Browser {
68
70
  if (!globalAny.systemTest) {
69
71
  globalAny.systemTest = new SystemTest(args);
70
72
  }
73
+ else {
74
+ globalAny.systemTest.applyArgs(args);
75
+ }
71
76
  return globalAny.systemTest;
72
77
  }
78
+ /**
79
+ * Applies mutable options to an already-running singleton SystemTest.
80
+ * @param {Partial<SystemTestArgs>} args
81
+ * @returns {void}
82
+ */
83
+ applyArgs(args = {}) {
84
+ if ("debug" in args)
85
+ this._debug = args.debug ?? false;
86
+ if ("errorFilter" in args)
87
+ this._errorFilter = args.errorFilter;
88
+ if ("failOnBrowserError" in args)
89
+ this._failOnBrowserError = args.failOnBrowserError ?? true;
90
+ if ("failOnConsoleError" in args)
91
+ this._failOnConsoleError = args.failOnConsoleError ?? false;
92
+ }
73
93
  /** @returns {SystemTestCommunicator} */
74
94
  getCommunicator() {
75
95
  if (!this.communicator) {
@@ -142,6 +162,8 @@ class SystemTest extends Browser {
142
162
  if (!resolvedCallback) {
143
163
  throw new Error("SystemTest.run requires a callback");
144
164
  }
165
+ systemTest._browserErrors = [];
166
+ systemTest.applyArgs({ failOnBrowserError: true, failOnConsoleError: false, ...systemTestArgs });
145
167
  systemTest.debugLog("Resetting browser cookies before initialize");
146
168
  await systemTest.deleteAllCookies();
147
169
  systemTest.debugLog("Browser cookies cleared");
@@ -233,7 +255,7 @@ class SystemTest extends Browser {
233
255
  * Creates a new SystemTest instance
234
256
  * @param {SystemTestArgs} [args]
235
257
  */
236
- constructor({ clientWsPort = 1985, host = "localhost", port = 8081, httpHost = "localhost", httpPort = 1984, httpConnectHost, debug = false, errorFilter, scoundrelPort = 8090, urlArgs, driver, ...restArgs } = { host: "localhost", port: 8081, httpHost: "localhost", httpPort: 1984, debug: false }) {
258
+ constructor({ clientWsPort = 1985, host = "localhost", port = 8081, httpHost = "localhost", httpPort = 1984, httpConnectHost, debug = false, errorFilter, failOnBrowserError = true, failOnConsoleError = false, scoundrelPort = 8090, urlArgs, driver, ...restArgs } = { host: "localhost", port: 8081, httpHost: "localhost", httpPort: 1984, debug: false }) {
237
259
  super({ debug, driver });
238
260
  /** @type {SystemTestCommunicator | undefined} */
239
261
  this.communicator = undefined;
@@ -241,8 +263,12 @@ class SystemTest extends Browser {
241
263
  this._clientWsPort = 1985;
242
264
  this._httpHost = "localhost";
243
265
  this._httpPort = 1984;
266
+ this._failOnBrowserError = true;
267
+ this._failOnConsoleError = false;
244
268
  /** @type {((error: any) => boolean) | undefined} */
245
269
  this._errorFilter = undefined;
270
+ /** @type {Error[]} */
271
+ this._browserErrors = [];
246
272
  this._scoundrelPort = 8090;
247
273
  /** @type {WebSocketServer | undefined} */
248
274
  this.scoundrelWss = undefined;
@@ -260,6 +286,9 @@ class SystemTest extends Browser {
260
286
  const showMessage = !this.shouldIgnoreError(data);
261
287
  if (showMessage) {
262
288
  console.error("Browser error", ...data.value);
289
+ if (this._failOnConsoleError) {
290
+ this.registerBrowserError(data);
291
+ }
263
292
  }
264
293
  }
265
294
  else if (type == "console.log") {
@@ -317,6 +346,8 @@ class SystemTest extends Browser {
317
346
  this._httpConnectHost = httpConnectHost;
318
347
  this._debug = debug;
319
348
  this._errorFilter = errorFilter;
349
+ this._failOnBrowserError = failOnBrowserError;
350
+ this._failOnConsoleError = failOnConsoleError;
320
351
  this._scoundrelPort = scoundrelPort;
321
352
  this._urlArgs = urlArgs;
322
353
  this._rootPath = this.buildRootPath();
@@ -406,7 +437,10 @@ class SystemTest extends Browser {
406
437
  * @returns {Promise<import("selenium-webdriver").WebElement[]>}
407
438
  */
408
439
  async all(selector, args = {}) {
409
- return await this.getDriverAdapter().all(selector, args);
440
+ this.throwRegisteredBrowserError();
441
+ const result = await this.getDriverAdapter().all(selector, args);
442
+ this.throwRegisteredBrowserError();
443
+ return result;
410
444
  }
411
445
  /**
412
446
  * Clicks an element that has children which fills out the element and would otherwise have caused a ElementClickInterceptedError
@@ -420,7 +454,9 @@ class SystemTest extends Browser {
420
454
  * @returns {Promise<void>}
421
455
  */
422
456
  async click(elementOrIdentifier, args) {
457
+ this.throwRegisteredBrowserError();
423
458
  await this.getDriverAdapter().click(elementOrIdentifier, args);
459
+ this.throwRegisteredBrowserError();
424
460
  }
425
461
  /**
426
462
  * Finds a single element by CSS selector
@@ -429,7 +465,10 @@ class SystemTest extends Browser {
429
465
  * @returns {Promise<import("selenium-webdriver").WebElement>}
430
466
  */
431
467
  async find(selector, args = {}) {
432
- return await this.getDriverAdapter().find(selector, args);
468
+ this.throwRegisteredBrowserError();
469
+ const result = await this.getDriverAdapter().find(selector, args);
470
+ this.throwRegisteredBrowserError();
471
+ return result;
433
472
  }
434
473
  /**
435
474
  * Finds a single element by test ID
@@ -438,7 +477,10 @@ class SystemTest extends Browser {
438
477
  * @returns {Promise<import("selenium-webdriver").WebElement>}
439
478
  */
440
479
  async findByTestID(testID, args) {
441
- return await this.getDriverAdapter().findByTestID(testID, args);
480
+ this.throwRegisteredBrowserError();
481
+ const result = await this.getDriverAdapter().findByTestID(testID, args);
482
+ this.throwRegisteredBrowserError();
483
+ return result;
442
484
  }
443
485
  /**
444
486
  * Checks whether an element with the given test ID is currently rendered.
@@ -447,7 +489,10 @@ class SystemTest extends Browser {
447
489
  * @returns {Promise<boolean>}
448
490
  */
449
491
  async hasTestID(testID, args) {
450
- return await this.getDriverAdapter().hasTestID(testID, args);
492
+ this.throwRegisteredBrowserError();
493
+ const result = await this.getDriverAdapter().hasTestID(testID, args);
494
+ this.throwRegisteredBrowserError();
495
+ return result;
451
496
  }
452
497
  /**
453
498
  * Finds a single element by CSS selector without waiting
@@ -456,7 +501,10 @@ class SystemTest extends Browser {
456
501
  * @returns {Promise<import("selenium-webdriver").WebElement>}
457
502
  */
458
503
  async findNoWait(selector, args = {}) {
459
- return await this.getDriverAdapter().findNoWait(selector, args);
504
+ this.throwRegisteredBrowserError();
505
+ const result = await this.getDriverAdapter().findNoWait(selector, args);
506
+ this.throwRegisteredBrowserError();
507
+ return result;
460
508
  }
461
509
  /**
462
510
  * Interacts with an element by calling a method on it with the given arguments.
@@ -467,7 +515,10 @@ class SystemTest extends Browser {
467
515
  * @returns {Promise<any>}
468
516
  */
469
517
  async interact(elementOrIdentifier, methodName, ...args) {
470
- return await this.getDriverAdapter().interact(elementOrIdentifier, methodName, ...args);
518
+ this.throwRegisteredBrowserError();
519
+ const result = await this.getDriverAdapter().interact(elementOrIdentifier, methodName, ...args);
520
+ this.throwRegisteredBrowserError();
521
+ return result;
471
522
  }
472
523
  /**
473
524
  * Expects no element to be found by CSS selector
@@ -499,7 +550,9 @@ class SystemTest extends Browser {
499
550
  * @returns {Promise<void>}
500
551
  */
501
552
  async waitForNoSelector(selector, args = {}) {
553
+ this.throwRegisteredBrowserError();
502
554
  await this.getDriverAdapter().waitForNoSelector(selector, args);
555
+ this.throwRegisteredBrowserError();
503
556
  }
504
557
  /**
505
558
  * Gets notification messages
@@ -772,11 +825,32 @@ class SystemTest extends Browser {
772
825
  handleError(data) {
773
826
  if (this.shouldIgnoreError(data))
774
827
  return;
775
- const error = new Error(`Browser error: ${data.message}`);
828
+ const error = this.registerBrowserError(data);
829
+ console.error(error);
830
+ }
831
+ /**
832
+ * Registers an error reported from the browser.
833
+ * @param {Record<string, any>} data Error payload.
834
+ * @returns {Error} Registered error.
835
+ */
836
+ registerBrowserError(data) {
837
+ const error = new Error(`Browser error: ${this.extractErrorMessage(data)}`);
776
838
  if (data.backtrace) {
777
839
  error.stack = `${error.message}\n${data.backtrace}\n\n${error.stack}`;
778
840
  }
779
- console.error(error);
841
+ this._browserErrors.push(error);
842
+ return error;
843
+ }
844
+ /**
845
+ * Throws the first registered browser error when fail-fast is enabled.
846
+ * @returns {void}
847
+ */
848
+ throwRegisteredBrowserError() {
849
+ if (!this._failOnBrowserError)
850
+ return;
851
+ const browserError = this._browserErrors[0];
852
+ if (browserError)
853
+ throw browserError;
780
854
  }
781
855
  /**
782
856
  * Stops the system test
@@ -862,4 +936,4 @@ class SystemTest extends Browser {
862
936
  }
863
937
  SystemTest.rootPath = "/blank?systemTest=true";
864
938
  export default SystemTest;
865
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDaEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFFbEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7R0FFRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7R0FHRztBQUNILFNBQVMsc0NBQXNDLENBQUMsT0FBTztJQUNyRCxPQUFPLGdFQUFnRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN2RixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQTtBQUU1QixNQUFxQixVQUFXLFNBQVEsT0FBTztJQWtCN0M7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQixTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUE7SUFDN0IsQ0FBQztJQUVELHdDQUF3QztJQUN4QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7UUFDN0QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLElBQUk7UUFDdEIsSUFBSSxJQUFJLFlBQVksS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUM5QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUNyRixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUV6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRXpFLElBQUksVUFBVSxZQUFZLEtBQUssSUFBSSxPQUFPLFVBQVUsQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQTtRQUNwRyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7WUFBRSxPQUFPLFVBQVUsQ0FBQTtRQUVyRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLElBQUk7UUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBRTlDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFBO1lBQzlELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQTtZQUM5RCxJQUFJLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQTtRQUNsRSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSDs7Ozs7O09BTUc7SUFDSDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtRQUNyRSxNQUFNLEVBQUMsd0JBQXdCLEdBQUcsSUFBSSxFQUFFLEdBQUcsY0FBYyxFQUFDLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzVJLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFL0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO1FBQ3ZELENBQUM7UUFFRCxVQUFVLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDbEUsTUFBTSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUNuQyxVQUFVLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFFOUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFekMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEMsVUFBVSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUV6RCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxVQUFVLENBQUMsUUFBUSxDQUFDLG1FQUFtRSxDQUFDLENBQUE7WUFDeEYsVUFBVSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7WUFDcEIsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7WUFDdEMsTUFBTSxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUN6QyxVQUFVLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQUE7UUFDckQsQ0FBQztRQUVELFVBQVUsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQTtRQUNwRCxNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFNLEVBQUUsWUFBWSxFQUFFLGdEQUFnRCxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUcsTUFBTSxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDdEUsQ0FBQyxDQUFDLENBQUE7UUFFRixzQkFBc0I7UUFDdEIsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFBO1FBQ3hCLHNCQUFzQjtRQUN0QixJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUE7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1lBQzdDLE1BQU0sVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNwRSxVQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFFdEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUM3RyxNQUFNLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUVqQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLENBQUM7Z0JBQVMsQ0FBQztZQUNULFVBQVUsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsQ0FBQTtZQUNuRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFBO1lBQ2xELG1GQUFtRjtZQUNuRiwrRUFBK0U7WUFDL0Usa0RBQWtEO1lBQ2xELE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFBO1lBRTFGLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxpR0FBaUcsQ0FBQyxDQUFBO1lBQ3hILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBTSxFQUFFLFlBQVksRUFBRSwrQ0FBK0MsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUN6RyxNQUFNLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtvQkFDcEUsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLGFBQWEsR0FBRyxLQUFLLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ2hGLENBQUM7WUFFRCxJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQztvQkFDSCxVQUFVLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDLENBQUE7b0JBQzNELE1BQU0sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFBO29CQUMvQixVQUFVLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7Z0JBQ2xFLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUM1RSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sUUFBUSxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILFVBQVUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtvQkFDaEUsTUFBTSxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUE7b0JBQy9CLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtnQkFDdkUsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0RBQXdELEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQ2hGLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxhQUFhLENBQUE7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsV0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsUUFBUSxHQUFHLFdBQVcsRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxhQUFhLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQztRQUNqUyxLQUFLLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQTdNeEIsaURBQWlEO1FBQ2pELGlCQUFZLEdBQUcsU0FBUyxDQUFBO1FBRXhCLGFBQVEsR0FBRyxLQUFLLENBQUE7UUFDaEIsa0JBQWEsR0FBRyxJQUFJLENBQUE7UUFDcEIsY0FBUyxHQUFHLFdBQVcsQ0FBQTtRQUN2QixjQUFTLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLG9EQUFvRDtRQUNwRCxpQkFBWSxHQUFHLFNBQVMsQ0FBQTtRQUN4QixtQkFBYyxHQUFHLElBQUksQ0FBQTtRQUNyQiwwQ0FBMEM7UUFDMUMsaUJBQVksR0FBRyxTQUFTLENBQUE7UUFDeEIsMENBQTBDO1FBQzFDLGNBQVMsR0FBRyxTQUFTLENBQUE7UUF5c0JyQjs7OztXQUlHO1FBQ0gsc0JBQWlCLEdBQUcsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRTtZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBQ3RCLElBQUksTUFBTSxDQUFBO1lBRVYsSUFBSSxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVqRCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDL0MsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzNDLENBQUM7aUJBQU0sSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN4QixDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ25DLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1lBQ3RELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLCtDQUErQyxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUM3RSxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsMEJBQXFCLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO1lBQ1osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBRS9CLG1CQUFtQjtZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUUxRCxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7WUFFOUQsSUFBSSxJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUNwRCxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQTtnQkFDaEQsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUE7WUFDakQsQ0FBQztRQUNILENBQUMsQ0FBQTtRQUVELHNCQUFzQjtRQUN0QixxQkFBZ0IsR0FBRyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtZQUVoQyxJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsbUNBQW1DLENBQUMsSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFBO2dCQUNoRyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQTtnQkFDL0MsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQUE7WUFDbEQsQ0FBQztRQUNILENBQUMsQ0FBQTtRQXBrQkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUxQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFBO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUE7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUE7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUE7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFckMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRXBCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksc0JBQXNCLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtRQUNuRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7UUFFMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQTtRQUNwRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFlBQVksRUFBRSw2Q0FBNkMsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSw4Q0FBOEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ25NLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUE7SUFDbEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLEtBQUs7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtRQUNqRixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLCtDQUErQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtRQUN0RSxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsNERBQTRELENBQUMsQ0FBQTtRQUUzRTs7O1dBR0c7UUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLENBQUMsQ0FBQTtRQUV0RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUE7UUFDbEQsTUFBTSxtQkFBbUIsR0FBRyxlQUFlLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRWpFLElBQUksbUJBQW1CLElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsbURBQW1ELG1CQUFtQixDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUE7WUFDekcsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDNUQsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMseUZBQXlGLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUV2SSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxXQUFXLENBQUE7UUFDZixNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNuRCxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLHdDQUF3QyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzNJLFdBQVcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQzt3QkFBRSxPQUFNO29CQUNqQyxlQUFlLEVBQUUsQ0FBQTtvQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO29CQUM3RCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ2pCLENBQUMsQ0FBQTtnQkFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ2xELENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDO2dCQUFTLENBQUM7WUFDVCxlQUFlLEVBQUUsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsSUFBSTtRQUNuQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJO1FBQzdCLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUk7UUFDMUIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDckQsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUN6RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUN2QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7UUFFakIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDO2dCQUMzRixTQUFTO1lBQ1gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3pDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDbkgsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUE7UUFFbkMsS0FBSyxNQUFNLDBCQUEwQixJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFDckUsTUFBTSxJQUFJLEdBQUcsTUFBTSwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUV2RCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sd0JBQXdCLENBQUE7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3BFLE1BQU0sRUFBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pFLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUE7UUFDMUMsSUFBSSwrQkFBK0IsQ0FBQTtRQUNuQyxJQUFJLDZCQUE2QixDQUFBO1FBRWpDLE1BQU0sT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7WUFFcEgsS0FBSyxNQUFNLDBCQUEwQixJQUFJLDJCQUEyQixFQUFFLENBQUM7Z0JBQ3JFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sMEJBQTBCLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBRXhMLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO29CQUNuRSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtnQkFDM0QsQ0FBQztnQkFFRCxJQUFJLG1CQUFtQixJQUFJLDJCQUEyQixFQUFFLENBQUM7b0JBQ3ZELCtCQUErQixHQUFHLDBCQUEwQixDQUFBO29CQUM1RCw2QkFBNkIsR0FBRyxNQUFNLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtvQkFDM0YsT0FBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLDJCQUEyQix3QkFBd0IsK0JBQStCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxSSxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksK0JBQStCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLCtCQUErQixFQUFFLE9BQU8sQ0FBQyxDQUFBLENBQUMsbUNBQW1DO1lBQ2pHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7WUFDdkUsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCw2QkFBNkIsSUFBSSxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDL0ksQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLDJCQUEyQjtRQUMvQixNQUFNLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsRUFBRSxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBRW5ILEtBQUssTUFBTSwwQkFBMEIsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMscUNBQXFDLEVBQUUsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQSxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzdCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxDQUFBO1FBRTlELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUE7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQ3hDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDOUQsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQTtZQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUUzRCxJQUFJLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQ3JGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixDQUFDO2dCQUNuRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjthQUNoQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUE7WUFDckMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUMsQ0FBQyxDQUFBO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUN0QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVuRCx3RUFBd0U7UUFDeEUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLHNEQUFzRCxDQUFDLENBQUE7WUFDckUsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUNoQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUUvQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBRXZDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1lBQzFDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7WUFDbkMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFFOUMsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7Z0JBRWhELElBQUksQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtnQkFDL0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMxRyxJQUFJLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQUE7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtZQUN4RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLG9FQUFvRSxDQUFDLENBQUE7Z0JBQ25GLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLHNFQUFzRSxDQUFDLENBQUE7Z0JBQ3JGLE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsK0NBQStDLENBQUMsQ0FBQTtnQkFDOUQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMxRyxJQUFJLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7WUFDOUQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFBO2dCQUNyRixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtnQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFBO2dCQUN2RixNQUFNLEtBQUssQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsbURBQW1ELENBQUMsQ0FBQTtRQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDdkMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUE7UUFFM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLHlEQUF5RCxDQUFDLENBQUE7WUFDeEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO1lBQ3BGLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFFBQVE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUM1RCxNQUFNLFdBQVcsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxRSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7Z0JBQUUsT0FBTTtZQUNqRCxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDN0MsQ0FBQyxDQUFBO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsUUFBUSxZQUFZLGVBQWUsRUFBRSxDQUFDO2dCQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN6RCxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25GLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0QsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckYsV0FBVyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUM3RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRTNELElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFFcEQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxzQkFBc0I7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSx1REFBdUQsRUFBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMzSSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDWixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7b0JBQ2xCLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLENBQUMsbUNBQW1DLEdBQUcsTUFBTSxDQUFBO2dCQUNqRCxJQUFJLENBQUMsb0NBQW9DLEdBQUcsT0FBTyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDLG1DQUFtQyxDQUFBO1lBQy9DLE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFBO1lBQ2hELE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFDaEUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVCLGlEQUFpRCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDL0YsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFdEIsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDbkcsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUE7Z0JBQy9DLE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFBO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFFBQVE7UUFDaEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQTtJQUNwQyxDQUFDO0lBaUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsSUFBSTtRQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUFFLE9BQU07UUFFeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRXpELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3ZFLENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzFCLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNmLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUE7UUFDMUUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQTtZQUM1QyxNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLG1DQUFtQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZJLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFlBQVk7UUFDaEIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMxRCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFBO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUE7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsU0FBUyxDQUFBO1FBQ3BELElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLENBQUE7UUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHNCQUFzQixDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxDQUFDLENBQUE7UUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFdkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsa0JBQWtCO1FBQ3hELElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTTtRQUVoQixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixLQUFLLEVBQUUsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3SSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7WUFDbkIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDO29CQUNILE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtnQkFDcEIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsNEJBQTRCO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQyxDQUFBO1lBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3RGLElBQUksT0FBTztvQkFBRSxPQUFNO2dCQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQTtZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ25ELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O29CQUMzQixNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7O0FBejNCTSxtQkFBUSxHQUFHLHdCQUF3QixBQUEzQixDQUEyQjtlQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgU2VydmVyIGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvc2VydmVyL2luZGV4LmpzXCJcbmltcG9ydCBTZXJ2ZXJXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuaW1wb3J0IFN5c3RlbVRlc3RIdHRwU2VydmVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWh0dHAtc2VydmVyLmpzXCJcbmltcG9ydCB7d2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIlxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3lzdGVtVGVzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSBQb3J0IGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cEhvc3RdIEhvc3RuYW1lIGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodHRwUG9ydF0gUG9ydCBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cENvbm5lY3RIb3N0XSBIb3N0bmFtZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gcmVhY2ggdGhlIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IGFueSkgPT4gYm9vbGVhbn0gW2Vycm9yRmlsdGVyXSBGaWx0ZXIgZm9yIGJyb3dzZXIgZXJyb3JzIChyZXR1cm4gZmFsc2UgdG8gaWdub3JlKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpZW50V3NQb3J0XSBQb3J0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Njb3VuZHJlbFBvcnRdIFBvcnQgZm9yIHRoZSBTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3VybEFyZ3NdIFF1ZXJ5IHBhcmFtcyBhcHBlbmRlZCB0byB0aGUgcm9vdCBwYXRoLlxuICogQHByb3BlcnR5IHtTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnfSBbZHJpdmVyXSBEcml2ZXIgY29uZmlndXJhdGlvbi5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7U3lzdGVtVGVzdEFyZ3MgJiB7cmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlPzogYm9vbGVhbn19IFN5c3RlbVRlc3RSdW5BcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3lzdGVtVGVzdERyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtcInNlbGVuaXVtXCJ8XCJhcHBpdW1cIn0gW3R5cGVdIERyaXZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSBEcml2ZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtcImFjdGlvbnNcIiB8IFwianNcIn0gW21ldGhvZF0gT3ZlcnJpZGUgdGhlIGNsaWNrIHBhdGguIGBcImFjdGlvbnNcImAgdXNlcyB0aGUgU2VsZW5pdW0gQWN0aW9ucyBBUEkgKHJlYWwgcG9pbnRlciBtb3ZlICsgY2xpY2spOyBgXCJqc1wiYCBkaXNwYXRjaGVzIGBlbGVtZW50LmNsaWNrKClgIHZpYSBgZXhlY3V0ZVNjcmlwdGAgaW5zaWRlIHRoZSBwYWdlJ3MgSlMgY29udGV4dCAoc2tpcHMgV2ViRHJpdmVyJ3MgcG9pbnRlciBzeW50aGVzaXMgZW50aXJlbHkg4oCUIHVzZWZ1bCB3aGVuIHRoZSBkZWZhdWx0IGNsaWNrIGlzIGRyb3BwZWQgYnkgYSBmcmFtZXdvcmsgcmVzcG9uZGVyIHRoYXQgcmVmdXNlcyBzeW50aGV0aWMgV2ViRHJpdmVyIHBvaW50ZXIgZXZlbnRzKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufX0gSW50ZXJhY3RBcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdEZvck5vU2VsZWN0b3JBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uTWVzc2FnZUFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc21pc3NdIFdoZXRoZXIgdG8gZGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uIGFmdGVyIGl0IGFwcGVhcnMuXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIC8oPzpefFxccy1cXHMpXFxbRE9NXFxdIFBhc3N3b3JkIGZpZWxkIGlzIG5vdCBjb250YWluZWQgaW4gYSBmb3JtOi9pLnRlc3QobWVzc2FnZSlcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuY29uc3QgZ2xvYmFsQW55ID0gZ2xvYmFsVGhpc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeXN0ZW1UZXN0IGV4dGVuZHMgQnJvd3NlciB7XG4gIHN0YXRpYyByb290UGF0aCA9IFwiL2JsYW5rP3N5c3RlbVRlc3Q9dHJ1ZVwiXG5cbiAgLyoqIEB0eXBlIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIHwgdW5kZWZpbmVkfSAqL1xuICBjb21tdW5pY2F0b3IgPSB1bmRlZmluZWRcblxuICBfc3RhcnRlZCA9IGZhbHNlXG4gIF9jbGllbnRXc1BvcnQgPSAxOTg1XG4gIF9odHRwSG9zdCA9IFwibG9jYWxob3N0XCJcbiAgX2h0dHBQb3J0ID0gMTk4NFxuICAvKiogQHR5cGUgeygoZXJyb3I6IGFueSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gIF9lcnJvckZpbHRlciA9IHVuZGVmaW5lZFxuICBfc2NvdW5kcmVsUG9ydCA9IDgwOTBcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIHNjb3VuZHJlbFdzcyA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgY2xpZW50V3NzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtTeXN0ZW1UZXN0fVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoYXJncyA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxBbnkuc3lzdGVtVGVzdCkge1xuICAgICAgZ2xvYmFsQW55LnN5c3RlbVRlc3QgPSBuZXcgU3lzdGVtVGVzdChhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBnbG9iYWxBbnkuc3lzdGVtVGVzdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yfSAqL1xuICBnZXRDb21tdW5pY2F0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbW11bmljYXRvclxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcG9zc2libGUgZnJvbSB0aGUgcGF5bG9hZCBzZW50IGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119IHwgRXJyb3J9IGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlKSA/IGRhdGEudmFsdWVbMF0gOiB1bmRlZmluZWRcblxuICAgIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGZpcnN0VmFsdWUubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWUubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWVcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYnJvd3NlciBlcnJvciBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBidWlsdC1pbiBydWxlcyBhbmQgYW4gb3B0aW9uYWwgZXJyb3IgZmlsdGVyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfX0gZGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNob3VsZElnbm9yZUVycm9yKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5leHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpXG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOFwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOVwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXJyb3JGaWx0ZXIgJiYgdGhpcy5fZXJyb3JGaWx0ZXIoZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzIHwgZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFthcmdzXVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbY2FsbGJhY2tdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihhcmdzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlc29sdmVkQ2FsbGJhY2sgPSB0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8gYXJncyA6IGNhbGxiYWNrXG4gICAgY29uc3Qge3JlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSA9IHRydWUsIC4uLnN5c3RlbVRlc3RBcmdzfSA9IC8qKiBAdHlwZSB7U3lzdGVtVGVzdFJ1bkFyZ3N9ICovICh0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8ge30gOiBhcmdzIHx8IHt9KVxuICAgIGNvbnN0IHN5c3RlbVRlc3QgPSB0aGlzLmN1cnJlbnQoc3lzdGVtVGVzdEFyZ3MpXG5cbiAgICBpZiAoIXJlc29sdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5c3RlbVRlc3QucnVuIHJlcXVpcmVzIGEgY2FsbGJhY2tcIilcbiAgICB9XG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVzZXR0aW5nIGJyb3dzZXIgY29va2llcyBiZWZvcmUgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZGVsZXRlQWxsQ29va2llcygpXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkJyb3dzZXIgY29va2llcyBjbGVhcmVkXCIpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZ2V0Um9vdFBhdGhcIilcbiAgICBjb25zdCByb290UGF0aCA9IHN5c3RlbVRlc3QuZ2V0Um9vdFBhdGgoKVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgVmlzaXQgcm9vdFBhdGggd2l0aCBkaXNtaXNzVG86ICR7cm9vdFBhdGh9YClcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmRpc21pc3NUbyhyb290UGF0aClcbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKGBEaXNtaXNzZWQgdG8gcm9vdCBwYXRoICR7cm9vdFBhdGh9YClcblxuICAgIGlmICghc3lzdGVtVGVzdC53cyB8fCBzeXN0ZW1UZXN0LndzLnJlYWR5U3RhdGUgIT09IDEpIHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJXZWJTb2NrZXQgbm90IGNvbm5lY3RlZCBhZnRlciBkaXNtaXNzVG8sIHdhaXRpbmcgZm9yIHJlY29ubmVjdGlvblwiKVxuICAgICAgc3lzdGVtVGVzdC53cyA9IG51bGxcbiAgICAgIHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSBudWxsXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LndhaXRGb3JDbGllbnRXZWJTb2NrZXQoKVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWRcIilcbiAgICB9XG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIHN0YXJ0ZWQgLSBzZW5kIGluaXRpYWxpemVcIilcbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAxMF8wMDAsIGVycm9yTWVzc2FnZTogXCJTZW5kaW5nIGludGlhbGl6ZSB0byB1c2VTeXN0ZW1UZXN0KCkgdGltZWQgb3V0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcImluaXRpYWxpemVcIn0pXG4gICAgfSlcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgcnVuRXJyb3IgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHRlYXJkb3duRXJyb3IgPSB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZmluZEJ5VGVzdElEIGJsYW5rVGV4dFwiKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC5maW5kQnlUZXN0SUQoXCJibGFua1RleHRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkZvdW5kIGJsYW5rVGV4dFwiKVxuXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwicmVzb2x2ZWRDYWxsYmFja1wiKVxuICAgICAgYXdhaXQgcmVzb2x2ZWRDYWxsYmFjayhzeXN0ZW1UZXN0KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBjYWxsYmFjayBjb21wbGV0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgUnVuIGVycm9yIGNhdWdodCwgdGFraW5nIHNjcmVlbnNob3Q6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC50YWtlU2NyZWVuc2hvdCgpXG5cbiAgICAgIHJ1bkVycm9yID0gZXJyb3JcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBmaW5pc2hlZCAtIHNlbmQgdGVhcmRvd25cIilcbiAgICAgIGNvbnN0IHRlYXJkb3duV3MgPSBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLndzXG4gICAgICAvLyBXZWJTb2NrZXQuQ0xPU0lORyAoMikgYW5kIFdlYlNvY2tldC5DTE9TRUQgKDMpIGNhbm5vdCByZWNvdmVyLCBzbyBza2lwIHRlYXJkb3duLlxuICAgICAgLy8gT1BFTiAoMSkgc2VuZHMgaW1tZWRpYXRlbHkuIENPTk5FQ1RJTkcgKDApIHF1ZXVlcyB0aGUgY29tbWFuZCBhbmQgZmx1c2hlcyBvblxuICAgICAgLy8gb25PcGVuIOKAlCB0aGUgMTBzIHRpbWVvdXQgYmVsb3cgY292ZXJzIHRoZSB3YWl0LlxuICAgICAgY29uc3Qgd3NDbG9zZWQgPSAhdGVhcmRvd25XcyB8fCB0ZWFyZG93bldzLnJlYWR5U3RhdGUgPT09IDIgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAzXG5cbiAgICAgIGlmICh3c0Nsb3NlZCkge1xuICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiU2tpcHBpbmcgdGVhcmRvd24g4oCUIGJyb3dzZXIgd2Vic29ja2V0IGlzIGNsb3NlZCAobGlrZWx5IGJ5IG5hdmlnYXRpb24vc2lnbi1vdXQgZHVyaW5nIHRoZSB0ZXN0KVwiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAxMF8wMDAsIGVycm9yTWVzc2FnZTogXCJTZW5kaW5nIHRlYXJkb3duIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwidGVhcmRvd25cIn0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0ZWFyZG93bkVycm9yID0gZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChydW5FcnJvcikge1xuICAgICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHRlYXJkb3duIGZhaWxlZCBhZnRlciB0ZXN0IGZhaWx1cmVcIiwgdGVhcmRvd25FcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKHJlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgcnVuXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJ1bkVycm9yXG4gICAgfVxuXG4gICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiVGVhcmRvd24gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgdGVhcmRvd25cIilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciB0ZWFyZG93biBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHRlYXJkb3duRXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTeXN0ZW1UZXN0IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdEFyZ3N9IFthcmdzXVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudFdzUG9ydCA9IDE5ODUsIGhvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gODA4MSwgaHR0cEhvc3QgPSBcImxvY2FsaG9zdFwiLCBodHRwUG9ydCA9IDE5ODQsIGh0dHBDb25uZWN0SG9zdCwgZGVidWcgPSBmYWxzZSwgZXJyb3JGaWx0ZXIsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2h0dHBIb3N0ID0gaHR0cEhvc3RcbiAgICB0aGlzLl9odHRwUG9ydCA9IGh0dHBQb3J0XG4gICAgdGhpcy5faHR0cENvbm5lY3RIb3N0ID0gaHR0cENvbm5lY3RIb3N0XG4gICAgdGhpcy5fZGVidWcgPSBkZWJ1Z1xuICAgIHRoaXMuX2Vycm9yRmlsdGVyID0gZXJyb3JGaWx0ZXJcbiAgICB0aGlzLl9zY291bmRyZWxQb3J0ID0gc2NvdW5kcmVsUG9ydFxuICAgIHRoaXMuX3VybEFyZ3MgPSB1cmxBcmdzXG4gICAgdGhpcy5fcm9vdFBhdGggPSB0aGlzLmJ1aWxkUm9vdFBhdGgoKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBvYmplY3Q+fSAqL1xuICAgIHRoaXMuX3Jlc3BvbnNlcyA9IHt9XG5cbiAgICB0aGlzLl9zZW5kQ291bnQgPSAwXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgICB0aGlzLnNldENvbW11bmljYXRvcih0aGlzLmNvbW11bmljYXRvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgU2NvdW5kcmVsIHNlcnZlciB3aGljaCB0aGUgYnJvd3NlciBjb25uZWN0cyB0byBmb3IgcmVtb3RlIGV2YWx1YXRpb24gaW4gdGhlIGJyb3dzZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zY291bmRyZWxXc3MpIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgYWxyZWFkeSBzdGFydGVkXCIpXG5cbiAgICB0aGlzLnNjb3VuZHJlbFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX3Njb3VuZHJlbFBvcnR9KVxuICAgIHRoaXMuc2VydmVyV2ViU29ja2V0ID0gbmV3IFNlcnZlcldlYlNvY2tldCh0aGlzLnNjb3VuZHJlbFdzcylcbiAgICB0aGlzLnNlcnZlciA9IG5ldyBTZXJ2ZXIodGhpcy5zZXJ2ZXJXZWJTb2NrZXQpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wU2NvdW5kcmVsKCkge1xuICAgIGlmICh0aGlzLnNlcnZlcj8uY2xvc2UpIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgU2NvdW5kcmVsIHRvIHN0b3BcIn0sIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuc2VydmVyPn0gKi8gKHRoaXMuc2VydmVyKS5jbG9zZSgpKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlV2ViU29ja2V0U2VydmVyKHRoaXMuc2NvdW5kcmVsV3NzLCBcIlNjb3VuZHJlbCBXZWJTb2NrZXQgc2VydmVyXCIpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBTY291bmRyZWwgY2xpZW50IChicm93c2VyKSB0byBjb25uZWN0IGFuZCByZXR1cm5zIGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRNc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0Pn1cbiAgICovXG4gIGFzeW5jIGdldFNjb3VuZHJlbENsaWVudCh0aW1lb3V0TXMgPSAxMDAwMCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiB3YWl0aW5nIGZvciBicm93c2VyIFNjb3VuZHJlbCBpbml0aWFsaXphdGlvblwiKVxuICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBTY291bmRyZWwgdG8gaW5pdGlhbGl6ZVwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJ3YWl0Rm9yU2NvdW5kcmVsXCJ9KVxuICAgIH0pXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogYnJvd3NlciByZXBvcnRlZCBTY291bmRyZWwgaW5pdGlhbGl6ZWRcIilcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7YW55fSBjbGllbnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb25zdCBpc09wZW5DbGllbnQgPSAoY2xpZW50KSA9PiBjbGllbnQ/LmJhY2tlbmQ/LndzPy5yZWFkeVN0YXRlID09PSAxXG5cbiAgICBjb25zdCBleGlzdGluZ0NsaWVudHMgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzPy4oKVxuICAgIGNvbnN0IG9wZW5FeGlzdGluZ0NsaWVudHMgPSBleGlzdGluZ0NsaWVudHM/LmZpbHRlcihpc09wZW5DbGllbnQpXG5cbiAgICBpZiAob3BlbkV4aXN0aW5nQ2xpZW50cyAmJiBvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogdXNpbmcgZXhpc3Rpbmcgb3BlbiBjbGllbnQgKCR7b3BlbkV4aXN0aW5nQ2xpZW50cy5sZW5ndGh9IGF2YWlsYWJsZSlgKVxuICAgICAgcmV0dXJuIG9wZW5FeGlzdGluZ0NsaWVudHNbb3BlbkV4aXN0aW5nQ2xpZW50cy5sZW5ndGggLSAxXVxuICAgIH1cbiAgICB0aGlzLmRlYnVnTG9nKGBnZXRTY291bmRyZWxDbGllbnQ6IG5vIG9wZW4gY2FjaGVkIGNsaWVudHMsIHdhaXRpbmcgZm9yIG5ldyBjb25uZWN0aW9uIChjYWNoZWQgdG90YWw6ICR7ZXhpc3RpbmdDbGllbnRzPy5sZW5ndGggPz8gMH0pYClcblxuICAgIGlmICghdGhpcy5zZXJ2ZXIuZXZlbnRzPy5vbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBldmVudHMgYXJlIHVuYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHsoKGNsaWVudDogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb25OZXdDbGllbnRcbiAgICBjb25zdCBjbGVhbnVwTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICBpZiAob25OZXdDbGllbnQpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vZmYoXCJuZXdDbGllbnRcIiwgb25OZXdDbGllbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXMsIGVycm9yTWVzc2FnZTogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU2NvdW5kcmVsIGNsaWVudFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgb25OZXdDbGllbnQgPSAoLyoqIEB0eXBlIHthbnl9ICovIGNsaWVudCkgPT4ge1xuICAgICAgICAgIGlmICghaXNPcGVuQ2xpZW50KGNsaWVudCkpIHJldHVyblxuICAgICAgICAgIGNsZWFudXBMaXN0ZW5lcigpXG4gICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogcmVjZWl2ZWQgbmV3IG9wZW4gY2xpZW50XCIpXG4gICAgICAgICAgcmVzb2x2ZShjbGllbnQpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZlcj8uZXZlbnRzLm9uKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfSkpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFudXBMaXN0ZW5lcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmFsbChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5oYXNUZXN0SUQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yIHdpdGhvdXQgd2FpdGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlY3RzIG5vIGVsZW1lbnQgdG8gYmUgZm91bmQgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3ROb0VsZW1lbnQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgICAgZm91bmQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm90IHRvIGZpbmQ6ICR7c2VsZWN0b3J9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7V2FpdEZvck5vU2VsZWN0b3JBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkud2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIGNvbnN0IGlzTmF0aXZlSG9zdCA9IHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCJcblxuICAgIGlmIChpc05hdGl2ZUhvc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IFwibmF0aXZlOi8vXCJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJVc2luZyBuYXRpdmUgYXBwIGhvc3RcIilcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT0gXCJleHBvLWRldi1zZXJ2ZXJcIikge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gYGh0dHA6Ly8ke3RoaXMuX2hvc3R9OiR7dGhpcy5fcG9ydH1gXG4gICAgICB0aGlzLmRlYnVnTG9nKGBVc2luZyBleHBvLWRldi1zZXJ2ZXIgYXQgJHt0aGlzLmN1cnJlbnRVcmx9YClcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT0gXCJkaXN0XCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3RIb3N0ID0gdGhpcy5faHR0cENvbm5lY3RIb3N0ID8/IHRoaXMuX2h0dHBIb3N0XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7Y29ubmVjdEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YFxuXG4gICAgICB0aGlzLmRlYnVnTG9nKGBTcGF3bmluZyBIVFRQIHNlcnZlciBmb3IgZGlzdCBvbiAke3RoaXMuX2h0dHBIb3N0fToke3RoaXMuX2h0dHBQb3J0fWApXG4gICAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gbmV3IFN5c3RlbVRlc3RIdHRwU2VydmVyKHtcbiAgICAgICAgaG9zdDogdGhpcy5faHR0cEhvc3QsXG4gICAgICAgIHBvcnQ6IHRoaXMuX2h0dHBQb3J0LFxuICAgICAgICBkZWJ1ZzogdGhpcy5fZGVidWcsXG4gICAgICAgIG9uRXJyb3I6IHRoaXMub25IdHRwU2VydmVyRXJyb3JcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBIVFRQIHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5zdGFydCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQ2hlY2tpbmcgSFRUUCBzZXJ2ZXIgaGVhbHRoXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLmFzc2VydFJlYWNoYWJsZSh7dGltZW91dE1zOiB0aGlzLmdldFRpbWVvdXRzKCl9KVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkhUVFAgc2VydmVyIHN0YXJ0ZWRcIilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHNldCBTWVNURU1fVEVTVF9IT1NUIHRvICdleHBvLWRldi1zZXJ2ZXInLCAnZGlzdCcsIG9yICduYXRpdmUnXCIpXG4gICAgfVxuXG4gICAgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc2V0QmFzZVVybCh0aGlzLmN1cnJlbnRVcmwpXG5cbiAgICAvLyBTdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBzZXJ2ZXIgYmVmb3JlIHRoZSBkcml2ZXIgZm9yIG5hdGl2ZSBob3N0cyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlSG9zdCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgKGJlZm9yZSBkcml2ZXIgZm9yIG5hdGl2ZSlcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBkcml2ZXJcIilcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zdGFydCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkRyaXZlciBzdGFydGVkXCIpXG5cbiAgICBhd2FpdCB0aGlzLnNldFRpbWVvdXRzKDEwMDAwKVxuICAgIHRoaXMuZGVidWdMb2coXCJUaW1lb3V0cyBzZXQgb24gZHJpdmVyXCIpXG5cbiAgICBpZiAoIWlzTmF0aXZlSG9zdCkge1xuICAgICAgLy8gV2ViIHNvY2tldCBzZXJ2ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBicm93c2VyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgaWYgKCFpc05hdGl2ZUhvc3QpIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVIb3N0KSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU2V0dGluZyBiYXNlIHNlbGVjdG9yIHRvIGZvY3VzZWQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgdGhpcy5zZXRCYXNlU2VsZWN0b3IoXCJbZGF0YS10ZXN0aWQ9J3N5c3RlbVRlc3RpbmdDb21wb25lbnQnXVtkYXRhLWZvY3Vzc2VkPSd0cnVlJ11cIilcbiAgICAgIHRoaXMuZGVidWdMb2coXCJCYXNlIHNlbGVjdG9yIHNldFwiKVxuICAgIH1cbiAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnQgY29tcGxldGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFJvb3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9yb290UGF0aCA/PyBTeXN0ZW1UZXN0LnJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Um9vdFBhdGgocm9vdFBhdGgpIHtcbiAgICB0aGlzLl9yb290UGF0aCA9IHJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkUm9vdFBhdGgoKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChTeXN0ZW1UZXN0LnJvb3RQYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0Q2xpZW50V3NQb3J0XCIpICYmIHRoaXMuX2NsaWVudFdzUG9ydCAhPT0gMTk4NSkge1xuICAgICAgYXBwZW5kUGFyYW0oXCJzeXN0ZW1UZXN0Q2xpZW50V3NQb3J0XCIsIHRoaXMuX2NsaWVudFdzUG9ydClcbiAgICB9XG5cbiAgICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIikgJiYgdGhpcy5fc2NvdW5kcmVsUG9ydCAhPT0gODA5MCkge1xuICAgICAgYXBwZW5kUGFyYW0oXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiLCB0aGlzLl9zY291bmRyZWxQb3J0KVxuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGNsaWVudCB3ZWIgc29ja2V0IHRvIGNvbm5lY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ2xpZW50V2ViU29ja2V0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAzMDAwMCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImNvbnNvbGUubG9nXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQnJvd3NlciBsb2dcIiwgLi4uZGF0YS52YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJlcnJvclwiIHx8IGRhdGEudHlwZSA9PSBcInVuaGFuZGxlZHJlamVjdGlvblwiKSB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKGRhdGEpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9vbkNvbW1hbmRDYWxsYmFjaykge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fb25Db21tYW5kQ2FsbGJhY2soe2RhdGEsIHR5cGV9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBvbldlYlNvY2tldENsaWVudE1lc3NhZ2UgdW5rbm93biBkYXRhICh0eXBlICR7dHlwZX0pYCwgZGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIG5ldyB3ZWIgc29ja2V0IGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtXZWJTb2NrZXR9IHdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgb25XZWJTb2NrZXRDb25uZWN0aW9uID0gYXN5bmMgKHdzKSA9PiB7XG4gICAgdGhpcy53cyA9IHdzXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IHdzXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS5vbk9wZW4oKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJlcnJvclwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25FcnJvclwiKSlcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLndzLm9uKFwibWVzc2FnZVwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25NZXNzYWdlXCIpKVxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKSB7XG4gICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvbldlYlNvY2tldENsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcblxuICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0KSB7XG4gICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0KG5ldyBFcnJvcihcIkNsaWVudCB3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBjb25uZWN0aW5nXCIpKVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGVycm9yIHJlcG9ydGVkIGZyb20gdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBkYXRhXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGlmICh0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpKSByZXR1cm5cblxuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke2RhdGEubWVzc2FnZX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBzeXN0ZW0gdGVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wU2NvdW5kcmVsKClcbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy53cy5jbG9zZSgpXG4gICAgICB0aGlzLndzID0gbnVsbFxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlV2ViU29ja2V0U2VydmVyKHRoaXMuY2xpZW50V3NzLCBcImNsaWVudCBXZWJTb2NrZXQgc2VydmVyXCIpXG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgICBpZiAodGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlcikge1xuICAgICAgY29uc3QgaHR0cFNlcnZlciA9IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXJcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBIVFRQIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgaHR0cFNlcnZlci5jbG9zZSgpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB0ZWFycyBkb3duIGFuZCByZXN0YXJ0cyB0aGUgc3lzdGVtIHRlc3QgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVpbml0aWFsaXplKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9iYXNlU2VsZWN0b3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLmN1cnJlbnRVcmwgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKHRoaXMuX2RyaXZlckNvbmZpZylcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuY2xpZW50V3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2VydmVyV2ViU29ja2V0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2h0dHBTZXJ2ZXJFcnJvciA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QgPSB1bmRlZmluZWRcbiAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe29uQ29tbWFuZDogdGhpcy5vbkNvbW1hbmRSZWNlaXZlZH0pXG4gICAgdGhpcy5zZXRDb21tdW5pY2F0b3IodGhpcy5jb21tdW5pY2F0b3IpXG5cbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gd3NzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xvc2VXZWJTb2NrZXRTZXJ2ZXIod3NzLCBsYWJlbCA9IFwiV2ViU29ja2V0IHNlcnZlclwiKSB7XG4gICAgaWYgKCF3c3MpIHJldHVyblxuXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIGNsb3NpbmcgJHtsYWJlbH1gfSwgYXN5bmMgKCkgPT4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZVxuICAgICAgY29uc3QgdGVybWluYXRlQ2xpZW50ID0gKC8qKiBAdHlwZSB7YW55fSAqLyBjbGllbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbGllbnQudGVybWluYXRlKClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIHRlcm1pbmF0aW9uIGVycm9yc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzZXR0bGUgPSAoLyoqIEB0eXBlIHsodmFsdWU6IGFueSkgPT4gdm9pZH0gKi8gY2FsbGJhY2ssIC8qKiBAdHlwZSB7YW55fSAqLyBhcmcpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICBjYWxsYmFjayhhcmcpXG4gICAgICB9XG5cbiAgICAgIHdzcy5vbmNlKFwiY2xvc2VcIiwgKCkgPT4gc2V0dGxlKHJlc29sdmUsIHVuZGVmaW5lZCkpXG4gICAgICB3c3Mub25jZShcImVycm9yXCIsIChlcnJvcikgPT4gc2V0dGxlKHJlamVjdCwgZXJyb3IpKVxuICAgICAgaWYgKHdzcy5jbGllbnRzICYmIHdzcy5jbGllbnRzLnNpemUgPiAwKSB7XG4gICAgICAgIHdzcy5jbGllbnRzLmZvckVhY2godGVybWluYXRlQ2xpZW50KVxuICAgICAgfVxuICAgICAgd3NzLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHNldHRsZShyZWplY3QsIGVycm9yKVxuICAgICAgICBlbHNlIHNldHRsZShyZXNvbHZlLCB1bmRlZmluZWQpXG4gICAgICB9KVxuICAgIH0pKVxuICB9XG59XG4iXX0=
939
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDaEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFFbEM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0g7O0dBRUc7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOztHQUVHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxzQ0FBc0MsQ0FBQyxPQUFPO0lBQ3JELE9BQU8sZ0VBQWdFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZGLENBQUM7QUFFRCxrQ0FBa0M7QUFDbEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFBO0FBRTVCLE1BQXFCLFVBQVcsU0FBUSxPQUFPO0lBc0I3Qzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLENBQUMs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QU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDbkQsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQixJQUFJLEtBQUs7b0JBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTs7b0JBQzNCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDakMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUF4OEJNLG1CQUFRLEdBQUcsd0JBQXdCLEFBQTNCLENBQTJCO2VBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBTZXJ2ZXIgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvaW5kZXguanNcIlxuaW1wb3J0IFNlcnZlcldlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIGZyb20gXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtaHR0cC1zZXJ2ZXIuanNcIlxuaW1wb3J0IHt3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSBIb3N0bmFtZSBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIFBvcnQgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodHRwSG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h0dHBQb3J0XSBQb3J0IGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodHRwQ29ubmVjdEhvc3RdIEhvc3RuYW1lIHVzZWQgYnkgdGhlIGRyaXZlciB0byByZWFjaCB0aGUgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogYW55KSA9PiBib29sZWFufSBbZXJyb3JGaWx0ZXJdIEZpbHRlciBmb3IgYnJvd3NlciBlcnJvcnMgKHJldHVybiBmYWxzZSB0byBpZ25vcmUpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbE9uQnJvd3NlckVycm9yXSBUaHJvdyByZWdpc3RlcmVkIGJyb3dzZXIgZXJyb3JzIGZyb20gZmluZGVyL2ludGVyYWN0IGhlbHBlcnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsT25Db25zb2xlRXJyb3JdIFRyZWF0IGJyb3dzZXIgY29uc29sZS5lcnJvciBjYWxscyBhcyByZWdpc3RlcmVkIGJyb3dzZXIgZXJyb3JzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGllbnRXc1BvcnRdIFBvcnQgZm9yIHRoZSBicm93c2VyLWNvbW1hbmQgV2ViU29ja2V0IHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2NvdW5kcmVsUG9ydF0gUG9ydCBmb3IgdGhlIFNjb3VuZHJlbCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbdXJsQXJnc10gUXVlcnkgcGFyYW1zIGFwcGVuZGVkIHRvIHRoZSByb290IHBhdGguXG4gKiBAcHJvcGVydHkge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtTeXN0ZW1UZXN0QXJncyAmIHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmU/OiBib29sZWFufX0gU3lzdGVtVGVzdFJ1bkFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge1wiYWN0aW9uc1wiIHwgXCJqc1wifSBbbWV0aG9kXSBPdmVycmlkZSB0aGUgY2xpY2sgcGF0aC4gYFwiYWN0aW9uc1wiYCB1c2VzIHRoZSBTZWxlbml1bSBBY3Rpb25zIEFQSSAocmVhbCBwb2ludGVyIG1vdmUgKyBjbGljayk7IGBcImpzXCJgIGRpc3BhdGNoZXMgYGVsZW1lbnQuY2xpY2soKWAgdmlhIGBleGVjdXRlU2NyaXB0YCBpbnNpZGUgdGhlIHBhZ2UncyBKUyBjb250ZXh0IChza2lwcyBXZWJEcml2ZXIncyBwb2ludGVyIHN5bnRoZXNpcyBlbnRpcmVseSDigJQgdXNlZnVsIHdoZW4gdGhlIGRlZmF1bHQgY2xpY2sgaXMgZHJvcHBlZCBieSBhIGZyYW1ld29yayByZXNwb25kZXIgdGhhdCByZWZ1c2VzIHN5bnRoZXRpYyBXZWJEcml2ZXIgcG9pbnRlciBldmVudHMpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0ZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59fSBJbnRlcmFjdEFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yTm9TZWxlY3RvckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmljYXRpb25NZXNzYWdlQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc10gV2hldGhlciB0byBkaXNtaXNzIHRoZSBub3RpZmljYXRpb24gYWZ0ZXIgaXQgYXBwZWFycy5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlQ2hyb21lUGFzc3dvcmRGaWVsZFdhcm5pbmcobWVzc2FnZSkge1xuICByZXR1cm4gLyg/Ol58XFxzLVxccylcXFtET01cXF0gUGFzc3dvcmQgZmllbGQgaXMgbm90IGNvbnRhaW5lZCBpbiBhIGZvcm06L2kudGVzdChtZXNzYWdlKVxufVxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG5jb25zdCBnbG9iYWxBbnkgPSBnbG9iYWxUaGlzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVRlc3QgZXh0ZW5kcyBCcm93c2VyIHtcbiAgc3RhdGljIHJvb3RQYXRoID0gXCIvYmxhbms/c3lzdGVtVGVzdD10cnVlXCJcblxuICAvKiogQHR5cGUge1N5c3RlbVRlc3RDb21tdW5pY2F0b3IgfCB1bmRlZmluZWR9ICovXG4gIGNvbW11bmljYXRvciA9IHVuZGVmaW5lZFxuXG4gIF9zdGFydGVkID0gZmFsc2VcbiAgX2NsaWVudFdzUG9ydCA9IDE5ODVcbiAgX2h0dHBIb3N0ID0gXCJsb2NhbGhvc3RcIlxuICBfaHR0cFBvcnQgPSAxOTg0XG4gIF9mYWlsT25Ccm93c2VyRXJyb3IgPSB0cnVlXG4gIF9mYWlsT25Db25zb2xlRXJyb3IgPSBmYWxzZVxuICAvKiogQHR5cGUgeygoZXJyb3I6IGFueSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gIF9lcnJvckZpbHRlciA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge0Vycm9yW119ICovXG4gIF9icm93c2VyRXJyb3JzID0gW11cbiAgX3Njb3VuZHJlbFBvcnQgPSA4MDkwXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBzY291bmRyZWxXc3MgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIGNsaWVudFdzcyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSB0ZXN0IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7U3lzdGVtVGVzdH1cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KGFyZ3MgPSB7fSkge1xuICAgIGlmICghZ2xvYmFsQW55LnN5c3RlbVRlc3QpIHtcbiAgICAgIGdsb2JhbEFueS5zeXN0ZW1UZXN0ID0gbmV3IFN5c3RlbVRlc3QoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFsQW55LnN5c3RlbVRlc3QuYXBwbHlBcmdzKGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIGdsb2JhbEFueS5zeXN0ZW1UZXN0XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBtdXRhYmxlIG9wdGlvbnMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIHNpbmdsZXRvbiBTeXN0ZW1UZXN0LlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8U3lzdGVtVGVzdEFyZ3M+fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlBcmdzKGFyZ3MgPSB7fSkge1xuICAgIGlmIChcImRlYnVnXCIgaW4gYXJncykgdGhpcy5fZGVidWcgPSBhcmdzLmRlYnVnID8/IGZhbHNlXG4gICAgaWYgKFwiZXJyb3JGaWx0ZXJcIiBpbiBhcmdzKSB0aGlzLl9lcnJvckZpbHRlciA9IGFyZ3MuZXJyb3JGaWx0ZXJcbiAgICBpZiAoXCJmYWlsT25Ccm93c2VyRXJyb3JcIiBpbiBhcmdzKSB0aGlzLl9mYWlsT25Ccm93c2VyRXJyb3IgPSBhcmdzLmZhaWxPbkJyb3dzZXJFcnJvciA/PyB0cnVlXG4gICAgaWYgKFwiZmFpbE9uQ29uc29sZUVycm9yXCIgaW4gYXJncykgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gYXJncy5mYWlsT25Db25zb2xlRXJyb3IgPz8gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U3lzdGVtVGVzdENvbW11bmljYXRvcn0gKi9cbiAgZ2V0Q29tbXVuaWNhdG9yKCkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBhbiBlcnJvciBtZXNzYWdlIGlmIHBvc3NpYmxlIGZyb20gdGhlIHBheWxvYWQgc2VudCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfSB8IEVycm9yfSBkYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBleHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhXG5cbiAgICBjb25zdCBmaXJzdFZhbHVlID0gQXJyYXkuaXNBcnJheShkYXRhPy52YWx1ZSkgPyBkYXRhLnZhbHVlWzBdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGVvZiBmaXJzdFZhbHVlLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGZpcnN0VmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGJyb3dzZXIgZXJyb3Igc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gYnVpbHQtaW4gcnVsZXMgYW5kIGFuIG9wdGlvbmFsIGVycm9yIGZpbHRlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX19IGRhdGFcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzaG91bGRJZ25vcmVFcnJvcihkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKVxuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MThcIikpIHJldHVybiB0cnVlXG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MTlcIikpIHJldHVybiB0cnVlXG4gICAgICBpZiAoc2hvdWxkSWdub3JlQ2hyb21lUGFzc3dvcmRGaWVsZFdhcm5pbmcobWVzc2FnZSkpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2Vycm9yRmlsdGVyICYmIHRoaXMuX2Vycm9yRmlsdGVyKGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0UnVuQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0UnVuQXJncyB8IGZ1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbYXJnc11cbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2NhbGxiYWNrXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBydW4oYXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXNvbHZlZENhbGxiYWNrID0gdHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IGFyZ3MgOiBjYWxsYmFja1xuICAgIGNvbnN0IHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmUgPSB0cnVlLCAuLi5zeXN0ZW1UZXN0QXJnc30gPSAvKiogQHR5cGUge1N5c3RlbVRlc3RSdW5BcmdzfSAqLyAodHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IHt9IDogYXJncyB8fCB7fSlcbiAgICBjb25zdCBzeXN0ZW1UZXN0ID0gdGhpcy5jdXJyZW50KHN5c3RlbVRlc3RBcmdzKVxuXG4gICAgaWYgKCFyZXNvbHZlZENhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeXN0ZW1UZXN0LnJ1biByZXF1aXJlcyBhIGNhbGxiYWNrXCIpXG4gICAgfVxuXG4gICAgc3lzdGVtVGVzdC5fYnJvd3NlckVycm9ycyA9IFtdXG4gICAgc3lzdGVtVGVzdC5hcHBseUFyZ3Moe2ZhaWxPbkJyb3dzZXJFcnJvcjogdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yOiBmYWxzZSwgLi4uc3lzdGVtVGVzdEFyZ3N9KVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlc2V0dGluZyBicm93c2VyIGNvb2tpZXMgYmVmb3JlIGluaXRpYWxpemVcIilcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmRlbGV0ZUFsbENvb2tpZXMoKVxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJCcm93c2VyIGNvb2tpZXMgY2xlYXJlZFwiKVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcImdldFJvb3RQYXRoXCIpXG4gICAgY29uc3Qgcm9vdFBhdGggPSBzeXN0ZW1UZXN0LmdldFJvb3RQYXRoKClcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYFZpc2l0IHJvb3RQYXRoIHdpdGggZGlzbWlzc1RvOiAke3Jvb3RQYXRofWApXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5kaXNtaXNzVG8ocm9vdFBhdGgpXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgRGlzbWlzc2VkIHRvIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICBpZiAoIXN5c3RlbVRlc3Qud3MgfHwgc3lzdGVtVGVzdC53cy5yZWFkeVN0YXRlICE9PSAxKSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiV2ViU29ja2V0IG5vdCBjb25uZWN0ZWQgYWZ0ZXIgZGlzbWlzc1RvLCB3YWl0aW5nIGZvciByZWNvbm5lY3Rpb25cIilcbiAgICAgIHN5c3RlbVRlc3Qud3MgPSBudWxsXG4gICAgICBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC53YWl0Rm9yQ2xpZW50V2ViU29ja2V0KClcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJDbGllbnQgd2Vic29ja2V0IHJlY29ubmVjdGVkXCIpXG4gICAgfVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBzdGFydGVkIC0gc2VuZCBpbml0aWFsaXplXCIpXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbnRpYWxpemUgdG8gdXNlU3lzdGVtVGVzdCgpIHRpbWVkIG91dFwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJpbml0aWFsaXplXCJ9KVxuICAgIH0pXG5cbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHJ1bkVycm9yID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCB0ZWFyZG93bkVycm9yID0gdW5kZWZpbmVkXG5cbiAgICB0cnkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcImZpbmRCeVRlc3RJRCBibGFua1RleHRcIilcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZmluZEJ5VGVzdElEKFwiYmxhbmtUZXh0XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJGb3VuZCBibGFua1RleHRcIilcblxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcInJlc29sdmVkQ2FsbGJhY2tcIilcbiAgICAgIGF3YWl0IHJlc29sdmVkQ2FsbGJhY2soc3lzdGVtVGVzdClcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gY2FsbGJhY2sgY29tcGxldGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYFJ1biBlcnJvciBjYXVnaHQsIHRha2luZyBzY3JlZW5zaG90OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YClcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QudGFrZVNjcmVlbnNob3QoKVxuXG4gICAgICBydW5FcnJvciA9IGVycm9yXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmluaXNoZWQgLSBzZW5kIHRlYXJkb3duXCIpXG4gICAgICBjb25zdCB0ZWFyZG93bldzID0gc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS53c1xuICAgICAgLy8gV2ViU29ja2V0LkNMT1NJTkcgKDIpIGFuZCBXZWJTb2NrZXQuQ0xPU0VEICgzKSBjYW5ub3QgcmVjb3Zlciwgc28gc2tpcCB0ZWFyZG93bi5cbiAgICAgIC8vIE9QRU4gKDEpIHNlbmRzIGltbWVkaWF0ZWx5LiBDT05ORUNUSU5HICgwKSBxdWV1ZXMgdGhlIGNvbW1hbmQgYW5kIGZsdXNoZXMgb25cbiAgICAgIC8vIG9uT3BlbiDigJQgdGhlIDEwcyB0aW1lb3V0IGJlbG93IGNvdmVycyB0aGUgd2FpdC5cbiAgICAgIGNvbnN0IHdzQ2xvc2VkID0gIXRlYXJkb3duV3MgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAyIHx8IHRlYXJkb3duV3MucmVhZHlTdGF0ZSA9PT0gM1xuXG4gICAgICBpZiAod3NDbG9zZWQpIHtcbiAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlNraXBwaW5nIHRlYXJkb3duIOKAlCBicm93c2VyIHdlYnNvY2tldCBpcyBjbG9zZWQgKGxpa2VseSBieSBuYXZpZ2F0aW9uL3NpZ24tb3V0IGR1cmluZyB0aGUgdGVzdClcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyB0ZWFyZG93biB0byB1c2VTeXN0ZW1UZXN0KCkgdGltZWQgb3V0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcInRlYXJkb3duXCJ9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGVhcmRvd25FcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocnVuRXJyb3IpIHtcbiAgICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCB0ZWFyZG93biBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIHRlYXJkb3duRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHJ1blwiKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCByZWluaXRpYWxpemUgZmFpbGVkIGFmdGVyIHRlc3QgZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBydW5FcnJvclxuICAgIH1cblxuICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICBpZiAocmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlRlYXJkb3duIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHRlYXJkb3duXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVhcmRvd24gZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyB0ZWFyZG93bkVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU3lzdGVtVGVzdCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBbYXJnc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnRXc1BvcnQgPSAxOTg1LCBob3N0ID0gXCJsb2NhbGhvc3RcIiwgcG9ydCA9IDgwODEsIGh0dHBIb3N0ID0gXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQgPSAxOTg0LCBodHRwQ29ubmVjdEhvc3QsIGRlYnVnID0gZmFsc2UsIGVycm9yRmlsdGVyLCBmYWlsT25Ccm93c2VyRXJyb3IgPSB0cnVlLCBmYWlsT25Db25zb2xlRXJyb3IgPSBmYWxzZSwgc2NvdW5kcmVsUG9ydCA9IDgwOTAsIHVybEFyZ3MsIGRyaXZlciwgLi4ucmVzdEFyZ3N9ID0ge2hvc3Q6IFwibG9jYWxob3N0XCIsIHBvcnQ6IDgwODEsIGh0dHBIb3N0OiBcImxvY2FsaG9zdFwiLCBodHRwUG9ydDogMTk4NCwgZGVidWc6IGZhbHNlfSkge1xuICAgIHN1cGVyKHtkZWJ1ZywgZHJpdmVyfSlcblxuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICB0aGlzLl9ob3N0ID0gaG9zdFxuICAgIHRoaXMuX3BvcnQgPSBwb3J0XG4gICAgdGhpcy5fY2xpZW50V3NQb3J0ID0gY2xpZW50V3NQb3J0XG4gICAgdGhpcy5faHR0cEhvc3QgPSBodHRwSG9zdFxuICAgIHRoaXMuX2h0dHBQb3J0ID0gaHR0cFBvcnRcbiAgICB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPSBodHRwQ29ubmVjdEhvc3RcbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZXJyb3JGaWx0ZXIgPSBlcnJvckZpbHRlclxuICAgIHRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvciA9IGZhaWxPbkJyb3dzZXJFcnJvclxuICAgIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGZhaWxPbkNvbnNvbGVFcnJvclxuICAgIHRoaXMuX3Njb3VuZHJlbFBvcnQgPSBzY291bmRyZWxQb3J0XG4gICAgdGhpcy5fdXJsQXJncyA9IHVybEFyZ3NcbiAgICB0aGlzLl9yb290UGF0aCA9IHRoaXMuYnVpbGRSb290UGF0aCgpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVzcG9uc2VzID0ge31cblxuICAgIHRoaXMuX3NlbmRDb3VudCA9IDBcbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBTY291bmRyZWwgc2VydmVyIHdoaWNoIHRoZSBicm93c2VyIGNvbm5lY3RzIHRvIGZvciByZW1vdGUgZXZhbHVhdGlvbiBpbiB0aGUgYnJvd3NlclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXJ0U2NvdW5kcmVsKCkge1xuICAgIGlmICh0aGlzLnNjb3VuZHJlbFdzcykgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWRcIilcblxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogdGhpcy5fc2NvdW5kcmVsUG9ydH0pXG4gICAgdGhpcy5zZXJ2ZXJXZWJTb2NrZXQgPSBuZXcgU2VydmVyV2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3NzKVxuICAgIHRoaXMuc2VydmVyID0gbmV3IFNlcnZlcih0aGlzLnNlcnZlcldlYlNvY2tldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3BTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyPy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTY291bmRyZWwgdG8gc3RvcFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5zZXJ2ZXI+fSAqLyAodGhpcy5zZXJ2ZXIpLmNsb3NlKCkpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xvc2VXZWJTb2NrZXRTZXJ2ZXIodGhpcy5zY291bmRyZWxXc3MsIFwiU2NvdW5kcmVsIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIFNjb3VuZHJlbCBjbGllbnQgKGJyb3dzZXIpIHRvIGNvbm5lY3QgYW5kIHJldHVybnMgaXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dE1zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCIpLmRlZmF1bHQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0U2NvdW5kcmVsQ2xpZW50KHRpbWVvdXRNcyA9IDEwMDAwKSB7XG4gICAgaWYgKCF0aGlzLnNlcnZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBpcyBub3Qgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHdhaXRpbmcgZm9yIGJyb3dzZXIgU2NvdW5kcmVsIGluaXRpYWxpemF0aW9uXCIpXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBpbml0aWFsaXplXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcIndhaXRGb3JTY291bmRyZWxcIn0pXG4gICAgfSlcbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiBicm93c2VyIHJlcG9ydGVkIFNjb3VuZHJlbCBpbml0aWFsaXplZFwiKVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthbnl9IGNsaWVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnN0IGlzT3BlbkNsaWVudCA9IChjbGllbnQpID0+IGNsaWVudD8uYmFja2VuZD8ud3M/LnJlYWR5U3RhdGUgPT09IDFcblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50cyA9IHRoaXMuc2VydmVyLmdldENsaWVudHM/LigpXG4gICAgY29uc3Qgb3BlbkV4aXN0aW5nQ2xpZW50cyA9IGV4aXN0aW5nQ2xpZW50cz8uZmlsdGVyKGlzT3BlbkNsaWVudClcblxuICAgIGlmIChvcGVuRXhpc3RpbmdDbGllbnRzICYmIG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHM/Lmxlbmd0aCA/PyAwfSlgKVxuXG4gICAgaWYgKCF0aGlzLnNlcnZlci5ldmVudHM/Lm9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGV2ZW50cyBhcmUgdW5hdmFpbGFibGVcIilcbiAgICB9XG5cbiAgICAvKiogQHR5cGUgeygoY2xpZW50OiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvbk5ld0NsaWVudFxuICAgIGNvbnN0IGNsZWFudXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmIChvbk5ld0NsaWVudCkge1xuICAgICAgICB0aGlzLnNlcnZlcj8uZXZlbnRzLm9mZihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBTY291bmRyZWwgY2xpZW50XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBvbk5ld0NsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc09wZW5DbGllbnQoY2xpZW50KSkgcmV0dXJuXG4gICAgICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiByZWNlaXZlZCBuZXcgb3BlbiBjbGllbnRcIilcbiAgICAgICAgICByZXNvbHZlKGNsaWVudClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub24oXCJuZXdDbGllbnRcIiwgb25OZXdDbGllbnQpXG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaGFzVGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIGNvbnN0IGlzTmF0aXZlSG9zdCA9IHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCJcblxuICAgIGlmIChpc05hdGl2ZUhvc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IFwibmF0aXZlOi8vXCJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJVc2luZyBuYXRpdmUgYXBwIGhvc3RcIilcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT0gXCJleHBvLWRldi1zZXJ2ZXJcIikge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gYGh0dHA6Ly8ke3RoaXMuX2hvc3R9OiR7dGhpcy5fcG9ydH1gXG4gICAgICB0aGlzLmRlYnVnTG9nKGBVc2luZyBleHBvLWRldi1zZXJ2ZXIgYXQgJHt0aGlzLmN1cnJlbnRVcmx9YClcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT0gXCJkaXN0XCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3RIb3N0ID0gdGhpcy5faHR0cENvbm5lY3RIb3N0ID8/IHRoaXMuX2h0dHBIb3N0XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7Y29ubmVjdEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YFxuXG4gICAgICB0aGlzLmRlYnVnTG9nKGBTcGF3bmluZyBIVFRQIHNlcnZlciBmb3IgZGlzdCBvbiAke3RoaXMuX2h0dHBIb3N0fToke3RoaXMuX2h0dHBQb3J0fWApXG4gICAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gbmV3IFN5c3RlbVRlc3RIdHRwU2VydmVyKHtcbiAgICAgICAgaG9zdDogdGhpcy5faHR0cEhvc3QsXG4gICAgICAgIHBvcnQ6IHRoaXMuX2h0dHBQb3J0LFxuICAgICAgICBkZWJ1ZzogdGhpcy5fZGVidWcsXG4gICAgICAgIG9uRXJyb3I6IHRoaXMub25IdHRwU2VydmVyRXJyb3JcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBIVFRQIHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5zdGFydCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQ2hlY2tpbmcgSFRUUCBzZXJ2ZXIgaGVhbHRoXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLmFzc2VydFJlYWNoYWJsZSh7dGltZW91dE1zOiB0aGlzLmdldFRpbWVvdXRzKCl9KVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkhUVFAgc2VydmVyIHN0YXJ0ZWRcIilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHNldCBTWVNURU1fVEVTVF9IT1NUIHRvICdleHBvLWRldi1zZXJ2ZXInLCAnZGlzdCcsIG9yICduYXRpdmUnXCIpXG4gICAgfVxuXG4gICAgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc2V0QmFzZVVybCh0aGlzLmN1cnJlbnRVcmwpXG5cbiAgICAvLyBTdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBzZXJ2ZXIgYmVmb3JlIHRoZSBkcml2ZXIgZm9yIG5hdGl2ZSBob3N0cyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlSG9zdCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgKGJlZm9yZSBkcml2ZXIgZm9yIG5hdGl2ZSlcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBkcml2ZXJcIilcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zdGFydCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkRyaXZlciBzdGFydGVkXCIpXG5cbiAgICBhd2FpdCB0aGlzLnNldFRpbWVvdXRzKDEwMDAwKVxuICAgIHRoaXMuZGVidWdMb2coXCJUaW1lb3V0cyBzZXQgb24gZHJpdmVyXCIpXG5cbiAgICBpZiAoIWlzTmF0aXZlSG9zdCkge1xuICAgICAgLy8gV2ViIHNvY2tldCBzZXJ2ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBicm93c2VyXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgaWYgKCFpc05hdGl2ZUhvc3QpIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVIb3N0KSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU2V0dGluZyBiYXNlIHNlbGVjdG9yIHRvIGZvY3VzZWQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgdGhpcy5zZXRCYXNlU2VsZWN0b3IoXCJbZGF0YS10ZXN0aWQ9J3N5c3RlbVRlc3RpbmdDb21wb25lbnQnXVtkYXRhLWZvY3Vzc2VkPSd0cnVlJ11cIilcbiAgICAgIHRoaXMuZGVidWdMb2coXCJCYXNlIHNlbGVjdG9yIHNldFwiKVxuICAgIH1cbiAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnQgY29tcGxldGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFJvb3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9yb290UGF0aCA/PyBTeXN0ZW1UZXN0LnJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Um9vdFBhdGgocm9vdFBhdGgpIHtcbiAgICB0aGlzLl9yb290UGF0aCA9IHJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkUm9vdFBhdGgoKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChTeXN0ZW1UZXN0LnJvb3RQYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0Q2xpZW50V3NQb3J0XCIpICYmIHRoaXMuX2NsaWVudFdzUG9ydCAhPT0gMTk4NSkge1xuICAgICAgYXBwZW5kUGFyYW0oXCJzeXN0ZW1UZXN0Q2xpZW50V3NQb3J0XCIsIHRoaXMuX2NsaWVudFdzUG9ydClcbiAgICB9XG5cbiAgICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIikgJiYgdGhpcy5fc2NvdW5kcmVsUG9ydCAhPT0gODA5MCkge1xuICAgICAgYXBwZW5kUGFyYW0oXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiLCB0aGlzLl9zY291bmRyZWxQb3J0KVxuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGNsaWVudCB3ZWIgc29ja2V0IHRvIGNvbm5lY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ2xpZW50V2ViU29ja2V0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAzMDAwMCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9IHdzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsb3NlV2ViU29ja2V0U2VydmVyKHdzcywgbGFiZWwgPSBcIldlYlNvY2tldCBzZXJ2ZXJcIikge1xuICAgIGlmICghd3NzKSByZXR1cm5cblxuICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBjbG9zaW5nICR7bGFiZWx9YH0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZUNsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSB0ZXJtaW5hdGlvbiBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc2V0dGxlID0gKC8qKiBAdHlwZSB7KHZhbHVlOiBhbnkpID0+IHZvaWR9ICovIGNhbGxiYWNrLCAvKiogQHR5cGUge2FueX0gKi8gYXJnKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2FsbGJhY2soYXJnKVxuICAgICAgfVxuXG4gICAgICB3c3Mub25jZShcImNsb3NlXCIsICgpID0+IHNldHRsZShyZXNvbHZlLCB1bmRlZmluZWQpKVxuICAgICAgd3NzLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHNldHRsZShyZWplY3QsIGVycm9yKSlcbiAgICAgIGlmICh3c3MuY2xpZW50cyAmJiB3c3MuY2xpZW50cy5zaXplID4gMCkge1xuICAgICAgICB3c3MuY2xpZW50cy5mb3JFYWNoKHRlcm1pbmF0ZUNsaWVudClcbiAgICAgIH1cbiAgICAgIHdzcy5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSBzZXR0bGUocmVqZWN0LCBlcnJvcilcbiAgICAgICAgZWxzZSBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9KSlcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "system-testing",
3
- "version": "1.0.108",
3
+ "version": "1.0.109",
4
4
  "description": "System testing with Selenium and browsers.",
5
5
  "bin": {
6
6
  "system-testing": "build/cli.js"
@@ -35,7 +35,7 @@
35
35
  "compile": "tsc",
36
36
  "build:apk:dummy": "npm run prepare:dummy && cd spec/dummy && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 npx expo prebuild --platform android --no-install --non-interactive && cd android && SDK_ROOT=${ANDROID_SDK_ROOT:-/usr/lib/android-sdk} && echo \"sdk.dir=$SDK_ROOT\" > local.properties && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 ANDROID_SDK_ROOT=$SDK_ROOT ANDROID_HOME=$SDK_ROOT ANDROID_SDK_HOME=/tmp/android-sdk-home GRADLE_USER_HOME=/tmp/gradle-home ./gradlew --no-daemon --stacktrace assembleRelease",
37
37
  "export:web": "npm run prepare:dummy && npm --prefix spec/dummy run export:web",
38
- "lint": "eslint --max-warnings 0",
38
+ "lint": "npm run eslint && npm run typecheck",
39
39
  "prepublishOnly": "npm run build",
40
40
  "release:patch": "release-patch",
41
41
  "test:appium:android": "(npx appium driver update uiautomator2 || npx appium driver install uiautomator2) && SDK_PATH=$(node -e \"const fs=require('fs'); const path=require('path'); const os=require('os'); const candidates=[process.env.ANDROID_SDK_ROOT, process.env.ANDROID_HOME, path.join(os.homedir(),'Android','Sdk'), path.join(os.homedir(),'Library','Android','sdk'), '/usr/lib/android-sdk', '/usr/local/android-sdk', '/opt/android-sdk', '/opt/android-sdk-linux']; const found=candidates.find((candidate)=>candidate && fs.existsSync(candidate)); if (found) process.stdout.write(found);\") && ANDROID_HOME=${ANDROID_HOME:-$SDK_PATH} ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-$SDK_PATH} node -e \"if (!process.env.ANDROID_HOME && !process.env.ANDROID_SDK_ROOT) { console.error('ANDROID_HOME or ANDROID_SDK_ROOT must be set to run Appium Android tests'); process.exit(1) }\" && ANDROID_HOME=${ANDROID_HOME:-$SDK_PATH} ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-$SDK_PATH} SYSTEM_TEST_HOST=dist SYSTEM_TEST_HTTP_CONNECT_HOST=10.0.2.2 SYSTEM_TEST_DRIVER=appium SYSTEM_TEST_APPIUM_DRIVERS=uiautomator2 SYSTEM_TEST_APPIUM_TEST_ID_STRATEGY=css SYSTEM_TEST_APPIUM_SERVER_ARGS='{\"allowInsecure\":[\"uiautomator2:chromedriver_autodownload\"]}' SYSTEM_TEST_APPIUM_CAPABILITIES='{\"platformName\":\"Android\",\"appium:automationName\":\"UiAutomator2\",\"appium:deviceName\":\"Android Emulator\",\"browserName\":\"Chrome\",\"appium:chromedriverAutodownload\":true}' npm test",
@@ -44,10 +44,11 @@
44
44
  "test:selenium": "SYSTEM_TEST_HOST=dist npm test",
45
45
  "test": "jasmine",
46
46
  "typecheck": "tsc --noEmit",
47
- "watch": "tsc -w"
47
+ "watch": "tsc -w",
48
+ "eslint": "eslint --max-warnings 0"
48
49
  },
49
50
  "dependencies": {
50
- "appium": "3.4.2",
51
+ "appium": "3.5.0",
51
52
  "awaitery": "^1.0.12",
52
53
  "diggerize": "^1.0.9",
53
54
  "eventemitter3": "^5.0.1",
@@ -80,7 +81,7 @@
80
81
  "appium-chromium-driver": "^2.1.6",
81
82
  "appium-uiautomator2-driver": "^7.1.0",
82
83
  "eslint": "^10.1.0",
83
- "eslint-plugin-jsdoc": "^62.7.1",
84
+ "eslint-plugin-jsdoc": "^63.0.2",
84
85
  "expo-router": "^55.0.5",
85
86
  "globals": "^17.0.0",
86
87
  "jasmine": "^6.0.0",