velocious 1.0.514 → 1.0.516
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 +4 -3
- package/build/background-jobs/cron-expression.js +9 -9
- package/build/background-jobs/forked-runner-child.js +1 -1
- package/build/background-jobs/job-runner.js +21 -15
- package/build/background-jobs/json-socket.js +4 -0
- package/build/background-jobs/main.js +180 -18
- package/build/background-jobs/status-reporter.js +12 -5
- package/build/background-jobs/store.js +132 -50
- package/build/background-jobs/types.js +11 -3
- package/build/background-jobs/worker.js +9 -5
- package/build/beacon/client.js +13 -6
- package/build/configuration.js +54 -29
- package/build/controller.js +9 -3
- package/build/database/drivers/sqlite/base.js +1 -1
- package/build/database/drivers/sqlite/index.js +15 -14
- package/build/database/migrations-ledger.js +16 -16
- package/build/database/pool/async-tracked-multi-connection.js +16 -0
- package/build/database/pool/base.js +26 -0
- package/build/database/query/where-model-class-hash.js +2 -0
- package/build/database/query/with-count.js +1 -1
- package/build/database/record/acts-as-list.js +2 -2
- package/build/database/record/auditing.js +23 -6
- package/build/database/record/index.js +7 -7
- package/build/database/record/validators/uniqueness.js +3 -3
- package/build/database/tenants/data-copier.js +23 -23
- package/build/database/tenants/schema-cloner.js +27 -27
- package/build/environment-handlers/browser.js +0 -1
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/build/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/build/environment-handlers/node.js +1 -1
- package/build/frontend-model-controller.js +26 -18
- package/build/frontend-model-resource/base-resource.js +4 -4
- package/build/frontend-models/base.js +5 -5
- package/build/frontend-models/query.js +12 -12
- package/build/http-server/client/index.js +61 -15
- package/build/http-server/client/request-runner.js +7 -1
- package/build/http-server/client/response.js +17 -1
- package/build/http-server/client/websocket-session.js +13 -13
- package/build/http-server/server-client.js +96 -0
- package/build/http-server/websocket-channel.js +12 -11
- package/build/http-server/websocket-connection.js +12 -11
- package/build/http-server/websocket-events-host.js +1 -1
- package/build/http-server/worker-handler/in-process.js +48 -9
- package/build/http-server/worker-handler/index.js +67 -7
- package/build/http-server/worker-handler/worker-thread.js +68 -0
- package/build/src/background-jobs/cron-expression.d.ts +2 -2
- package/build/src/background-jobs/cron-expression.js +10 -10
- package/build/src/background-jobs/forked-runner-child.js +2 -2
- package/build/src/background-jobs/job-runner.d.ts +5 -1
- package/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +22 -16
- package/build/src/background-jobs/json-socket.d.ts +4 -0
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +5 -1
- package/build/src/background-jobs/main.d.ts +62 -10
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +171 -19
- package/build/src/background-jobs/status-reporter.d.ts +6 -2
- package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.js +13 -6
- package/build/src/background-jobs/store.d.ts +48 -25
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +123 -50
- package/build/src/background-jobs/types.d.ts +36 -3
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +12 -4
- package/build/src/background-jobs/worker.d.ts +7 -5
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +10 -6
- package/build/src/beacon/client.d.ts +6 -3
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +14 -7
- package/build/src/configuration-types.d.ts +1 -1
- package/build/src/configuration.d.ts +42 -29
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +52 -30
- package/build/src/controller.d.ts +3 -0
- package/build/src/controller.d.ts.map +1 -1
- package/build/src/controller.js +9 -4
- package/build/src/database/drivers/sqlite/base.js +2 -2
- package/build/src/database/drivers/sqlite/index.d.ts +7 -6
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +16 -15
- package/build/src/database/migrations-ledger.d.ts +16 -16
- package/build/src/database/migrations-ledger.js +17 -17
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +0 -11
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +16 -1
- package/build/src/database/pool/base.d.ts +21 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +24 -1
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +3 -1
- package/build/src/database/query/with-count.js +2 -2
- package/build/src/database/record/acts-as-list.js +3 -3
- package/build/src/database/record/auditing.d.ts +1 -1
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +24 -7
- package/build/src/database/record/index.d.ts +7 -7
- package/build/src/database/record/index.js +8 -8
- package/build/src/database/record/validators/uniqueness.d.ts +3 -3
- package/build/src/database/record/validators/uniqueness.js +4 -4
- package/build/src/database/tenants/data-copier.d.ts +18 -18
- package/build/src/database/tenants/data-copier.js +24 -24
- package/build/src/database/tenants/schema-cloner.d.ts +27 -27
- package/build/src/database/tenants/schema-cloner.js +28 -28
- package/build/src/environment-handlers/browser.d.ts +9 -0
- package/build/src/environment-handlers/browser.d.ts.map +1 -1
- package/build/src/environment-handlers/browser.js +1 -2
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +3 -2
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +3 -3
- package/build/src/environment-handlers/node.js +2 -2
- package/build/src/frontend-model-controller.d.ts +9 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +26 -19
- package/build/src/frontend-model-resource/base-resource.js +5 -5
- package/build/src/frontend-models/base.d.ts +4 -4
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +6 -6
- package/build/src/frontend-models/query.d.ts +7 -7
- package/build/src/frontend-models/query.js +13 -13
- package/build/src/http-server/client/index.d.ts +23 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +55 -17
- package/build/src/http-server/client/request-runner.d.ts.map +1 -1
- package/build/src/http-server/client/request-runner.js +8 -2
- package/build/src/http-server/client/response.d.ts +11 -1
- package/build/src/http-server/client/response.d.ts.map +1 -1
- package/build/src/http-server/client/response.js +16 -2
- package/build/src/http-server/client/websocket-session.d.ts +13 -13
- package/build/src/http-server/client/websocket-session.js +14 -14
- package/build/src/http-server/server-client.d.ts +13 -0
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-client.js +94 -1
- package/build/src/http-server/websocket-channel.d.ts +12 -11
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +13 -12
- package/build/src/http-server/websocket-connection.d.ts +12 -11
- package/build/src/http-server/websocket-connection.d.ts.map +1 -1
- package/build/src/http-server/websocket-connection.js +13 -12
- package/build/src/http-server/websocket-events-host.d.ts +1 -1
- package/build/src/http-server/websocket-events-host.js +2 -2
- package/build/src/http-server/worker-handler/in-process.d.ts +2 -0
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +42 -11
- package/build/src/http-server/worker-handler/index.d.ts +21 -0
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +61 -7
- package/build/src/http-server/worker-handler/worker-thread.d.ts +30 -0
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +61 -1
- package/build/src/sync/device-identity.d.ts +2 -2
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/device-identity.js +4 -4
- package/build/src/sync/local-mutation-log.d.ts +0 -1
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +1 -2
- package/build/src/sync/query-scope.d.ts +5 -0
- package/build/src/sync/query-scope.d.ts.map +1 -1
- package/build/src/sync/query-scope.js +7 -2
- package/build/src/sync/sync-client-types.d.ts +2 -2
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +17 -2
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +28 -14
- package/build/src/sync/sync-realtime-bridge.d.ts +6 -2
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +14 -3
- package/build/src/sync/sync-resource-base.d.ts +14 -3
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +20 -4
- package/build/src/sync/sync-scope-store.d.ts +3 -3
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +7 -5
- package/build/src/sync/sync-websocket-channel.d.ts +10 -0
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
- package/build/src/sync/sync-websocket-channel.js +20 -3
- package/build/src/tenants/tenant-iterator.d.ts +8 -8
- package/build/src/tenants/tenant-iterator.js +9 -9
- package/build/src/tenants/tenant.d.ts +6 -6
- package/build/src/tenants/tenant.js +7 -7
- package/build/src/testing/test-runner.d.ts +16 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +79 -19
- package/build/sync/device-identity.js +3 -3
- package/build/sync/local-mutation-log.js +0 -1
- package/build/sync/query-scope.js +6 -1
- package/build/sync/sync-client-types.js +1 -1
- package/build/sync/sync-client.js +28 -15
- package/build/sync/sync-realtime-bridge.js +13 -2
- package/build/sync/sync-resource-base.js +20 -3
- package/build/sync/sync-scope-store.js +6 -4
- package/build/sync/sync-websocket-channel.js +18 -2
- package/build/tenants/tenant-iterator.js +8 -8
- package/build/tenants/tenant.js +6 -6
- package/build/testing/test-runner.js +86 -20
- package/package.json +2 -2
- package/src/background-jobs/cron-expression.js +9 -9
- package/src/background-jobs/forked-runner-child.js +1 -1
- package/src/background-jobs/job-runner.js +21 -15
- package/src/background-jobs/json-socket.js +4 -0
- package/src/background-jobs/main.js +180 -18
- package/src/background-jobs/status-reporter.js +12 -5
- package/src/background-jobs/store.js +132 -50
- package/src/background-jobs/types.js +11 -3
- package/src/background-jobs/worker.js +9 -5
- package/src/beacon/client.js +13 -6
- package/src/configuration.js +54 -29
- package/src/controller.js +9 -3
- package/src/database/drivers/sqlite/base.js +1 -1
- package/src/database/drivers/sqlite/index.js +15 -14
- package/src/database/migrations-ledger.js +16 -16
- package/src/database/pool/async-tracked-multi-connection.js +16 -0
- package/src/database/pool/base.js +26 -0
- package/src/database/query/where-model-class-hash.js +2 -0
- package/src/database/query/with-count.js +1 -1
- package/src/database/record/acts-as-list.js +2 -2
- package/src/database/record/auditing.js +23 -6
- package/src/database/record/index.js +7 -7
- package/src/database/record/validators/uniqueness.js +3 -3
- package/src/database/tenants/data-copier.js +23 -23
- package/src/database/tenants/schema-cloner.js +27 -27
- package/src/environment-handlers/browser.js +0 -1
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
- package/src/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
- package/src/environment-handlers/node.js +1 -1
- package/src/frontend-model-controller.js +26 -18
- package/src/frontend-model-resource/base-resource.js +4 -4
- package/src/frontend-models/base.js +5 -5
- package/src/frontend-models/query.js +12 -12
- package/src/http-server/client/index.js +61 -15
- package/src/http-server/client/request-runner.js +7 -1
- package/src/http-server/client/response.js +17 -1
- package/src/http-server/client/websocket-session.js +13 -13
- package/src/http-server/server-client.js +96 -0
- package/src/http-server/websocket-channel.js +12 -11
- package/src/http-server/websocket-connection.js +12 -11
- package/src/http-server/websocket-events-host.js +1 -1
- package/src/http-server/worker-handler/in-process.js +48 -9
- package/src/http-server/worker-handler/index.js +67 -7
- package/src/http-server/worker-handler/worker-thread.js +68 -0
- package/src/sync/device-identity.js +3 -3
- package/src/sync/local-mutation-log.js +0 -1
- package/src/sync/query-scope.js +6 -1
- package/src/sync/sync-client-types.js +1 -1
- package/src/sync/sync-client.js +28 -15
- package/src/sync/sync-realtime-bridge.js +13 -2
- package/src/sync/sync-resource-base.js +20 -3
- package/src/sync/sync-scope-store.js +6 -4
- package/src/sync/sync-websocket-channel.js +18 -2
- package/src/tenants/tenant-iterator.js +8 -8
- package/src/tenants/tenant.js +6 -6
- package/src/testing/test-runner.js +86 -20
|
@@ -60,7 +60,12 @@ let globalEventConnections = {};
|
|
|
60
60
|
*/
|
|
61
61
|
/** @type {AuditEventsType} */
|
|
62
62
|
const AuditEvents = {
|
|
63
|
-
/**
|
|
63
|
+
/**
|
|
64
|
+
* Fire all registered callbacks for a model type and action.
|
|
65
|
+
* @param {string} type - Audited model type whose listeners should fire.
|
|
66
|
+
* @param {string} action - Audit action whose listeners should fire.
|
|
67
|
+
* @param {AuditEventPayload} args - Audit event delivered to matching listeners.
|
|
68
|
+
*/
|
|
64
69
|
call(type, action, args) {
|
|
65
70
|
const actions = globalEventConnections[type] || {};
|
|
66
71
|
const callbacks = actions[action] || [];
|
|
@@ -68,7 +73,13 @@ const AuditEvents = {
|
|
|
68
73
|
callback(args);
|
|
69
74
|
}
|
|
70
75
|
},
|
|
71
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Register a callback for a model type and action.
|
|
78
|
+
* @param {string} type - Audited model type to observe.
|
|
79
|
+
* @param {string} action - Audit action to observe.
|
|
80
|
+
* @param {(args: AuditEventPayload) => void} callback - Listener invoked for matching audit events.
|
|
81
|
+
* @returns {() => void} - Callback that removes the registration.
|
|
82
|
+
*/
|
|
72
83
|
connect(type, action, callback) {
|
|
73
84
|
if (!globalEventConnections[type]) {
|
|
74
85
|
globalEventConnections[type] = {};
|
|
@@ -87,7 +98,7 @@ const AuditEvents = {
|
|
|
87
98
|
}
|
|
88
99
|
};
|
|
89
100
|
},
|
|
90
|
-
/** Clear all registered callbacks.
|
|
101
|
+
/** Clear all registered callbacks. */
|
|
91
102
|
reset() {
|
|
92
103
|
globalEventConnections = {};
|
|
93
104
|
}
|
|
@@ -197,7 +208,10 @@ function sharedAuditClass(modelClass) {
|
|
|
197
208
|
* Framework-owned Audit model for the shared `audits` table.
|
|
198
209
|
*/
|
|
199
210
|
class Audit extends dbRecordClass {
|
|
200
|
-
/**
|
|
211
|
+
/**
|
|
212
|
+
* Returns the backing table name.
|
|
213
|
+
* @returns {string} - Shared `audits` table name.
|
|
214
|
+
*/
|
|
201
215
|
static tableName() {
|
|
202
216
|
return "audits";
|
|
203
217
|
}
|
|
@@ -237,7 +251,10 @@ function dedicatedAuditClass(modelClass, tableName) {
|
|
|
237
251
|
* Framework-owned per-model Audit class.
|
|
238
252
|
*/
|
|
239
253
|
class ModelAudit extends dbRecordClass {
|
|
240
|
-
/**
|
|
254
|
+
/**
|
|
255
|
+
* Returns the backing table name.
|
|
256
|
+
* @returns {string} - Dedicated audit table supplied for this model class.
|
|
257
|
+
*/
|
|
241
258
|
static tableName() {
|
|
242
259
|
return tableName;
|
|
243
260
|
}
|
|
@@ -767,7 +784,7 @@ function normalizeAction(action) {
|
|
|
767
784
|
* Creates the shared audit tables migration up/down callbacks for use inside
|
|
768
785
|
* a Migration class. The `table` parameter is a Migration instance.
|
|
769
786
|
* @param {{id?: {type: string}}} [options] - ID column options.
|
|
770
|
-
* @returns {{down: (table: import("../migration/index.js").default) => Promise<void>, up: (table: import("../migration/index.js").default) => Promise<void>}}
|
|
787
|
+
* @returns {{down: (table: import("../migration/index.js").default) => Promise<void>, up: (table: import("../migration/index.js").default) => Promise<void>}} - Up/down callbacks for the shared audit tables.
|
|
771
788
|
*/
|
|
772
789
|
function createSharedAuditTablesMigration(options = {}) {
|
|
773
790
|
const opts = /** @type {{id?: {type: string}}} */ (options);
|
|
@@ -811,4 +828,4 @@ function dedicatedAuditTableNameForTable(modelTableName) {
|
|
|
811
828
|
return `${modelTableName}_audits`;
|
|
812
829
|
}
|
|
813
830
|
export { AuditEvents, captureCreateAuditChanges, captureUpdateAuditChanges, createAudit, createCreateAudit, createDestroyAudit, createUpdateAudit, createSharedAuditTablesMigration, dedicatedAuditTableNameForTable, initializeAuditedModelRelationships, initializeAuditing, registerAuditCallback, registerAuditing, withoutAudit };
|
|
814
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F1ZGl0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFFNUI7OztHQUdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSCxtQ0FBbUM7QUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRXJDLCtEQUErRDtBQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRWpDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVqRCw4RUFBOEU7QUFDOUUsd0RBQXdEO0FBQ3hELDhFQUE4RTtBQUU5RSx1RkFBdUY7QUFDdkYsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7QUFFL0I7Ozs7OztHQU1HO0FBRUgsOEJBQThCO0FBQzlCLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLDJJQUEySTtJQUMzSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXZDLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsNE1BQTRNO0lBQzVNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVE7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixD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QTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxHQUFHLGNBQWMsU0FBUyxDQUFBO0FBQ25DLENBQUM7QUFFRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGdDQUFnQyxFQUNoQywrQkFBK0IsRUFDL0IsbUNBQW1DLEVBQ25DLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDYixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBVVUlEIGZyb20gXCJwdXJlLXV1aWRcIlxuXG4vKipcbiAqIEF1ZGl0Q2hhbmdlcyB0eXBlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsID8+fSBBdWRpdENoYW5nZXNcbiAqL1xuXG4vKipcbiAqIEF1ZGl0RXZlbnRQYXlsb2FkIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdWRpdEV2ZW50UGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IGF1ZGl0SWQgLSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqIEBwcm9wZXJ0eSB7QXVkaXRDaGFuZ2VzIHwgbnVsbH0gYXVkaXRlZENoYW5nZXMgLSBDaGFuZ2VzIGNhcHR1cmVkIGZvciB0aGUgYXVkaXQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gcGFyYW1zIC0gT3B0aW9uYWwgY2FsbGVyLXN1cHBsaWVkIGF1ZGl0IHBhcmFtcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBBdWRpdGVkIHJlY29yZC5cbiAqL1xuXG4vKipcbiAqIEF1ZGl0Q2FsbGJhY2sgdHlwZS5cbiAqIEB0eXBlZGVmIHsocGF5bG9hZDogQXVkaXRFdmVudFBheWxvYWQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBBdWRpdENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVBdWRpdEFyZ3MgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZUF1ZGl0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtBdWRpdENoYW5nZXMgfCBudWxsfSBbYXVkaXRlZENoYW5nZXNdIC0gRXhwbGljaXQgY2hhbmdlcyB0byBwZXJzaXN0LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IFtwYXJhbXNdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gc3RvcmUgd2l0aCB0aGUgYXVkaXQuXG4gKi9cblxuLyoqXG4gKiBBdWRpdGVkTW9kZWxDbGFzcyB0eXBlLlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQgJiB7XG4gKiAgIF9hdWRpdENhbGxiYWNrcz86IFJlY29yZDxzdHJpbmcsIEF1ZGl0Q2FsbGJhY2tbXT4sXG4gKiAgIF9hdWRpdExpZmVjeWNsZUNhbGxiYWNrc1JlZ2lzdGVyZWQ/OiBib29sZWFuLFxuICogICBfYXVkaXRUYWJsZVJlc29sdmVkPzogYm9vbGVhbixcbiAqICAgX2F1ZGl0VGFibGVEYXRhPzogQXVkaXRUYWJsZURhdGFcbiAqIH19IEF1ZGl0ZWRNb2RlbENsYXNzXG4gKi9cblxuLyoqXG4gKiBBdWRpdFRhYmxlRGF0YSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQXVkaXRUYWJsZURhdGFcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVkaWNhdGVkIC0gV2hldGhlciBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBleGlzdHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFibGVOYW1lIC0gTmFtZSBvZiB0aGUgYXVkaXQgdGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9yZWlnbktleSAtIENvbHVtbiBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGUgYXVkaXRlZCBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXVkaXRDbGFzcyAtIFRoZSBhdWRpdCBtb2RlbCBjbGFzcyB0byB1c2UuXG4gKi9cblxuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBib29sZWFuPn0gKi9cbmNvbnN0IGRlZGljYXRlZFRhYmxlQ2FjaGUgPSBuZXcgTWFwKClcblxuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi9cbmNvbnN0IGF1ZGl0Q2xhc3NDYWNoZSA9IG5ldyBNYXAoKVxuXG5jb25zdCBnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMgPSBuZXcgV2Vha1NldCgpXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2xvYmFsIGV2ZW50IGJ1cyAobGlrZSBBY3RpdmVSZWNvcmRBdWRpdGFibGU6OkV2ZW50cylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEFycmF5PChhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZD4+Pn0gKi9cbmxldCBnbG9iYWxFdmVudENvbm5lY3Rpb25zID0ge31cblxuLyoqXG4gKiBHbG9iYWwgYXVkaXQgZXZlbnQgYnVzIG1hdGNoaW5nIEFjdGl2ZVJlY29yZEF1ZGl0YWJsZTo6RXZlbnRzLlxuICogQHR5cGVkZWYge29iamVjdH0gQXVkaXRFdmVudHNUeXBlXG4gKiBAcHJvcGVydHkgeyh0eXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gY2FsbCAtIEZpcmUgYWxsIGNhbGxiYWNrcyBmb3IgYSBtb2RlbCB0eXBlICsgYWN0aW9uLlxuICogQHByb3BlcnR5IHsodHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgY2FsbGJhY2s6IChhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZH0gY29ubmVjdCAtIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgbW9kZWwgdHlwZSArIGFjdGlvbi4gUmV0dXJucyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gcmVzZXQgLSBDbGVhciBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gKi9cblxuLyoqIEB0eXBlIHtBdWRpdEV2ZW50c1R5cGV9ICovXG5jb25zdCBBdWRpdEV2ZW50cyA9IHtcbiAgLyoqIEZpcmUgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIG1vZGVsIHR5cGUgKyBhY3Rpb24uIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gQHBhcmFtIHtBdWRpdEV2ZW50UGF5bG9hZH0gYXJncyAqL1xuICBjYWxsKHR5cGUsIGFjdGlvbiwgYXJncykge1xuICAgIGNvbnN0IGFjdGlvbnMgPSBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdIHx8IHt9XG4gICAgY29uc3QgY2FsbGJhY2tzID0gYWN0aW9uc1thY3Rpb25dIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIFsuLi5jYWxsYmFja3NdKSB7XG4gICAgICBjYWxsYmFjayhhcmdzKVxuICAgIH1cbiAgfSxcblxuICAvKiogUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBtb2RlbCB0eXBlICsgYWN0aW9uLiBSZXR1cm5zIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLiBAcGFyYW0ge3N0cmluZ30gdHlwZSBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIEBwYXJhbSB7KGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkfSBjYWxsYmFjayBAcmV0dXJucyB7KCkgPT4gdm9pZH0gKi9cbiAgY29ubmVjdCh0eXBlLCBhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV1bYWN0aW9uXSkge1xuICAgICAgZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXVthY3Rpb25dID0gW11cbiAgICB9XG5cbiAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdW2FjdGlvbl0ucHVzaChjYWxsYmFjaylcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXT8uW2FjdGlvbl1cblxuICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoY2FsbGJhY2spXG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKiogQ2xlYXIgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgcmVzZXQoKSB7XG4gICAgZ2xvYmFsRXZlbnRDb25uZWN0aW9ucyA9IHt9XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUYWJsZSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBlLmcuIFwicHJvamVjdF9hdWRpdHNcIiBmb3IgYSBcInByb2plY3RzXCIgdGFibGUuXG4gKi9cbmZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgdGFibGUgPSBtb2RlbENsYXNzLnRhYmxlTmFtZSgpXG5cbiAgaWYgKHRhYmxlLmVuZHNXaXRoKFwic1wiKSkge1xuICAgIHJldHVybiBgJHt0YWJsZS5zbGljZSgwLCAtMSl9X2F1ZGl0c2BcbiAgfVxuXG4gIHJldHVybiBgJHt0YWJsZX1fYXVkaXRzYFxufVxuXG4vKipcbiAqIFJlc29sdmVzIGF1ZGl0IHRhYmxlIGRhdGEgZm9yIGEgbW9kZWwgY2xhc3MuIENhY2hlZCBwZXIgbW9kZWwuXG4gKiBDYWxsZWQgbGF6aWx5IG9uIGZpcnN0IGNyZWF0ZUF1ZGl0IC8gd2l0aG91dEF1ZGl0IC8gcmVsYXRpb25zaGlwIHVzYWdlLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpdFRhYmxlRGF0YT59IFJlc29sdmVkIGF1ZGl0IHRhYmxlIG1ldGFkYXRhLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICBpZiAobW9kZWxDbGFzcy5fYXVkaXRUYWJsZVJlc29sdmVkICYmIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhKSB7XG4gICAgcmV0dXJuIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhXG4gIH1cblxuICBjb25zdCB0YWJsZURhdGEgPSBhd2FpdCBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKClcblxuICB0YWJsZURhdGEuYXVkaXRDbGFzcy5yZWdpc3RlclJlY29yZENsYXNzKHtjb25maWd1cmF0aW9ufSlcbiAgYXdhaXQgdGFibGVEYXRhLmF1ZGl0Q2xhc3MuaW5pdGlhbGl6ZVJlY29yZCh7Y29uZmlndXJhdGlvbn0pXG5cbiAgbW9kZWxDbGFzcy5fYXVkaXRUYWJsZURhdGEgPSB0YWJsZURhdGFcbiAgbW9kZWxDbGFzcy5fYXVkaXRUYWJsZVJlc29sdmVkID0gdHJ1ZVxuXG4gIHJlZ2lzdGVyQXVkaXRSZWxhdGlvbnNoaXAobW9kZWxDbGFzcywgdGFibGVEYXRhKVxuXG4gIHJldHVybiB0YWJsZURhdGFcbn1cblxuLyoqXG4gKiBCdWlsZHMgYXVkaXQgdGFibGUgbWV0YWRhdGEgZm9yIGEgbW9kZWwgY2xhc3MuIFByZWZlcnMgdGhlIGNvbnN1bWVyJ3NcbiAqIHJlZ2lzdGVyZWQgQXVkaXQgbW9kZWwgZm9yIHNoYXJlZCB0YWJsZXM7IGZhbGxzIGJhY2sgdG8gYSBmcmFtZXdvcmstb3duZWRcbiAqIGR5bmFtaWMgY2xhc3MuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF1ZGl0VGFibGVEYXRhPn0gQXVkaXQgdGFibGUgbWV0YWRhdGEuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICBjb25zdCBkZWRpY2F0ZWRUYWJsZSA9IGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lKG1vZGVsQ2xhc3MpXG4gIGNvbnN0IGRlZGljYXRlZEV4aXN0cyA9IGF3YWl0IGRlZGljYXRlZFRhYmxlRXhpc3RzRm9yQ29ubmVjdGlvbihtb2RlbENsYXNzLCBkZWRpY2F0ZWRUYWJsZSlcblxuICBpZiAoZGVkaWNhdGVkRXhpc3RzKSB7XG4gICAgY29uc3QgYXVkaXRDbGFzcyA9IGRlZGljYXRlZEF1ZGl0Q2xhc3MobW9kZWxDbGFzcywgZGVkaWNhdGVkVGFibGUpXG4gICAgY29uc3QgbW9kZWxLZXkgPSBtb2RlbFBhcmFtS2V5KG1vZGVsQ2xhc3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgYXVkaXRDbGFzcyxcbiAgICAgIGRlZGljYXRlZDogdHJ1ZSxcbiAgICAgIGZvcmVpZ25LZXk6IGAke21vZGVsS2V5fV9pZGAsXG4gICAgICB0YWJsZU5hbWU6IGRlZGljYXRlZFRhYmxlXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IG1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKVxuXG4gIGNvbnN0IGNvbnN1bWVyQXVkaXRDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKCkuQXVkaXRcblxuICBpZiAoY29uc3VtZXJBdWRpdENsYXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGl0Q2xhc3M6IGNvbnN1bWVyQXVkaXRDbGFzcyxcbiAgICAgIGRlZGljYXRlZDogZmFsc2UsXG4gICAgICBmb3JlaWduS2V5OiBcImF1ZGl0YWJsZV9pZFwiLFxuICAgICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdWRpdENsYXNzOiBjYWNoZWRTaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpLFxuICAgIGRlZGljYXRlZDogZmFsc2UsXG4gICAgZm9yZWlnbktleTogXCJhdWRpdGFibGVfaWRcIixcbiAgICB0YWJsZU5hbWU6IFwiYXVkaXRzXCJcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIGV4aXN0cyBmb3IgYSBtb2RlbCdzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSB0YWJsZSBleGlzdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlZGljYXRlZFRhYmxlRXhpc3RzRm9yQ29ubmVjdGlvbihtb2RlbENsYXNzLCB0YWJsZU5hbWUpIHtcbiAgY29uc3QgZGF0YWJhc2VJZGVudGlmaWVyID0gbW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoKVxuICBjb25zdCBjYWNoZUtleSA9IGAke2RhdGFiYXNlSWRlbnRpZmllcn06JHt0YWJsZU5hbWV9YFxuICBjb25zdCBjYWNoZWQgPSBkZWRpY2F0ZWRUYWJsZUNhY2hlLmdldChjYWNoZUtleSlcblxuICBpZiAodHlwZW9mIGNhY2hlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gY2FjaGVkXG4gIH1cblxuICBjb25zdCBjb25uZWN0aW9uID0gbW9kZWxDbGFzcy5jb25uZWN0aW9uKClcbiAgY29uc3QgdGFibGUgPSBhd2FpdCBjb25uZWN0aW9uLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSwge3Rocm93RXJyb3I6IGZhbHNlfSlcbiAgY29uc3QgZXhpc3RzID0gQm9vbGVhbih0YWJsZSlcblxuICBkZWRpY2F0ZWRUYWJsZUNhY2hlLnNldChjYWNoZUtleSwgZXhpc3RzKVxuXG4gIHJldHVybiBleGlzdHNcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEeW5hbWljIGF1ZGl0IGNsYXNzZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBmcmFtZXdvcmstb3duZWQgc2hhcmVkIEF1ZGl0IGNsYXNzIGZvciB0aGUgYGF1ZGl0c2AgdGFibGUuXG4gKiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIG5vIGNvbnN1bWVyLXJlZ2lzdGVyZWQgQXVkaXQgbW9kZWwgZXhpc3RzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEFueSBhdWRpdGVkIG1vZGVsIGNsYXNzICh1c2VkIHRvIGxvY2F0ZSBEYXRhYmFzZVJlY29yZCkuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gU2hhcmVkIEF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBzaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgZGJSZWNvcmRDbGFzcyA9IGZpbmREYXRhYmFzZVJlY29yZENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgLyoqXG4gICAqIEZyYW1ld29yay1vd25lZCBBdWRpdCBtb2RlbCBmb3IgdGhlIHNoYXJlZCBgYXVkaXRzYCB0YWJsZS5cbiAgICovXG4gIGNsYXNzIEF1ZGl0IGV4dGVuZHMgZGJSZWNvcmRDbGFzcyB7XG4gICAgLyoqIFJldHVybnMgdGhlIGJhY2tpbmcgdGFibGUgbmFtZS4gQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBzdGF0aWMgdGFibGVOYW1lKCkge1xuICAgICAgcmV0dXJuIFwiYXVkaXRzXCJcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXVkaXQsIFwibW9kZWxOYW1lXCIsIHt2YWx1ZTogXCJBdWRpdFwiLCB3cml0YWJsZTogZmFsc2V9KVxuICBhcHBseUF1ZGl0Q2xhc3NEYXRhYmFzZVJvdXRpbmcobW9kZWxDbGFzcywgQXVkaXQpXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKEF1ZGl0KVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlZCBmcmFtZXdvcmstb3duZWQgc2hhcmVkIEF1ZGl0IGNsYXNzIGZvciBhIGRhdGFiYXNlLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEFueSBhdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IFNoYXJlZCBBdWRpdCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSB7XG4gIGNvbnN0IHJvdXRpbmdLZXkgPSBtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKClcbiAgICA/IGB0ZW5hbnQ6JHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfWBcbiAgICA6IGBkYXRhYmFzZToke21vZGVsQ2xhc3MuZ2V0Q29uZmlndXJlZERhdGFiYXNlSWRlbnRpZmllcigpfWBcbiAgY29uc3QgY2FjaGVLZXkgPSBgc2hhcmVkOiR7cm91dGluZ0tleX1gXG4gIGxldCBhdWRpdENsYXNzID0gYXVkaXRDbGFzc0NhY2hlLmdldChjYWNoZUtleSlcblxuICBpZiAoIWF1ZGl0Q2xhc3MpIHtcbiAgICBhdWRpdENsYXNzID0gc2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKVxuICAgIGF1ZGl0Q2xhc3NDYWNoZS5zZXQoY2FjaGVLZXksIGF1ZGl0Q2xhc3MpXG4gIH1cblxuICByZXR1cm4gYXVkaXRDbGFzc1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkeW5hbWljIHBlci1tb2RlbCBhdWRpdCBjbGFzcyBmb3IgYSBkZWRpY2F0ZWQgdGFibGUuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RfYXVkaXRzXCIpLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IERlZGljYXRlZCBhdWRpdCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRDbGFzcyhtb2RlbENsYXNzLCB0YWJsZU5hbWUpIHtcbiAgY29uc3QgZGJSZWNvcmRDbGFzcyA9IGZpbmREYXRhYmFzZVJlY29yZENsYXNzKG1vZGVsQ2xhc3MpXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgY29uc3QgbW9kZWxLZXkgPSBtb2RlbFBhcmFtS2V5KG1vZGVsQ2xhc3MpXG5cbiAgLyoqXG4gICAqIEZyYW1ld29yay1vd25lZCBwZXItbW9kZWwgQXVkaXQgY2xhc3MuXG4gICAqL1xuICBjbGFzcyBNb2RlbEF1ZGl0IGV4dGVuZHMgZGJSZWNvcmRDbGFzcyB7XG4gICAgLyoqIFJldHVybnMgdGhlIGJhY2tpbmcgdGFibGUgbmFtZS4gQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBzdGF0aWMgdGFibGVOYW1lKCkge1xuICAgICAgcmV0dXJuIHRhYmxlTmFtZVxuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2RlbEF1ZGl0LCBcIm1vZGVsTmFtZVwiLCB7dmFsdWU6IGAke21vZGVsTmFtZX1BdWRpdGAsIHdyaXRhYmxlOiBmYWxzZX0pXG4gIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBNb2RlbEF1ZGl0KVxuICBNb2RlbEF1ZGl0LmJlbG9uZ3NUbyhtb2RlbEtleSwge2NsYXNzTmFtZTogbW9kZWxOYW1lfSlcblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAoTW9kZWxBdWRpdClcbn1cblxuLyoqXG4gKiBNYWtlcyBmcmFtZXdvcmstb3duZWQgYXVkaXQgY2xhc3NlcyByZWFkIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhdWRpdGVkIG1vZGVsLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgc291cmNlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhdWRpdENsYXNzIC0gR2VuZXJhdGVkIGF1ZGl0IGNsYXNzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBhdWRpdENsYXNzKSB7XG4gIGF1ZGl0Q2xhc3Muc2V0RGF0YWJhc2VJZGVudGlmaWVyKG1vZGVsQ2xhc3MuZ2V0Q29uZmlndXJlZERhdGFiYXNlSWRlbnRpZmllcigpKVxuXG4gIGlmIChtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKCkpIHtcbiAgICBhdWRpdENsYXNzLnN3aXRjaGVzVGVuYW50RGF0YWJhc2UoKHt0ZW5hbnR9KSA9PiBtb2RlbENsYXNzLmdldFRlbmFudERhdGFiYXNlSWRlbnRpZmllcih0ZW5hbnQpKVxuICB9XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBmaW5kIHRoZSByb290IERhdGFiYXNlUmVjb3JkIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gUm9vdCBEYXRhYmFzZVJlY29yZCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gZmluZERhdGFiYXNlUmVjb3JkQ2xhc3MobW9kZWxDbGFzcykge1xuICBsZXQgcmVjb3JkQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWxDbGFzcylcblxuICB3aGlsZSAocmVjb3JkQ2xhc3MgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY29yZENsYXNzKSAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgcmVjb3JkQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVjb3JkQ2xhc3MpXG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkQ2xhc3MpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyYW1ldGVyLWtleSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBlLmcuIFwicHJvamVjdFwiIGZvciBcIlByb2plY3RcIi5cbiAqL1xuZnVuY3Rpb24gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKSB7XG4gIGNvbnN0IG5hbWUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG5cbiAgcmV0dXJuIG5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVnaXN0cmF0aW9uIChzeW5jIOKAlCBjYWxsYmFja3Mgb25seTsgdGFibGUgZGV0ZWN0aW9uIGRlZmVycmVkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVnaXN0ZXJzIGxpZmVjeWNsZSBjYWxsYmFja3MgZm9yIGF1dG9tYXRpYyBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3kgYXVkaXRpbmcuXG4gKiBUYWJsZSBkZXRlY3Rpb24gYW5kIHJlbGF0aW9uc2hpcCByZWdpc3RyYXRpb24gaGFwcGVuIGxhemlseSBvbiBmaXJzdCB1c2FnZS5cbiAqIENhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gTW9kZWwuYXVkaXRlZCgpIGF0IG1vZHVsZS1sb2FkIHRpbWUuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYXVkaXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJBdWRpdGluZyhtb2RlbENsYXNzKSB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWxDbGFzcywgXCJfYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkXCIpICYmIG1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkID0gdHJ1ZVxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MpXG4gIG1vZGVsQ2xhc3MuYmVmb3JlQ3JlYXRlKFwiY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlc1wiKVxuICBtb2RlbENsYXNzLmFmdGVyQ3JlYXRlKFwiY3JlYXRlQ3JlYXRlQXVkaXRcIilcbiAgbW9kZWxDbGFzcy5iZWZvcmVVcGRhdGUoXCJjYXB0dXJlVXBkYXRlQXVkaXRDaGFuZ2VzXCIpXG4gIG1vZGVsQ2xhc3MuYWZ0ZXJVcGRhdGUoXCJjcmVhdGVVcGRhdGVBdWRpdFwiKVxuICBtb2RlbENsYXNzLmFmdGVyRGVzdHJveShcImNyZWF0ZURlc3Ryb3lBdWRpdFwiKVxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGF1ZGl0IG1ldGFkYXRhIGZvciBhdWRpdGVkIG1vZGVsIGNsYXNzZXMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbml0aWFsaXplLlxuICogQHBhcmFtIHt7cmVzb2x2ZVRhYmxlRGF0YT86IGJvb2xlYW59fSBbYXJnc10gLSBJbml0aWFsaXphdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBdWRpdGluZyhtb2RlbENsYXNzLCBhcmdzID0ge30pIHtcbiAgY29uc3Qge3Jlc29sdmVUYWJsZURhdGEgPSBmYWxzZX0gPSBhcmdzXG4gIGNvbnN0IGF1ZGl0ZWRNb2RlbENsYXNzID0gLyoqIEB0eXBlIHtBdWRpdGVkTW9kZWxDbGFzc30gKi8gKG1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFhdWRpdGVkTW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKGF1ZGl0ZWRNb2RlbENsYXNzKVxuXG4gIGlmIChyZXNvbHZlVGFibGVEYXRhICYmIHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShhdWRpdGVkTW9kZWxDbGFzcykpIHtcbiAgICBhd2FpdCByZXNvbHZlQXVkaXRUYWJsZURhdGEoYXVkaXRlZE1vZGVsQ2xhc3MpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhdWRpdCBtZXRhZGF0YSBhZnRlciBhcHBsaWNhdGlvbiBhbmQgcGFja2FnZSBtb2RlbCBjbGFzc2VzIGFyZSByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIHdob3NlIG1vZGVscyBzaG91bGQgYmUgZmluYWxpemVkLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBdWRpdGVkTW9kZWxSZWxhdGlvbnNoaXBzKGNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgbW9kZWxDbGFzc2VzID0gT2JqZWN0LnZhbHVlcyhjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpKVxuICBjb25zdCBzaG91bGRSZXNvbHZlVGFibGVEYXRhID0gbW9kZWxDbGFzc2VzLnNvbWUoKG1vZGVsQ2xhc3MpID0+IHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShtb2RlbENsYXNzKSlcblxuICBpZiAoIXNob3VsZFJlc29sdmVUYWJsZURhdGEpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbW9kZWxDbGFzc2VzKSB7XG4gICAgICBhd2FpdCBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcylcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiSW5pdGlhbGl6ZSBhdWRpdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHNcIn0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbW9kZWxDbGFzc2VzKSB7XG4gICAgICBhd2FpdCBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcywge3Jlc29sdmVUYWJsZURhdGE6IHRydWV9KVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhdWRpdCB0YWJsZSBtZXRhZGF0YSBzaG91bGQgYmUgcmVzb2x2ZWQgZm9yIGEgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGFibGUgbWV0YWRhdGEgcmVzb2x1dGlvbiBzaG91bGQgcnVuIG5vdy5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgYXVkaXRlZE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge0F1ZGl0ZWRNb2RlbENsYXNzfSAqLyAobW9kZWxDbGFzcylcblxuICBpZiAoIWF1ZGl0ZWRNb2RlbENsYXNzLl9hdWRpdExpZmVjeWNsZUNhbGxiYWNrc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBCb29sZWFuKGF1ZGl0ZWRNb2RlbENsYXNzLl9pbml0aWFsaXplZCkgJiYgY2FuUmVzb2x2ZUF1ZGl0VGFibGVEYXRhKGF1ZGl0ZWRNb2RlbENsYXNzKVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYXVkaXRzIHJlbGF0aW9uc2hpcCB3aXRob3V0IGZvcmNpbmcgYXVkaXQgdGFibGUgZGV0ZWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGF1ZGl0LlxuICogQHBhcmFtIHtBdWRpdFRhYmxlRGF0YX0gW3RhYmxlRGF0YV0gLSBSZXNvbHZlZCBhdWRpdCB0YWJsZSBkYXRhIHdoZW4gYXZhaWxhYmxlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRSZWxhdGlvbnNoaXAobW9kZWxDbGFzcywgdGFibGVEYXRhID0gZGVmYXVsdEF1ZGl0UmVsYXRpb25zaGlwVGFibGVEYXRhKG1vZGVsQ2xhc3MpKSB7XG4gIGlmIChtb2RlbENsYXNzLl9yZWxhdGlvbnNoaXBFeGlzdHMoXCJhdWRpdHNcIikpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcImF1ZGl0c1wiKVxuXG4gICAgaWYgKGdlbmVyYXRlZEF1ZGl0UmVsYXRpb25zaGlwcy5oYXMocmVsYXRpb25zaGlwKSkge1xuICAgICAgcmVsYXRpb25zaGlwLmNsYXNzTmFtZSA9IHVuZGVmaW5lZFxuICAgICAgcmVsYXRpb25zaGlwLmtsYXNzID0gdGFibGVEYXRhLmF1ZGl0Q2xhc3NcbiAgICAgIHJlbGF0aW9uc2hpcC5mb3JlaWduS2V5ID0gdGFibGVEYXRhLmZvcmVpZ25LZXlcbiAgICAgIHJlbGF0aW9uc2hpcC5fZXhwbGljaXRGb3JlaWduS2V5ID0gdGFibGVEYXRhLmZvcmVpZ25LZXlcbiAgICAgIHJlbGF0aW9uc2hpcC5fcG9seW1vcnBoaWMgPSAhdGFibGVEYXRhLmRlZGljYXRlZFxuICAgICAgcmVsYXRpb25zaGlwLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW4gPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIG1vZGVsQ2xhc3MuaGFzTWFueShcImF1ZGl0c1wiLCBhdWRpdFJlbGF0aW9uc2hpcFNjb3BlLCB7XG4gICAgZm9yZWlnbktleTogdGFibGVEYXRhLmZvcmVpZ25LZXksXG4gICAga2xhc3M6IHRhYmxlRGF0YS5hdWRpdENsYXNzLFxuICAgIHBvbHltb3JwaGljOiAhdGFibGVEYXRhLmRlZGljYXRlZFxuICB9KVxuICBnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMuYWRkKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiYXVkaXRzXCIpKVxufVxuXG4vKipcbiAqIFJldHVybnMgdW5yZXNvbHZlZCBzaGFyZWQtYXVkaXQgZGVmYXVsdHMgZm9yIGVhcmx5IHJlbGF0aW9uc2hpcCByZWdpc3RyYXRpb24uXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYXVkaXQuXG4gKiBAcmV0dXJucyB7QXVkaXRUYWJsZURhdGF9IFNoYXJlZCBhdWRpdCByZWxhdGlvbnNoaXAgZGVmYXVsdHMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBdWRpdFJlbGF0aW9uc2hpcFRhYmxlRGF0YShtb2RlbENsYXNzKSB7XG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGRlZmF1bHQgYXVkaXQgb3JkZXJpbmcgdG8gZ2VuZXJhdGVkIGF1ZGl0IHJlbGF0aW9uc2hpcHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdD59IHF1ZXJ5IC0gQXVkaXQgcXVlcnkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gT3JkZXJlZCBhdWRpdCBxdWVyeS5cbiAqL1xuZnVuY3Rpb24gYXVkaXRSZWxhdGlvbnNoaXBTY29wZShxdWVyeSkge1xuICByZXR1cm4gcXVlcnkub3JkZXIoe2NvbHVtbjogXCJjcmVhdGVkX2F0XCIsIGRpcmVjdGlvbjogXCJERVNDXCJ9KVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHRlbmFudCBjb250ZXh0IGNhbiByZXNvbHZlIGF1ZGl0IHRhYmxlIGRhdGEuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGF1ZGl0IHRhYmxlIGRhdGEgY2FuIGJlIHJlc29sdmVkIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICovXG5mdW5jdGlvbiBjYW5SZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICBpZiAoIW1vZGVsQ2xhc3MuaGFzVGVuYW50RGF0YWJhc2VJZGVudGlmaWVyUmVzb2x2ZXIoKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCB0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIgPSBtb2RlbENsYXNzLmdldFRlbmFudERhdGFiYXNlSWRlbnRpZmllcigpXG5cbiAgaWYgKCF0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUodGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyZWF0aW5nIGF1ZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdWRpdCByb3cgZm9yIGEgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEBwYXJhbSB7Q3JlYXRlQXVkaXRBcmdzfSBhcmdzIC0gQXVkaXQgcm93IG9wdGlvbnMgKGFjdGlvbiwgYXVkaXRlZENoYW5nZXMsIHBhcmFtcykuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXVkaXQocmVjb3JkLCBhcmdzKSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge0F1ZGl0ZWRNb2RlbENsYXNzfSAqLyAocmVjb3JkLmdldE1vZGVsQ2xhc3MoKSlcblxuICByZXR1cm4gYXdhaXQgbW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSBhdWRpdGB9LCBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUF1ZGl0V2l0aEN1cnJlbnRDb25uZWN0aW9uKHJlY29yZCwgYXJncywgbW9kZWxDbGFzcylcbiAgfSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGF1ZGl0IHJvdyB1c2luZyB0aGUgY3VycmVudCBtb2RlbCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICogUm91dGVzIHRvIHNoYXJlZCB0YWJsZSBvciBkZWRpY2F0ZWQgdGFibGUgYmFzZWQgb24gcmVzb2x2ZWQgYXVkaXQgdGFibGUgZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gYXVkaXQuXG4gKiBAcGFyYW0ge0NyZWF0ZUF1ZGl0QXJnc30gYXJncyAtIEF1ZGl0IHJvdyBvcHRpb25zIChhY3Rpb24sIGF1ZGl0ZWRDaGFuZ2VzLCBwYXJhbXMpLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXVkaXRXaXRoQ3VycmVudENvbm5lY3Rpb24ocmVjb3JkLCBhcmdzLCBtb2RlbENsYXNzKSB7XG4gIGlmICghcmVjb3JkLmlzUGVyc2lzdGVkKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGF1ZGl0IHVucGVyc2lzdGVkICR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0gcmVjb3JkYClcblxuICBjb25zdCB0YWJsZURhdGEgPSBhd2FpdCByZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcylcbiAgY29uc3QgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uKGFyZ3MuYWN0aW9uKVxuICBjb25zdCBhdWRpdGVkQ2hhbmdlcyA9IGFyZ3MuYXVkaXRlZENoYW5nZXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmdzLmF1ZGl0ZWRDaGFuZ2VzXG4gIGNvbnN0IHBhcmFtcyA9IGFyZ3MucGFyYW1zID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJncy5wYXJhbXNcbiAgY29uc3QgZGIgPSBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKVxuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKClcblxuICBjb25zdCBhdWRpdEFjdGlvbklkID0gYXdhaXQgZmluZE9yQ3JlYXRlTG9va3VwSWQoe1xuICAgIGNvbHVtbk5hbWU6IFwiYWN0aW9uXCIsXG4gICAgY3VycmVudERhdGUsXG4gICAgZGIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0X2FjdGlvbnNcIixcbiAgICB2YWx1ZTogYWN0aW9uXG4gIH0pXG5cbiAgY29uc3QgYXVkaXRJZCA9IG5ldyBVVUlEKDQpLmZvcm1hdCgpXG5cbiAgaWYgKHRhYmxlRGF0YS5kZWRpY2F0ZWQpIHtcbiAgICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcblxuICAgIGF3YWl0IGRiLnF1ZXJ5KGRiLmluc2VydFNxbCh7XG4gICAgICByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICB0YWJsZU5hbWU6IHRhYmxlRGF0YS50YWJsZU5hbWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBhdWRpdElkLFxuICAgICAgICBbYCR7bW9kZWxLZXl9X2lkYF06IHJlY29yZC5pZCgpLFxuICAgICAgICBhdWRpdF9hY3Rpb25faWQ6IGF1ZGl0QWN0aW9uSWQsXG4gICAgICAgIGF1ZGl0ZWRfY2hhbmdlczogYXVkaXRlZENoYW5nZXMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgY3JlYXRlZF9hdDogY3VycmVudERhdGUsXG4gICAgICAgIHVwZGF0ZWRfYXQ6IGN1cnJlbnREYXRlXG4gICAgICB9XG4gICAgfSkpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXVkaXRBdWRpdGFibGVUeXBlSWQgPSBhd2FpdCBmaW5kT3JDcmVhdGVMb29rdXBJZCh7XG4gICAgICBjb2x1bW5OYW1lOiBcIm5hbWVcIixcbiAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgZGIsXG4gICAgICB0YWJsZU5hbWU6IFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIsXG4gICAgICB2YWx1ZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG5cbiAgICBhd2FpdCBkYi5xdWVyeShkYi5pbnNlcnRTcWwoe1xuICAgICAgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXM6IFtcImlkXCJdLFxuICAgICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogYXVkaXRJZCxcbiAgICAgICAgYXVkaXRfYWN0aW9uX2lkOiBhdWRpdEFjdGlvbklkLFxuICAgICAgICBhdWRpdF9hdWRpdGFibGVfdHlwZV9pZDogYXVkaXRBdWRpdGFibGVUeXBlSWQsXG4gICAgICAgIGF1ZGl0YWJsZV9pZDogcmVjb3JkLmlkKCksXG4gICAgICAgIGF1ZGl0YWJsZV90eXBlOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBhdWRpdGVkX2NoYW5nZXM6IGF1ZGl0ZWRDaGFuZ2VzLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGNyZWF0ZWRfYXQ6IGN1cnJlbnREYXRlLFxuICAgICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgICAgfVxuICAgIH0pKVxuICB9XG5cbiAgYXdhaXQgZW1pdEF1ZGl0RXZlbnQobW9kZWxDbGFzcywgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIEF1ZGl0RXZlbnRzLmNhbGwobW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSwgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIHJldHVybiBhdWRpdElkXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGlmZWN5Y2xlIGNhbGxiYWNrc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2FwdHVyZXMgY3JlYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY3JlYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUF1ZGl0KHJlY29yZCkge1xuICBhd2FpdCBjcmVhdGVBdWRpdChyZWNvcmQsIHtcbiAgICBhY3Rpb246IFwiY3JlYXRlXCIsXG4gICAgYXVkaXRlZENoYW5nZXM6IHJlY29yZC5fcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG4gIH0pXG5cbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2FwdHVyZXMgdXBkYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgdXBkYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZUF1ZGl0KHJlY29yZCkge1xuICBjb25zdCBhdWRpdGVkQ2hhbmdlcyA9IHJlY29yZC5fcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG5cbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG5cbiAgaWYgKCFhdWRpdGVkQ2hhbmdlcyB8fCBPYmplY3Qua2V5cyhhdWRpdGVkQ2hhbmdlcykubGVuZ3RoIDw9IDApIHJldHVyblxuXG4gIGF3YWl0IGNyZWF0ZUF1ZGl0KHJlY29yZCwge1xuICAgIGFjdGlvbjogXCJ1cGRhdGVcIixcbiAgICBhdWRpdGVkQ2hhbmdlc1xuICB9KVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGVzdHJveSBhdWRpdCByb3cgZm9yIGEgbW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlc3Ryb3lBdWRpdChyZWNvcmQpIHtcbiAgYXdhaXQgY3JlYXRlQXVkaXQocmVjb3JkLCB7XG4gICAgYWN0aW9uOiBcImRlc3Ryb3lcIixcbiAgICBhdWRpdGVkQ2hhbmdlczogYXVkaXRDaGFuZ2VzRm9yRGVzdHJveShyZWNvcmQpXG4gIH0pXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hhbmdlcyBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgbmV3IHZhbHVlcyBmb3IgZmllbGRzIGNoYW5nZWQgb24gYSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7QXVkaXRDaGFuZ2VzfSBOZXcgdmFsdWVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JDdXJyZW50Q2hhbmdlcyhyZWNvcmQpIHtcbiAgY29uc3QgY2hhbmdlcyA9IHJlY29yZC5jaGFuZ2VzKClcbiAgLyoqIEB0eXBlIHtBdWRpdENoYW5nZXN9ICovXG4gIGNvbnN0IGF1ZGl0ZWRDaGFuZ2VzID0ge31cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IHJlY29yZC5nZXRNb2RlbENsYXNzKCkuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG5cbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgIGF1ZGl0ZWRDaGFuZ2VzW2NvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbYXR0cmlidXRlTmFtZV0gfHwgYXR0cmlidXRlTmFtZV0gPSBjaGFuZ2VbMV1cbiAgfVxuXG4gIHJldHVybiBhdWRpdGVkQ2hhbmdlc1xufVxuXG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgZm9yIGEgZGVzdHJveSBhdWRpdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgYmVpbmcgZGVzdHJveWVkLlxuICogQHJldHVybnMge0F1ZGl0Q2hhbmdlc30gQ3VycmVudCBhdHRyaWJ1dGVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JEZXN0cm95KHJlY29yZCkge1xuICByZXR1cm4gey4uLnJlY29yZC5hdHRyaWJ1dGVzKCl9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gd2l0aG91dEF1ZGl0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY29yZHMgd2l0aG91dCBhbiBhdWRpdCByb3cgZm9yIHRoZSBnaXZlbiBhY3Rpb24uXG4gKiBVc2VzIHNoYXJlZC10YWJsZSBkZWZhdWx0cyB3aGVuIHRhYmxlIGRhdGEgaXMgbm90IHlldCByZXNvbHZlZDtcbiAqIHN3aXRjaGVzIHRvIHRoZSBkZWRpY2F0ZWQgdGFibGUgcGF0aCBvbmNlIHJlc29sdmVkLlxuICogQHRlbXBsYXRlIHtBdWRpdGVkTW9kZWxDbGFzc30gTUNcbiAqIEBwYXJhbSB7TUN9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBzY29wZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PE1DPn0gUXVlcnkgc2NvcGVkIHRvIHJlY29yZHMgd2l0aG91dCB0aGF0IGF1ZGl0IGFjdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dEF1ZGl0KG1vZGVsQ2xhc3MsIGFjdGlvbikge1xuICBjb25zdCBkYiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gIGNvbnN0IG1vZGVsVGFibGVTcWwgPSBkYi5xdW90ZVRhYmxlKG1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gIGNvbnN0IGF1ZGl0QWN0aW9uc1RhYmxlU3FsID0gZGIucXVvdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIilcbiAgY29uc3QgbW9kZWxQcmltYXJ5S2V5U3FsID0gYCR7bW9kZWxUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSl9YFxuICBjb25zdCBhdWRpdEFjdGlvbnNJZFNxbCA9IGAke2F1ZGl0QWN0aW9uc1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiaWRcIil9YFxuICBjb25zdCBhdWRpdEFjdGlvbnNBY3Rpb25TcWwgPSBgJHthdWRpdEFjdGlvbnNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImFjdGlvblwiKX1gXG5cbiAgaWYgKG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCAmJiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YT8uZGVkaWNhdGVkKSB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gbW9kZWxDbGFzcy5fYXVkaXRUYWJsZURhdGFcbiAgICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcbiAgICBjb25zdCBhdWRpdHNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUodGFibGVEYXRhLnRhYmxlTmFtZSlcbiAgICBjb25zdCBhdWRpdEFjdGlvbklkU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdF9hY3Rpb25faWRcIil9YFxuICAgIGNvbnN0IG1vZGVsSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihgJHttb2RlbEtleX1faWRgKX1gXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICAgICAgLmFsbCgpXG4gICAgICAud2hlcmUoYFxuICAgICAgICBOT1QgRVhJU1RTIChcbiAgICAgICAgICBTRUxFQ1QgMVxuICAgICAgICAgIEZST00gJHthdWRpdHNUYWJsZVNxbH1cbiAgICAgICAgICBJTk5FUiBKT0lOICR7YXVkaXRBY3Rpb25zVGFibGVTcWx9XG4gICAgICAgICAgICBPTiAke2F1ZGl0QWN0aW9uc0lkU3FsfSA9ICR7YXVkaXRBY3Rpb25JZFNxbH1cbiAgICAgICAgICBXSEVSRSAke21vZGVsSWRTcWx9ID0gJHttb2RlbFByaW1hcnlLZXlTcWx9XG4gICAgICAgICAgICBBTkQgJHthdWRpdEFjdGlvbnNBY3Rpb25TcWx9ID0gJHtkYi5xdW90ZShub3JtYWxpemVBY3Rpb24oYWN0aW9uKSl9XG4gICAgICAgIClcbiAgICAgIGApXG4gIH1cblxuICBjb25zdCBhdWRpdHNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUoXCJhdWRpdHNcIilcbiAgY29uc3QgYXVkaXRBdWRpdGFibGVJZFNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiYXVkaXRhYmxlX2lkXCIpfWBcbiAgY29uc3QgYXVkaXRBdWRpdGFibGVUeXBlU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdGFibGVfdHlwZVwiKX1gXG4gIGNvbnN0IGF1ZGl0QWN0aW9uSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImF1ZGl0X2FjdGlvbl9pZFwiKX1gXG5cbiAgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgICAuYWxsKClcbiAgICAud2hlcmUoYFxuICAgICAgTk9UIEVYSVNUUyAoXG4gICAgICAgIFNFTEVDVCAxXG4gICAgICAgIEZST00gJHthdWRpdHNUYWJsZVNxbH1cbiAgICAgICAgSU5ORVIgSk9JTiAke2F1ZGl0QWN0aW9uc1RhYmxlU3FsfVxuICAgICAgICAgIE9OICR7YXVkaXRBY3Rpb25zSWRTcWx9ID0gJHthdWRpdEFjdGlvbklkU3FsfVxuICAgICAgICBXSEVSRSAke2F1ZGl0QXVkaXRhYmxlVHlwZVNxbH0gPSAke2RiLnF1b3RlKG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpfVxuICAgICAgICAgIEFORCAke2F1ZGl0QXVkaXRhYmxlSWRTcWx9ID0gJHttb2RlbFByaW1hcnlLZXlTcWx9XG4gICAgICAgICAgQU5EICR7YXVkaXRBY3Rpb25zQWN0aW9uU3FsfSA9ICR7ZGIucXVvdGUobm9ybWFsaXplQWN0aW9uKGFjdGlvbikpfVxuICAgICAgKVxuICAgIGApXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXZlbnQgY2FsbGJhY2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBwZXItbW9kZWwgY2FsbGJhY2sgZmlyZWQgYWZ0ZXIgYW4gYXVkaXQgcm93IGlzIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gb2JzZXJ2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gbmFtZSAoZS5nLiBcImNyZWF0ZVwiKS5cbiAqIEBwYXJhbSB7QXVkaXRDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayBpbnZva2VkIGFmdGVyIG1hdGNoaW5nIGF1ZGl0IHJvd3MgYXJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRDYWxsYmFjayhtb2RlbENsYXNzLCBhY3Rpb24sIGNhbGxiYWNrKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRBY3Rpb24gPSBub3JtYWxpemVBY3Rpb24oYWN0aW9uKVxuICBjb25zdCBjYWxsYmFja3MgPSBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylcblxuICBpZiAoIWNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXSkge1xuICAgIGNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXSA9IFtdXG4gIH1cblxuICBjYWxsYmFja3Nbbm9ybWFsaXplZEFjdGlvbl0ucHVzaChjYWxsYmFjaylcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGFjdGlvbkNhbGxiYWNrcyA9IGNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXVxuICAgIGNvbnN0IGluZGV4ID0gYWN0aW9uQ2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spXG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgYWN0aW9uQ2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBwZXItbW9kZWwgYXVkaXQgY2FsbGJhY2tzIGZvciBhIG1vZGVsL2FjdGlvbiBwYWlyLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbi5cbiAqIEBwYXJhbSB7QXVkaXRFdmVudFBheWxvYWR9IHBheWxvYWQgLSBFdmVudCBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRBdWRpdEV2ZW50KG1vZGVsQ2xhc3MsIGFjdGlvbiwgcGF5bG9hZCkge1xuICBjb25zdCBjYWxsYmFja3MgPSBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylbYWN0aW9uXSB8fCBbXVxuXG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgWy4uLmNhbGxiYWNrc10pIHtcbiAgICBhd2FpdCBjYWxsYmFjayhwYXlsb2FkKVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGVyLW1vZGVsIGNhbGxiYWNrIG1hcC5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBBdWRpdENhbGxiYWNrW10+fSBDYWxsYmFjayBtYXAga2V5ZWQgYnkgYWN0aW9uLlxuICovXG5mdW5jdGlvbiBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbENsYXNzLCBcIl9hdWRpdENhbGxiYWNrc1wiKSkge1xuICAgIG1vZGVsQ2xhc3MuX2F1ZGl0Q2FsbGJhY2tzID0ge31cbiAgfVxuXG4gIGNvbnN0IGNhbGxiYWNrcyA9IG1vZGVsQ2xhc3MuX2F1ZGl0Q2FsbGJhY2tzXG5cbiAgaWYgKCFjYWxsYmFja3MpIHRocm93IG5ldyBFcnJvcihgQXVkaXQgY2FsbGJhY2tzIHdlcmVuJ3QgaW5pdGlhbGl6ZWQgZm9yICR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX1gKVxuXG4gIHJldHVybiBjYWxsYmFja3Ncbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXAgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRmluZHMgb3IgY3JlYXRlcyBhIGxvb2t1cCByb3cgYW5kIHJldHVybnMgaXRzIGlkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBMb29rdXAgdmFsdWUgY29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3MuY3VycmVudERhdGUgLSBUaW1lc3RhbXAgdG8gd3JpdGUgd2hlbiBpbnNlcnRpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgZHJpdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gTG9va3VwIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIExvb2t1cCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IHN0cmluZz59IExvb2t1cCByb3cgaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRPckNyZWF0ZUxvb2t1cElkKHtjb2x1bW5OYW1lLCBjdXJyZW50RGF0ZSwgZGIsIHRhYmxlTmFtZSwgdmFsdWV9KSB7XG4gIGF3YWl0IGRiLnVwc2VydCh7XG4gICAgdGFibGVOYW1lLFxuICAgIGNvbmZsaWN0Q29sdW1uczogW2NvbHVtbk5hbWVdLFxuICAgIHVwZGF0ZUNvbHVtbnM6IFtjb2x1bW5OYW1lXSxcbiAgICBkYXRhOiB7XG4gICAgICBpZDogbmV3IFVVSUQoNCkuZm9ybWF0KCksXG4gICAgICBbY29sdW1uTmFtZV06IHZhbHVlLFxuICAgICAgY3JlYXRlZF9hdDogY3VycmVudERhdGUsXG4gICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgIH1cbiAgfSlcblxuICBjb25zdCBpZCA9IGF3YWl0IGZpbmRMb29rdXBJZCh7Y29sdW1uTmFtZSwgZGIsIHRhYmxlTmFtZSwgdmFsdWV9KVxuXG4gIGlmIChpZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kICR7dGFibGVOYW1lfS4ke2NvbHVtbk5hbWV9IGFmdGVyIHVwc2VydGApXG5cbiAgcmV0dXJuIGlkXG59XG5cbi8qKlxuICogRmluZHMgYSBsb29rdXAgaWQgYnkgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uTmFtZSAtIExvb2t1cCB2YWx1ZSBjb2x1bW4gbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBkcml2ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBMb29rdXAgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gTG9va3VwIHZhbHVlLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgbnVsbD59IExvb2t1cCByb3cgaWQgb3IgbnVsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZExvb2t1cElkKHtjb2x1bW5OYW1lLCBkYiwgdGFibGVOYW1lLCB2YWx1ZX0pIHtcbiAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiLnF1ZXJ5KGBcbiAgICBTRUxFQ1QgJHtkYi5xdW90ZUNvbHVtbihcImlkXCIpfSBBUyBpZFxuICAgIEZST00gJHtkYi5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9XG4gICAgV0hFUkUgJHtkYi5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gPSAke2RiLnF1b3RlKHZhbHVlKX1cbiAgYCkpXG5cbiAgaWYgKHJvd3NbMF0pIHJldHVybiByb3dzWzBdLmlkXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIGF1ZGl0IGFjdGlvbiBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUcmltbWVkLCBub24tZW1wdHkgYWN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbihhY3Rpb24pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEFjdGlvbiA9IGFjdGlvbi50cmltKClcblxuICBpZiAoIW5vcm1hbGl6ZWRBY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkF1ZGl0IGFjdGlvbiBtdXN0IGJlIHByZXNlbnRcIilcblxuICByZXR1cm4gbm9ybWFsaXplZEFjdGlvblxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pZ3JhdGlvbiBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBzaGFyZWQgYXVkaXQgdGFibGVzIG1pZ3JhdGlvbiB1cC9kb3duIGNhbGxiYWNrcyBmb3IgdXNlIGluc2lkZVxuICogYSBNaWdyYXRpb24gY2xhc3MuIFRoZSBgdGFibGVgIHBhcmFtZXRlciBpcyBhIE1pZ3JhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7e2lkPzoge3R5cGU6IHN0cmluZ319fSBbb3B0aW9uc10gLSBJRCBjb2x1bW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHt7ZG93bjogKHRhYmxlOiBpbXBvcnQoXCIuLi9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTx2b2lkPiwgdXA6ICh0YWJsZTogaW1wb3J0KFwiLi4vbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8dm9pZD59fVxuICovXG5mdW5jdGlvbiBjcmVhdGVTaGFyZWRBdWRpdFRhYmxlc01pZ3JhdGlvbihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgb3B0cyA9IC8qKiBAdHlwZSB7e2lkPzoge3R5cGU6IHN0cmluZ319fSAqLyAob3B0aW9ucylcbiAgY29uc3QgaWRPcHRpb25zID0gLyoqIEB0eXBlIHt7dHlwZT86IHN0cmluZ319ICovIChvcHRzLmlkIHx8IHt9KVxuICBjb25zdCB0eXBlID0gaWRPcHRpb25zLnR5cGVcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHVwKHRhYmxlKSB7XG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIiwge2lkOiAvKiogQHR5cGUge3t0eXBlPzogc3RyaW5nfX0gKi8gKG9wdHMuaWQgfHwge30pfSwgKC8qKiBAdHlwZSB7e3N0cmluZyhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCwgdGltZXN0YW1wcygpOiB2b2lkfX0gKi8gdCkgPT4ge1xuICAgICAgICB0LnN0cmluZyhcImFjdGlvblwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICAgIHQudGltZXN0YW1wcygpXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiLCB7aWQ6IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSl9LCAoLyoqIEB0eXBlIHt7c3RyaW5nKG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkLCB0aW1lc3RhbXBzKCk6IHZvaWR9fSAqLyB0KSA9PiB7XG4gICAgICAgIHQuc3RyaW5nKFwibmFtZVwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICAgIHQudGltZXN0YW1wcygpXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0c1wiLCB7aWQ6IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSl9LCAoLyoqIEB0eXBlIHt7anNvbihuYW1lOiBzdHJpbmcpOiB2b2lkLCByZWZlcmVuY2VzKG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkLCB0aW1lc3RhbXBzKCk6IHZvaWR9fSAqLyB0KSA9PiB7XG4gICAgICAgIHQucmVmZXJlbmNlcyhcImF1ZGl0X2FjdGlvblwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2UsIHR5cGV9KVxuICAgICAgICB0LnJlZmVyZW5jZXMoXCJhdWRpdF9hdWRpdGFibGVfdHlwZVwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2UsIHR5cGV9KVxuICAgICAgICB0LnJlZmVyZW5jZXMoXCJhdWRpdGFibGVcIiwge251bGw6IGZhbHNlLCBwb2x5bW9ycGhpYzogdHJ1ZSwgdHlwZX0pXG4gICAgICAgIHQuanNvbihcImF1ZGl0ZWRfY2hhbmdlc1wiKVxuICAgICAgICB0Lmpzb24oXCJwYXJhbXNcIilcbiAgICAgICAgdC50aW1lc3RhbXBzKClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRvd24odGFibGUpIHtcbiAgICAgIGF3YWl0IHRhYmxlLmRyb3BUYWJsZShcImF1ZGl0c1wiKVxuICAgICAgYXdhaXQgdGFibGUuZHJvcFRhYmxlKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIpXG4gICAgICBhd2FpdCB0YWJsZS5kcm9wVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgZ2l2ZW4gbW9kZWwgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFRhYmxlTmFtZSAtIE1vZGVsIHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0c1wiKS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdF9hdWRpdHNcIikuXG4gKi9cbmZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lRm9yVGFibGUobW9kZWxUYWJsZU5hbWUpIHtcbiAgaWYgKG1vZGVsVGFibGVOYW1lLmVuZHNXaXRoKFwic1wiKSkge1xuICAgIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZS5zbGljZSgwLCAtMSl9X2F1ZGl0c2BcbiAgfVxuXG4gIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZX1fYXVkaXRzYFxufVxuXG5leHBvcnQge1xuICBBdWRpdEV2ZW50cyxcbiAgY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlcyxcbiAgY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlcyxcbiAgY3JlYXRlQXVkaXQsXG4gIGNyZWF0ZUNyZWF0ZUF1ZGl0LFxuICBjcmVhdGVEZXN0cm95QXVkaXQsXG4gIGNyZWF0ZVVwZGF0ZUF1ZGl0LFxuICBjcmVhdGVTaGFyZWRBdWRpdFRhYmxlc01pZ3JhdGlvbixcbiAgZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWVGb3JUYWJsZSxcbiAgaW5pdGlhbGl6ZUF1ZGl0ZWRNb2RlbFJlbGF0aW9uc2hpcHMsXG4gIGluaXRpYWxpemVBdWRpdGluZyxcbiAgcmVnaXN0ZXJBdWRpdENhbGxiYWNrLFxuICByZWdpc3RlckF1ZGl0aW5nLFxuICB3aXRob3V0QXVkaXRcbn1cbiJdfQ==
|
|
831
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F1ZGl0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFFNUI7OztHQUdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSCxtQ0FBbUM7QUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRXJDLCtEQUErRDtBQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRWpDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVqRCw4RUFBOEU7QUFDOUUsd0RBQXdEO0FBQ3hELDhFQUE4RTtBQUU5RSx1RkFBdUY7QUFDdkYsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7QUFFL0I7Ozs7OztHQU1HO0FBRUgsOEJBQThCO0FBQzlCLE1BQU0sV0FBVyxHQUFHO0lBQ2xCOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNyQixNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV2QyxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVE7UUFDNUIsSUFBSSxDQUFDLHNCQUFz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QUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sR0FBRyxjQUFjLFNBQVMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixZQUFZLEVBQ2IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVVVJRCBmcm9tIFwicHVyZS11dWlkXCJcblxuLyoqXG4gKiBBdWRpdENoYW5nZXMgdHlwZS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gQXVkaXRDaGFuZ2VzXG4gKi9cblxuLyoqXG4gKiBBdWRpdEV2ZW50UGF5bG9hZCB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQXVkaXRFdmVudFBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBhdWRpdElkIC0gQ3JlYXRlZCBhdWRpdCByb3cgaWQuXG4gKiBAcHJvcGVydHkge0F1ZGl0Q2hhbmdlcyB8IG51bGx9IGF1ZGl0ZWRDaGFuZ2VzIC0gQ2hhbmdlcyBjYXB0dXJlZCBmb3IgdGhlIGF1ZGl0LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IHBhcmFtcyAtIE9wdGlvbmFsIGNhbGxlci1zdXBwbGllZCBhdWRpdCBwYXJhbXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gQXVkaXRlZCByZWNvcmQuXG4gKi9cblxuLyoqXG4gKiBBdWRpdENhbGxiYWNrIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHBheWxvYWQ6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gQXVkaXRDYWxsYmFja1xuICovXG5cbi8qKlxuICogQ3JlYXRlQXVkaXRBcmdzIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVBdWRpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXVkaXRDaGFuZ2VzIHwgbnVsbH0gW2F1ZGl0ZWRDaGFuZ2VzXSAtIEV4cGxpY2l0IGNoYW5nZXMgdG8gcGVyc2lzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBbcGFyYW1zXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHN0b3JlIHdpdGggdGhlIGF1ZGl0LlxuICovXG5cbi8qKlxuICogQXVkaXRlZE1vZGVsQ2xhc3MgdHlwZS5cbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge1xuICogICBfYXVkaXRDYWxsYmFja3M/OiBSZWNvcmQ8c3RyaW5nLCBBdWRpdENhbGxiYWNrW10+LFxuICogICBfYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkPzogYm9vbGVhbixcbiAqICAgX2F1ZGl0VGFibGVSZXNvbHZlZD86IGJvb2xlYW4sXG4gKiAgIF9hdWRpdFRhYmxlRGF0YT86IEF1ZGl0VGFibGVEYXRhXG4gKiB9fSBBdWRpdGVkTW9kZWxDbGFzc1xuICovXG5cbi8qKlxuICogQXVkaXRUYWJsZURhdGEgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1ZGl0VGFibGVEYXRhXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlZGljYXRlZCAtIFdoZXRoZXIgYSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgZXhpc3RzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhYmxlTmFtZSAtIE5hbWUgb2YgdGhlIGF1ZGl0IHRhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcmVpZ25LZXkgLSBDb2x1bW4gbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGF1ZGl0ZWQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGF1ZGl0Q2xhc3MgLSBUaGUgYXVkaXQgbW9kZWwgY2xhc3MgdG8gdXNlLlxuICovXG5cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgYm9vbGVhbj59ICovXG5jb25zdCBkZWRpY2F0ZWRUYWJsZUNhY2hlID0gbmV3IE1hcCgpXG5cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgdHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdD59ICovXG5jb25zdCBhdWRpdENsYXNzQ2FjaGUgPSBuZXcgTWFwKClcblxuY29uc3QgZ2VuZXJhdGVkQXVkaXRSZWxhdGlvbnNoaXBzID0gbmV3IFdlYWtTZXQoKVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdsb2JhbCBldmVudCBidXMgKGxpa2UgQWN0aXZlUmVjb3JkQXVkaXRhYmxlOjpFdmVudHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBBcnJheTwoYXJnczogQXVkaXRFdmVudFBheWxvYWQpID0+IHZvaWQ+Pj59ICovXG5sZXQgZ2xvYmFsRXZlbnRDb25uZWN0aW9ucyA9IHt9XG5cbi8qKlxuICogR2xvYmFsIGF1ZGl0IGV2ZW50IGJ1cyBtYXRjaGluZyBBY3RpdmVSZWNvcmRBdWRpdGFibGU6OkV2ZW50cy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1ZGl0RXZlbnRzVHlwZVxuICogQHByb3BlcnR5IHsodHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgYXJnczogQXVkaXRFdmVudFBheWxvYWQpID0+IHZvaWR9IGNhbGwgLSBGaXJlIGFsbCBjYWxsYmFja3MgZm9yIGEgbW9kZWwgdHlwZSArIGFjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KHR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcsIGNhbGxiYWNrOiAoYXJnczogQXVkaXRFdmVudFBheWxvYWQpID0+IHZvaWQpID0+ICgpID0+IHZvaWR9IGNvbm5lY3QgLSBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIG1vZGVsIHR5cGUgKyBhY3Rpb24uIFJldHVybnMgYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHJlc2V0IC0gQ2xlYXIgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICovXG5cbi8qKiBAdHlwZSB7QXVkaXRFdmVudHNUeXBlfSAqL1xuY29uc3QgQXVkaXRFdmVudHMgPSB7XG4gIC8qKlxuICAgKiBGaXJlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcyBmb3IgYSBtb2RlbCB0eXBlIGFuZCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gQXVkaXRlZCBtb2RlbCB0eXBlIHdob3NlIGxpc3RlbmVycyBzaG91bGQgZmlyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiB3aG9zZSBsaXN0ZW5lcnMgc2hvdWxkIGZpcmUuXG4gICAqIEBwYXJhbSB7QXVkaXRFdmVudFBheWxvYWR9IGFyZ3MgLSBBdWRpdCBldmVudCBkZWxpdmVyZWQgdG8gbWF0Y2hpbmcgbGlzdGVuZXJzLlxuICAgKi9cbiAgY2FsbCh0eXBlLCBhY3Rpb24sIGFyZ3MpIHtcbiAgICBjb25zdCBhY3Rpb25zID0gZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXSB8fCB7fVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGFjdGlvbnNbYWN0aW9uXSB8fCBbXVxuXG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBbLi4uY2FsbGJhY2tzXSkge1xuICAgICAgY2FsbGJhY2soYXJncylcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgbW9kZWwgdHlwZSBhbmQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEF1ZGl0ZWQgbW9kZWwgdHlwZSB0byBvYnNlcnZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIHRvIG9ic2VydmUuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkfSBjYWxsYmFjayAtIExpc3RlbmVyIGludm9rZWQgZm9yIG1hdGNoaW5nIGF1ZGl0IGV2ZW50cy5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IC0gQ2FsbGJhY2sgdGhhdCByZW1vdmVzIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBjb25uZWN0KHR5cGUsIGFjdGlvbiwgY2FsbGJhY2spIHtcbiAgICBpZiAoIWdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV0pIHtcbiAgICAgIGdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV0gPSB7fVxuICAgIH1cblxuICAgIGlmICghZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXVthY3Rpb25dKSB7XG4gICAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdW2FjdGlvbl0gPSBbXVxuICAgIH1cblxuICAgIGdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV1bYWN0aW9uXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdPy5bYWN0aW9uXVxuXG4gICAgICBpZiAobGlzdCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZihjYWxsYmFjaylcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuICovXG4gIHJlc2V0KCkge1xuICAgIGdsb2JhbEV2ZW50Q29ubmVjdGlvbnMgPSB7fVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGFibGUgZGV0ZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSBmb3IgYSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3N0cmluZ30gZS5nLiBcInByb2plY3RfYXVkaXRzXCIgZm9yIGEgXCJwcm9qZWN0c1wiIHRhYmxlLlxuICovXG5mdW5jdGlvbiBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbENsYXNzKSB7XG4gIGNvbnN0IHRhYmxlID0gbW9kZWxDbGFzcy50YWJsZU5hbWUoKVxuXG4gIGlmICh0YWJsZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICByZXR1cm4gYCR7dGFibGUuc2xpY2UoMCwgLTEpfV9hdWRpdHNgXG4gIH1cblxuICByZXR1cm4gYCR7dGFibGV9X2F1ZGl0c2Bcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhdWRpdCB0YWJsZSBkYXRhIGZvciBhIG1vZGVsIGNsYXNzLiBDYWNoZWQgcGVyIG1vZGVsLlxuICogQ2FsbGVkIGxhemlseSBvbiBmaXJzdCBjcmVhdGVBdWRpdCAvIHdpdGhvdXRBdWRpdCAvIHJlbGF0aW9uc2hpcCB1c2FnZS5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1Byb21pc2U8QXVkaXRUYWJsZURhdGE+fSBSZXNvbHZlZCBhdWRpdCB0YWJsZSBtZXRhZGF0YS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCAmJiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YSkge1xuICAgIHJldHVybiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YVxuICB9XG5cbiAgY29uc3QgdGFibGVEYXRhID0gYXdhaXQgYnVpbGRBdWRpdFRhYmxlRGF0YShtb2RlbENsYXNzKVxuICBjb25zdCBjb25maWd1cmF0aW9uID0gbW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgdGFibGVEYXRhLmF1ZGl0Q2xhc3MucmVnaXN0ZXJSZWNvcmRDbGFzcyh7Y29uZmlndXJhdGlvbn0pXG4gIGF3YWl0IHRhYmxlRGF0YS5hdWRpdENsYXNzLmluaXRpYWxpemVSZWNvcmQoe2NvbmZpZ3VyYXRpb259KVxuXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhID0gdGFibGVEYXRhXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCA9IHRydWVcblxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHRhYmxlRGF0YSlcblxuICByZXR1cm4gdGFibGVEYXRhXG59XG5cbi8qKlxuICogQnVpbGRzIGF1ZGl0IHRhYmxlIG1ldGFkYXRhIGZvciBhIG1vZGVsIGNsYXNzLiBQcmVmZXJzIHRoZSBjb25zdW1lcidzXG4gKiByZWdpc3RlcmVkIEF1ZGl0IG1vZGVsIGZvciBzaGFyZWQgdGFibGVzOyBmYWxscyBiYWNrIHRvIGEgZnJhbWV3b3JrLW93bmVkXG4gKiBkeW5hbWljIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpdFRhYmxlRGF0YT59IEF1ZGl0IHRhYmxlIG1ldGFkYXRhLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgZGVkaWNhdGVkVGFibGUgPSBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbENsYXNzKVxuICBjb25zdCBkZWRpY2F0ZWRFeGlzdHMgPSBhd2FpdCBkZWRpY2F0ZWRUYWJsZUV4aXN0c0ZvckNvbm5lY3Rpb24obW9kZWxDbGFzcywgZGVkaWNhdGVkVGFibGUpXG5cbiAgaWYgKGRlZGljYXRlZEV4aXN0cykge1xuICAgIGNvbnN0IGF1ZGl0Q2xhc3MgPSBkZWRpY2F0ZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MsIGRlZGljYXRlZFRhYmxlKVxuICAgIGNvbnN0IG1vZGVsS2V5ID0gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IHRydWUsXG4gICAgICBmb3JlaWduS2V5OiBgJHttb2RlbEtleX1faWRgLFxuICAgICAgdGFibGVOYW1lOiBkZWRpY2F0ZWRUYWJsZVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKClcblxuICBjb25zdCBjb25zdW1lckF1ZGl0Q2xhc3MgPSBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpLkF1ZGl0XG5cbiAgaWYgKGNvbnN1bWVyQXVkaXRDbGFzcykge1xuICAgIHJldHVybiB7XG4gICAgICBhdWRpdENsYXNzOiBjb25zdW1lckF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgZm9yZWlnbktleTogXCJhdWRpdGFibGVfaWRcIixcbiAgICAgIHRhYmxlTmFtZTogXCJhdWRpdHNcIlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBleGlzdHMgZm9yIGEgbW9kZWwncyBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgdGFibGUgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWRpY2F0ZWRUYWJsZUV4aXN0c0ZvckNvbm5lY3Rpb24obW9kZWxDbGFzcywgdGFibGVOYW1lKSB7XG4gIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IG1vZGVsQ2xhc3MuZ2V0RGF0YWJhc2VJZGVudGlmaWVyKClcbiAgY29uc3QgY2FjaGVLZXkgPSBgJHtkYXRhYmFzZUlkZW50aWZpZXJ9OiR7dGFibGVOYW1lfWBcbiAgY29uc3QgY2FjaGVkID0gZGVkaWNhdGVkVGFibGVDYWNoZS5nZXQoY2FjaGVLZXkpXG5cbiAgaWYgKHR5cGVvZiBjYWNoZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGNhY2hlZFxuICB9XG5cbiAgY29uc3QgY29ubmVjdGlvbiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gIGNvbnN0IHRhYmxlID0gYXdhaXQgY29ubmVjdGlvbi5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUsIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG4gIGNvbnN0IGV4aXN0cyA9IEJvb2xlYW4odGFibGUpXG5cbiAgZGVkaWNhdGVkVGFibGVDYWNoZS5zZXQoY2FjaGVLZXksIGV4aXN0cylcblxuICByZXR1cm4gZXhpc3RzXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRHluYW1pYyBhdWRpdCBjbGFzc2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJhbWV3b3JrLW93bmVkIHNoYXJlZCBBdWRpdCBjbGFzcyBmb3IgdGhlIGBhdWRpdHNgIHRhYmxlLlxuICogVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBubyBjb25zdW1lci1yZWdpc3RlcmVkIEF1ZGl0IG1vZGVsIGV4aXN0cy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBbnkgYXVkaXRlZCBtb2RlbCBjbGFzcyAodXNlZCB0byBsb2NhdGUgRGF0YWJhc2VSZWNvcmQpLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IFNoYXJlZCBBdWRpdCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gc2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSB7XG4gIGNvbnN0IGRiUmVjb3JkQ2xhc3MgPSBmaW5kRGF0YWJhc2VSZWNvcmRDbGFzcyhtb2RlbENsYXNzKVxuXG4gIC8qKlxuICAgKiBGcmFtZXdvcmstb3duZWQgQXVkaXQgbW9kZWwgZm9yIHRoZSBzaGFyZWQgYGF1ZGl0c2AgdGFibGUuXG4gICAqL1xuICBjbGFzcyBBdWRpdCBleHRlbmRzIGRiUmVjb3JkQ2xhc3Mge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgdGFibGUgbmFtZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNoYXJlZCBgYXVkaXRzYCB0YWJsZSBuYW1lLlxuICAgICAqL1xuICAgIHN0YXRpYyB0YWJsZU5hbWUoKSB7XG4gICAgICByZXR1cm4gXCJhdWRpdHNcIlxuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdWRpdCwgXCJtb2RlbE5hbWVcIiwge3ZhbHVlOiBcIkF1ZGl0XCIsIHdyaXRhYmxlOiBmYWxzZX0pXG4gIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBBdWRpdClcblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAoQXVkaXQpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FjaGVkIGZyYW1ld29yay1vd25lZCBzaGFyZWQgQXVkaXQgY2xhc3MgZm9yIGEgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQW55IGF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gU2hhcmVkIEF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBjYWNoZWRTaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3Qgcm91dGluZ0tleSA9IG1vZGVsQ2xhc3MuaGFzVGVuYW50RGF0YWJhc2VJZGVudGlmaWVyUmVzb2x2ZXIoKVxuICAgID8gYHRlbmFudDoke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9YFxuICAgIDogYGRhdGFiYXNlOiR7bW9kZWxDbGFzcy5nZXRDb25maWd1cmVkRGF0YWJhc2VJZGVudGlmaWVyKCl9YFxuICBjb25zdCBjYWNoZUtleSA9IGBzaGFyZWQ6JHtyb3V0aW5nS2V5fWBcbiAgbGV0IGF1ZGl0Q2xhc3MgPSBhdWRpdENsYXNzQ2FjaGUuZ2V0KGNhY2hlS2V5KVxuXG4gIGlmICghYXVkaXRDbGFzcykge1xuICAgIGF1ZGl0Q2xhc3MgPSBzaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpXG4gICAgYXVkaXRDbGFzc0NhY2hlLnNldChjYWNoZUtleSwgYXVkaXRDbGFzcylcbiAgfVxuXG4gIHJldHVybiBhdWRpdENsYXNzXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGR5bmFtaWMgcGVyLW1vZGVsIGF1ZGl0IGNsYXNzIGZvciBhIGRlZGljYXRlZCB0YWJsZS5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdF9hdWRpdHNcIikuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gRGVkaWNhdGVkIGF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBkZWRpY2F0ZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MsIHRhYmxlTmFtZSkge1xuICBjb25zdCBkYlJlY29yZENsYXNzID0gZmluZERhdGFiYXNlUmVjb3JkQ2xhc3MobW9kZWxDbGFzcylcbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcblxuICAvKipcbiAgICogRnJhbWV3b3JrLW93bmVkIHBlci1tb2RlbCBBdWRpdCBjbGFzcy5cbiAgICovXG4gIGNsYXNzIE1vZGVsQXVkaXQgZXh0ZW5kcyBkYlJlY29yZENsYXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYWNraW5nIHRhYmxlIG5hbWUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgc3VwcGxpZWQgZm9yIHRoaXMgbW9kZWwgY2xhc3MuXG4gICAgICovXG4gICAgc3RhdGljIHRhYmxlTmFtZSgpIHtcbiAgICAgIHJldHVybiB0YWJsZU5hbWVcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kZWxBdWRpdCwgXCJtb2RlbE5hbWVcIiwge3ZhbHVlOiBgJHttb2RlbE5hbWV9QXVkaXRgLCB3cml0YWJsZTogZmFsc2V9KVxuICBhcHBseUF1ZGl0Q2xhc3NEYXRhYmFzZVJvdXRpbmcobW9kZWxDbGFzcywgTW9kZWxBdWRpdClcbiAgTW9kZWxBdWRpdC5iZWxvbmdzVG8obW9kZWxLZXksIHtjbGFzc05hbWU6IG1vZGVsTmFtZX0pXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKE1vZGVsQXVkaXQpXG59XG5cbi8qKlxuICogTWFrZXMgZnJhbWV3b3JrLW93bmVkIGF1ZGl0IGNsYXNzZXMgcmVhZCB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXVkaXRlZCBtb2RlbC5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIHNvdXJjZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXVkaXRDbGFzcyAtIEdlbmVyYXRlZCBhdWRpdCBjbGFzcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhcHBseUF1ZGl0Q2xhc3NEYXRhYmFzZVJvdXRpbmcobW9kZWxDbGFzcywgYXVkaXRDbGFzcykge1xuICBhdWRpdENsYXNzLnNldERhdGFiYXNlSWRlbnRpZmllcihtb2RlbENsYXNzLmdldENvbmZpZ3VyZWREYXRhYmFzZUlkZW50aWZpZXIoKSlcblxuICBpZiAobW9kZWxDbGFzcy5oYXNUZW5hbnREYXRhYmFzZUlkZW50aWZpZXJSZXNvbHZlcigpKSB7XG4gICAgYXVkaXRDbGFzcy5zd2l0Y2hlc1RlbmFudERhdGFiYXNlKCh7dGVuYW50fSkgPT4gbW9kZWxDbGFzcy5nZXRUZW5hbnREYXRhYmFzZUlkZW50aWZpZXIodGVuYW50KSlcbiAgfVxufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gZmluZCB0aGUgcm9vdCBEYXRhYmFzZVJlY29yZCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IFJvb3QgRGF0YWJhc2VSZWNvcmQgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmREYXRhYmFzZVJlY29yZENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgbGV0IHJlY29yZENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsQ2xhc3MpXG5cbiAgd2hpbGUgKHJlY29yZENsYXNzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWNvcmRDbGFzcykgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAgIHJlY29yZENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY29yZENsYXNzKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZENsYXNzKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmFtZXRlci1rZXkgbmFtZSBmb3IgYSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3N0cmluZ30gZS5nLiBcInByb2plY3RcIiBmb3IgXCJQcm9qZWN0XCIuXG4gKi9cbmZ1bmN0aW9uIG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcykge1xuICBjb25zdCBuYW1lID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuXG4gIHJldHVybiBuYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zbGljZSgxKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZ2lzdHJhdGlvbiAoc3luYyDigJQgY2FsbGJhY2tzIG9ubHk7IHRhYmxlIGRldGVjdGlvbiBkZWZlcnJlZClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlZ2lzdGVycyBsaWZlY3ljbGUgY2FsbGJhY2tzIGZvciBhdXRvbWF0aWMgY3JlYXRlL3VwZGF0ZS9kZXN0cm95IGF1ZGl0aW5nLlxuICogVGFibGUgZGV0ZWN0aW9uIGFuZCByZWxhdGlvbnNoaXAgcmVnaXN0cmF0aW9uIGhhcHBlbiBsYXppbHkgb24gZmlyc3QgdXNhZ2UuXG4gKiBDYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIE1vZGVsLmF1ZGl0ZWQoKSBhdCBtb2R1bGUtbG9hZCB0aW1lLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGF1ZGl0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRpbmcobW9kZWxDbGFzcykge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsQ2xhc3MsIFwiX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZFwiKSAmJiBtb2RlbENsYXNzLl9hdWRpdExpZmVjeWNsZUNhbGxiYWNrc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCA9IHRydWVcbiAgcmVnaXN0ZXJBdWRpdFJlbGF0aW9uc2hpcChtb2RlbENsYXNzKVxuICBtb2RlbENsYXNzLmJlZm9yZUNyZWF0ZShcImNhcHR1cmVDcmVhdGVBdWRpdENoYW5nZXNcIilcbiAgbW9kZWxDbGFzcy5hZnRlckNyZWF0ZShcImNyZWF0ZUNyZWF0ZUF1ZGl0XCIpXG4gIG1vZGVsQ2xhc3MuYmVmb3JlVXBkYXRlKFwiY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlc1wiKVxuICBtb2RlbENsYXNzLmFmdGVyVXBkYXRlKFwiY3JlYXRlVXBkYXRlQXVkaXRcIilcbiAgbW9kZWxDbGFzcy5hZnRlckRlc3Ryb3koXCJjcmVhdGVEZXN0cm95QXVkaXRcIilcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhdWRpdCBtZXRhZGF0YSBmb3IgYXVkaXRlZCBtb2RlbCBjbGFzc2VzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5pdGlhbGl6ZS5cbiAqIEBwYXJhbSB7e3Jlc29sdmVUYWJsZURhdGE/OiBib29sZWFufX0gW2FyZ3NdIC0gSW5pdGlhbGl6YXRpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcywgYXJncyA9IHt9KSB7XG4gIGNvbnN0IHtyZXNvbHZlVGFibGVEYXRhID0gZmFsc2V9ID0gYXJnc1xuICBjb25zdCBhdWRpdGVkTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7QXVkaXRlZE1vZGVsQ2xhc3N9ICovIChtb2RlbENsYXNzKVxuXG4gIGlmICghYXVkaXRlZE1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgcmVnaXN0ZXJBdWRpdFJlbGF0aW9uc2hpcChhdWRpdGVkTW9kZWxDbGFzcylcblxuICBpZiAocmVzb2x2ZVRhYmxlRGF0YSAmJiBzaG91bGRSZXNvbHZlQXVkaXRUYWJsZURhdGEoYXVkaXRlZE1vZGVsQ2xhc3MpKSB7XG4gICAgYXdhaXQgcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKGF1ZGl0ZWRNb2RlbENsYXNzKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYXVkaXQgbWV0YWRhdGEgYWZ0ZXIgYXBwbGljYXRpb24gYW5kIHBhY2thZ2UgbW9kZWwgY2xhc3NlcyBhcmUgcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiB3aG9zZSBtb2RlbHMgc2hvdWxkIGJlIGZpbmFsaXplZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXVkaXRlZE1vZGVsUmVsYXRpb25zaGlwcyhjb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IE9iamVjdC52YWx1ZXMoY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKSlcbiAgY29uc3Qgc2hvdWxkUmVzb2x2ZVRhYmxlRGF0YSA9IG1vZGVsQ2xhc3Nlcy5zb21lKChtb2RlbENsYXNzKSA9PiBzaG91bGRSZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykpXG5cbiAgaWYgKCFzaG91bGRSZXNvbHZlVGFibGVEYXRhKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIG1vZGVsQ2xhc3Nlcykge1xuICAgICAgYXdhaXQgaW5pdGlhbGl6ZUF1ZGl0aW5nKG1vZGVsQ2xhc3MpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkluaXRpYWxpemUgYXVkaXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIG1vZGVsQ2xhc3Nlcykge1xuICAgICAgYXdhaXQgaW5pdGlhbGl6ZUF1ZGl0aW5nKG1vZGVsQ2xhc3MsIHtyZXNvbHZlVGFibGVEYXRhOiB0cnVlfSlcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYXVkaXQgdGFibGUgbWV0YWRhdGEgc2hvdWxkIGJlIHJlc29sdmVkIGZvciBhIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRhYmxlIG1ldGFkYXRhIHJlc29sdXRpb24gc2hvdWxkIHJ1biBub3cuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShtb2RlbENsYXNzKSB7XG4gIGNvbnN0IGF1ZGl0ZWRNb2RlbENsYXNzID0gLyoqIEB0eXBlIHtBdWRpdGVkTW9kZWxDbGFzc30gKi8gKG1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFhdWRpdGVkTW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gQm9vbGVhbihhdWRpdGVkTW9kZWxDbGFzcy5faW5pdGlhbGl6ZWQpICYmIGNhblJlc29sdmVBdWRpdFRhYmxlRGF0YShhdWRpdGVkTW9kZWxDbGFzcylcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGF1ZGl0cyByZWxhdGlvbnNoaXAgd2l0aG91dCBmb3JjaW5nIGF1ZGl0IHRhYmxlIGRldGVjdGlvbi5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBhdWRpdC5cbiAqIEBwYXJhbSB7QXVkaXRUYWJsZURhdGF9IFt0YWJsZURhdGFdIC0gUmVzb2x2ZWQgYXVkaXQgdGFibGUgZGF0YSB3aGVuIGF2YWlsYWJsZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHRhYmxlRGF0YSA9IGRlZmF1bHRBdWRpdFJlbGF0aW9uc2hpcFRhYmxlRGF0YShtb2RlbENsYXNzKSkge1xuICBpZiAobW9kZWxDbGFzcy5fcmVsYXRpb25zaGlwRXhpc3RzKFwiYXVkaXRzXCIpKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCJhdWRpdHNcIilcblxuICAgIGlmIChnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMuaGFzKHJlbGF0aW9uc2hpcCkpIHtcbiAgICAgIHJlbGF0aW9uc2hpcC5jbGFzc05hbWUgPSB1bmRlZmluZWRcbiAgICAgIHJlbGF0aW9uc2hpcC5rbGFzcyA9IHRhYmxlRGF0YS5hdWRpdENsYXNzXG4gICAgICByZWxhdGlvbnNoaXAuZm9yZWlnbktleSA9IHRhYmxlRGF0YS5mb3JlaWduS2V5XG4gICAgICByZWxhdGlvbnNoaXAuX2V4cGxpY2l0Rm9yZWlnbktleSA9IHRhYmxlRGF0YS5mb3JlaWduS2V5XG4gICAgICByZWxhdGlvbnNoaXAuX3BvbHltb3JwaGljID0gIXRhYmxlRGF0YS5kZWRpY2F0ZWRcbiAgICAgIHJlbGF0aW9uc2hpcC5fcG9seW1vcnBoaWNUeXBlQ29sdW1uID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBtb2RlbENsYXNzLmhhc01hbnkoXCJhdWRpdHNcIiwgYXVkaXRSZWxhdGlvbnNoaXBTY29wZSwge1xuICAgIGZvcmVpZ25LZXk6IHRhYmxlRGF0YS5mb3JlaWduS2V5LFxuICAgIGtsYXNzOiB0YWJsZURhdGEuYXVkaXRDbGFzcyxcbiAgICBwb2x5bW9ycGhpYzogIXRhYmxlRGF0YS5kZWRpY2F0ZWRcbiAgfSlcbiAgZ2VuZXJhdGVkQXVkaXRSZWxhdGlvbnNoaXBzLmFkZChtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcImF1ZGl0c1wiKSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHVucmVzb2x2ZWQgc2hhcmVkLWF1ZGl0IGRlZmF1bHRzIGZvciBlYXJseSByZWxhdGlvbnNoaXAgcmVnaXN0cmF0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGF1ZGl0LlxuICogQHJldHVybnMge0F1ZGl0VGFibGVEYXRhfSBTaGFyZWQgYXVkaXQgcmVsYXRpb25zaGlwIGRlZmF1bHRzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QXVkaXRSZWxhdGlvbnNoaXBUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICByZXR1cm4ge1xuICAgIGF1ZGl0Q2xhc3M6IGNhY2hlZFNoYXJlZEF1ZGl0Q2xhc3MobW9kZWxDbGFzcyksXG4gICAgZGVkaWNhdGVkOiBmYWxzZSxcbiAgICBmb3JlaWduS2V5OiBcImF1ZGl0YWJsZV9pZFwiLFxuICAgIHRhYmxlTmFtZTogXCJhdWRpdHNcIlxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBkZWZhdWx0IGF1ZGl0IG9yZGVyaW5nIHRvIGdlbmVyYXRlZCBhdWRpdCByZWxhdGlvbnNoaXBzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSBxdWVyeSAtIEF1ZGl0IHF1ZXJ5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdD59IE9yZGVyZWQgYXVkaXQgcXVlcnkuXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0UmVsYXRpb25zaGlwU2NvcGUocXVlcnkpIHtcbiAgcmV0dXJuIHF1ZXJ5Lm9yZGVyKHtjb2x1bW46IFwiY3JlYXRlZF9hdFwiLCBkaXJlY3Rpb246IFwiREVTQ1wifSlcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB0ZW5hbnQgY29udGV4dCBjYW4gcmVzb2x2ZSBhdWRpdCB0YWJsZSBkYXRhLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBhdWRpdCB0YWJsZSBkYXRhIGNhbiBiZSByZXNvbHZlZCBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAqL1xuZnVuY3Rpb24gY2FuUmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKCFtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgdGVuYW50RGF0YWJhc2VJZGVudGlmaWVyID0gbW9kZWxDbGFzcy5nZXRUZW5hbnREYXRhYmFzZUlkZW50aWZpZXIoKVxuXG4gIGlmICghdGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gbW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpLmlzRGF0YWJhc2VJZGVudGlmaWVyQWN0aXZlKHRlbmFudERhdGFiYXNlSWRlbnRpZmllcilcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDcmVhdGluZyBhdWRpdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXVkaXQgcm93IGZvciBhIHJlY29yZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gYXVkaXQuXG4gKiBAcGFyYW0ge0NyZWF0ZUF1ZGl0QXJnc30gYXJncyAtIEF1ZGl0IHJvdyBvcHRpb25zIChhY3Rpb24sIGF1ZGl0ZWRDaGFuZ2VzLCBwYXJhbXMpLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgc3RyaW5nPn0gQ3JlYXRlZCBhdWRpdCByb3cgaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1ZGl0KHJlY29yZCwgYXJncykge1xuICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHtBdWRpdGVkTW9kZWxDbGFzc30gKi8gKHJlY29yZC5nZXRNb2RlbENsYXNzKCkpXG5cbiAgcmV0dXJuIGF3YWl0IG1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKS5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0gYXVkaXRgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVBdWRpdFdpdGhDdXJyZW50Q29ubmVjdGlvbihyZWNvcmQsIGFyZ3MsIG1vZGVsQ2xhc3MpXG4gIH0pXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdWRpdCByb3cgdXNpbmcgdGhlIGN1cnJlbnQgbW9kZWwgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqIFJvdXRlcyB0byBzaGFyZWQgdGFibGUgb3IgZGVkaWNhdGVkIHRhYmxlIGJhc2VkIG9uIHJlc29sdmVkIGF1ZGl0IHRhYmxlIGRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHBhcmFtIHtDcmVhdGVBdWRpdEFyZ3N9IGFyZ3MgLSBBdWRpdCByb3cgb3B0aW9ucyAoYWN0aW9uLCBhdWRpdGVkQ2hhbmdlcywgcGFyYW1zKS5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgc3RyaW5nPn0gQ3JlYXRlZCBhdWRpdCByb3cgaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1ZGl0V2l0aEN1cnJlbnRDb25uZWN0aW9uKHJlY29yZCwgYXJncywgbW9kZWxDbGFzcykge1xuICBpZiAoIXJlY29yZC5pc1BlcnNpc3RlZCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhdWRpdCB1bnBlcnNpc3RlZCAke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9IHJlY29yZGApXG5cbiAgY29uc3QgdGFibGVEYXRhID0gYXdhaXQgcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpXG4gIGNvbnN0IGFjdGlvbiA9IG5vcm1hbGl6ZUFjdGlvbihhcmdzLmFjdGlvbilcbiAgY29uc3QgYXVkaXRlZENoYW5nZXMgPSBhcmdzLmF1ZGl0ZWRDaGFuZ2VzID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJncy5hdWRpdGVkQ2hhbmdlc1xuICBjb25zdCBwYXJhbXMgPSBhcmdzLnBhcmFtcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3MucGFyYW1zXG4gIGNvbnN0IGRiID0gbW9kZWxDbGFzcy5jb25uZWN0aW9uKClcbiAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpXG5cbiAgY29uc3QgYXVkaXRBY3Rpb25JZCA9IGF3YWl0IGZpbmRPckNyZWF0ZUxvb2t1cElkKHtcbiAgICBjb2x1bW5OYW1lOiBcImFjdGlvblwiLFxuICAgIGN1cnJlbnREYXRlLFxuICAgIGRiLFxuICAgIHRhYmxlTmFtZTogXCJhdWRpdF9hY3Rpb25zXCIsXG4gICAgdmFsdWU6IGFjdGlvblxuICB9KVxuXG4gIGNvbnN0IGF1ZGl0SWQgPSBuZXcgVVVJRCg0KS5mb3JtYXQoKVxuXG4gIGlmICh0YWJsZURhdGEuZGVkaWNhdGVkKSB7XG4gICAgY29uc3QgbW9kZWxLZXkgPSBtb2RlbFBhcmFtS2V5KG1vZGVsQ2xhc3MpXG5cbiAgICBhd2FpdCBkYi5xdWVyeShkYi5pbnNlcnRTcWwoe1xuICAgICAgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXM6IFtcImlkXCJdLFxuICAgICAgdGFibGVOYW1lOiB0YWJsZURhdGEudGFibGVOYW1lLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogYXVkaXRJZCxcbiAgICAgICAgW2Ake21vZGVsS2V5fV9pZGBdOiByZWNvcmQuaWQoKSxcbiAgICAgICAgYXVkaXRfYWN0aW9uX2lkOiBhdWRpdEFjdGlvbklkLFxuICAgICAgICBhdWRpdGVkX2NoYW5nZXM6IGF1ZGl0ZWRDaGFuZ2VzLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGNyZWF0ZWRfYXQ6IGN1cnJlbnREYXRlLFxuICAgICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgICAgfVxuICAgIH0pKVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGF1ZGl0QXVkaXRhYmxlVHlwZUlkID0gYXdhaXQgZmluZE9yQ3JlYXRlTG9va3VwSWQoe1xuICAgICAgY29sdW1uTmFtZTogXCJuYW1lXCIsXG4gICAgICBjdXJyZW50RGF0ZSxcbiAgICAgIGRiLFxuICAgICAgdGFibGVOYW1lOiBcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiLFxuICAgICAgdmFsdWU6IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICB9KVxuXG4gICAgYXdhaXQgZGIucXVlcnkoZGIuaW5zZXJ0U3FsKHtcbiAgICAgIHJldHVybkxhc3RJbnNlcnRlZENvbHVtbk5hbWVzOiBbXCJpZFwiXSxcbiAgICAgIHRhYmxlTmFtZTogXCJhdWRpdHNcIixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaWQ6IGF1ZGl0SWQsXG4gICAgICAgIGF1ZGl0X2FjdGlvbl9pZDogYXVkaXRBY3Rpb25JZCxcbiAgICAgICAgYXVkaXRfYXVkaXRhYmxlX3R5cGVfaWQ6IGF1ZGl0QXVkaXRhYmxlVHlwZUlkLFxuICAgICAgICBhdWRpdGFibGVfaWQ6IHJlY29yZC5pZCgpLFxuICAgICAgICBhdWRpdGFibGVfdHlwZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgYXVkaXRlZF9jaGFuZ2VzOiBhdWRpdGVkQ2hhbmdlcyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBjcmVhdGVkX2F0OiBjdXJyZW50RGF0ZSxcbiAgICAgICAgdXBkYXRlZF9hdDogY3VycmVudERhdGVcbiAgICAgIH1cbiAgICB9KSlcbiAgfVxuXG4gIGF3YWl0IGVtaXRBdWRpdEV2ZW50KG1vZGVsQ2xhc3MsIGFjdGlvbiwge1xuICAgIGFjdGlvbixcbiAgICBhdWRpdElkLFxuICAgIGF1ZGl0ZWRDaGFuZ2VzLFxuICAgIHBhcmFtcyxcbiAgICByZWNvcmRcbiAgfSlcblxuICBBdWRpdEV2ZW50cy5jYWxsKG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksIGFjdGlvbiwge1xuICAgIGFjdGlvbixcbiAgICBhdWRpdElkLFxuICAgIGF1ZGl0ZWRDaGFuZ2VzLFxuICAgIHBhcmFtcyxcbiAgICByZWNvcmRcbiAgfSlcblxuICByZXR1cm4gYXVkaXRJZFxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExpZmVjeWNsZSBjYWxsYmFja3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENhcHR1cmVzIGNyZWF0ZSBjaGFuZ2VzIGJlZm9yZSBwZXJzaXN0ZW5jZSBjbGVhcnMgdGhlIGNoYW5nZSBzZXQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCAmIHtfcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcz86IEF1ZGl0Q2hhbmdlc319IHJlY29yZCAtIFJlY29yZCB3aG9zZSBwZW5kaW5nIGNoYW5nZXMgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDcmVhdGVBdWRpdENoYW5nZXMocmVjb3JkKSB7XG4gIHJlY29yZC5fcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcyA9IGF1ZGl0Q2hhbmdlc0ZvckN1cnJlbnRDaGFuZ2VzKHJlY29yZClcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGNyZWF0ZSBhdWRpdCByb3cgZm9yIGEgbW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCAmIHtfcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcz86IEF1ZGl0Q2hhbmdlc319IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDcmVhdGVBdWRpdChyZWNvcmQpIHtcbiAgYXdhaXQgY3JlYXRlQXVkaXQocmVjb3JkLCB7XG4gICAgYWN0aW9uOiBcImNyZWF0ZVwiLFxuICAgIGF1ZGl0ZWRDaGFuZ2VzOiByZWNvcmQuX3BlbmRpbmdDcmVhdGVBdWRpdENoYW5nZXMgfHwgbnVsbFxuICB9KVxuXG4gIHJlY29yZC5fcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcyA9IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENhcHR1cmVzIHVwZGF0ZSBjaGFuZ2VzIGJlZm9yZSBwZXJzaXN0ZW5jZSBjbGVhcnMgdGhlIGNoYW5nZSBzZXQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCAmIHtfcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcz86IEF1ZGl0Q2hhbmdlc319IHJlY29yZCAtIFJlY29yZCB3aG9zZSBwZW5kaW5nIGNoYW5nZXMgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVVcGRhdGVBdWRpdENoYW5nZXMocmVjb3JkKSB7XG4gIHJlY29yZC5fcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcyA9IGF1ZGl0Q2hhbmdlc0ZvckN1cnJlbnRDaGFuZ2VzKHJlY29yZClcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIHVwZGF0ZSBhdWRpdCByb3cgZm9yIGEgbW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCAmIHtfcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcz86IEF1ZGl0Q2hhbmdlc319IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVVcGRhdGVBdWRpdChyZWNvcmQpIHtcbiAgY29uc3QgYXVkaXRlZENoYW5nZXMgPSByZWNvcmQuX3BlbmRpbmdVcGRhdGVBdWRpdENoYW5nZXMgfHwgbnVsbFxuXG4gIHJlY29yZC5fcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcyA9IHVuZGVmaW5lZFxuXG4gIGlmICghYXVkaXRlZENoYW5nZXMgfHwgT2JqZWN0LmtleXMoYXVkaXRlZENoYW5nZXMpLmxlbmd0aCA8PSAwKSByZXR1cm5cblxuICBhd2FpdCBjcmVhdGVBdWRpdChyZWNvcmQsIHtcbiAgICBhY3Rpb246IFwidXBkYXRlXCIsXG4gICAgYXVkaXRlZENoYW5nZXNcbiAgfSlcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRlc3Ryb3kgYXVkaXQgcm93IGZvciBhIG1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXN0cm95QXVkaXQocmVjb3JkKSB7XG4gIGF3YWl0IGNyZWF0ZUF1ZGl0KHJlY29yZCwge1xuICAgIGFjdGlvbjogXCJkZXN0cm95XCIsXG4gICAgYXVkaXRlZENoYW5nZXM6IGF1ZGl0Q2hhbmdlc0ZvckRlc3Ryb3kocmVjb3JkKVxuICB9KVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENoYW5nZXMgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIG5ldyB2YWx1ZXMgZm9yIGZpZWxkcyBjaGFuZ2VkIG9uIGEgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB3aG9zZSBwZW5kaW5nIGNoYW5nZXMgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMge0F1ZGl0Q2hhbmdlc30gTmV3IHZhbHVlcyBrZXllZCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKSB7XG4gIGNvbnN0IGNoYW5nZXMgPSByZWNvcmQuY2hhbmdlcygpXG4gIC8qKiBAdHlwZSB7QXVkaXRDaGFuZ2VzfSAqL1xuICBjb25zdCBhdWRpdGVkQ2hhbmdlcyA9IHt9XG4gIGNvbnN0IGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWUgPSByZWNvcmQuZ2V0TW9kZWxDbGFzcygpLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVxuXG4gIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIGNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykpIHtcbiAgICBhdWRpdGVkQ2hhbmdlc1tjb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lW2F0dHJpYnV0ZU5hbWVdIHx8IGF0dHJpYnV0ZU5hbWVdID0gY2hhbmdlWzFdXG4gIH1cblxuICByZXR1cm4gYXVkaXRlZENoYW5nZXNcbn1cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIGZvciBhIGRlc3Ryb3kgYXVkaXQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIGJlaW5nIGRlc3Ryb3llZC5cbiAqIEByZXR1cm5zIHtBdWRpdENoYW5nZXN9IEN1cnJlbnQgYXR0cmlidXRlcyBrZXllZCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYXVkaXRDaGFuZ2VzRm9yRGVzdHJveShyZWNvcmQpIHtcbiAgcmV0dXJuIHsuLi5yZWNvcmQuYXR0cmlidXRlcygpfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHdpdGhvdXRBdWRpdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyByZWNvcmRzIHdpdGhvdXQgYW4gYXVkaXQgcm93IGZvciB0aGUgZ2l2ZW4gYWN0aW9uLlxuICogVXNlcyBzaGFyZWQtdGFibGUgZGVmYXVsdHMgd2hlbiB0YWJsZSBkYXRhIGlzIG5vdCB5ZXQgcmVzb2x2ZWQ7XG4gKiBzd2l0Y2hlcyB0byB0aGUgZGVkaWNhdGVkIHRhYmxlIHBhdGggb25jZSByZXNvbHZlZC5cbiAqIEB0ZW1wbGF0ZSB7QXVkaXRlZE1vZGVsQ2xhc3N9IE1DXG4gKiBAcGFyYW0ge01DfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gc2NvcGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDxNQz59IFF1ZXJ5IHNjb3BlZCB0byByZWNvcmRzIHdpdGhvdXQgdGhhdCBhdWRpdCBhY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHdpdGhvdXRBdWRpdChtb2RlbENsYXNzLCBhY3Rpb24pIHtcbiAgY29uc3QgZGIgPSBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKVxuICBjb25zdCBtb2RlbFRhYmxlU3FsID0gZGIucXVvdGVUYWJsZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICBjb25zdCBhdWRpdEFjdGlvbnNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIpXG4gIGNvbnN0IG1vZGVsUHJpbWFyeUtleVNxbCA9IGAke21vZGVsVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4obW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpfWBcbiAgY29uc3QgYXVkaXRBY3Rpb25zSWRTcWwgPSBgJHthdWRpdEFjdGlvbnNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImlkXCIpfWBcbiAgY29uc3QgYXVkaXRBY3Rpb25zQWN0aW9uU3FsID0gYCR7YXVkaXRBY3Rpb25zVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhY3Rpb25cIil9YFxuXG4gIGlmIChtb2RlbENsYXNzLl9hdWRpdFRhYmxlUmVzb2x2ZWQgJiYgbW9kZWxDbGFzcy5fYXVkaXRUYWJsZURhdGE/LmRlZGljYXRlZCkge1xuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhXG4gICAgY29uc3QgbW9kZWxLZXkgPSBtb2RlbFBhcmFtS2V5KG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgYXVkaXRzVGFibGVTcWwgPSBkYi5xdW90ZVRhYmxlKHRhYmxlRGF0YS50YWJsZU5hbWUpXG4gICAgY29uc3QgYXVkaXRBY3Rpb25JZFNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiYXVkaXRfYWN0aW9uX2lkXCIpfWBcbiAgICBjb25zdCBtb2RlbElkU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oYCR7bW9kZWxLZXl9X2lkYCl9YFxuXG4gICAgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgICAgIC5hbGwoKVxuICAgICAgLndoZXJlKGBcbiAgICAgICAgTk9UIEVYSVNUUyAoXG4gICAgICAgICAgU0VMRUNUIDFcbiAgICAgICAgICBGUk9NICR7YXVkaXRzVGFibGVTcWx9XG4gICAgICAgICAgSU5ORVIgSk9JTiAke2F1ZGl0QWN0aW9uc1RhYmxlU3FsfVxuICAgICAgICAgICAgT04gJHthdWRpdEFjdGlvbnNJZFNxbH0gPSAke2F1ZGl0QWN0aW9uSWRTcWx9XG4gICAgICAgICAgV0hFUkUgJHttb2RlbElkU3FsfSA9ICR7bW9kZWxQcmltYXJ5S2V5U3FsfVxuICAgICAgICAgICAgQU5EICR7YXVkaXRBY3Rpb25zQWN0aW9uU3FsfSA9ICR7ZGIucXVvdGUobm9ybWFsaXplQWN0aW9uKGFjdGlvbikpfVxuICAgICAgICApXG4gICAgICBgKVxuICB9XG5cbiAgY29uc3QgYXVkaXRzVGFibGVTcWwgPSBkYi5xdW90ZVRhYmxlKFwiYXVkaXRzXCIpXG4gIGNvbnN0IGF1ZGl0QXVkaXRhYmxlSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImF1ZGl0YWJsZV9pZFwiKX1gXG4gIGNvbnN0IGF1ZGl0QXVkaXRhYmxlVHlwZVNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiYXVkaXRhYmxlX3R5cGVcIil9YFxuICBjb25zdCBhdWRpdEFjdGlvbklkU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdF9hY3Rpb25faWRcIil9YFxuXG4gIHJldHVybiBtb2RlbENsYXNzXG4gICAgLmFsbCgpXG4gICAgLndoZXJlKGBcbiAgICAgIE5PVCBFWElTVFMgKFxuICAgICAgICBTRUxFQ1QgMVxuICAgICAgICBGUk9NICR7YXVkaXRzVGFibGVTcWx9XG4gICAgICAgIElOTkVSIEpPSU4gJHthdWRpdEFjdGlvbnNUYWJsZVNxbH1cbiAgICAgICAgICBPTiAke2F1ZGl0QWN0aW9uc0lkU3FsfSA9ICR7YXVkaXRBY3Rpb25JZFNxbH1cbiAgICAgICAgV0hFUkUgJHthdWRpdEF1ZGl0YWJsZVR5cGVTcWx9ID0gJHtkYi5xdW90ZShtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpKX1cbiAgICAgICAgICBBTkQgJHthdWRpdEF1ZGl0YWJsZUlkU3FsfSA9ICR7bW9kZWxQcmltYXJ5S2V5U3FsfVxuICAgICAgICAgIEFORCAke2F1ZGl0QWN0aW9uc0FjdGlvblNxbH0gPSAke2RiLnF1b3RlKG5vcm1hbGl6ZUFjdGlvbihhY3Rpb24pKX1cbiAgICAgIClcbiAgICBgKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50IGNhbGxiYWNrc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgcGVyLW1vZGVsIGNhbGxiYWNrIGZpcmVkIGFmdGVyIGFuIGF1ZGl0IHJvdyBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIG9ic2VydmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIG5hbWUgKGUuZy4gXCJjcmVhdGVcIikuXG4gKiBAcGFyYW0ge0F1ZGl0Q2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgaW52b2tlZCBhZnRlciBtYXRjaGluZyBhdWRpdCByb3dzIGFyZSBjcmVhdGVkLlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFVuc3Vic2NyaWJlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckF1ZGl0Q2FsbGJhY2sobW9kZWxDbGFzcywgYWN0aW9uLCBjYWxsYmFjaykge1xuICBjb25zdCBub3JtYWxpemVkQWN0aW9uID0gbm9ybWFsaXplQWN0aW9uKGFjdGlvbilcbiAgY29uc3QgY2FsbGJhY2tzID0gYXVkaXRDYWxsYmFja3NGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFjYWxsYmFja3Nbbm9ybWFsaXplZEFjdGlvbl0pIHtcbiAgICBjYWxsYmFja3Nbbm9ybWFsaXplZEFjdGlvbl0gPSBbXVxuICB9XG5cbiAgY2FsbGJhY2tzW25vcm1hbGl6ZWRBY3Rpb25dLnB1c2goY2FsbGJhY2spXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBhY3Rpb25DYWxsYmFja3MgPSBjYWxsYmFja3Nbbm9ybWFsaXplZEFjdGlvbl1cbiAgICBjb25zdCBpbmRleCA9IGFjdGlvbkNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKVxuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIGFjdGlvbkNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRW1pdHMgcGVyLW1vZGVsIGF1ZGl0IGNhbGxiYWNrcyBmb3IgYSBtb2RlbC9hY3Rpb24gcGFpci5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24uXG4gKiBAcGFyYW0ge0F1ZGl0RXZlbnRQYXlsb2FkfSBwYXlsb2FkIC0gRXZlbnQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBlbWl0QXVkaXRFdmVudChtb2RlbENsYXNzLCBhY3Rpb24sIHBheWxvYWQpIHtcbiAgY29uc3QgY2FsbGJhY2tzID0gYXVkaXRDYWxsYmFja3NGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpW2FjdGlvbl0gfHwgW11cblxuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIFsuLi5jYWxsYmFja3NdKSB7XG4gICAgYXdhaXQgY2FsbGJhY2socGF5bG9hZClcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBlci1tb2RlbCBjYWxsYmFjayBtYXAuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQXVkaXRDYWxsYmFja1tdPn0gQ2FsbGJhY2sgbWFwIGtleWVkIGJ5IGFjdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXVkaXRDYWxsYmFja3NGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWxDbGFzcywgXCJfYXVkaXRDYWxsYmFja3NcIikpIHtcbiAgICBtb2RlbENsYXNzLl9hdWRpdENhbGxiYWNrcyA9IHt9XG4gIH1cblxuICBjb25zdCBjYWxsYmFja3MgPSBtb2RlbENsYXNzLl9hdWRpdENhbGxiYWNrc1xuXG4gIGlmICghY2FsbGJhY2tzKSB0aHJvdyBuZXcgRXJyb3IoYEF1ZGl0IGNhbGxiYWNrcyB3ZXJlbid0IGluaXRpYWxpemVkIGZvciAke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9YClcblxuICByZXR1cm4gY2FsbGJhY2tzXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9va3VwIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEZpbmRzIG9yIGNyZWF0ZXMgYSBsb29rdXAgcm93IGFuZCByZXR1cm5zIGl0cyBpZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gTG9va3VwIHZhbHVlIGNvbHVtbiBuYW1lLlxuICogQHBhcmFtIHtEYXRlfSBhcmdzLmN1cnJlbnREYXRlIC0gVGltZXN0YW1wIHRvIHdyaXRlIHdoZW4gaW5zZXJ0aW5nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kYiAtIERhdGFiYXNlIGRyaXZlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIExvb2t1cCB0YWJsZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBMb29rdXAgdmFsdWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBMb29rdXAgcm93IGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kT3JDcmVhdGVMb29rdXBJZCh7Y29sdW1uTmFtZSwgY3VycmVudERhdGUsIGRiLCB0YWJsZU5hbWUsIHZhbHVlfSkge1xuICBhd2FpdCBkYi51cHNlcnQoe1xuICAgIHRhYmxlTmFtZSxcbiAgICBjb25mbGljdENvbHVtbnM6IFtjb2x1bW5OYW1lXSxcbiAgICB1cGRhdGVDb2x1bW5zOiBbY29sdW1uTmFtZV0sXG4gICAgZGF0YToge1xuICAgICAgaWQ6IG5ldyBVVUlEKDQpLmZvcm1hdCgpLFxuICAgICAgW2NvbHVtbk5hbWVdOiB2YWx1ZSxcbiAgICAgIGNyZWF0ZWRfYXQ6IGN1cnJlbnREYXRlLFxuICAgICAgdXBkYXRlZF9hdDogY3VycmVudERhdGVcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgaWQgPSBhd2FpdCBmaW5kTG9va3VwSWQoe2NvbHVtbk5hbWUsIGRiLCB0YWJsZU5hbWUsIHZhbHVlfSlcblxuICBpZiAoaWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCAke3RhYmxlTmFtZX0uJHtjb2x1bW5OYW1lfSBhZnRlciB1cHNlcnRgKVxuXG4gIHJldHVybiBpZFxufVxuXG4vKipcbiAqIEZpbmRzIGEgbG9va3VwIGlkIGJ5IHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBMb29rdXAgdmFsdWUgY29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgZHJpdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gTG9va3VwIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIExvb2t1cCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IG51bGw+fSBMb29rdXAgcm93IGlkIG9yIG51bGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRMb29rdXBJZCh7Y29sdW1uTmFtZSwgZGIsIHRhYmxlTmFtZSwgdmFsdWV9KSB7XG4gIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtpZDogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYi5xdWVyeShgXG4gICAgU0VMRUNUICR7ZGIucXVvdGVDb2x1bW4oXCJpZFwiKX0gQVMgaWRcbiAgICBGUk9NICR7ZGIucXVvdGVUYWJsZSh0YWJsZU5hbWUpfVxuICAgIFdIRVJFICR7ZGIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtkYi5xdW90ZSh2YWx1ZSl9XG4gIGApKVxuXG4gIGlmIChyb3dzWzBdKSByZXR1cm4gcm93c1swXS5pZFxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiBhdWRpdCBhY3Rpb24gc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEFjdGlvbiBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gVHJpbW1lZCwgbm9uLWVtcHR5IGFjdGlvbiBuYW1lLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBY3Rpb24oYWN0aW9uKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRBY3Rpb24gPSBhY3Rpb24udHJpbSgpXG5cbiAgaWYgKCFub3JtYWxpemVkQWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJBdWRpdCBhY3Rpb24gbXVzdCBiZSBwcmVzZW50XCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRBY3Rpb25cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaWdyYXRpb24gaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc2hhcmVkIGF1ZGl0IHRhYmxlcyBtaWdyYXRpb24gdXAvZG93biBjYWxsYmFja3MgZm9yIHVzZSBpbnNpZGVcbiAqIGEgTWlncmF0aW9uIGNsYXNzLiBUaGUgYHRhYmxlYCBwYXJhbWV0ZXIgaXMgYSBNaWdyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3tpZD86IHt0eXBlOiBzdHJpbmd9fX0gW29wdGlvbnNdIC0gSUQgY29sdW1uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7e2Rvd246ICh0YWJsZTogaW1wb3J0KFwiLi4vbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8dm9pZD4sIHVwOiAodGFibGU6IGltcG9ydChcIi4uL21pZ3JhdGlvbi9pbmRleC5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPHZvaWQ+fX0gLSBVcC9kb3duIGNhbGxiYWNrcyBmb3IgdGhlIHNoYXJlZCBhdWRpdCB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNoYXJlZEF1ZGl0VGFibGVzTWlncmF0aW9uKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBvcHRzID0gLyoqIEB0eXBlIHt7aWQ/OiB7dHlwZTogc3RyaW5nfX19ICovIChvcHRpb25zKVxuICBjb25zdCBpZE9wdGlvbnMgPSAvKiogQHR5cGUge3t0eXBlPzogc3RyaW5nfX0gKi8gKG9wdHMuaWQgfHwge30pXG4gIGNvbnN0IHR5cGUgPSBpZE9wdGlvbnMudHlwZVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgdXAodGFibGUpIHtcbiAgICAgIGF3YWl0IHRhYmxlLmNyZWF0ZVRhYmxlKFwiYXVkaXRfYWN0aW9uc1wiLCB7aWQ6IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSl9LCAoLyoqIEB0eXBlIHt7c3RyaW5nKG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkLCB0aW1lc3RhbXBzKCk6IHZvaWR9fSAqLyB0KSA9PiB7XG4gICAgICAgIHQuc3RyaW5nKFwiYWN0aW9uXCIsIHtpbmRleDoge3VuaXF1ZTogdHJ1ZX0sIG51bGw6IGZhbHNlfSlcbiAgICAgICAgdC50aW1lc3RhbXBzKClcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRhYmxlLmNyZWF0ZVRhYmxlKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIsIHtpZDogLyoqIEB0eXBlIHt7dHlwZT86IHN0cmluZ319ICovIChvcHRzLmlkIHx8IHt9KX0sICgvKiogQHR5cGUge3tzdHJpbmcobmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQsIHRpbWVzdGFtcHMoKTogdm9pZH19ICovIHQpID0+IHtcbiAgICAgICAgdC5zdHJpbmcoXCJuYW1lXCIsIHtpbmRleDoge3VuaXF1ZTogdHJ1ZX0sIG51bGw6IGZhbHNlfSlcbiAgICAgICAgdC50aW1lc3RhbXBzKClcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRhYmxlLmNyZWF0ZVRhYmxlKFwiYXVkaXRzXCIsIHtpZDogLyoqIEB0eXBlIHt7dHlwZT86IHN0cmluZ319ICovIChvcHRzLmlkIHx8IHt9KX0sICgvKiogQHR5cGUge3tqc29uKG5hbWU6IHN0cmluZyk6IHZvaWQsIHJlZmVyZW5jZXMobmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQsIHRpbWVzdGFtcHMoKTogdm9pZH19ICovIHQpID0+IHtcbiAgICAgICAgdC5yZWZlcmVuY2VzKFwiYXVkaXRfYWN0aW9uXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZSwgdHlwZX0pXG4gICAgICAgIHQucmVmZXJlbmNlcyhcImF1ZGl0X2F1ZGl0YWJsZV90eXBlXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZSwgdHlwZX0pXG4gICAgICAgIHQucmVmZXJlbmNlcyhcImF1ZGl0YWJsZVwiLCB7bnVsbDogZmFsc2UsIHBvbHltb3JwaGljOiB0cnVlLCB0eXBlfSlcbiAgICAgICAgdC5qc29uKFwiYXVkaXRlZF9jaGFuZ2VzXCIpXG4gICAgICAgIHQuanNvbihcInBhcmFtc1wiKVxuICAgICAgICB0LnRpbWVzdGFtcHMoKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZG93bih0YWJsZSkge1xuICAgICAgYXdhaXQgdGFibGUuZHJvcFRhYmxlKFwiYXVkaXRzXCIpXG4gICAgICBhd2FpdCB0YWJsZS5kcm9wVGFibGUoXCJhdWRpdF9hdWRpdGFibGVfdHlwZXNcIilcbiAgICAgIGF3YWl0IHRhYmxlLmRyb3BUYWJsZShcImF1ZGl0X2FjdGlvbnNcIilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSBmb3IgYSBnaXZlbiBtb2RlbCB0YWJsZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsVGFibGVOYW1lIC0gTW9kZWwgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RzXCIpLlxuICogQHJldHVybnMge3N0cmluZ30gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiKS5cbiAqL1xuZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWVGb3JUYWJsZShtb2RlbFRhYmxlTmFtZSkge1xuICBpZiAobW9kZWxUYWJsZU5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgcmV0dXJuIGAke21vZGVsVGFibGVOYW1lLnNsaWNlKDAsIC0xKX1fYXVkaXRzYFxuICB9XG5cbiAgcmV0dXJuIGAke21vZGVsVGFibGVOYW1lfV9hdWRpdHNgXG59XG5cbmV4cG9ydCB7XG4gIEF1ZGl0RXZlbnRzLFxuICBjYXB0dXJlQ3JlYXRlQXVkaXRDaGFuZ2VzLFxuICBjYXB0dXJlVXBkYXRlQXVkaXRDaGFuZ2VzLFxuICBjcmVhdGVBdWRpdCxcbiAgY3JlYXRlQ3JlYXRlQXVkaXQsXG4gIGNyZWF0ZURlc3Ryb3lBdWRpdCxcbiAgY3JlYXRlVXBkYXRlQXVkaXQsXG4gIGNyZWF0ZVNoYXJlZEF1ZGl0VGFibGVzTWlncmF0aW9uLFxuICBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZUZvclRhYmxlLFxuICBpbml0aWFsaXplQXVkaXRlZE1vZGVsUmVsYXRpb25zaGlwcyxcbiAgaW5pdGlhbGl6ZUF1ZGl0aW5nLFxuICByZWdpc3RlckF1ZGl0Q2FsbGJhY2ssXG4gIHJlZ2lzdGVyQXVkaXRpbmcsXG4gIHdpdGhvdXRBdWRpdFxufVxuIl19
|
|
@@ -914,7 +914,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
914
914
|
* @param {string} name - Lock name (for the error message).
|
|
915
915
|
* @param {() => Promise<T>} callback - Callback holding the lock.
|
|
916
916
|
* @param {number | null} [holdTimeoutMs] - Max hold time; falsy disables the timeout.
|
|
917
|
-
* @returns {Promise<T>}
|
|
917
|
+
* @returns {Promise<T>} - Callback result after the lock-protected operation.
|
|
918
918
|
*/
|
|
919
919
|
static runWithAdvisoryLockHoldTimeout<T>(name: string, callback: () => Promise<T>, holdTimeoutMs?: number | null): Promise<T>;
|
|
920
920
|
/**
|
|
@@ -1606,7 +1606,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1606
1606
|
* column of the same name. Returns the attached number, or 0 when
|
|
1607
1607
|
* `.withCount(...)` wasn't requested for this attribute.
|
|
1608
1608
|
* @param {string} attributeName - Attribute name, e.g. `"tasksCount"` or a custom `"activeMembersCount"` from `.withCount({activeMembersCount: {...}})`.
|
|
1609
|
-
* @returns {number}
|
|
1609
|
+
* @returns {number} - Attached association count, or zero when absent.
|
|
1610
1610
|
*/
|
|
1611
1611
|
readCount(attributeName: string): number;
|
|
1612
1612
|
/**
|
|
@@ -1621,7 +1621,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1621
1621
|
* All attached association counts as a plain object. Used by the
|
|
1622
1622
|
* frontend-model serializer to ship counts alongside the record
|
|
1623
1623
|
* attributes on the wire.
|
|
1624
|
-
* @returns {Record<string, number>}
|
|
1624
|
+
* @returns {Record<string, number>} - Association counts keyed by attribute name.
|
|
1625
1625
|
*/
|
|
1626
1626
|
associationCounts(): Record<string, number>;
|
|
1627
1627
|
/**
|
|
@@ -1632,7 +1632,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1632
1632
|
* registered fn for this record (e.g. no child rows matched the
|
|
1633
1633
|
* aggregate).
|
|
1634
1634
|
* @param {string} name - queryData attribute name (matches a SELECT alias from the registered fn).
|
|
1635
|
-
* @returns {?}
|
|
1635
|
+
* @returns {?} - Attached query-data value.
|
|
1636
1636
|
*/
|
|
1637
1637
|
queryData(name: string): unknown;
|
|
1638
1638
|
/**
|
|
@@ -1648,7 +1648,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1648
1648
|
* All attached queryData values as a plain object. Used by the
|
|
1649
1649
|
* frontend-model serializer to ship queryData alongside the record
|
|
1650
1650
|
* attributes on the wire.
|
|
1651
|
-
* @returns {Record<string, ?>}
|
|
1651
|
+
* @returns {Record<string, ?>} - Query-data values keyed by name.
|
|
1652
1652
|
*/
|
|
1653
1653
|
queryDataValues(): Record<string, unknown>;
|
|
1654
1654
|
/**
|
|
@@ -1660,7 +1660,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1660
1660
|
* `record.can("update")` without first checking whether the ability
|
|
1661
1661
|
* was loaded.
|
|
1662
1662
|
* @param {string} action - Ability action name, e.g. `"update"`.
|
|
1663
|
-
* @returns {boolean}
|
|
1663
|
+
* @returns {boolean} - Whether the requested ability is allowed.
|
|
1664
1664
|
*/
|
|
1665
1665
|
can(action: string): boolean;
|
|
1666
1666
|
/**
|
|
@@ -1676,7 +1676,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, unk
|
|
|
1676
1676
|
* All attached per-record ability results as a plain object. Used
|
|
1677
1677
|
* by the frontend-model serializer to ship results alongside the
|
|
1678
1678
|
* record attributes on the wire.
|
|
1679
|
-
* @returns {Record<string, boolean>}
|
|
1679
|
+
* @returns {Record<string, boolean>} - Ability results keyed by action.
|
|
1680
1680
|
*/
|
|
1681
1681
|
computedAbilities(): Record<string, boolean>;
|
|
1682
1682
|
/**
|