system-testing 1.0.53 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/system-test.d.ts +3 -2
- package/build/system-test.js +51 -28
- package/build/use-system-test.js +2 -2
- package/package.json +14 -6
package/build/system-test.d.ts
CHANGED
|
@@ -308,7 +308,7 @@ export default class SystemTest {
|
|
|
308
308
|
*/
|
|
309
309
|
waitForClientWebSocket(): Promise<void>;
|
|
310
310
|
waitForClientWebSocketPromiseReject: (reason?: any) => void;
|
|
311
|
-
waitForClientWebSocketPromiseResolve: (value:
|
|
311
|
+
waitForClientWebSocketPromiseResolve: (value: any) => void;
|
|
312
312
|
/**
|
|
313
313
|
* Starts the web socket server
|
|
314
314
|
* @returns {void}
|
|
@@ -395,9 +395,10 @@ export default class SystemTest {
|
|
|
395
395
|
dismissTo(path: string): Promise<void>;
|
|
396
396
|
/**
|
|
397
397
|
* @param {WebSocketServer | undefined} wss
|
|
398
|
+
* @param {string} [label]
|
|
398
399
|
* @returns {Promise<void>}
|
|
399
400
|
*/
|
|
400
|
-
closeWebSocketServer(wss: WebSocketServer | undefined): Promise<void>;
|
|
401
|
+
closeWebSocketServer(wss: WebSocketServer | undefined, label?: string): Promise<void>;
|
|
401
402
|
}
|
|
402
403
|
export type SystemTestArgs = {
|
|
403
404
|
/**
|
package/build/system-test.js
CHANGED
|
@@ -11,6 +11,7 @@ import ServerWebSocket from "scoundrel-remote-eval/build/server/connections/web-
|
|
|
11
11
|
import SystemTestCommunicator from "./system-test-communicator.js";
|
|
12
12
|
import SystemTestHttpServer from "./system-test-http-server.js";
|
|
13
13
|
import { wait, waitFor } from "awaitery";
|
|
14
|
+
import timeout from "awaitery/build/timeout.js";
|
|
14
15
|
import { WebSocketServer } from "ws";
|
|
15
16
|
class ElementNotFoundError extends Error {
|
|
16
17
|
}
|
|
@@ -270,8 +271,10 @@ class SystemTest {
|
|
|
270
271
|
* @returns {Promise<void>}
|
|
271
272
|
*/
|
|
272
273
|
async stopScoundrel() {
|
|
273
|
-
|
|
274
|
-
|
|
274
|
+
if (this.server?.close) {
|
|
275
|
+
await timeout({ timeout: this.getTimeouts(), errorMessage: "timeout while waiting for Scoundrel to stop" }, async () => await this.server.close());
|
|
276
|
+
}
|
|
277
|
+
await this.closeWebSocketServer(this.scoundrelWss, "Scoundrel WebSocket server");
|
|
275
278
|
}
|
|
276
279
|
/**
|
|
277
280
|
* Waits for the Scoundrel client (browser) to connect and returns it.
|
|
@@ -289,18 +292,24 @@ class SystemTest {
|
|
|
289
292
|
if (!this.server.events?.on) {
|
|
290
293
|
throw new Error("Scoundrel server events are unavailable");
|
|
291
294
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
this.server?.events.off("newClient", onNewClient);
|
|
296
|
-
resolve(client);
|
|
297
|
-
};
|
|
298
|
-
const timeout = setTimeout(() => {
|
|
295
|
+
let onNewClient;
|
|
296
|
+
const cleanupListener = () => {
|
|
297
|
+
if (onNewClient) {
|
|
299
298
|
this.server?.events.off("newClient", onNewClient);
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
try {
|
|
302
|
+
return await timeout({ timeout: timeoutMs, errorMessage: "Timed out waiting for Scoundrel client" }, async () => await new Promise((resolve) => {
|
|
303
|
+
onNewClient = (client) => {
|
|
304
|
+
cleanupListener();
|
|
305
|
+
resolve(client);
|
|
306
|
+
};
|
|
307
|
+
this.server.events.on("newClient", onNewClient);
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
cleanupListener();
|
|
312
|
+
}
|
|
304
313
|
}
|
|
305
314
|
/**
|
|
306
315
|
* Finds all elements by CSS selector
|
|
@@ -720,6 +729,7 @@ class SystemTest {
|
|
|
720
729
|
// Wait for client to connect
|
|
721
730
|
this.debugLog("Waiting for client WebSocket connection (opening)");
|
|
722
731
|
this.debugLog(`WS state: ${this.ws?.readyState ?? "none"}`);
|
|
732
|
+
this.debugLog("waitForClientWebSocket");
|
|
723
733
|
await this.waitForClientWebSocket();
|
|
724
734
|
this.debugLog("Client WebSocket connected");
|
|
725
735
|
this._started = true;
|
|
@@ -790,14 +800,22 @@ class SystemTest {
|
|
|
790
800
|
* Waits for the client web socket to connect
|
|
791
801
|
* @returns {Promise<void>}
|
|
792
802
|
*/
|
|
793
|
-
waitForClientWebSocket() {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
803
|
+
async waitForClientWebSocket() {
|
|
804
|
+
try {
|
|
805
|
+
await timeout({ timeout: 30000 }, () => new Promise((resolve, reject) => {
|
|
806
|
+
if (this.ws) {
|
|
807
|
+
resolve();
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
this.waitForClientWebSocketPromiseReject = reject;
|
|
811
|
+
this.waitForClientWebSocketPromiseResolve = resolve;
|
|
812
|
+
}));
|
|
813
|
+
}
|
|
814
|
+
catch (error) {
|
|
815
|
+
delete this.waitForClientWebSocketPromiseReject;
|
|
816
|
+
delete this.waitForClientWebSocketPromiseResolve;
|
|
817
|
+
throw error;
|
|
818
|
+
}
|
|
801
819
|
}
|
|
802
820
|
/**
|
|
803
821
|
* Starts the web socket server
|
|
@@ -845,13 +863,17 @@ class SystemTest {
|
|
|
845
863
|
*/
|
|
846
864
|
async stop() {
|
|
847
865
|
await this.stopScoundrel();
|
|
848
|
-
|
|
866
|
+
if (this.systemTestHttpServer?.close) {
|
|
867
|
+
await timeout({ timeout: this.getTimeouts(), errorMessage: "timeout while closing HTTP server" }, async () => await this.systemTestHttpServer.close());
|
|
868
|
+
}
|
|
849
869
|
if (this.ws) {
|
|
850
870
|
this.ws.close();
|
|
851
871
|
this.ws = null;
|
|
852
872
|
}
|
|
853
|
-
await this.closeWebSocketServer(this.clientWss);
|
|
854
|
-
|
|
873
|
+
await this.closeWebSocketServer(this.clientWss, "client WebSocket server");
|
|
874
|
+
if (this.driver?.quit) {
|
|
875
|
+
await timeout({ timeout: this.getTimeouts(), errorMessage: "timeout while quitting WebDriver" }, async () => await this.driver.quit());
|
|
876
|
+
}
|
|
855
877
|
}
|
|
856
878
|
/**
|
|
857
879
|
* Fully tears down and restarts the system test instance.
|
|
@@ -925,12 +947,13 @@ class SystemTest {
|
|
|
925
947
|
}
|
|
926
948
|
/**
|
|
927
949
|
* @param {WebSocketServer | undefined} wss
|
|
950
|
+
* @param {string} [label]
|
|
928
951
|
* @returns {Promise<void>}
|
|
929
952
|
*/
|
|
930
|
-
async closeWebSocketServer(wss) {
|
|
953
|
+
async closeWebSocketServer(wss, label = "WebSocket server") {
|
|
931
954
|
if (!wss)
|
|
932
955
|
return;
|
|
933
|
-
await new Promise((resolve, reject) => {
|
|
956
|
+
await timeout({ timeout: this.getTimeouts(), errorMessage: `timeout while closing ${label}` }, async () => await new Promise((resolve, reject) => {
|
|
934
957
|
let settled = false;
|
|
935
958
|
const terminateClient = (client) => {
|
|
936
959
|
try {
|
|
@@ -957,7 +980,7 @@ class SystemTest {
|
|
|
957
980
|
else
|
|
958
981
|
settle(resolve);
|
|
959
982
|
});
|
|
960
|
-
});
|
|
983
|
+
}));
|
|
961
984
|
}
|
|
962
985
|
}
|
|
963
986
|
/**
|
|
@@ -968,4 +991,4 @@ class SystemTest {
|
|
|
968
991
|
*/
|
|
969
992
|
SystemTest.rootPath = "/blank?systemTest=true";
|
|
970
993
|
export default SystemTest;
|
|
971
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxhQUFhLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUN0RSxPQUFPLE1BQU0sTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sT0FBTyxNQUFNLG1DQUFtQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQy9CLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sc0JBQXNCLE1BQU0sK0JBQStCLENBQUE7QUFDbEUsT0FBTyxvQkFBb0IsTUFBTSw4QkFBOEIsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUN0QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFBO0FBRWxDLE1BQU0sb0JBQXFCLFNBQVEsS0FBSztDQUFJO0FBQzVDLE1BQU0sRUFBQyxjQUFjLEVBQUMsR0FBRyxhQUFhLENBQUE7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBcUIsVUFBVTtJQTJCN0I7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlD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LE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O29CQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEIsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7O0FBcGlDRDs7Ozs7R0FLRztBQUNJLG1CQUFRLEdBQUcsd0JBQXdCLEFBQTNCLENBQTJCO2VBUHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtCdWlsZGVyLCBCeSwgZXJyb3IgYXMgU2VsZW5pdW1FcnJvcn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgY2hyb21lIGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvY2hyb21lLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGxvZ2dpbmcgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvbG9nZ2luZy5qc1wiXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIlxuaW1wb3J0IHtwcmV0dGlmeX0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQgU2VydmVyIGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvc2VydmVyL2luZGV4LmpzXCJcbmltcG9ydCBTZXJ2ZXJXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuaW1wb3J0IFN5c3RlbVRlc3RIdHRwU2VydmVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWh0dHAtc2VydmVyLmpzXCJcbmltcG9ydCB7d2FpdCwgd2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIlxuXG5jbGFzcyBFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY29uc3Qge1dlYkRyaXZlckVycm9yfSA9IFNlbGVuaXVtRXJyb3JcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSBIb3N0bmFtZSBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIFBvcnQgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodHRwSG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h0dHBQb3J0XSBQb3J0IGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IGFueSkgPT4gYm9vbGVhbn0gW2Vycm9yRmlsdGVyXSBGaWx0ZXIgZm9yIGJyb3dzZXIgZXJyb3JzIChyZXR1cm4gZmFsc2UgdG8gaWdub3JlKS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3VybEFyZ3NdIFF1ZXJ5IHBhcmFtcyBhcHBlbmRlZCB0byB0aGUgcm9vdCBwYXRoLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVRlc3Qge1xuICAvKipcbiAgICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gICAqL1xuICBzdGF0aWMgcm9vdFBhdGggPSBcIi9ibGFuaz9zeXN0ZW1UZXN0PXRydWVcIlxuXG4gIC8qKiBAdHlwZSB7U3lzdGVtVGVzdENvbW11bmljYXRvciB8IHVuZGVmaW5lZH0gKi9cbiAgY29tbXVuaWNhdG9yID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyIHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXIgPSB1bmRlZmluZWRcblxuICBfc3RhcnRlZCA9IGZhbHNlXG4gIF9kcml2ZXJUaW1lb3V0cyA9IDUwMDBcbiAgX3RpbWVvdXRzID0gNTAwMFxuICBfaHR0cEhvc3QgPSBcImxvY2FsaG9zdFwiXG4gIF9odHRwUG9ydCA9IDE5ODRcbiAgLyoqIEB0eXBlIHsoZXJyb3I6IGFueSkgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZH0gKi9cbiAgX2Vycm9yRmlsdGVyID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBzY291bmRyZWxXc3MgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIGNsaWVudFdzcyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSB0ZXN0IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7U3lzdGVtVGVzdH1cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KGFyZ3MgPSB7fSkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5zeXN0ZW1UZXN0KSB7XG4gICAgICBnbG9iYWxUaGlzLnN5c3RlbVRlc3QgPSBuZXcgU3lzdGVtVGVzdChhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBnbG9iYWxUaGlzLnN5c3RlbVRlc3RcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U3lzdGVtVGVzdENvbW11bmljYXRvcn0gKi9cbiAgZ2V0Q29tbXVuaWNhdG9yKCkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBhbiBlcnJvciBtZXNzYWdlIGlmIHBvc3NpYmxlIGZyb20gdGhlIHBheWxvYWQgc2VudCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfSB8IEVycm9yfSBkYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBleHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhXG5cbiAgICBjb25zdCBmaXJzdFZhbHVlID0gQXJyYXkuaXNBcnJheShkYXRhPy52YWx1ZSkgPyBkYXRhLnZhbHVlWzBdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGVvZiBmaXJzdFZhbHVlLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGZpcnN0VmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGJyb3dzZXIgZXJyb3Igc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gYnVpbHQtaW4gcnVsZXMgYW5kIGFuIG9wdGlvbmFsIGVycm9yIGZpbHRlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX19IGRhdGFcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzaG91bGRJZ25vcmVFcnJvcihkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKVxuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MThcIikpIHJldHVybiB0cnVlXG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MTlcIikpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2Vycm9yRmlsdGVyICYmIHRoaXMuX2Vycm9yRmlsdGVyKGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJncyB8IGZ1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbYXJnc11cbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2NhbGxiYWNrXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBydW4oYXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXNvbHZlZENhbGxiYWNrID0gdHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IGFyZ3MgOiBjYWxsYmFja1xuICAgIGNvbnN0IHN5c3RlbVRlc3QgPSB0aGlzLmN1cnJlbnQodHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IHt9IDogYXJncylcblxuICAgIGlmICghcmVzb2x2ZWRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3lzdGVtVGVzdC5ydW4gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gc3RhcnRlZFwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiU2VudCBpbml0aWFsaXplIGNvbW1hbmRcIilcbiAgICBjb25zdCByb290UGF0aCA9IHN5c3RlbVRlc3QuZ2V0Um9vdFBhdGgoKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZGlzbWlzc1RvKHJvb3RQYXRoKVxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYERpc21pc3NlZCB0byByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZmluZEJ5VGVzdElEKFwiYmxhbmtUZXh0XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJGb3VuZCBibGFua1RleHRcIilcbiAgICAgIGF3YWl0IHJlc29sdmVkQ2FsbGJhY2soc3lzdGVtVGVzdClcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gY2FsbGJhY2sgY29tcGxldGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZXJyb3IgY2F1Z2h0LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC50YWtlU2NyZWVuc2hvdCgpXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU3lzdGVtVGVzdCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBbYXJnc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtob3N0ID0gXCJsb2NhbGhvc3RcIiwgcG9ydCA9IDgwODEsIGh0dHBIb3N0ID0gXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQgPSAxOTg0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgdXJsQXJncywgLi4ucmVzdEFyZ3N9ID0ge2hvc3Q6IFwibG9jYWxob3N0XCIsIHBvcnQ6IDgwODEsIGh0dHBIb3N0OiBcImxvY2FsaG9zdFwiLCBodHRwUG9ydDogMTk4NCwgZGVidWc6IGZhbHNlfSkge1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICB0aGlzLl9ob3N0ID0gaG9zdFxuICAgIHRoaXMuX3BvcnQgPSBwb3J0XG4gICAgdGhpcy5faHR0cEhvc3QgPSBodHRwSG9zdFxuICAgIHRoaXMuX2h0dHBQb3J0ID0gaHR0cFBvcnRcbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZXJyb3JGaWx0ZXIgPSBlcnJvckZpbHRlclxuICAgIHRoaXMuX3VybEFyZ3MgPSB1cmxBcmdzXG4gICAgdGhpcy5fcm9vdFBhdGggPSB0aGlzLmJ1aWxkUm9vdFBhdGgoKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBvYmplY3Q+fSAqL1xuICAgIHRoaXMuX3Jlc3BvbnNlcyA9IHt9XG5cbiAgICB0aGlzLl9zZW5kQ291bnQgPSAwXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBiYXNlIHNlbGVjdG9yIGZvciBzY29waW5nIGVsZW1lbnQgc2VhcmNoZXNcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGdldEJhc2VTZWxlY3RvcigpIHsgcmV0dXJuIHRoaXMuX2Jhc2VTZWxlY3RvciB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSAqL1xuICBnZXREcml2ZXIoKSB7XG4gICAgaWYgKCF0aGlzKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB0aGlzP1wiKVxuICAgIGlmICghdGhpcy5kcml2ZXIpIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcblxuICAgIHJldHVybiB0aGlzLmRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJhc2Ugc2VsZWN0b3IgZm9yIHNjb3BpbmcgZWxlbWVudCBzZWFyY2hlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVNlbGVjdG9yXG4gICAqL1xuICBzZXRCYXNlU2VsZWN0b3IoYmFzZVNlbGVjdG9yKSB7IHRoaXMuX2Jhc2VTZWxlY3RvciA9IGJhc2VTZWxlY3RvciB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzZWxlY3RvciBzY29wZWQgdG8gdGhlIGJhc2Ugc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmdldEJhc2VTZWxlY3RvcigpID8gYCR7dGhpcy5nZXRCYXNlU2VsZWN0b3IoKX0gJHtzZWxlY3Rvcn1gIDogc2VsZWN0b3JcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIG1lc3NhZ2VzIHdoZW4gZGVidWdnaW5nIGlzIGVuYWJsZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0xvZyhtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1N5c3RlbVRlc3QgZGVidWddICR7bWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgU2NvdW5kcmVsIHNlcnZlciB3aGljaCB0aGUgYnJvd3NlciBjb25uZWN0cyB0byBmb3IgcmVtb3RlIGV2YWx1YXRpb24gaW4gdGhlIGJyb3dzZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zY291bmRyZWxXc3MpIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgYWxyZWFkeSBzdGFydGVkXCIpXG5cbiAgICB0aGlzLnNjb3VuZHJlbFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IDgwOTB9KVxuICAgIHRoaXMuc2VydmVyV2ViU29ja2V0ID0gbmV3IFNlcnZlcldlYlNvY2tldCh0aGlzLnNjb3VuZHJlbFdzcylcbiAgICB0aGlzLnNlcnZlciA9IG5ldyBTZXJ2ZXIodGhpcy5zZXJ2ZXJXZWJTb2NrZXQpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wU2NvdW5kcmVsKCkge1xuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLnNlcnZlcj8uY2xvc2U/LigpKVxuICAgIGF3YWl0IHRoaXMuY2xvc2VXZWJTb2NrZXRTZXJ2ZXIodGhpcy5zY291bmRyZWxXc3MpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBTY291bmRyZWwgY2xpZW50IChicm93c2VyKSB0byBjb25uZWN0IGFuZCByZXR1cm5zIGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRNc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0Pn1cbiAgICovXG4gIGFzeW5jIGdldFNjb3VuZHJlbENsaWVudCh0aW1lb3V0TXMgPSAxMDAwMCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0NsaWVudHMgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzPy4oKVxuXG4gICAgaWYgKGV4aXN0aW5nQ2xpZW50cyAmJiBleGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpZW50c1swXVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zZXJ2ZXIuZXZlbnRzPy5vbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBldmVudHMgYXJlIHVuYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9uTmV3Q2xpZW50ID0gKGNsaWVudCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vZmYoXCJuZXdDbGllbnRcIiwgb25OZXdDbGllbnQpXG4gICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub2ZmKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCBjbGllbnRcIikpXG4gICAgICB9LCB0aW1lb3V0TXMpXG5cbiAgICAgIHRoaXMuc2VydmVyLmV2ZW50cy5vbihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRpbWVvdXRdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudmlzaWJsZV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy51c2VCYXNlU2VsZWN0b3JdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3R1YWxUaW1lb3V0ID09IDApIHtcbiAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgfSwgYWN0dWFsVGltZW91dClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvcjogJHthY3R1YWxTZWxlY3Rvcn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gW11cblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgbGV0IGtlZXAgPSB0cnVlXG5cbiAgICAgIGlmICh2aXNpYmxlID09PSB0cnVlIHx8IHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBrZWVwID0gZmFsc2VcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBrZWVwID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGtlZXApIGFjdGl2ZUVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlRWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldERyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSlcblxuICAgICAgICBhd2FpdCBhY3Rpb25zLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLmNsaWNrKCkucGVyZm9ybSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgd2l0aCB1bi1jb3JydXB0ZWQgc3RhY2sgdHJhY2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZS10aHJvdyB0byByZWNvdmVyIHN0YWNrIHRyYWNlXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiV2FpdCB0aW1lZCBvdXQgYWZ0ZXJcIikpIHtcbiAgICAgICAgICBlbGVtZW50cyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykgeyByZXR1cm4gYXdhaXQgdGhpcy5maW5kKGBbZGF0YS10ZXN0aWQ9JyR7dGVzdElEfSddYCwgYXJncykgfVxuXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIF9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgbGV0IGVsZW1lbnRcblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvciB3aXRob3V0IHdhaXRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJyb3dzZXIgbG9nc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBnZXRCcm93c2VyTG9ncygpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KGxvZ2dpbmcuVHlwZS5CUk9XU0VSKVxuICAgIGNvbnN0IGJyb3dzZXJMb2dzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICBsZXQgbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZU1hdGNoKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2hbNF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlbnRyeS5tZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIGJyb3dzZXJMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBicm93c2VyTG9nc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEN1cnJlbnRVcmwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0Q3VycmVudFVybCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLl90aW1lb3V0cyB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfSBlbGVtZW50T3JJZGVudGlmaWVyIFRoZSBlbGVtZW50IG9yIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbmQgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKVxuXG4gICAgICBpZiAoIWVsZW1lbnRbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50W21ldGhvZE5hbWVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSMke21ldGhvZE5hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRG9udCBjYWxsIHdpdGggY2FuZGlkYXRlLCBiZWNhdXNlIHRoYXQgd2lsbCBiaW5kIHRoZSBmdW5jdGlvbiB3cm9uZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGVsZW1lbnRbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIiB8fFxuICAgICAgICAgICAgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHxcbiAgICAgICAgICAgIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmV0cnkgZmluZGluZyB0aGUgZWxlbWVudCBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICAgICAgaWYgKHRyaWVzID49IDMpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnREZXNjcmlwdGlvblxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYENTUyBzZWxlY3RvciAke2VsZW1lbnRPcklkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdGlvbiA9IGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudERlc2NyaXB0aW9ufSAke21ldGhvZE5hbWV9IGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgd2l0aCB1bi1jb3JydXB0ZWQgc3RhY2sgdHJhY2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudXNlQmFzZVNlbGVjdG9yXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLl93aXRoUmV0aHJvd25FcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS53YWl0KFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3MoYWN0dWFsU2VsZWN0b3IpKVxuXG4gICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm91bmQgYnV0IG5vdCB2aXNpYmxlXG4gICAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCBlbGVtZW50c1swXS5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgICByZXR1cm4gIWlzRGlzcGxheWVkXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfd2l0aFJldGhyb3duRXJyb3JzKGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdlYkRyaXZlckVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG5vdGlmaWNhdGlvbiBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBub3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlVGV4dHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCBvZiBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzLnB1c2godGV4dClcbiAgICB9XG5cbiAgICByZXR1cm4gbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzXG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIGFwcGVhciBhbmQgd2FpdHMgZm9yIGl0IGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vdGlmaWNhdGlvbk1lc3NhZ2UoZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgICBpZiAoIWFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuaW5jbHVkZXMobm90aWZpY2F0aW9uTWVzc2FnZSkpIHtcbiAgICAgICAgICBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLnB1c2gobm90aWZpY2F0aW9uTWVzc2FnZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3RpZmljYXRpb25NZXNzYWdlID09IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZSkge1xuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgPSBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aWZpY2F0aW9uIG1lc3NhZ2UgJHtleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2V9IHdhc24ndCBpbmNsdWRlZCBpbjogJHthbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH0pXG5cbiAgICBpZiAoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpIC8vIERpc21pc3MgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBkaXNtaXNzTm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvck5vU2VsZWN0b3IoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN5c3RlbSB0ZXN0IGhhcyBiZWVuIHN0YXJ0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1N0YXJ0ZWQoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTCBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyBnZXRIVE1MKCkgeyByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRQYWdlU291cmNlKCkgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZXhwby1kZXYtc2VydmVyXCIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHt0aGlzLl9ob3N0fToke3RoaXMuX3BvcnR9YFxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVXNpbmcgZXhwby1kZXYtc2VydmVyIGF0ICR7dGhpcy5jdXJyZW50VXJsfWApXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZGlzdFwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YFxuXG4gICAgICB0aGlzLmRlYnVnTG9nKGBTcGF3bmluZyBIVFRQIHNlcnZlciBmb3IgZGlzdCBvbiAke3RoaXMuX2h0dHBIb3N0fToke3RoaXMuX2h0dHBQb3J0fWApXG4gICAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gbmV3IFN5c3RlbVRlc3RIdHRwU2VydmVyKHtob3N0OiB0aGlzLl9odHRwSG9zdCwgcG9ydDogdGhpcy5faHR0cFBvcnQsIGRlYnVnOiB0aGlzLl9kZWJ1Z30pXG5cbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBIVFRQIHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5zdGFydCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicgb3IgJ2Rpc3QnXCIpXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBjaHJvbWUuT3B0aW9ucygpXG5cbiAgICBvcHRpb25zLmFkZEFyZ3VtZW50cyhcIi0tZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLWRpc2FibGUtZ3B1XCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLWhlYWRsZXNzPW5ld1wiKVxuICAgIG9wdGlvbnMuYWRkQXJndW1lbnRzKFwiLS1uby1zYW5kYm94XCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLXdpbmRvdy1zaXplPTE5MjAsMTA4MFwiKVxuICAgIHRoaXMuZGVidWdMb2coXCJDaHJvbWUgb3B0aW9ucyBjb25maWd1cmVkXCIpXG5cbiAgICB0aGlzLmRyaXZlciA9IG5ldyBCdWlsZGVyKClcbiAgICAgIC5mb3JCcm93c2VyKFwiY2hyb21lXCIpXG4gICAgICAuc2V0Q2hyb21lT3B0aW9ucyhvcHRpb25zKVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgLnNldENhcGFiaWxpdHkoXCJnb29nOmxvZ2dpbmdQcmVmc1wiLCB7YnJvd3NlcjogXCJBTExcIn0pXG4gICAgICAuYnVpbGQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJXZWJEcml2ZXIgYnVpbHRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBXZWJTb2NrZXQgc2VydmVyXCIpXG4gICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuXG4gICAgLy8gVmlzaXQgdGhlIHJvb3QgcGFnZSBhbmQgd2FpdCBmb3IgRXhwbyB0byBiZSBsb2FkZWQgYW5kIHRoZSBhcHAgdG8gYXBwZWFyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5nZXRSb290UGF0aCgpXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChyb290UGF0aClcbiAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAvL2NvbnNvbGUubG9nKFwiV0FJVElOR1wiKVxuICAgIC8vYXdhaXQgd2FpdCgxODAwMDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dmlzaWJsZTogbnVsbCwgdXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDB9KVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgYW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGNsaWVudCB0byBjb25uZWN0XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldhaXRpbmcgZm9yIGNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGlvbiAob3BlbmluZylcIilcbiAgICB0aGlzLmRlYnVnTG9nKGBXUyBzdGF0ZTogJHt0aGlzLndzPy5yZWFkeVN0YXRlID8/IFwibm9uZVwifWApXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0KClcbiAgICB0aGlzLmRlYnVnTG9nKFwiQ2xpZW50IFdlYlNvY2tldCBjb25uZWN0ZWRcIilcblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlXG4gICAgdGhpcy5zZXRCYXNlU2VsZWN0b3IoXCJbZGF0YS10ZXN0aWQ9J3N5c3RlbVRlc3RpbmdDb21wb25lbnQnXVtkYXRhLWZvY3Vzc2VkPSd0cnVlJ11cIilcbiAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnQgY29tcGxldGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFJvb3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9yb290UGF0aCA/PyBTeXN0ZW1UZXN0LnJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkUm9vdFBhdGgoKSB7XG4gICAgaWYgKCF0aGlzLl91cmxBcmdzKSByZXR1cm4gU3lzdGVtVGVzdC5yb290UGF0aFxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChTeXN0ZW1UZXN0LnJvb3RQYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuX3VybEFyZ3MpIHtcbiAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fdXJsQXJncykpIHtcbiAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgYnVpbGRSb290UGF0aCByb290UGF0aDogJHtyb290UGF0aH1gKVxuXG4gICAgcmV0dXJuIHJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgcHJldmlvdXNseSBzZXQgdGltZW91dHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXN0b3JlVGltZW91dHMoKSB7XG4gICAgaWYgKCF0aGlzLmdldFRpbWVvdXRzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRpbWVvdXRzIGhhdmVuJ3QgcHJldmlvdXNseSBiZWVuIHNldFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZHJpdmVyU2V0VGltZW91dHModGhpcy5nZXRUaW1lb3V0cygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZHJpdmVyIHRpbWVvdXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBuZXdUaW1lb3V0fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRpbWVvdXRzIGFuZCBzdG9yZXMgdGhlIHByZXZpb3VzIHRpbWVvdXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX3RpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGNsaWVudCB3ZWIgc29ja2V0IHRvIGNvbm5lY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICB3YWl0Rm9yQ2xpZW50V2ViU29ja2V0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy53cykge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHJlamVjdFxuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHdlYiBzb2NrZXQgc2VydmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKSB7XG4gICAgdGhpcy5jbGllbnRXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiAxOTg1fSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0KSB7XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG9uIGNvbW1hbmQgY2FsbGJhY2tcbiAgICogQHBhcmFtIHtmdW5jdGlvbih7dHlwZTogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Db21tYW5kKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db21tYW5kQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBjb21tYW5kIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIHt7ZGF0YToge21lc3NhZ2U6IHN0cmluZywgYmFja3RyYWNlOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgdmFsdWU6IGFueVtdfX19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIG9uQ29tbWFuZFJlY2VpdmVkID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBkYXRhLnR5cGVcbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAodHlwZSA9PSBcImNvbnNvbGUuZXJyb3JcIikge1xuICAgICAgY29uc3Qgc2hvd01lc3NhZ2UgPSAhdGhpcy5zaG91bGRJZ25vcmVFcnJvcihkYXRhKVxuXG4gICAgICBpZiAoc2hvd01lc3NhZ2UpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkJyb3dzZXIgZXJyb3JcIiwgLi4uZGF0YS52YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJjb25zb2xlLmxvZ1wiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nXCIsIC4uLmRhdGEudmFsdWUpXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiZXJyb3JcIiB8fCBkYXRhLnR5cGUgPT0gXCJ1bmhhbmRsZWRyZWplY3Rpb25cIikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihkYXRhKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fb25Db21tYW5kQ2FsbGJhY2spIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKHtkYXRhLCB0eXBlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgb25XZWJTb2NrZXRDbGllbnRNZXNzYWdlIHVua25vd24gZGF0YSAodHlwZSAke3R5cGV9KWAsIGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBuZXcgd2ViIHNvY2tldCBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0fSB3c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIG9uV2ViU29ja2V0Q29ubmVjdGlvbiA9IGFzeW5jICh3cykgPT4ge1xuICAgIHRoaXMud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkub25PcGVuKClcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLndzLm9uKFwiZXJyb3JcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uRXJyb3JcIikpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcIm1lc3NhZ2VcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uTWVzc2FnZVwiKSlcblxuICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUoKVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25XZWJTb2NrZXRDbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSBudWxsXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChuZXcgRXJyb3IoXCJDbGllbnQgd2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgY29ubmVjdGluZ1wiKSlcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLm1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmJhY2t0cmFjZV1cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEJyb3dzZXIgZXJyb3I6ICR7ZGF0YS5tZXNzYWdlfWApXG5cbiAgICBpZiAoZGF0YS5iYWNrdHJhY2UpIHtcbiAgICAgIGVycm9yLnN0YWNrID0gYCR7ZXJyb3IubWVzc2FnZX1cXG4ke2RhdGEuYmFja3RyYWNlfVxcblxcbiR7ZXJyb3Iuc3RhY2t9YFxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3BTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXI/LmNsb3NlKClcbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy53cy5jbG9zZSgpXG4gICAgICB0aGlzLndzID0gbnVsbFxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlV2ViU29ja2V0U2VydmVyKHRoaXMuY2xpZW50V3NzKVxuICAgIGF3YWl0IHRoaXMuZHJpdmVyPy5xdWl0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB0ZWFycyBkb3duIGFuZCByZXN0YXJ0cyB0aGUgc3lzdGVtIHRlc3QgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVpbml0aWFsaXplKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9iYXNlU2VsZWN0b3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLmN1cnJlbnRVcmwgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5jbGllbnRXc3MgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNjb3VuZHJlbFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXJXZWJTb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggaW4gdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5jdXJyZW50VXJsfSR7cGF0aH1gXG5cbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldCh1cmwpXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzY3JlZW5zaG90LCBzYXZlcyBIVE1MIGFuZCBicm93c2VyIGxvZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB0YWtlU2NyZWVuc2hvdCgpIHtcbiAgICBjb25zdCBwYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vdG1wL3NjcmVlbnNob3RzYFxuXG4gICAgYXdhaXQgZnMubWtkaXIocGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgICBjb25zdCBpbWFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnRha2VTY3JlZW5zaG90KClcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBgJHtwYXRofS8ke21vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tREQtSEgtTU0tU1NcIil9LnBuZ2BcbiAgICBjb25zdCBodG1sUGF0aCA9IGAke3BhdGh9LyR7bW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKX0uaHRtbGBcbiAgICBjb25zdCBsb2dzUGF0aCA9IGAke3BhdGh9LyR7bW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKX0ubG9ncy50eHRgXG4gICAgY29uc3QgbG9nc1RleHQgPSBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKClcbiAgICBjb25zdCBodG1sID0gYXdhaXQgdGhpcy5nZXRIVE1MKClcbiAgICBjb25zdCBodG1sUHJldHR5ID0gcHJldHRpZnkoaHRtbClcblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShodG1sUGF0aCwgaHRtbFByZXR0eSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9nc1BhdGgsIGxvZ3NUZXh0LmpvaW4oXCJcXG5cIikpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHNjcmVlbnNob3RQYXRoLCBpbWFnZUNvbnRlbnQsIFwiYmFzZTY0XCIpXG5cbiAgICBjb25zb2xlLmxvZyhcIkN1cnJlbnQgVVJMOlwiLCBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKSlcbiAgICBjb25zb2xlLmxvZyhcIkxvZ3M6XCIsIGxvZ3NQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiU2NyZWVuc2hvdDpcIiwgc2NyZWVuc2hvdFBhdGgpXG4gICAgY29uc29sZS5sb2coXCJIVE1MOlwiLCBodG1sUGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBwYXRoIGluIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXQocGF0aCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwidmlzaXRcIiwgcGF0aH0pXG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRvIGEgcGF0aCBpbiB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRpc21pc3NUbyhwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJkaXNtaXNzVG9cIiwgcGF0aH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9IHdzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsb3NlV2ViU29ja2V0U2VydmVyKHdzcykge1xuICAgIGlmICghd3NzKSByZXR1cm5cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZUNsaWVudCA9IChjbGllbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbGllbnQudGVybWluYXRlKClcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIHRlcm1pbmF0aW9uIGVycm9yc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzZXR0bGUgPSAoY2FsbGJhY2ssIGFyZykgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKGFyZylcbiAgICAgIH1cblxuICAgICAgd3NzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBzZXR0bGUocmVzb2x2ZSkpXG4gICAgICB3c3Mub25jZShcImVycm9yXCIsIChlcnJvcikgPT4gc2V0dGxlKHJlamVjdCwgZXJyb3IpKVxuICAgICAgaWYgKHdzcy5jbGllbnRzICYmIHdzcy5jbGllbnRzLnNpemUgPiAwKSB7XG4gICAgICAgIHdzcy5jbGllbnRzLmZvckVhY2godGVybWluYXRlQ2xpZW50KVxuICAgICAgfVxuICAgICAgd3NzLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHNldHRsZShyZWplY3QsIGVycm9yKVxuICAgICAgICBlbHNlIHNldHRsZShyZXNvbHZlKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG4iXX0=
|
|
994
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxhQUFhLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUN0RSxPQUFPLE1BQU0sTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sT0FBTyxNQUFNLG1DQUFtQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQy9CLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sc0JBQXNCLE1BQU0sK0JBQStCLENBQUE7QUFDbEUsT0FBTyxvQkFBb0IsTUFBTSw4QkFBOEIsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUN0QyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFBO0FBRWxDLE1BQU0sb0JBQXFCLFNBQVEsS0FBSztDQUFJO0FBQzVDLE1BQU0sRUFBQyxjQUFjLEVBQUMsR0FBRyxhQUFhLENBQUE7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBcUIsVUFBVTtJQTJCN0I7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixVQUFVLENBQUMsVUFBVSxHQUFHLElB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QUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ25ELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O29CQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEIsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUF4akNEOzs7OztHQUtHO0FBQ0ksbUJBQVEsR0FBRyx3QkFBd0IsQUFBM0IsQ0FBMkI7ZUFQdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge0J1aWxkZXIsIEJ5LCBlcnJvciBhcyBTZWxlbml1bUVycm9yfSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCBjaHJvbWUgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9jaHJvbWUuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgbG9nZ2luZyBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyL2xpYi9sb2dnaW5nLmpzXCJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiXG5pbXBvcnQge3ByZXR0aWZ5fSBmcm9tIFwiaHRtbGZ5XCJcbmltcG9ydCBTZXJ2ZXIgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvaW5kZXguanNcIlxuaW1wb3J0IFNlcnZlcldlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIGZyb20gXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtaHR0cC1zZXJ2ZXIuanNcIlxuaW1wb3J0IHt3YWl0LCB3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5cbmNsYXNzIEVsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3IgeyB9XG5jb25zdCB7V2ViRHJpdmVyRXJyb3J9ID0gU2VsZW5pdW1FcnJvclxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3RBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIEhvc3RuYW1lIGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gUG9ydCBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBIb3N0XSBIb3N0bmFtZSBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHR0cFBvcnRdIFBvcnQgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogYW55KSA9PiBib29sZWFufSBbZXJyb3JGaWx0ZXJdIEZpbHRlciBmb3IgYnJvd3NlciBlcnJvcnMgKHJldHVybiBmYWxzZSB0byBpZ25vcmUpLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbdXJsQXJnc10gUXVlcnkgcGFyYW1zIGFwcGVuZGVkIHRvIHRoZSByb290IHBhdGguXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdCB7XG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAgICovXG4gIHN0YXRpYyByb290UGF0aCA9IFwiL2JsYW5rP3N5c3RlbVRlc3Q9dHJ1ZVwiXG5cbiAgLyoqIEB0eXBlIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIHwgdW5kZWZpbmVkfSAqL1xuICBjb21tdW5pY2F0b3IgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXIgfCB1bmRlZmluZWR9ICovXG4gIGRyaXZlciA9IHVuZGVmaW5lZFxuXG4gIF9zdGFydGVkID0gZmFsc2VcbiAgX2RyaXZlclRpbWVvdXRzID0gNTAwMFxuICBfdGltZW91dHMgPSA1MDAwXG4gIF9odHRwSG9zdCA9IFwibG9jYWxob3N0XCJcbiAgX2h0dHBQb3J0ID0gMTk4NFxuICAvKiogQHR5cGUgeyhlcnJvcjogYW55KSA9PiBib29sZWFuIHwgdW5kZWZpbmVkfSAqL1xuICBfZXJyb3JGaWx0ZXIgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIHNjb3VuZHJlbFdzcyA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgY2xpZW50V3NzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtTeXN0ZW1UZXN0fVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoYXJncyA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxUaGlzLnN5c3RlbVRlc3QpIHtcbiAgICAgIGdsb2JhbFRoaXMuc3lzdGVtVGVzdCA9IG5ldyBTeXN0ZW1UZXN0KGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuc3lzdGVtVGVzdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yfSAqL1xuICBnZXRDb21tdW5pY2F0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbW11bmljYXRvclxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcG9zc2libGUgZnJvbSB0aGUgcGF5bG9hZCBzZW50IGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119IHwgRXJyb3J9IGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlKSA/IGRhdGEudmFsdWVbMF0gOiB1bmRlZmluZWRcblxuICAgIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGZpcnN0VmFsdWUubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWUubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWVcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYnJvd3NlciBlcnJvciBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBidWlsdC1pbiBydWxlcyBhbmQgYW4gb3B0aW9uYWwgZXJyb3IgZmlsdGVyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfX0gZGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNob3VsZElnbm9yZUVycm9yKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5leHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpXG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOFwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOVwiKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXJyb3JGaWx0ZXIgJiYgdGhpcy5fZXJyb3JGaWx0ZXIoZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzIHwgZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFthcmdzXVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbY2FsbGJhY2tdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihhcmdzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlc29sdmVkQ2FsbGJhY2sgPSB0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8gYXJncyA6IGNhbGxiYWNrXG4gICAgY29uc3Qgc3lzdGVtVGVzdCA9IHRoaXMuY3VycmVudCh0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8ge30gOiBhcmdzKVxuXG4gICAgaWYgKCFyZXNvbHZlZENhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeXN0ZW1UZXN0LnJ1biByZXF1aXJlcyBhIGNhbGxiYWNrXCIpXG4gICAgfVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBzdGFydGVkXCIpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJpbml0aWFsaXplXCJ9KVxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJTZW50IGluaXRpYWxpemUgY29tbWFuZFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gc3lzdGVtVGVzdC5nZXRSb290UGF0aCgpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5kaXNtaXNzVG8ocm9vdFBhdGgpXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgRGlzbWlzc2VkIHRvIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3lzdGVtVGVzdC5maW5kQnlUZXN0SUQoXCJibGFua1RleHRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkZvdW5kIGJsYW5rVGV4dFwiKVxuICAgICAgYXdhaXQgcmVzb2x2ZWRDYWxsYmFjayhzeXN0ZW1UZXN0KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBjYWxsYmFjayBjb21wbGV0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBlcnJvciBjYXVnaHQsIHRha2luZyBzY3JlZW5zaG90XCIpXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LnRha2VTY3JlZW5zaG90KClcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTeXN0ZW1UZXN0IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdEFyZ3N9IFthcmdzXVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2hvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gODA4MSwgaHR0cEhvc3QgPSBcImxvY2FsaG9zdFwiLCBodHRwUG9ydCA9IDE5ODQsIGRlYnVnID0gZmFsc2UsIGVycm9yRmlsdGVyLCB1cmxBcmdzLCAuLi5yZXN0QXJnc30gPSB7aG9zdDogXCJsb2NhbGhvc3RcIiwgcG9ydDogODA4MSwgaHR0cEhvc3Q6IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0OiAxOTg0LCBkZWJ1ZzogZmFsc2V9KSB7XG4gICAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2hvc3QgPSBob3N0XG4gICAgdGhpcy5fcG9ydCA9IHBvcnRcbiAgICB0aGlzLl9odHRwSG9zdCA9IGh0dHBIb3N0XG4gICAgdGhpcy5faHR0cFBvcnQgPSBodHRwUG9ydFxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9lcnJvckZpbHRlciA9IGVycm9yRmlsdGVyXG4gICAgdGhpcy5fdXJsQXJncyA9IHVybEFyZ3NcbiAgICB0aGlzLl9yb290UGF0aCA9IHRoaXMuYnVpbGRSb290UGF0aCgpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVzcG9uc2VzID0ge31cblxuICAgIHRoaXMuX3NlbmRDb3VudCA9IDBcbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJhc2Ugc2VsZWN0b3IgZm9yIHNjb3BpbmcgZWxlbWVudCBzZWFyY2hlc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZ2V0QmFzZVNlbGVjdG9yKCkgeyByZXR1cm4gdGhpcy5fYmFzZVNlbGVjdG9yIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9ICovXG4gIGdldERyaXZlcigpIHtcbiAgICBpZiAoIXRoaXMpIHRocm93IG5ldyBFcnJvcihcIk5vIHRoaXM/XCIpXG4gICAgaWYgKCF0aGlzLmRyaXZlcikgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuZHJpdmVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYmFzZSBzZWxlY3RvciBmb3Igc2NvcGluZyBlbGVtZW50IHNlYXJjaGVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU2VsZWN0b3JcbiAgICovXG4gIHNldEJhc2VTZWxlY3RvcihiYXNlU2VsZWN0b3IpIHsgdGhpcy5fYmFzZVNlbGVjdG9yID0gYmFzZVNlbGVjdG9yIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNlbGVjdG9yIHNjb3BlZCB0byB0aGUgYmFzZSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVNlbGVjdG9yKCkgPyBgJHt0aGlzLmdldEJhc2VTZWxlY3RvcigpfSAke3NlbGVjdG9yfWAgOiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgbWVzc2FnZXMgd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRlYnVnTG9nKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbU3lzdGVtVGVzdCBkZWJ1Z10gJHttZXNzYWdlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBTY291bmRyZWwgc2VydmVyIHdoaWNoIHRoZSBicm93c2VyIGNvbm5lY3RzIHRvIGZvciByZW1vdGUgZXZhbHVhdGlvbiBpbiB0aGUgYnJvd3NlclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXJ0U2NvdW5kcmVsKCkge1xuICAgIGlmICh0aGlzLnNjb3VuZHJlbFdzcykgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWRcIilcblxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogODA5MH0pXG4gICAgdGhpcy5zZXJ2ZXJXZWJTb2NrZXQgPSBuZXcgU2VydmVyV2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3NzKVxuICAgIHRoaXMuc2VydmVyID0gbmV3IFNlcnZlcih0aGlzLnNlcnZlcldlYlNvY2tldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3BTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyPy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTY291bmRyZWwgdG8gc3RvcFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5zZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLnNjb3VuZHJlbFdzcywgXCJTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgU2NvdW5kcmVsIGNsaWVudCAoYnJvd3NlcikgdG8gY29ubmVjdCBhbmQgcmV0dXJucyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0TXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBhc3luYyBnZXRTY291bmRyZWxDbGllbnQodGltZW91dE1zID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGlzIG5vdCBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRzID0gdGhpcy5zZXJ2ZXIuZ2V0Q2xpZW50cz8uKClcblxuICAgIGlmIChleGlzdGluZ0NsaWVudHMgJiYgZXhpc3RpbmdDbGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0NsaWVudHNbMF1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VydmVyLmV2ZW50cz8ub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgZXZlbnRzIGFyZSB1bmF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIGxldCBvbk5ld0NsaWVudFxuICAgIGNvbnN0IGNsZWFudXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmIChvbk5ld0NsaWVudCkge1xuICAgICAgICB0aGlzLnNlcnZlcj8uZXZlbnRzLm9mZihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBTY291bmRyZWwgY2xpZW50XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBvbk5ld0NsaWVudCA9IChjbGllbnQpID0+IHtcbiAgICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZXZlbnRzLm9uKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfSkpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFudXBMaXN0ZW5lcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRpbWVvdXRdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudmlzaWJsZV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy51c2VCYXNlU2VsZWN0b3JdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3R1YWxUaW1lb3V0ID09IDApIHtcbiAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgfSwgYWN0dWFsVGltZW91dClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvcjogJHthY3R1YWxTZWxlY3Rvcn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gW11cblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgbGV0IGtlZXAgPSB0cnVlXG5cbiAgICAgIGlmICh2aXNpYmxlID09PSB0cnVlIHx8IHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBrZWVwID0gZmFsc2VcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBrZWVwID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgaWYgKGtlZXApIGFjdGl2ZUVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlRWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldERyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSlcblxuICAgICAgICBhd2FpdCBhY3Rpb25zLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLmNsaWNrKCkucGVyZm9ybSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgd2l0aCB1bi1jb3JydXB0ZWQgc3RhY2sgdHJhY2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZS10aHJvdyB0byByZWNvdmVyIHN0YWNrIHRyYWNlXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiV2FpdCB0aW1lZCBvdXQgYWZ0ZXJcIikpIHtcbiAgICAgICAgICBlbGVtZW50cyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykgeyByZXR1cm4gYXdhaXQgdGhpcy5maW5kKGBbZGF0YS10ZXN0aWQ9JyR7dGVzdElEfSddYCwgYXJncykgfVxuXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIF9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgbGV0IGVsZW1lbnRcblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvciB3aXRob3V0IHdhaXRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJyb3dzZXIgbG9nc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBnZXRCcm93c2VyTG9ncygpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KGxvZ2dpbmcuVHlwZS5CUk9XU0VSKVxuICAgIGNvbnN0IGJyb3dzZXJMb2dzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICBsZXQgbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZU1hdGNoKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2hbNF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlbnRyeS5tZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIGJyb3dzZXJMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBicm93c2VyTG9nc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEN1cnJlbnRVcmwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0Q3VycmVudFVybCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLl90aW1lb3V0cyB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfSBlbGVtZW50T3JJZGVudGlmaWVyIFRoZSBlbGVtZW50IG9yIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbmQgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKVxuXG4gICAgICBpZiAoIWVsZW1lbnRbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50W21ldGhvZE5hbWVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSMke21ldGhvZE5hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRG9udCBjYWxsIHdpdGggY2FuZGlkYXRlLCBiZWNhdXNlIHRoYXQgd2lsbCBiaW5kIHRoZSBmdW5jdGlvbiB3cm9uZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGVsZW1lbnRbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIiB8fFxuICAgICAgICAgICAgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHxcbiAgICAgICAgICAgIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmV0cnkgZmluZGluZyB0aGUgZWxlbWVudCBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICAgICAgaWYgKHRyaWVzID49IDMpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnREZXNjcmlwdGlvblxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYENTUyBzZWxlY3RvciAke2VsZW1lbnRPcklkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdGlvbiA9IGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudERlc2NyaXB0aW9ufSAke21ldGhvZE5hbWV9IGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgd2l0aCB1bi1jb3JydXB0ZWQgc3RhY2sgdHJhY2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MudXNlQmFzZVNlbGVjdG9yXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLl93aXRoUmV0aHJvd25FcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS53YWl0KFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3MoYWN0dWFsU2VsZWN0b3IpKVxuXG4gICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm91bmQgYnV0IG5vdCB2aXNpYmxlXG4gICAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCBlbGVtZW50c1swXS5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgICByZXR1cm4gIWlzRGlzcGxheWVkXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfd2l0aFJldGhyb3duRXJyb3JzKGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdlYkRyaXZlckVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG5vdGlmaWNhdGlvbiBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBub3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlVGV4dHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCBvZiBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzLnB1c2godGV4dClcbiAgICB9XG5cbiAgICByZXR1cm4gbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzXG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIGFwcGVhciBhbmQgd2FpdHMgZm9yIGl0IGlmIG5lY2Vzc2FyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vdGlmaWNhdGlvbk1lc3NhZ2UoZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgICBpZiAoIWFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuaW5jbHVkZXMobm90aWZpY2F0aW9uTWVzc2FnZSkpIHtcbiAgICAgICAgICBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLnB1c2gobm90aWZpY2F0aW9uTWVzc2FnZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3RpZmljYXRpb25NZXNzYWdlID09IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZSkge1xuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgPSBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aWZpY2F0aW9uIG1lc3NhZ2UgJHtleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2V9IHdhc24ndCBpbmNsdWRlZCBpbjogJHthbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH0pXG5cbiAgICBpZiAoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpIC8vIERpc21pc3MgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBkaXNtaXNzTm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvck5vU2VsZWN0b3IoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN5c3RlbSB0ZXN0IGhhcyBiZWVuIHN0YXJ0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1N0YXJ0ZWQoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTCBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyBnZXRIVE1MKCkgeyByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRQYWdlU291cmNlKCkgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZXhwby1kZXYtc2VydmVyXCIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHt0aGlzLl9ob3N0fToke3RoaXMuX3BvcnR9YFxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVXNpbmcgZXhwby1kZXYtc2VydmVyIGF0ICR7dGhpcy5jdXJyZW50VXJsfWApXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZGlzdFwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YFxuXG4gICAgICB0aGlzLmRlYnVnTG9nKGBTcGF3bmluZyBIVFRQIHNlcnZlciBmb3IgZGlzdCBvbiAke3RoaXMuX2h0dHBIb3N0fToke3RoaXMuX2h0dHBQb3J0fWApXG4gICAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gbmV3IFN5c3RlbVRlc3RIdHRwU2VydmVyKHtob3N0OiB0aGlzLl9odHRwSG9zdCwgcG9ydDogdGhpcy5faHR0cFBvcnQsIGRlYnVnOiB0aGlzLl9kZWJ1Z30pXG5cbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBIVFRQIHNlcnZlclwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5zdGFydCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicgb3IgJ2Rpc3QnXCIpXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBjaHJvbWUuT3B0aW9ucygpXG5cbiAgICBvcHRpb25zLmFkZEFyZ3VtZW50cyhcIi0tZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLWRpc2FibGUtZ3B1XCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLWhlYWRsZXNzPW5ld1wiKVxuICAgIG9wdGlvbnMuYWRkQXJndW1lbnRzKFwiLS1uby1zYW5kYm94XCIpXG4gICAgb3B0aW9ucy5hZGRBcmd1bWVudHMoXCItLXdpbmRvdy1zaXplPTE5MjAsMTA4MFwiKVxuICAgIHRoaXMuZGVidWdMb2coXCJDaHJvbWUgb3B0aW9ucyBjb25maWd1cmVkXCIpXG5cbiAgICB0aGlzLmRyaXZlciA9IG5ldyBCdWlsZGVyKClcbiAgICAgIC5mb3JCcm93c2VyKFwiY2hyb21lXCIpXG4gICAgICAuc2V0Q2hyb21lT3B0aW9ucyhvcHRpb25zKVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgLnNldENhcGFiaWxpdHkoXCJnb29nOmxvZ2dpbmdQcmVmc1wiLCB7YnJvd3NlcjogXCJBTExcIn0pXG4gICAgICAuYnVpbGQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJXZWJEcml2ZXIgYnVpbHRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBXZWJTb2NrZXQgc2VydmVyXCIpXG4gICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuXG4gICAgLy8gVmlzaXQgdGhlIHJvb3QgcGFnZSBhbmQgd2FpdCBmb3IgRXhwbyB0byBiZSBsb2FkZWQgYW5kIHRoZSBhcHAgdG8gYXBwZWFyXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5nZXRSb290UGF0aCgpXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChyb290UGF0aClcbiAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAvL2NvbnNvbGUubG9nKFwiV0FJVElOR1wiKVxuICAgIC8vYXdhaXQgd2FpdCgxODAwMDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dmlzaWJsZTogbnVsbCwgdXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDB9KVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgYW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGNsaWVudCB0byBjb25uZWN0XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldhaXRpbmcgZm9yIGNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGlvbiAob3BlbmluZylcIilcbiAgICB0aGlzLmRlYnVnTG9nKGBXUyBzdGF0ZTogJHt0aGlzLndzPy5yZWFkeVN0YXRlID8/IFwibm9uZVwifWApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIndhaXRGb3JDbGllbnRXZWJTb2NrZXRcIilcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJDbGllbnQgV2ViU29ja2V0IGNvbm5lY3RlZFwiKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcbiAgICB0aGlzLnNldEJhc2VTZWxlY3RvcihcIltkYXRhLXRlc3RpZD0nc3lzdGVtVGVzdGluZ0NvbXBvbmVudCddW2RhdGEtZm9jdXNzZWQ9J3RydWUnXVwiKVxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjb21wbGV0ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Um9vdFBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3RQYXRoID8/IFN5c3RlbVRlc3Qucm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRSb290UGF0aCgpIHtcbiAgICBpZiAoIXRoaXMuX3VybEFyZ3MpIHJldHVybiBTeXN0ZW1UZXN0LnJvb3RQYXRoXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKFN5c3RlbVRlc3Qucm9vdFBhdGgsIFwiaHR0cDovL2xvY2FsaG9zdFwiKVxuICAgIGNvbnN0IGFwcGVuZFBhcmFtID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncyBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICBhcHBlbmRQYXJhbShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl91cmxBcmdzKSkge1xuICAgICAgICBhcHBlbmRQYXJhbShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQYXRoID0gIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBwcmV2aW91c2x5IHNldCB0aW1lb3V0c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBpZiAoIXRoaXMuZ2V0VGltZW91dHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGltZW91dHMgaGF2ZW4ndCBwcmV2aW91c2x5IGJlZW4gc2V0XCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cyh0aGlzLmdldFRpbWVvdXRzKCkpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBkcml2ZXIgdGltZW91dHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fZHJpdmVyVGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cyh7aW1wbGljaXQ6IG5ld1RpbWVvdXR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGltZW91dHMgYW5kIHN0b3JlcyB0aGUgcHJldmlvdXMgdGltZW91dHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fdGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgY2xpZW50IHdlYiBzb2NrZXQgdG8gY29ubmVjdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDbGllbnRXZWJTb2NrZXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDMwMDAwfSwgKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAodGhpcy53cykge1xuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHJlamVjdFxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIH0pKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHdlYiBzb2NrZXQgc2VydmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKSB7XG4gICAgdGhpcy5jbGllbnRXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiAxOTg1fSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0KSB7XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG9uIGNvbW1hbmQgY2FsbGJhY2tcbiAgICogQHBhcmFtIHtmdW5jdGlvbih7dHlwZTogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Db21tYW5kKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Db21tYW5kQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBjb21tYW5kIHJlY2VpdmVkIGZyb20gdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIHt7ZGF0YToge21lc3NhZ2U6IHN0cmluZywgYmFja3RyYWNlOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgdmFsdWU6IGFueVtdfX19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIG9uQ29tbWFuZFJlY2VpdmVkID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBkYXRhLnR5cGVcbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAodHlwZSA9PSBcImNvbnNvbGUuZXJyb3JcIikge1xuICAgICAgY29uc3Qgc2hvd01lc3NhZ2UgPSAhdGhpcy5zaG91bGRJZ25vcmVFcnJvcihkYXRhKVxuXG4gICAgICBpZiAoc2hvd01lc3NhZ2UpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkJyb3dzZXIgZXJyb3JcIiwgLi4uZGF0YS52YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJjb25zb2xlLmxvZ1wiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nXCIsIC4uLmRhdGEudmFsdWUpXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiZXJyb3JcIiB8fCBkYXRhLnR5cGUgPT0gXCJ1bmhhbmRsZWRyZWplY3Rpb25cIikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihkYXRhKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fb25Db21tYW5kQ2FsbGJhY2spIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKHtkYXRhLCB0eXBlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgb25XZWJTb2NrZXRDbGllbnRNZXNzYWdlIHVua25vd24gZGF0YSAodHlwZSAke3R5cGV9KWAsIGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBuZXcgd2ViIHNvY2tldCBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0fSB3c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIG9uV2ViU29ja2V0Q29ubmVjdGlvbiA9IGFzeW5jICh3cykgPT4ge1xuICAgIHRoaXMud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkub25PcGVuKClcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLndzLm9uKFwiZXJyb3JcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uRXJyb3JcIikpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcIm1lc3NhZ2VcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uTWVzc2FnZVwiKSlcblxuICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUoKVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25XZWJTb2NrZXRDbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSBudWxsXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChuZXcgRXJyb3IoXCJDbGllbnQgd2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgY29ubmVjdGluZ1wiKSlcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLm1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmJhY2t0cmFjZV1cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEJyb3dzZXIgZXJyb3I6ICR7ZGF0YS5tZXNzYWdlfWApXG5cbiAgICBpZiAoZGF0YS5iYWNrdHJhY2UpIHtcbiAgICAgIGVycm9yLnN0YWNrID0gYCR7ZXJyb3IubWVzc2FnZX1cXG4ke2RhdGEuYmFja3RyYWNlfVxcblxcbiR7ZXJyb3Iuc3RhY2t9YFxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3BTY291bmRyZWwoKVxuICAgIGlmICh0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyPy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSBjbG9zaW5nIEhUVFAgc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLmNsb3NlKCkpXG4gICAgfVxuICAgIGlmICh0aGlzLndzKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKClcbiAgICAgIHRoaXMud3MgPSBudWxsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xvc2VXZWJTb2NrZXRTZXJ2ZXIodGhpcy5jbGllbnRXc3MsIFwiY2xpZW50IFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICBpZiAodGhpcy5kcml2ZXI/LnF1aXQpIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcXVpdHRpbmcgV2ViRHJpdmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlci5xdWl0KCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHRlYXJzIGRvd24gYW5kIHJlc3RhcnRzIHRoZSBzeXN0ZW0gdGVzdCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZWluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wKClcblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICAgIHRoaXMuX2Jhc2VTZWxlY3RvciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY3VycmVudFVybCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuZHJpdmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gIH1cblxuICAvKipcbiAgICogVmlzaXRzIGEgcGF0aCBpbiB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRyaXZlclZpc2l0KHBhdGgpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmN1cnJlbnRVcmx9JHtwYXRofWBcblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0KHVybClcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHNjcmVlbnNob3QsIHNhdmVzIEhUTUwgYW5kIGJyb3dzZXIgbG9nc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIGNvbnN0IHBhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS90bXAvc2NyZWVuc2hvdHNgXG5cbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICAgIGNvbnN0IGltYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkudGFrZVNjcmVlbnNob3QoKVxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGAke3BhdGh9LyR7bW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKX0ucG5nYFxuICAgIGNvbnN0IGh0bWxQYXRoID0gYCR7cGF0aH0vJHttb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLURELUhILU1NLVNTXCIpfS5odG1sYFxuICAgIGNvbnN0IGxvZ3NQYXRoID0gYCR7cGF0aH0vJHttb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLURELUhILU1NLVNTXCIpfS5sb2dzLnR4dGBcbiAgICBjb25zdCBsb2dzVGV4dCA9IGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKVxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldEhUTUwoKVxuICAgIGNvbnN0IGh0bWxQcmV0dHkgPSBwcmV0dGlmeShodG1sKVxuXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGh0bWxQYXRoLCBodG1sUHJldHR5KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShsb2dzUGF0aCwgbG9nc1RleHQuam9pbihcIlxcblwiKSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoc2NyZWVuc2hvdFBhdGgsIGltYWdlQ29udGVudCwgXCJiYXNlNjRcIilcblxuICAgIGNvbnNvbGUubG9nKFwiQ3VycmVudCBVUkw6XCIsIGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpKVxuICAgIGNvbnNvbGUubG9nKFwiTG9nczpcIiwgbG9nc1BhdGgpXG4gICAgY29uc29sZS5sb2coXCJTY3JlZW5zaG90OlwiLCBzY3JlZW5zaG90UGF0aClcbiAgICBjb25zb2xlLmxvZyhcIkhUTUw6XCIsIGh0bWxQYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggaW4gdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJ2aXNpdFwiLCBwYXRofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdG8gYSBwYXRoIGluIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGlzbWlzc1RvKHBhdGgpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcImRpc21pc3NUb1wiLCBwYXRofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gd3NzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xvc2VXZWJTb2NrZXRTZXJ2ZXIod3NzLCBsYWJlbCA9IFwiV2ViU29ja2V0IHNlcnZlclwiKSB7XG4gICAgaWYgKCF3c3MpIHJldHVyblxuXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIGNsb3NpbmcgJHtsYWJlbH1gfSwgYXN5bmMgKCkgPT4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZVxuICAgICAgY29uc3QgdGVybWluYXRlQ2xpZW50ID0gKGNsaWVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsaWVudC50ZXJtaW5hdGUoKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGVybWluYXRpb24gZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRsZSA9IChjYWxsYmFjaywgYXJnKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2FsbGJhY2soYXJnKVxuICAgICAgfVxuXG4gICAgICB3c3Mub25jZShcImNsb3NlXCIsICgpID0+IHNldHRsZShyZXNvbHZlKSlcbiAgICAgIHdzcy5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBzZXR0bGUocmVqZWN0LCBlcnJvcikpXG4gICAgICBpZiAod3NzLmNsaWVudHMgJiYgd3NzLmNsaWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgd3NzLmNsaWVudHMuZm9yRWFjaCh0ZXJtaW5hdGVDbGllbnQpXG4gICAgICB9XG4gICAgICB3c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgc2V0dGxlKHJlamVjdCwgZXJyb3IpXG4gICAgICAgIGVsc2Ugc2V0dGxlKHJlc29sdmUpXG4gICAgICB9KVxuICAgIH0pKVxuICB9XG59XG4iXX0=
|
package/build/use-system-test.js
CHANGED
|
@@ -53,7 +53,7 @@ export default function useSystemTest({ onInitialize, ...restArgs } = { onInitia
|
|
|
53
53
|
const enabled = useMemo(() => isSystemTestEnabled(), []);
|
|
54
54
|
const systemTestBrowserHelper = enabled ? getSystemTestBrowserHelper() : null;
|
|
55
55
|
const result = useMemo(() => ({ enabled, systemTestBrowserHelper }), [enabled, systemTestBrowserHelper]);
|
|
56
|
-
const instanceShared = useMemo(() => ({}), []);
|
|
56
|
+
const instanceShared = useMemo(() => ({ enabled: false, router: null }), []);
|
|
57
57
|
instanceShared.enabled = enabled;
|
|
58
58
|
instanceShared.router = router;
|
|
59
59
|
// Resets navigation when instructed by the system test browser helper
|
|
@@ -86,4 +86,4 @@ export default function useSystemTest({ onInitialize, ...restArgs } = { onInitia
|
|
|
86
86
|
throw new Error(`Unknown arguments given to useSystemTest: ${restArgsKeys.join(", ")}`);
|
|
87
87
|
return result;
|
|
88
88
|
}
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VzZS1zeXN0ZW0tdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUMxQyxPQUFPLGVBQWUsTUFBTSxnREFBZ0QsQ0FBQTtBQUM1RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXJDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsV0FBVyxFQUFFLEtBQUs7SUFDbEIsdUJBQXVCLEVBQUUsSUFBSTtDQUM5QixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDbkIsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUE7SUFFNUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFekMsSUFBSSxXQUFXLENBQUMsVUFBVSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLDBCQUEwQjtJQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLHVC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QU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1lBQ3pCLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDNUQsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQTtJQUUzRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFcEgsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHFzIGZyb20gXCJxc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIlxuaW1wb3J0IHt1c2VDYWxsYmFjaywgdXNlTWVtb30gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB1c2VFdmVudEVtaXR0ZXIgZnJvbSBcIkBrYXNwZXJuai9hcGktbWFrZXIvYnVpbGQvdXNlLWV2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IHt1c2VSb3V0ZXJ9IGZyb20gXCJleHBvLXJvdXRlclwiXG5cbmNvbnN0IHNoYXJlZCA9IHtcbiAgaW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogbnVsbFxufVxuXG4vKipcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1N5c3RlbVRlc3RFbmFibGVkKCkge1xuICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gIGNvbnN0IGluaXRpYWxVcmwgPSBnbG9iYWxUaGlzLmxvY2F0aW9uPy5ocmVmXG5cbiAgaWYgKGluaXRpYWxVcmwpIHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGluaXRpYWxVcmwuc3Vic3RyaW5nKGluaXRpYWxVcmwuaW5kZXhPZihcIj9cIikgKyAxLCBpbml0aWFsVXJsLmxlbmd0aClcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zLnN5c3RlbVRlc3QgPT0gXCJ0cnVlXCIpIHtcbiAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVuYWJsZWRcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFN5c3RlbVRlc3RCcm93c2VySGVscGVyKCkge1xuICBpZiAoIXNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcikge1xuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IG5ldyBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG4gICAgc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyLmVuYWJsZU9uQnJvd3NlcigpXG4gIH1cblxuICByZXR1cm4gc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyXG59XG5cbi8qKlxuICogQSBob29rIHRoYXQgcHJvdmlkZXMgc3lzdGVtIHRlc3QgY2FwYWJpbGl0aWVzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaG9vay5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IG9wdGlvbnMub25Jbml0aWFsaXplIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gdGVzdCBicm93c2VyIGhlbHBlciBpcyBpbml0aWFsaXplZC5cbiAqIEByZXR1cm5zIHt7ZW5hYmxlZDogYm9vbGVhbiwgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IFN5c3RlbVRlc3RCcm93c2VySGVscGVyfX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU3lzdGVtVGVzdCh7b25Jbml0aWFsaXplLCAuLi5yZXN0QXJnc30gPSB7b25Jbml0aWFsaXplOiB1bmRlZmluZWR9KSB7XG4gIGlmICghdXNlTWVtbykgdGhyb3cgbmV3IEVycm9yKFwiW3VzZVN5c3RlbVRlc3RdIFJlYWN0LnVzZU1lbW8gaXMgbm90IGF2YWlsYWJsZVwiKVxuICBpZiAoIXVzZUNhbGxiYWNrKSB0aHJvdyBuZXcgRXJyb3IoXCJbdXNlU3lzdGVtVGVzdF0gUmVhY3QudXNlQ2FsbGJhY2sgaXMgbm90IGF2YWlsYWJsZVwiKVxuXG4gIGxldCByb3V0ZXIgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbdXNlU3lzdGVtVGVzdF0gdXNlUm91dGVyIHVuYXZhaWxhYmxlOlwiLCBlcnJvcilcbiAgfVxuICBjb25zdCBlbmFibGVkID0gdXNlTWVtbygoKSA9PiBpc1N5c3RlbVRlc3RFbmFibGVkKCksIFtdKVxuICBjb25zdCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IGVuYWJsZWQgPyBnZXRTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpIDogbnVsbFxuICBjb25zdCByZXN1bHQgPSB1c2VNZW1vKCgpID0+ICh7ZW5hYmxlZCwgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJ9KSwgW2VuYWJsZWQsIHN5c3RlbVRlc3RCcm93c2VySGVscGVyXSlcbiAgY29uc3QgaW5zdGFuY2VTaGFyZWQgPSB1c2VNZW1vKCgpID0+ICh7ZW5hYmxlZDogZmFsc2UsIHJvdXRlcjogbnVsbH0pLCBbXSlcblxuICBpbnN0YW5jZVNoYXJlZC5lbmFibGVkID0gZW5hYmxlZFxuICBpbnN0YW5jZVNoYXJlZC5yb3V0ZXIgPSByb3V0ZXJcblxuICAvLyBSZXNldHMgbmF2aWdhdGlvbiB3aGVuIGluc3RydWN0ZWQgYnkgdGhlIHN5c3RlbSB0ZXN0IGJyb3dzZXIgaGVscGVyXG4gIGNvbnN0IG9uU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJEaXNtaXNzVG8gPSB1c2VDYWxsYmFjaygoe3BhdGh9KSA9PiB7XG4gICAgaWYgKGluc3RhbmNlU2hhcmVkLmVuYWJsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlU2hhcmVkLnJvdXRlcj8uZGlzbWlzc1RvKHBhdGgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGlzbWlzcyB0byBwYXRoIFwiJHtwYXRofVwiOiAke2Vycm9yLm1lc3NhZ2V9YClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUV2ZW50RW1pdHRlcihzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI/LmdldEV2ZW50cygpLCBcImRpc21pc3NUb1wiLCBvblN5c3RlbVRlc3RCcm93c2VySGVscGVyRGlzbWlzc1RvKVxuXG5cbiAgLy8gTmF2aWdhdGVzIHdoZW4gaW5zdHJ1Y3RlZCBieSB0aGUgc3lzdGVtIHRlc3QgYnJvd3NlciBoZWxwZXIgYW5kIGtlZXBpbmcgaGlzdG9yeSBvZiBzY3JlZW5zXG4gIGNvbnN0IG9uU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJOYXZpZ2F0ZSA9IHVzZUNhbGxiYWNrKCh7cGF0aH0pID0+IHtcbiAgICBpZiAoaW5zdGFuY2VTaGFyZWQuZW5hYmxlZCkge1xuICAgICAgaW5zdGFuY2VTaGFyZWQucm91dGVyPy5uYXZpZ2F0ZShwYXRoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRXZlbnRFbWl0dGVyKHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcj8uZ2V0RXZlbnRzKCksIFwibmF2aWdhdGVcIiwgb25TeXN0ZW1UZXN0QnJvd3NlckhlbHBlck5hdmlnYXRlKVxuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChlbmFibGVkICYmICFzaGFyZWQuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHNoYXJlZC5pbml0aWFsaXplZCA9IHRydWVcbiAgICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcj8ub25Jbml0aWFsaXplKG9uSW5pdGlhbGl6ZSlcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvbkluaXRpYWxpemUsIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcl0pXG5cbiAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzIGdpdmVuIHRvIHVzZVN5c3RlbVRlc3Q6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "system-testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.57",
|
|
4
4
|
"description": "System testing with Selenium and browsers.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"prepare:dummy": "npm run build && rm -rf spec/dummy/node_modules/system-testing && mkdir -p spec/dummy/node_modules/system-testing && cp -r build package.json spec/dummy/node_modules/system-testing/",
|
|
31
31
|
"build": "rm -rf build && npm run compile",
|
|
32
32
|
"compile": "tsc",
|
|
33
|
-
"export:web": "npm run
|
|
33
|
+
"export:web": "npm run prepare:dummy && npm --prefix spec/dummy run export:web",
|
|
34
34
|
"lint": "eslint --max-warnings 0",
|
|
35
35
|
"prepublishOnly": "npm run build",
|
|
36
36
|
"test": "jasmine",
|
|
@@ -38,27 +38,35 @@
|
|
|
38
38
|
"watch": "tsc -w"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"awaitery": "^1.0.
|
|
41
|
+
"awaitery": "^1.0.12",
|
|
42
42
|
"diggerize": "^1.0.9",
|
|
43
43
|
"eventemitter3": "^5.0.1",
|
|
44
44
|
"htmlfy": "^1.0.0",
|
|
45
45
|
"mime": "^4.0.7",
|
|
46
46
|
"moment": "^2.30.1",
|
|
47
|
-
"scoundrel-remote-eval": "^1.0.
|
|
47
|
+
"scoundrel-remote-eval": "^1.0.28",
|
|
48
48
|
"ws": "^8.18.3"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"@kaspernj/api-maker": ">= 1.0.
|
|
52
|
-
"expo-router": "
|
|
51
|
+
"@kaspernj/api-maker": ">= 1.0.2079",
|
|
52
|
+
"expo-router": ">= 1.0.0",
|
|
53
53
|
"selenium-webdriver": ">= 4.34.0"
|
|
54
54
|
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"expo-router": {
|
|
57
|
+
"optional": true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
55
60
|
"devDependencies": {
|
|
56
61
|
"@eslint/js": "^9.39.1",
|
|
57
62
|
"@types/jasmine": "^5.1.13",
|
|
58
63
|
"@types/node": "^25.0.2",
|
|
64
|
+
"@types/qs": "^6.14.0",
|
|
65
|
+
"@types/react": "^19.2.7",
|
|
59
66
|
"@types/selenium-webdriver": "^4.35.4",
|
|
60
67
|
"eslint": "^9.39.1",
|
|
61
68
|
"eslint-plugin-jsdoc": "^61.4.1",
|
|
69
|
+
"expo-router": "^6.0.21",
|
|
62
70
|
"globals": "^16.5.0",
|
|
63
71
|
"jasmine": "^5.13.0",
|
|
64
72
|
"typescript": "^5.9.3"
|