velocious 1.0.593 → 1.0.595
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/build/configuration.js +109 -14
- package/build/database/drivers/base.js +30 -0
- package/build/database/migrator.js +90 -24
- package/build/database/operation.js +55 -4
- package/build/database/query/join-object.js +7 -4
- package/build/database/query/model-class-query.js +38 -7
- package/build/database/query/preloader/belongs-to.js +9 -6
- package/build/database/query/preloader/has-many.js +25 -14
- package/build/database/query/preloader/has-one.js +7 -4
- package/build/database/query/preloader/query-for-model.js +16 -1
- package/build/database/query/preloader.js +6 -4
- package/build/database/query/query-data.js +3 -3
- package/build/database/query/where-model-class-hash.js +8 -4
- package/build/database/query/with-count.js +4 -3
- package/build/database/record/index.js +148 -5
- package/build/database/record/instance-relationships/base.js +13 -0
- package/build/database/record/instance-relationships/belongs-to.js +1 -1
- package/build/database/record/instance-relationships/has-many.js +5 -2
- package/build/database/record/instance-relationships/has-one.js +1 -1
- package/build/database/record/relationships/base.js +17 -0
- package/build/database/use-database.js +81 -28
- package/build/src/configuration.d.ts +31 -4
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +88 -17
- package/build/src/database/drivers/base.d.ts +11 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +28 -1
- package/build/src/database/migrator.d.ts +34 -0
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +83 -23
- package/build/src/database/operation.d.ts +15 -1
- package/build/src/database/operation.d.ts.map +1 -1
- package/build/src/database/operation.js +52 -5
- package/build/src/database/query/join-object.d.ts.map +1 -1
- package/build/src/database/query/join-object.js +7 -5
- package/build/src/database/query/model-class-query.d.ts +6 -0
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +33 -8
- package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.js +9 -7
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +23 -16
- package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-one.js +7 -5
- package/build/src/database/query/preloader/query-for-model.d.ts +8 -0
- package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
- package/build/src/database/query/preloader/query-for-model.js +15 -2
- package/build/src/database/query/preloader.d.ts.map +1 -1
- package/build/src/database/query/preloader.js +6 -5
- package/build/src/database/query/query-data.js +4 -4
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +7 -5
- package/build/src/database/query/with-count.js +5 -4
- package/build/src/database/record/index.d.ts +95 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +126 -6
- package/build/src/database/record/instance-relationships/base.d.ts +6 -0
- package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/base.js +12 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
- package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-many.js +6 -3
- package/build/src/database/record/instance-relationships/has-one.js +2 -2
- package/build/src/database/record/relationships/base.d.ts +11 -0
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +15 -1
- package/build/src/database/use-database.d.ts +33 -5
- package/build/src/database/use-database.d.ts.map +1 -1
- package/build/src/database/use-database.js +81 -30
- package/build/src/sync/server-change-feed.d.ts +14 -2
- package/build/src/sync/server-change-feed.d.ts.map +1 -1
- package/build/src/sync/server-change-feed.js +50 -10
- package/build/src/sync/sync-scope-store.d.ts +13 -2
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +48 -7
- package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts +43 -1
- package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts.map +1 -1
- package/build/src/tenants/frontend-tenant-sqlite-lifecycle.js +141 -17
- package/build/src/tenants/tenant-handle.d.ts +36 -0
- package/build/src/tenants/tenant-handle.d.ts.map +1 -1
- package/build/src/tenants/tenant-handle.js +73 -3
- package/build/src/testing/browser-test-app.js +3 -1
- package/build/src/testing/browser-use-database-hook-scenarios.d.ts +16 -0
- package/build/src/testing/browser-use-database-hook-scenarios.d.ts.map +1 -0
- package/build/src/testing/browser-use-database-hook-scenarios.js +182 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +9 -8
- package/build/src/utils/model-scope.d.ts +2 -2
- package/build/src/utils/model-scope.d.ts.map +1 -1
- package/build/src/utils/model-scope.js +5 -3
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +5 -3
- package/build/sync/server-change-feed.js +58 -8
- package/build/sync/sync-scope-store.js +55 -5
- package/build/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
- package/build/tenants/tenant-handle.js +90 -6
- package/build/testing/browser-test-app.js +2 -0
- package/build/testing/browser-use-database-hook-scenarios.js +204 -0
- package/build/testing/test-runner.js +8 -7
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/model-scope.js +5 -2
- package/build/utils/ransack.js +5 -2
- package/package.json +2 -1
- package/scripts/browser-test-session.js +60 -0
- package/scripts/test-browser.js +7 -7
- package/src/configuration.js +109 -14
- package/src/database/drivers/base.js +30 -0
- package/src/database/migrator.js +90 -24
- package/src/database/operation.js +55 -4
- package/src/database/query/join-object.js +7 -4
- package/src/database/query/model-class-query.js +38 -7
- package/src/database/query/preloader/belongs-to.js +9 -6
- package/src/database/query/preloader/has-many.js +25 -14
- package/src/database/query/preloader/has-one.js +7 -4
- package/src/database/query/preloader/query-for-model.js +16 -1
- package/src/database/query/preloader.js +6 -4
- package/src/database/query/query-data.js +3 -3
- package/src/database/query/where-model-class-hash.js +8 -4
- package/src/database/query/with-count.js +4 -3
- package/src/database/record/index.js +148 -5
- package/src/database/record/instance-relationships/base.js +13 -0
- package/src/database/record/instance-relationships/belongs-to.js +1 -1
- package/src/database/record/instance-relationships/has-many.js +5 -2
- package/src/database/record/instance-relationships/has-one.js +1 -1
- package/src/database/record/relationships/base.js +17 -0
- package/src/database/use-database.js +81 -28
- package/src/sync/server-change-feed.js +58 -8
- package/src/sync/sync-scope-store.js +55 -5
- package/src/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
- package/src/tenants/tenant-handle.js +90 -6
- package/src/testing/browser-test-app.js +2 -0
- package/src/testing/browser-use-database-hook-scenarios.js +204 -0
- package/src/testing/test-runner.js +8 -7
- package/src/utils/model-scope.js +5 -2
- package/src/utils/ransack.js +5 -2
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import Migrator from "../database/migrator.js";
|
|
2
3
|
/**
|
|
3
4
|
* TenantDescriptorValue type.
|
|
4
5
|
* @typedef {null | boolean | number | string | TenantDescriptorValue[] | {[key: string]: TenantDescriptorValue}} TenantDescriptorValue
|
|
5
6
|
*/
|
|
6
7
|
/** @typedef {{[key: string]: TenantDescriptorValue}} TenantDescriptor */
|
|
7
|
-
/** @typedef {{databaseIdentifier: string, dirty: boolean, lastUsed: number, pinCount: number, state: "closed" | "closing" | "deleting" | "open" | "opening"}} TenantSqliteLifecycleSnapshot */
|
|
8
|
+
/** @typedef {{databaseIdentifier: string, dirty: boolean, lastUsed: number, pinCount: number, ready: boolean, schemaGeneration: string | undefined, state: "closed" | "closing" | "deleting" | "open" | "opening"}} TenantSqliteLifecycleSnapshot */
|
|
8
9
|
/**
|
|
9
10
|
* Returns a readable path for a captured descriptor/configuration value.
|
|
10
11
|
* @param {string} path - Parent path.
|
|
@@ -176,6 +177,16 @@ export default class TenantHandle {
|
|
|
176
177
|
tenant() {
|
|
177
178
|
return this._tenant;
|
|
178
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Rejects using this handle with a different Configuration instance.
|
|
182
|
+
* @param {import("../configuration.js").default} configuration - Expected owner.
|
|
183
|
+
* @returns {void}
|
|
184
|
+
*/
|
|
185
|
+
assertConfiguration(configuration) {
|
|
186
|
+
if (configuration !== this._configuration) {
|
|
187
|
+
throw new Error("Tenant handle belongs to a different Velocious configuration");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
179
190
|
/**
|
|
180
191
|
* Returns the captured physical configuration for an active identifier.
|
|
181
192
|
* @param {string} databaseIdentifier - Logical database identifier.
|
|
@@ -197,6 +208,53 @@ export default class TenantHandle {
|
|
|
197
208
|
const { databaseIdentifier } = options;
|
|
198
209
|
return await this._configuration.getFrontendTenantSqliteLifecycle().open(databaseIdentifier, this.databaseConfiguration(databaseIdentifier));
|
|
199
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Opens, migrates, and initializes record metadata for one captured physical
|
|
213
|
+
* tenant SQLite database and application schema generation.
|
|
214
|
+
* @param {object} options - Initialization options.
|
|
215
|
+
* @param {string} options.databaseIdentifier - Tenant-only logical database identifier.
|
|
216
|
+
* @param {import("../database/migrator/types.js").RequireMigrationContextType} options.migrations - Frontend migration require context.
|
|
217
|
+
* @param {string} options.schemaGeneration - Stable application schema generation.
|
|
218
|
+
* @returns {Promise<Readonly<TenantSqliteLifecycleSnapshot>>} - Ready lifecycle snapshot.
|
|
219
|
+
*/
|
|
220
|
+
async initialize({ databaseIdentifier, migrations, schemaGeneration }) {
|
|
221
|
+
if (!migrations || typeof migrations !== "function" || typeof migrations.keys !== "function") {
|
|
222
|
+
throw new TypeError("TenantHandle.initialize requires a migrations require context");
|
|
223
|
+
}
|
|
224
|
+
const databaseConfiguration = this.databaseConfiguration(databaseIdentifier);
|
|
225
|
+
const lifecycle = this._configuration.getFrontendTenantSqliteLifecycle();
|
|
226
|
+
return await lifecycle.initialize(databaseIdentifier, databaseConfiguration, schemaGeneration, async () => {
|
|
227
|
+
await this._databaseOperation({
|
|
228
|
+
databaseIdentifier,
|
|
229
|
+
name: `Initialize frontend tenant database: ${databaseIdentifier}`,
|
|
230
|
+
requireReady: false,
|
|
231
|
+
schemaGeneration
|
|
232
|
+
}, async (operation) => {
|
|
233
|
+
const migrator = new Migrator({ configuration: this._configuration, databaseIdentifiers: [databaseIdentifier] });
|
|
234
|
+
operation.connection().clearSchemaCache();
|
|
235
|
+
await migrator.migrateRequireContextForDatabase({
|
|
236
|
+
databaseConfiguration,
|
|
237
|
+
databaseIdentifier,
|
|
238
|
+
db: operation.connection(),
|
|
239
|
+
requireContext: migrations
|
|
240
|
+
});
|
|
241
|
+
await this._configuration.initializeModels({ type: "frontend-tenant" });
|
|
242
|
+
for (const modelClass of Object.values(this._configuration.getModelClasses())) {
|
|
243
|
+
if (modelClass.getDatabaseIdentifier({ tenant: this._tenant }) !== databaseIdentifier)
|
|
244
|
+
continue;
|
|
245
|
+
const table = await operation.connection().getTableByName(modelClass.tableName(), { throwError: false });
|
|
246
|
+
if (!table && !modelClass.getEagerLoadRecordMetadata())
|
|
247
|
+
continue;
|
|
248
|
+
if (Object.keys(modelClass.getTranslationsMap()).length > 0) {
|
|
249
|
+
const translationsTable = await operation.connection().getTableByName(modelClass.getTranslationsTableName(), { throwError: false });
|
|
250
|
+
if (!translationsTable && !modelClass.getEagerLoadRecordMetadata())
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
await operation.ensureModelInitialized(modelClass);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
}
|
|
200
258
|
/**
|
|
201
259
|
* Flushes this captured SQLite identity.
|
|
202
260
|
* @param {{databaseIdentifier: string}} options - Lifecycle options.
|
|
@@ -253,11 +311,23 @@ export default class TenantHandle {
|
|
|
253
311
|
* @returns {Promise<T>} - Callback result.
|
|
254
312
|
*/
|
|
255
313
|
async databaseOperation({ databaseIdentifier, name = "TenantHandle.databaseOperation" }, callback) {
|
|
314
|
+
return await this._databaseOperation({ databaseIdentifier, name, requireReady: true }, callback);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Runs a captured operation with explicit readiness policy. Initialization is
|
|
318
|
+
* the only caller allowed to enter an unready schema generation.
|
|
319
|
+
* @template T
|
|
320
|
+
* @param {{databaseIdentifier: string, name: string, requireReady: boolean, schemaGeneration?: string}} options - Internal operation options.
|
|
321
|
+
* @param {(operation: import("../database/operation.js").default) => Promise<T>} callback - Operation callback.
|
|
322
|
+
* @returns {Promise<T>} - Callback result.
|
|
323
|
+
*/
|
|
324
|
+
async _databaseOperation({ databaseIdentifier, name, requireReady, schemaGeneration }, callback) {
|
|
256
325
|
const databaseConfiguration = this.databaseConfiguration(databaseIdentifier);
|
|
257
|
-
return await this._configuration.getFrontendTenantSqliteLifecycle().databaseOperation(databaseIdentifier, databaseConfiguration, async () => await this._configuration.withDatabaseOperation({
|
|
326
|
+
return await this._configuration.getFrontendTenantSqliteLifecycle().databaseOperation(databaseIdentifier, databaseConfiguration, { requireReady, schemaGeneration }, async (operationSchemaGeneration) => await this._configuration.withDatabaseOperation({
|
|
258
327
|
databaseConfiguration,
|
|
259
328
|
databaseIdentifier,
|
|
260
329
|
name,
|
|
330
|
+
schemaGeneration: operationSchemaGeneration,
|
|
261
331
|
tenant: this._tenant
|
|
262
332
|
}, callback));
|
|
263
333
|
}
|
|
@@ -275,4 +345,4 @@ export default class TenantHandle {
|
|
|
275
345
|
});
|
|
276
346
|
}
|
|
277
347
|
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILHlFQUF5RTtBQUN6RSwrTEFBK0w7QUFFL0w7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRztJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFBO0lBRXJELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUs7SUFDcEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEtBQUs7UUFDTCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUztJQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMs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QUFFLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksR0FBRyxnQ0FBZ0MsRUFBQyxFQUFFLFFBQVE7UUFDN0YsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUM1RSxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDO1lBQzNMLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsSUFBSTtZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztTQUNyQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsMEJBQTBCLEVBQUMsRUFBRSxRQUFRO1FBQ2pGLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDbEYsT0FBTyxNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzNFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogVGVuYW50RGVzY3JpcHRvclZhbHVlIHR5cGUuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBUZW5hbnREZXNjcmlwdG9yVmFsdWVbXSB8IHtba2V5OiBzdHJpbmddOiBUZW5hbnREZXNjcmlwdG9yVmFsdWV9fSBUZW5hbnREZXNjcmlwdG9yVmFsdWVcbiAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogVGVuYW50RGVzY3JpcHRvclZhbHVlfX0gVGVuYW50RGVzY3JpcHRvciAqL1xuLyoqIEB0eXBlZGVmIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGRpcnR5OiBib29sZWFuLCBsYXN0VXNlZDogbnVtYmVyLCBwaW5Db3VudDogbnVtYmVyLCBzdGF0ZTogXCJjbG9zZWRcIiB8IFwiY2xvc2luZ1wiIHwgXCJkZWxldGluZ1wiIHwgXCJvcGVuXCIgfCBcIm9wZW5pbmdcIn19IFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90ICovXG5cbi8qKlxuICogUmV0dXJucyBhIHJlYWRhYmxlIHBhdGggZm9yIGEgY2FwdHVyZWQgZGVzY3JpcHRvci9jb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJlbnQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBDaGlsZCBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIENoaWxkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNoaWxkUGF0aChwYXRoLCBrZXkpIHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHJldHVybiBgJHtwYXRofVske2tleX1dYFxuXG4gIHJldHVybiBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3MgbGFiZWwgZm9yIGFuIHVuc3VwcG9ydGVkIGNhcHR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWUgLSBVbnN1cHBvcnRlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUnVudGltZSBjbGFzcyBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gdmFsdWVDbGFzc05hbWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lIHx8IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBEZWZpbmVzIG9uZSBjYXB0dXJlZCBrZXkgd2l0aG91dCBpbnZva2luZyBpbmhlcml0ZWQgc2V0dGVycyBzdWNoIGFzXG4gKiBgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX19gLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHRhcmdldCAtIENhcHR1cmVkIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBPd24ga2V5IHRvIGRlZmluZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIERlZXBseSBjb3BpZXMgYW5kIGZyZWV6ZXMgYSBKU09OLWNvbXBhdGlibGUgdGVuYW50IGRlc2NyaXB0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIGNhcHR1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlc2NyaXB0b3IgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IGFuY2VzdG9ycyAtIEFjdGl2ZSBhbmNlc3RvciBvYmplY3RzIHVzZWQgZm9yIGN5Y2xlIGRldGVjdGlvbi5cbiAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yVmFsdWV9IC0gSW1tdXRhYmxlIGNhcHR1cmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlVGVuYW50VmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSlcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgY2FwdHVyZWRFbnRyaWVzID0gdmFsdWUubWFwKChlbnRyeSwgaW5kZXgpID0+IGNhcHR1cmVUZW5hbnRWYWx1ZShlbnRyeSwgY2hpbGRQYXRoKHBhdGgsIGluZGV4KSwgYW5jZXN0b3JzKSlcblxuICAgICAgT2JqZWN0LmZyZWV6ZShjYXB0dXJlZEVudHJpZXMpXG5cbiAgICAgIHJldHVybiBjYXB0dXJlZEVudHJpZXNcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovXG4gICAgY29uc3QgY2FwdHVyZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBkZWZpbmVDYXB0dXJlZERhdGFQcm9wZXJ0eShjYXB0dXJlZCwga2V5LCBjYXB0dXJlVGVuYW50VmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIHJvb3QgYXBwbGljYXRpb24gdGVuYW50IGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIHRlbmFudCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1RlbmFudERlc2NyaXB0b3J9IC0gSW1tdXRhYmxlIGRlc2NyaXB0b3Igc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVUZW5hbnQodGVuYW50KSB7XG4gIHJldHVybiAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovIChjYXB0dXJlVGVuYW50VmFsdWUodGVuYW50LCBcIlwiLCBuZXcgU2V0KCkpKVxufVxuXG4vKipcbiAqIERlZXBseSBjYXB0dXJlcyBjb25maWd1cmF0aW9uIHZhbHVlcyB3aGlsZSByZXRhaW5pbmcgZnVuY3Rpb24vY2xhc3MgaWRlbnRpdGllcy5cbiAqIE11dGFibGUgbm9uLXBsYWluIHJ1bnRpbWUgb2JqZWN0cyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSByZXRhaW5pbmcgdGhlbSB3b3VsZCBsZXRcbiAqIGNhbGxlcnMgcmVkaXJlY3QgYSBoYW5kbGUgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDb25maWd1cmF0aW9uIHBhdGguXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBhbmNlc3RvcnMgLSBBY3RpdmUgYW5jZXN0b3Igb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBJbW11dGFibGUgY2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmIChPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIG11dGFibGUgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgfVxuXG4gIGFuY2VzdG9ycy5hZGQodmFsdWUpXG5cbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGVudHJ5LCBjaGlsZFBhdGgocGF0aCwgaW5kZXgpLCBhbmNlc3RvcnMpKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjYXB0dXJlZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KGNhcHR1cmVkLCBrZXksIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYW5kIGRlZXBseSBmcmVlemVzIGEgcmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIChcbiAgICBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgXCJkYXRhYmFzZUNvbmZpZ3VyYXRpb25cIiwgbmV3IFNldCgpKVxuICApXG59XG5cbi8qKlxuICogSW1tdXRhYmxlIHRlbmFudC9kYXRhYmFzZSBoYW5kbGUuIFBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZVxuICogcmVzb2x2ZWQgYW5kIGNhcHR1cmVkIGF0IGNvbnN0cnVjdGlvbiwgc28gbGF0ZXIgYW1iaWVudCB0ZW5hbnQgY2hhbmdlc1xuICogY2Fubm90IHJlZGlyZWN0IHdvcmsgcGVyZm9ybWVkIHRocm91Z2ggdGhpcyBoYW5kbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudEhhbmRsZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhhbmRsZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPd25pbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MudGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIGFwcGxpY2F0aW9uIHRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHRlbmFudH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb25cIilcbiAgICBpZiAoIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodGVuYW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIHRlbmFudCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBjYXB0dXJlZFRlbmFudCA9IGNhcHR1cmVUZW5hbnQodGVuYW50KVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPn0gKi9cbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGNvbnN0IGRpc2FibGVkSWRlbnRpZmllcnMgPSBjb25maWd1cmF0aW9uLmdldERpc2FibGVkRGF0YWJhc2VJZGVudGlmaWVycygpXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgIGlmIChkaXNhYmxlZElkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkgY29udGludWVcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc0RhdGFiYXNlSWRlbnRpZmllckFjdGl2ZShpZGVudGlmaWVyLCBjYXB0dXJlZFRlbmFudCkpIGNvbnRpbnVlXG5cbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbnNbaWRlbnRpZmllcl0gPSBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKFxuICAgICAgICBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciwgY2FwdHVyZWRUZW5hbnQpXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmZyZWV6ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb25zKVxuICAgIHRoaXMuX3RlbmFudCA9IGNhcHR1cmVkVGVuYW50XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgdGVuYW50IGRlc2NyaXB0b3IuIFJvdXRpbmcgbmV2ZXIgcmUtcmVzb2x2ZXMgcGh5c2ljYWxcbiAgICogaWRlbnRpdHkgZnJvbSB0aGlzIHZhbHVlIGFmdGVyIGhhbmRsZSBjb25zdHJ1Y3Rpb24uXG4gICAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yfSAtIFRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgdGVuYW50KCkge1xuICAgIHJldHVybiB0aGlzLl90ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uIGZvciBhbiBhY3RpdmUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuX2RhdGFiYXNlQ29uZmlndXJhdGlvbnNbZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgaWYgKCFkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvciBpbmFjdGl2ZSBkYXRhYmFzZSBpZGVudGlmaWVyIGZvciB0ZW5hbnQgaGFuZGxlOiAke2RhdGFiYXNlSWRlbnRpZmllcn1gKVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhYmFzZUNvbmZpZ3VyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90Pj59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBvcGVuKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLm9wZW4oZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgZmx1c2gob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZmx1c2goZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGZsdXNoPzogYm9vbGVhbn19IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBTYWZlIGxpZmVjeWNsZSBzbmFwc2hvdC5cbiAgICovXG4gIGFzeW5jIGNsb3NlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyLCBmbHVzaCA9IGZhbHNlfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmNsb3NlKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSwge2ZsdXNofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBDbG9zZWQgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmRlbGV0ZShkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdHMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgaW5zcGVjdChvcHRpb25zKSB7XG4gICAgY29uc3Qge2RhdGFiYXNlSWRlbnRpZmllcn0gPSBvcHRpb25zXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS5pbnNwZWN0KGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdvcmsgd2hpbGUgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkgaXMgcHJvdGVjdGVkIGZyb20gZXZpY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGlubmVkIHdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhQaW4oe2RhdGFiYXNlSWRlbnRpZmllcn0sIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS53aXRoUGluKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBPUk0gd29yayBvbiBvbmUgcGlubmVkIGNvbm5lY3Rpb24gZm9yIHRoaXMgaGFuZGxlJ3MgY2FwdHVyZWRcbiAgICogcGh5c2ljYWwgZGF0YWJhc2UuIFVzZSBgb3BlcmF0aW9uLmZvck1vZGVsKE1vZGVsQ2xhc3MpYCBmb3IgcXVlcmllcyBhbmRcbiAgICogd3JpdGVzOyBsb2FkZWQgcmVjb3JkcyBhbmQgYXNzb2NpYXRpb24vcHJlbG9hZCB3b3JrIHJldGFpbiB0aGF0IG9wZXJhdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9fSBvcHRpb25zIC0gTG9naWNhbCBkYXRhYmFzZSBhbmQgY2hlY2tvdXQgbmFtZS5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPd25lZCB3b3JrIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBkYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lID0gXCJUZW5hbnRIYW5kbGUuZGF0YWJhc2VPcGVyYXRpb25cIn0sIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGF0YWJhc2VPcGVyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24ud2l0aERhdGFiYXNlT3BlcmF0aW9uKHtcbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbixcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcixcbiAgICAgIG5hbWUsXG4gICAgICB0ZW5hbnQ6IHRoaXMuX3RlbmFudFxuICAgIH0sIGNhbGxiYWNrKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IE9STSB3b3JrIGluIGEgdHJhbnNhY3Rpb24gcGlubmVkIHRvIHRoaXMgaGFuZGxlJ3MgY2FwdHVyZWRcbiAgICogcGh5c2ljYWwgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCBuYW1lPzogc3RyaW5nfX0gb3B0aW9ucyAtIExvZ2ljYWwgZGF0YWJhc2UgYW5kIGNoZWNrb3V0IG5hbWUuXG4gICAqIEBwYXJhbSB7KG9wZXJhdGlvbjogaW1wb3J0KFwiLi4vZGF0YWJhc2Uvb3BlcmF0aW9uLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gVHJhbnNhY3Rpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWUgPSBcIlRlbmFudEhhbmRsZS50cmFuc2FjdGlvblwifSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5kYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lfSwgYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbi50cmFuc2FjdGlvbihhc3luYyAoKSA9PiBhd2FpdCBjYWxsYmFjayhvcGVyYXRpb24pKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLHlCQUF5QixDQUFBO0FBRTlDOzs7R0FHRztBQUNILHlFQUF5RTtBQUN6RSxxUEFBcVA7QUFFclA7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRztJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFBO0lBRXJELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUs7SUFDcEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEtBQUs7UUFDTCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUztJQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzRixJQUFJLE9B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QUFDLENBQ2IsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksR0FBRywwQkFBMEIsRUFBQyxFQUFFLFFBQVE7UUFDakYsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUNsRixPQUFPLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDM0UsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IE1pZ3JhdG9yIGZyb20gXCIuLi9kYXRhYmFzZS9taWdyYXRvci5qc1wiXG5cbi8qKlxuICogVGVuYW50RGVzY3JpcHRvclZhbHVlIHR5cGUuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBUZW5hbnREZXNjcmlwdG9yVmFsdWVbXSB8IHtba2V5OiBzdHJpbmddOiBUZW5hbnREZXNjcmlwdG9yVmFsdWV9fSBUZW5hbnREZXNjcmlwdG9yVmFsdWVcbiAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogVGVuYW50RGVzY3JpcHRvclZhbHVlfX0gVGVuYW50RGVzY3JpcHRvciAqL1xuLyoqIEB0eXBlZGVmIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGRpcnR5OiBib29sZWFuLCBsYXN0VXNlZDogbnVtYmVyLCBwaW5Db3VudDogbnVtYmVyLCByZWFkeTogYm9vbGVhbiwgc2NoZW1hR2VuZXJhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogXCJjbG9zZWRcIiB8IFwiY2xvc2luZ1wiIHwgXCJkZWxldGluZ1wiIHwgXCJvcGVuXCIgfCBcIm9wZW5pbmdcIn19IFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90ICovXG5cbi8qKlxuICogUmV0dXJucyBhIHJlYWRhYmxlIHBhdGggZm9yIGEgY2FwdHVyZWQgZGVzY3JpcHRvci9jb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJlbnQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBDaGlsZCBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIENoaWxkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNoaWxkUGF0aChwYXRoLCBrZXkpIHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHJldHVybiBgJHtwYXRofVske2tleX1dYFxuXG4gIHJldHVybiBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3MgbGFiZWwgZm9yIGFuIHVuc3VwcG9ydGVkIGNhcHR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWUgLSBVbnN1cHBvcnRlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUnVudGltZSBjbGFzcyBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gdmFsdWVDbGFzc05hbWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lIHx8IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBEZWZpbmVzIG9uZSBjYXB0dXJlZCBrZXkgd2l0aG91dCBpbnZva2luZyBpbmhlcml0ZWQgc2V0dGVycyBzdWNoIGFzXG4gKiBgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX19gLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHRhcmdldCAtIENhcHR1cmVkIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBPd24ga2V5IHRvIGRlZmluZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIERlZXBseSBjb3BpZXMgYW5kIGZyZWV6ZXMgYSBKU09OLWNvbXBhdGlibGUgdGVuYW50IGRlc2NyaXB0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIGNhcHR1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlc2NyaXB0b3IgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IGFuY2VzdG9ycyAtIEFjdGl2ZSBhbmNlc3RvciBvYmplY3RzIHVzZWQgZm9yIGN5Y2xlIGRldGVjdGlvbi5cbiAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yVmFsdWV9IC0gSW1tdXRhYmxlIGNhcHR1cmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlVGVuYW50VmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSlcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgY2FwdHVyZWRFbnRyaWVzID0gdmFsdWUubWFwKChlbnRyeSwgaW5kZXgpID0+IGNhcHR1cmVUZW5hbnRWYWx1ZShlbnRyeSwgY2hpbGRQYXRoKHBhdGgsIGluZGV4KSwgYW5jZXN0b3JzKSlcblxuICAgICAgT2JqZWN0LmZyZWV6ZShjYXB0dXJlZEVudHJpZXMpXG5cbiAgICAgIHJldHVybiBjYXB0dXJlZEVudHJpZXNcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovXG4gICAgY29uc3QgY2FwdHVyZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBkZWZpbmVDYXB0dXJlZERhdGFQcm9wZXJ0eShjYXB0dXJlZCwga2V5LCBjYXB0dXJlVGVuYW50VmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIHJvb3QgYXBwbGljYXRpb24gdGVuYW50IGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIHRlbmFudCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1RlbmFudERlc2NyaXB0b3J9IC0gSW1tdXRhYmxlIGRlc2NyaXB0b3Igc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVUZW5hbnQodGVuYW50KSB7XG4gIHJldHVybiAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovIChjYXB0dXJlVGVuYW50VmFsdWUodGVuYW50LCBcIlwiLCBuZXcgU2V0KCkpKVxufVxuXG4vKipcbiAqIERlZXBseSBjYXB0dXJlcyBjb25maWd1cmF0aW9uIHZhbHVlcyB3aGlsZSByZXRhaW5pbmcgZnVuY3Rpb24vY2xhc3MgaWRlbnRpdGllcy5cbiAqIE11dGFibGUgbm9uLXBsYWluIHJ1bnRpbWUgb2JqZWN0cyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSByZXRhaW5pbmcgdGhlbSB3b3VsZCBsZXRcbiAqIGNhbGxlcnMgcmVkaXJlY3QgYSBoYW5kbGUgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDb25maWd1cmF0aW9uIHBhdGguXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBhbmNlc3RvcnMgLSBBY3RpdmUgYW5jZXN0b3Igb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBJbW11dGFibGUgY2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmIChPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIG11dGFibGUgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgfVxuXG4gIGFuY2VzdG9ycy5hZGQodmFsdWUpXG5cbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGVudHJ5LCBjaGlsZFBhdGgocGF0aCwgaW5kZXgpLCBhbmNlc3RvcnMpKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjYXB0dXJlZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KGNhcHR1cmVkLCBrZXksIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYW5kIGRlZXBseSBmcmVlemVzIGEgcmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIChcbiAgICBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgXCJkYXRhYmFzZUNvbmZpZ3VyYXRpb25cIiwgbmV3IFNldCgpKVxuICApXG59XG5cbi8qKlxuICogSW1tdXRhYmxlIHRlbmFudC9kYXRhYmFzZSBoYW5kbGUuIFBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZVxuICogcmVzb2x2ZWQgYW5kIGNhcHR1cmVkIGF0IGNvbnN0cnVjdGlvbiwgc28gbGF0ZXIgYW1iaWVudCB0ZW5hbnQgY2hhbmdlc1xuICogY2Fubm90IHJlZGlyZWN0IHdvcmsgcGVyZm9ybWVkIHRocm91Z2ggdGhpcyBoYW5kbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudEhhbmRsZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhhbmRsZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPd25pbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MudGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIGFwcGxpY2F0aW9uIHRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHRlbmFudH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb25cIilcbiAgICBpZiAoIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodGVuYW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIHRlbmFudCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBjYXB0dXJlZFRlbmFudCA9IGNhcHR1cmVUZW5hbnQodGVuYW50KVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPn0gKi9cbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGNvbnN0IGRpc2FibGVkSWRlbnRpZmllcnMgPSBjb25maWd1cmF0aW9uLmdldERpc2FibGVkRGF0YWJhc2VJZGVudGlmaWVycygpXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgIGlmIChkaXNhYmxlZElkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkgY29udGludWVcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc0RhdGFiYXNlSWRlbnRpZmllckFjdGl2ZShpZGVudGlmaWVyLCBjYXB0dXJlZFRlbmFudCkpIGNvbnRpbnVlXG5cbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbnNbaWRlbnRpZmllcl0gPSBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKFxuICAgICAgICBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciwgY2FwdHVyZWRUZW5hbnQpXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmZyZWV6ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb25zKVxuICAgIHRoaXMuX3RlbmFudCA9IGNhcHR1cmVkVGVuYW50XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgdGVuYW50IGRlc2NyaXB0b3IuIFJvdXRpbmcgbmV2ZXIgcmUtcmVzb2x2ZXMgcGh5c2ljYWxcbiAgICogaWRlbnRpdHkgZnJvbSB0aGlzIHZhbHVlIGFmdGVyIGhhbmRsZSBjb25zdHJ1Y3Rpb24uXG4gICAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yfSAtIFRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgdGVuYW50KCkge1xuICAgIHJldHVybiB0aGlzLl90ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIHVzaW5nIHRoaXMgaGFuZGxlIHdpdGggYSBkaWZmZXJlbnQgQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBFeHBlY3RlZCBvd25lci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAhPT0gdGhpcy5fY29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGVuYW50IGhhbmRsZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IFZlbG9jaW91cyBjb25maWd1cmF0aW9uXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGFjdGl2ZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZGVudGlmaWVyIC0gTG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAtIENhcHR1cmVkIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5fZGF0YWJhc2VDb25maWd1cmF0aW9uc1tkYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICBpZiAoIWRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9yIGluYWN0aXZlIGRhdGFiYXNlIGlkZW50aWZpZXIgZm9yIHRlbmFudCBoYW5kbGU6ICR7ZGF0YWJhc2VJZGVudGlmaWVyfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uZmlndXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBTYWZlIGxpZmVjeWNsZSBzbmFwc2hvdC5cbiAgICovXG4gIGFzeW5jIG9wZW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkub3BlbihkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMsIG1pZ3JhdGVzLCBhbmQgaW5pdGlhbGl6ZXMgcmVjb3JkIG1ldGFkYXRhIGZvciBvbmUgY2FwdHVyZWQgcGh5c2ljYWxcbiAgICogdGVuYW50IFNRTGl0ZSBkYXRhYmFzZSBhbmQgYXBwbGljYXRpb24gc2NoZW1hIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gSW5pdGlhbGl6YXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZGF0YWJhc2VJZGVudGlmaWVyIC0gVGVuYW50LW9ubHkgbG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX0gb3B0aW9ucy5taWdyYXRpb25zIC0gRnJvbnRlbmQgbWlncmF0aW9uIHJlcXVpcmUgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NoZW1hR2VuZXJhdGlvbiAtIFN0YWJsZSBhcHBsaWNhdGlvbiBzY2hlbWEgZ2VuZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBSZWFkeSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKHtkYXRhYmFzZUlkZW50aWZpZXIsIG1pZ3JhdGlvbnMsIHNjaGVtYUdlbmVyYXRpb259KSB7XG4gICAgaWYgKCFtaWdyYXRpb25zIHx8IHR5cGVvZiBtaWdyYXRpb25zICE9PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIG1pZ3JhdGlvbnMua2V5cyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGVuYW50SGFuZGxlLmluaXRpYWxpemUgcmVxdWlyZXMgYSBtaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcilcbiAgICBjb25zdCBsaWZlY3ljbGUgPSB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKClcblxuICAgIHJldHVybiBhd2FpdCBsaWZlY3ljbGUuaW5pdGlhbGl6ZShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgc2NoZW1hR2VuZXJhdGlvbiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fZGF0YWJhc2VPcGVyYXRpb24oe1xuICAgICAgICBkYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICAgIG5hbWU6IGBJbml0aWFsaXplIGZyb250ZW5kIHRlbmFudCBkYXRhYmFzZTogJHtkYXRhYmFzZUlkZW50aWZpZXJ9YCxcbiAgICAgICAgcmVxdWlyZVJlYWR5OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hR2VuZXJhdGlvblxuICAgICAgfSwgYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcih7Y29uZmlndXJhdGlvbjogdGhpcy5fY29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyczogW2RhdGFiYXNlSWRlbnRpZmllcl19KVxuXG4gICAgICAgIG9wZXJhdGlvbi5jb25uZWN0aW9uKCkuY2xlYXJTY2hlbWFDYWNoZSgpXG4gICAgICAgIGF3YWl0IG1pZ3JhdG9yLm1pZ3JhdGVSZXF1aXJlQ29udGV4dEZvckRhdGFiYXNlKHtcbiAgICAgICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgICAgIGRiOiBvcGVyYXRpb24uY29ubmVjdGlvbigpLFxuICAgICAgICAgIHJlcXVpcmVDb250ZXh0OiBtaWdyYXRpb25zXG4gICAgICAgIH0pXG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZU1vZGVscyh7dHlwZTogXCJmcm9udGVuZC10ZW5hbnRcIn0pXG5cbiAgICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKSkpIHtcbiAgICAgICAgICBpZiAobW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGhpcy5fdGVuYW50fSkgIT09IGRhdGFiYXNlSWRlbnRpZmllcikgY29udGludWVcbiAgICAgICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IG9wZXJhdGlvbi5jb25uZWN0aW9uKCkuZ2V0VGFibGVCeU5hbWUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgICAgICAgIGlmICghdGFibGUgJiYgIW1vZGVsQ2xhc3MuZ2V0RWFnZXJMb2FkUmVjb3JkTWV0YWRhdGEoKSkgY29udGludWVcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbnNNYXAoKSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zVGFibGUgPSBhd2FpdCBvcGVyYXRpb24uY29ubmVjdGlvbigpLmdldFRhYmxlQnlOYW1lKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zVGFibGVOYW1lKCksIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICAgICAgICAgIGlmICghdHJhbnNsYXRpb25zVGFibGUgJiYgIW1vZGVsQ2xhc3MuZ2V0RWFnZXJMb2FkUmVjb3JkTWV0YWRhdGEoKSkgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBvcGVyYXRpb24uZW5zdXJlTW9kZWxJbml0aWFsaXplZChtb2RlbENsYXNzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2hlcyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90Pj59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBmbHVzaChvcHRpb25zKSB7XG4gICAgY29uc3Qge2RhdGFiYXNlSWRlbnRpZmllcn0gPSBvcHRpb25zXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS5mbHVzaChkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgZmx1c2g/OiBib29sZWFufX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgY2xvc2Uob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXIsIGZsdXNoID0gZmFsc2V9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuY2xvc2UoZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpLCB7Zmx1c2h9KVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIENsb3NlZCBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBkZWxldGUob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGVsZXRlKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNwZWN0cyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBpbnNwZWN0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmluc3BlY3QoZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd29yayB3aGlsZSB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eSBpcyBwcm90ZWN0ZWQgZnJvbSBldmljdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBQaW5uZWQgd29yay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aFBpbih7ZGF0YWJhc2VJZGVudGlmaWVyfSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLndpdGhQaW4oZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IE9STSB3b3JrIG9uIG9uZSBwaW5uZWQgY29ubmVjdGlvbiBmb3IgdGhpcyBoYW5kbGUncyBjYXB0dXJlZFxuICAgKiBwaHlzaWNhbCBkYXRhYmFzZS4gVXNlIGBvcGVyYXRpb24uZm9yTW9kZWwoTW9kZWxDbGFzcylgIGZvciBxdWVyaWVzIGFuZFxuICAgKiB3cml0ZXM7IGxvYWRlZCByZWNvcmRzIGFuZCBhc3NvY2lhdGlvbi9wcmVsb2FkIHdvcmsgcmV0YWluIHRoYXQgb3BlcmF0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgbmFtZT86IHN0cmluZ319IG9wdGlvbnMgLSBMb2dpY2FsIGRhdGFiYXNlIGFuZCBjaGVja291dCBuYW1lLlxuICAgKiBAcGFyYW0geyhvcGVyYXRpb246IGltcG9ydChcIi4uL2RhdGFiYXNlL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIE93bmVkIHdvcmsgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGRhdGFiYXNlT3BlcmF0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWUgPSBcIlRlbmFudEhhbmRsZS5kYXRhYmFzZU9wZXJhdGlvblwifSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGF0YWJhc2VPcGVyYXRpb24oe2RhdGFiYXNlSWRlbnRpZmllciwgbmFtZSwgcmVxdWlyZVJlYWR5OiB0cnVlfSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhcHR1cmVkIG9wZXJhdGlvbiB3aXRoIGV4cGxpY2l0IHJlYWRpbmVzcyBwb2xpY3kuIEluaXRpYWxpemF0aW9uIGlzXG4gICAqIHRoZSBvbmx5IGNhbGxlciBhbGxvd2VkIHRvIGVudGVyIGFuIHVucmVhZHkgc2NoZW1hIGdlbmVyYXRpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJlcXVpcmVSZWFkeTogYm9vbGVhbiwgc2NoZW1hR2VuZXJhdGlvbj86IHN0cmluZ319IG9wdGlvbnMgLSBJbnRlcm5hbCBvcGVyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF9kYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lLCByZXF1aXJlUmVhZHksIHNjaGVtYUdlbmVyYXRpb259LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGF0YWJhc2VPcGVyYXRpb24oXG4gICAgICBkYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sXG4gICAgICB7cmVxdWlyZVJlYWR5LCBzY2hlbWFHZW5lcmF0aW9ufSxcbiAgICAgIGFzeW5jIChvcGVyYXRpb25TY2hlbWFHZW5lcmF0aW9uKSA9PiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLndpdGhEYXRhYmFzZU9wZXJhdGlvbih7XG4gICAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbixcbiAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzY2hlbWFHZW5lcmF0aW9uOiBvcGVyYXRpb25TY2hlbWFHZW5lcmF0aW9uLFxuICAgICAgICB0ZW5hbnQ6IHRoaXMuX3RlbmFudFxuICAgICAgfSwgY2FsbGJhY2spXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhwbGljaXQgT1JNIHdvcmsgaW4gYSB0cmFuc2FjdGlvbiBwaW5uZWQgdG8gdGhpcyBoYW5kbGUncyBjYXB0dXJlZFxuICAgKiBwaHlzaWNhbCBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9fSBvcHRpb25zIC0gTG9naWNhbCBkYXRhYmFzZSBhbmQgY2hlY2tvdXQgbmFtZS5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBUcmFuc2FjdGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgdHJhbnNhY3Rpb24oe2RhdGFiYXNlSWRlbnRpZmllciwgbmFtZSA9IFwiVGVuYW50SGFuZGxlLnRyYW5zYWN0aW9uXCJ9LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRhdGFiYXNlT3BlcmF0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWV9LCBhc3luYyAob3BlcmF0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uLnRyYW5zYWN0aW9uKGFzeW5jICgpID0+IGF3YWl0IGNhbGxiYWNrKG9wZXJhdGlvbikpXG4gICAgfSlcbiAgfVxufVxuIl19
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import SystemTestBrowserHelper from "system-testing/build/system-test-browser-helper.js";
|
|
3
3
|
import BrowserEnvironmentHandler from "../environment-handlers/browser.js";
|
|
4
4
|
import runFrontendModelEventHookScenario from "./browser-frontend-model-event-hook-scenarios.js";
|
|
5
|
+
import runUseDatabaseSelectionTransitionScenario from "./browser-use-database-hook-scenarios.js";
|
|
5
6
|
const root = document.getElementById("root") || (() => {
|
|
6
7
|
const element = document.createElement("div");
|
|
7
8
|
element.id = "root";
|
|
@@ -21,6 +22,7 @@ systemTestBrowserHelper.enableOnBrowser();
|
|
|
21
22
|
Object.assign(globalThis, { velociousBrowserTest: {
|
|
22
23
|
BrowserEnvironmentHandler,
|
|
23
24
|
runFrontendModelEventHookScenario,
|
|
25
|
+
runUseDatabaseSelectionTransitionScenario,
|
|
24
26
|
systemTestBrowserHelper
|
|
25
27
|
} });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10ZXN0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItdGVzdC1hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sdUJBQXVCLE1BQU0sb0RBQW9ELENBQUE7QUFDeEYsT0FBTyx5QkFBeUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMxRSxPQUFPLGlDQUFpQyxNQUFNLGtEQUFrRCxDQUFBO0FBQ2hHLE9BQU8seUNBQXlDLE1BQU0sMENBQTBDLENBQUE7QUFFaEcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFBO0lBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xDLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFFSixNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDNUQsc0JBQXNCLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO0FBQzVFLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFFNUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtBQUNsRCxTQUFTLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQTtBQUUvQixzQkFBc0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBRXhDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFBO0FBQzdELHVCQUF1QixDQUFDLGVBQWUsRUFBRSxDQUFBO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsb0JBQW9CLEVBQUU7UUFDL0MseUJBQXlCO1FBQ3pCLGlDQUFpQztRQUNqQyx5Q0FBeUM7UUFDekMsdUJBQXVCO0tBQ3hCLEVBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlciBmcm9tIFwic3lzdGVtLXRlc3RpbmcvYnVpbGQvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIlxuaW1wb3J0IEJyb3dzZXJFbnZpcm9ubWVudEhhbmRsZXIgZnJvbSBcIi4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jyb3dzZXIuanNcIlxuaW1wb3J0IHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyBmcm9tIFwiLi9icm93c2VyLWZyb250ZW5kLW1vZGVsLWV2ZW50LWhvb2stc2NlbmFyaW9zLmpzXCJcbmltcG9ydCBydW5Vc2VEYXRhYmFzZVNlbGVjdGlvblRyYW5zaXRpb25TY2VuYXJpbyBmcm9tIFwiLi9icm93c2VyLXVzZS1kYXRhYmFzZS1ob29rLXNjZW5hcmlvcy5qc1wiXG5cbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikgfHwgKCgpID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgZWxlbWVudC5pZCA9IFwicm9vdFwiXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgcmV0dXJuIGVsZW1lbnRcbn0pKClcblxuY29uc3Qgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS10ZXN0aWRcIiwgXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG5zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZm9jdXNzZWRcIiwgXCJ0cnVlXCIpXG5cbmNvbnN0IGJsYW5rVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbmJsYW5rVGV4dC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRlc3RpZFwiLCBcImJsYW5rVGV4dFwiKVxuYmxhbmtUZXh0LnRleHRDb250ZW50ID0gXCJibGFua1wiXG5cbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuYXBwZW5kQ2hpbGQoYmxhbmtUZXh0KVxucm9vdC5hcHBlbmRDaGlsZChzeXN0ZW1UZXN0aW5nQ29tcG9uZW50KVxuXG5jb25zdCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IG5ldyBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5lbmFibGVPbkJyb3dzZXIoKVxuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHt2ZWxvY2lvdXNCcm93c2VyVGVzdDoge1xuICBCcm93c2VyRW52aXJvbm1lbnRIYW5kbGVyLFxuICBydW5Gcm9udGVuZE1vZGVsRXZlbnRIb29rU2NlbmFyaW8sXG4gIHJ1blVzZURhdGFiYXNlU2VsZWN0aW9uVHJhbnNpdGlvblNjZW5hcmlvLFxuICBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxufX0pXG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flushes real React hook transitions and reports synchronous selection state,
|
|
3
|
+
* inline loader stability, and stale completion suppression.
|
|
4
|
+
* @returns {Promise<{firstChangedLoaded: boolean, initialLoaded: boolean, loaderCalls: string[], loadedAfterInlineLoaderRerender: boolean, thirdAfterStaleCompletion: {error: string | null, loaded: boolean}}>} - Render observations.
|
|
5
|
+
*/
|
|
6
|
+
export default function runUseDatabaseSelectionTransitionScenario(): Promise<{
|
|
7
|
+
firstChangedLoaded: boolean;
|
|
8
|
+
initialLoaded: boolean;
|
|
9
|
+
loaderCalls: string[];
|
|
10
|
+
loadedAfterInlineLoaderRerender: boolean;
|
|
11
|
+
thirdAfterStaleCompletion: {
|
|
12
|
+
error: string | null;
|
|
13
|
+
loaded: boolean;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=browser-use-database-hook-scenarios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use-database-hook-scenarios.d.ts","sourceRoot":"","sources":["../../../src/testing/browser-use-database-hook-scenarios.js"],"names":[],"mappings":"AA6DA;;;;GAIG;AACH,wBAA8B,yCAAyC,IAF1D,OAAO,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,+BAA+B,EAAE,OAAO,CAAC;IAAC,yBAAyB,EAAE;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,CAAC,CA2I/M"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import React, { act } from "react";
|
|
3
|
+
import { createRoot } from "react-dom/client";
|
|
4
|
+
import Configuration, { CurrentConfigurationNotSetError } from "../configuration.js";
|
|
5
|
+
import BrowserEnvironmentHandler from "../environment-handlers/browser.js";
|
|
6
|
+
import Migration from "../database/migration/index.js";
|
|
7
|
+
import SingleMultiUsePool from "../database/pool/single-multi-use.js";
|
|
8
|
+
import SqliteWebDriver from "../database/drivers/sqlite/index.web.js";
|
|
9
|
+
import TenantHandle from "../tenants/tenant-handle.js";
|
|
10
|
+
import useDatabase from "../database/use-database.js";
|
|
11
|
+
/**
|
|
12
|
+
* Returns the current configuration without requiring one to exist.
|
|
13
|
+
* @returns {Configuration | undefined} - Current configuration when installed.
|
|
14
|
+
*/
|
|
15
|
+
function currentConfigurationOrUndefined() {
|
|
16
|
+
try {
|
|
17
|
+
return Configuration.current();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (!(error instanceof CurrentConfigurationNotSetError))
|
|
21
|
+
throw error;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Builds the scoped browser configuration used by the real hook scenario.
|
|
27
|
+
* @returns {Configuration} - Browser test configuration.
|
|
28
|
+
*/
|
|
29
|
+
function buildHookConfiguration() {
|
|
30
|
+
return new Configuration({
|
|
31
|
+
database: {
|
|
32
|
+
test: {
|
|
33
|
+
projectTenant: {
|
|
34
|
+
driver: SqliteWebDriver,
|
|
35
|
+
getConnection: async () => { throw new Error("Hook scenario must not open a physical database"); },
|
|
36
|
+
migrations: true,
|
|
37
|
+
name: "use-database-hook-template",
|
|
38
|
+
poolType: SingleMultiUsePool,
|
|
39
|
+
tenantOnly: true,
|
|
40
|
+
type: "sqlite"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
directory: "/use-database-hook-scenario",
|
|
45
|
+
environment: "test",
|
|
46
|
+
environmentHandler: new BrowserEnvironmentHandler(),
|
|
47
|
+
initializeModels: async () => { },
|
|
48
|
+
locale: "en",
|
|
49
|
+
localeFallbacks: { en: ["en"] },
|
|
50
|
+
locales: ["en"],
|
|
51
|
+
tenantDatabaseResolver: ({ identifier, tenant }) => {
|
|
52
|
+
if (identifier !== "projectTenant" || !tenant || typeof tenant !== "object")
|
|
53
|
+
return;
|
|
54
|
+
return { name: `use-database-hook-${String(/** @type {{slug?: string}} */ (tenant).slug)}` };
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Flushes real React hook transitions and reports synchronous selection state,
|
|
60
|
+
* inline loader stability, and stale completion suppression.
|
|
61
|
+
* @returns {Promise<{firstChangedLoaded: boolean, initialLoaded: boolean, loaderCalls: string[], loadedAfterInlineLoaderRerender: boolean, thirdAfterStaleCompletion: {error: string | null, loaded: boolean}}>} - Render observations.
|
|
62
|
+
*/
|
|
63
|
+
export default async function runUseDatabaseSelectionTransitionScenario() {
|
|
64
|
+
const container = document.createElement("div");
|
|
65
|
+
document.body.appendChild(container);
|
|
66
|
+
const root = createRoot(container);
|
|
67
|
+
/** @type {{error: string | null, loaded: boolean, selection: "first" | "second" | "third"}[]} */
|
|
68
|
+
const renders = [];
|
|
69
|
+
/** @type {string[]} */
|
|
70
|
+
const loaderCalls = [];
|
|
71
|
+
/**
|
|
72
|
+
* Releases the deliberately stale second initialization.
|
|
73
|
+
* @type {() => void}
|
|
74
|
+
*/
|
|
75
|
+
let releaseSecondInitialization = () => { };
|
|
76
|
+
const secondInitializationRelease = new Promise((resolve) => { releaseSecondInitialization = () => resolve(undefined); });
|
|
77
|
+
/**
|
|
78
|
+
* Signals that the deliberately stale second initialization started.
|
|
79
|
+
* @type {() => void}
|
|
80
|
+
*/
|
|
81
|
+
let signalSecondInitialization = () => { };
|
|
82
|
+
const secondInitializationStarted = new Promise((resolve) => { signalSecondInitialization = () => resolve(undefined); });
|
|
83
|
+
class HookTenantHandle extends TenantHandle {
|
|
84
|
+
/**
|
|
85
|
+
* Runs test initialization without touching a physical database.
|
|
86
|
+
* @param {{migrations: import("../database/migrator/types.js").RequireMigrationContextType}} args - Hook initialization arguments.
|
|
87
|
+
* @returns {Promise<Readonly<ReturnType<TenantHandle["inspect"]>>>} - Ready test snapshot.
|
|
88
|
+
*/
|
|
89
|
+
async initialize({ migrations }) {
|
|
90
|
+
loaderCalls.push(migrations.id);
|
|
91
|
+
if (this.tenant().slug === "second") {
|
|
92
|
+
signalSecondInitialization();
|
|
93
|
+
await secondInitializationRelease;
|
|
94
|
+
throw new Error("SECOND_SELECTION_FAILED");
|
|
95
|
+
}
|
|
96
|
+
return Object.freeze({ databaseIdentifier: "projectTenant", dirty: false, lastUsed: 0, pinCount: 0, ready: true, schemaGeneration: "generation-1", state: "open" });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const previousConfiguration = currentConfigurationOrUndefined();
|
|
100
|
+
const restorationConfiguration = previousConfiguration || buildHookConfiguration();
|
|
101
|
+
const configuration = buildHookConfiguration();
|
|
102
|
+
configuration.setCurrent();
|
|
103
|
+
const firstHandle = new HookTenantHandle({ configuration, tenant: { slug: "first" } });
|
|
104
|
+
const secondHandle = new HookTenantHandle({ configuration, tenant: { slug: "second" } });
|
|
105
|
+
const thirdHandle = new HookTenantHandle({ configuration, tenant: { slug: "third" } });
|
|
106
|
+
const renderCounts = { first: 0, second: 0, third: 0 };
|
|
107
|
+
/**
|
|
108
|
+
* Runs hook probe.
|
|
109
|
+
* @param {{selection: "first" | "second" | "third", tenantHandle: HookTenantHandle}} props - Probe props.
|
|
110
|
+
* @returns {React.ReactElement} - Empty host element.
|
|
111
|
+
*/
|
|
112
|
+
function HookProbe({ selection, tenantHandle }) {
|
|
113
|
+
const state = useDatabase({
|
|
114
|
+
databaseIdentifier: "projectTenant",
|
|
115
|
+
migrationsRequireContextCallback: async () => {
|
|
116
|
+
/**
|
|
117
|
+
* Looks up an empty migration context entry recreated by every probe render.
|
|
118
|
+
* @param {string} fileName - Requested migration file.
|
|
119
|
+
* @returns {{default: typeof Migration}} - Placeholder migration module.
|
|
120
|
+
* @type {import("../database/migrator/types.js").RequireMigrationContextType}
|
|
121
|
+
*/
|
|
122
|
+
const emptyMigrations = (fileName) => {
|
|
123
|
+
if (!fileName)
|
|
124
|
+
throw new Error("Migration context lookup requires a file name");
|
|
125
|
+
return { default: Migration };
|
|
126
|
+
};
|
|
127
|
+
emptyMigrations.keys = () => [];
|
|
128
|
+
emptyMigrations.id = selection;
|
|
129
|
+
return emptyMigrations;
|
|
130
|
+
},
|
|
131
|
+
schemaGeneration: "generation-1",
|
|
132
|
+
tenantHandle
|
|
133
|
+
});
|
|
134
|
+
renderCounts[selection]++;
|
|
135
|
+
if (renderCounts[selection] > 20)
|
|
136
|
+
throw new Error(`useDatabase render loop for ${selection}`);
|
|
137
|
+
renders.push({ error: state.error?.message || null, loaded: state.loaded, selection });
|
|
138
|
+
return React.createElement("div");
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
await act(async () => {
|
|
142
|
+
root.render(React.createElement(HookProbe, { selection: "first", tenantHandle: firstHandle }));
|
|
143
|
+
});
|
|
144
|
+
const initialRender = renders.at(-1);
|
|
145
|
+
await act(async () => {
|
|
146
|
+
root.render(React.createElement(HookProbe, { selection: "first", tenantHandle: firstHandle }));
|
|
147
|
+
});
|
|
148
|
+
const loadedAfterInlineLoaderRerender = renders.at(-1)?.loaded;
|
|
149
|
+
act(() => {
|
|
150
|
+
root.render(React.createElement(HookProbe, { selection: "second", tenantHandle: secondHandle }));
|
|
151
|
+
});
|
|
152
|
+
const firstChangedRender = renders.find((render) => render.selection === "second");
|
|
153
|
+
await secondInitializationStarted;
|
|
154
|
+
await act(async () => {
|
|
155
|
+
root.render(React.createElement(HookProbe, { selection: "third", tenantHandle: thirdHandle }));
|
|
156
|
+
});
|
|
157
|
+
releaseSecondInitialization();
|
|
158
|
+
await act(async () => { await secondInitializationRelease; });
|
|
159
|
+
const thirdAfterStaleCompletion = renders.at(-1);
|
|
160
|
+
if (!initialRender || !firstChangedRender || !thirdAfterStaleCompletion || loadedAfterInlineLoaderRerender === undefined) {
|
|
161
|
+
throw new Error("useDatabase hook scenario did not render every selection");
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
firstChangedLoaded: firstChangedRender.loaded,
|
|
165
|
+
initialLoaded: initialRender.loaded,
|
|
166
|
+
loaderCalls,
|
|
167
|
+
loadedAfterInlineLoaderRerender,
|
|
168
|
+
thirdAfterStaleCompletion: {
|
|
169
|
+
error: thirdAfterStaleCompletion.error,
|
|
170
|
+
loaded: thirdAfterStaleCompletion.loaded
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
releaseSecondInitialization();
|
|
176
|
+
await act(async () => { root.unmount(); });
|
|
177
|
+
container.remove();
|
|
178
|
+
restorationConfiguration.setCurrent();
|
|
179
|
+
await configuration.closeDatabaseConnections();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci11c2UtZGF0YWJhc2UtaG9vay1zY2VuYXJpb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9icm93c2VyLXVzZS1kYXRhYmFzZS1ob29rLXNjZW5hcmlvcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sYUFBYSxFQUFFLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUNsRixPQUFPLHlCQUF5QixNQUFNLG9DQUFvQyxDQUFBO0FBQzFFLE9BQU8sU0FBUyxNQUFNLGdDQUFnQyxDQUFBO0FBQ3RELE9BQU8sa0JBQWtCLE1BQU0sc0NBQXNDLENBQUE7QUFDckUsT0FBTyxlQUFlLE1BQU0seUNBQXlDLENBQUE7QUFDckUsT0FBTyxZQUFZLE1BQU0sNkJBQTZCLENBQUE7QUFDdEQsT0FBTyxXQUFXLE1BQU0sNkJBQTZCLENBQUE7QUFFckQ7OztHQUdHO0FBQ0gsU0FBUywrQkFBK0I7SUFDdEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksK0JBQStCLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQTtRQUVwRSxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE9BQU8sSUFBSSxhQUFhLENBQUM7UUFDdkIsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFO2dCQUNKLGFBQWEsRUFBRTtvQkFDYixNQUFNLEVBQUUsZUFBZTtvQkFDdkIsYUFBYSxFQUFFLEtBQUss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QztRQUVELE9BQU87WUFDTCxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO1lBQzdDLGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTTtZQUNuQyxXQUFXO1lBQ1gsK0JBQStCO1lBQy9CLHlCQUF5QixFQUFFO2dCQUN6QixLQUFLLEVBQUUseUJBQXlCLENBQUMsS0FBSztnQkFDdEMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU07YUFDekM7U0FDRixDQUFBO0lBQ0gsQ0FBQztZQUFTLENBQUM7UUFDVCwyQkFBMkIsRUFBRSxDQUFBO1FBQzdCLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2xCLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3JDLE1BQU0sYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUE7SUFDaEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFJlYWN0LCB7IGFjdCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge2NyZWF0ZVJvb3R9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCJcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24sIHtDdXJyZW50Q29uZmlndXJhdGlvbk5vdFNldEVycm9yfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQgQnJvd3NlckVudmlyb25tZW50SGFuZGxlciBmcm9tIFwiLi4vZW52aXJvbm1lbnQtaGFuZGxlcnMvYnJvd3Nlci5qc1wiXG5pbXBvcnQgTWlncmF0aW9uIGZyb20gXCIuLi9kYXRhYmFzZS9taWdyYXRpb24vaW5kZXguanNcIlxuaW1wb3J0IFNpbmdsZU11bHRpVXNlUG9vbCBmcm9tIFwiLi4vZGF0YWJhc2UvcG9vbC9zaW5nbGUtbXVsdGktdXNlLmpzXCJcbmltcG9ydCBTcWxpdGVXZWJEcml2ZXIgZnJvbSBcIi4uL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL2luZGV4LndlYi5qc1wiXG5pbXBvcnQgVGVuYW50SGFuZGxlIGZyb20gXCIuLi90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanNcIlxuaW1wb3J0IHVzZURhdGFiYXNlIGZyb20gXCIuLi9kYXRhYmFzZS91c2UtZGF0YWJhc2UuanNcIlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHJlcXVpcmluZyBvbmUgdG8gZXhpc3QuXG4gKiBAcmV0dXJucyB7Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IGNvbmZpZ3VyYXRpb24gd2hlbiBpbnN0YWxsZWQuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRDb25maWd1cmF0aW9uT3JVbmRlZmluZWQoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uY3VycmVudCgpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBDdXJyZW50Q29uZmlndXJhdGlvbk5vdFNldEVycm9yKSkgdGhyb3cgZXJyb3JcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2NvcGVkIGJyb3dzZXIgY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSByZWFsIGhvb2sgc2NlbmFyaW8uXG4gKiBAcmV0dXJucyB7Q29uZmlndXJhdGlvbn0gLSBCcm93c2VyIHRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIb29rQ29uZmlndXJhdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKHtcbiAgICBkYXRhYmFzZToge1xuICAgICAgdGVzdDoge1xuICAgICAgICBwcm9qZWN0VGVuYW50OiB7XG4gICAgICAgICAgZHJpdmVyOiBTcWxpdGVXZWJEcml2ZXIsXG4gICAgICAgICAgZ2V0Q29ubmVjdGlvbjogYXN5bmMgKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoXCJIb29rIHNjZW5hcmlvIG11c3Qgbm90IG9wZW4gYSBwaHlzaWNhbCBkYXRhYmFzZVwiKSB9LFxuICAgICAgICAgIG1pZ3JhdGlvbnM6IHRydWUsXG4gICAgICAgICAgbmFtZTogXCJ1c2UtZGF0YWJhc2UtaG9vay10ZW1wbGF0ZVwiLFxuICAgICAgICAgIHBvb2xUeXBlOiBTaW5nbGVNdWx0aVVzZVBvb2wsXG4gICAgICAgICAgdGVuYW50T25seTogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInNxbGl0ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRpcmVjdG9yeTogXCIvdXNlLWRhdGFiYXNlLWhvb2stc2NlbmFyaW9cIixcbiAgICBlbnZpcm9ubWVudDogXCJ0ZXN0XCIsXG4gICAgZW52aXJvbm1lbnRIYW5kbGVyOiBuZXcgQnJvd3NlckVudmlyb25tZW50SGFuZGxlcigpLFxuICAgIGluaXRpYWxpemVNb2RlbHM6IGFzeW5jICgpID0+IHt9LFxuICAgIGxvY2FsZTogXCJlblwiLFxuICAgIGxvY2FsZUZhbGxiYWNrczoge2VuOiBbXCJlblwiXX0sXG4gICAgbG9jYWxlczogW1wiZW5cIl0sXG4gICAgdGVuYW50RGF0YWJhc2VSZXNvbHZlcjogKHtpZGVudGlmaWVyLCB0ZW5hbnR9KSA9PiB7XG4gICAgICBpZiAoaWRlbnRpZmllciAhPT0gXCJwcm9qZWN0VGVuYW50XCIgfHwgIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiKSByZXR1cm5cblxuICAgICAgcmV0dXJuIHtuYW1lOiBgdXNlLWRhdGFiYXNlLWhvb2stJHtTdHJpbmcoLyoqIEB0eXBlIHt7c2x1Zz86IHN0cmluZ319ICovICh0ZW5hbnQpLnNsdWcpfWB9XG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEZsdXNoZXMgcmVhbCBSZWFjdCBob29rIHRyYW5zaXRpb25zIGFuZCByZXBvcnRzIHN5bmNocm9ub3VzIHNlbGVjdGlvbiBzdGF0ZSxcbiAqIGlubGluZSBsb2FkZXIgc3RhYmlsaXR5LCBhbmQgc3RhbGUgY29tcGxldGlvbiBzdXBwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtmaXJzdENoYW5nZWRMb2FkZWQ6IGJvb2xlYW4sIGluaXRpYWxMb2FkZWQ6IGJvb2xlYW4sIGxvYWRlckNhbGxzOiBzdHJpbmdbXSwgbG9hZGVkQWZ0ZXJJbmxpbmVMb2FkZXJSZXJlbmRlcjogYm9vbGVhbiwgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbjoge2Vycm9yOiBzdHJpbmcgfCBudWxsLCBsb2FkZWQ6IGJvb2xlYW59fT59IC0gUmVuZGVyIG9ic2VydmF0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcnVuVXNlRGF0YWJhc2VTZWxlY3Rpb25UcmFuc2l0aW9uU2NlbmFyaW8oKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpXG4gIGNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGNvbnRhaW5lcilcbiAgLyoqIEB0eXBlIHt7ZXJyb3I6IHN0cmluZyB8IG51bGwsIGxvYWRlZDogYm9vbGVhbiwgc2VsZWN0aW9uOiBcImZpcnN0XCIgfCBcInNlY29uZFwiIHwgXCJ0aGlyZFwifVtdfSAqL1xuICBjb25zdCByZW5kZXJzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9hZGVyQ2FsbHMgPSBbXVxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIGRlbGliZXJhdGVseSBzdGFsZSBzZWNvbmQgaW5pdGlhbGl6YXRpb24uXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHJlbGVhc2VTZWNvbmRJbml0aWFsaXphdGlvbiA9ICgpID0+IHt9XG4gIGNvbnN0IHNlY29uZEluaXRpYWxpemF0aW9uUmVsZWFzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2VTZWNvbmRJbml0aWFsaXphdGlvbiA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICAvKipcbiAgICogU2lnbmFscyB0aGF0IHRoZSBkZWxpYmVyYXRlbHkgc3RhbGUgc2Vjb25kIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQuXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHNpZ25hbFNlY29uZEluaXRpYWxpemF0aW9uID0gKCkgPT4ge31cbiAgY29uc3Qgc2Vjb25kSW5pdGlhbGl6YXRpb25TdGFydGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgc2lnbmFsU2Vjb25kSW5pdGlhbGl6YXRpb24gPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkgfSlcblxuICBjbGFzcyBIb29rVGVuYW50SGFuZGxlIGV4dGVuZHMgVGVuYW50SGFuZGxlIHtcbiAgICAvKipcbiAgICAgKiBSdW5zIHRlc3QgaW5pdGlhbGl6YXRpb24gd2l0aG91dCB0b3VjaGluZyBhIHBoeXNpY2FsIGRhdGFiYXNlLlxuICAgICAqIEBwYXJhbSB7e21pZ3JhdGlvbnM6IGltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX19IGFyZ3MgLSBIb29rIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxSZXR1cm5UeXBlPFRlbmFudEhhbmRsZVtcImluc3BlY3RcIl0+Pj59IC0gUmVhZHkgdGVzdCBzbmFwc2hvdC5cbiAgICAgKi9cbiAgICBhc3luYyBpbml0aWFsaXplKHttaWdyYXRpb25zfSkge1xuICAgICAgbG9hZGVyQ2FsbHMucHVzaChtaWdyYXRpb25zLmlkKVxuXG4gICAgICBpZiAodGhpcy50ZW5hbnQoKS5zbHVnID09PSBcInNlY29uZFwiKSB7XG4gICAgICAgIHNpZ25hbFNlY29uZEluaXRpYWxpemF0aW9uKClcbiAgICAgICAgYXdhaXQgc2Vjb25kSW5pdGlhbGl6YXRpb25SZWxlYXNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFQ09ORF9TRUxFQ1RJT05fRkFJTEVEXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtkYXRhYmFzZUlkZW50aWZpZXI6IFwicHJvamVjdFRlbmFudFwiLCBkaXJ0eTogZmFsc2UsIGxhc3RVc2VkOiAwLCBwaW5Db3VudDogMCwgcmVhZHk6IHRydWUsIHNjaGVtYUdlbmVyYXRpb246IFwiZ2VuZXJhdGlvbi0xXCIsIHN0YXRlOiBcIm9wZW5cIn0pXG4gICAgfVxuICB9XG4gIGNvbnN0IHByZXZpb3VzQ29uZmlndXJhdGlvbiA9IGN1cnJlbnRDb25maWd1cmF0aW9uT3JVbmRlZmluZWQoKVxuICBjb25zdCByZXN0b3JhdGlvbkNvbmZpZ3VyYXRpb24gPSBwcmV2aW91c0NvbmZpZ3VyYXRpb24gfHwgYnVpbGRIb29rQ29uZmlndXJhdGlvbigpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBidWlsZEhvb2tDb25maWd1cmF0aW9uKClcblxuICBjb25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuXG4gIGNvbnN0IGZpcnN0SGFuZGxlID0gbmV3IEhvb2tUZW5hbnRIYW5kbGUoe2NvbmZpZ3VyYXRpb24sIHRlbmFudDoge3NsdWc6IFwiZmlyc3RcIn19KVxuICBjb25zdCBzZWNvbmRIYW5kbGUgPSBuZXcgSG9va1RlbmFudEhhbmRsZSh7Y29uZmlndXJhdGlvbiwgdGVuYW50OiB7c2x1ZzogXCJzZWNvbmRcIn19KVxuICBjb25zdCB0aGlyZEhhbmRsZSA9IG5ldyBIb29rVGVuYW50SGFuZGxlKHtjb25maWd1cmF0aW9uLCB0ZW5hbnQ6IHtzbHVnOiBcInRoaXJkXCJ9fSlcbiAgY29uc3QgcmVuZGVyQ291bnRzID0ge2ZpcnN0OiAwLCBzZWNvbmQ6IDAsIHRoaXJkOiAwfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhvb2sgcHJvYmUuXG4gICAqIEBwYXJhbSB7e3NlbGVjdGlvbjogXCJmaXJzdFwiIHwgXCJzZWNvbmRcIiB8IFwidGhpcmRcIiwgdGVuYW50SGFuZGxlOiBIb29rVGVuYW50SGFuZGxlfX0gcHJvcHMgLSBQcm9iZSBwcm9wcy5cbiAgICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBFbXB0eSBob3N0IGVsZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBIb29rUHJvYmUoe3NlbGVjdGlvbiwgdGVuYW50SGFuZGxlfSkge1xuICAgIGNvbnN0IHN0YXRlID0gdXNlRGF0YWJhc2Uoe1xuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiBcInByb2plY3RUZW5hbnRcIixcbiAgICAgIG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rcyB1cCBhbiBlbXB0eSBtaWdyYXRpb24gY29udGV4dCBlbnRyeSByZWNyZWF0ZWQgYnkgZXZlcnkgcHJvYmUgcmVuZGVyLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSBSZXF1ZXN0ZWQgbWlncmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEByZXR1cm5zIHt7ZGVmYXVsdDogdHlwZW9mIE1pZ3JhdGlvbn19IC0gUGxhY2Vob2xkZXIgbWlncmF0aW9uIG1vZHVsZS5cbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVtcHR5TWlncmF0aW9ucyA9IChmaWxlTmFtZSkgPT4ge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBjb250ZXh0IGxvb2t1cCByZXF1aXJlcyBhIGZpbGUgbmFtZVwiKVxuXG4gICAgICAgICAgcmV0dXJuIHtkZWZhdWx0OiBNaWdyYXRpb259XG4gICAgICAgIH1cblxuICAgICAgICBlbXB0eU1pZ3JhdGlvbnMua2V5cyA9ICgpID0+IFtdXG4gICAgICAgIGVtcHR5TWlncmF0aW9ucy5pZCA9IHNlbGVjdGlvblxuXG4gICAgICAgIHJldHVybiBlbXB0eU1pZ3JhdGlvbnNcbiAgICAgIH0sXG4gICAgICBzY2hlbWFHZW5lcmF0aW9uOiBcImdlbmVyYXRpb24tMVwiLFxuICAgICAgdGVuYW50SGFuZGxlXG4gICAgfSlcblxuICAgIHJlbmRlckNvdW50c1tzZWxlY3Rpb25dKytcbiAgICBpZiAocmVuZGVyQ291bnRzW3NlbGVjdGlvbl0gPiAyMCkgdGhyb3cgbmV3IEVycm9yKGB1c2VEYXRhYmFzZSByZW5kZXIgbG9vcCBmb3IgJHtzZWxlY3Rpb259YClcbiAgICByZW5kZXJzLnB1c2goe2Vycm9yOiBzdGF0ZS5lcnJvcj8ubWVzc2FnZSB8fCBudWxsLCBsb2FkZWQ6IHN0YXRlLmxvYWRlZCwgc2VsZWN0aW9ufSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICByb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KEhvb2tQcm9iZSwge3NlbGVjdGlvbjogXCJmaXJzdFwiLCB0ZW5hbnRIYW5kbGU6IGZpcnN0SGFuZGxlfSkpXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRpYWxSZW5kZXIgPSByZW5kZXJzLmF0KC0xKVxuXG4gICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgIHJvb3QucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSG9va1Byb2JlLCB7c2VsZWN0aW9uOiBcImZpcnN0XCIsIHRlbmFudEhhbmRsZTogZmlyc3RIYW5kbGV9KSlcbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGVkQWZ0ZXJJbmxpbmVMb2FkZXJSZXJlbmRlciA9IHJlbmRlcnMuYXQoLTEpPy5sb2FkZWRcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KEhvb2tQcm9iZSwge3NlbGVjdGlvbjogXCJzZWNvbmRcIiwgdGVuYW50SGFuZGxlOiBzZWNvbmRIYW5kbGV9KSlcbiAgICB9KVxuXG4gICAgY29uc3QgZmlyc3RDaGFuZ2VkUmVuZGVyID0gcmVuZGVycy5maW5kKChyZW5kZXIpID0+IHJlbmRlci5zZWxlY3Rpb24gPT09IFwic2Vjb25kXCIpXG4gICAgYXdhaXQgc2Vjb25kSW5pdGlhbGl6YXRpb25TdGFydGVkXG5cbiAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgcm9vdC5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudChIb29rUHJvYmUsIHtzZWxlY3Rpb246IFwidGhpcmRcIiwgdGVuYW50SGFuZGxlOiB0aGlyZEhhbmRsZX0pKVxuICAgIH0pXG5cbiAgICByZWxlYXNlU2Vjb25kSW5pdGlhbGl6YXRpb24oKVxuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7IGF3YWl0IHNlY29uZEluaXRpYWxpemF0aW9uUmVsZWFzZSB9KVxuXG4gICAgY29uc3QgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbiA9IHJlbmRlcnMuYXQoLTEpXG5cbiAgICBpZiAoIWluaXRpYWxSZW5kZXIgfHwgIWZpcnN0Q2hhbmdlZFJlbmRlciB8fCAhdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbiB8fCBsb2FkZWRBZnRlcklubGluZUxvYWRlclJlcmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZURhdGFiYXNlIGhvb2sgc2NlbmFyaW8gZGlkIG5vdCByZW5kZXIgZXZlcnkgc2VsZWN0aW9uXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0Q2hhbmdlZExvYWRlZDogZmlyc3RDaGFuZ2VkUmVuZGVyLmxvYWRlZCxcbiAgICAgIGluaXRpYWxMb2FkZWQ6IGluaXRpYWxSZW5kZXIubG9hZGVkLFxuICAgICAgbG9hZGVyQ2FsbHMsXG4gICAgICBsb2FkZWRBZnRlcklubGluZUxvYWRlclJlcmVuZGVyLFxuICAgICAgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbjoge1xuICAgICAgICBlcnJvcjogdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbi5lcnJvcixcbiAgICAgICAgbG9hZGVkOiB0aGlyZEFmdGVyU3RhbGVDb21wbGV0aW9uLmxvYWRlZFxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlU2Vjb25kSW5pdGlhbGl6YXRpb24oKVxuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7IHJvb3QudW5tb3VudCgpIH0pXG4gICAgY29udGFpbmVyLnJlbW92ZSgpXG4gICAgcmVzdG9yYXRpb25Db25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKClcbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"AAMA,OAAO,WAAW,MAAM,0BAA0B,CAAA;AAElD,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAM/C,OAAO,uBAAuB,MAAM,gCAAgC,CAAA;AAKjE,YAAuD,iBAAiB,GAA9D,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAmB;AAGxE,YAAkB,oBAAoB,GACtC;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACnB;CAAA,CAAA;AAGE,YAAkB,QAAQ,GAC1B;;;;IAAyB,WAAW,AAApC,CACA,EADW,WAAW,CACtB;;;;IAA2B,MAAM,AAAjC,CACA,EADW,aAAa,CACxB;;;;IAAoB,gBAAgB,AAApC,CAIA,EAHA;QAAsC,WAAW,AAAjD,CACA,EADW,OAAO,CAClB;QAAsC,QAAQ,AAA9C,CACA,EADW,OAAO,CAClB;QAAsC,cAAc,AAApD,CACA,EADW,OAAO,CAClB;KAAA,CAAA;;;;IAAqB,KAAK,AAA1B,CACA,EADW,OAAO,CAClB;;;;IAAwC,QAAQ,AAAhD,CACA,EADW,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACrC;;;;IAAoB,KAAK,AAAzB,CACA,EADW,MAAM,CACjB;;;;IAA+B,IAAI,AAAnC,CACA,EADW,MAAM,EAAE,GAAG,MAAM,CAC5B;;;;IAAoB,cAAc,AAAlC,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACF,EADa,MAAM,CACnB;CAAA,CAAA;AAGE,YAAkB,QAAQ,GAC1B;;;;IAAqB,IAAI,EAAd,QAAQ,CACnB;;;;IAAoB,QAAQ,AAA5B,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAoD,QAAQ,EAAjD,CAAC,GAAG,EAAE,QAAQ,KAAK,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACpD;CAAA,CAAA;AAGE,YAAkB,gBAAgB,GAClC;;;;IAAmB,eAAe,EAAvB,MAAM,CACjB;;;;IAAoB,QAAQ,AAA5B,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAA0C,KAAK,EAApC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACxC;;;;IAAoB,aAAa,AAAjC,CACA,EADW,MAAM,CACjB;;;;IAAoB,cAAc,AAAlC,CACF,EADa,MAAM,CACnB;CAAA,CAAA;AAGE,YAAkB,wBAAwB,GAC1C;;;;IAA0B,KAAK,EAApB,aAAa,CACxB;;;;IAAoB,YAAY,EAArB,OAAO,CACpB;CAAA,CAAA;AAGE,YAA0I,2BAA2B,GAA3J,CAAC,IAAI,EAAE;IAAC,aAAa,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAC,KAAK,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAA6B;AAIrK,YAAkB,iCAAiC,GACnD;;;;IAAwC,QAAQ,EAArC,2BAA2B,CACxC;CAAA,CAAA;AAGE,YAAkG,0BAA0B,GAAlH,CAAC,IAAI,EAAE;IAAC,aAAa,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;CAAC,KAAK,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAA4B;AAI5H,YAAkB,gCAAgC,GAClD;;;;IAAuC,QAAQ,EAApC,0BAA0B,CACvC;CAAA,CAAA;AAGE,YAAkB,aAAa,GAC/B;;;;IAAqC,IAAI,EAA9B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnC;;;;IAAqB,gBAAgB,AAArC,CACA,EADW,OAAO,CAClB;;;;IAAgD,WAAW,EAAhD,iCAAiC,EAAE,CAC9C;;;;IAA+C,SAAS,EAA7C,gCAAgC,EAAE,CAC7C;;;;IAA+C,UAAU,EAA9C,gCAAgC,EAAE,CAC7C;;;;IAAgD,YAAY,EAAjD,iCAAiC,EAAE,CAC9C;;;;IAAoB,QAAQ,AAA5B,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAqC,KAAK,EAA/B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnC;;;;IAA0C,IAAI,EAAnC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAC1C;CAAA,CAAA;AAKE,YAAiD,gBAAgB,GAAvD,KAAK,GAAG;IAAC,oBAAoB,CAAC,EAAE,IAAI,CAAA;CAAC,CAAkB;AAsFpE,MAAM,CAAC,OAAO,OAAO,UAAU;IA0BtB,cAAc;IACd,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,cAAc;IACd,UAAU;IACV,YAAY;IACZ,gBAAgB;IAEhB,YAAY;IACZ,gBAAgB;IAChB,WAAW;IAGhB,+EAA+E;IAC1E,gBAAgB,EADV;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAE3E,mGAAmG;IAC9F,cAAc,EADR,KAAK,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC;IA2RxF,YAAY;IAkIZ,cAAc;IAkIhB,gBAAgB;IAQhB,aAAa;IAhlBpB;;4CAEwC;IACxC,qBAAqB,EADX,wBAAwB,EAAE,CACf;IAErB;;oCAEgC;IAChC,kBAAkB,EADR,gBAAgB,EAAE,CACV;IAElB;;;;;;;;;OASG;IACH,YAAY,EAAC,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,QAAQ,EAAC,EAPxG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAiC,WAAW,AAA5C,CACA,EADQ,MAAM,EAAE,GAAG,MAAM,CACzB;QAAiC,WAAW,AAA5C,CACA,EADQ,MAAM,EAAE,GAAG,MAAM,CACzB;QAA4B,SAAS,EAA7B,KAAK,CAAC,MAAM,CAAC,CACrB;QAAwC,WAAW,AAAnD,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAChC;QAAwB,eAAe,AAAvC,CACF,EADU,MAAM,EAAE,CAClB;KAC0G,EAuB1G;IAED;;;OAGG;IACH,gBAAgB,IAFH,OAAO,qBAAqB,EAAE,OAAO,CAED;IAEjD;;;OAGG;IACH,YAAY,IAFC,MAAM,EAAE,CAEoB;IAEzC;;;OAGG;IACH,cAAc,IAFD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEQ;IAE7C;;;OAGG;IACH,kBAAkB,IAFL,MAAM,EAAE,CAEgC;IAErD;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAHP,MAAM,EAAE,GAAG,MAAM,GAAG,SAGb,GAFL,MAAM,EAAE,CAqBpB;IAED;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAJJ,QAII,EAAE,GAAG,EAHT,MAGS,GAFP,OAAO,CAInB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,OAAO,CAInB;IAED;;;;;OAKG;IACG,oBAAoB,CAAC,QAAQ,EAJxB,QAIwB,EAAE,QAAQ,EAHlC,MAAM,OAAO,CAAC,IAAI,CAGgB,GAFhC,OAAO,CAAC,IAAI,CAAC,CAczB;IAED;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAHhB,MAAM,OAAO,CAAC,IAAI,CAGF,GAFd,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;OAGG;IACH,gBAAgB,IAFH,MAAM,CAWlB;IAED;;;;OAIG;IACG,eAAe,CAAC,QAAQ,EAHnB,MAAM,OAAO,CAAC,IAAI,CAGC,GAFjB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACG,iBAAiB,CAAC,GAAG,EAHhB,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAG5C,GAFd,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,gBAAgB,IAFH,GAAG,CAAC,MAAM,CAAC,CASvB;IAED;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAJZ,MAAM,EAAE,GAAG,MAAM,GAAG,SAIR,EAAE,MAAM,EAHpB,GAAG,CAAC,MAAM,CAGU,GAFlB,OAAO,CAYnB;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK,EALX,aAKW,EAAE,YAAY,AAJjC,CACA,EADQ,MAAM,EAIwB,EAAE,kBAAkB,AAH1D,CACA,EADQ,OAG0D,GAFxD,OAAO,CAwBnB;IAED;;;;;;;;OAQG;IACH,cAAc,CAAC,QAAQ,EAPZ,QAOY,EAAE,QAAQ,EANtB,QAMsB,EAAE,eAAe,EALvC,MAKuC,EAAE,YAAY,EAJrD,MAAM,EAI+C,EAAE,kBAAkB,EAHzE,OAGyE,GAFvE,OAAO,CA0BnB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,KAAK,EAHZ,QAAQ,GAAG,aAGC,GAFV,OAAO,CAWnB;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,YAAY,EAJtB,MAAM,EAIgB,EAAE,eAAe,EAHvC,MAGuC,GAFrC,MAAM,CAMlB;IAED;;;OAGG;IACG,WAAW,IAFJ,OAAO,CAAC,WAAW,CAAC,CAoBhC;IAED;;;;;;;OAOG;IACH,6BAA6B,IAFhB;QAAC,IAAI,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,0BAA0B,EAAE,gCAAgC,CAAA;KAAC,EAAE,CA6BnJ;IAED;;;;;OAKG;IACH,0BAA0B,CAAC,aAAa,AAHrC,CACA,EADQ;QAAC,IAAI,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,0BAA0B,EAAE,gCAAgC,CAAA;KAAC,EAGxG,GAF3B,IAAI,CAehB;IAED;;;;;OAKG;IACG,4BAA4B,IAFrB,OAAO,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAC;QAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,GAAG,SAAS,CAAC,CA2B3G;IAED;;;;OAIG;IACG,2BAA2B,CAAC,YAAY,EAFnC;QAAC,MAAM,EAAE,uBAAuB,CAAC;QAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,GAAG,SAE1C,iBAQ7C;IAED;;;OAGG;IACG,aAAa,IAFN,OAAO,CAAC,aAAa,CAAC,CAQlC;IAED;;;OAGG;IACG,eAAe,IAFR,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,QAAQ,IAFK,OAAO,CAE0D;IAE9E;;;OAGG;IACH,cAAc,IAFD,MAAM,CAMlB;IAED;;;OAGG;IACH,oBAAoB,IAFP,gBAAgB,EAAE,CAI9B;IAED;;;;;OAKG;IACG,uCAAuC,CAAC,EAAC,UAAwD,EAAC,AAJrG,CAEA,EADA;QAAsB,UAAU,AAAhC,CACA,EADQ,MAAM,CACd;KAE0G,GAFhG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsC7B;IAED;;;OAGG;IACH,kBAAkB,IAFL,MAAM,CAMlB;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAMlB;IAED;;;OAGG;IACH,qBAAqB,IAFR,MAAM,CAQlB;IAED;;;;OAIG;IACH,eAAe,CAAC,KAAK,AAHlB,CACA,EADQ,MAGe,GAFb,KAAK,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAMhG;IAED;;;OAGG;IACG,OAAO,IAFA,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;OAGG;IACH,mBAAmB,IAFN,OAAO,CAQnB;IAED;;;OAGG;IACH;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,IAAI,EAJV,mBAAmB,GAAG,oBAIZ,EAAE,MAAM,EAHlB,OAGkB,GAFhB,IAAI,CAkBhB;IAEK,GAAG,kBA2DR;IAED;;;OAGG;IACG,2BAA2B,IAFpB,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAHP,aAGO,GAFL;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAC,CA6BvC;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,EAAC,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAA0B,EAAC,EARrG;QAAuD,WAAW,EAA1D,KAAK,CAAC,iCAAiC,CAAC,CAChD;QAAuD,YAAY,EAA3D,KAAK,CAAC,iCAAiC,CAAC,CAChD;QAA4B,KAAK,EAAzB,aAAa,CACrB;QAAuB,YAAY,EAA3B,MAAM,EAAE,CAChB;QAAqB,WAAW,EAAxB,MAAM,CACd;QAAuB,kBAAkB,AAAzC,CACA,EADQ,OAAO,CACf;KAEqG,GAF3F,OAAO,CAAC,IAAI,CAAC,CAmVzB;IAED;;;;OAIG;IACG,oBAAoB,CAAC,UAAU,EAH1B,wBAG0B,GAFxB,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;;;OAKG;IACG,SAAS,CAAC,SAAS,EAJd,MAIc,EAAE,OAAO,EAHvB,MAGuB,GAFrB,OAAO,CAAC,IAAI,CAAC,CAQzB;IAED;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAC,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAC,EANrE;QAAuB,YAAY,EAA3B,MAAM,EAAE,CAChB;QAAqB,eAAe,EAA5B,MAAM,CACd;QAAuB,QAAQ,EAAvB,QAAQ,CAChB;QAAqB,WAAW,EAAxB,MAAM,CACd;KAEqE,GAF3D,IAAI,CAQhB;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAC,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAC,EALxD;QAAuB,YAAY,EAA3B,MAAM,EAAE,CAChB;QAAqB,eAAe,EAA5B,MAAM,CACd;QAAuB,QAAQ,EAAvB,QAAQ,CAChB;KAEwD,GAF9C,MAAM,GAAG,SAAS,CAmB9B;IAED;;;;OAIG;IACH,kBAAkB,CAAC,qBAAqB,EAH7B,oBAAoB,EAGS,GAF3B,MAAM,CASlB;IAED;;;OAGG;IACH,8BAA8B,IAFjB,MAAM,CAQlB;IAED;;;;OAIG;IACH,gCAAgC,CAAC,aAAa,EAHnC,MAGmC,GAFjC,MAAM,EAAE,CAgBpB;IAED;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAC,aAAa,EAAE,WAAW,EAAC,EAJlD;QAAqB,aAAa,EAA1B,MAAM,CACd;QAAqB,WAAW,EAAxB,MAAM,CACd;KAEkD,GAFxC,IAAI,CAehB;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,EAAC,WAAmB,EAAC,AAJtC,CAEA,EADA;QAAuB,WAAW,AAAlC,CACA,EADQ,OAAO,CACf;KAE2C,GAFjC,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"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"}
|