velocious 1.0.472 → 1.0.474
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/authorization/base-resource.js +99 -0
- package/build/configuration-types.js +3 -2
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -1
- package/build/frontend-model-controller.js +21 -17
- package/build/frontend-model-resource/base-resource.js +254 -46
- package/build/frontend-model-resource/velocious-attachment-resource.js +0 -3
- package/build/frontend-models/resource-definition.js +96 -21
- package/build/frontend-models/websocket-channel.js +24 -20
- package/build/routes/resolver.js +7 -5
- package/build/src/authorization/base-resource.d.ts +41 -0
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +88 -1
- package/build/src/configuration-types.d.ts +15 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +4 -3
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +22 -18
- package/build/src/frontend-model-resource/base-resource.d.ts +67 -0
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +242 -54
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +0 -2
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +1 -3
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +83 -25
- package/build/src/frontend-models/websocket-channel.d.ts +6 -0
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +23 -19
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +8 -6
- package/package.json +1 -1
- package/scripts/tensorbuzz-retry +21 -0
- package/src/authorization/base-resource.js +99 -0
- package/src/configuration-types.js +3 -2
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -1
- package/src/frontend-model-controller.js +21 -17
- package/src/frontend-model-resource/base-resource.js +254 -46
- package/src/frontend-model-resource/velocious-attachment-resource.js +0 -3
- package/src/frontend-models/resource-definition.js +96 -21
- package/src/frontend-models/websocket-channel.js +24 -20
- package/src/routes/resolver.js +7 -5
|
@@ -93,13 +93,6 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
93
93
|
* @returns {Promise<void>} Resolves after delivery.
|
|
94
94
|
*/
|
|
95
95
|
async deliverBroadcast(body, meta) {
|
|
96
|
-
const configuration = this.session.configuration;
|
|
97
|
-
if (configuration) {
|
|
98
|
-
await configuration.ensureConnections({ name: "Frontend model websocket broadcast" }, async () => {
|
|
99
|
-
await this._deliverBroadcast(body, meta);
|
|
100
|
-
});
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
96
|
await this._deliverBroadcast(body, meta);
|
|
104
97
|
}
|
|
105
98
|
/**
|
|
@@ -316,6 +309,27 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
316
309
|
controller._frontendModelAbilityOverride = this._ability || undefined;
|
|
317
310
|
return controller;
|
|
318
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* Resolves tenant for event.
|
|
314
|
+
* @param {string | number} id - Event record id.
|
|
315
|
+
* @returns {Promise<?>} - Resolved tenant.
|
|
316
|
+
*/
|
|
317
|
+
async _resolveEventTenant(id) {
|
|
318
|
+
const configuration = this.session.configuration;
|
|
319
|
+
return await configuration.ensureConnections({ name: "Frontend model websocket event tenant resolution" }, async () => {
|
|
320
|
+
// Mirror the subscribe-time tenant resolution (`WebsocketSession._resolveTenant`):
|
|
321
|
+
// pass `subscription: {channel, params}` so resolvers that derive scope from the
|
|
322
|
+
// subscription behave the same for broadcasts as they did at `channel-subscribe`.
|
|
323
|
+
// The synthetic request forwards the subscriber's params (e.g. authenticationToken),
|
|
324
|
+
// matching this channel's ability resolution above.
|
|
325
|
+
return await configuration.resolveTenant({
|
|
326
|
+
params: { ...this.params, id, model: this._modelName() },
|
|
327
|
+
request: /** @type {import("../http-server/client/request.js").default} */ (this._syntheticRequest()),
|
|
328
|
+
response: new Response({ configuration }),
|
|
329
|
+
subscription: { channel: FRONTEND_MODELS_CHANNEL_NAME, params: this.params }
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
}
|
|
319
333
|
/**
|
|
320
334
|
* Resolves the subscriber's tenant for the broadcast record and runs `callback` inside that tenant
|
|
321
335
|
* context. Broadcast delivery runs in whatever ambient tenant context the publisher left behind. For
|
|
@@ -335,17 +349,7 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
335
349
|
if (!configuration || typeof configuration.resolveTenant !== "function") {
|
|
336
350
|
return await callback();
|
|
337
351
|
}
|
|
338
|
-
|
|
339
|
-
// pass `subscription: {channel, params}` so resolvers that derive scope from the
|
|
340
|
-
// subscription behave the same for broadcasts as they did at `channel-subscribe`.
|
|
341
|
-
// The synthetic request forwards the subscriber's params (e.g. authenticationToken),
|
|
342
|
-
// matching this channel's ability resolution above.
|
|
343
|
-
const tenant = await configuration.resolveTenant({
|
|
344
|
-
params: { ...this.params, id, model: this._modelName() },
|
|
345
|
-
request: /** @type {import("../http-server/client/request.js").default} */ (this._syntheticRequest()),
|
|
346
|
-
response: new Response({ configuration }),
|
|
347
|
-
subscription: { channel: FRONTEND_MODELS_CHANNEL_NAME, params: this.params }
|
|
348
|
-
});
|
|
352
|
+
const tenant = await this._resolveEventTenant(id);
|
|
349
353
|
// Always enter `runWithTenant`, even when no tenant resolved. Broadcast fan-out
|
|
350
354
|
// runs in the publisher's ambient tenant context; falling back to `callback()`
|
|
351
355
|
// there would authorize a cross-tenant record against the publisher's tenant and
|
|
@@ -504,4 +508,4 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
504
508
|
};
|
|
505
509
|
}
|
|
506
510
|
}
|
|
507
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHlCQUF5QixNQUFNLHFDQUFxQyxDQUFBO0FBQzNFLE9BQU8sUUFBUSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3hELE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBRWpGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBRXhFLHFGQUFxRjtBQUNyRiwyRUFBMkU7QUFDM0UsTUFBTSw0QkFBNEIsR0FBRyxpQkFBaUIsQ0FBQTtBQUV0RDs7OztHQUlHO0FBQ0gsU0FBUyw2Q0FBNkMsQ0FBQyxhQUFhO0lBQ2xFLE9BQU87UUFDTCxRQUFRLEVBQUUsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztLQUMzRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE4QixTQUFRLHlCQUF5QjtJQUNsRjs7c0VBRWtFO0lBQ2xFLFFBQVEsR0FBRyxJQUFJLENBQUE7SUFFZjs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFFbkMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFh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LEVBQUUsQ0FBQyxhQUFhO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTTtTQUMvQixDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQgUmVzcG9uc2UgZnJvbSBcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiXG5pbXBvcnQge3NlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4vdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIlxuXG5jb25zdCBFVkVOVF9GSUxURVJfS0VZUyA9IG5ldyBTZXQoW1wiam9pbnNcIiwgXCJrZXlcIiwgXCJzZWFyY2hlc1wiLCBcIndoZXJlXCJdKVxuXG4vLyBNaXJyb3JzIEZST05URU5EX01PREVMU19DSEFOTkVMX05BTUUgaW4gLi93ZWJzb2NrZXQtcHVibGlzaGVycy5qcywgZHVwbGljYXRlZCBoZXJlXG4vLyB0byBhdm9pZCB0aGUgY29uZmlndXJhdGlvbiDihpIgbG9nZ2VyIOKGkiB3ZWJzb2NrZXQtcHVibGlzaGVycyBpbXBvcnQgY3ljbGUuXG5jb25zdCBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FID0gXCJmcm9udGVuZC1tb2RlbHNcIlxuXG4vKipcbiAqIFJ1bnMgdHJhbnNwb3J0IHNlcmlhbGl6YXRpb24gb3B0aW9ucyBmb3IgYSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFNlcmlhbGl6YXRpb25PcHRpb25zfSAtIFNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3J0U2VyaWFsaXphdGlvbk9wdGlvbnNGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lWm9uZTogY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKS5nZXRUaW1lWm9uZShjb25maWd1cmF0aW9uKVxuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e2FjdGlvbj86IHN0cmluZywgaWQ/OiBzdHJpbmcgfCBudW1iZXIsIG1hdGNoZWRFdmVudEZpbHRlcktleXM/OiBzdHJpbmdbXSwgcmVjb3JkPzogaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUsIFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlIHwgc3RyaW5nW10gfCB1bmRlZmluZWR9fSBGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keVxuICovXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3toZWFkZXJzPzogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LCByZW1vdGVBZGRyZXNzPzogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbFdlYnNvY2tldFVwZ3JhZGVSZXF1ZXN0XG4gKi9cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e2hlYWRlcnM6ICgpID0+IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiwgaGVhZGVyOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgbWV0YWRhdGE6IChrZXk/OiBzdHJpbmcpID0+IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPiB8IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlIHwgdW5kZWZpbmVkLCBwYXRoOiAoKSA9PiBzdHJpbmcsIGh0dHBNZXRob2Q6ICgpID0+IHN0cmluZywgcmVtb3RlQWRkcmVzczogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmlnaW46ICgpID0+IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbFdlYnNvY2tldFN5bnRoZXRpY1JlcXVlc3RcbiAqL1xuXG4vKipcbiAqIFBlci1zZXNzaW9uIGNoYW5uZWwgc3Vic2NyaXB0aW9uIGZvciBmcm9udGVuZC1tb2RlbCBsaWZlY3ljbGUgZXZlbnRzLlxuICogUmVwbGFjZXMgdGhlIGxlZ2FjeSBgRnJvbnRlbmRNb2RlbFdlYnNvY2tldENoYW5uZWxgIChQaGFzZSAzKS5cbiAqXG4gKiBBdXRoIG1vZGVsOiBzdWJzY3JpYmUtdGltZSBvbmx5LiBgY2FuU3Vic2NyaWJlYCByZXNvbHZlcyB0aGUgY2FsbGVyJ3NcbiAqIGFiaWxpdHkgb25jZSwgY2hlY2tzIHRoYXQgYXQgbGVhc3Qgb25lIGBhbGxvd2AgcnVsZSBleGlzdHMgZm9yXG4gKiBgcmVhZGAgb24gdGhlIHJlcXVlc3RlZCBtb2RlbCBjbGFzcywgYW5kIHRoZW4gZGVsaXZlcnMgZnV0dXJlXG4gKiBsaWZlY3ljbGUgYnJvYWRjYXN0cyBmb3IgdGhhdCBtb2RlbCB3aXRob3V0IHJlLWF1dGhvcml6aW5nIHBlciBldmVudC5cbiAqIFRoaXMgbWF0Y2hlcyB0aGUgZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uIGluIFBoYXNlIDMgdG8gdHJhZGVcbiAqIHBlci1yZWNvcmQgdmlzaWJpbGl0eSBndWFyYW50ZWVzIGZvciBtYXNzaXZlbHkgY2hlYXBlciBicm9hZGNhc3QgZmFuLW91dC5cbiAqIFN1YnNjcmliZXItcHJvdmlkZWQgZXZlbnQgZmlsdGVycyBjYW4gc3RpbGwgbmFycm93IHdoaWNoIGNyZWF0ZS91cGRhdGVcbiAqIGV2ZW50cyBhcmUgZGVsaXZlcmVkLCBidXQgdGhleSBhcmUgbWF0Y2hpbmcgcHJlZGljYXRlcyByYXRoZXIgdGhhblxuICogcGVyLXJlY29yZCBhdXRob3JpemF0aW9uIGNoZWNrcy5cbiAqXG4gKiBXaXJlOiBzdWJzY3JpYmUgd2l0aCBgc3Vic2NyaWJlQ2hhbm5lbChcImZyb250ZW5kLW1vZGVsc1wiLCB7cGFyYW1zOiB7bW9kZWw6IE1vZGVsTmFtZX19KWAuXG4gKiBCYWNrZW5kIHB1Ymxpc2hlcyBge2FjdGlvbiwgaWQsIHJlY29yZH1gIHZpYVxuICogYGNvbmZpZ3VyYXRpb24uYnJvYWRjYXN0VG9DaGFubmVsKFwiZnJvbnRlbmQtbW9kZWxzXCIsIHttb2RlbDogTW9kZWxOYW1lfSwgYm9keSlgO1xuICogYG1hdGNoZXMoKWAgcm91dGVzIGJ5IG1vZGVsIG5hbWUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxXZWJzb2NrZXRDaGFubmVsIGV4dGVuZHMgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCB7XG4gIC8qKlxuICAgKiBBYmlsaXR5LlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICBfYWJpbGl0eSA9IG51bGxcblxuICAvKipcbiAgICogUnVucyBjYW4gc3Vic2NyaWJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgZnJvbnRlbmQtbW9kZWwgc3Vic2NyaXB0aW9uIGlzIGF1dGhvcml6ZWQuXG4gICAqL1xuICBhc3luYyBjYW5TdWJzY3JpYmUoKSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGhpcy5fbW9kZWxOYW1lKClcblxuICAgIGlmICghbW9kZWxOYW1lKSByZXR1cm4gZmFsc2VcbiAgICB0aGlzLl9ldmVudEZpbHRlcnMoKVxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgbW9kZWxDbGFzc2VzID0gY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzZXNbbW9kZWxOYW1lXVxuXG4gICAgaWYgKCFNb2RlbENsYXNzKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHJlcXVlc3QgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLl9zeW50aGV0aWNSZXF1ZXN0KCkpXG4gICAgY29uc3QgYWJpbGl0eSA9IGF3YWl0IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgLy8gRm9yd2FyZCB0aGUgc3Vic2NyaWJlcidzIHBhcmFtcyAoZS5nLiBhdXRoZW50aWNhdGlvblRva2VuKSBzbyB0b2tlbi1hdXRoZW50aWNhdGVkIGNsaWVudHNcbiAgICAgIC8vIHJlc29sdmUgdGhlIHNhbWUgYWJpbGl0eSB0aGV5IHdvdWxkIG92ZXIgSFRUUC4gV2l0aG91dCB0aGlzIG9ubHkgc2Vzc2lvbi9jb29raWUgYXV0aCBvbiB0aGVcbiAgICAgIC8vIHVwZ3JhZGUgcmVxdWVzdCB3b3JrcywgYW5kIHBhcmFtLWJhc2VkIGF1dGggKGxpa2UgYSBzY2FubmVyIHBhc3NpbmcgYW4gYXV0aGVudGljYXRpb25Ub2tlbilcbiAgICAgIC8vIGlzIGRyb3BwZWQg4oCUIGxlYXZpbmcgc3VjaCBzdWJzY3JpYmVycyB3aXRoIGEgZ3Vlc3QgYWJpbGl0eSBhbmQgbm8gcmVhZCBydWxlLlxuICAgICAgcGFyYW1zOiB7Li4udGhpcy5wYXJhbXMsIG1vZGVsOiBtb2RlbE5hbWV9LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIH0pXG5cbiAgICBpZiAoIWFiaWxpdHkpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuX2FiaWxpdHkgPSBhYmlsaXR5XG5cbiAgICAvLyBMb2FkIHJlc291cmNlLWRlY2xhcmVkIHJ1bGVzIGZvciB0aGlzIG1vZGVsIGNsYXNzIGJlZm9yZSBjaGVja2luZyxcbiAgICAvLyBvdGhlcndpc2UgYHJ1bGVzRm9yYCByZXR1cm5zIGVtcHR5IGZvciBhYmlsaXRpZXMgd2hvc2UgcmVzb3VyY2VzXG4gICAgLy8gcmVnaXN0ZXIgcnVsZXMgbGF6aWx5IHZpYSBgYWJpbGl0aWVzKClgLlxuICAgIGFiaWxpdHkubG9hZEFiaWxpdGllc0Zvck1vZGVsQ2xhc3MoTW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHJlYWRSdWxlcyA9IGFiaWxpdHkucnVsZXNGb3Ioe2FjdGlvbjogXCJyZWFkXCIsIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3N9KVxuXG4gICAgcmV0dXJuIHJlYWRSdWxlcy5zb21lKCgvKiogQHR5cGUge3tlZmZlY3Q6IHN0cmluZ319ICovIHJ1bGUpID0+IHJ1bGUuZWZmZWN0ID09PSBcImFsbG93XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxpdmVyIGJyb2FkY2FzdC5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keX0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICAgKiBAcGFyYW0ge3tldmVudElkPzogc3RyaW5nfX0gW21ldGFdIC0gT3B0aW9uYWwgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBkZWxpdmVyeS5cbiAgICovXG4gIGFzeW5jIGRlbGl2ZXJCcm9hZGNhc3QoYm9keSwgbWV0YSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiRnJvbnRlbmQgbW9kZWwgd2Vic29ja2V0IGJyb2FkY2FzdFwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9kZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsaXZlciBicm9hZGNhc3QuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHl9IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHt7ZXZlbnRJZD86IHN0cmluZ319IFttZXRhXSAtIE9wdGlvbmFsIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgZGVsaXZlcnkuXG4gICAqL1xuICBhc3luYyBfZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgY29uc3QgaGFzRXZlbnRGaWx0ZXJzID0gdGhpcy5faGFzRXZlbnRGaWx0ZXJQYXJhbXMoKVxuXG4gICAgaWYgKCF0aGlzLl9oYXNQcm9qZWN0aW9uUGFyYW1zKCkgJiYgIWhhc0V2ZW50RmlsdGVycykge1xuICAgICAgLy8gRXZlbiB1bmZpbHRlcmVkIHN1YnNjcmlwdGlvbnMgbXVzdCByZXNwZWN0IHRoZSBzdWJzY3JpYmVyJ3MgYWJpbGl0eS4gQSBjcmVhdGUvdXBkYXRlIGNhcnJpZXNcbiAgICAgIC8vIHRoZSByZWNvcmQsIHNvIG9ubHkgZGVsaXZlciBpdCB3aGVuIHRoZSByZWNvcmQgaXMgd2l0aGluIHRoZSBhdXRoZW50aWNhdGVkIGFiaWxpdHkncyBzY29wZS5cbiAgICAgIC8vIERlc3Ryb3lzIChhbmQgYm9kaWVzIHdpdGhvdXQgYSB1c2FibGUgaWQpIGNhcnJ5IG5vIHJlY29yZCwgc28gcGFzcyB0aGVtIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgICAgaWYgKGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09IFwib2JqZWN0XCIgJiYgKGJvZHkuYWN0aW9uID09PSBcImNyZWF0ZVwiIHx8IGJvZHkuYWN0aW9uID09PSBcInVwZGF0ZVwiKSAmJiBib2R5LmlkICE9PSB1bmRlZmluZWQgJiYgYm9keS5pZCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKVxuXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5fZXZlbnRJc0FjY2Vzc2libGUoYm9keS5pZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpKSByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5zZW5kTWVzc2FnZShib2R5LCBtZXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIWhhc0V2ZW50RmlsdGVycyB8fCB0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYm9keS5hY3Rpb24gPT09IFwiZGVzdHJveVwiKSB7XG4gICAgICBpZiAoIWhhc0V2ZW50RmlsdGVycyB8fCB0aGlzLl9oYXNEZXN0cm95RXZlbnREZWxpdmVyeSgpIHx8IHRoaXMuX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkpIHRoaXMuc2VuZE1lc3NhZ2UoYm9keSwgbWV0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChib2R5LmlkID09PSB1bmRlZmluZWQgfHwgYm9keS5pZCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCFoYXNFdmVudEZpbHRlcnMgfHwgdGhpcy5faGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSkgdGhpcy5zZW5kTWVzc2FnZShib2R5LCBtZXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgPSBhd2FpdCB0aGlzLl9mcm9udGVuZE1vZGVsQ29udHJvbGxlckNsYXNzKClcbiAgICBjb25zdCBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzID0gYXdhaXQgdGhpcy5fbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c0ZvckV2ZW50SWQoYm9keS5pZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICBpZiAoaGFzRXZlbnRGaWx0ZXJzICYmIG1hdGNoZWRFdmVudEZpbHRlcktleXMubGVuZ3RoID09PSAwICYmICF0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxpdmVyIGJvZHkuXG4gICAgICogQHR5cGUge0Zyb250ZW5kTW9kZWxMaWZlY3ljbGVCcm9hZGNhc3RCb2R5fSAqL1xuICAgIGxldCBkZWxpdmVyQm9keSA9IGJvZHlcblxuICAgIGlmICh0aGlzLl9oYXNQcm9qZWN0aW9uUGFyYW1zKCkpIHtcbiAgICAgIGNvbnN0IHByb2plY3RlZFJlY29yZCA9IGF3YWl0IHRoaXMuX3Byb2plY3RlZFJlY29yZEZvckV2ZW50SWQoYm9keS5pZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGlmICghcHJvamVjdGVkUmVjb3JkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cblxuICAgICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIG1vZGVsIHdlYnNvY2tldCBjaGFubmVsIGhhcyBubyBjb25maWd1cmF0aW9uIGZvciB0cmFuc3BvcnQgc2VyaWFsaXphdGlvblwiKVxuICAgICAgfVxuXG4gICAgICBkZWxpdmVyQm9keSA9IHtcbiAgICAgICAgLi4uZGVsaXZlckJvZHksXG4gICAgICAgIHJlY29yZDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShwcm9qZWN0ZWRSZWNvcmQsIHRyYW5zcG9ydFNlcmlhbGl6YXRpb25PcHRpb25zRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0V2ZW50RmlsdGVycykge1xuICAgICAgZGVsaXZlckJvZHkgPSB7XG4gICAgICAgIC4uLmRlbGl2ZXJCb2R5LFxuICAgICAgICBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kTWVzc2FnZShkZWxpdmVyQm9keSwgbWV0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1hdGNoZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSBicm9hZGNhc3RQYXJhbXMgLSBQYXJhbXMgZnJvbSBgYnJvYWRjYXN0VG9DaGFubmVsYC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJyb2FkY2FzdCBtYXRjaGVzIHRoaXMgc3Vic2NyaWJlcidzIG1vZGVsLlxuICAgKi9cbiAgbWF0Y2hlcyhicm9hZGNhc3RQYXJhbXMpIHtcbiAgICByZXR1cm4gYnJvYWRjYXN0UGFyYW1zPy5tb2RlbCA9PT0gdGhpcy5fbW9kZWxOYW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlYnVnIHNuYXBzaG90LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IERlYnVnLXNhZmUgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqL1xuICBkZWJ1Z1NuYXBzaG90KCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVycyA9IHRoaXMuX2V2ZW50RmlsdGVycygpXG5cbiAgICByZXR1cm4ge1xuICAgICAgYWJpbGl0aWVzOiB0aGlzLnBhcmFtcy5hYmlsaXRpZXMgIT09IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50RmlsdGVyQ291bnQ6IGV2ZW50RmlsdGVycy5sZW5ndGgsXG4gICAgICBkZXN0cm95RXZlbnREZWxpdmVyeTogdGhpcy5wYXJhbXMuZGVzdHJveUV2ZW50RGVsaXZlcnkgPT09IHRydWUsXG4gICAgICBtb2RlbDogdGhpcy5fbW9kZWxOYW1lKCksXG4gICAgICBwcmVsb2FkOiB0aGlzLnBhcmFtcy5wcmVsb2FkICE9PSB1bmRlZmluZWQsXG4gICAgICBxdWVyeURhdGE6IHRoaXMucGFyYW1zLnF1ZXJ5RGF0YSAhPT0gdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0OiB0aGlzLnBhcmFtcy5zZWxlY3QgIT09IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdHNFeHRyYTogdGhpcy5wYXJhbXMuc2VsZWN0c0V4dHJhICE9PSB1bmRlZmluZWQsXG4gICAgICB1bmZpbHRlcmVkRXZlbnREZWxpdmVyeTogdGhpcy5wYXJhbXMudW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkgPT09IHRydWUsXG4gICAgICB3aXRoQ291bnQ6IHRoaXMucGFyYW1zLndpdGhDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVxdWVzdGVkIGZyb250ZW5kLW1vZGVsIG5hbWUgb3IgbnVsbC5cbiAgICovXG4gIF9tb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhcmFtcz8ubW9kZWwgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMubW9kZWwubGVuZ3RoID4gMFxuICAgICAgPyB0aGlzLnBhcmFtcy5tb2RlbFxuICAgICAgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgcHJvamVjdGlvbiBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyBzdWJzY3JpcHRpb24gcmVxdWVzdGVkIHBlci1ldmVudCByZWNvcmQgcHJvamVjdGlvbi5cbiAgICovXG4gIF9oYXNQcm9qZWN0aW9uUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5zZWxlY3QgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgdGhpcy5wYXJhbXMuc2VsZWN0c0V4dHJhICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHRoaXMucGFyYW1zLnByZWxvYWQgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgdGhpcy5wYXJhbXMud2l0aENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHRoaXMucGFyYW1zLmFiaWxpdGllcyAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCB0aGlzLnBhcmFtcy5xdWVyeURhdGEgIT09IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIGV2ZW50IGZpbHRlciBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhpcyBzdWJzY3JpcHRpb24gcmVxdWVzdGVkIGV2ZW50IHF1ZXJ5IGZpbHRlcnMuXG4gICAqL1xuICBfaGFzRXZlbnRGaWx0ZXJQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50RmlsdGVycygpLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyB1bmZpbHRlcmVkIGV2ZW50IGRlbGl2ZXJ5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHVuZmlsdGVyZWQgY2FsbGJhY2tzIHNob3VsZCByZWNlaXZlIGV2ZXJ5IGV2ZW50LlxuICAgKi9cbiAgX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy51bmZpbHRlcmVkRXZlbnREZWxpdmVyeSA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIGRlc3Ryb3kgZXZlbnQgZGVsaXZlcnkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaWQtb25seSBkZXN0cm95IGV2ZW50cyBzaG91bGQgYmUgZGVsaXZlcmVkIHdpdGggZXZlbnQgZmlsdGVycy5cbiAgICovXG4gIF9oYXNEZXN0cm95RXZlbnREZWxpdmVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZGVzdHJveUV2ZW50RGVsaXZlcnkgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV2ZW50IGZpbHRlcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudEZpbHRlclBheWxvYWRFbnRyeVtdfSAtIFZhbGlkIGV2ZW50IGZpbHRlcnMuXG4gICAqL1xuICBfZXZlbnRGaWx0ZXJzKCkge1xuICAgIGlmICh0aGlzLnBhcmFtcy5ldmVudEZpbHRlcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucGFyYW1zLmV2ZW50RmlsdGVycykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIG1vZGVsIGV2ZW50RmlsdGVycyBtdXN0IGJlIGFuIGFycmF5XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmV2ZW50RmlsdGVycy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCBtb2RlbCBldmVudEZpbHRlcnMgZW50cmllcyBtdXN0IGJlIG9iamVjdHNcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXZlbnRGaWx0ZXIgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoZW50cnkpXG4gICAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50RmlsdGVyKS5maWx0ZXIoKGtleSkgPT4gIUVWRU5UX0ZJTFRFUl9LRVlTLmhhcyhrZXkpKVxuXG4gICAgICBpZiAodW5rbm93bktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIGV2ZW50RmlsdGVycyBlbnRyaWVzIGNhbm5vdCBpbmNsdWRlICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnRGaWx0ZXIua2V5ICE9PSBcInN0cmluZ1wiIHx8IGV2ZW50RmlsdGVyLmtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIGVudHJpZXMgcmVxdWlyZSBhIGtleVwiKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFNhbml0aXplZCBldmVudCBmaWx0ZXIuXG4gICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRGaWx0ZXJQYXlsb2FkRW50cnl9ICovXG4gICAgICBjb25zdCBzYW5pdGl6ZWRFdmVudEZpbHRlciA9IHtrZXk6IGV2ZW50RmlsdGVyLmtleX1cblxuICAgICAgaWYgKGV2ZW50RmlsdGVyLmpvaW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2FuaXRpemVkRXZlbnRGaWx0ZXIuam9pbnMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGV2ZW50RmlsdGVyLmpvaW5zKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIuc2VhcmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci5zZWFyY2hlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsU2VhcmNoW119ICovIChldmVudEZpbHRlci5zZWFyY2hlcylcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50RmlsdGVyLndoZXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2FuaXRpemVkRXZlbnRGaWx0ZXIud2hlcmUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGV2ZW50RmlsdGVyLndoZXJlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2FuaXRpemVkRXZlbnRGaWx0ZXJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gRnJvbnRlbmQgbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICovXG4gIGFzeW5jIF9mcm9udGVuZE1vZGVsQ29udHJvbGxlckNsYXNzKCkge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxDb250cm9sbGVyUGF0aCA9IFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiXG4gICAgY29uc3Qge2RlZmF1bHQ6IEZyb250ZW5kTW9kZWxDb250cm9sbGVyfSA9IGF3YWl0IGltcG9ydChmcm9udGVuZE1vZGVsQ29udHJvbGxlclBhdGgpXG5cbiAgICByZXR1cm4gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbcGFyYW1zXSAtIE9wdGlvbmFsIHBhcmFtcyBvdmVycmlkZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gLSBTeW50aGV0aWMgY29udHJvbGxlciB1c2VkIGZvciByZXNvdXJjZSBzZXJpYWxpemF0aW9uLlxuICAgKi9cbiAgX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoe1xuICAgICAgYWN0aW9uOiBcIndlYnNvY2tldEV2ZW50XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcjogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBhYmlsaXRpZXM6IHRoaXMucGFyYW1zLmFiaWxpdGllcyxcbiAgICAgICAgam9pbnM6IHRoaXMucGFyYW1zLmpvaW5zLFxuICAgICAgICBtb2RlbDogdGhpcy5fbW9kZWxOYW1lKCksXG4gICAgICAgIHByZWxvYWQ6IHRoaXMucGFyYW1zLnByZWxvYWQsXG4gICAgICAgIHF1ZXJ5RGF0YTogdGhpcy5wYXJhbXMucXVlcnlEYXRhLFxuICAgICAgICBzZWFyY2hlczogdGhpcy5wYXJhbXMuc2VhcmNoZXMsXG4gICAgICAgIHNlbGVjdDogdGhpcy5wYXJhbXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RzRXh0cmE6IHRoaXMucGFyYW1zLnNlbGVjdHNFeHRyYSxcbiAgICAgICAgd2hlcmU6IHRoaXMucGFyYW1zLndoZXJlLFxuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHdpdGhDb3VudDogdGhpcy5wYXJhbXMud2l0aENvdW50XG4gICAgICB9LFxuICAgICAgcmVxdWVzdDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5fc3ludGhldGljUmVxdWVzdCgpKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KSxcbiAgICAgIHZpZXdQYXRoOiBcIi9cIlxuICAgIH0pXG5cbiAgICBjb250cm9sbGVyLl9mcm9udGVuZE1vZGVsQWJpbGl0eU92ZXJyaWRlID0gdGhpcy5fYWJpbGl0eSB8fCB1bmRlZmluZWRcblxuICAgIHJldHVybiBjb250cm9sbGVyXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHN1YnNjcmliZXIncyB0ZW5hbnQgZm9yIHRoZSBicm9hZGNhc3QgcmVjb3JkIGFuZCBydW5zIGBjYWxsYmFja2AgaW5zaWRlIHRoYXQgdGVuYW50XG4gICAqIGNvbnRleHQuIEJyb2FkY2FzdCBkZWxpdmVyeSBydW5zIGluIHdoYXRldmVyIGFtYmllbnQgdGVuYW50IGNvbnRleHQgdGhlIHB1Ymxpc2hlciBsZWZ0IGJlaGluZC4gRm9yXG4gICAqIG11bHRpLXRlbmFudCByZWNvcmRzIHRoYXQgYW1iaWVudCB0ZW5hbnQgbWF5IGhhdmUgYmVlbiByZXNvbHZlZCB3aXRob3V0IHRoZSBzdWJzY3JpYmVyJ3MgcmVxdWVzdFxuICAgKiAoZS5nLiBhIHJlbGF5IGVuZHBvaW50IG9yIGJhY2tncm91bmQgam9iIG11dGF0aW5nIHRoZSByb3cpLCBzbyBpdCBsYWNrcyB0aGUgc3Vic2NyaWJlcidzIHBlci1yZWNvcmRcbiAgICogYWNjZXNzIGZsYWdzIGFuZCB0aGUgcGVyLWV2ZW50IGF1dGhvcml6YXRpb24gcXVlcnkgd3JvbmdseSBmaW5kcyBub3RoaW5nLiBSZS1yZXNvbHZpbmcgdGhlIHRlbmFudFxuICAgKiBmcm9tIHRoZSBldmVudCByZWNvcmQgaWQgcGx1cyB0aGUgc3Vic2NyaWJlcidzIHJlcXVlc3QgbWFrZXMgdGhlIGF1dGhvcml6YXRpb24gcXVlcmllcyBydW4gYWdhaW5zdFxuICAgKiB0aGUgc3Vic2NyaWJlcidzIG93biB0ZW5hbnQvYWJpbGl0eSBzY29wZS4gV2hlbiBubyB0ZW5hbnQgcmVzb2x2ZXMgKG5vbi1tdWx0aXRlbmFudCBjb25maWdzKSwgdGhlXG4gICAqIGNhbGxiYWNrIHJ1bnMgZGlyZWN0bHkgc28gdGhlIGFtYmllbnQgY29udGV4dCBpcyBwcmVzZXJ2ZWQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIEF1dGhvcml6ZWQtcXVlcnkgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRXZlbnRUZW5hbnQoaWQsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24gfHwgdHlwZW9mIGNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIE1pcnJvciB0aGUgc3Vic2NyaWJlLXRpbWUgdGVuYW50IHJlc29sdXRpb24gKGBXZWJzb2NrZXRTZXNzaW9uLl9yZXNvbHZlVGVuYW50YCk6XG4gICAgLy8gcGFzcyBgc3Vic2NyaXB0aW9uOiB7Y2hhbm5lbCwgcGFyYW1zfWAgc28gcmVzb2x2ZXJzIHRoYXQgZGVyaXZlIHNjb3BlIGZyb20gdGhlXG4gICAgLy8gc3Vic2NyaXB0aW9uIGJlaGF2ZSB0aGUgc2FtZSBmb3IgYnJvYWRjYXN0cyBhcyB0aGV5IGRpZCBhdCBgY2hhbm5lbC1zdWJzY3JpYmVgLlxuICAgIC8vIFRoZSBzeW50aGV0aWMgcmVxdWVzdCBmb3J3YXJkcyB0aGUgc3Vic2NyaWJlcidzIHBhcmFtcyAoZS5nLiBhdXRoZW50aWNhdGlvblRva2VuKSxcbiAgICAvLyBtYXRjaGluZyB0aGlzIGNoYW5uZWwncyBhYmlsaXR5IHJlc29sdXRpb24gYWJvdmUuXG4gICAgY29uc3QgdGVuYW50ID0gYXdhaXQgY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogey4uLnRoaXMucGFyYW1zLCBpZCwgbW9kZWw6IHRoaXMuX21vZGVsTmFtZSgpfSxcbiAgICAgIHJlcXVlc3Q6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuX3N5bnRoZXRpY1JlcXVlc3QoKSksXG4gICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9ufSksXG4gICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsOiBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FLCBwYXJhbXM6IHRoaXMucGFyYW1zfVxuICAgIH0pXG5cbiAgICAvLyBBbHdheXMgZW50ZXIgYHJ1bldpdGhUZW5hbnRgLCBldmVuIHdoZW4gbm8gdGVuYW50IHJlc29sdmVkLiBCcm9hZGNhc3QgZmFuLW91dFxuICAgIC8vIHJ1bnMgaW4gdGhlIHB1Ymxpc2hlcidzIGFtYmllbnQgdGVuYW50IGNvbnRleHQ7IGZhbGxpbmcgYmFjayB0byBgY2FsbGJhY2soKWBcbiAgICAvLyB0aGVyZSB3b3VsZCBhdXRob3JpemUgYSBjcm9zcy10ZW5hbnQgcmVjb3JkIGFnYWluc3QgdGhlIHB1Ymxpc2hlcidzIHRlbmFudCBhbmRcbiAgICAvLyBjb3VsZCBsZWFrIGl0IHRvIGEgc3Vic2NyaWJlciB3aG9zZSBvd24gcmVzb2x2ZXIgY291bGQgbm90IHJlc29sdmUgaXQuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkZyb250ZW5kIG1vZGVsIHdlYnNvY2tldCBldmVudCB0ZW5hbnRcIn0sIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnJvYWRjYXN0IHJlY29yZCBpcyB3aXRoaW4gdGhlIHN1YnNjcmliZXIncyBhdXRoZW50aWNhdGVkIGFiaWxpdHkgc2NvcGUuIFVzZWQgdG8gZ2F0ZVxuICAgKiB1bmZpbHRlcmVkL3VucHJvamVjdGVkIGNyZWF0ZS91cGRhdGUgZGVsaXZlcnkgc28gYSBzY29wZWQgdG9rZW4gbmV2ZXIgcmVjZWl2ZXMgYSByZWNvcmQgaXQgY2Fubm90IHJlYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBUcnVlIHdoZW4gdGhlIHJlY29yZCBpcyByZWFkYWJsZSBieSB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIF9ldmVudElzQWNjZXNzaWJsZShpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICBjb25zdCBxdWVyeSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEF1dGhvcml6ZWRRdWVyeShcImZpbmRcIikud2hlcmUoe1tNb2RlbENsYXNzLnRhYmxlTmFtZSgpXToge1twcmltYXJ5S2V5XTogaWR9fSlcblxuICAgICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2hlZCBldmVudCBmaWx0ZXIga2V5cyBmb3IgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBFdmVudCBmaWx0ZXIga2V5cyBtYXRjaGVkIGJ5IHRoZSByZWNvcmQuXG4gICAqL1xuICBhc3luYyBfbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c0ZvckV2ZW50SWQoaWQsIEZyb250ZW5kTW9kZWxDb250cm9sbGVyKSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2hlZCBldmVudCBmaWx0ZXIga2V5cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50RmlsdGVyIG9mIHRoaXMuX2V2ZW50RmlsdGVycygpKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gYXdhaXQgdGhpcy5fZXZlbnRNYXRjaGVzRmlsdGVyKHtcbiAgICAgICAgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgIGV2ZW50RmlsdGVyLFxuICAgICAgICBpZFxuICAgICAgfSlcblxuICAgICAgaWYgKG1hdGNoZXMpIG1hdGNoZWRFdmVudEZpbHRlcktleXMucHVzaChldmVudEZpbHRlci5rZXkpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRFdmVudEZpbHRlcktleXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV2ZW50IG1hdGNoZXMgZmlsdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZpbHRlciBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50RmlsdGVyUGF5bG9hZEVudHJ5fSBhcmdzLmV2ZW50RmlsdGVyIC0gRXZlbnQgZmlsdGVyIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhcmdzLmlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgcmVjb3JkIG1hdGNoZXMgdGhlIGZpbHRlci5cbiAgICovXG4gIGFzeW5jIF9ldmVudE1hdGNoZXNGaWx0ZXIoe0Zyb250ZW5kTW9kZWxDb250cm9sbGVyLCBldmVudEZpbHRlciwgaWR9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhFdmVudFRlbmFudChpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyLCB7XG4gICAgICAgIGpvaW5zOiBldmVudEZpbHRlci5qb2lucyxcbiAgICAgICAgc2VhcmNoZXM6IGV2ZW50RmlsdGVyLnNlYXJjaGVzLFxuICAgICAgICB3aGVyZTogZXZlbnRGaWx0ZXIud2hlcmVcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICBjb25zdCB3aGVyZSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFdoZXJlKClcbiAgICAgIGNvbnN0IGpvaW5zID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsSm9pbnMoKVxuICAgICAgLy8gU3RhcnQgZnJvbSB0aGUgc3Vic2NyaWJlcidzIGF1dGhvcml6ZWQgc2NvcGUgc28gYSBmaWx0ZXIgY2FuIG9ubHkgZXZlciBtYXRjaCByZWNvcmRzIHRoZVxuICAgICAgLy8gc3Vic2NyaXB0aW9uJ3MgYWJpbGl0eSBwZXJtaXRzIHRvIHJlYWQuXG4gICAgICBsZXQgcXVlcnkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJmaW5kXCIpLndoZXJlKHtbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IHtbcHJpbWFyeUtleV06IGlkfX0pXG5cbiAgICAgIGlmICh3aGVyZSkgY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxXaGVyZSh7cXVlcnksIHdoZXJlfSlcbiAgICAgIGlmIChqb2lucykgY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxKb2lucyh7am9pbnMsIHF1ZXJ5fSlcblxuICAgICAgZm9yIChjb25zdCBzZWFyY2ggb2YgY29udHJvbGxlci5mcm9udGVuZE1vZGVsU2VhcmNoZXMoKSkge1xuICAgICAgICBjb250cm9sbGVyLmFwcGx5RnJvbnRlbmRNb2RlbFNlYXJjaCh7cXVlcnksIHNlYXJjaH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHF1ZXJ5LmZpcnN0KCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByb2plY3RlZCByZWNvcmQgZm9yIGV2ZW50IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBudWxsPn0gLSBTZXJpYWxpemVkIHByb2plY3RlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBfcHJvamVjdGVkUmVjb3JkRm9yRXZlbnRJZChpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICAvLyBSZWxvYWQgdGhyb3VnaCB0aGUgc3Vic2NyaWJlcidzIGF1dGhvcml6ZWQgc2NvcGUgc28gcHJvamVjdGVkIHJlY29yZHMgYXJlIG9ubHkgZXZlciBzZW50IGZvclxuICAgICAgLy8gcm93cyB0aGUgc3Vic2NyaXB0aW9uJ3MgYWJpbGl0eSBwZXJtaXRzIHRvIHJlYWQuXG4gICAgICBsZXQgcXVlcnkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJmaW5kXCIpLndoZXJlKHtbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IHtbcHJpbWFyeUtleV06IGlkfX0pXG4gICAgICBjb25zdCBwcmVsb2FkID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsUHJlbG9hZCgpXG5cbiAgICAgIGlmIChwcmVsb2FkKSBxdWVyeSA9IHF1ZXJ5LnByZWxvYWQocHJlbG9hZClcblxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxXaXRoQ291bnQoKSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlYy5cbiAgICAgICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0+fSAqL1xuICAgICAgICBjb25zdCBzcGVjID0ge31cblxuICAgICAgICBzcGVjW2VudHJ5LmF0dHJpYnV0ZU5hbWVdID0ge1xuICAgICAgICAgIHJlbGF0aW9uc2hpcDogZW50cnkucmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgICB3aGVyZTogZW50cnkud2hlcmUgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGVudHJ5LndoZXJlKSA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5LndpdGhDb3VudChzcGVjKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeURhdGEgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxRdWVyeURhdGEoKVxuXG4gICAgICBpZiAocXVlcnlEYXRhICE9PSBudWxsKSBxdWVyeS5xdWVyeURhdGEocXVlcnlEYXRhKVxuXG4gICAgICBxdWVyeSA9IGNvbnRyb2xsZXIuYXBwbHlGcm9udGVuZE1vZGVsVHJhbnNsYXRlZEF0dHJpYnV0ZVByZWxvYWRzKHtxdWVyeX0pXG5cbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcXVlcnkuZmlyc3QoKVxuXG4gICAgICBpZiAoIW1vZGVsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodGhpcy5wYXJhbXMuYWJpbGl0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXdhaXQgY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ29tcHV0ZUFiaWxpdGllcyhbbW9kZWxdKVxuICAgICAgfVxuXG4gICAgICBjb250cm9sbGVyLl9mcm9udGVuZE1vZGVsQWJpbGl0eU92ZXJyaWRlID0gdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuc2VyaWFsaXplKG1vZGVsLCBcImZpbmRcIilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltYWwgUmVxdWVzdC1saWtlIHN0dWIgdXNlZCBvbmx5IGZvciBhYmlsaXR5IHJlc29sdXRpb24uIEF2b2lkc1xuICAgKiBpbXBvcnRpbmcgYFdlYnNvY2tldFJlcXVlc3RgIGhlcmUgYmVjYXVzZSBpdHMgYG5vZGU6cXVlcnlzdHJpbmdgXG4gICAqIGRlcGVuZGVuY3kgd291bGQgcHVsbCBzZXJ2ZXItb25seSBjb2RlIGludG8gYnJvd3NlciBidW5kbGVzIHZpYVxuICAgKiB0aGUgYGNvbmZpZ3VyYXRpb24g4oaSIGxvZ2dlciDihpIgd2Vic29ja2V0LXB1Ymxpc2hlcnNgIGltcG9ydCBjaGFpbi5cbiAgICogSGVhZGVyIG5hbWVzIGFyZSBub3JtYWxpemVkIHRvIGxvd2VyY2FzZSBzbyBgaGVhZGVyKFwiY29va2llXCIpYFxuICAgKiBmaW5kcyBhIHZhbHVlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXBncmFkZS1yZXF1ZXN0IGhlYWRlcnNcbiAgICogbWFwIHVzZXMgYFwiQ29va2llXCJgIG9yIGBcImNvb2tpZVwiYC4gU2Vzc2lvbiBtZXRhZGF0YSBzdGF5cyBzZXBhcmF0ZVxuICAgKiBmcm9tIGhlYWRlcnMgYW5kIGlzIGV4cG9zZWQgdGhyb3VnaCBgbWV0YWRhdGEoLi4uKWAgZm9yIGFiaWxpdHlcbiAgICogcmVzb2x2ZXJzIHRoYXQgbmVlZCB3ZWJzb2NrZXQtZGVsaXZlcmVkIHNlc3Npb24gZGF0YS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxXZWJzb2NrZXRTeW50aGV0aWNSZXF1ZXN0fSBSZXF1ZXN0LWxpa2Ugb2JqZWN0IGZvciBhYmlsaXR5IHJlc29sdXRpb24uXG4gICAqL1xuICBfc3ludGhldGljUmVxdWVzdCgpIHtcbiAgICBjb25zdCB1cGdyYWRlUmVxdWVzdCA9IC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFdlYnNvY2tldFVwZ3JhZGVSZXF1ZXN0fSAqLyAodGhpcy5zZXNzaW9uLnVwZ3JhZGVSZXF1ZXN0KVxuICAgIGNvbnN0IHJhd0hlYWRlcnMgPSB0eXBlb2YgdXBncmFkZVJlcXVlc3Q/LmhlYWRlcnMgPT09IFwiZnVuY3Rpb25cIiA/IHVwZ3JhZGVSZXF1ZXN0LmhlYWRlcnMoKSA6IHt9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0eXBlb2YgdGhpcy5zZXNzaW9uLmdldE1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLnNlc3Npb24uZ2V0TWV0YWRhdGEoKSA6IHt9XG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHR5cGVvZiB1cGdyYWRlUmVxdWVzdD8ucmVtb3RlQWRkcmVzcyA9PT0gXCJmdW5jdGlvblwiID8gdXBncmFkZVJlcXVlc3QucmVtb3RlQWRkcmVzcygpIDogdW5kZWZpbmVkXG4gICAgLyoqXG4gICAgICogSGVhZGVyIG1hcC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+fSAqL1xuICAgIGNvbnN0IGhlYWRlck1hcCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyYXdIZWFkZXJzIHx8IHt9KSkge1xuICAgICAgaGVhZGVyTWFwW2tleS50b0xvd2VyQ2FzZSgpXSA9IHJhd0hlYWRlcnNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXJzOiAoKSA9PiBoZWFkZXJNYXAsXG4gICAgICBoZWFkZXI6IChuYW1lKSA9PiBoZWFkZXJNYXBbU3RyaW5nKG5hbWUpLnRvTG93ZXJDYXNlKCldLFxuICAgICAgbWV0YWRhdGE6IChrZXkpID0+IGtleSA9PT0gdW5kZWZpbmVkID8gey4uLm1ldGFkYXRhfSA6IG1ldGFkYXRhW2tleV0sXG4gICAgICBwYXRoOiAoKSA9PiBcIi9mcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIGh0dHBNZXRob2Q6ICgpID0+IFwiUE9TVFwiLFxuICAgICAgcmVtb3RlQWRkcmVzczogKCkgPT4gcmVtb3RlQWRkcmVzcyxcbiAgICAgIG9yaWdpbjogKCkgPT4gaGVhZGVyTWFwLm9yaWdpblxuICAgIH1cbiAgfVxufVxuIl19
|
|
511
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHlCQUF5QixNQUFNLHFDQUFxQyxDQUFBO0FBQzNFLE9BQU8sUUFBUSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3hELE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBRWpGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBRXhFLHFGQUFxRjtBQUNyRiwyRUFBMkU7QUFDM0UsTUFBTSw0QkFBNEIsR0FBRyxpQkFBaUIsQ0FBQTtBQUV0RDs7OztHQUlHO0FBQ0gsU0FBUyw2Q0FBNkMsQ0FBQyxhQUFhO0lBQ2xFLE9BQU87UUFDTCxRQUFRLEVBQUUsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztLQUMzRSxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE4QixTQUFRLHlCQUF5QjtJQUNsRjs7c0VBRWtFO0lBQ2xFLFFBQVEsR0FBRyxJQUFJLENBQUE7SUFFZjs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFFbkMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFh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QUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYTtZQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU07U0FDL0IsQ0FBQTtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIlxuaW1wb3J0IHtzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuY29uc3QgRVZFTlRfRklMVEVSX0tFWVMgPSBuZXcgU2V0KFtcImpvaW5zXCIsIFwia2V5XCIsIFwic2VhcmNoZXNcIiwgXCJ3aGVyZVwiXSlcblxuLy8gTWlycm9ycyBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FIGluIC4vd2Vic29ja2V0LXB1Ymxpc2hlcnMuanMsIGR1cGxpY2F0ZWQgaGVyZVxuLy8gdG8gYXZvaWQgdGhlIGNvbmZpZ3VyYXRpb24g4oaSIGxvZ2dlciDihpIgd2Vic29ja2V0LXB1Ymxpc2hlcnMgaW1wb3J0IGN5Y2xlLlxuY29uc3QgRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSA9IFwiZnJvbnRlbmQtbW9kZWxzXCJcblxuLyoqXG4gKiBSdW5zIHRyYW5zcG9ydCBzZXJpYWxpemF0aW9uIG9wdGlvbnMgZm9yIGEgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRTZXJpYWxpemF0aW9uT3B0aW9uc30gLSBTZXJpYWxpemF0aW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9ydFNlcmlhbGl6YXRpb25PcHRpb25zRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIHJldHVybiB7XG4gICAgdGltZVpvbmU6IGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKCkuZ2V0VGltZVpvbmUoY29uZmlndXJhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3thY3Rpb24/OiBzdHJpbmcsIGlkPzogc3RyaW5nIHwgbnVtYmVyLCBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzPzogc3RyaW5nW10sIHJlY29yZD86IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlLCBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHlcbiAqL1xuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7aGVhZGVycz86ICgpID0+IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiwgcmVtb3RlQWRkcmVzcz86ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZH19IEZyb250ZW5kTW9kZWxXZWJzb2NrZXRVcGdyYWRlUmVxdWVzdFxuICovXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3toZWFkZXJzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sIGhlYWRlcjogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsIG1ldGFkYXRhOiAoa2V5Pzogc3RyaW5nKSA9PiBSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSB8IHVuZGVmaW5lZCwgcGF0aDogKCkgPT4gc3RyaW5nLCBodHRwTWV0aG9kOiAoKSA9PiBzdHJpbmcsIHJlbW90ZUFkZHJlc3M6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCwgb3JpZ2luOiAoKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZH19IEZyb250ZW5kTW9kZWxXZWJzb2NrZXRTeW50aGV0aWNSZXF1ZXN0XG4gKi9cblxuLyoqXG4gKiBQZXItc2Vzc2lvbiBjaGFubmVsIHN1YnNjcmlwdGlvbiBmb3IgZnJvbnRlbmQtbW9kZWwgbGlmZWN5Y2xlIGV2ZW50cy5cbiAqIFJlcGxhY2VzIHRoZSBsZWdhY3kgYEZyb250ZW5kTW9kZWxXZWJzb2NrZXRDaGFubmVsYCAoUGhhc2UgMykuXG4gKlxuICogQXV0aCBtb2RlbDogc3Vic2NyaWJlLXRpbWUgb25seS4gYGNhblN1YnNjcmliZWAgcmVzb2x2ZXMgdGhlIGNhbGxlcidzXG4gKiBhYmlsaXR5IG9uY2UsIGNoZWNrcyB0aGF0IGF0IGxlYXN0IG9uZSBgYWxsb3dgIHJ1bGUgZXhpc3RzIGZvclxuICogYHJlYWRgIG9uIHRoZSByZXF1ZXN0ZWQgbW9kZWwgY2xhc3MsIGFuZCB0aGVuIGRlbGl2ZXJzIGZ1dHVyZVxuICogbGlmZWN5Y2xlIGJyb2FkY2FzdHMgZm9yIHRoYXQgbW9kZWwgd2l0aG91dCByZS1hdXRob3JpemluZyBwZXIgZXZlbnQuXG4gKiBUaGlzIG1hdGNoZXMgdGhlIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbiBpbiBQaGFzZSAzIHRvIHRyYWRlXG4gKiBwZXItcmVjb3JkIHZpc2liaWxpdHkgZ3VhcmFudGVlcyBmb3IgbWFzc2l2ZWx5IGNoZWFwZXIgYnJvYWRjYXN0IGZhbi1vdXQuXG4gKiBTdWJzY3JpYmVyLXByb3ZpZGVkIGV2ZW50IGZpbHRlcnMgY2FuIHN0aWxsIG5hcnJvdyB3aGljaCBjcmVhdGUvdXBkYXRlXG4gKiBldmVudHMgYXJlIGRlbGl2ZXJlZCwgYnV0IHRoZXkgYXJlIG1hdGNoaW5nIHByZWRpY2F0ZXMgcmF0aGVyIHRoYW5cbiAqIHBlci1yZWNvcmQgYXV0aG9yaXphdGlvbiBjaGVja3MuXG4gKlxuICogV2lyZTogc3Vic2NyaWJlIHdpdGggYHN1YnNjcmliZUNoYW5uZWwoXCJmcm9udGVuZC1tb2RlbHNcIiwge3BhcmFtczoge21vZGVsOiBNb2RlbE5hbWV9fSlgLlxuICogQmFja2VuZCBwdWJsaXNoZXMgYHthY3Rpb24sIGlkLCByZWNvcmR9YCB2aWFcbiAqIGBjb25maWd1cmF0aW9uLmJyb2FkY2FzdFRvQ2hhbm5lbChcImZyb250ZW5kLW1vZGVsc1wiLCB7bW9kZWw6IE1vZGVsTmFtZX0sIGJvZHkpYDtcbiAqIGBtYXRjaGVzKClgIHJvdXRlcyBieSBtb2RlbCBuYW1lLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGcm9udGVuZE1vZGVsV2Vic29ja2V0Q2hhbm5lbCBleHRlbmRzIFZlbG9jaW91c1dlYnNvY2tldENoYW5uZWwge1xuICAvKipcbiAgICogQWJpbGl0eS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgX2FiaWxpdHkgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJ1bnMgY2FuIHN1YnNjcmliZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGZyb250ZW5kLW1vZGVsIHN1YnNjcmlwdGlvbiBpcyBhdXRob3JpemVkLlxuICAgKi9cbiAgYXN5bmMgY2FuU3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRoaXMuX21vZGVsTmFtZSgpXG5cbiAgICBpZiAoIW1vZGVsTmFtZSkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5fZXZlbnRGaWx0ZXJzKClcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICBjb25zdCBNb2RlbENsYXNzID0gbW9kZWxDbGFzc2VzW21vZGVsTmFtZV1cblxuICAgIGlmICghTW9kZWxDbGFzcykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5fc3ludGhldGljUmVxdWVzdCgpKVxuICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgIC8vIEZvcndhcmQgdGhlIHN1YnNjcmliZXIncyBwYXJhbXMgKGUuZy4gYXV0aGVudGljYXRpb25Ub2tlbikgc28gdG9rZW4tYXV0aGVudGljYXRlZCBjbGllbnRzXG4gICAgICAvLyByZXNvbHZlIHRoZSBzYW1lIGFiaWxpdHkgdGhleSB3b3VsZCBvdmVyIEhUVFAuIFdpdGhvdXQgdGhpcyBvbmx5IHNlc3Npb24vY29va2llIGF1dGggb24gdGhlXG4gICAgICAvLyB1cGdyYWRlIHJlcXVlc3Qgd29ya3MsIGFuZCBwYXJhbS1iYXNlZCBhdXRoIChsaWtlIGEgc2Nhbm5lciBwYXNzaW5nIGFuIGF1dGhlbnRpY2F0aW9uVG9rZW4pXG4gICAgICAvLyBpcyBkcm9wcGVkIOKAlCBsZWF2aW5nIHN1Y2ggc3Vic2NyaWJlcnMgd2l0aCBhIGd1ZXN0IGFiaWxpdHkgYW5kIG5vIHJlYWQgcnVsZS5cbiAgICAgIHBhcmFtczogey4uLnRoaXMucGFyYW1zLCBtb2RlbDogbW9kZWxOYW1lfSxcbiAgICAgIHJlcXVlc3QsXG4gICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9ufSlcbiAgICB9KVxuXG4gICAgaWYgKCFhYmlsaXR5KSByZXR1cm4gZmFsc2VcbiAgICB0aGlzLl9hYmlsaXR5ID0gYWJpbGl0eVxuXG4gICAgLy8gTG9hZCByZXNvdXJjZS1kZWNsYXJlZCBydWxlcyBmb3IgdGhpcyBtb2RlbCBjbGFzcyBiZWZvcmUgY2hlY2tpbmcsXG4gICAgLy8gb3RoZXJ3aXNlIGBydWxlc0ZvcmAgcmV0dXJucyBlbXB0eSBmb3IgYWJpbGl0aWVzIHdob3NlIHJlc291cmNlc1xuICAgIC8vIHJlZ2lzdGVyIHJ1bGVzIGxhemlseSB2aWEgYGFiaWxpdGllcygpYC5cbiAgICBhYmlsaXR5LmxvYWRBYmlsaXRpZXNGb3JNb2RlbENsYXNzKE1vZGVsQ2xhc3MpXG5cbiAgICBjb25zdCByZWFkUnVsZXMgPSBhYmlsaXR5LnJ1bGVzRm9yKHthY3Rpb246IFwicmVhZFwiLCBtb2RlbENsYXNzOiBNb2RlbENsYXNzfSlcblxuICAgIHJldHVybiByZWFkUnVsZXMuc29tZSgoLyoqIEB0eXBlIHt7ZWZmZWN0OiBzdHJpbmd9fSAqLyBydWxlKSA9PiBydWxlLmVmZmVjdCA9PT0gXCJhbGxvd1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsaXZlciBicm9hZGNhc3QuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHl9IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHt7ZXZlbnRJZD86IHN0cmluZ319IFttZXRhXSAtIE9wdGlvbmFsIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgZGVsaXZlcnkuXG4gICAqL1xuICBhc3luYyBkZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpIHtcbiAgICBhd2FpdCB0aGlzLl9kZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxpdmVyIGJyb2FkY2FzdC5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keX0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICAgKiBAcGFyYW0ge3tldmVudElkPzogc3RyaW5nfX0gW21ldGFdIC0gT3B0aW9uYWwgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBkZWxpdmVyeS5cbiAgICovXG4gIGFzeW5jIF9kZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpIHtcbiAgICBjb25zdCBoYXNFdmVudEZpbHRlcnMgPSB0aGlzLl9oYXNFdmVudEZpbHRlclBhcmFtcygpXG5cbiAgICBpZiAoIXRoaXMuX2hhc1Byb2plY3Rpb25QYXJhbXMoKSAmJiAhaGFzRXZlbnRGaWx0ZXJzKSB7XG4gICAgICAvLyBFdmVuIHVuZmlsdGVyZWQgc3Vic2NyaXB0aW9ucyBtdXN0IHJlc3BlY3QgdGhlIHN1YnNjcmliZXIncyBhYmlsaXR5LiBBIGNyZWF0ZS91cGRhdGUgY2Fycmllc1xuICAgICAgLy8gdGhlIHJlY29yZCwgc28gb25seSBkZWxpdmVyIGl0IHdoZW4gdGhlIHJlY29yZCBpcyB3aXRoaW4gdGhlIGF1dGhlbnRpY2F0ZWQgYWJpbGl0eSdzIHNjb3BlLlxuICAgICAgLy8gRGVzdHJveXMgKGFuZCBib2RpZXMgd2l0aG91dCBhIHVzYWJsZSBpZCkgY2Fycnkgbm8gcmVjb3JkLCBzbyBwYXNzIHRoZW0gdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAgICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gXCJvYmplY3RcIiAmJiAoYm9keS5hY3Rpb24gPT09IFwiY3JlYXRlXCIgfHwgYm9keS5hY3Rpb24gPT09IFwidXBkYXRlXCIpICYmIGJvZHkuaWQgIT09IHVuZGVmaW5lZCAmJiBib2R5LmlkICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IEZyb250ZW5kTW9kZWxDb250cm9sbGVyID0gYXdhaXQgdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXJDbGFzcygpXG5cbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLl9ldmVudElzQWNjZXNzaWJsZShib2R5LmlkLCBGcm9udGVuZE1vZGVsQ29udHJvbGxlcikpIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghaGFzRXZlbnRGaWx0ZXJzIHx8IHRoaXMuX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkpIHRoaXMuc2VuZE1lc3NhZ2UoYm9keSwgbWV0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChib2R5LmFjdGlvbiA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIGlmICghaGFzRXZlbnRGaWx0ZXJzIHx8IHRoaXMuX2hhc0Rlc3Ryb3lFdmVudERlbGl2ZXJ5KCkgfHwgdGhpcy5faGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSkgdGhpcy5zZW5kTWVzc2FnZShib2R5LCBtZXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkuaWQgPT09IHVuZGVmaW5lZCB8fCBib2R5LmlkID09PSBudWxsKSB7XG4gICAgICBpZiAoIWhhc0V2ZW50RmlsdGVycyB8fCB0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKVxuICAgIGNvbnN0IG1hdGNoZWRFdmVudEZpbHRlcktleXMgPSBhd2FpdCB0aGlzLl9tYXRjaGVkRXZlbnRGaWx0ZXJLZXlzRm9yRXZlbnRJZChib2R5LmlkLCBGcm9udGVuZE1vZGVsQ29udHJvbGxlcilcblxuICAgIGlmIChoYXNFdmVudEZpbHRlcnMgJiYgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cy5sZW5ndGggPT09IDAgJiYgIXRoaXMuX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGl2ZXIgYm9keS5cbiAgICAgKiBAdHlwZSB7RnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHl9ICovXG4gICAgbGV0IGRlbGl2ZXJCb2R5ID0gYm9keVxuXG4gICAgaWYgKHRoaXMuX2hhc1Byb2plY3Rpb25QYXJhbXMoKSkge1xuICAgICAgY29uc3QgcHJvamVjdGVkUmVjb3JkID0gYXdhaXQgdGhpcy5fcHJvamVjdGVkUmVjb3JkRm9yRXZlbnRJZChib2R5LmlkLCBGcm9udGVuZE1vZGVsQ29udHJvbGxlcilcblxuICAgICAgaWYgKCFwcm9qZWN0ZWRSZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgd2Vic29ja2V0IGNoYW5uZWwgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZm9yIHRyYW5zcG9ydCBzZXJpYWxpemF0aW9uXCIpXG4gICAgICB9XG5cbiAgICAgIGRlbGl2ZXJCb2R5ID0ge1xuICAgICAgICAuLi5kZWxpdmVyQm9keSxcbiAgICAgICAgcmVjb3JkOiAvKiogQHR5cGUge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHByb2plY3RlZFJlY29yZCwgdHJhbnNwb3J0U2VyaWFsaXphdGlvbk9wdGlvbnNGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRXZlbnRGaWx0ZXJzKSB7XG4gICAgICBkZWxpdmVyQm9keSA9IHtcbiAgICAgICAgLi4uZGVsaXZlckJvZHksXG4gICAgICAgIG1hdGNoZWRFdmVudEZpbHRlcktleXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbmRNZXNzYWdlKGRlbGl2ZXJCb2R5LCBtZXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IGJyb2FkY2FzdFBhcmFtcyAtIFBhcmFtcyBmcm9tIGBicm9hZGNhc3RUb0NoYW5uZWxgLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYnJvYWRjYXN0IG1hdGNoZXMgdGhpcyBzdWJzY3JpYmVyJ3MgbW9kZWwuXG4gICAqL1xuICBtYXRjaGVzKGJyb2FkY2FzdFBhcmFtcykge1xuICAgIHJldHVybiBicm9hZGNhc3RQYXJhbXM/Lm1vZGVsID09PSB0aGlzLl9tb2RlbE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gRGVidWctc2FmZSBzdWJzY3JpcHRpb24gZGV0YWlscy5cbiAgICovXG4gIGRlYnVnU25hcHNob3QoKSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXJzID0gdGhpcy5fZXZlbnRGaWx0ZXJzKClcblxuICAgIHJldHVybiB7XG4gICAgICBhYmlsaXRpZXM6IHRoaXMucGFyYW1zLmFiaWxpdGllcyAhPT0gdW5kZWZpbmVkLFxuICAgICAgZXZlbnRGaWx0ZXJDb3VudDogZXZlbnRGaWx0ZXJzLmxlbmd0aCxcbiAgICAgIGRlc3Ryb3lFdmVudERlbGl2ZXJ5OiB0aGlzLnBhcmFtcy5kZXN0cm95RXZlbnREZWxpdmVyeSA9PT0gdHJ1ZSxcbiAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbE5hbWUoKSxcbiAgICAgIHByZWxvYWQ6IHRoaXMucGFyYW1zLnByZWxvYWQgIT09IHVuZGVmaW5lZCxcbiAgICAgIHF1ZXJ5RGF0YTogdGhpcy5wYXJhbXMucXVlcnlEYXRhICE9PSB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Q6IHRoaXMucGFyYW1zLnNlbGVjdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0c0V4dHJhOiB0aGlzLnBhcmFtcy5zZWxlY3RzRXh0cmEgIT09IHVuZGVmaW5lZCxcbiAgICAgIHVuZmlsdGVyZWRFdmVudERlbGl2ZXJ5OiB0aGlzLnBhcmFtcy51bmZpbHRlcmVkRXZlbnREZWxpdmVyeSA9PT0gdHJ1ZSxcbiAgICAgIHdpdGhDb3VudDogdGhpcy5wYXJhbXMud2l0aENvdW50ICE9PSB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBSZXF1ZXN0ZWQgZnJvbnRlbmQtbW9kZWwgbmFtZSBvciBudWxsLlxuICAgKi9cbiAgX21vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGFyYW1zPy5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5tb2RlbC5sZW5ndGggPiAwXG4gICAgICA/IHRoaXMucGFyYW1zLm1vZGVsXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyBwcm9qZWN0aW9uIHBhcmFtcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiByZXF1ZXN0ZWQgcGVyLWV2ZW50IHJlY29yZCBwcm9qZWN0aW9uLlxuICAgKi9cbiAgX2hhc1Byb2plY3Rpb25QYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLnNlbGVjdCAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCB0aGlzLnBhcmFtcy5zZWxlY3RzRXh0cmEgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgdGhpcy5wYXJhbXMucHJlbG9hZCAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCB0aGlzLnBhcmFtcy53aXRoQ291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgfHwgdGhpcy5wYXJhbXMuYWJpbGl0aWVzICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHRoaXMucGFyYW1zLnF1ZXJ5RGF0YSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgZXZlbnQgZmlsdGVyIHBhcmFtcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiByZXF1ZXN0ZWQgZXZlbnQgcXVlcnkgZmlsdGVycy5cbiAgICovXG4gIF9oYXNFdmVudEZpbHRlclBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRGaWx0ZXJzKCkubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHVuZmlsdGVyZWQgZXZlbnQgZGVsaXZlcnkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdW5maWx0ZXJlZCBjYWxsYmFja3Mgc2hvdWxkIHJlY2VpdmUgZXZlcnkgZXZlbnQuXG4gICAqL1xuICBfaGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLnVuZmlsdGVyZWRFdmVudERlbGl2ZXJ5ID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgZGVzdHJveSBldmVudCBkZWxpdmVyeS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBpZC1vbmx5IGRlc3Ryb3kgZXZlbnRzIHNob3VsZCBiZSBkZWxpdmVyZWQgd2l0aCBldmVudCBmaWx0ZXJzLlxuICAgKi9cbiAgX2hhc0Rlc3Ryb3lFdmVudERlbGl2ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5kZXN0cm95RXZlbnREZWxpdmVyeSA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXZlbnQgZmlsdGVycy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50RmlsdGVyUGF5bG9hZEVudHJ5W119IC0gVmFsaWQgZXZlbnQgZmlsdGVycy5cbiAgICovXG4gIF9ldmVudEZpbHRlcnMoKSB7XG4gICAgaWYgKHRoaXMucGFyYW1zLmV2ZW50RmlsdGVycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW11cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5wYXJhbXMuZXZlbnRGaWx0ZXJzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIG11c3QgYmUgYW4gYXJyYXlcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZXZlbnRGaWx0ZXJzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIG1vZGVsIGV2ZW50RmlsdGVycyBlbnRyaWVzIG11c3QgYmUgb2JqZWN0c1wiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudEZpbHRlciA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChlbnRyeSlcbiAgICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoZXZlbnRGaWx0ZXIpLmZpbHRlcigoa2V5KSA9PiAhRVZFTlRfRklMVEVSX0tFWVMuaGFzKGtleSkpXG5cbiAgICAgIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIGVudHJpZXMgY2Fubm90IGluY2x1ZGUgJHt1bmtub3duS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBldmVudEZpbHRlci5rZXkgIT09IFwic3RyaW5nXCIgfHwgZXZlbnRGaWx0ZXIua2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCBtb2RlbCBldmVudEZpbHRlcnMgZW50cmllcyByZXF1aXJlIGEga2V5XCIpXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogU2FuaXRpemVkIGV2ZW50IGZpbHRlci5cbiAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudEZpbHRlclBheWxvYWRFbnRyeX0gKi9cbiAgICAgIGNvbnN0IHNhbml0aXplZEV2ZW50RmlsdGVyID0ge2tleTogZXZlbnRGaWx0ZXIua2V5fVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIuam9pbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci5qb2lucyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAoZXZlbnRGaWx0ZXIuam9pbnMpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudEZpbHRlci5zZWFyY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNhbml0aXplZEV2ZW50RmlsdGVyLnNlYXJjaGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxTZWFyY2hbXX0gKi8gKGV2ZW50RmlsdGVyLnNlYXJjaGVzKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIud2hlcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci53aGVyZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAoZXZlbnRGaWx0ZXIud2hlcmUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzYW5pdGl6ZWRFdmVudEZpbHRlclxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0Pn0gLSBGcm9udGVuZCBtb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbENvbnRyb2xsZXJQYXRoID0gXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCJcbiAgICBjb25zdCB7ZGVmYXVsdDogRnJvbnRlbmRNb2RlbENvbnRyb2xsZXJ9ID0gYXdhaXQgaW1wb3J0KGZyb250ZW5kTW9kZWxDb250cm9sbGVyUGF0aClcblxuICAgIHJldHVybiBGcm9udGVuZE1vZGVsQ29udHJvbGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29udHJvbGxlci5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFtwYXJhbXNdIC0gT3B0aW9uYWwgcGFyYW1zIG92ZXJyaWRlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAtIFN5bnRoZXRpYyBjb250cm9sbGVyIHVzZWQgZm9yIHJlc291cmNlIHNlcmlhbGl6YXRpb24uXG4gICAqL1xuICBfZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIsIHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBGcm9udGVuZE1vZGVsQ29udHJvbGxlcih7XG4gICAgICBhY3Rpb246IFwid2Vic29ja2V0RXZlbnRcIixcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBjb250cm9sbGVyOiBcImZyb250ZW5kLW1vZGVsc1wiLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGFiaWxpdGllczogdGhpcy5wYXJhbXMuYWJpbGl0aWVzLFxuICAgICAgICBqb2luczogdGhpcy5wYXJhbXMuam9pbnMsXG4gICAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbE5hbWUoKSxcbiAgICAgICAgcHJlbG9hZDogdGhpcy5wYXJhbXMucHJlbG9hZCxcbiAgICAgICAgcXVlcnlEYXRhOiB0aGlzLnBhcmFtcy5xdWVyeURhdGEsXG4gICAgICAgIHNlYXJjaGVzOiB0aGlzLnBhcmFtcy5zZWFyY2hlcyxcbiAgICAgICAgc2VsZWN0OiB0aGlzLnBhcmFtcy5zZWxlY3QsXG4gICAgICAgIHNlbGVjdHNFeHRyYTogdGhpcy5wYXJhbXMuc2VsZWN0c0V4dHJhLFxuICAgICAgICB3aGVyZTogdGhpcy5wYXJhbXMud2hlcmUsXG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgd2l0aENvdW50OiB0aGlzLnBhcmFtcy53aXRoQ291bnRcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiAvKiogQHR5cGUge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLl9zeW50aGV0aWNSZXF1ZXN0KCkpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbn0pLFxuICAgICAgdmlld1BhdGg6IFwiL1wiXG4gICAgfSlcblxuICAgIGNvbnRyb2xsZXIuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSB0aGlzLl9hYmlsaXR5IHx8IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIGNvbnRyb2xsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0ZW5hbnQgZm9yIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIFJlc29sdmVkIHRlbmFudC5cbiAgICovXG4gIGFzeW5jIF9yZXNvbHZlRXZlbnRUZW5hbnQoaWQpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cblxuICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkZyb250ZW5kIG1vZGVsIHdlYnNvY2tldCBldmVudCB0ZW5hbnQgcmVzb2x1dGlvblwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTWlycm9yIHRoZSBzdWJzY3JpYmUtdGltZSB0ZW5hbnQgcmVzb2x1dGlvbiAoYFdlYnNvY2tldFNlc3Npb24uX3Jlc29sdmVUZW5hbnRgKTpcbiAgICAgIC8vIHBhc3MgYHN1YnNjcmlwdGlvbjoge2NoYW5uZWwsIHBhcmFtc31gIHNvIHJlc29sdmVycyB0aGF0IGRlcml2ZSBzY29wZSBmcm9tIHRoZVxuICAgICAgLy8gc3Vic2NyaXB0aW9uIGJlaGF2ZSB0aGUgc2FtZSBmb3IgYnJvYWRjYXN0cyBhcyB0aGV5IGRpZCBhdCBgY2hhbm5lbC1zdWJzY3JpYmVgLlxuICAgICAgLy8gVGhlIHN5bnRoZXRpYyByZXF1ZXN0IGZvcndhcmRzIHRoZSBzdWJzY3JpYmVyJ3MgcGFyYW1zIChlLmcuIGF1dGhlbnRpY2F0aW9uVG9rZW4pLFxuICAgICAgLy8gbWF0Y2hpbmcgdGhpcyBjaGFubmVsJ3MgYWJpbGl0eSByZXNvbHV0aW9uIGFib3ZlLlxuICAgICAgcmV0dXJuIGF3YWl0IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICAgIHBhcmFtczogey4uLnRoaXMucGFyYW1zLCBpZCwgbW9kZWw6IHRoaXMuX21vZGVsTmFtZSgpfSxcbiAgICAgICAgcmVxdWVzdDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5fc3ludGhldGljUmVxdWVzdCgpKSxcbiAgICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbn0pLFxuICAgICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsOiBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FLCBwYXJhbXM6IHRoaXMucGFyYW1zfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzdWJzY3JpYmVyJ3MgdGVuYW50IGZvciB0aGUgYnJvYWRjYXN0IHJlY29yZCBhbmQgcnVucyBgY2FsbGJhY2tgIGluc2lkZSB0aGF0IHRlbmFudFxuICAgKiBjb250ZXh0LiBCcm9hZGNhc3QgZGVsaXZlcnkgcnVucyBpbiB3aGF0ZXZlciBhbWJpZW50IHRlbmFudCBjb250ZXh0IHRoZSBwdWJsaXNoZXIgbGVmdCBiZWhpbmQuIEZvclxuICAgKiBtdWx0aS10ZW5hbnQgcmVjb3JkcyB0aGF0IGFtYmllbnQgdGVuYW50IG1heSBoYXZlIGJlZW4gcmVzb2x2ZWQgd2l0aG91dCB0aGUgc3Vic2NyaWJlcidzIHJlcXVlc3RcbiAgICogKGUuZy4gYSByZWxheSBlbmRwb2ludCBvciBiYWNrZ3JvdW5kIGpvYiBtdXRhdGluZyB0aGUgcm93KSwgc28gaXQgbGFja3MgdGhlIHN1YnNjcmliZXIncyBwZXItcmVjb3JkXG4gICAqIGFjY2VzcyBmbGFncyBhbmQgdGhlIHBlci1ldmVudCBhdXRob3JpemF0aW9uIHF1ZXJ5IHdyb25nbHkgZmluZHMgbm90aGluZy4gUmUtcmVzb2x2aW5nIHRoZSB0ZW5hbnRcbiAgICogZnJvbSB0aGUgZXZlbnQgcmVjb3JkIGlkIHBsdXMgdGhlIHN1YnNjcmliZXIncyByZXF1ZXN0IG1ha2VzIHRoZSBhdXRob3JpemF0aW9uIHF1ZXJpZXMgcnVuIGFnYWluc3RcbiAgICogdGhlIHN1YnNjcmliZXIncyBvd24gdGVuYW50L2FiaWxpdHkgc2NvcGUuIFdoZW4gbm8gdGVuYW50IHJlc29sdmVzIChub24tbXVsdGl0ZW5hbnQgY29uZmlncyksIHRoZVxuICAgKiBjYWxsYmFjayBydW5zIGRpcmVjdGx5IHNvIHRoZSBhbWJpZW50IGNvbnRleHQgaXMgcHJlc2VydmVkLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBBdXRob3JpemVkLXF1ZXJ5IGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfd2l0aEV2ZW50VGVuYW50KGlkLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uIHx8IHR5cGVvZiBjb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlRXZlbnRUZW5hbnQoaWQpXG5cbiAgICAvLyBBbHdheXMgZW50ZXIgYHJ1bldpdGhUZW5hbnRgLCBldmVuIHdoZW4gbm8gdGVuYW50IHJlc29sdmVkLiBCcm9hZGNhc3QgZmFuLW91dFxuICAgIC8vIHJ1bnMgaW4gdGhlIHB1Ymxpc2hlcidzIGFtYmllbnQgdGVuYW50IGNvbnRleHQ7IGZhbGxpbmcgYmFjayB0byBgY2FsbGJhY2soKWBcbiAgICAvLyB0aGVyZSB3b3VsZCBhdXRob3JpemUgYSBjcm9zcy10ZW5hbnQgcmVjb3JkIGFnYWluc3QgdGhlIHB1Ymxpc2hlcidzIHRlbmFudCBhbmRcbiAgICAvLyBjb3VsZCBsZWFrIGl0IHRvIGEgc3Vic2NyaWJlciB3aG9zZSBvd24gcmVzb2x2ZXIgY291bGQgbm90IHJlc29sdmUgaXQuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkZyb250ZW5kIG1vZGVsIHdlYnNvY2tldCBldmVudCB0ZW5hbnRcIn0sIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnJvYWRjYXN0IHJlY29yZCBpcyB3aXRoaW4gdGhlIHN1YnNjcmliZXIncyBhdXRoZW50aWNhdGVkIGFiaWxpdHkgc2NvcGUuIFVzZWQgdG8gZ2F0ZVxuICAgKiB1bmZpbHRlcmVkL3VucHJvamVjdGVkIGNyZWF0ZS91cGRhdGUgZGVsaXZlcnkgc28gYSBzY29wZWQgdG9rZW4gbmV2ZXIgcmVjZWl2ZXMgYSByZWNvcmQgaXQgY2Fubm90IHJlYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBUcnVlIHdoZW4gdGhlIHJlY29yZCBpcyByZWFkYWJsZSBieSB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGFzeW5jIF9ldmVudElzQWNjZXNzaWJsZShpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICBjb25zdCBxdWVyeSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEF1dGhvcml6ZWRRdWVyeShcImZpbmRcIikud2hlcmUoe1tNb2RlbENsYXNzLnRhYmxlTmFtZSgpXToge1twcmltYXJ5S2V5XTogaWR9fSlcblxuICAgICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2hlZCBldmVudCBmaWx0ZXIga2V5cyBmb3IgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBFdmVudCBmaWx0ZXIga2V5cyBtYXRjaGVkIGJ5IHRoZSByZWNvcmQuXG4gICAqL1xuICBhc3luYyBfbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c0ZvckV2ZW50SWQoaWQsIEZyb250ZW5kTW9kZWxDb250cm9sbGVyKSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2hlZCBldmVudCBmaWx0ZXIga2V5cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50RmlsdGVyIG9mIHRoaXMuX2V2ZW50RmlsdGVycygpKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gYXdhaXQgdGhpcy5fZXZlbnRNYXRjaGVzRmlsdGVyKHtcbiAgICAgICAgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgIGV2ZW50RmlsdGVyLFxuICAgICAgICBpZFxuICAgICAgfSlcblxuICAgICAgaWYgKG1hdGNoZXMpIG1hdGNoZWRFdmVudEZpbHRlcktleXMucHVzaChldmVudEZpbHRlci5rZXkpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRFdmVudEZpbHRlcktleXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV2ZW50IG1hdGNoZXMgZmlsdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZpbHRlciBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50RmlsdGVyUGF5bG9hZEVudHJ5fSBhcmdzLmV2ZW50RmlsdGVyIC0gRXZlbnQgZmlsdGVyIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhcmdzLmlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgcmVjb3JkIG1hdGNoZXMgdGhlIGZpbHRlci5cbiAgICovXG4gIGFzeW5jIF9ldmVudE1hdGNoZXNGaWx0ZXIoe0Zyb250ZW5kTW9kZWxDb250cm9sbGVyLCBldmVudEZpbHRlciwgaWR9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhFdmVudFRlbmFudChpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyLCB7XG4gICAgICAgIGpvaW5zOiBldmVudEZpbHRlci5qb2lucyxcbiAgICAgICAgc2VhcmNoZXM6IGV2ZW50RmlsdGVyLnNlYXJjaGVzLFxuICAgICAgICB3aGVyZTogZXZlbnRGaWx0ZXIud2hlcmVcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICBjb25zdCB3aGVyZSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFdoZXJlKClcbiAgICAgIGNvbnN0IGpvaW5zID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsSm9pbnMoKVxuICAgICAgLy8gU3RhcnQgZnJvbSB0aGUgc3Vic2NyaWJlcidzIGF1dGhvcml6ZWQgc2NvcGUgc28gYSBmaWx0ZXIgY2FuIG9ubHkgZXZlciBtYXRjaCByZWNvcmRzIHRoZVxuICAgICAgLy8gc3Vic2NyaXB0aW9uJ3MgYWJpbGl0eSBwZXJtaXRzIHRvIHJlYWQuXG4gICAgICBsZXQgcXVlcnkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJmaW5kXCIpLndoZXJlKHtbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IHtbcHJpbWFyeUtleV06IGlkfX0pXG5cbiAgICAgIGlmICh3aGVyZSkgY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxXaGVyZSh7cXVlcnksIHdoZXJlfSlcbiAgICAgIGlmIChqb2lucykgY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxKb2lucyh7am9pbnMsIHF1ZXJ5fSlcblxuICAgICAgZm9yIChjb25zdCBzZWFyY2ggb2YgY29udHJvbGxlci5mcm9udGVuZE1vZGVsU2VhcmNoZXMoKSkge1xuICAgICAgICBjb250cm9sbGVyLmFwcGx5RnJvbnRlbmRNb2RlbFNlYXJjaCh7cXVlcnksIHNlYXJjaH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHF1ZXJ5LmZpcnN0KCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByb2plY3RlZCByZWNvcmQgZm9yIGV2ZW50IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBudWxsPn0gLSBTZXJpYWxpemVkIHByb2plY3RlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBfcHJvamVjdGVkUmVjb3JkRm9yRXZlbnRJZChpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgICAvLyBSZWxvYWQgdGhyb3VnaCB0aGUgc3Vic2NyaWJlcidzIGF1dGhvcml6ZWQgc2NvcGUgc28gcHJvamVjdGVkIHJlY29yZHMgYXJlIG9ubHkgZXZlciBzZW50IGZvclxuICAgICAgLy8gcm93cyB0aGUgc3Vic2NyaXB0aW9uJ3MgYWJpbGl0eSBwZXJtaXRzIHRvIHJlYWQuXG4gICAgICBsZXQgcXVlcnkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJmaW5kXCIpLndoZXJlKHtbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IHtbcHJpbWFyeUtleV06IGlkfX0pXG4gICAgICBjb25zdCBwcmVsb2FkID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsUHJlbG9hZCgpXG5cbiAgICAgIGlmIChwcmVsb2FkKSBxdWVyeSA9IHF1ZXJ5LnByZWxvYWQocHJlbG9hZClcblxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxXaXRoQ291bnQoKSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlYy5cbiAgICAgICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0+fSAqL1xuICAgICAgICBjb25zdCBzcGVjID0ge31cblxuICAgICAgICBzcGVjW2VudHJ5LmF0dHJpYnV0ZU5hbWVdID0ge1xuICAgICAgICAgIHJlbGF0aW9uc2hpcDogZW50cnkucmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgICB3aGVyZTogZW50cnkud2hlcmUgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGVudHJ5LndoZXJlKSA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5LndpdGhDb3VudChzcGVjKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeURhdGEgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxRdWVyeURhdGEoKVxuXG4gICAgICBpZiAocXVlcnlEYXRhICE9PSBudWxsKSBxdWVyeS5xdWVyeURhdGEocXVlcnlEYXRhKVxuXG4gICAgICBxdWVyeSA9IGNvbnRyb2xsZXIuYXBwbHlGcm9udGVuZE1vZGVsVHJhbnNsYXRlZEF0dHJpYnV0ZVByZWxvYWRzKHtxdWVyeX0pXG5cbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcXVlcnkuZmlyc3QoKVxuXG4gICAgICBpZiAoIW1vZGVsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodGhpcy5wYXJhbXMuYWJpbGl0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXdhaXQgY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ29tcHV0ZUFiaWxpdGllcyhbbW9kZWxdKVxuICAgICAgfVxuXG4gICAgICBjb250cm9sbGVyLl9mcm9udGVuZE1vZGVsQWJpbGl0eU92ZXJyaWRlID0gdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuc2VyaWFsaXplKG1vZGVsLCBcImZpbmRcIilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltYWwgUmVxdWVzdC1saWtlIHN0dWIgdXNlZCBvbmx5IGZvciBhYmlsaXR5IHJlc29sdXRpb24uIEF2b2lkc1xuICAgKiBpbXBvcnRpbmcgYFdlYnNvY2tldFJlcXVlc3RgIGhlcmUgYmVjYXVzZSBpdHMgYG5vZGU6cXVlcnlzdHJpbmdgXG4gICAqIGRlcGVuZGVuY3kgd291bGQgcHVsbCBzZXJ2ZXItb25seSBjb2RlIGludG8gYnJvd3NlciBidW5kbGVzIHZpYVxuICAgKiB0aGUgYGNvbmZpZ3VyYXRpb24g4oaSIGxvZ2dlciDihpIgd2Vic29ja2V0LXB1Ymxpc2hlcnNgIGltcG9ydCBjaGFpbi5cbiAgICogSGVhZGVyIG5hbWVzIGFyZSBub3JtYWxpemVkIHRvIGxvd2VyY2FzZSBzbyBgaGVhZGVyKFwiY29va2llXCIpYFxuICAgKiBmaW5kcyBhIHZhbHVlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXBncmFkZS1yZXF1ZXN0IGhlYWRlcnNcbiAgICogbWFwIHVzZXMgYFwiQ29va2llXCJgIG9yIGBcImNvb2tpZVwiYC4gU2Vzc2lvbiBtZXRhZGF0YSBzdGF5cyBzZXBhcmF0ZVxuICAgKiBmcm9tIGhlYWRlcnMgYW5kIGlzIGV4cG9zZWQgdGhyb3VnaCBgbWV0YWRhdGEoLi4uKWAgZm9yIGFiaWxpdHlcbiAgICogcmVzb2x2ZXJzIHRoYXQgbmVlZCB3ZWJzb2NrZXQtZGVsaXZlcmVkIHNlc3Npb24gZGF0YS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxXZWJzb2NrZXRTeW50aGV0aWNSZXF1ZXN0fSBSZXF1ZXN0LWxpa2Ugb2JqZWN0IGZvciBhYmlsaXR5IHJlc29sdXRpb24uXG4gICAqL1xuICBfc3ludGhldGljUmVxdWVzdCgpIHtcbiAgICBjb25zdCB1cGdyYWRlUmVxdWVzdCA9IC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFdlYnNvY2tldFVwZ3JhZGVSZXF1ZXN0fSAqLyAodGhpcy5zZXNzaW9uLnVwZ3JhZGVSZXF1ZXN0KVxuICAgIGNvbnN0IHJhd0hlYWRlcnMgPSB0eXBlb2YgdXBncmFkZVJlcXVlc3Q/LmhlYWRlcnMgPT09IFwiZnVuY3Rpb25cIiA/IHVwZ3JhZGVSZXF1ZXN0LmhlYWRlcnMoKSA6IHt9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0eXBlb2YgdGhpcy5zZXNzaW9uLmdldE1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLnNlc3Npb24uZ2V0TWV0YWRhdGEoKSA6IHt9XG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHR5cGVvZiB1cGdyYWRlUmVxdWVzdD8ucmVtb3RlQWRkcmVzcyA9PT0gXCJmdW5jdGlvblwiID8gdXBncmFkZVJlcXVlc3QucmVtb3RlQWRkcmVzcygpIDogdW5kZWZpbmVkXG4gICAgLyoqXG4gICAgICogSGVhZGVyIG1hcC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+fSAqL1xuICAgIGNvbnN0IGhlYWRlck1hcCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyYXdIZWFkZXJzIHx8IHt9KSkge1xuICAgICAgaGVhZGVyTWFwW2tleS50b0xvd2VyQ2FzZSgpXSA9IHJhd0hlYWRlcnNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXJzOiAoKSA9PiBoZWFkZXJNYXAsXG4gICAgICBoZWFkZXI6IChuYW1lKSA9PiBoZWFkZXJNYXBbU3RyaW5nKG5hbWUpLnRvTG93ZXJDYXNlKCldLFxuICAgICAgbWV0YWRhdGE6IChrZXkpID0+IGtleSA9PT0gdW5kZWZpbmVkID8gey4uLm1ldGFkYXRhfSA6IG1ldGFkYXRhW2tleV0sXG4gICAgICBwYXRoOiAoKSA9PiBcIi9mcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIGh0dHBNZXRob2Q6ICgpID0+IFwiUE9TVFwiLFxuICAgICAgcmVtb3RlQWRkcmVzczogKCkgPT4gcmVtb3RlQWRkcmVzcyxcbiAgICAgIG9yaWdpbjogKCkgPT4gaGVhZGVyTWFwLm9yaWdpblxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAqDA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAqDA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,yBAkKC;IAjKC,gFAAyC;IAmK3C;;;;;OAKG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAsB9D;IAED;;;;;OAKG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACH,wDALG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,cAFa,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACH,mBAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,yDAJG;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,uBAHW,IAAI,GACF,MAAM,CAsBlB;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,OAAC,CA6Bb;CACF;mBA1gBkB,cAAc"}
|
|
@@ -177,12 +177,14 @@ export default class VelociousRoutesResolver {
|
|
|
177
177
|
this._setCompletedLogMetadata({ controllerClass, logMethod });
|
|
178
178
|
await this._logActionStart({ action, controllerClass, logMethod });
|
|
179
179
|
try {
|
|
180
|
-
const tenant = skipTenantResolution
|
|
180
|
+
const tenant = skipTenantResolution || !this.configuration.getTenantResolver()
|
|
181
181
|
? undefined
|
|
182
|
-
: await this.configuration.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
182
|
+
: await this.configuration.ensureConnections({ name: `${controllerClass.name}.${action} tenant resolution` }, async () => {
|
|
183
|
+
return await this.configuration.resolveTenant({
|
|
184
|
+
params: { ...this.queryParameters(), ...this.params },
|
|
185
|
+
request: this.request,
|
|
186
|
+
response: this.response
|
|
187
|
+
});
|
|
186
188
|
});
|
|
187
189
|
const runAction = async () => {
|
|
188
190
|
await this.configuration.runWithTenant(tenant, async () => {
|
|
@@ -453,4 +455,4 @@ export default class VelociousRoutesResolver {
|
|
|
453
455
|
return value;
|
|
454
456
|
}
|
|
455
457
|
}
|
|
456
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLHNEQUFzRCxDQUFBO0FBQy9FLE9BQU8saUJBQWlCLE1BQU0saUNBQWlDLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsK0JBQStCLENBQUMsS0FBSztJQUM1QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO0lBRTdGLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxx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QUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDbkIsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2Qzs7MkNBRStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUVqQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIFJhdyBhY3Rpb24gbmFtZSBmcm9tIHJvdXRlIHBhcmFtcyBvciByb3V0ZSBob29rLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGNvbnRyb2xsZXIgbWV0aG9kIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG59XG5cbi8qKlxuICogUnVucyBtaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBlcnJvci5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gSW1wb3J0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBNaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBhbiBFUlJfTU9EVUxFX05PVF9GT1VORCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVycm9yKSB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF0gfHwgXCJcIlxuICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvXkNhbm5vdCBmaW5kICg/Om1vZHVsZXxwYWNrYWdlKSBbJ1wiXSguKz8pWydcIl0gaW1wb3J0ZWQgZnJvbSAvKVxuXG4gIHJldHVybiBtYXRjaD8uWzFdXG59XG5cbi8qKlxuICogUnVucyBpcyBtaXNzaW5nIHRhcmdldCBtb2R1bGUgZXJyb3IuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRQYXRoIC0gVGFyZ2V0IGNvbnRyb2xsZXIgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldEltcG9ydFNwZWNpZmllciAtIFRhcmdldCBjb250cm9sbGVyIGltcG9ydCBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIG1pc3NpbmcgbW9kdWxlIGlzIHRoZSB0YXJnZXQgY29udHJvbGxlciBmaWxlLlxuICovXG5mdW5jdGlvbiBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7ZXJyb3IsIHRhcmdldFBhdGgsIHRhcmdldEltcG9ydFNwZWNpZmllcn0pIHtcbiAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gIGNvbnN0IGlzTW9kdWxlTm90Rm91bmRFcnJvciA9IFwiY29kZVwiIGluIGVuc3VyZWRFcnJvciAmJiBlbnN1cmVkRXJyb3IuY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiXG5cbiAgaWYgKCFpc01vZHVsZU5vdEZvdW5kRXJyb3IpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1pc3NpbmdTcGVjaWZpZXIgPSBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVuc3VyZWRFcnJvcilcblxuICBpZiAoIW1pc3NpbmdTcGVjaWZpZXIpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRQYXRoIHx8IG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldEltcG9ydFNwZWNpZmllclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBGbGF0IHF1ZXJ5IHBhcmFtcyBmb3IgdGVuYW50L2FiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIHF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucmVxdWVzdC5wYXRoKCkuc3BsaXQoXCI/XCIpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4ge31cblxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZSgpIHtcbiAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCBjdXJyZW50Um91dGUgPSBjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGVcbiAgICBjb25zdCByYXdQYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGgoKVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcmF3UGF0aC5zcGxpdChcIj9cIilbMF1cbiAgICBsZXQgdmlld1BhdGhcblxuICAgIGNvbnN0IHByZUNoZWNrUGFyYW1zID0gey4uLnRoaXMucGFyYW1zfVxuICAgIGNvbnN0IGhhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBjdXJyZW50Um91dGUgPyAhIXRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKSA6IGZhbHNlXG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBwcmVDaGVja1BhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPSBhd2FpdCB0aGlzLnJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSlcbiAgICBsZXQgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPT09IHRydWVcbiAgICBsZXQgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcEFiaWxpdHlSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgbGV0IHNraXBUZW5hbnRSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcFRlbmFudFJlc29sdXRpb24gPT09IHRydWVcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggfHwgIWN1cnJlbnRSb3V0ZSA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlckNsYXNzXG4gICAgICBsZXQgcm91dGVIb29rQ29udHJvbGxlclBhdGhcbiAgICAgIGxldCByb3V0ZUhvb2tWaWV3UGF0aFxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rQ29udHJvbGxlclBhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tWaWV3UGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGhcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uTmFtZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbilcbiAgICAgIHRoaXMucGFyYW1zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgICB0aGlzLnBhcmFtcy5hY3Rpb24gPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvblxuICAgICAgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSByb3V0ZUhvb2tWaWV3UGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rQ29udHJvbGxlckNsYXNzXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICBjb25zdCBhdHRlbXB0ZWRDb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke3JlcXVlc3RlZFBhdGh9L2NvbnRyb2xsZXIuanNgXG5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgIGlmICghbG9nZ2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2dnZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gXCIuL2J1aWx0LWluL2Vycm9ycy9jb250cm9sbGVyLmpzXCJcbiAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHRydWVcbiAgICAgIHNraXBUZW5hbnRSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5fbG9nTWV0aG9kKClcblxuICAgIHRoaXMuX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHNraXBUZW5hbnRSZXNvbHV0aW9uXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICAgICAgcGFyYW1zOiB7Li4udGhpcy5xdWVyeVBhcmFtZXRlcnMoKSwgLi4udGhpcy5wYXJhbXN9LFxuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICB9KVxuXG4gICAgICBjb25zdCBydW5BY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJ1bkNvbnRyb2xsZXJBY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhYmlsaXR5ID0gc2tpcEFiaWxpdHlSZXNvbHV0aW9uXG4gICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgIDogYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgICAgICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21lYXN1cmVDb250cm9sbGVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sbGVySW5zdGFuY2UuX3J1bkJlZm9yZUNhbGxiYWNrcygpXG4gICAgICAgICAgICAgICAgYXdhaXQgYWN0aW9uSGFuZGxlcnNbYWN0aW9uXSgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5Db250cm9sbGVyQWN0aW9uKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0uJHthY3Rpb259YH0sIHJ1bkNvbnRyb2xsZXJBY3Rpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhcm91bmRBY3Rpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0QXJvdW5kQWN0aW9uPy4oKVxuXG4gICAgICBpZiAoYXJvdW5kQWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IGFyb3VuZEFjdGlvbih7cmVxdWVzdDogdGhpcy5yZXF1ZXN0LCByZXNwb25zZTogdGhpcy5yZXNwb25zZSwgbmV4dDogcnVuQWN0aW9ufSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHJ1bkFjdGlvbigpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVuc3VyZWRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yKVxuICAgICAgY29uc3QgZXJyb3JDb250ZXh0ID0ge1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgIGh0dHBNZXRob2Q6IHRoaXMucmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICAgIHBhdGg6IHRoaXMucmVxdWVzdC5wYXRoKCksXG4gICAgICAgIHN0YWdlOiBcImNvbnRyb2xsZXItYWN0aW9uXCJcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JXaXRoQ29udGV4dCA9IC8qKiBAdHlwZSB7e3ZlbG9jaW91c0NvbnRleHQ/OiBvYmplY3R9fSAqLyAoZW5zdXJlZEVycm9yKVxuXG4gICAgICBlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgPSB7XG4gICAgICAgIC4uLihlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgfHwge30pLFxuICAgICAgICBjb250cm9sbGVyQWN0aW9uOiBlcnJvckNvbnRleHRcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZW5zdXJlZEVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbnRyb2xsZXJQYXRoIC0gQ29udHJvbGxlciBpbXBvcnQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gVGhlIHJlc29sdmVkIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJvbGxlckNsYXNzKHtjb250cm9sbGVyUGF0aH0pIHtcbiAgICBjb25zdCBjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyID0gdG9JbXBvcnRTcGVjaWZpZXIoY29udHJvbGxlclBhdGgpXG5cbiAgICBpZiAoIXRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAoKGF3YWl0IGltcG9ydChjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyKSkuZGVmYXVsdClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IgPSBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7XG4gICAgICAgIGVycm9yOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIHRhcmdldEltcG9ydFNwZWNpZmllcjogY29udHJvbGxlckltcG9ydFNwZWNpZmllcixcbiAgICAgICAgdGFyZ2V0UGF0aDogY29udHJvbGxlclBhdGhcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaXNNaXNzaW5nQ29udHJvbGxlckZpbGVFcnJvcikgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBtYXRjaCBwYXRoIHdpdGggcm91dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS1yb3V0ZS5qc1wiKS5kZWZhdWx0fSByb3V0ZSAtIFJvdXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEByZXR1cm5zIHt7cmVzdFBhdGg6IHN0cmluZ30gfCB1bmRlZmluZWR9IC0gUkVTVCBwYXRoIG1ldGFkYXRhIGZvciB0aGlzIHJvdXRlLlxuICAgKi9cbiAgbWF0Y2hQYXRoV2l0aFJvdXRlcyhyb3V0ZSwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhXaXRob3V0U2xhc2ggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKS5zcGxpdChcIj9cIilbMF1cblxuICAgIGZvciAoY29uc3Qgc3ViUm91dGUgb2Ygcm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBwYXJhbXNTbmFwc2hvdCA9IHsuLi50aGlzLnBhcmFtc31cbiAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3ViUm91dGUubWF0Y2hXaXRoUGF0aCh7XG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHBhdGg6IHBhdGhXaXRob3V0U2xhc2gsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdFxuICAgICAgfSlcblxuICAgICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtc1NuYXBzaG90XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtyZXN0UGF0aH0gPSBtYXRjaFJlc3VsdFxuXG4gICAgICBpZiAocmVzdFBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVjdXJzaXZlTWF0Y2ggPSB0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoc3ViUm91dGUsIHJlc3RQYXRoKVxuXG4gICAgICAgIGlmIChyZWN1cnNpdmVNYXRjaCkge1xuICAgICAgICAgIHJldHVybiByZWN1cnNpdmVNYXRjaFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2hSZXN1bHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvbHZlIHJvdXRlIHJlc29sdmVyIGhvb2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudFBhdGggLSBSZXF1ZXN0IHBhdGggd2l0aG91dCBxdWVyeSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gUmVzb2x2ZXIgaG9vayBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmhhc01hdGNoaW5nQ3VzdG9tUm91dGVdIC0gVHJ1ZSB3aGVuIHRoZSBwYXRoIG1hdGNoZWQgYW4gZXhwbGljaXQgY3VzdG9tIHJvdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gTWF0Y2hlZCBhY3Rpb24vY29udHJvbGxlciBmcm9tIGhvb2tzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXJyZW50UGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge2hhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBmYWxzZX0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBob29rcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRSb3V0ZVJlc29sdmVySG9va3M/LigpIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBjdXJyZW50UGF0aCxcbiAgICAgICAgaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSxcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNvbHZlcjogdGhpcyxcbiAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaG9va1Jlc3VsdCkgY29udGludWVcblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBhY3Rpb24gdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmFjdGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlciAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmNvbnRyb2xsZXIubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlciB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlcn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMgJiYgdHlwZW9mIGhvb2tSZXN1bHQucGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBwYXJhbXMgdG8gYmUgYW4gb2JqZWN0LCBnb3Q6ICR7aG9va1Jlc3VsdC5wYXJhbXN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXJDbGFzcyB0byBiZSBhIGNsYXNzL2Z1bmN0aW9uIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzc31gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyUGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgdG8gYmUgYSBib29sZWFuIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9uICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgc2tpcEFiaWxpdHlSZXNvbHV0aW9uIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQWJpbGl0eVJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5za2lwVGVuYW50UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBUZW5hbnRSZXNvbHV0aW9uIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwVGVuYW50UmVzb2x1dGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnZpZXdQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayB2aWV3UGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC52aWV3UGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgaG9va1Jlc3VsdC5wYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBob29rUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBhY3Rpb24gc3RhcnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmFjdGlvbiAtIEFjdGlvbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9sb2dBY3Rpb25TdGFydCh7YWN0aW9uLCBjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5fZm9ybWF0VGltZXN0YW1wKG5ldyBEYXRlKCkpXG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHJlcXVlc3QucmVtb3RlQWRkcmVzcygpIHx8IFwidW5rbm93blwiXG4gICAgY29uc3QgbG9nZ2VkUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh0aGlzLnBhcmFtcykpXG5cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmFjdGlvblxuICAgIGRlbGV0ZSBsb2dnZWRQYXJhbXMuY29udHJvbGxlclxuXG4gICAgY29uc3QgY29udHJvbGxlckxvZ2dlciA9IG5ldyBMb2dnZXIoY29udHJvbGxlckNsYXNzLm5hbWUsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgYXdhaXQgY29udHJvbGxlckxvZ2dlcltsb2dNZXRob2RdKCgpID0+IGBTdGFydGVkICR7cmVxdWVzdC5odHRwTWV0aG9kKCl9IFwiJHtyZXF1ZXN0LnBhdGgoKX1cIiBmb3IgJHtyZW1vdGVBZGRyZXNzfSBhdCAke3RpbWVzdGFtcH1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgUHJvY2Vzc2luZyBieSAke2NvbnRyb2xsZXJDbGFzcy5uYW1lfSMke2FjdGlvbn1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBbYCAgUGFyYW1ldGVyczpgLCBsb2dnZWRQYXJhbXNdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9nIG1ldGhvZC5cbiAgICogQHJldHVybnMge1wiZGVidWdcIiB8IFwiaW5mb1wifSAtIFJlcXVlc3QgbG9nIG1ldGhvZC5cbiAgICovXG4gIF9sb2dNZXRob2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcInRlc3RcIiA/IFwiZGVidWdcIiA6IFwiaW5mb1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtZWFzdXJlIGNvbnRyb2xsZXIuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBtZWFzdXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfbWVhc3VyZUNvbnRyb2xsZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIHJldHVybiByZXF1ZXN0VGltaW5nXG4gICAgICA/IGF3YWl0IHJlcXVlc3RUaW1pbmcubWVhc3VyZShcImNvbnRyb2xsZXJcIiwgY2FsbGJhY2spXG4gICAgICA6IGF3YWl0IGNhbGxiYWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBjb21wbGV0ZWQgbG9nIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29udHJvbGxlckNsYXNzIC0gQ29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtcImRlYnVnXCIgfCBcImluZm9cIn0gYXJncy5sb2dNZXRob2QgLSBMb2dnZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2V0Q29tcGxldGVkTG9nTWV0YWRhdGEoe2NvbnRyb2xsZXJDbGFzcywgbG9nTWV0aG9kfSkge1xuICAgIGNvbnN0IHJlcXVlc3RUaW1pbmcgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q3VycmVudFJlcXVlc3RUaW1pbmcoKVxuXG4gICAgaWYgKCFyZXF1ZXN0VGltaW5nKSByZXR1cm5cblxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nU3ViamVjdCA9IGNvbnRyb2xsZXJDbGFzcy5uYW1lXG4gICAgcmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dNZXRob2QgPSBsb2dNZXRob2RcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdCB0aW1lc3RhbXAuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHRpbWVzdGFtcC5cbiAgICovXG4gIF9mb3JtYXRUaW1lc3RhbXAoZGF0ZSkge1xuICAgIC8qKlxuICAgICAqIFBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtIC0gTnVtLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhZC5cbiAgICAgKi9cbiAgICBjb25zdCBwYWQgPSAobnVtKSA9PiBTdHJpbmcobnVtKS5wYWRTdGFydCgyLCBcIjBcIilcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgY29uc3QgbW9udGggPSBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICAgIGNvbnN0IG1pbnV0ZXMgPSBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpXG4gICAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXG4gICAgY29uc3Qgb2Zmc2V0U2lnbiA9IG9mZnNldE1pbnV0ZXMgPiAwID8gXCItXCIgOiBcIitcIlxuICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpXG4gICAgY29uc3Qgb2Zmc2V0SG91cnMgPSBwYWQoTWF0aC5mbG9vcihvZmZzZXRUb3RhbE1pbnV0ZXMgLyA2MCkpXG4gICAgY29uc3Qgb2Zmc2V0UmVtYWluaW5nTWludXRlcyA9IHBhZChvZmZzZXRUb3RhbE1pbnV0ZXMgJSA2MClcblxuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9ICR7b2Zmc2V0U2lnbn0ke29mZnNldEhvdXJzfSR7b2Zmc2V0UmVtYWluaW5nTWludXRlc31gXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHs/fSAtIFRoZSBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqL1xuICBfc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVXBsb2FkZWRGaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGZpbGVuYW1lOiB2YWx1ZS5maWxlbmFtZSgpLFxuICAgICAgICBzaXplOiB2YWx1ZS5zaXplKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyhpdGVtKSlcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc3VsdC5cbiAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZVtrZXldKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiJdfQ==
|
|
458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLHNEQUFzRCxDQUFBO0FBQy9FLE9BQU8saUJBQWlCLE1BQU0saUNBQWlDLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsK0JBQStCLENBQUMsS0FBSztJQUM1QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO0lBRTdGLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxx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QUFJLFVBQVUsR0FBRyxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQTtJQUN0SCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHlCQUF5QixDQUFDLEtBQUs7UUFDN0IsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFLENBQUM7WUFDbEMsT0FBTztnQkFDTCxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJO2dCQUNqQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDbkIsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2Qzs7MkNBRStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUVqQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIFJhdyBhY3Rpb24gbmFtZSBmcm9tIHJvdXRlIHBhcmFtcyBvciByb3V0ZSBob29rLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGNvbnRyb2xsZXIgbWV0aG9kIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG59XG5cbi8qKlxuICogUnVucyBtaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBlcnJvci5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gSW1wb3J0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBNaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBhbiBFUlJfTU9EVUxFX05PVF9GT1VORCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVycm9yKSB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF0gfHwgXCJcIlxuICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvXkNhbm5vdCBmaW5kICg/Om1vZHVsZXxwYWNrYWdlKSBbJ1wiXSguKz8pWydcIl0gaW1wb3J0ZWQgZnJvbSAvKVxuXG4gIHJldHVybiBtYXRjaD8uWzFdXG59XG5cbi8qKlxuICogUnVucyBpcyBtaXNzaW5nIHRhcmdldCBtb2R1bGUgZXJyb3IuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRQYXRoIC0gVGFyZ2V0IGNvbnRyb2xsZXIgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldEltcG9ydFNwZWNpZmllciAtIFRhcmdldCBjb250cm9sbGVyIGltcG9ydCBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIG1pc3NpbmcgbW9kdWxlIGlzIHRoZSB0YXJnZXQgY29udHJvbGxlciBmaWxlLlxuICovXG5mdW5jdGlvbiBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7ZXJyb3IsIHRhcmdldFBhdGgsIHRhcmdldEltcG9ydFNwZWNpZmllcn0pIHtcbiAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gIGNvbnN0IGlzTW9kdWxlTm90Rm91bmRFcnJvciA9IFwiY29kZVwiIGluIGVuc3VyZWRFcnJvciAmJiBlbnN1cmVkRXJyb3IuY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiXG5cbiAgaWYgKCFpc01vZHVsZU5vdEZvdW5kRXJyb3IpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1pc3NpbmdTcGVjaWZpZXIgPSBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVuc3VyZWRFcnJvcilcblxuICBpZiAoIW1pc3NpbmdTcGVjaWZpZXIpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRQYXRoIHx8IG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldEltcG9ydFNwZWNpZmllclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBGbGF0IHF1ZXJ5IHBhcmFtcyBmb3IgdGVuYW50L2FiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIHF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucmVxdWVzdC5wYXRoKCkuc3BsaXQoXCI/XCIpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4ge31cblxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZSgpIHtcbiAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCBjdXJyZW50Um91dGUgPSBjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGVcbiAgICBjb25zdCByYXdQYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGgoKVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcmF3UGF0aC5zcGxpdChcIj9cIilbMF1cbiAgICBsZXQgdmlld1BhdGhcblxuICAgIGNvbnN0IHByZUNoZWNrUGFyYW1zID0gey4uLnRoaXMucGFyYW1zfVxuICAgIGNvbnN0IGhhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBjdXJyZW50Um91dGUgPyAhIXRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKSA6IGZhbHNlXG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBwcmVDaGVja1BhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPSBhd2FpdCB0aGlzLnJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSlcbiAgICBsZXQgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPT09IHRydWVcbiAgICBsZXQgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcEFiaWxpdHlSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgbGV0IHNraXBUZW5hbnRSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcFRlbmFudFJlc29sdXRpb24gPT09IHRydWVcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggfHwgIWN1cnJlbnRSb3V0ZSA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlckNsYXNzXG4gICAgICBsZXQgcm91dGVIb29rQ29udHJvbGxlclBhdGhcbiAgICAgIGxldCByb3V0ZUhvb2tWaWV3UGF0aFxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rQ29udHJvbGxlclBhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tWaWV3UGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGhcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uTmFtZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbilcbiAgICAgIHRoaXMucGFyYW1zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgICB0aGlzLnBhcmFtcy5hY3Rpb24gPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvblxuICAgICAgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSByb3V0ZUhvb2tWaWV3UGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rQ29udHJvbGxlckNsYXNzXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICBjb25zdCBhdHRlbXB0ZWRDb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke3JlcXVlc3RlZFBhdGh9L2NvbnRyb2xsZXIuanNgXG5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgIGlmICghbG9nZ2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2dnZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gXCIuL2J1aWx0LWluL2Vycm9ycy9jb250cm9sbGVyLmpzXCJcbiAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHRydWVcbiAgICAgIHNraXBUZW5hbnRSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5fbG9nTWV0aG9kKClcblxuICAgIHRoaXMuX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHNraXBUZW5hbnRSZXNvbHV0aW9uIHx8ICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0VGVuYW50UmVzb2x2ZXIoKVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufSB0ZW5hbnQgcmVzb2x1dGlvbmB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICAgICAgICBwYXJhbXM6IHsuLi50aGlzLnF1ZXJ5UGFyYW1ldGVycygpLCAuLi50aGlzLnBhcmFtc30sXG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgY29uc3QgcnVuQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBydW5Db250cm9sbGVyQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWJpbGl0eSA9IHNraXBBYmlsaXR5UmVzb2x1dGlvblxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9tZWFzdXJlQ29udHJvbGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlLl9ydW5CZWZvcmVDYWxsYmFja3MoKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgcnVuQ29udHJvbGxlckFjdGlvbigpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufWB9LCBydW5Db250cm9sbGVyQWN0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJvdW5kQWN0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEFyb3VuZEFjdGlvbj8uKClcblxuICAgICAgaWYgKGFyb3VuZEFjdGlvbikge1xuICAgICAgICBhd2FpdCBhcm91bmRBY3Rpb24oe3JlcXVlc3Q6IHRoaXMucmVxdWVzdCwgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2UsIG5leHQ6IHJ1bkFjdGlvbn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBydW5BY3Rpb24oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb250cm9sbGVyUGF0aCAtIENvbnRyb2xsZXIgaW1wb3J0IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQ+fSAtIFRoZSByZXNvbHZlZCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KSB7XG4gICAgY29uc3QgY29udHJvbGxlckltcG9ydFNwZWNpZmllciA9IHRvSW1wb3J0U3BlY2lmaWVyKGNvbnRyb2xsZXJQYXRoKVxuXG4gICAgaWYgKCF0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcykge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICgoYXdhaXQgaW1wb3J0KGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIpKS5kZWZhdWx0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBpc01pc3NpbmdDb250cm9sbGVyRmlsZUVycm9yID0gaXNNaXNzaW5nVGFyZ2V0TW9kdWxlRXJyb3Ioe1xuICAgICAgICBlcnJvcjogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICB0YXJnZXRJbXBvcnRTcGVjaWZpZXI6IGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIsXG4gICAgICAgIHRhcmdldFBhdGg6IGNvbnRyb2xsZXJQYXRoXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IpIHRocm93IGVuc3VyZUVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2ggcGF0aCB3aXRoIHJvdXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSByb3V0ZSByZXNvbHZlciBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFJlc29sdmVyIGhvb2sgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiB0aGUgcGF0aCBtYXRjaGVkIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlID0gZmFsc2V9ID0gb3B0aW9uc1xuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVSZXNvbHZlckhvb2tzPy4oKSB8fCBbXVxuXG4gICAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9vayh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgIGhhc01hdGNoaW5nQ3VzdG9tUm91dGUsXG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgcmVzb2x2ZXI6IHRoaXMsXG4gICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWhvb2tSZXN1bHQpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5hY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5hY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgYWN0aW9uIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5hY3Rpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXIgIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5jb250cm9sbGVyLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXIgdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJ9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zICYmIHR5cGVvZiBob29rUmVzdWx0LnBhcmFtcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgcGFyYW1zIHRvIGJlIGFuIG9iamVjdCwgZ290OiAke2hvb2tSZXN1bHQucGFyYW1zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyQ2xhc3MgdG8gYmUgYSBjbGFzcy9mdW5jdGlvbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3N9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlclBhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlclBhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlclBhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBBYmlsaXR5UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBUZW5hbnRSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwVGVuYW50UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQudmlld1BhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgdmlld1BhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQudmlld1BhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIGhvb2tSZXN1bHQucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9va1Jlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2cgYWN0aW9uIHN0YXJ0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiZGVidWdcIiB8IFwiaW5mb1wifSBhcmdzLmxvZ01ldGhvZCAtIExvZ2dlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuX2Zvcm1hdFRpbWVzdGFtcChuZXcgRGF0ZSgpKVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKSB8fCBcInVua25vd25cIlxuICAgIGNvbnN0IGxvZ2dlZFBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodGhpcy5wYXJhbXMpKVxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtcImRlYnVnXCIgfCBcImluZm9cIn0gLSBSZXF1ZXN0IGxvZyBtZXRob2QuXG4gICAqL1xuICBfbG9nTWV0aG9kKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWVhc3VyZSBjb250cm9sbGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gbWVhc3VyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX21lYXN1cmVDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDdXJyZW50UmVxdWVzdFRpbWluZygpXG5cbiAgICByZXR1cm4gcmVxdWVzdFRpbWluZ1xuICAgICAgPyBhd2FpdCByZXF1ZXN0VGltaW5nLm1lYXN1cmUoXCJjb250cm9sbGVyXCIsIGNhbGxiYWNrKVxuICAgICAgOiBhd2FpdCBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29tcGxldGVkIGxvZyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIGlmICghcmVxdWVzdFRpbWluZykgcmV0dXJuXG5cbiAgICByZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgPSBjb250cm9sbGVyQ2xhc3MubmFtZVxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kID0gbG9nTWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBQYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bSAtIE51bS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkID0gKG51bSkgPT4gU3RyaW5nKG51bSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgY29uc3QgZGF5ID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgIGNvbnN0IHNlY29uZHMgPSBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgY29uc3Qgb2Zmc2V0TWludXRlcyA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgIGNvbnN0IG9mZnNldFNpZ24gPSBvZmZzZXRNaW51dGVzID4gMCA/IFwiLVwiIDogXCIrXCJcbiAgICBjb25zdCBvZmZzZXRUb3RhbE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKVxuICAgIGNvbnN0IG9mZnNldEhvdXJzID0gcGFkKE1hdGguZmxvb3Iob2Zmc2V0VG90YWxNaW51dGVzIC8gNjApKVxuICAgIGNvbnN0IG9mZnNldFJlbWFpbmluZ01pbnV0ZXMgPSBwYWQob2Zmc2V0VG90YWxNaW51dGVzICUgNjApXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfSAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldFJlbWFpbmluZ01pbnV0ZXN9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7P30gLSBUaGUgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKi9cbiAgX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogdmFsdWUuZmlsZW5hbWUoKSxcbiAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcoaXRlbSkpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXN1bHQuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
attempts="${TENSORBUZZ_RETRY_ATTEMPTS:-5}"
|
|
5
|
+
delay="${TENSORBUZZ_RETRY_DELAY:-5}"
|
|
6
|
+
|
|
7
|
+
for attempt in $(seq 1 "$attempts"); do
|
|
8
|
+
if "$@"; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
if [ "$attempt" -eq "$attempts" ]; then
|
|
13
|
+
break
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
echo "Command failed; retrying in ${delay}s (${attempt}/${attempts}): $*" >&2
|
|
17
|
+
sleep "$delay"
|
|
18
|
+
delay=$((delay * 2))
|
|
19
|
+
done
|
|
20
|
+
|
|
21
|
+
exec "$@"
|