velocious 1.0.617 → 1.0.618
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/README.md +3 -1
- package/build/background-jobs/client.js +12 -3
- package/build/background-jobs/socket-request.js +4 -0
- package/build/database/migration/index.js +2 -1
- package/build/database/pool/async-tracked-multi-connection.js +78 -1
- package/build/database/pool/base.js +32 -0
- package/build/database/pool/single-multi-use.js +65 -4
- package/build/src/background-jobs/client.d.ts +4 -1
- package/build/src/background-jobs/client.d.ts.map +1 -1
- package/build/src/background-jobs/client.js +12 -4
- package/build/src/background-jobs/socket-request.d.ts.map +1 -1
- package/build/src/background-jobs/socket-request.js +4 -1
- package/build/src/database/migration/index.d.ts +3 -2
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +3 -2
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +20 -0
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +75 -2
- package/build/src/database/pool/base.d.ts +25 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +30 -1
- package/build/src/database/pool/single-multi-use.d.ts +30 -3
- package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
- package/build/src/database/pool/single-multi-use.js +58 -5
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts +5 -0
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts.map +1 -1
- package/build/src/testing/shared-transaction-connection-coordinator.js +28 -4
- package/build/src/testing/test-runner.d.ts +75 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +201 -10
- package/build/testing/shared-transaction-connection-coordinator.js +29 -3
- package/build/testing/test-runner.js +198 -9
- package/package.json +1 -1
- package/src/background-jobs/client.js +12 -3
- package/src/background-jobs/socket-request.js +4 -0
- package/src/database/migration/index.js +2 -1
- package/src/database/pool/async-tracked-multi-connection.js +78 -1
- package/src/database/pool/base.js +32 -0
- package/src/database/pool/single-multi-use.js +65 -4
- package/src/testing/shared-transaction-connection-coordinator.js +29 -3
- package/src/testing/test-runner.js +198 -9
|
@@ -40,6 +40,8 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
40
40
|
/** @type {Set<() => boolean>} */
|
|
41
41
|
capacityWaiters = new Set();
|
|
42
42
|
closeGeneration = 0;
|
|
43
|
+
/** @type {Map<string, {connection: import("../drivers/base.js").default, registration: import("./base.js").TestSharedConnectionRegistration}>} */
|
|
44
|
+
testSharedConnectionsByReuseKey = new Map();
|
|
43
45
|
/**
|
|
44
46
|
* Checks a connection back into its keyed physical entry.
|
|
45
47
|
* @param {import("../drivers/base.js").default} connection - Connection.
|
|
@@ -72,6 +74,21 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
72
74
|
if (!entry.lifecycleRetained && (!entry.retained || this.capacityWaiters.size > 0))
|
|
73
75
|
await this.removeAndCloseEntry(entry);
|
|
74
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Permanently removes and closes a checked-out connection.
|
|
79
|
+
* @param {import("../drivers/base.js").default} connection - Connection that must not return to the pool.
|
|
80
|
+
*/
|
|
81
|
+
async discard(connection) {
|
|
82
|
+
const entry = this.entryForConnection(connection);
|
|
83
|
+
if (entry) {
|
|
84
|
+
this.activeCheckoutCount -= entry.activeCheckoutCount;
|
|
85
|
+
entry.activeCheckoutCount = 0;
|
|
86
|
+
entry.checkoutNames = [];
|
|
87
|
+
await this.removeAndCloseEntry(entry);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await connection.close();
|
|
91
|
+
}
|
|
75
92
|
/**
|
|
76
93
|
* Checks out the ambient configuration and retains it as the single mutable
|
|
77
94
|
* browser fallback connection.
|
|
@@ -84,11 +101,11 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
84
101
|
/**
|
|
85
102
|
* Checks out an explicitly captured physical configuration.
|
|
86
103
|
* @param {import("../../configuration-types.js").DatabaseConfigurationType} databaseConfiguration - Captured configuration.
|
|
87
|
-
* @param {import("./base.js").ConnectionCheckoutOptions} options - Checkout options.
|
|
88
|
-
* @param {{retain: boolean}} args - Whether this becomes the ambient retained connection.
|
|
104
|
+
* @param {import("./base.js").ConnectionCheckoutOptions} [options] - Checkout options.
|
|
105
|
+
* @param {{retain: boolean}} [args] - Whether this becomes the ambient retained connection.
|
|
89
106
|
* @returns {Promise<import("../drivers/base.js").default>} - Checked-out connection.
|
|
90
107
|
*/
|
|
91
|
-
async checkoutForConfiguration(databaseConfiguration, options, { retain }) {
|
|
108
|
+
async checkoutForConfiguration(databaseConfiguration, options = {}, { retain } = { retain: false }) {
|
|
92
109
|
const reuseKey = this.getConfigurationReuseKey(databaseConfiguration);
|
|
93
110
|
let entry = this.connectionEntries.get(reuseKey);
|
|
94
111
|
if (!entry) {
|
|
@@ -418,6 +435,7 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
418
435
|
const entries = [...this.connectionEntries.values()];
|
|
419
436
|
this.connectionEntries.clear();
|
|
420
437
|
this.connectionEntrySpawnPromises.clear();
|
|
438
|
+
this.testSharedConnectionsByReuseKey.clear();
|
|
421
439
|
this.connection = undefined;
|
|
422
440
|
this.activeCheckoutCount = 0;
|
|
423
441
|
for (const entry of entries)
|
|
@@ -432,6 +450,41 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
432
450
|
throw new Error("A connection hasn't been made yet");
|
|
433
451
|
return this.connection;
|
|
434
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Registers an attempt-owned connection for exactly one physical configuration.
|
|
455
|
+
* @param {import("../drivers/base.js").default} connection - Attempt-owned connection.
|
|
456
|
+
* @param {string} reuseKey - Resolved physical configuration identity.
|
|
457
|
+
* @returns {import("./base.js").TestSharedConnectionRegistration} - Opaque registration handle.
|
|
458
|
+
*/
|
|
459
|
+
setTestSharedConnectionForConfiguration(connection, reuseKey) {
|
|
460
|
+
const registration = { owner: Symbol("test-shared-physical-connection") };
|
|
461
|
+
this.testSharedConnectionsByReuseKey.set(reuseKey, { connection, registration });
|
|
462
|
+
return registration;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Clears an attempt-owned shared physical connection without revoking a newer owner.
|
|
466
|
+
* @param {import("./base.js").TestSharedConnectionRegistration} [registration] - Registration to clear conditionally.
|
|
467
|
+
*/
|
|
468
|
+
clearTestSharedConnection(registration) {
|
|
469
|
+
if (!registration) {
|
|
470
|
+
this.testSharedConnectionsByReuseKey.clear();
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
for (const [reuseKey, entry] of this.testSharedConnectionsByReuseKey) {
|
|
474
|
+
if (entry.registration !== registration)
|
|
475
|
+
continue;
|
|
476
|
+
this.testSharedConnectionsByReuseKey.delete(reuseKey);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Resolves the attempt-owned connection for the current physical configuration.
|
|
482
|
+
* @returns {import("../drivers/base.js").default | undefined} - Shared connection.
|
|
483
|
+
*/
|
|
484
|
+
testSharedConnection() {
|
|
485
|
+
const reuseKey = this.getConfigurationReuseKey();
|
|
486
|
+
return this.testSharedConnectionsByReuseKey.get(reuseKey)?.connection;
|
|
487
|
+
}
|
|
435
488
|
/**
|
|
436
489
|
* Returns the current context fallback connection when it is not suppressed.
|
|
437
490
|
* @returns {import("../drivers/base.js").default | undefined} - Current fallback connection.
|
|
@@ -439,7 +492,7 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
439
492
|
getCurrentContextConnection() {
|
|
440
493
|
if (this.suppressedConnectionContextCount > 0)
|
|
441
494
|
return undefined;
|
|
442
|
-
return this.connection;
|
|
495
|
+
return this.testSharedConnection() || this.connection;
|
|
443
496
|
}
|
|
444
497
|
/**
|
|
445
498
|
* Returns whether fallback context is available.
|
|
@@ -624,4 +677,4 @@ export default class VelociousDatabasePoolSingleMultiUser extends BasePool {
|
|
|
624
677
|
this.pendingCheckouts.splice(index, 1);
|
|
625
678
|
}
|
|
626
679
|
}
|
|
627
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW11bHRpLXVzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9wb29sL3NpbmdsZS1tdWx0aS11c2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSDs7Ozs7Ozs7OztHQVVHO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUE7QUFDbEMsTUFBTSwrQkFBK0IsR0FBRyxLQUFLLENBQUE7QUFFN0MsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQ0FBcUMsU0FBUSxRQUFRO0lBQ3hFLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtJQUN2QixnQ0FBZ0MsR0FBRyxDQUFDLENBQUE7SUFDcEMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3ZDLHVCQUF1QixHQUFHLENBQUMsQ0FBQTtJQUUzQixxREFBcUQ7SUFDckQsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUM3Qiw4REFBOEQ7SUFDOUQsNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN4Qyx5Q0FBeUM7SUFDekMsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNuQywwQ0FBMEM7SUFDMUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO0lBQ3JCLGlDQUFpQztJQUNqQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMzQixlQUFlLEdBQUcsQ0FBQyxDQUFBO0lBRW5COzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWpELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLG1C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QUMsQ0FBQTtRQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDN0I7OztXQUdHO1FBQ0gsSUFBSSxXQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO1FBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25ELEtBQUssT0FBTyxDQUFBO1lBQ1osV0FBVyxHQUFHLE1BQU0sQ0FBQTtRQUN0QixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sT0FBTyxHQUFHO1lBQ2QsWUFBWSxFQUFFLElBQUk7WUFDbEIsWUFBWTtZQUNaLFVBQVU7WUFDVixNQUFNLEVBQUUsV0FBVztZQUNuQixRQUFRO1lBQ1IsU0FBUyxFQUFFLGFBQWEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLGFBQWE7WUFDckUsYUFBYTtTQUNkLENBQUE7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRW5DLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsT0FBTztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmFzZVBvb2wgZnJvbSBcIi4vYmFzZS5qc1wiXG5pbXBvcnQgT3BlcmF0aW9uTGVhc2UgZnJvbSBcIi4uL29wZXJhdGlvbi1sZWFzZS5qc1wiXG5cbi8qKlxuICogU2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gU2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFjdGl2ZUNoZWNrb3V0Q291bnQgLSBBY3RpdmUgdXNlcnMgb2YgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjaGVja291dE5hbWVzIC0gTmVzdGVkIGNoZWNrb3V0IG5hbWVzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIE93bmVkIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbGlmZWN5Y2xlUmV0YWluZWQgLSBXaGV0aGVyIGZyb250ZW5kIHRlbmFudCBsaWZlY3ljbGUgb3duZXJzaGlwIHJldGFpbnMgdGhpcyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmV0YWluZWQgLSBXaGV0aGVyIG5vcm1hbCBhbWJpZW50IHVzZSByZXRhaW5zIHRoaXMgaWRsZSBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXVzZUtleSAtIFBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICovXG4vKipcbiAqIFNpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBjaGVja291dE5hbWUgLSBDaGVja291dCBuYW1lLlxuICogQHByb3BlcnR5IHtQcm9taXNlPHZvaWQ+fSBbY2xvc2VQcm9taXNlXSAtIFJlamVjdHMgaWYgY2xvc2VBbGwgb3ducyBjYW5jZWxsYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gZW5xdWV1ZWRBdCAtIEVucXVldWUgdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSByZWplY3QgLSBSZWplY3RzIGEgY2FwYWNpdHkgd2FpdGVyIGR1cmluZyBjbG9zZUFsbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXVzZUtleSAtIFBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gcmV1c2Uga2V5LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSB0aW1lb3V0QXQgLSBUaW1lb3V0IHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dE1pbGxpcyAtIENvbmZpZ3VyZWQgdGltZW91dC5cbiAqL1xuXG5jb25zdCBERUZBVUxUX01BWF9DT05ORUNUSU9OUyA9IDEwXG5jb25zdCBERUZBVUxUX0NIRUNLT1VUX1RJTUVPVVRfTUlMTElTID0gMTAwMDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VQb29sU2luZ2xlTXVsdGlVc2VyIGV4dGVuZHMgQmFzZVBvb2wge1xuICBhY3RpdmVDaGVja291dENvdW50ID0gMFxuICBzdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCA9IDBcbiAgb3BlcmF0aW9uTGVhc2VRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpXG4gIGNvbm5lY3Rpb25zQmVpbmdTcGF3bmVkID0gMFxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeT59ICovXG4gIGNvbm5lY3Rpb25FbnRyaWVzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTxTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5Pj59ICovXG4gIGNvbm5lY3Rpb25FbnRyeVNwYXduUHJvbWlzZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgY2FwdHVyZWRPcGVyYXRpb25RdWV1ZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtTaW5nbGVQb29sUGVuZGluZ0NoZWNrb3V0W119ICovXG4gIHBlbmRpbmdDaGVja291dHMgPSBbXVxuICAvKiogQHR5cGUge1NldDwoKSA9PiBib29sZWFuPn0gKi9cbiAgY2FwYWNpdHlXYWl0ZXJzID0gbmV3IFNldCgpXG4gIGNsb3NlR2VuZXJhdGlvbiA9IDBcblxuICAvKipcbiAgICogQ2hlY2tzIGEgY29ubmVjdGlvbiBiYWNrIGludG8gaXRzIGtleWVkIHBoeXNpY2FsIGVudHJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbGVhbnVwIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIGNoZWNraW4oY29ubmVjdGlvbikge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeUZvckNvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgIGlmICghZW50cnkgfHwgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA8IDEpIHJldHVyblxuXG4gICAgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudC0tXG4gICAgZW50cnkuY2hlY2tvdXROYW1lcy5wb3AoKVxuICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRDb3VudC0tXG5cbiAgICBpZiAoZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShlbnRyeS5jaGVja291dE5hbWVzW2VudHJ5LmNoZWNrb3V0TmFtZXMubGVuZ3RoIC0gMV0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yZWxlYXNlSGVsZEFkdmlzb3J5TG9ja3MoKVxuICAgICAgYXdhaXQgY29ubmVjdGlvbi5jbGVhckNvbm5lY3Rpb25DaGVja291dE5hbWUoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUFuZENsb3NlRW50cnkoZW50cnkpXG4gICAgICB9IGNhdGNoIChjbG9zZUVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihbZXJyb3IsIGNsb3NlRXJyb3JdLCBcIkRhdGFiYXNlIGNoZWNrb3V0IGNsZWFudXAgYW5kIGNvbm5lY3Rpb24gY2xvc2UgYm90aCBmYWlsZWRcIiwge2NhdXNlOiBjbG9zZUVycm9yfSlcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKCFlbnRyeS5saWZlY3ljbGVSZXRhaW5lZCAmJiAoIWVudHJ5LnJldGFpbmVkIHx8IHRoaXMuY2FwYWNpdHlXYWl0ZXJzLnNpemUgPiAwKSkgYXdhaXQgdGhpcy5yZW1vdmVBbmRDbG9zZUVudHJ5KGVudHJ5KVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBvdXQgdGhlIGFtYmllbnQgY29uZmlndXJhdGlvbiBhbmQgcmV0YWlucyBpdCBhcyB0aGUgc2luZ2xlIG11dGFibGVcbiAgICogYnJvd3NlciBmYWxsYmFjayBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbb3B0aW9uc10gLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gQ2hlY2tlZC1vdXQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrb3V0KG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbih0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgb3B0aW9ucywge3JldGFpbjogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIG91dCBhbiBleHBsaWNpdGx5IGNhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHt7cmV0YWluOiBib29sZWFufX0gYXJncyAtIFdoZXRoZXIgdGhpcyBiZWNvbWVzIHRoZSBhbWJpZW50IHJldGFpbmVkIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gLSBDaGVja2VkLW91dCBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tvdXRGb3JDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgb3B0aW9ucywge3JldGFpbn0pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBsZXQgZW50cnkgPSB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmdldChyZXVzZUtleSlcblxuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGxldCBzcGF3blByb21pc2UgPSB0aGlzLmNvbm5lY3Rpb25FbnRyeVNwYXduUHJvbWlzZXMuZ2V0KHJldXNlS2V5KVxuICAgICAgbGV0IHdhaXRlZEZvckNhcGFjaXR5UmVzZXJ2YXRpb24gPSBmYWxzZVxuXG4gICAgICBpZiAoIXNwYXduUHJvbWlzZSkge1xuICAgICAgICBpZiAodGhpcy5jYXBhY2l0eVdhaXRlcnMuc2l6ZSA9PT0gMCAmJiB0aGlzLnRyeVJlc2VydmVDb25uZWN0aW9uQ2FwYWNpdHkoZGF0YWJhc2VDb25maWd1cmF0aW9uKSkge1xuICAgICAgICAgIHNwYXduUHJvbWlzZSA9IHRoaXMuc3Bhd25Db25uZWN0aW9uRW50cnkoZGF0YWJhc2VDb25maWd1cmF0aW9uLCByZXVzZUtleSwgdGhpcy5jbG9zZUdlbmVyYXRpb24pXG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLnNldChyZXVzZUtleSwgc3Bhd25Qcm9taXNlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lOiBvcHRpb25zLm5hbWUsIHJldXNlS2V5fSlcbiAgICAgICAgICB3YWl0ZWRGb3JDYXBhY2l0eVJlc2VydmF0aW9uID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgZW50cnkgPSB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmdldChyZXVzZUtleSlcbiAgICAgICAgc3Bhd25Qcm9taXNlID0gdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmdldChyZXVzZUtleSlcblxuICAgICAgICBpZiAoIWVudHJ5ICYmICFzcGF3blByb21pc2UpIHtcbiAgICAgICAgICBzcGF3blByb21pc2UgPSB0aGlzLnNwYXduQ29ubmVjdGlvbkVudHJ5KGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgcmV1c2VLZXksIHRoaXMuY2xvc2VHZW5lcmF0aW9uKVxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkVudHJ5U3Bhd25Qcm9taXNlcy5zZXQocmV1c2VLZXksIHNwYXduUHJvbWlzZSlcbiAgICAgICAgfSBlbHNlIGlmICh3YWl0ZWRGb3JDYXBhY2l0eVJlc2VydmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5yZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkgJiYgc3Bhd25Qcm9taXNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZW50cnkgPSBhd2FpdCBzcGF3blByb21pc2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmdldChyZXVzZUtleSkgPT09IHNwYXduUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmRlbGV0ZShyZXVzZUtleSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFlbnRyeSkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2UgY29ubmVjdGlvbiBlbnRyeSB3YXMgbm90IGNyZWF0ZWRcIilcblxuICAgIGlmIChyZXRhaW4pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzQ29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvblxuXG4gICAgICBlbnRyeS5yZXRhaW5lZCA9IHRydWVcbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGVudHJ5LmNvbm5lY3Rpb25cblxuICAgICAgaWYgKHByZXZpb3VzQ29ubmVjdGlvbiAmJiBwcmV2aW91c0Nvbm5lY3Rpb24gIT09IGVudHJ5LmNvbm5lY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFbnRyeSA9IHRoaXMuZW50cnlGb3JDb25uZWN0aW9uKHByZXZpb3VzQ29ubmVjdGlvbilcblxuICAgICAgICBpZiAocHJldmlvdXNFbnRyeSkge1xuICAgICAgICAgIHByZXZpb3VzRW50cnkucmV0YWluZWQgPSBmYWxzZVxuICAgICAgICAgIGlmIChwcmV2aW91c0VudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPT09IDAgJiYgIXByZXZpb3VzRW50cnkubGlmZWN5Y2xlUmV0YWluZWQpIGF3YWl0IHRoaXMucmVtb3ZlQW5kQ2xvc2VFbnRyeShwcmV2aW91c0VudHJ5KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW50cnkuY2hlY2tvdXROYW1lcy5wdXNoKG9wdGlvbnMubmFtZSB8fCBcIlwiKVxuICAgIGF3YWl0IGVudHJ5LmNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShvcHRpb25zLm5hbWUpXG4gICAgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCsrXG4gICAgdGhpcy5hY3RpdmVDaGVja291dENvdW50KytcblxuICAgIHJldHVybiBlbnRyeS5jb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjYXBhY2l0eSBleGlzdHMgZm9yIGFub3RoZXIgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIFJlcXVlc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3tuYW1lPzogc3RyaW5nLCByZXVzZUtleTogc3RyaW5nfX0gb3B0aW9ucyAtIFBlbmRpbmcgY2hlY2tvdXQgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2FwYWNpdHkgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgYXN5bmMgcmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaWRsZUVudHJ5ID0gWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5hY3RpdmVDaGVja291dENvdW50ID09PSAwICYmICFlbnRyeS5saWZlY3ljbGVSZXRhaW5lZClcblxuICAgICAgaWYgKGlkbGVFbnRyeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUFuZENsb3NlRW50cnkoaWRsZUVudHJ5KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JDYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHBvb2wgY2FwYWNpdHkgd2l0aCBub3JtYWwgdGltZW91dCBhbmQgY2xvc2VBbGwgb3duZXJzaGlwLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7e25hbWU/OiBzdHJpbmcsIHJldXNlS2V5OiBzdHJpbmd9fSBvcHRpb25zIC0gUGVuZGluZyBjaGVja291dCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgb24gYSBjYXBhY2l0eSBjaGFuZ2UuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ2FwYWNpdHkoZGF0YWJhc2VDb25maWd1cmF0aW9uLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGltZW91dE1pbGxpcyA9IHRoaXMuY2hlY2tvdXRUaW1lb3V0TWlsbGlzKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBlbnF1ZXVlZEF0ID0gRGF0ZS5ub3coKVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCB0aW1lclxuICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgdGhpcy5jYXBhY2l0eVdhaXRlcnMuZGVsZXRlKGNhcGFjaXR5QXZhaWxhYmxlKVxuICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dChwZW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgY2FwYWNpdHlBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50cnlSZXNlcnZlQ29ubmVjdGlvbkNhcGFjaXR5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHJldHVybiBmYWxzZVxuXG4gICAgICAgIGZpbmlzaCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICAvKiogQHR5cGUge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXR9ICovXG4gICAgICBjb25zdCBwZW5kaW5nID0ge1xuICAgICAgICBjaGVja291dE5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgZW5xdWV1ZWRBdCxcbiAgICAgICAgcmVqZWN0OiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBmaW5pc2goKVxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcbiAgICAgICAgcmV1c2VLZXk6IG9wdGlvbnMucmV1c2VLZXksXG4gICAgICAgIHRpbWVvdXRBdDogdGltZW91dE1pbGxpcyA9PT0gbnVsbCA/IG51bGwgOiBlbnF1ZXVlZEF0ICsgdGltZW91dE1pbGxpcyxcbiAgICAgICAgdGltZW91dE1pbGxpc1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBlbmRpbmdDaGVja291dHMucHVzaChwZW5kaW5nKVxuICAgICAgdGhpcy5jYXBhY2l0eVdhaXRlcnMuYWRkKGNhcGFjaXR5QXZhaWxhYmxlKVxuXG4gICAgICBpZiAodGltZW91dE1pbGxpcyAhPT0gbnVsbCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2hlY2tvdXQgYWZ0ZXIgJHt0aW1lb3V0TWlsbGlzfW1zLmApKVxuICAgICAgICB9LCB0aW1lb3V0TWlsbGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGNvbm5lY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnMgfCAoKGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD4pfSBvcHRpb25zT3JDYWxsYmFjayAtIE9wdGlvbnMgb3IgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IFtjYWxsYmFja10gLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENvbm5lY3Rpb24ob3B0aW9uc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zT3JDYWxsYmFjayA9PSBcImZ1bmN0aW9uXCIgPyB7fSA6IG9wdGlvbnNPckNhbGxiYWNrXG4gICAgY29uc3QgYWN0dWFsQ2FsbGJhY2sgPSB0eXBlb2Ygb3B0aW9uc09yQ2FsbGJhY2sgPT0gXCJmdW5jdGlvblwiID8gb3B0aW9uc09yQ2FsbGJhY2sgOiBjYWxsYmFja1xuXG4gICAgaWYgKCFhY3R1YWxDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwid2l0aENvbm5lY3Rpb24gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXQob3B0aW9ucylcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYWN0dWFsQ2FsbGJhY2soY29ubmVjdGlvbilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja2luKGNvbm5lY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNhcHR1cmVkQ29ubmVjdGlvbigvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXRGb3JDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWU6IFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBvcGVuXCJ9LCB7cmV0YWluOiBmYWxzZX0pXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJ5Rm9yQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIGlmICghZW50cnkpIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIHRlbmFudCBTUUxpdGUgY29ubmVjdGlvbiBlbnRyeSBkaXNhcHBlYXJlZCBkdXJpbmcgb3BlblwiKVxuICAgIGVudHJ5LmxpZmVjeWNsZVJldGFpbmVkID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMuY2hlY2tpbihjb25uZWN0aW9uKVxuICB9XG5cbiAgYXN5bmMgZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb25uZWN0aW9uRW50cmllcy5nZXQodGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICBpZiAoZW50cnkpIGF3YWl0IGVudHJ5LmNvbm5lY3Rpb24uZmx1c2hQZW5kaW5nV3JpdGVzKClcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2FwdHVyZWRDb25uZWN0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG4gICAgaWYgKGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYW4gaW4tdXNlIGZyb250ZW5kIHRlbmFudCBTUUxpdGUgaGFuZGxlXCIpXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVBbmRDbG9zZUVudHJ5KGVudHJ5KVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQ2FwdHVyZWREYXRhYmFzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgRHJpdmVyQ2xhc3MgPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24uZHJpdmVyIHx8IHRoaXMuZHJpdmVyQ2xhc3NcbiAgICBpZiAoIURyaXZlckNsYXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkcml2ZXIgY2xhc3MgY29uZmlndXJlZCBmb3IgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBkZWxldGlvblwiKVxuICAgIGNvbnN0IGRyaXZlciA9IG5ldyBEcml2ZXJDbGFzcyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBhd2FpdCBkcml2ZXIuZGVsZXRlRGF0YWJhc2VTdG9yYWdlKClcbiAgfVxuXG4gIGNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgcmV0dXJuIEJvb2xlYW4oZW50cnkgJiYgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA+IDApXG4gIH1cblxuICBjYXB0dXJlZENvbm5lY3Rpb25IYXNQZW5kaW5nV3JpdGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgcmV0dXJuIEJvb2xlYW4oZW50cnk/LmNvbm5lY3Rpb24uaGFzUGVuZGluZ1dyaXRlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBsZWdhY3kgYW1iaWVudCBvcGVyYXRpb24gdW5kZXIgb25lIHBvb2wtd2lkZSBGSUZPIGxlYXNlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIG93bmVyOiBzeW1ib2wpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcHJldmlvdXNMZWFzZSA9IHRoaXMub3BlcmF0aW9uTGVhc2VRdWV1ZVxuICAgIGxldCByZWxlYXNlUXVldWUgPSAoKSA9PiB7fVxuICAgIGNvbnN0IHF1ZXVlVHVybiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2VRdWV1ZSA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuXG4gICAgdGhpcy5vcGVyYXRpb25MZWFzZVF1ZXVlID0gcHJldmlvdXNMZWFzZS50aGVuKGFzeW5jICgpID0+IGF3YWl0IHF1ZXVlVHVybilcbiAgICBhd2FpdCBwcmV2aW91c0xlYXNlXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuT3duZWRPcGVyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uLCBvcHRpb25zLCB7cmV0YWluOiB0cnVlfSwgY2FsbGJhY2spXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VRdWV1ZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYXB0dXJlZCBvcGVyYXRpb24gdW5kZXIgYSBGSUZPIGxlYXNlIHNjb3BlZCBvbmx5IHRvIGl0cyBwaHlzaWNhbFxuICAgKiBkYXRhYmFzZSBpZGVudGl0eSwgc28gdW5yZWxhdGVkIHRlbmFudCBkYXRhYmFzZXMgcmVtYWluIGNvbmN1cnJlbnQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNhcHR1cmVkQ29ubmVjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBDYXB0dXJlZCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgb3duZXI6IHN5bWJvbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENhcHR1cmVkT3BlcmF0aW9uQ29ubmVjdGlvbih7ZGF0YWJhc2VDb25maWd1cmF0aW9uLCBuYW1lfSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBwcmV2aW91c1R1cm4gPSB0aGlzLmNhcHR1cmVkT3BlcmF0aW9uUXVldWVzLmdldChyZXVzZUtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICBsZXQgcmVsZWFzZVR1cm4gPSAoKSA9PiB7fVxuICAgIGNvbnN0IHR1cm4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlVHVybiA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICAgIGNvbnN0IHF1ZXVlVGFpbCA9IHByZXZpb3VzVHVybi50aGVuKGFzeW5jICgpID0+IGF3YWl0IHR1cm4pXG4gICAgY29uc3Qgd2FzUXVldWVkID0gdGhpcy5jYXB0dXJlZE9wZXJhdGlvblF1ZXVlcy5oYXMocmV1c2VLZXkpXG4gICAgY29uc3QgcGVuZGluZyA9IHdhc1F1ZXVlZCA/IHRoaXMuYWRkT3BlcmF0aW9uUGVuZGluZ0NoZWNrb3V0KGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWUsIHJldXNlS2V5fSkgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuY2FwdHVyZWRPcGVyYXRpb25RdWV1ZXMuc2V0KHJldXNlS2V5LCBxdWV1ZVRhaWwpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT3BlcmF0aW9uVHVybihwcmV2aW91c1R1cm4sIHBlbmRpbmcpXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk93bmVkT3BlcmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWV9LCB7cmV0YWluOiBmYWxzZX0sIGNhbGxiYWNrKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocGVuZGluZykgdGhpcy5yZW1vdmVQZW5kaW5nQ2hlY2tvdXQocGVuZGluZylcbiAgICAgIHJlbGVhc2VUdXJuKClcbiAgICAgIHZvaWQgcXVldWVUYWlsLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYXB0dXJlZE9wZXJhdGlvblF1ZXVlcy5nZXQocmV1c2VLZXkpID09PSBxdWV1ZVRhaWwpIHRoaXMuY2FwdHVyZWRPcGVyYXRpb25RdWV1ZXMuZGVsZXRlKHJldXNlS2V5KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgY2FsbGJhY2sgd2l0aCBhbiBpbnN0YWxsZWQgZHJpdmVyIG9wZXJhdGlvbiBsZWFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIFBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IG9wdGlvbnMgLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3tyZXRhaW46IGJvb2xlYW59fSBjaGVja291dEFyZ3MgLSBDaGVja291dCByZXRlbnRpb24uXG4gICAqIEBwYXJhbSB7KGNvbm5lY3Rpb246IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCBvd25lcjogc3ltYm9sKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5Pd25lZE9wZXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMsIGNoZWNrb3V0QXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBvd25lciA9IFN5bWJvbChcInNpbmdsZS1wb29sLW9wZXJhdGlvbi1vd25lclwiKVxuICAgIGNvbnN0IG9wZXJhdGlvbkxlYXNlID0gbmV3IE9wZXJhdGlvbkxlYXNlKG93bmVyKVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMsIGNoZWNrb3V0QXJncylcbiAgICBsZXQgb3BlcmF0aW9uTGVhc2VJbnN0YWxsZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2V0T3BlcmF0aW9uTGVhc2Uob3BlcmF0aW9uTGVhc2UpXG4gICAgICBvcGVyYXRpb25MZWFzZUluc3RhbGxlZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24sIG93bmVyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBvcGVyYXRpb25MZWFzZS5yZWxlYXNlKClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wZXJhdGlvbkxlYXNlSW5zdGFsbGVkKSBjb25uZWN0aW9uLmNsZWFyT3BlcmF0aW9uTGVhc2Uob3BlcmF0aW9uTGVhc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgc2FtZS1waHlzaWNhbC1kYXRhYmFzZSBvcGVyYXRpb24gcXVldWUgdHVybi5cbiAgICogQHBhcmFtIHtQcm9taXNlPHZvaWQ+fSBwcmV2aW91c1R1cm4gLSBQcmV2aW91cyBxdWV1ZSB0YWlsLlxuICAgKiBAcGFyYW0ge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXQgfCB1bmRlZmluZWR9IHBlbmRpbmcgLSBQZW5kaW5nIGRlYnVnIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBwcmV2aW91cyB0dXJuIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck9wZXJhdGlvblR1cm4ocHJldmlvdXNUdXJuLCBwZW5kaW5nKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBhd2FpdCBwcmV2aW91c1R1cm5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLnRpbWVvdXRNaWxsaXMgPT09IG51bGwpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcHJldmlvdXNUdXJuLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgICBwZW5kaW5nLmNsb3NlUHJvbWlzZT8uY2F0Y2gocmVqZWN0KVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXRNaWxsaXMgPSBwZW5kaW5nLnRpbWVvdXRNaWxsaXNcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbiBjaGVja291dCBhZnRlciAke3RpbWVvdXRNaWxsaXN9bXMuYCkpLCB0aW1lb3V0TWlsbGlzKVxuXG4gICAgICBwcmV2aW91c1R1cm4udGhlbigoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9KVxuICAgICAgcGVuZGluZy5jbG9zZVByb21pc2U/LmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGhvdXQgY3VycmVudCBjb25uZWN0aW9uIGNvbnRleHQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gVH0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1R9IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgd2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dChjYWxsYmFjaykge1xuICAgIHRoaXMuc3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0Q291bnQgKz0gMVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKClcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKHJlc3VsdC5maW5hbGx5KCgpID0+IHsgdGhpcy5zdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCAtPSAxIH0pKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnN1cHByZXNzZWRDb25uZWN0aW9uQ29udGV4dENvdW50IC09IDFcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCAtPSAxXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhcnMgc2NoZW1hIG1ldGFkYXRhIG9uIGV2ZXJ5IGxpdmUgcGh5c2ljYWwgY29ubmVjdGlvbi4gKi9cbiAgY2xlYXJTY2hlbWFDYWNoZSgpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCkpIHRoaXMuX2NsZWFyQ29ubmVjdGlvblNjaGVtYUNhY2hlKGVudHJ5LmNvbm5lY3Rpb24pXG4gIH1cblxuICAvKiogQ2xvc2VzIGV2ZXJ5IHBvb2wtb3duZWQgY29ubmVjdGlvbiBhbmQgcmVqZWN0cyBxdWV1ZWQgY2FwYWNpdHkgcmVxdWVzdHMuICovXG4gIGFzeW5jIGNsb3NlQWxsKCkge1xuICAgIGNvbnN0IGNsb3NlRXJyb3IgPSBuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIilcblxuICAgIHRoaXMuY2xvc2VHZW5lcmF0aW9uKytcblxuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiBbLi4udGhpcy5wZW5kaW5nQ2hlY2tvdXRzXSkgcGVuZGluZy5yZWplY3QoY2xvc2VFcnJvcilcbiAgICB0aGlzLm5vdGlmeUNhcGFjaXR5V2FpdGVycygpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyeVNwYXduUHJvbWlzZXMudmFsdWVzKCldKVxuXG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXVxuXG4gICAgdGhpcy5jb25uZWN0aW9uRW50cmllcy5jbGVhcigpXG4gICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmNsZWFyKClcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICB0aGlzLmFjdGl2ZUNoZWNrb3V0Q291bnQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIGF3YWl0IGVudHJ5LmNvbm5lY3Rpb24uY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG11dGFibGUgYW1iaWVudCBmYWxsYmFjayBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gTXV0YWJsZSBhbWJpZW50IGZhbGxiYWNrIGNvbm5lY3Rpb24uXG4gICAqL1xuICBnZXRDdXJyZW50Q29ubmVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQSBjb25uZWN0aW9uIGhhc24ndCBiZWVuIG1hZGUgeWV0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IGZhbGxiYWNrIGNvbm5lY3Rpb24gd2hlbiBpdCBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgZmFsbGJhY2sgY29ubmVjdGlvbi5cbiAgICovXG4gIGdldEN1cnJlbnRDb250ZXh0Q29ubmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCA+IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgZmFsbGJhY2sgY29udGV4dCBpcyBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZmFsbGJhY2sgY29udGV4dCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBoYXNDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0Q291bnQgPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBvb2wgZGlhZ25vc3RpY3MgZm9yIHJldGFpbmVkIGFuZCB0ZW1wb3Jhcnkga2V5ZWQgY29ubmVjdGlvbnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuRGF0YWJhc2VQb29sRGVidWdTbmFwc2hvdH0gLSBQb29sIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgZ2V0RGVidWdTbmFwc2hvdCgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXS5tYXAoKGVudHJ5KSA9PiB0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90KGVudHJ5LmNvbm5lY3Rpb24sIHtcbiAgICAgIGFjdGl2ZUNoZWNrb3V0Q291bnQ6IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQsXG4gICAgICBzdGF0ZTogZW50cnkucmV0YWluZWQgPyBcInNoYXJlZFwiIDogZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA+IDAgPyBcImluLXVzZVwiIDogZW50cnkubGlmZWN5Y2xlUmV0YWluZWQgPyBcImxpZmVjeWNsZS1yZXRhaW5lZFwiIDogXCJpZGxlXCJcbiAgICB9KSlcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVidWdTbmFwc2hvdCgpLFxuICAgICAgY29ubmVjdGlvbnMsXG4gICAgICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZDogdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCxcbiAgICAgIGlkbGVDb3VudDogWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPT09IDApLmxlbmd0aCxcbiAgICAgIGluVXNlQ291bnQ6IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5hY3RpdmVDaGVja291dENvdW50ID4gMCkubGVuZ3RoLFxuICAgICAgcGVuZGluZ0NoZWNrb3V0czogdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLm1hcCgocGVuZGluZywgaW5kZXgpID0+ICh7XG4gICAgICAgIGNoZWNrb3V0TmFtZTogcGVuZGluZy5jaGVja291dE5hbWUsXG4gICAgICAgIGVucXVldWVkQXQ6IHBlbmRpbmcuZW5xdWV1ZWRBdCxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHJlbWFpbmluZ1RpbWVvdXRNczogcGVuZGluZy50aW1lb3V0QXQgPT09IG51bGwgPyBudWxsIDogTWF0aC5tYXgoMCwgcGVuZGluZy50aW1lb3V0QXQgLSBub3cpLFxuICAgICAgICByZXVzZUtleTogcGVuZGluZy5yZXVzZUtleSxcbiAgICAgICAgdGltZW91dEF0OiBwZW5kaW5nLnRpbWVvdXRBdCxcbiAgICAgICAgdGltZW91dE1pbGxpczogcGVuZGluZy50aW1lb3V0TWlsbGlzLFxuICAgICAgICB3YWl0aW5nRm9yTXM6IE1hdGgubWF4KDAsIG5vdyAtIHBlbmRpbmcuZW5xdWV1ZWRBdClcbiAgICAgIH0pKSxcbiAgICAgIHBlbmRpbmdDaGVja291dENvdW50OiB0aGlzLnBlbmRpbmdDaGVja291dHMubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgY29ubmVjdGlvbiBtYXhpbXVtLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ29uZmlndXJlZCBjb25uZWN0aW9uIG1heGltdW0uXG4gICAqL1xuICBtYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5wb29sPy5tYXhcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMSkgcmV0dXJuIHZhbHVlXG5cbiAgICByZXR1cm4gREVGQVVMVF9NQVhfQ09OTkVDVElPTlNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBDb25maWd1cmVkIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqL1xuICBjaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ucG9vbD8uY2hlY2tvdXRUaW1lb3V0TWlsbGlzXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDApIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfQ0hFQ0tPVVRfVElNRU9VVF9NSUxMSVNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYW5vdGhlciBwaHlzaWNhbCBjb25uZWN0aW9uIG1heSBiZSBzcGF3bmVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbm90aGVyIHBoeXNpY2FsIGNvbm5lY3Rpb24gbWF5IGJlIHNwYXduZWQuXG4gICAqL1xuICBjYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXR1cm4gbWF4ID09PSBudWxsIHx8IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuc2l6ZSArIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQgPCBtYXhcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGNsYWltcyBvbmUgY29ubmVjdGlvbiBzbG90IHdpdGhvdXQgeWllbGRpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uIHdob3NlIG1heGltdW0gYXBwbGllcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhIHNsb3Qgd2FzIHJlc2VydmVkLlxuICAgKi9cbiAgdHJ5UmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCsrXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIFJlbGVhc2VzIG9uZSBwcmV2aW91c2x5IGNsYWltZWQgY29ubmVjdGlvbiBzbG90LiAqL1xuICByZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVsZWFzZSBhbiB1bnJlc2VydmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2xvdFwiKVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQtLVxuICAgIHRoaXMubm90aWZ5Q2FwYWNpdHlXYWl0ZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYW5kIHRyYWNrcyBhIHBoeXNpY2FsIGNvbm5lY3Rpb24gZW50cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBQaHlzaWNhbCByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjbG9zZUdlbmVyYXRpb24gLSBQb29sIGxpZmVjeWNsZSBnZW5lcmF0aW9uIGF0IHNwYXduIHN0YXJ0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5Pn0gLSBOZXcgZW50cnkuXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25FbnRyeShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHJldXNlS2V5LCBjbG9zZUdlbmVyYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uRm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG5cbiAgICAgIGlmICh0aGlzLmNsb3NlR2VuZXJhdGlvbiAhPT0gY2xvc2VHZW5lcmF0aW9uKSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIilcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5fSAqL1xuICAgICAgY29uc3QgZW50cnkgPSB7YWN0aXZlQ2hlY2tvdXRDb3VudDogMCwgY2hlY2tvdXROYW1lczogW10sIGNvbm5lY3Rpb24sIGxpZmVjeWNsZVJldGFpbmVkOiBmYWxzZSwgcmV0YWluZWQ6IGZhbHNlLCByZXVzZUtleX1cblxuICAgICAgdGhpcy5jb25uZWN0aW9uRW50cmllcy5zZXQocmV1c2VLZXksIGVudHJ5KVxuXG4gICAgICByZXR1cm4gZW50cnlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuZCBjbG9zZXMgYW4gZW50cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7U2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeSB8IHVuZGVmaW5lZH0gLSBFbnRyeSBvd25pbmcgYSBjb25uZWN0aW9uLlxuICAgKi9cbiAgZW50cnlGb3JDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5jb25uZWN0aW9uID09PSBjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzYW1lLWtleSBvcGVyYXRpb24gcGVuZGluZyBlbnRyeS5cbiAgICogQHBhcmFtIHtTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5fSBlbnRyeSAtIEVudHJ5IHRvIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBjbG9zZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUFuZENsb3NlRW50cnkoZW50cnkpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uRW50cmllcy5nZXQoZW50cnkucmV1c2VLZXkpICE9PSBlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmRlbGV0ZShlbnRyeS5yZXVzZUtleSlcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uID09PSBlbnRyeS5jb25uZWN0aW9uKSB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICBhd2FpdCBlbnRyeS5jb25uZWN0aW9uLmNsb3NlKClcbiAgICB0aGlzLm5vdGlmeUNhcGFjaXR5V2FpdGVycygpXG4gIH1cblxuICAvKiogV2FrZXMgYWxsIGNhcGFjaXR5IHdhaXRlcnMgdG8gcmUtY2hlY2sgdGhlIGJvdW5kZWQgcG9vbC4gKi9cbiAgbm90aWZ5Q2FwYWNpdHlXYWl0ZXJzKCkge1xuICAgIGZvciAoY29uc3QgcmVzZXJ2ZUFuZFJlc29sdmUgb2YgdGhpcy5jYXBhY2l0eVdhaXRlcnMpIHtcbiAgICAgIGlmIChyZXNlcnZlQW5kUmVzb2x2ZSgpKSByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHNhbWUta2V5IG9wZXJhdGlvbiBwZW5kaW5nIGVudHJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHt7bmFtZT86IHN0cmluZywgcmV1c2VLZXk6IHN0cmluZ319IG9wdGlvbnMgLSBQZW5kaW5nIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7U2luZ2xlUG9vbFBlbmRpbmdDaGVja291dH0gLSBBZGRlZCBzYW1lLWtleSBvcGVyYXRpb24gcGVuZGluZyBlbnRyeS5cbiAgICovXG4gIGFkZE9wZXJhdGlvblBlbmRpbmdDaGVja291dChkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lLCByZXVzZUtleX0pIHtcbiAgICBjb25zdCB0aW1lb3V0TWlsbGlzID0gdGhpcy5jaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGVucXVldWVkQXQgPSBEYXRlLm5vdygpXG4gICAgLyoqXG4gICAgICogUmVqZWN0cyB0aGUgY2xvc2Utb3duZWQgcHJvbWlzZS5cbiAgICAgKiBAdHlwZSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVqZWN0Q2xvc2UgPSAoKSA9PiB7fVxuICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZvaWQgcmVzb2x2ZVxuICAgICAgcmVqZWN0Q2xvc2UgPSByZWplY3RcbiAgICB9KVxuICAgIGNvbnN0IHBlbmRpbmcgPSB7XG4gICAgICBjaGVja291dE5hbWU6IG5hbWUsXG4gICAgICBjbG9zZVByb21pc2UsXG4gICAgICBlbnF1ZXVlZEF0LFxuICAgICAgcmVqZWN0OiByZWplY3RDbG9zZSxcbiAgICAgIHJldXNlS2V5LFxuICAgICAgdGltZW91dEF0OiB0aW1lb3V0TWlsbGlzID09PSBudWxsID8gbnVsbCA6IGVucXVldWVkQXQgKyB0aW1lb3V0TWlsbGlzLFxuICAgICAgdGltZW91dE1pbGxpc1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5wdXNoKHBlbmRpbmcpXG5cbiAgICByZXR1cm4gcGVuZGluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBwZW5kaW5nIGNoZWNrb3V0IGRlYnVnIGVudHJ5LlxuICAgKiBAcGFyYW0ge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXR9IHBlbmRpbmcgLSBQZW5kaW5nIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlbW92ZVBlbmRpbmdDaGVja291dChwZW5kaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdDaGVja291dHMuaW5kZXhPZihwZW5kaW5nKVxuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLnNwbGljZShpbmRleCwgMSlcbiAgfVxufVxuIl19
|
|
680
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW11bHRpLXVzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9wb29sL3NpbmdsZS1tdWx0aS11c2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7Ozs7O0dBU0c7QUFDSDs7Ozs7Ozs7OztHQVVHO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUE7QUFDbEMsTUFBTSwrQkFBK0IsR0FBRyxLQUFLLENBQUE7QUFFN0MsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQ0FBcUMsU0FBUSxRQUFRO0lBQ3hFLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtJQUN2QixnQ0FBZ0MsR0FBRyxDQUFDLENBQUE7SUFDcEMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3ZDLHVCQUF1QixHQUFHLENBQUMsQ0FBQTtJQUUzQixxREFBcUQ7SUFDckQsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUM3Qiw4REFBOEQ7SUFDOUQsNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN4Qyx5Q0FBeUM7SUFDekMsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNuQywwQ0FBMEM7SUFDMUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO0lBQ3JCLGlDQUFpQztJQUNqQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMzQixlQUFlLEdBQUcsQ0FBQyxDQUFBO0lBQ25CLGtKQUFrSjtJQUNsSiwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRTNDOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVB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TUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhc2VQb29sIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0IE9wZXJhdGlvbkxlYXNlIGZyb20gXCIuLi9vcGVyYXRpb24tbGVhc2UuanNcIlxuXG4vKipcbiAqIFNpbmdsZVBvb2xDb25uZWN0aW9uRW50cnkgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbmdsZVBvb2xDb25uZWN0aW9uRW50cnlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY3RpdmVDaGVja291dENvdW50IC0gQWN0aXZlIHVzZXJzIG9mIHRoZSBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hlY2tvdXROYW1lcyAtIE5lc3RlZCBjaGVja291dCBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBPd25lZCBkcml2ZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxpZmVjeWNsZVJldGFpbmVkIC0gV2hldGhlciBmcm9udGVuZCB0ZW5hbnQgbGlmZWN5Y2xlIG93bmVyc2hpcCByZXRhaW5zIHRoaXMgZW50cnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJldGFpbmVkIC0gV2hldGhlciBub3JtYWwgYW1iaWVudCB1c2UgcmV0YWlucyB0aGlzIGlkbGUgZW50cnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmV1c2VLZXkgLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAqL1xuLyoqXG4gKiBTaW5nbGVQb29sUGVuZGluZ0NoZWNrb3V0IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW5nbGVQb29sUGVuZGluZ0NoZWNrb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gY2hlY2tvdXROYW1lIC0gQ2hlY2tvdXQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx2b2lkPn0gW2Nsb3NlUHJvbWlzZV0gLSBSZWplY3RzIGlmIGNsb3NlQWxsIG93bnMgY2FuY2VsbGF0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGVucXVldWVkQXQgLSBFbnF1ZXVlIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gcmVqZWN0IC0gUmVqZWN0cyBhIGNhcGFjaXR5IHdhaXRlciBkdXJpbmcgY2xvc2VBbGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmV1c2VLZXkgLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uIHJldXNlIGtleS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gdGltZW91dEF0IC0gVGltZW91dCB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRNaWxsaXMgLSBDb25maWd1cmVkIHRpbWVvdXQuXG4gKi9cblxuY29uc3QgREVGQVVMVF9NQVhfQ09OTkVDVElPTlMgPSAxMFxuY29uc3QgREVGQVVMVF9DSEVDS09VVF9USU1FT1VUX01JTExJUyA9IDEwMDAwXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUG9vbFNpbmdsZU11bHRpVXNlciBleHRlbmRzIEJhc2VQb29sIHtcbiAgYWN0aXZlQ2hlY2tvdXRDb3VudCA9IDBcbiAgc3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0Q291bnQgPSAwXG4gIG9wZXJhdGlvbkxlYXNlUXVldWUgPSBQcm9taXNlLnJlc29sdmUoKVxuICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZCA9IDBcblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFNpbmdsZVBvb2xDb25uZWN0aW9uRW50cnk+fSAqL1xuICBjb25uZWN0aW9uRW50cmllcyA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFByb21pc2U8U2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeT4+fSAqL1xuICBjb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj59ICovXG4gIGNhcHR1cmVkT3BlcmF0aW9uUXVldWVzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7U2luZ2xlUG9vbFBlbmRpbmdDaGVja291dFtdfSAqL1xuICBwZW5kaW5nQ2hlY2tvdXRzID0gW11cbiAgLyoqIEB0eXBlIHtTZXQ8KCkgPT4gYm9vbGVhbj59ICovXG4gIGNhcGFjaXR5V2FpdGVycyA9IG5ldyBTZXQoKVxuICBjbG9zZUdlbmVyYXRpb24gPSAwXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2Nvbm5lY3Rpb246IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCByZWdpc3RyYXRpb246IGltcG9ydChcIi4vYmFzZS5qc1wiKS5UZXN0U2hhcmVkQ29ubmVjdGlvblJlZ2lzdHJhdGlvbn0+fSAqL1xuICB0ZXN0U2hhcmVkQ29ubmVjdGlvbnNCeVJldXNlS2V5ID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIENoZWNrcyBhIGNvbm5lY3Rpb24gYmFjayBpbnRvIGl0cyBrZXllZCBwaHlzaWNhbCBlbnRyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBjaGVja2luKGNvbm5lY3Rpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnlGb3JDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG5cbiAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPCAxKSByZXR1cm5cblxuICAgIGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQtLVxuICAgIGVudHJ5LmNoZWNrb3V0TmFtZXMucG9wKClcbiAgICB0aGlzLmFjdGl2ZUNoZWNrb3V0Q291bnQtLVxuXG4gICAgaWYgKGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNldENvbm5lY3Rpb25DaGVja291dE5hbWUoZW50cnkuY2hlY2tvdXROYW1lc1tlbnRyeS5jaGVja291dE5hbWVzLmxlbmd0aCAtIDFdKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucmVsZWFzZUhlbGRBZHZpc29yeUxvY2tzKClcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xlYXJDb25uZWN0aW9uQ2hlY2tvdXROYW1lKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBbmRDbG9zZUVudHJ5KGVudHJ5KVxuICAgICAgfSBjYXRjaCAoY2xvc2VFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoW2Vycm9yLCBjbG9zZUVycm9yXSwgXCJEYXRhYmFzZSBjaGVja291dCBjbGVhbnVwIGFuZCBjb25uZWN0aW9uIGNsb3NlIGJvdGggZmFpbGVkXCIsIHtjYXVzZTogY2xvc2VFcnJvcn0pXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmICghZW50cnkubGlmZWN5Y2xlUmV0YWluZWQgJiYgKCFlbnRyeS5yZXRhaW5lZCB8fCB0aGlzLmNhcGFjaXR5V2FpdGVycy5zaXplID4gMCkpIGF3YWl0IHRoaXMucmVtb3ZlQW5kQ2xvc2VFbnRyeShlbnRyeSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtYW5lbnRseSByZW1vdmVzIGFuZCBjbG9zZXMgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQ29ubmVjdGlvbiB0aGF0IG11c3Qgbm90IHJldHVybiB0byB0aGUgcG9vbC5cbiAgICovXG4gIGFzeW5jIGRpc2NhcmQoY29ubmVjdGlvbikge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyeUZvckNvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgIGlmIChlbnRyeSkge1xuICAgICAgdGhpcy5hY3RpdmVDaGVja291dENvdW50IC09IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnRcbiAgICAgIGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPSAwXG4gICAgICBlbnRyeS5jaGVja291dE5hbWVzID0gW11cbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQW5kQ2xvc2VFbnRyeShlbnRyeSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBvdXQgdGhlIGFtYmllbnQgY29uZmlndXJhdGlvbiBhbmQgcmV0YWlucyBpdCBhcyB0aGUgc2luZ2xlIG11dGFibGVcbiAgICogYnJvd3NlciBmYWxsYmFjayBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbb3B0aW9uc10gLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gQ2hlY2tlZC1vdXQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrb3V0KG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbih0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgb3B0aW9ucywge3JldGFpbjogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIG91dCBhbiBleHBsaWNpdGx5IGNhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBbb3B0aW9uc10gLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3tyZXRhaW46IGJvb2xlYW59fSBbYXJnc10gLSBXaGV0aGVyIHRoaXMgYmVjb21lcyB0aGUgYW1iaWVudCByZXRhaW5lZCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IC0gQ2hlY2tlZC1vdXQgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMgPSB7fSwge3JldGFpbn0gPSB7cmV0YWluOiBmYWxzZX0pIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBsZXQgZW50cnkgPSB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmdldChyZXVzZUtleSlcblxuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGxldCBzcGF3blByb21pc2UgPSB0aGlzLmNvbm5lY3Rpb25FbnRyeVNwYXduUHJvbWlzZXMuZ2V0KHJldXNlS2V5KVxuICAgICAgbGV0IHdhaXRlZEZvckNhcGFjaXR5UmVzZXJ2YXRpb24gPSBmYWxzZVxuXG4gICAgICBpZiAoIXNwYXduUHJvbWlzZSkge1xuICAgICAgICBpZiAodGhpcy5jYXBhY2l0eVdhaXRlcnMuc2l6ZSA9PT0gMCAmJiB0aGlzLnRyeVJlc2VydmVDb25uZWN0aW9uQ2FwYWNpdHkoZGF0YWJhc2VDb25maWd1cmF0aW9uKSkge1xuICAgICAgICAgIHNwYXduUHJvbWlzZSA9IHRoaXMuc3Bhd25Db25uZWN0aW9uRW50cnkoZGF0YWJhc2VDb25maWd1cmF0aW9uLCByZXVzZUtleSwgdGhpcy5jbG9zZUdlbmVyYXRpb24pXG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLnNldChyZXVzZUtleSwgc3Bhd25Qcm9taXNlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lOiBvcHRpb25zLm5hbWUsIHJldXNlS2V5fSlcbiAgICAgICAgICB3YWl0ZWRGb3JDYXBhY2l0eVJlc2VydmF0aW9uID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgZW50cnkgPSB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmdldChyZXVzZUtleSlcbiAgICAgICAgc3Bhd25Qcm9taXNlID0gdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmdldChyZXVzZUtleSlcblxuICAgICAgICBpZiAoIWVudHJ5ICYmICFzcGF3blByb21pc2UpIHtcbiAgICAgICAgICBzcGF3blByb21pc2UgPSB0aGlzLnNwYXduQ29ubmVjdGlvbkVudHJ5KGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgcmV1c2VLZXksIHRoaXMuY2xvc2VHZW5lcmF0aW9uKVxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvbkVudHJ5U3Bhd25Qcm9taXNlcy5zZXQocmV1c2VLZXksIHNwYXduUHJvbWlzZSlcbiAgICAgICAgfSBlbHNlIGlmICh3YWl0ZWRGb3JDYXBhY2l0eVJlc2VydmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5yZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkgJiYgc3Bhd25Qcm9taXNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZW50cnkgPSBhd2FpdCBzcGF3blByb21pc2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmdldChyZXVzZUtleSkgPT09IHNwYXduUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmRlbGV0ZShyZXVzZUtleSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFlbnRyeSkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2UgY29ubmVjdGlvbiBlbnRyeSB3YXMgbm90IGNyZWF0ZWRcIilcblxuICAgIGlmIChyZXRhaW4pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzQ29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvblxuXG4gICAgICBlbnRyeS5yZXRhaW5lZCA9IHRydWVcbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGVudHJ5LmNvbm5lY3Rpb25cblxuICAgICAgaWYgKHByZXZpb3VzQ29ubmVjdGlvbiAmJiBwcmV2aW91c0Nvbm5lY3Rpb24gIT09IGVudHJ5LmNvbm5lY3Rpb24pIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFbnRyeSA9IHRoaXMuZW50cnlGb3JDb25uZWN0aW9uKHByZXZpb3VzQ29ubmVjdGlvbilcblxuICAgICAgICBpZiAocHJldmlvdXNFbnRyeSkge1xuICAgICAgICAgIHByZXZpb3VzRW50cnkucmV0YWluZWQgPSBmYWxzZVxuICAgICAgICAgIGlmIChwcmV2aW91c0VudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPT09IDAgJiYgIXByZXZpb3VzRW50cnkubGlmZWN5Y2xlUmV0YWluZWQpIGF3YWl0IHRoaXMucmVtb3ZlQW5kQ2xvc2VFbnRyeShwcmV2aW91c0VudHJ5KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW50cnkuY2hlY2tvdXROYW1lcy5wdXNoKG9wdGlvbnMubmFtZSB8fCBcIlwiKVxuICAgIGF3YWl0IGVudHJ5LmNvbm5lY3Rpb24uc2V0Q29ubmVjdGlvbkNoZWNrb3V0TmFtZShvcHRpb25zLm5hbWUpXG4gICAgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCsrXG4gICAgdGhpcy5hY3RpdmVDaGVja291dENvdW50KytcblxuICAgIHJldHVybiBlbnRyeS5jb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjYXBhY2l0eSBleGlzdHMgZm9yIGFub3RoZXIgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIFJlcXVlc3RlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3tuYW1lPzogc3RyaW5nLCByZXVzZUtleTogc3RyaW5nfX0gb3B0aW9ucyAtIFBlbmRpbmcgY2hlY2tvdXQgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2FwYWNpdHkgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgYXN5bmMgcmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaWRsZUVudHJ5ID0gWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5hY3RpdmVDaGVja291dENvdW50ID09PSAwICYmICFlbnRyeS5saWZlY3ljbGVSZXRhaW5lZClcblxuICAgICAgaWYgKGlkbGVFbnRyeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUFuZENsb3NlRW50cnkoaWRsZUVudHJ5KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JDYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHBvb2wgY2FwYWNpdHkgd2l0aCBub3JtYWwgdGltZW91dCBhbmQgY2xvc2VBbGwgb3duZXJzaGlwLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7e25hbWU/OiBzdHJpbmcsIHJldXNlS2V5OiBzdHJpbmd9fSBvcHRpb25zIC0gUGVuZGluZyBjaGVja291dCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgb24gYSBjYXBhY2l0eSBjaGFuZ2UuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ2FwYWNpdHkoZGF0YWJhc2VDb25maWd1cmF0aW9uLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGltZW91dE1pbGxpcyA9IHRoaXMuY2hlY2tvdXRUaW1lb3V0TWlsbGlzKGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBlbnF1ZXVlZEF0ID0gRGF0ZS5ub3coKVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCB0aW1lclxuICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgdGhpcy5jYXBhY2l0eVdhaXRlcnMuZGVsZXRlKGNhcGFjaXR5QXZhaWxhYmxlKVxuICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdDaGVja291dChwZW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgY2FwYWNpdHlBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50cnlSZXNlcnZlQ29ubmVjdGlvbkNhcGFjaXR5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHJldHVybiBmYWxzZVxuXG4gICAgICAgIGZpbmlzaCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICAvKiogQHR5cGUge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXR9ICovXG4gICAgICBjb25zdCBwZW5kaW5nID0ge1xuICAgICAgICBjaGVja291dE5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgZW5xdWV1ZWRBdCxcbiAgICAgICAgcmVqZWN0OiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBmaW5pc2goKVxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcbiAgICAgICAgcmV1c2VLZXk6IG9wdGlvbnMucmV1c2VLZXksXG4gICAgICAgIHRpbWVvdXRBdDogdGltZW91dE1pbGxpcyA9PT0gbnVsbCA/IG51bGwgOiBlbnF1ZXVlZEF0ICsgdGltZW91dE1pbGxpcyxcbiAgICAgICAgdGltZW91dE1pbGxpc1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBlbmRpbmdDaGVja291dHMucHVzaChwZW5kaW5nKVxuICAgICAgdGhpcy5jYXBhY2l0eVdhaXRlcnMuYWRkKGNhcGFjaXR5QXZhaWxhYmxlKVxuXG4gICAgICBpZiAodGltZW91dE1pbGxpcyAhPT0gbnVsbCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gY2hlY2tvdXQgYWZ0ZXIgJHt0aW1lb3V0TWlsbGlzfW1zLmApKVxuICAgICAgICB9LCB0aW1lb3V0TWlsbGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGNvbm5lY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnMgfCAoKGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD4pfSBvcHRpb25zT3JDYWxsYmFjayAtIE9wdGlvbnMgb3IgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KGFyZzogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IFtjYWxsYmFja10gLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENvbm5lY3Rpb24ob3B0aW9uc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zT3JDYWxsYmFjayA9PSBcImZ1bmN0aW9uXCIgPyB7fSA6IG9wdGlvbnNPckNhbGxiYWNrXG4gICAgY29uc3QgYWN0dWFsQ2FsbGJhY2sgPSB0eXBlb2Ygb3B0aW9uc09yQ2FsbGJhY2sgPT0gXCJmdW5jdGlvblwiID8gb3B0aW9uc09yQ2FsbGJhY2sgOiBjYWxsYmFja1xuXG4gICAgaWYgKCFhY3R1YWxDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwid2l0aENvbm5lY3Rpb24gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXQob3B0aW9ucylcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYWN0dWFsQ2FsbGJhY2soY29ubmVjdGlvbilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja2luKGNvbm5lY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkNhcHR1cmVkQ29ubmVjdGlvbigvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY2hlY2tvdXRGb3JDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWU6IFwiRnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBvcGVuXCJ9LCB7cmV0YWluOiBmYWxzZX0pXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJ5Rm9yQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgIGlmICghZW50cnkpIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIHRlbmFudCBTUUxpdGUgY29ubmVjdGlvbiBlbnRyeSBkaXNhcHBlYXJlZCBkdXJpbmcgb3BlblwiKVxuICAgIGVudHJ5LmxpZmVjeWNsZVJldGFpbmVkID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMuY2hlY2tpbihjb25uZWN0aW9uKVxuICB9XG5cbiAgYXN5bmMgZmx1c2hDYXB0dXJlZENvbm5lY3Rpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb25uZWN0aW9uRW50cmllcy5nZXQodGhpcy5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoZGF0YWJhc2VDb25maWd1cmF0aW9uKSlcbiAgICBpZiAoZW50cnkpIGF3YWl0IGVudHJ5LmNvbm5lY3Rpb24uZmx1c2hQZW5kaW5nV3JpdGVzKClcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2FwdHVyZWRDb25uZWN0aW9uKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG4gICAgaWYgKGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPiAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xvc2UgYW4gaW4tdXNlIGZyb250ZW5kIHRlbmFudCBTUUxpdGUgaGFuZGxlXCIpXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVBbmRDbG9zZUVudHJ5KGVudHJ5KVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQ2FwdHVyZWREYXRhYmFzZSgvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gKi8gZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNhcHR1cmVkQ29ubmVjdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgRHJpdmVyQ2xhc3MgPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24uZHJpdmVyIHx8IHRoaXMuZHJpdmVyQ2xhc3NcbiAgICBpZiAoIURyaXZlckNsYXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkcml2ZXIgY2xhc3MgY29uZmlndXJlZCBmb3IgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBkZWxldGlvblwiKVxuICAgIGNvbnN0IGRyaXZlciA9IG5ldyBEcml2ZXJDbGFzcyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBhd2FpdCBkcml2ZXIuZGVsZXRlRGF0YWJhc2VTdG9yYWdlKClcbiAgfVxuXG4gIGNhcHR1cmVkQ29ubmVjdGlvbkluVXNlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgcmV0dXJuIEJvb2xlYW4oZW50cnkgJiYgZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA+IDApXG4gIH1cblxuICBjYXB0dXJlZENvbm5lY3Rpb25IYXNQZW5kaW5nV3JpdGVzKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAqLyBkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuZ2V0KHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbikpXG4gICAgcmV0dXJuIEJvb2xlYW4oZW50cnk/LmNvbm5lY3Rpb24uaGFzUGVuZGluZ1dyaXRlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBsZWdhY3kgYW1iaWVudCBvcGVyYXRpb24gdW5kZXIgb25lIHBvb2wtd2lkZSBGSUZPIGxlYXNlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5Db25uZWN0aW9uQ2hlY2tvdXRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tvdXQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQsIG93bmVyOiBzeW1ib2wpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhPcGVyYXRpb25Db25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcHJldmlvdXNMZWFzZSA9IHRoaXMub3BlcmF0aW9uTGVhc2VRdWV1ZVxuICAgIGxldCByZWxlYXNlUXVldWUgPSAoKSA9PiB7fVxuICAgIGNvbnN0IHF1ZXVlVHVybiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2VRdWV1ZSA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuXG4gICAgdGhpcy5vcGVyYXRpb25MZWFzZVF1ZXVlID0gcHJldmlvdXNMZWFzZS50aGVuKGFzeW5jICgpID0+IGF3YWl0IHF1ZXVlVHVybilcbiAgICBhd2FpdCBwcmV2aW91c0xlYXNlXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuT3duZWRPcGVyYXRpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uLCBvcHRpb25zLCB7cmV0YWluOiB0cnVlfSwgY2FsbGJhY2spXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VRdWV1ZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYXB0dXJlZCBvcGVyYXRpb24gdW5kZXIgYSBGSUZPIGxlYXNlIHNjb3BlZCBvbmx5IHRvIGl0cyBwaHlzaWNhbFxuICAgKiBkYXRhYmFzZSBpZGVudGl0eSwgc28gdW5yZWxhdGVkIHRlbmFudCBkYXRhYmFzZXMgcmVtYWluIGNvbmN1cnJlbnQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNhcHR1cmVkQ29ubmVjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBDYXB0dXJlZCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgb3duZXI6IHN5bWJvbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aENhcHR1cmVkT3BlcmF0aW9uQ29ubmVjdGlvbih7ZGF0YWJhc2VDb25maWd1cmF0aW9uLCBuYW1lfSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXVzZUtleSA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KGRhdGFiYXNlQ29uZmlndXJhdGlvbilcbiAgICBjb25zdCBwcmV2aW91c1R1cm4gPSB0aGlzLmNhcHR1cmVkT3BlcmF0aW9uUXVldWVzLmdldChyZXVzZUtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICBsZXQgcmVsZWFzZVR1cm4gPSAoKSA9PiB7fVxuICAgIGNvbnN0IHR1cm4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlVHVybiA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICAgIGNvbnN0IHF1ZXVlVGFpbCA9IHByZXZpb3VzVHVybi50aGVuKGFzeW5jICgpID0+IGF3YWl0IHR1cm4pXG4gICAgY29uc3Qgd2FzUXVldWVkID0gdGhpcy5jYXB0dXJlZE9wZXJhdGlvblF1ZXVlcy5oYXMocmV1c2VLZXkpXG4gICAgY29uc3QgcGVuZGluZyA9IHdhc1F1ZXVlZCA/IHRoaXMuYWRkT3BlcmF0aW9uUGVuZGluZ0NoZWNrb3V0KGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWUsIHJldXNlS2V5fSkgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuY2FwdHVyZWRPcGVyYXRpb25RdWV1ZXMuc2V0KHJldXNlS2V5LCBxdWV1ZVRhaWwpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT3BlcmF0aW9uVHVybihwcmV2aW91c1R1cm4sIHBlbmRpbmcpXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk93bmVkT3BlcmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwge25hbWV9LCB7cmV0YWluOiBmYWxzZX0sIGNhbGxiYWNrKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocGVuZGluZykgdGhpcy5yZW1vdmVQZW5kaW5nQ2hlY2tvdXQocGVuZGluZylcbiAgICAgIHJlbGVhc2VUdXJuKClcbiAgICAgIHZvaWQgcXVldWVUYWlsLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYXB0dXJlZE9wZXJhdGlvblF1ZXVlcy5nZXQocmV1c2VLZXkpID09PSBxdWV1ZVRhaWwpIHRoaXMuY2FwdHVyZWRPcGVyYXRpb25RdWV1ZXMuZGVsZXRlKHJldXNlS2V5KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgY2FsbGJhY2sgd2l0aCBhbiBpbnN0YWxsZWQgZHJpdmVyIG9wZXJhdGlvbiBsZWFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9IGRhdGFiYXNlQ29uZmlndXJhdGlvbiAtIFBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbm5lY3Rpb25DaGVja291dE9wdGlvbnN9IG9wdGlvbnMgLSBDaGVja291dCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3tyZXRhaW46IGJvb2xlYW59fSBjaGVja291dEFyZ3MgLSBDaGVja291dCByZXRlbnRpb24uXG4gICAqIEBwYXJhbSB7KGNvbm5lY3Rpb246IGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCBvd25lcjogc3ltYm9sKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5Pd25lZE9wZXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMsIGNoZWNrb3V0QXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBvd25lciA9IFN5bWJvbChcInNpbmdsZS1wb29sLW9wZXJhdGlvbi1vd25lclwiKVxuICAgIGNvbnN0IG9wZXJhdGlvbkxlYXNlID0gbmV3IE9wZXJhdGlvbkxlYXNlKG93bmVyKVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNoZWNrb3V0Rm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIG9wdGlvbnMsIGNoZWNrb3V0QXJncylcbiAgICBsZXQgb3BlcmF0aW9uTGVhc2VJbnN0YWxsZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2V0T3BlcmF0aW9uTGVhc2Uob3BlcmF0aW9uTGVhc2UpXG4gICAgICBvcGVyYXRpb25MZWFzZUluc3RhbGxlZCA9IHRydWVcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24sIG93bmVyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBvcGVyYXRpb25MZWFzZS5yZWxlYXNlKClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wZXJhdGlvbkxlYXNlSW5zdGFsbGVkKSBjb25uZWN0aW9uLmNsZWFyT3BlcmF0aW9uTGVhc2Uob3BlcmF0aW9uTGVhc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNraW4oY29ubmVjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgc2FtZS1waHlzaWNhbC1kYXRhYmFzZSBvcGVyYXRpb24gcXVldWUgdHVybi5cbiAgICogQHBhcmFtIHtQcm9taXNlPHZvaWQ+fSBwcmV2aW91c1R1cm4gLSBQcmV2aW91cyBxdWV1ZSB0YWlsLlxuICAgKiBAcGFyYW0ge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXQgfCB1bmRlZmluZWR9IHBlbmRpbmcgLSBQZW5kaW5nIGRlYnVnIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBwcmV2aW91cyB0dXJuIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck9wZXJhdGlvblR1cm4ocHJldmlvdXNUdXJuLCBwZW5kaW5nKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBhd2FpdCBwcmV2aW91c1R1cm5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwZW5kaW5nLnRpbWVvdXRNaWxsaXMgPT09IG51bGwpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcHJldmlvdXNUdXJuLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgICBwZW5kaW5nLmNsb3NlUHJvbWlzZT8uY2F0Y2gocmVqZWN0KVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXRNaWxsaXMgPSBwZW5kaW5nLnRpbWVvdXRNaWxsaXNcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbiBjaGVja291dCBhZnRlciAke3RpbWVvdXRNaWxsaXN9bXMuYCkpLCB0aW1lb3V0TWlsbGlzKVxuXG4gICAgICBwcmV2aW91c1R1cm4udGhlbigoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9KVxuICAgICAgcGVuZGluZy5jbG9zZVByb21pc2U/LmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGhvdXQgY3VycmVudCBjb25uZWN0aW9uIGNvbnRleHQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gVH0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1R9IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgd2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dChjYWxsYmFjaykge1xuICAgIHRoaXMuc3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0Q291bnQgKz0gMVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKClcblxuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKHJlc3VsdC5maW5hbGx5KCgpID0+IHsgdGhpcy5zdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCAtPSAxIH0pKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnN1cHByZXNzZWRDb25uZWN0aW9uQ29udGV4dENvdW50IC09IDFcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zdXBwcmVzc2VkQ29ubmVjdGlvbkNvbnRleHRDb3VudCAtPSAxXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGVhcnMgc2NoZW1hIG1ldGFkYXRhIG9uIGV2ZXJ5IGxpdmUgcGh5c2ljYWwgY29ubmVjdGlvbi4gKi9cbiAgY2xlYXJTY2hlbWFDYWNoZSgpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCkpIHRoaXMuX2NsZWFyQ29ubmVjdGlvblNjaGVtYUNhY2hlKGVudHJ5LmNvbm5lY3Rpb24pXG4gIH1cblxuICAvKiogQ2xvc2VzIGV2ZXJ5IHBvb2wtb3duZWQgY29ubmVjdGlvbiBhbmQgcmVqZWN0cyBxdWV1ZWQgY2FwYWNpdHkgcmVxdWVzdHMuICovXG4gIGFzeW5jIGNsb3NlQWxsKCkge1xuICAgIGNvbnN0IGNsb3NlRXJyb3IgPSBuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIilcblxuICAgIHRoaXMuY2xvc2VHZW5lcmF0aW9uKytcblxuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiBbLi4udGhpcy5wZW5kaW5nQ2hlY2tvdXRzXSkgcGVuZGluZy5yZWplY3QoY2xvc2VFcnJvcilcbiAgICB0aGlzLm5vdGlmeUNhcGFjaXR5V2FpdGVycygpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyeVNwYXduUHJvbWlzZXMudmFsdWVzKCldKVxuXG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXVxuXG4gICAgdGhpcy5jb25uZWN0aW9uRW50cmllcy5jbGVhcigpXG4gICAgdGhpcy5jb25uZWN0aW9uRW50cnlTcGF3blByb21pc2VzLmNsZWFyKClcbiAgICB0aGlzLnRlc3RTaGFyZWRDb25uZWN0aW9uc0J5UmV1c2VLZXkuY2xlYXIoKVxuICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRDb3VudCA9IDBcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgYXdhaXQgZW50cnkuY29ubmVjdGlvbi5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbXV0YWJsZSBhbWJpZW50IGZhbGxiYWNrIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBNdXRhYmxlIGFtYmllbnQgZmFsbGJhY2sgY29ubmVjdGlvbi5cbiAgICovXG4gIGdldEN1cnJlbnRDb25uZWN0aW9uKCkge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbm5lY3Rpb24gaGFzbid0IGJlZW4gbWFkZSB5ZXRcIilcblxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYXR0ZW1wdC1vd25lZCBjb25uZWN0aW9uIGZvciBleGFjdGx5IG9uZSBwaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQXR0ZW1wdC1vd25lZCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBSZXNvbHZlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLlRlc3RTaGFyZWRDb25uZWN0aW9uUmVnaXN0cmF0aW9ufSAtIE9wYXF1ZSByZWdpc3RyYXRpb24gaGFuZGxlLlxuICAgKi9cbiAgc2V0VGVzdFNoYXJlZENvbm5lY3Rpb25Gb3JDb25maWd1cmF0aW9uKGNvbm5lY3Rpb24sIHJldXNlS2V5KSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0ge293bmVyOiBTeW1ib2woXCJ0ZXN0LXNoYXJlZC1waHlzaWNhbC1jb25uZWN0aW9uXCIpfVxuXG4gICAgdGhpcy50ZXN0U2hhcmVkQ29ubmVjdGlvbnNCeVJldXNlS2V5LnNldChyZXVzZUtleSwge2Nvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbn0pXG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbiBhdHRlbXB0LW93bmVkIHNoYXJlZCBwaHlzaWNhbCBjb25uZWN0aW9uIHdpdGhvdXQgcmV2b2tpbmcgYSBuZXdlciBvd25lci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVGVzdFNoYXJlZENvbm5lY3Rpb25SZWdpc3RyYXRpb259IFtyZWdpc3RyYXRpb25dIC0gUmVnaXN0cmF0aW9uIHRvIGNsZWFyIGNvbmRpdGlvbmFsbHkuXG4gICAqL1xuICBjbGVhclRlc3RTaGFyZWRDb25uZWN0aW9uKHJlZ2lzdHJhdGlvbikge1xuICAgIGlmICghcmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aGlzLnRlc3RTaGFyZWRDb25uZWN0aW9uc0J5UmV1c2VLZXkuY2xlYXIoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcmV1c2VLZXksIGVudHJ5XSBvZiB0aGlzLnRlc3RTaGFyZWRDb25uZWN0aW9uc0J5UmV1c2VLZXkpIHtcbiAgICAgIGlmIChlbnRyeS5yZWdpc3RyYXRpb24gIT09IHJlZ2lzdHJhdGlvbikgY29udGludWVcbiAgICAgIHRoaXMudGVzdFNoYXJlZENvbm5lY3Rpb25zQnlSZXVzZUtleS5kZWxldGUocmV1c2VLZXkpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGF0dGVtcHQtb3duZWQgY29ubmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFNoYXJlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgdGVzdFNoYXJlZENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgcmV1c2VLZXkgPSB0aGlzLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleSgpXG5cbiAgICByZXR1cm4gdGhpcy50ZXN0U2hhcmVkQ29ubmVjdGlvbnNCeVJldXNlS2V5LmdldChyZXVzZUtleSk/LmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRleHQgZmFsbGJhY2sgY29ubmVjdGlvbiB3aGVuIGl0IGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gQ3VycmVudCBmYWxsYmFjayBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0Q3VycmVudENvbnRleHRDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN1cHByZXNzZWRDb25uZWN0aW9uQ29udGV4dENvdW50ID4gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHRoaXMudGVzdFNoYXJlZENvbm5lY3Rpb24oKSB8fCB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgZmFsbGJhY2sgY29udGV4dCBpcyBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZmFsbGJhY2sgY29udGV4dCBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBoYXNDdXJyZW50Q29ubmVjdGlvbkNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcHJlc3NlZENvbm5lY3Rpb25Db250ZXh0Q291bnQgPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBvb2wgZGlhZ25vc3RpY3MgZm9yIHJldGFpbmVkIGFuZCB0ZW1wb3Jhcnkga2V5ZWQgY29ubmVjdGlvbnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuRGF0YWJhc2VQb29sRGVidWdTbmFwc2hvdH0gLSBQb29sIGRpYWdub3N0aWNzLlxuICAgKi9cbiAgZ2V0RGVidWdTbmFwc2hvdCgpIHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXS5tYXAoKGVudHJ5KSA9PiB0aGlzLmRlYnVnQ29ubmVjdGlvblNuYXBzaG90KGVudHJ5LmNvbm5lY3Rpb24sIHtcbiAgICAgIGFjdGl2ZUNoZWNrb3V0Q291bnQ6IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQsXG4gICAgICBzdGF0ZTogZW50cnkucmV0YWluZWQgPyBcInNoYXJlZFwiIDogZW50cnkuYWN0aXZlQ2hlY2tvdXRDb3VudCA+IDAgPyBcImluLXVzZVwiIDogZW50cnkubGlmZWN5Y2xlUmV0YWluZWQgPyBcImxpZmVjeWNsZS1yZXRhaW5lZFwiIDogXCJpZGxlXCJcbiAgICB9KSlcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVidWdTbmFwc2hvdCgpLFxuICAgICAgY29ubmVjdGlvbnMsXG4gICAgICBjb25uZWN0aW9uc0JlaW5nU3Bhd25lZDogdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCxcbiAgICAgIGlkbGVDb3VudDogWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmFjdGl2ZUNoZWNrb3V0Q291bnQgPT09IDApLmxlbmd0aCxcbiAgICAgIGluVXNlQ291bnQ6IFsuLi50aGlzLmNvbm5lY3Rpb25FbnRyaWVzLnZhbHVlcygpXS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5hY3RpdmVDaGVja291dENvdW50ID4gMCkubGVuZ3RoLFxuICAgICAgcGVuZGluZ0NoZWNrb3V0czogdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLm1hcCgocGVuZGluZywgaW5kZXgpID0+ICh7XG4gICAgICAgIGNoZWNrb3V0TmFtZTogcGVuZGluZy5jaGVja291dE5hbWUsXG4gICAgICAgIGVucXVldWVkQXQ6IHBlbmRpbmcuZW5xdWV1ZWRBdCxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHJlbWFpbmluZ1RpbWVvdXRNczogcGVuZGluZy50aW1lb3V0QXQgPT09IG51bGwgPyBudWxsIDogTWF0aC5tYXgoMCwgcGVuZGluZy50aW1lb3V0QXQgLSBub3cpLFxuICAgICAgICByZXVzZUtleTogcGVuZGluZy5yZXVzZUtleSxcbiAgICAgICAgdGltZW91dEF0OiBwZW5kaW5nLnRpbWVvdXRBdCxcbiAgICAgICAgdGltZW91dE1pbGxpczogcGVuZGluZy50aW1lb3V0TWlsbGlzLFxuICAgICAgICB3YWl0aW5nRm9yTXM6IE1hdGgubWF4KDAsIG5vdyAtIHBlbmRpbmcuZW5xdWV1ZWRBdClcbiAgICAgIH0pKSxcbiAgICAgIHBlbmRpbmdDaGVja291dENvdW50OiB0aGlzLnBlbmRpbmdDaGVja291dHMubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQgY29ubmVjdGlvbiBtYXhpbXVtLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ29uZmlndXJlZCBjb25uZWN0aW9uIG1heGltdW0uXG4gICAqL1xuICBtYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFiYXNlQ29uZmlndXJhdGlvbi5wb29sPy5tYXhcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMSkgcmV0dXJuIHZhbHVlXG5cbiAgICByZXR1cm4gREVGQVVMVF9NQVhfQ09OTkVDVElPTlNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBDb25maWd1cmVkIGNoZWNrb3V0IHRpbWVvdXQuXG4gICAqL1xuICBjaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ucG9vbD8uY2hlY2tvdXRUaW1lb3V0TWlsbGlzXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDApIHJldHVybiB2YWx1ZVxuXG4gICAgcmV0dXJuIERFRkFVTFRfQ0hFQ0tPVVRfVElNRU9VVF9NSUxMSVNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYW5vdGhlciBwaHlzaWNhbCBjb25uZWN0aW9uIG1heSBiZSBzcGF3bmVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbm90aGVyIHBoeXNpY2FsIGNvbm5lY3Rpb24gbWF5IGJlIHNwYXduZWQuXG4gICAqL1xuICBjYW5TcGF3bkNvbm5lY3Rpb24oZGF0YWJhc2VDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhDb25uZWN0aW9ucyhkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG5cbiAgICByZXR1cm4gbWF4ID09PSBudWxsIHx8IHRoaXMuY29ubmVjdGlvbkVudHJpZXMuc2l6ZSArIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQgPCBtYXhcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGNsYWltcyBvbmUgY29ubmVjdGlvbiBzbG90IHdpdGhvdXQgeWllbGRpbmcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uIHdob3NlIG1heGltdW0gYXBwbGllcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhIHNsb3Qgd2FzIHJlc2VydmVkLlxuICAgKi9cbiAgdHJ5UmVzZXJ2ZUNvbm5lY3Rpb25DYXBhY2l0eShkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuY2FuU3Bhd25Db25uZWN0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5jb25uZWN0aW9uc0JlaW5nU3Bhd25lZCsrXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIFJlbGVhc2VzIG9uZSBwcmV2aW91c2x5IGNsYWltZWQgY29ubmVjdGlvbiBzbG90LiAqL1xuICByZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVsZWFzZSBhbiB1bnJlc2VydmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2xvdFwiKVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnNCZWluZ1NwYXduZWQtLVxuICAgIHRoaXMubm90aWZ5Q2FwYWNpdHlXYWl0ZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYW5kIHRyYWNrcyBhIHBoeXNpY2FsIGNvbm5lY3Rpb24gZW50cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBQaHlzaWNhbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV1c2VLZXkgLSBQaHlzaWNhbCByZXVzZSBrZXkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjbG9zZUdlbmVyYXRpb24gLSBQb29sIGxpZmVjeWNsZSBnZW5lcmF0aW9uIGF0IHNwYXduIHN0YXJ0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5Pn0gLSBOZXcgZW50cnkuXG4gICAqL1xuICBhc3luYyBzcGF3bkNvbm5lY3Rpb25FbnRyeShkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHJldXNlS2V5LCBjbG9zZUdlbmVyYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuc3Bhd25Db25uZWN0aW9uRm9yQ29uZmlndXJhdGlvbihkYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG5cbiAgICAgIGlmICh0aGlzLmNsb3NlR2VuZXJhdGlvbiAhPT0gY2xvc2VHZW5lcmF0aW9uKSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYmFzZSBwb29sIHdhcyBjbG9zZWQgYmVmb3JlIGNoZWNrb3V0IGNvbXBsZXRlZC5cIilcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5fSAqL1xuICAgICAgY29uc3QgZW50cnkgPSB7YWN0aXZlQ2hlY2tvdXRDb3VudDogMCwgY2hlY2tvdXROYW1lczogW10sIGNvbm5lY3Rpb24sIGxpZmVjeWNsZVJldGFpbmVkOiBmYWxzZSwgcmV0YWluZWQ6IGZhbHNlLCByZXVzZUtleX1cblxuICAgICAgdGhpcy5jb25uZWN0aW9uRW50cmllcy5zZXQocmV1c2VLZXksIGVudHJ5KVxuXG4gICAgICByZXR1cm4gZW50cnlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZWxlYXNlQ29ubmVjdGlvbkNhcGFjaXR5UmVzZXJ2YXRpb24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuZCBjbG9zZXMgYW4gZW50cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7U2luZ2xlUG9vbENvbm5lY3Rpb25FbnRyeSB8IHVuZGVmaW5lZH0gLSBFbnRyeSBvd25pbmcgYSBjb25uZWN0aW9uLlxuICAgKi9cbiAgZW50cnlGb3JDb25uZWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY29ubmVjdGlvbkVudHJpZXMudmFsdWVzKCldLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5jb25uZWN0aW9uID09PSBjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzYW1lLWtleSBvcGVyYXRpb24gcGVuZGluZyBlbnRyeS5cbiAgICogQHBhcmFtIHtTaW5nbGVQb29sQ29ubmVjdGlvbkVudHJ5fSBlbnRyeSAtIEVudHJ5IHRvIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBjbG9zZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUFuZENsb3NlRW50cnkoZW50cnkpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uRW50cmllcy5nZXQoZW50cnkucmV1c2VLZXkpICE9PSBlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLmNvbm5lY3Rpb25FbnRyaWVzLmRlbGV0ZShlbnRyeS5yZXVzZUtleSlcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uID09PSBlbnRyeS5jb25uZWN0aW9uKSB0aGlzLmNvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICBhd2FpdCBlbnRyeS5jb25uZWN0aW9uLmNsb3NlKClcbiAgICB0aGlzLm5vdGlmeUNhcGFjaXR5V2FpdGVycygpXG4gIH1cblxuICAvKiogV2FrZXMgYWxsIGNhcGFjaXR5IHdhaXRlcnMgdG8gcmUtY2hlY2sgdGhlIGJvdW5kZWQgcG9vbC4gKi9cbiAgbm90aWZ5Q2FwYWNpdHlXYWl0ZXJzKCkge1xuICAgIGZvciAoY29uc3QgcmVzZXJ2ZUFuZFJlc29sdmUgb2YgdGhpcy5jYXBhY2l0eVdhaXRlcnMpIHtcbiAgICAgIGlmIChyZXNlcnZlQW5kUmVzb2x2ZSgpKSByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHNhbWUta2V5IG9wZXJhdGlvbiBwZW5kaW5nIGVudHJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gZGF0YWJhc2VDb25maWd1cmF0aW9uIC0gUGh5c2ljYWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHt7bmFtZT86IHN0cmluZywgcmV1c2VLZXk6IHN0cmluZ319IG9wdGlvbnMgLSBQZW5kaW5nIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7U2luZ2xlUG9vbFBlbmRpbmdDaGVja291dH0gLSBBZGRlZCBzYW1lLWtleSBvcGVyYXRpb24gcGVuZGluZyBlbnRyeS5cbiAgICovXG4gIGFkZE9wZXJhdGlvblBlbmRpbmdDaGVja291dChkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIHtuYW1lLCByZXVzZUtleX0pIHtcbiAgICBjb25zdCB0aW1lb3V0TWlsbGlzID0gdGhpcy5jaGVja291dFRpbWVvdXRNaWxsaXMoZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGVucXVldWVkQXQgPSBEYXRlLm5vdygpXG4gICAgLyoqXG4gICAgICogUmVqZWN0cyB0aGUgY2xvc2Utb3duZWQgcHJvbWlzZS5cbiAgICAgKiBAdHlwZSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVqZWN0Q2xvc2UgPSAoKSA9PiB7fVxuICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZvaWQgcmVzb2x2ZVxuICAgICAgcmVqZWN0Q2xvc2UgPSByZWplY3RcbiAgICB9KVxuICAgIGNvbnN0IHBlbmRpbmcgPSB7XG4gICAgICBjaGVja291dE5hbWU6IG5hbWUsXG4gICAgICBjbG9zZVByb21pc2UsXG4gICAgICBlbnF1ZXVlZEF0LFxuICAgICAgcmVqZWN0OiByZWplY3RDbG9zZSxcbiAgICAgIHJldXNlS2V5LFxuICAgICAgdGltZW91dEF0OiB0aW1lb3V0TWlsbGlzID09PSBudWxsID8gbnVsbCA6IGVucXVldWVkQXQgKyB0aW1lb3V0TWlsbGlzLFxuICAgICAgdGltZW91dE1pbGxpc1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0cy5wdXNoKHBlbmRpbmcpXG5cbiAgICByZXR1cm4gcGVuZGluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBwZW5kaW5nIGNoZWNrb3V0IGRlYnVnIGVudHJ5LlxuICAgKiBAcGFyYW0ge1NpbmdsZVBvb2xQZW5kaW5nQ2hlY2tvdXR9IHBlbmRpbmcgLSBQZW5kaW5nIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlbW92ZVBlbmRpbmdDaGVja291dChwZW5kaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdDaGVja291dHMuaW5kZXhPZihwZW5kaW5nKVxuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy5wZW5kaW5nQ2hlY2tvdXRzLnNwbGljZShpbmRleCwgMSlcbiAgfVxufVxuIl19
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export type CoordinatorRegistration = {
|
|
2
|
+
coordinator: (callback: () => Promise<unknown>) => Promise<unknown>;
|
|
3
|
+
ownedQueue: Promise<void>;
|
|
4
|
+
owner: symbol;
|
|
5
|
+
};
|
|
1
6
|
/**
|
|
2
7
|
* Registers test-only serialization owned by the active broker.
|
|
3
8
|
* @param {object} connection - Parent physical connection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"AAEI,YAA2H,uBAAuB,GAAxI;IAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAyB;AA6BtJ;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAJ/C,MAI+C,EAAE,WAAW,EAH5D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGO,GAF1D,MAAM,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAJjD,MAIiD,EAAE,WAAW,EAH9D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGS,GAF5D,IAAI,CAIhB;AAED;;;;;;;GAOG;AACH,wBAAsB,qCAAqC,CAN9C,CAAC,EAM8C,UAAU,EAL3D,OAAO,6BAA6B,EAAE,OAKqB,EAAE,QAAQ,EAJrE,MAAM,OAAO,CAAC,CAAC,CAIsD,EAAE,cAAc,AAH7F,CACA,EADQ,MAGqF,GAFnF,OAAO,CAAC,CAAC,CAAC,CAiBtB"}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
/** @
|
|
2
|
+
/** @typedef {{coordinator: (callback: () => Promise<unknown>) => Promise<unknown>, ownedQueue: Promise<void>, owner: symbol}} CoordinatorRegistration */
|
|
3
|
+
/** @type {WeakMap<object, CoordinatorRegistration>} */
|
|
3
4
|
const coordinators = new WeakMap();
|
|
5
|
+
/**
|
|
6
|
+
* Serializes sibling work that inherited one coordinator owner without re-entering the broker queue.
|
|
7
|
+
* @template T
|
|
8
|
+
* @param {CoordinatorRegistration} registration - Physical connection registration.
|
|
9
|
+
* @param {() => Promise<T>} callback - Owned operation.
|
|
10
|
+
* @returns {Promise<T>} - Operation result.
|
|
11
|
+
*/
|
|
12
|
+
async function coordinateOwnedSharedTransactionConnection(registration, callback) {
|
|
13
|
+
const previous = registration.ownedQueue;
|
|
14
|
+
/**
|
|
15
|
+
* Releases the next owned sibling operation.
|
|
16
|
+
* @type {() => void}
|
|
17
|
+
*/
|
|
18
|
+
let release = () => { };
|
|
19
|
+
registration.ownedQueue = new Promise((resolve) => { release = resolve; });
|
|
20
|
+
await previous;
|
|
21
|
+
try {
|
|
22
|
+
return await callback();
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
release();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
4
28
|
/**
|
|
5
29
|
* Registers test-only serialization owned by the active broker.
|
|
6
30
|
* @param {object} connection - Parent physical connection.
|
|
@@ -9,7 +33,7 @@ const coordinators = new WeakMap();
|
|
|
9
33
|
*/
|
|
10
34
|
export function setSharedTransactionCoordinator(connection, coordinator) {
|
|
11
35
|
const owner = Symbol("shared-transaction-coordinator");
|
|
12
|
-
coordinators.set(connection, { coordinator, owner });
|
|
36
|
+
coordinators.set(connection, { coordinator, ownedQueue: Promise.resolve(), owner });
|
|
13
37
|
return owner;
|
|
14
38
|
}
|
|
15
39
|
/**
|
|
@@ -38,10 +62,10 @@ export async function coordinateSharedTransactionConnection(connection, callback
|
|
|
38
62
|
return await callback();
|
|
39
63
|
const environmentHandler = connection.configuration.getEnvironmentHandler();
|
|
40
64
|
if (environmentHandler.getSharedTransactionCoordinatorOwner(connection) === registration.owner) {
|
|
41
|
-
return await callback
|
|
65
|
+
return await coordinateOwnedSharedTransactionConnection(registration, callback);
|
|
42
66
|
}
|
|
43
67
|
return /** @type {T} */ (await registration.coordinator(async () => {
|
|
44
68
|
return await environmentHandler.runWithSharedTransactionCoordinatorOwner(connection, registration.owner, callback);
|
|
45
69
|
}));
|
|
46
70
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVoseUpBQXlKO0FBRXpKLHVEQUF1RDtBQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRWxDOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSwwQ0FBMEMsQ0FBQyxZQUFZLEVBQUUsUUFBUTtJQUM5RSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFBO0lBQ3hDOzs7T0FHRztJQUNILElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQTtJQUV0QixZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekUsTUFBTSxRQUFRLENBQUE7SUFDZCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUE7SUFDekIsQ0FBQztZQUFTLENBQUM7UUFDVCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsVUFBVSxFQUFFLFdBQVc7SUFDckUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUE7SUFFdEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQ2pGLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZFLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEtBQUssV0FBVztRQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDaEcsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFDQUFxQyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsY0FBYztJQUM5RixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRWpELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBQzFDLElBQUksY0FBYyxLQUFLLFlBQVksQ0FBQyxLQUFLO1FBQUUsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBRWxFLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO0lBRTNFLElBQUksa0JBQWtCLENBQUMsb0NBQW9DLENBQUMsVUFBVSxDQUFDLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9GLE9BQU8sTUFBTSwwQ0FBMEMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDakYsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakUsT0FBTyxNQUFNLGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BILENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7e2Nvb3JkaW5hdG9yOiAoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj4sIG93bmVkUXVldWU6IFByb21pc2U8dm9pZD4sIG93bmVyOiBzeW1ib2x9fSBDb29yZGluYXRvclJlZ2lzdHJhdGlvbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBDb29yZGluYXRvclJlZ2lzdHJhdGlvbj59ICovXG5jb25zdCBjb29yZGluYXRvcnMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogU2VyaWFsaXplcyBzaWJsaW5nIHdvcmsgdGhhdCBpbmhlcml0ZWQgb25lIGNvb3JkaW5hdG9yIG93bmVyIHdpdGhvdXQgcmUtZW50ZXJpbmcgdGhlIGJyb2tlciBxdWV1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdG9yUmVnaXN0cmF0aW9ufSByZWdpc3RyYXRpb24gLSBQaHlzaWNhbCBjb25uZWN0aW9uIHJlZ2lzdHJhdGlvbi5cbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPd25lZCBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb29yZGluYXRlT3duZWRTaGFyZWRUcmFuc2FjdGlvbkNvbm5lY3Rpb24ocmVnaXN0cmF0aW9uLCBjYWxsYmFjaykge1xuICBjb25zdCBwcmV2aW91cyA9IHJlZ2lzdHJhdGlvbi5vd25lZFF1ZXVlXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbmV4dCBvd25lZCBzaWJsaW5nIG9wZXJhdGlvbi5cbiAgICogQHR5cGUgeygpID0+IHZvaWR9XG4gICAqL1xuICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG5cbiAgcmVnaXN0cmF0aW9uLm93bmVkUXVldWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlID0gcmVzb2x2ZSB9KVxuICBhd2FpdCBwcmV2aW91c1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGVzdC1vbmx5IHNlcmlhbGl6YXRpb24gb3duZWQgYnkgdGhlIGFjdGl2ZSBicm9rZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8dW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj59IGNvb3JkaW5hdG9yIC0gU2VyaWFsaXplci5cbiAqIEByZXR1cm5zIHtzeW1ib2x9IC0gT3BhcXVlIG93bmVyIGZvciBicm9rZXItaW50ZXJuYWwgY29ubmVjdGlvbiBjYWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpIHtcbiAgY29uc3Qgb3duZXIgPSBTeW1ib2woXCJzaGFyZWQtdHJhbnNhY3Rpb24tY29vcmRpbmF0b3JcIilcblxuICBjb29yZGluYXRvcnMuc2V0KGNvbm5lY3Rpb24sIHtjb29yZGluYXRvciwgb3duZWRRdWV1ZTogUHJvbWlzZS5yZXNvbHZlKCksIG93bmVyfSlcbiAgcmV0dXJuIG93bmVyXG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGJyb2tlci1vd25lZCBjb29yZGluYXRvciB3aXRob3V0IGRpc3R1cmJpbmcgYSByZXBsYWNlbWVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGFyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0geyhjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx1bmtub3duPikgPT4gUHJvbWlzZTx1bmtub3duPn0gY29vcmRpbmF0b3IgLSBFeHBlY3RlZCBzZXJpYWxpemVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpIHtcbiAgaWYgKGNvb3JkaW5hdG9ycy5nZXQoY29ubmVjdGlvbik/LmNvb3JkaW5hdG9yID09PSBjb29yZGluYXRvcikgY29vcmRpbmF0b3JzLmRlbGV0ZShjb25uZWN0aW9uKVxufVxuXG4vKipcbiAqIFJ1bnMgcGFyZW50IHdvcmsgdGhyb3VnaCBicm9rZXIgc2VyaWFsaXphdGlvbiB3aGVuIHJlZ2lzdGVyZWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBhcmVudCBvcGVyYXRpb24uXG4gKiBAcGFyYW0ge3N5bWJvbH0gW29wZXJhdGlvbk93bmVyXSAtIEJyb2tlciBvd25lciBmb3IgYW4gYWxyZWFkeS1jb29yZGluYXRlZCBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29vcmRpbmF0ZVNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihjb25uZWN0aW9uLCBjYWxsYmFjaywgb3BlcmF0aW9uT3duZXIpIHtcbiAgY29uc3QgcmVnaXN0cmF0aW9uID0gY29vcmRpbmF0b3JzLmdldChjb25uZWN0aW9uKVxuXG4gIGlmICghcmVnaXN0cmF0aW9uKSByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICBpZiAob3BlcmF0aW9uT3duZXIgPT09IHJlZ2lzdHJhdGlvbi5vd25lcikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcblxuICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25uZWN0aW9uLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcblxuICBpZiAoZW52aXJvbm1lbnRIYW5kbGVyLmdldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3JPd25lcihjb25uZWN0aW9uKSA9PT0gcmVnaXN0cmF0aW9uLm93bmVyKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvb3JkaW5hdGVPd25lZFNoYXJlZFRyYW5zYWN0aW9uQ29ubmVjdGlvbihyZWdpc3RyYXRpb24sIGNhbGxiYWNrKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGF3YWl0IHJlZ2lzdHJhdGlvbi5jb29yZGluYXRvcihhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGVudmlyb25tZW50SGFuZGxlci5ydW5XaXRoU2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvck93bmVyKGNvbm5lY3Rpb24sIHJlZ2lzdHJhdGlvbi5vd25lciwgY2FsbGJhY2spXG4gIH0pKVxufVxuIl19
|
|
@@ -53,6 +53,13 @@ export type TestArgs = {
|
|
|
53
53
|
* - Test type identifier.
|
|
54
54
|
*/
|
|
55
55
|
type?: string;
|
|
56
|
+
/**
|
|
57
|
+
* - Registers one resolved tenant database transaction for this attempt.
|
|
58
|
+
*/
|
|
59
|
+
registerTransactionalTenant?: (args: {
|
|
60
|
+
databaseIdentifier: string;
|
|
61
|
+
tenant: object;
|
|
62
|
+
}) => Promise<void>;
|
|
56
63
|
};
|
|
57
64
|
export type TestData = {
|
|
58
65
|
/**
|
|
@@ -223,6 +230,43 @@ export type SharedTransactionBrokerRegistration = {
|
|
|
223
230
|
*/
|
|
224
231
|
previousEnvironment: string | undefined;
|
|
225
232
|
};
|
|
233
|
+
export type TransactionalTenantRegistration = {
|
|
234
|
+
/**
|
|
235
|
+
* - Attempt-owned physical checkout outcome.
|
|
236
|
+
*/
|
|
237
|
+
checkoutPromise?: Promise<{
|
|
238
|
+
connection: import("../database/drivers/base.js").default | undefined;
|
|
239
|
+
error: Error | undefined;
|
|
240
|
+
}> | undefined;
|
|
241
|
+
/**
|
|
242
|
+
* - Attempt-owned physical connection once checkout resolves.
|
|
243
|
+
*/
|
|
244
|
+
connection: import("../database/drivers/base.js").default | undefined;
|
|
245
|
+
/**
|
|
246
|
+
* - Single cleanup operation shared by emergency and eventual lifecycle cleanup.
|
|
247
|
+
*/
|
|
248
|
+
cleanupPromise?: Promise<void> | undefined;
|
|
249
|
+
/**
|
|
250
|
+
* - Whether timeout emergency cleanup must quarantine this connection.
|
|
251
|
+
*/
|
|
252
|
+
discardOnCleanup?: boolean | undefined;
|
|
253
|
+
/**
|
|
254
|
+
* - Owning logical pool.
|
|
255
|
+
*/
|
|
256
|
+
pool: import("../database/pool/base.js").default;
|
|
257
|
+
/**
|
|
258
|
+
* - Whether this attempt may still publish the physical registration.
|
|
259
|
+
*/
|
|
260
|
+
revoked: boolean;
|
|
261
|
+
/**
|
|
262
|
+
* - Resolved physical configuration identity.
|
|
263
|
+
*/
|
|
264
|
+
reuseKey: string;
|
|
265
|
+
/**
|
|
266
|
+
* - Physical-key shared registration once published.
|
|
267
|
+
*/
|
|
268
|
+
sharedRegistration: import("../database/pool/base.js").TestSharedConnectionRegistration | undefined;
|
|
269
|
+
};
|
|
226
270
|
export default class TestRunner {
|
|
227
271
|
_configuration: import("../configuration.js").default;
|
|
228
272
|
_excludeTags: string[];
|
|
@@ -445,6 +489,31 @@ export default class TestRunner {
|
|
|
445
489
|
pool: import("../database/pool/base.js").default;
|
|
446
490
|
registration: import("../database/pool/base.js").TestSharedConnectionRegistration;
|
|
447
491
|
}[]): void;
|
|
492
|
+
/**
|
|
493
|
+
* Checks out and registers one physical tenant transaction for the current attempt.
|
|
494
|
+
* @param {{databaseIdentifier: string, tenant: object}} args - Logical identifier and tenant descriptor.
|
|
495
|
+
* @param {TransactionalTenantRegistration[]} registrations - Current attempt registrations.
|
|
496
|
+
* @returns {Promise<void>}
|
|
497
|
+
*/
|
|
498
|
+
registerTransactionalTenant({ databaseIdentifier, tenant, ...restArgs }: {
|
|
499
|
+
databaseIdentifier: string;
|
|
500
|
+
tenant: object;
|
|
501
|
+
}, registrations: TransactionalTenantRegistration[]): Promise<void>;
|
|
502
|
+
/**
|
|
503
|
+
* Revokes attempt registrations before rolling back and releasing their connections.
|
|
504
|
+
* @param {TransactionalTenantRegistration[]} registrations - Attempt registrations.
|
|
505
|
+
* @param {{discard?: boolean}} [options] - Whether connections must be discarded instead of returned to the pool.
|
|
506
|
+
* @returns {Promise<void>}
|
|
507
|
+
*/
|
|
508
|
+
cleanupTransactionalTenants(registrations: TransactionalTenantRegistration[], { discard }?: {
|
|
509
|
+
discard?: boolean;
|
|
510
|
+
}): Promise<void>;
|
|
511
|
+
/**
|
|
512
|
+
* Cleans one attempt registration exactly once, including a checkout that was still pending at revocation.
|
|
513
|
+
* @param {TransactionalTenantRegistration} registration - Attempt-owned registration.
|
|
514
|
+
* @returns {Promise<void>} - Resolves after rollback and release or quarantine.
|
|
515
|
+
*/
|
|
516
|
+
cleanupTransactionalTenantRegistration(registration: TransactionalTenantRegistration): Promise<void>;
|
|
448
517
|
/**
|
|
449
518
|
* Selects the current non-tenant connections eligible for shared transaction work.
|
|
450
519
|
* @param {{transactionsOnly: boolean}} args - Selection options.
|
|
@@ -590,6 +659,12 @@ export default class TestRunner {
|
|
|
590
659
|
* @returns {void}
|
|
591
660
|
*/
|
|
592
661
|
recordAsyncCrash(kind: "uncaughtException" | "unhandledRejection", reason: unknown): void;
|
|
662
|
+
/**
|
|
663
|
+
* Records a rollback/discard failure that settled after timeout cleanup moved on.
|
|
664
|
+
* @param {unknown} reason - Detached cleanup rejection.
|
|
665
|
+
* @returns {void}
|
|
666
|
+
*/
|
|
667
|
+
recordTransactionalTenantCleanupFailure(reason: unknown): void;
|
|
593
668
|
run(): Promise<void>;
|
|
594
669
|
/**
|
|
595
670
|
* Runs run after alls for active scopes.
|