@blokjs/trigger-worker 0.6.2 → 0.6.4
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/dist/WorkerTrigger.d.ts +0 -1
- package/dist/WorkerTrigger.js +16 -6
- package/package.json +4 -4
- package/src/WorkerTrigger.ts +16 -5
- package/template/package.json +6 -6
package/dist/WorkerTrigger.d.ts
CHANGED
|
@@ -159,7 +159,6 @@ export declare abstract class WorkerTrigger extends TriggerBase {
|
|
|
159
159
|
protected adapterPool: Map<string, WorkerAdapter>;
|
|
160
160
|
protected abstract nodes: Record<string, BlokService<unknown>>;
|
|
161
161
|
protected abstract workflows: Record<string, HelperResponse>;
|
|
162
|
-
constructor();
|
|
163
162
|
/**
|
|
164
163
|
* Load nodes into the node map
|
|
165
164
|
*/
|
package/dist/WorkerTrigger.js
CHANGED
|
@@ -59,11 +59,14 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
59
59
|
* its provider. Drained in `stop()`.
|
|
60
60
|
*/
|
|
61
61
|
adapterPool = new Map();
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
// Constructor removed in v0.6.3 — pre-fix it called `loadNodes()` +
|
|
63
|
+
// `loadWorkflows()`, but subclasses use class-field assignments for
|
|
64
|
+
// `nodes` / `workflows` (the canonical TypeScript pattern). Those
|
|
65
|
+
// fields run AFTER super(), so accessing `this.nodes` from the parent
|
|
66
|
+
// constructor read `undefined` and crashed with
|
|
67
|
+
// `TypeError: undefined is not an object (Object.keys(this.nodes))`.
|
|
68
|
+
// The registry init now happens at the start of `listen()`, after
|
|
69
|
+
// the subclass's fields are initialized.
|
|
67
70
|
/**
|
|
68
71
|
* Load nodes into the node map
|
|
69
72
|
*/
|
|
@@ -85,6 +88,13 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
85
88
|
*/
|
|
86
89
|
async listen() {
|
|
87
90
|
const startTime = this.startCounter();
|
|
91
|
+
// Populate the trigger's node + workflow registries from the
|
|
92
|
+
// subclass's `nodes` / `workflows` fields. v0.6.3 fix — pre-fix
|
|
93
|
+
// these calls lived in the constructor and crashed because class
|
|
94
|
+
// fields haven't run yet at super-constructor time. See the comment
|
|
95
|
+
// where the old constructor used to live for the full reason.
|
|
96
|
+
this.loadNodes();
|
|
97
|
+
this.loadWorkflows();
|
|
88
98
|
try {
|
|
89
99
|
// Tier 2 #6 follow-up · install the cross-process concurrency
|
|
90
100
|
// backend (NATS KV) when the operator opted in via
|
|
@@ -540,4 +550,4 @@ export class WorkerTrigger extends TriggerBase {
|
|
|
540
550
|
}
|
|
541
551
|
}
|
|
542
552
|
export default WorkerTrigger;
|
|
543
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFFTixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isc0JBQXNCLEVBRXRCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLEVBRVgsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBYSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBcUhsQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFnQixhQUFjLFNBQVEsV0FBVztJQUM1QyxPQUFPLEdBQWtCLEVBQW1CLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHlCQUF5QixFQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQ3RDLENBQUM7SUFDaUIsTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDaEQ7Ozs7Ozs7Ozs7O09BV0c7SUFDTyxPQUFPLENBQWlCO0lBRWxDLG9DQUFvQztJQUMxQixZQUFZLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEQ7Ozs7O09BS0c7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQ7UUFDQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxT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QUFDO2dCQUNwQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNoQixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZ0JBQWdCLENBQUMsT0FBZSxFQUFFLFNBQWtCO1FBQzdELE1BQU0sSUFBSSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsaUJBQWlCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxhQUFhO1FBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNEO0FBRUQsZUFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmtlclRyaWdnZXIgLSBCYWNrZ3JvdW5kIGpvYiBwcm9jZXNzaW5nIGZvciBCbG9rIHdvcmtmbG93c1xuICpcbiAqIEV4dGVuZHMgVHJpZ2dlckJhc2UgdG8gc3VwcG9ydCBsb25nLXJ1bm5pbmcgYmFja2dyb3VuZCBqb2JzOlxuICogLSBDb25jdXJyZW5jeSBjb250cm9scyAobWF4IE4gY29uY3VycmVudCBqb2JzKVxuICogLSBSZXRyeSBsb2dpYyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAqIC0gSm9iIHRpbWVvdXRzXG4gKiAtIEpvYiBwcmlvcml0eSBhbmQgZGVsYXkgc2NoZWR1bGluZ1xuICogLSBEZWFkIGxldHRlciBxdWV1ZSBzdXBwb3J0XG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2Vyc1xuICogMy4gbGlzdGVuKCkgLSBDb25uZWN0IHRvIGpvYiBiYWNrZW5kIGFuZCBzdGFydCBwcm9jZXNzaW5nXG4gKiA0LiBGb3IgZWFjaCBqb2I6XG4gKiAgICAtIENyZWF0ZSBjb250ZXh0IHdpdGggdGhpcy5jcmVhdGVDb250ZXh0KClcbiAqICAgIC0gUG9wdWxhdGUgY3R4LnJlcXVlc3Qgd2l0aCBqb2IgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjayBvbiBzdWNjZXNzLCByZXRyeSBvciBETFEgb24gZmFpbHVyZVxuICovXG5cbmltcG9ydCB7IHR5cGUgSGVscGVyUmVzcG9uc2UsIHR5cGUgV29ya2VyVHJpZ2dlck9wdHMsIHRyeVBhcnNlRHVyYXRpb24gfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7XG5cdHR5cGUgQmxva1NlcnZpY2UsXG5cdENvbmN1cnJlbmN5TGltaXRFcnJvcixcblx0Q29uY3VycmVuY3lNZXRyaWNzLFxuXHREZWJvdW5jZUNvb3JkaW5hdG9yLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHREZWZlcnJlZERpc3BhdGNoU2lnbmFsLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdEphbml0b3IsXG5cdE5vZGVNYXAsXG5cdFF1ZXVlRXhwaXJlZEVycm9yLFxuXHRSdW5UcmFja2VyLFxuXHRUcmlnZ2VyQmFzZSxcblx0dHlwZSBUcmlnZ2VyUmVzcG9uc2UsXG5cdGNyZWF0ZUNvbmN1cnJlbmN5QmFja2VuZCxcblx0Y3JlYXRlRGVib3VuY2VCYWNrZW5kLFxufSBmcm9tIFwiQGJsb2tqcy9ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2tqcy9zaGFyZWRcIjtcbmltcG9ydCB7IHR5cGUgU3BhbiwgU3BhblN0YXR1c0NvZGUsIG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbi8qKlxuICogSm9iIHJlY2VpdmVkIGZyb20gd29ya2VyIHF1ZXVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VySm9iIHtcblx0LyoqIFVuaXF1ZSBqb2IgSUQgKi9cblx0aWQ6IHN0cmluZztcblx0LyoqIEpvYiBkYXRhIHBheWxvYWQgKi9cblx0ZGF0YTogdW5rbm93bjtcblx0LyoqIEpvYiBtZXRhZGF0YSBoZWFkZXJzICovXG5cdGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdC8qKiBRdWV1ZSBuYW1lIHRoaXMgam9iIGJlbG9uZ3MgdG8gKi9cblx0cXVldWU6IHN0cmluZztcblx0LyoqIEpvYiBwcmlvcml0eSAoaGlnaGVyID0gbW9yZSBpbXBvcnRhbnQpICovXG5cdHByaW9yaXR5OiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBzbyBmYXIgKi9cblx0YXR0ZW1wdHM6IG51bWJlcjtcblx0LyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgKi9cblx0bWF4UmV0cmllczogbnVtYmVyO1xuXHQvKiogVGltZXN0YW1wIHdoZW4gam9iIHdhcyBjcmVhdGVkICovXG5cdGNyZWF0ZWRBdDogRGF0ZTtcblx0LyoqIERlbGF5IGJlZm9yZSBwcm9jZXNzaW5nIChtcykgKi9cblx0ZGVsYXk/OiBudW1iZXI7XG5cdC8qKiBKb2IgdGltZW91dCAobXMpICovXG5cdHRpbWVvdXQ/OiBudW1iZXI7XG5cdC8qKiBPcmlnaW5hbCByYXcgam9iIGZyb20gcHJvdmlkZXIgKi9cblx0cmF3OiB1bmtub3duO1xuXHQvKiogTWFyayBqb2IgYXMgY29tcGxldGVkICovXG5cdGNvbXBsZXRlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogTWFyayBqb2IgYXMgZmFpbGVkIChvcHRpb25hbGx5IHJlcXVldWUpICovXG5cdGZhaWw6IChlcnJvcjogRXJyb3IsIHJlcXVldWU/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFdvcmtlciBhZGFwdGVyIGludGVyZmFjZSAtIGltcGxlbWVudGVkIGJ5IGVhY2ggam9iIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJBZGFwdGVyIHtcblx0LyoqIFByb3ZpZGVyIG5hbWUgKGUuZy4sIFwiYnVsbG1xXCIsIFwiaW4tbWVtb3J5XCIpICovXG5cdHJlYWRvbmx5IHByb3ZpZGVyOiBzdHJpbmc7XG5cblx0LyoqIENvbm5lY3QgdG8gdGhlIGpvYiBiYWNrZW5kICovXG5cdGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogRGlzY29ubmVjdCBmcm9tIHRoZSBqb2IgYmFja2VuZCAqL1xuXHRkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHByb2Nlc3Npbmcgam9icyBmcm9tIGEgcXVldWVcblx0ICogQHBhcmFtIGNvbmZpZyBXb3JrZXIgdHJpZ2dlciBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBoYW5kbGVyIENhbGxiYWNrIGZvciBlYWNoIGpvYlxuXHQgKi9cblx0cHJvY2Vzcyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzLCBoYW5kbGVyOiAoam9iOiBXb3JrZXJKb2IpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBBZGQgYSBqb2IgdG8gYSBxdWV1ZSAoZm9yIHByb2dyYW1tYXRpYyBkaXNwYXRjaGluZylcblx0ICogQHBhcmFtIHF1ZXVlIFF1ZXVlIG5hbWVcblx0ICogQHBhcmFtIGRhdGEgSm9iIHBheWxvYWRcblx0ICogQHBhcmFtIG9wdHMgSm9iIG9wdGlvbnNcblx0ICovXG5cdGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHtcblx0XHRcdHByaW9yaXR5PzogbnVtYmVyO1xuXHRcdFx0ZGVsYXk/OiBudW1iZXI7XG5cdFx0XHRyZXRyaWVzPzogbnVtYmVyO1xuXHRcdFx0dGltZW91dD86IG51bWJlcjtcblx0XHRcdGpvYklkPzogc3RyaW5nO1xuXHRcdH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPjtcblxuXHQvKiogU3RvcCBwcm9jZXNzaW5nIGEgc3BlY2lmaWMgcXVldWUgKi9cblx0c3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIENoZWNrIGlmIGNvbm5lY3RlZCAqL1xuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuXG5cdC8qKiBIZWFsdGggY2hlY2sgKi9cblx0aGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPjtcblxuXHQvKiogR2V0IHF1ZXVlIHN0YXRzICovXG5cdGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz47XG59XG5cbi8qKlxuICogUXVldWUgc3RhdGlzdGljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlclF1ZXVlU3RhdHMge1xuXHQvKiogTnVtYmVyIG9mIGpvYnMgd2FpdGluZyB0byBiZSBwcm9jZXNzZWQgKi9cblx0d2FpdGluZzogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGpvYnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCAqL1xuXHRhY3RpdmU6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBjb21wbGV0ZWQgam9icyAqL1xuXHRjb21wbGV0ZWQ6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBmYWlsZWQgam9icyAqL1xuXHRmYWlsZWQ6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBkZWxheWVkIGpvYnMgKi9cblx0ZGVsYXllZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdvcmtmbG93IG1vZGVsIHdpdGggd29ya2VyIHRyaWdnZXIgY29uZmlndXJhdGlvblxuICovXG5pbnRlcmZhY2UgV29ya2VyV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0d29ya2VyPzogV29ya2VyVHJpZ2dlck9wdHM7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHRcdH07XG5cdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0fTtcbn1cblxuLyoqXG4gKiBXb3JrZXJUcmlnZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd29ya2VyLWJhc2VkIHRyaWdnZXJzXG4gKlxuICogUHJvdmlkZXMgYmFja2dyb3VuZCBqb2IgcHJvY2Vzc2luZyB3aXRoOlxuICogLSBDb25maWd1cmFibGUgY29uY3VycmVuY3kgcGVyIHF1ZXVlXG4gKiAtIEF1dG9tYXRpYyByZXRyaWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBKb2IgdGltZW91dHMgd2l0aCBhdXRvbWF0aWMgZmFpbHVyZVxuICogLSBQcmlvcml0eS1iYXNlZCBqb2Igb3JkZXJpbmdcbiAqIC0gRGVsYXllZCBqb2Igc2NoZWR1bGluZ1xuICogLSBRdWV1ZSBzdGF0aXN0aWNzIGFuZCBtb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXb3JrZXJUcmlnZ2VyIGV4dGVuZHMgVHJpZ2dlckJhc2Uge1xuXHRwcm90ZWN0ZWQgbm9kZU1hcDogR2xvYmFsT3B0aW9ucyA9IHt9IGFzIEdsb2JhbE9wdGlvbnM7XG5cdHByb3RlY3RlZCByZWFkb25seSB0cmFjZXIgPSB0cmFjZS5nZXRUcmFjZXIoXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FIHx8IFwidHJpZ2dlci13b3JrZXItd29ya2Zsb3dcIixcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX1ZFUlNJT04gfHwgXCIwLjAuMVwiLFxuXHQpO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcblx0LyoqXG5cdCAqIHYwLjcgUFIgNSDigJQgdGhlIFwiZGVmYXVsdFwiIGFkYXB0ZXIsIHVzZWQgd2hlbiBhIHdvcmtmbG93J3Ncblx0ICogYHRyaWdnZXIud29ya2VyLnByb3ZpZGVyYCBmaWVsZCBpcyBvbWl0dGVkIEFORCB0aGVcblx0ICogYEJMT0tfV09SS0VSX0FEQVBURVJgIGVudiB2YXIgaXMgdW5zZXQuIFN1YmNsYXNzZXMgTUFZIHNldCB0aGlzXG5cdCAqIGZvciBiYWNrLWNvbXBhdCB3aXRoIHRoZSBwcmUtdjAuNyBzaW5nbGUtYWRhcHRlciBwYXR0ZXJuXG5cdCAqIChgY2xhc3MgV29ya2VyU2VydmVyIGV4dGVuZHMgV29ya2VyVHJpZ2dlciB7IHByb3RlY3RlZCBhZGFwdGVyID0gbmV3IE5BVFNXb3JrZXJBZGFwdGVyKCkgfWApLlxuXHQgKlxuXHQgKiBXaGVuIHVuc2V0IEFORCBubyBwZXItd29ya2Zsb3cgcHJvdmlkZXIgaXMgc3BlY2lmaWVkLCB0aGUgZmFjdG9yeVxuXHQgKiBmYWxscyBiYWNrIHRvIGBpbi1tZW1vcnlgLiBUaGUgZmFjdG9yeSBwb29sIChgYWRhcHRlcnMvZmFjdG9yeS50c2ApXG5cdCAqIHRyYWNrcyBvbmUgY29ubmVjdGVkIGFkYXB0ZXIgcGVyIHByb3ZpZGVyIHNvIG11bHRpcGxlIHdvcmtmbG93c1xuXHQgKiB3aXRoIHRoZSBzYW1lIHByb3ZpZGVyIHNoYXJlIGEgc2luZ2xlIGJyb2tlciBjb25uZWN0aW9uLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXI/OiBXb3JrZXJBZGFwdGVyO1xuXG5cdC8qKiBBY3RpdmUgcXVldWVzIGJlaW5nIHByb2Nlc3NlZCAqL1xuXHRwcm90ZWN0ZWQgYWN0aXZlUXVldWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHQvKipcblx0ICogdjAuNyBQUiA1IOKAlCBhZGFwdGVyIHBvb2wsIGtleWVkIGJ5IHByb3ZpZGVyIG5hbWUuIFBvcHVsYXRlZCBsYXppbHlcblx0ICogaW5zaWRlIGBsaXN0ZW4oKWAgYXMgd29ya2Zsb3dzIGFyZSBtYXRjaGVkIHRvIHByb3ZpZGVycy4gRWFjaFxuXHQgKiBhZGFwdGVyIGlzIGNvbm5lY3RlZCBvbmNlIGFuZCByZXVzZWQgYWNyb3NzIHdvcmtmbG93cyB0aGF0IHNoYXJlXG5cdCAqIGl0cyBwcm92aWRlci4gRHJhaW5lZCBpbiBgc3RvcCgpYC5cblx0ICovXG5cdHByb3RlY3RlZCBhZGFwdGVyUG9vbDogTWFwPHN0cmluZywgV29ya2VyQWRhcHRlcj4gPSBuZXcgTWFwKCk7XG5cblx0Ly8gU3ViY2xhc3NlcyBwcm92aWRlIHRoZXNlXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBub2RlczogUmVjb3JkPHN0cmluZywgQmxva1NlcnZpY2U8dW5rbm93bj4+O1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBIZWxwZXJSZXNwb25zZT47XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxvYWROb2RlcygpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgbm9kZXMgaW50byB0aGUgbm9kZSBtYXBcblx0ICovXG5cdGxvYWROb2RlcygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAubm9kZXMgPSBuZXcgTm9kZU1hcCgpO1xuXHRcdGNvbnN0IG5vZGVLZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2Ygbm9kZUtleXMpIHtcblx0XHRcdHRoaXMubm9kZU1hcC5ub2Rlcy5hZGROb2RlKGtleSwgdGhpcy5ub2Rlc1trZXldKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB3b3JrZmxvd3MgaW50byB0aGUgd29ya2Zsb3cgbWFwXG5cdCAqL1xuXHRsb2FkV29ya2Zsb3dzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC53b3JrZmxvd3MgPSB0aGlzLndvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgd29ya2VyIHByb2Nlc3NvciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gVGllciAyICM2IGZvbGxvdy11cCDCtyBpbnN0YWxsIHRoZSBjcm9zcy1wcm9jZXNzIGNvbmN1cnJlbmN5XG5cdFx0XHQvLyBiYWNrZW5kIChOQVRTIEtWKSB3aGVuIHRoZSBvcGVyYXRvciBvcHRlZCBpbiB2aWFcblx0XHRcdC8vIGBCTE9LX0NPTkNVUlJFTkNZX0JBQ0tFTkQ9bmF0cy1rdmAuIERlZmF1bHQgbnVsbCBwcmVzZXJ2ZXMgdGhlXG5cdFx0XHQvLyBleGlzdGluZyBpbi1wcm9jZXNzIGJlaGF2aW9yLlxuXHRcdFx0Ly9cblx0XHRcdC8vIFBSIDMgRDEg4oCUIHJlY29yZCBpbnN0YWxsIGF0dGVtcHRzIHZpYSBPVGVsIGNvdW50ZXIuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBiYWNrZW5kID0gY3JlYXRlQ29uY3VycmVuY3lCYWNrZW5kKCk7XG5cdFx0XHRcdGlmIChiYWNrZW5kKSB7XG5cdFx0XHRcdFx0YXdhaXQgYmFja2VuZC5jb25uZWN0KCk7XG5cdFx0XHRcdFx0UnVuVHJhY2tlci5nZXRJbnN0YW5jZSgpLnNldENvbmN1cnJlbmN5QmFja2VuZChiYWNrZW5kKTtcblx0XHRcdFx0XHRDb25jdXJyZW5jeU1ldHJpY3MuZ2V0SW5zdGFuY2UoKS5yZWNvcmRCYWNrZW5kSW5zdGFsbCh7XG5cdFx0XHRcdFx0XHRiYWNrZW5kOiBiYWNrZW5kLm5hbWUsXG5cdFx0XHRcdFx0XHRzdGF0dXM6IFwic3VjY2Vzc1wiLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgW2NvbmN1cnJlbmN5XSBiYWNrZW5kIGluc3RhbGxlZDogJHtiYWNrZW5kLm5hbWV9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRDb25jdXJyZW5jeU1ldHJpY3MuZ2V0SW5zdGFuY2UoKS5yZWNvcmRCYWNrZW5kSW5zdGFsbCh7XG5cdFx0XHRcdFx0YmFja2VuZDogXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0c3RhdHVzOiBcImZhaWx1cmVcIixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdGBbY29uY3VycmVuY3ldIGJhY2tlbmQgaW5zdGFsbCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfTsgZmFsbGluZyBiYWNrIHRvIGluLXByb2Nlc3MgYmVoYXZpb3JgLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaWVyIEMgIzEgwrcgaW5zdGFsbCB0aGUgY3Jvc3MtcHJvY2VzcyBkZWJvdW5jZSBiYWNrZW5kXG5cdFx0XHQvLyAoTkFUUyBLViAvIFJlZGlzKSB3aGVuIHRoZSBvcGVyYXRvciBvcHRlZCBpbiB2aWFcblx0XHRcdC8vIGBCTE9LX0RFQk9VTkNFX0JBQ0tFTkRgLiBEZWZhdWx0IHVuc2V0ID0gdGhlIGV4aXN0aW5nXG5cdFx0XHQvLyBpbi1wcm9jZXNzIGJlaGF2aW9yIGlzIHByZXNlcnZlZC4gT24gY29ubmVjdCBmYWlsdXJlLCBsb2cgK1xuXHRcdFx0Ly8gZmFsbCBiYWNrIHRvIGluLW1lbW9yeSBjb29yZGluYXRpb24uXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkZWJvdW5jZUJhY2tlbmQgPSBjcmVhdGVEZWJvdW5jZUJhY2tlbmQoKTtcblx0XHRcdFx0aWYgKGRlYm91bmNlQmFja2VuZCkge1xuXHRcdFx0XHRcdGNvbnN0IGxlYXNlUmF3ID0gcHJvY2Vzcy5lbnYuQkxPS19ERUJPVU5DRV9PV05FUl9MRUFTRV9NUztcblx0XHRcdFx0XHRpZiAobGVhc2VSYXcgJiYgL15cXGQrJC8udGVzdChsZWFzZVJhdykpIHtcblx0XHRcdFx0XHRcdERlYm91bmNlQ29vcmRpbmF0b3IuZ2V0SW5zdGFuY2UoKS5zZXRPd25lckxlYXNlTXMoTnVtYmVyKGxlYXNlUmF3KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IGRlYm91bmNlQmFja2VuZC5jb25uZWN0KCk7XG5cdFx0XHRcdFx0RGVib3VuY2VDb29yZGluYXRvci5nZXRJbnN0YW5jZSgpLnNldEJhY2tlbmQoZGVib3VuY2VCYWNrZW5kKTtcblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYFtkZWJvdW5jZV0gYmFja2VuZCBpbnN0YWxsZWQ6ICR7ZGVib3VuY2VCYWNrZW5kLm5hbWV9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRgW2RlYm91bmNlXSBiYWNrZW5kIGluc3RhbGwgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX07IGZhbGxpbmcgYmFjayB0byBpbi1tZW1vcnkgY29vcmRpbmF0aW9uYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIHF1aWNrLXdpbnMgZm9sbG93LXVwIMK3IGluc3RhbGwgY3Jhc2ggaGFuZGxlcnMgKyByZWNvdmVyXG5cdFx0XHQvLyBvcnBoYW5lZCBydW5zIGZyb20gYSBwcmV2aW91cyAoZGVhZCkgcHJvY2Vzcy4gSWRlbXBvdGVudCArIG9wdC1vdXRcblx0XHRcdC8vIHZpYSBgQkxPS19DUkFTSF9BVVRPRkxJUF9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdFdvcmtlclRyaWdnZXIuaW5zdGFsbENyYXNoSGFuZGxlcnModGhpcy5sb2dnZXIpO1xuXHRcdFx0XHRjb25zdCBvcnBoYW5lZCA9IFdvcmtlclRyaWdnZXIucmVjb3Zlck9ycGhhbmVkUnVucyh1bmRlZmluZWQsIHRoaXMubG9nZ2VyKTtcblx0XHRcdFx0aWYgKG9ycGhhbmVkID4gMCkge1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgW2NyYXNoLWF1dG9mbGlwXSBmbGlwcGVkICR7b3JwaGFuZWR9IG9ycGhhbmVkIHJ1bihzKSB0byBjcmFzaGVkIG9uIGJvb3RgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbY3Jhc2gtYXV0b2ZsaXBdIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgMiBmb2xsb3ctdXAgwrcgc3RhcnQgdGhlIHBlcmlvZGljIHN0b3JhZ2UgamFuaXRvci5cblx0XHRcdC8vIElkZW1wb3RlbnQgKHNpbmdsZXRvbik7IG9wdC1vdXQgdmlhIGBCTE9LX0pBTklUT1JfRElTQUJMRUQ9MWAuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRKYW5pdG9yLmdldEluc3RhbmNlKFJ1blRyYWNrZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdG9yZSgpLCB0aGlzLmxvZ2dlcikuc3RhcnQoKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW2phbml0b3JdIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgMiBmb2xsb3ctdXAgwrcgaW5zdGFsbCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuXHRcdFx0Ly8gKFNJR1RFUk0gLyBTSUdJTlQpLiBJZGVtcG90ZW50OyBvcHQtb3V0IHZpYVxuXHRcdFx0Ly8gYEJMT0tfR1JBQ0VGVUxfU0hVVERPV05fRElTQUJMRUQ9MWAuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRXb3JrZXJUcmlnZ2VyLmluc3RhbGxTaHV0ZG93bkhhbmRsZXJzKHRoaXMsIHRoaXMubG9nZ2VyKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW3NodXRkb3duXSBzZXR1cCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGaW5kIGFsbCB3b3JrZmxvd3Mgd2l0aCB3b3JrZXIgdHJpZ2dlcnNcblx0XHRcdGNvbnN0IHdvcmtlcldvcmtmbG93cyA9IHRoaXMuZ2V0V29ya2VyV29ya2Zsb3dzKCk7XG5cblx0XHRcdGlmICh3b3JrZXJXb3JrZmxvd3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcIk5vIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2VycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCBwcm9jZXNzaW5nIGVhY2ggcXVldWUsIGRpc3BhdGNoaW5nIHRvIHRoZSByaWdodCBhZGFwdGVyXG5cdFx0XHQvLyBiYXNlZCBvbiB0aGUgd29ya2Zsb3cncyBgcHJvdmlkZXJgIGZpZWxkICh3aXRoIGJhY2stY29tcGF0XG5cdFx0XHQvLyBmYWxsYmFjayB0byBgdGhpcy5hZGFwdGVyYCB3aGVuIHN1YmNsYXNzZXMgc3RpbGwgc2V0IGl0KS5cblx0XHRcdGZvciAoY29uc3Qgd29ya2Zsb3cgb2Ygd29ya2VyV29ya2Zsb3dzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmZpZyA9IHdvcmtmbG93LmNvbmZpZy50cmlnZ2VyPy53b3JrZXIgYXMgV29ya2VyVHJpZ2dlck9wdHM7XG5cdFx0XHRcdGNvbnN0IGFkYXB0ZXIgPSBhd2FpdCB0aGlzLnJlc29sdmVBZGFwdGVyRm9yV29ya2Zsb3coY29uZmlnKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdGBTdGFydGluZyB3b3JrZXIgZm9yIHF1ZXVlOiAke2NvbmZpZy5xdWV1ZX0gdmlhICR7YWRhcHRlci5wcm92aWRlcn0gKGNvbmN1cnJlbmN5PSR7Y29uZmlnLmNvbmN1cnJlbmN5fSwgcmV0cmllcz0ke2NvbmZpZy5yZXRyaWVzfSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHRoaXMuYWN0aXZlUXVldWVzLmFkZChjb25maWcucXVldWUpO1xuXG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIucHJvY2Vzcyhjb25maWcsIGFzeW5jIChqb2IpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZUpvYihqb2IsIHdvcmtmbG93LCBjb25maWcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBXb3JrZXIgdHJpZ2dlciBzdGFydGVkLiBQcm9jZXNzaW5nICR7d29ya2VyV29ya2Zsb3dzLmxlbmd0aH0gcXVldWUocylgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHdvcmtlciB0cmlnZ2VyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9wIGFsbCB3b3JrZXJzIGFuZCBkaXNjb25uZWN0XG5cdCAqL1xuXHRhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFN0b3AgZWFjaCBxdWV1ZSBvbiBpdHMgb3duaW5nIGFkYXB0ZXIg4oCUIGFkYXB0ZXJzIGFyZSB0cmFja2VkXG5cdFx0Ly8gaW4gdGhlIHBvb2wgc28gbXVsdGktcHJvdmlkZXIgd29ya2VycyBhbGwgZHJhaW4gY2xlYW5seS5cblx0XHRmb3IgKGNvbnN0IHF1ZXVlIG9mIHRoaXMuYWN0aXZlUXVldWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVyUG9vbC52YWx1ZXMoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IGFkYXB0ZXIuc3RvcFByb2Nlc3NpbmcocXVldWUpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBzd2FsbG93IOKAlCBhZGFwdGVyIG1heSBub3Qgb3duIHRoaXMgcXVldWUgKi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBTdG9wcGVkIHByb2Nlc3NpbmcgcXVldWU6ICR7cXVldWV9YCk7XG5cdFx0fVxuXHRcdHRoaXMuYWN0aXZlUXVldWVzLmNsZWFyKCk7XG5cdFx0Ly8gRGlzY29ubmVjdCBldmVyeSBhZGFwdGVyIHdlIGV2ZXIgY29ubmVjdGVkLlxuXHRcdGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBhZGFwdGVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgW2Jsb2tdW3dvcmtlcl0gZGlzY29ubmVjdCBmYWlsZWQ6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5hZGFwdGVyUG9vbC5jbGVhcigpO1xuXHRcdHRoaXMuZGVzdHJveU1vbml0b3JpbmcoKTtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJXb3JrZXIgdHJpZ2dlciBzdG9wcGVkXCIpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSG1yV29ya2Zsb3dDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiW0hNUl0gV29ya2VyIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwYXRjaCBhIGpvYiB0byBhIHdvcmtlciBxdWV1ZVxuXHQgKi9cblx0YXN5bmMgZGlzcGF0Y2goXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7XG5cdFx0XHRwcmlvcml0eT86IG51bWJlcjtcblx0XHRcdGRlbGF5PzogbnVtYmVyO1xuXHRcdFx0cmV0cmllcz86IG51bWJlcjtcblx0XHRcdHRpbWVvdXQ/OiBudW1iZXI7XG5cdFx0XHRqb2JJZD86IHN0cmluZztcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdC8vIEJhY2stY29tcGF0OiB3aGVuIGEgc3ViY2xhc3Mgc2V0IGB0aGlzLmFkYXB0ZXJgLCB1c2UgaXQuXG5cdFx0Ly8gT3RoZXJ3aXNlIGRpc3BhdGNoIHZpYSB0aGUgZmlyc3QgcG9vbCBhZGFwdGVyIOKAlCB0eXBpY2FsbHkgdGhlXG5cdFx0Ly8gb25seSBvbmUgd2hlbiBhIHByb2Nlc3Mgb3ducyBvbmUgdHJpZ2dlciB3b3JrZmxvdy5cblx0XHRjb25zdCBhZGFwdGVyID1cblx0XHRcdHRoaXMuYWRhcHRlciA/P1xuXHRcdFx0KHRoaXMuYWRhcHRlclBvb2wuc2l6ZSA+IDAgPyAodGhpcy5hZGFwdGVyUG9vbC52YWx1ZXMoKS5uZXh0KCkudmFsdWUgYXMgV29ya2VyQWRhcHRlcikgOiB1bmRlZmluZWQpO1xuXHRcdGlmICghYWRhcHRlcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcIltibG9rXVt3b3JrZXJdIGRpc3BhdGNoKCkgY2FsbGVkIGJlZm9yZSBhbnkgYWRhcHRlciBpcyBjb25uZWN0ZWQuIENhbGwgbGlzdGVuKCkgZmlyc3QsIG9yIHNldCB0aGlzLmFkYXB0ZXIgb24gdGhlIHN1YmNsYXNzLlwiLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXIuYWRkSm9iKHF1ZXVlLCBkYXRhLCBvcHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgc3RhdGlzdGljcyBmb3IgYSBxdWV1ZVxuXHQgKi9cblx0YXN5bmMgZ2V0UXVldWVTdGF0cyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZXJRdWV1ZVN0YXRzPiB7XG5cdFx0Y29uc3QgYWRhcHRlciA9XG5cdFx0XHR0aGlzLmFkYXB0ZXIgPz9cblx0XHRcdCh0aGlzLmFkYXB0ZXJQb29sLnNpemUgPiAwID8gKHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkubmV4dCgpLnZhbHVlIGFzIFdvcmtlckFkYXB0ZXIpIDogdW5kZWZpbmVkKTtcblx0XHRpZiAoIWFkYXB0ZXIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XCJbYmxva11bd29ya2VyXSBnZXRRdWV1ZVN0YXRzKCkgY2FsbGVkIGJlZm9yZSBhbnkgYWRhcHRlciBpcyBjb25uZWN0ZWQuIENhbGwgbGlzdGVuKCkgZmlyc3QsIG9yIHNldCB0aGlzLmFkYXB0ZXIgb24gdGhlIHN1YmNsYXNzLlwiLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXIuZ2V0UXVldWVTdGF0cyhxdWV1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGxpc3Qgb2YgYWN0aXZlIHF1ZXVlc1xuXHQgKi9cblx0Z2V0QWN0aXZlUXVldWVzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZVF1ZXVlcyk7XG5cdH1cblxuXHQvKipcblx0ICogdjAuNyBQUiA1IOKAlCBwaWNrIHRoZSBhZGFwdGVyIGZvciBhIHdvcmtmbG93J3MgYHByb3ZpZGVyYCBmaWVsZC5cblx0ICpcblx0ICogUmVzb2x1dGlvbiBvcmRlcjpcblx0ICogICAxLiBTdWJjbGFzcy1zZXQgYHRoaXMuYWRhcHRlcmAgKGJhY2stY29tcGF0OiBwcmUtdjAuNyBwYXR0ZXJuXG5cdCAqICAgICAgd2hlcmUgb25lIHByb2Nlc3MgYmluZHMgdG8gb25lIGFkYXB0ZXIgYXQgY29uc3RydWN0aW9uIHRpbWUpLlxuXHQgKiAgIDIuIFBlci13b3JrZmxvdyBgcHJvdmlkZXJgIGZpZWxkLCBsb29rZWQgdXAgdmlhIHRoZSBmYWN0b3J5LlxuXHQgKiAgIDMuIGBCTE9LX1dPUktFUl9BREFQVEVSYCBlbnYgdmFyLlxuXHQgKiAgIDQuIGBpbi1tZW1vcnlgIGZhbGxiYWNrLlxuXHQgKlxuXHQgKiBBZGFwdGVycyBhcmUgY29ubmVjdGVkIG9uIGZpcnN0IHVzZSBhbmQgcG9vbGVkIHBlciBwcm92aWRlciBzb1xuXHQgKiBtdWx0aXBsZSB3b3JrZmxvd3Mgc2hhcmluZyBhIHByb3ZpZGVyIHNoYXJlIG9uZSBicm9rZXJcblx0ICogY29ubmVjdGlvbi4gSGVhbHRoLWRlcGVuZGVuY3kgcmVnaXN0cmF0aW9uIGFsc28gaGFwcGVucyBoZXJlIHNvXG5cdCAqIGVhY2ggcHJvdmlkZXIgaXMgdHJhY2tlZCBpbmRpdmlkdWFsbHkgaW4gYC9oZWFsdGhgLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFzeW5jIHJlc29sdmVBZGFwdGVyRm9yV29ya2Zsb3coY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cyk6IFByb21pc2U8V29ya2VyQWRhcHRlcj4ge1xuXHRcdC8vIFN1YmNsYXNzIG92ZXJyaWRlIHdpbnMgZm9yIGJhY2stY29tcGF0LlxuXHRcdGlmICh0aGlzLmFkYXB0ZXIpIHtcblx0XHRcdGlmICghdGhpcy5hZGFwdGVyLmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5hZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBDb25uZWN0ZWQgdG8gJHt0aGlzLmFkYXB0ZXIucHJvdmlkZXJ9IHdvcmtlciBzeXN0ZW0gKHN1YmNsYXNzIGFkYXB0ZXIpYCk7XG5cdFx0XHRcdHRoaXMucmVnaXN0ZXJBZGFwdGVySGVhbHRoKHRoaXMuYWRhcHRlcik7XG5cdFx0XHR9XG5cdFx0XHQvLyBQb29sLXRyYWNrIHNvIHN0b3AoKSBjYW4gZHJhaW4gaXQuXG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldCh0aGlzLmFkYXB0ZXIucHJvdmlkZXIsIHRoaXMuYWRhcHRlcik7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyO1xuXHRcdH1cblxuXHRcdC8vIExhenktaW1wb3J0IHRoZSBmYWN0b3J5IHNvIHRoZSB3b3JrZXIgcGFja2FnZSBkb2Vzbid0IHB1bGwgaW5cblx0XHQvLyBldmVyeSBhZGFwdGVyIG9uIGltcG9ydCDigJQgb25seSB0aGUgb25lcyBhY3R1YWxseSBleGVyY2lzZWQuXG5cdFx0Y29uc3QgeyByZXNvbHZlUHJvdmlkZXIsIGNyZWF0ZVdvcmtlckFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vYWRhcHRlcnMvZmFjdG9yeVwiKTtcblx0XHRjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcucHJvdmlkZXIpO1xuXHRcdGxldCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyUG9vbC5nZXQocHJvdmlkZXIpO1xuXHRcdGlmICghYWRhcHRlcikge1xuXHRcdFx0YWRhcHRlciA9IGNyZWF0ZVdvcmtlckFkYXB0ZXIocHJvdmlkZXIpO1xuXHRcdFx0YXdhaXQgYWRhcHRlci5jb25uZWN0KCk7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke2FkYXB0ZXIucHJvdmlkZXJ9IHdvcmtlciBzeXN0ZW1gKTtcblx0XHRcdHRoaXMucmVnaXN0ZXJBZGFwdGVySGVhbHRoKGFkYXB0ZXIpO1xuXHRcdFx0dGhpcy5hZGFwdGVyUG9vbC5zZXQocHJvdmlkZXIsIGFkYXB0ZXIpO1xuXHRcdH1cblx0XHRyZXR1cm4gYWRhcHRlcjtcblx0fVxuXG5cdHByaXZhdGUgcmVnaXN0ZXJBZGFwdGVySGVhbHRoKGFkYXB0ZXI6IFdvcmtlckFkYXB0ZXIpOiB2b2lkIHtcblx0XHR0aGlzLnJlZ2lzdGVySGVhbHRoRGVwZW5kZW5jeShgd29ya2VyLSR7YWRhcHRlci5wcm92aWRlcn1gLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBoZWFsdGh5ID0gYXdhaXQgYWRhcHRlci5oZWFsdGhDaGVjaygpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c3RhdHVzOiBoZWFsdGh5ID8gKFwiaGVhbHRoeVwiIGFzIGNvbnN0KSA6IChcInVuaGVhbHRoeVwiIGFzIGNvbnN0KSxcblx0XHRcdFx0bGFzdENoZWNrZWQ6IERhdGUubm93KCksXG5cdFx0XHRcdG1lc3NhZ2U6IGhlYWx0aHkgPyBcIkNvbm5lY3RlZFwiIDogXCJDb25uZWN0aW9uIGxvc3RcIixcblx0XHRcdH07XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIHdvcmtlciB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFdvcmtlcldvcmtmbG93cygpOiBXb3JrZXJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogV29ya2VyV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdGNvbnN0IHdvcmtmbG93Q29uZmlnID0gKHdvcmtmbG93IGFzIHVua25vd24gYXMgeyBfY29uZmlnOiBXb3JrZXJXb3JrZmxvd01vZGVsW1wiY29uZmlnXCJdIH0pLl9jb25maWc7XG5cblx0XHRcdGlmICh3b3JrZmxvd0NvbmZpZz8udHJpZ2dlcikge1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyVHlwZSA9IE9iamVjdC5rZXlzKHdvcmtmbG93Q29uZmlnLnRyaWdnZXIpWzBdO1xuXG5cdFx0XHRcdGlmICh0cmlnZ2VyVHlwZSA9PT0gXCJ3b3JrZXJcIiAmJiB3b3JrZmxvd0NvbmZpZy50cmlnZ2VyLndvcmtlcikge1xuXHRcdFx0XHRcdHdvcmtmbG93cy5wdXNoKHtcblx0XHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0XHRjb25maWc6IHdvcmtmbG93Q29uZmlnLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYW4gaW5jb21pbmcgam9iXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlSm9iKGpvYjogV29ya2VySm9iLCB3b3JrZmxvdzogV29ya2VyV29ya2Zsb3dNb2RlbCwgY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGpvYklkID0gam9iLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCB3b3JrZXJKb2JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19wcm9jZXNzZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYnMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgd29ya2VyRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJ3b3JrZXJfam9ic19mYWlsZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiBmYWlsdXJlc1wiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHdvcmtlclJldHJpZXMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX3JldHJpZWRcIiwge1xuXHRcdFx0ZGVzY3JpcHRpb246IFwiV29ya2VyIGpvYiByZXRyaWVzXCIsXG5cdFx0fSk7XG5cblx0XHRhd2FpdCB0aGlzLnRyYWNlci5zdGFydEFjdGl2ZVNwYW4oYHdvcmtlcjoke2NvbmZpZy5xdWV1ZX1gLCBhc3luYyAoc3BhbjogU3BhbikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHQvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2Zsb3dcblx0XHRcdFx0YXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmluaXQod29ya2Zsb3cucGF0aCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBjdHg6IENvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkLCB3b3JrZmxvdy5wYXRoLCBqb2JJZCk7XG5cblx0XHRcdFx0Ly8gUG9wdWxhdGUgcmVxdWVzdCB3aXRoIGpvYiBkYXRhXG5cdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdGJvZHk6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdGhlYWRlcnM6IGpvYi5oZWFkZXJzLFxuXHRcdFx0XHRcdHF1ZXJ5OiB7fSxcblx0XHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRcdHF1ZXVlOiBqb2IucXVldWUsXG5cdFx0XHRcdFx0XHRqb2JJZDogam9iLmlkLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdDogU3RyaW5nKGpvYi5hdHRlbXB0cyksXG5cdFx0XHRcdFx0XHRwcmlvcml0eTogU3RyaW5nKGpvYi5wcmlvcml0eSksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSBhcyB1bmtub3duIGFzIFJlcXVlc3RDb250ZXh0O1xuXG5cdFx0XHRcdC8vIFN0b3JlIHdvcmtlciBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzLl93b3JrZXJfam9iID0ge1xuXHRcdFx0XHRcdGlkOiBqb2IuaWQsXG5cdFx0XHRcdFx0cXVldWU6IGpvYi5xdWV1ZSxcblx0XHRcdFx0XHRhdHRlbXB0czogU3RyaW5nKGpvYi5hdHRlbXB0cyksXG5cdFx0XHRcdFx0bWF4UmV0cmllczogU3RyaW5nKGpvYi5tYXhSZXRyaWVzKSxcblx0XHRcdFx0XHRwcmlvcml0eTogU3RyaW5nKGpvYi5wcmlvcml0eSksXG5cdFx0XHRcdFx0Y3JlYXRlZEF0OiBqb2IuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG5cdFx0XHRcdFx0ZGVsYXk6IFN0cmluZyhqb2IuZGVsYXkgPz8gMCksXG5cdFx0XHRcdFx0dGltZW91dDogU3RyaW5nKGpvYi50aW1lb3V0ID8/IDApLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdGBQcm9jZXNzaW5nIGpvYiAke2pvYklkfSBmcm9tICR7Y29uZmlnLnF1ZXVlfSAoYXR0ZW1wdCAke2pvYi5hdHRlbXB0cyArIDF9LyR7am9iLm1heFJldHJpZXMgKyAxfSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIHYwLjYgwrcgYXBwbHkgdGhlIG1lcmdlZCBtaWRkbGV3YXJlIGNoYWluIChwcm9jZXNzLWdsb2JhbCDihpJcblx0XHRcdFx0Ly8gd29ya2Zsb3ctbGV2ZWwg4oaSIHRyaWdnZXItbGV2ZWwpIG9uIHRoZSBzYW1lIGN0eCB0aGUgbWFpblxuXHRcdFx0XHQvLyB3b3JrZmxvdyB3aWxsIHNlZS4gU3RhdGUgbXV0YXRpb25zIGZyb20gbWlkZGxld2FyZVxuXHRcdFx0XHQvLyAoZS5nLiBjdHguc3RhdGUuaWRlbnRpdHkpIGNhcnJ5IGZvcndhcmQuIE1pZGRsZXdhcmUgdGhhdFxuXHRcdFx0XHQvLyB0aHJvd3MgKHZpYSBgQGJsb2tqcy90aHJvd2ApIHByb3BhZ2F0ZXMgdG8gdGhlIG91dGVyXG5cdFx0XHRcdC8vIGNhdGNoIGFuZCBpcyByb3V0ZWQgdGhyb3VnaCB0aGUgd29ya2VyJ3MgcmV0cnkgLyBETFFcblx0XHRcdFx0Ly8gbG9naWMgZXhhY3RseSBsaWtlIGEgbWFpbi13b3JrZmxvdyBlcnJvci5cblx0XHRcdFx0YXdhaXQgdGhpcy5hcHBseU1pZGRsZXdhcmVDaGFpbihjdHgsIHRoaXMubm9kZU1hcCk7XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB3b3JrZmxvdyB3aXRoIHRpbWVvdXQgaWYgY29uZmlndXJlZFxuXHRcdFx0XHRsZXQgcmVzcG9uc2U6IFRyaWdnZXJSZXNwb25zZTtcblx0XHRcdFx0aWYgKGNvbmZpZy50aW1lb3V0ICYmIGNvbmZpZy50aW1lb3V0ID4gMCkge1xuXHRcdFx0XHRcdHJlc3BvbnNlID0gYXdhaXQgdGhpcy5leGVjdXRlV2l0aFRpbWVvdXQoY3R4LCBjb25maWcudGltZW91dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bihjdHgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiam9iX2lkXCIsIGpvYklkKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJxdWV1ZVwiLCBjb25maWcucXVldWUpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImF0dGVtcHRzXCIsIGpvYi5hdHRlbXB0cyk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0d29ya2VySm9icy5hZGQoMSwge1xuXHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYEpvYiBjb21wbGV0ZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7am9iSWR9YCk7XG5cblx0XHRcdFx0Ly8gTWFyayBqb2IgYXMgY29tcGxldGVkXG5cdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXG5cdFx0XHRcdC8vIFRpZXIgMiAjNSArICM3IOKAlCBkZWZlcnJlZCBkaXNwYXRjaCAoZGVsYXkvVFRML2RlYm91bmNlKS5cblx0XHRcdFx0Ly8gVGhlIHJ1biB3YXMgZGVmZXJyZWQgdG8gYSBmdXR1cmUgdGltZXI7IEFDSyB3aXRob3V0IHJldHJ5LlxuXHRcdFx0XHQvLyBUaGUgaW4tcHJvY2VzcyBzY2hlZHVsZXIgb3ducyB0aGUgZXZlbnR1YWwgZGlzcGF0Y2gsIE5PVFxuXHRcdFx0XHQvLyB0aGUgYnJva2VyIOKAlCByZS1xdWV1ZWluZyBoZXJlIHdvdWxkIGNyZWF0ZSBhIGR1cGxpY2F0ZS5cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgRGVmZXJyZWREaXNwYXRjaFNpZ25hbCkge1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJkZWZlcnJlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImRlZmVycmVkX3N0YXR1c1wiLCBlcnJvci5pbmZvLnN0YXR1cyk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSywgbWVzc2FnZTogYGRlZmVycmVkOiR7ZXJyb3IuaW5mby5zdGF0dXN9YCB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRcdGBbc2NoZWR1bGluZ10gam9iICR7am9iSWR9IHJ1bklkPSR7ZXJyb3IuaW5mby5ydW5JZH0gc3RhdHVzPSR7ZXJyb3IuaW5mby5zdGF0dXN9IGAgK1xuXHRcdFx0XHRcdFx0XHRgc2NoZWR1bGVkQXQ9JHtlcnJvci5pbmZvLnNjaGVkdWxlZEF0fSBwaW5nQ291bnQ9JHtlcnJvci5pbmZvLnBpbmdDb3VudH0g4oaSIEFDSyAobm8gcmVxdWV1ZSlgLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQUiAxLTUgcG9saXNoIOKAlCBxdWV1ZS1tb2RlIFRUTCBlbGFwc2VkLiBUaGUgcnVuIGlzIGFscmVhZHlcblx0XHRcdFx0Ly8gZmxpcHBlZCB0byBgZXhwaXJlZGAgKHNlZSBUcmlnZ2VyQmFzZSBxdWV1ZSBicmFuY2gpOyBBQ0tcblx0XHRcdFx0Ly8gd2l0aG91dCByZXRyeSBzbyB0aGUgYnJva2VyIGRvZXNuJ3QgcmVkZWxpdmVyIOKAlCB0aGUgcnVuXG5cdFx0XHRcdC8vIHdpbGwgbmV2ZXIgc3VjY2VlZCAodGltZXIgd29uJ3QgcmUtZmlyZSkuIERpc3RpbmN0IGZyb21cblx0XHRcdFx0Ly8gdGhlIHRocm90dGxlZCBOQUNLIGJlbG93LlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBRdWV1ZUV4cGlyZWRFcnJvcikge1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJxdWV1ZV9leHBpcmVkXCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssIG1lc3NhZ2U6IFwicXVldWVfZXhwaXJlZFwiIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdFx0YFtjb25jdXJyZW5jeV0gam9iICR7am9iSWR9IHJ1bklkPSR7ZXJyb3IuaW5mby5ydW5JZH0ga2V5PScke2Vycm9yLmluZm8uY29uY3VycmVuY3lLZXl9JyBgICtcblx0XHRcdFx0XHRcdFx0YHF1ZXVlRXhwaXJlZEF0PSR7ZXJyb3IuaW5mby5xdWV1ZUV4cGlyZWRBdH0g4oaSIEFDSyAobm8gcmVxdWV1ZSwgcnVuIGV4cGlyZWQpYCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmNvbXBsZXRlKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGllciAyICM2IOKAlCBjb25jdXJyZW5jeSBnYXRlIGRlbmlhbC4gRGlzdGluY3QgZnJvbSBhIG5vcm1hbFxuXHRcdFx0XHQvLyBmYWlsdXJlOiBOQUNLIHdpdGggcmVkZWxpdmVyeSBzbyB0aGUgYnJva2VyIHJlLXF1ZXVlcyB0aGVcblx0XHRcdFx0Ly8gam9iIHdpdGggaXRzIGV4aXN0aW5nIGJhY2stb2ZmIHNlbWFudGljcy4gRG9lc24ndCBjb3VudFxuXHRcdFx0XHQvLyBhZ2FpbnN0IHRoZSB3b3JrZmxvdydzIHJldHJ5IGJ1ZGdldCAoZGlmZmVyZW50IGludmFyaWFudCkuXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBwYXNzIGB3aWxsUmV0cnk6IHRydWVgIHJlZ2FyZGxlc3Mgb2YgYGpvYi5hdHRlbXB0c2Bcblx0XHRcdFx0Ly8gYmVjYXVzZSB0aHJvdHRsaW5nIGlzIGEgdHJhbnNpZW50IHJlc291cmNlIHN0YXRlLCBub3QgYVxuXHRcdFx0XHQvLyBwZXJtYW5lbnQgZmFpbHVyZS5cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgQ29uY3VycmVuY3lMaW1pdEVycm9yKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcIndpbGxfcmV0cnlcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ0aHJvdHRsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSywgbWVzc2FnZTogXCJjb25jdXJyZW5jeV9saW1pdF9yZWFjaGVkXCIgfSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBqb2IgJHtqb2JJZH0ga2V5PScke2Vycm9yLmluZm8uY29uY3VycmVuY3lLZXl9JyBgICtcblx0XHRcdFx0XHRcdFx0YGxpbWl0PSR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUxpbWl0fSBpbkZsaWdodD0ke2Vycm9yLmluZm8uY3VycmVudEluRmxpZ2h0fSDihpIgTkFDSyArIHJlZGVsaXZlcnlgLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR3b3JrZXJSZXRyaWVzLmFkZCgxLCB7XG5cdFx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbj8ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdFx0XHRcdHJlYXNvbjogXCJ0aHJvdHRsZWRcIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCB0cnVlKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzaG91bGRSZXRyeSA9IGpvYi5hdHRlbXB0cyA8IGpvYi5tYXhSZXRyaWVzO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGVycm9yXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid2lsbF9yZXRyeVwiLCBzaG91bGRSZXRyeSk7XG5cdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwgbWVzc2FnZTogZXJyb3JNZXNzYWdlIH0pO1xuXG5cdFx0XHRcdGlmIChzaG91bGRSZXRyeSkge1xuXHRcdFx0XHRcdC8vIFJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi4gYGNvbmZpZy5kZWxheWAgd2lkZW5lZCB0b1xuXHRcdFx0XHRcdC8vIGBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWRgIGluIFRpZXIgMiAjNSAoZHVyYXRpb24gc3RyaW5ncykuXG5cdFx0XHRcdFx0Ly8gYGNhbGN1bGF0ZUJhY2tvZmZgIG9ubHkgaGFuZGxlcyBudW1iZXJzOyBub3JtYWxpemUgdmlhXG5cdFx0XHRcdFx0Ly8gdHJ5UGFyc2VEdXJhdGlvbi4gRmFpbC1vcGVuIHRvIHVuZGVmaW5lZCDihpIgZGVmYXVsdCBiYWNrb2ZmLlxuXHRcdFx0XHRcdGNvbnN0IGRlbGF5TXMgPVxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gXCJudW1iZXJcIlxuXHRcdFx0XHRcdFx0XHQ/IGNvbmZpZy5kZWxheVxuXHRcdFx0XHRcdFx0XHQ6IHR5cGVvZiBjb25maWcuZGVsYXkgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdFx0XHQ/ICh0cnlQYXJzZUR1cmF0aW9uKGNvbmZpZy5kZWxheSkgPz8gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGJhY2tvZmZNcyA9IHRoaXMuY2FsY3VsYXRlQmFja29mZihqb2IuYXR0ZW1wdHMsIGRlbGF5TXMpO1xuXHRcdFx0XHRcdHdvcmtlclJldHJpZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0YXR0ZW1wdDogU3RyaW5nKGpvYi5hdHRlbXB0cyArIDEpLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0XHRgSm9iICR7am9iSWR9IGZhaWxlZCAoYXR0ZW1wdCAke2pvYi5hdHRlbXB0cyArIDF9LyR7am9iLm1heFJldHJpZXMgKyAxfSksIHJldHJ5aW5nIGluICR7YmFja29mZk1zfW1zOiAke2Vycm9yTWVzc2FnZX1gLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgdHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gTWF4IHJldHJpZXMgZXhoYXVzdGVkIC0gc2VuZCB0byBETFFcblx0XHRcdFx0XHR3b3JrZXJFcnJvcnMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0XHRgSm9iICR7am9iSWR9IHBlcm1hbmVudGx5IGZhaWxlZCBhZnRlciAke2pvYi5hdHRlbXB0cyArIDF9IGF0dGVtcHRzOiAke2Vycm9yTWVzc2FnZX1gLFxuXHRcdFx0XHRcdFx0KGVycm9yIGFzIEVycm9yKS5zdGFjayxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmZhaWwoZXJyb3IgYXMgRXJyb3IsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0c3Bhbi5lbmQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHdvcmtmbG93IHdpdGggYSB0aW1lb3V0XG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgZXhlY3V0ZVdpdGhUaW1lb3V0KGN0eDogQ29udGV4dCwgdGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTxUcmlnZ2VyUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoYEpvYiB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKSk7XG5cdFx0XHR9LCB0aW1lb3V0TXMpO1xuXG5cdFx0XHR0aGlzLnJ1bihjdHgpXG5cdFx0XHRcdC50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgZGVsYXlcblx0ICogRm9ybXVsYTogbWluKGJhc2VEZWxheSAqIDJeYXR0ZW1wdCwgMzAwMDApICsgaml0dGVyXG5cdCAqL1xuXHRwcm90ZWN0ZWQgY2FsY3VsYXRlQmFja29mZihhdHRlbXB0OiBudW1iZXIsIGJhc2VEZWxheT86IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgYmFzZSA9IGJhc2VEZWxheSA/PyAxMDAwO1xuXHRcdGNvbnN0IG1heERlbGF5ID0gMzAwMDA7IC8vIDMwIHNlY29uZHMgbWF4XG5cdFx0Y29uc3QgZXhwb25lbnRpYWwgPSBNYXRoLm1pbihiYXNlICogMiAqKiBhdHRlbXB0LCBtYXhEZWxheSk7XG5cdFx0Y29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIGV4cG9uZW50aWFsICogMC4xOyAvLyAxMCUgaml0dGVyXG5cdFx0cmV0dXJuIE1hdGguZmxvb3IoZXhwb25lbnRpYWwgKyBqaXR0ZXIpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdvcmtlclRyaWdnZXI7XG4iXX0=
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZXJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFFTixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isc0JBQXNCLEVBRXRCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLEVBRVgsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBYSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBcUhsQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFnQixhQUFjLFNBQVEsV0FBVztJQUM1QyxPQUFPLEdBQWtCLEVBQW1CLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLHlCQUF5QixFQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQ3RDLENBQUM7SUFDaUIsTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDaEQ7Ozs7Ozs7Ozs7O09BV0c7SUFDTyxPQUFPLENBQWlCO0lBRWxDLG9DQUFvQztJQUMxQixZQUFZLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEQ7Ozs7O09BS0c7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQsb0VBQW9FO0lBQ3BFLG9FQUFvRTtJQUNwRSxrRUFBa0U7SUFDbEUsc0VBQXNFO0lBQ3RFLGdEQUFnRDtJQUNoRCxxRUFBcUU7SUFDckUsa0VBQWtFO0lBQ2xFLHlDQUF5QztJQUV6Qzs7T0FFRztJQUNILFNBQVM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXRDLDZEQUE2RDtRQUM3RCxnRUFBZ0U7UUFDaEUsaUVBQWlFO1FBQ2pFLG9FQUFvRTtRQUNwRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUM7WUFDSiw4REFBOEQ7WUFDOUQsbURBQW1EO1lBQ25ELGlFQUFpRTtZQUNqRSxnQ0FBZ0M7WUFDaEMsRUFBRTtZQUNGLHNEQUFzRDtZQUN0RCxJQUFJLENBQUM7Z0JBQ0osTUFBTSxPQUFPLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDYixNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDeEIsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4RCxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJO3dCQUNyQixNQUFNLEVBQUUsU0FBUztxQkFDakIsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDckUsQ0FBQztZQUNGLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNkLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUNyRCxPQUFPLEVBQUUsU0FBUztvQkFDbEIsTUFBTSxFQUFFLFNBQVM7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEIseUNBQXlDLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQ2hJLENBQUM7WUFDSCxDQUFDO1lBRUQseURBQXlEO1lBQ3pELG1EQUFtRDtZQUNuRCx3REFBd0Q7WUFDeEQsOERBQThEO1lBQzlELHVDQUF1QztZQUN2QyxJQUFJLENBQUM7Z0JBQ0osTUFBTSxlQUFlLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDMUQsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3JFLENBQUM7b0JBQ0QsTUFBTSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRSxDQUFDO1lBQ0YsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLHNDQUFzQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUNoSSxDQUFDO1lBQ0gsQ0FBQztZQUVELGlFQUFpRTtZQUNqRSxxRUFBcUU7WUFDckUsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQztnQkFDSixhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixRQUFRLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzVGLENBQUM7WUFDRixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RyxDQUFDO1lBRUQseURBQXlEO1lBQ3pELGlFQUFpRTtZQUNqRSxJQUFJLENBQUM7Z0JBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9FLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFFRCx3REFBd0Q7WUFDeEQsOENBQThDO1lBQzlDLHVDQUF1QztZQUN2QyxJQUFJLENBQUM7Z0JBQ0osYUFBYSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkcsQ0FBQztZQUVELDBDQUEwQztZQUMxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUVsRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBRUQsZ0VBQWdFO1lBQ2hFLDZEQUE2RDtZQUM3RCw0REFBNEQ7WUFDNUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBMkIsQ0FBQztnQkFDcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNkLDhCQUE4QixNQUFNLENBQUMsS0FBSyxRQUFRLE9BQU8sQ0FBQyxRQUFRLGlCQUFpQixNQUFNLENBQUMsV0FBVyxhQUFhLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FDbkksQ0FBQztnQkFFRixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXBDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUMzQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFDO1lBRXpGLGlDQUFpQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDL0UsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDOUIsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBb0MsS0FBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakYsTUFBTSxLQUFLLENBQUM7UUFDYixDQUFDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDVCwrREFBK0Q7UUFDL0QsMkRBQTJEO1FBQzNELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUM7b0JBQ0osTUFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUiw4Q0FBOEM7Z0JBQy9DLENBQUM7WUFDRixDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsOENBQThDO1FBQzlDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSixNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBc0MsR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEYsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVrQixLQUFLLENBQUMsbUJBQW1CO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FDYixLQUFhLEVBQ2IsSUFBYSxFQUNiLElBTUM7UUFFRCwyREFBMkQ7UUFDM0QsZ0VBQWdFO1FBQ2hFLHFEQUFxRDtRQUNyRCxNQUFNLE9BQU8sR0FDWixJQUFJLENBQUMsT0FBTztZQUNaLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQXVCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2QsNkhBQTZILENBQzdILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhO1FBQ2hDLE1BQU0sT0FBTyxHQUNaLElBQUksQ0FBQyxPQUFPO1lBQ1osQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBdUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FDZCxrSUFBa0ksQ0FDbEksQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ08sS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQXlCO1FBQ2xFLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsbUNBQW1DLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDckIsQ0FBQztRQUVELGdFQUFnRTtRQUNoRSw4REFBOEQ7UUFDOUQsTUFBTSxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEYsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLE9BQU8sQ0FBQyxRQUFRLGdCQUFnQixDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDaEIsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE9BQXNCO1FBQ25ELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxPQUFPO2dCQUNOLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFFLFNBQW1CLENBQUMsQ0FBQyxDQUFFLFdBQXFCO2dCQUMvRCxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7YUFDbEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCO1FBQzNCLE1BQU0sU0FBUyxHQUEwQixFQUFFLENBQUM7UUFFNUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxNQUFNLGNBQWMsR0FBSSxRQUFrRSxDQUFDLE9BQU8sQ0FBQztZQUVuRyxJQUFJLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTNELElBQUksV0FBVyxLQUFLLFFBQVEsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUMvRCxTQUFTLENBQUMsSUFBSSxDQUFDO3dCQUNkLElBQUk7d0JBQ0osTUFBTSxFQUFFLGNBQWM7cUJBQ3RCLENBQUMsQ0FBQztnQkFDSixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQWMsRUFBRSxRQUE2QixFQUFFLE1BQXlCO1FBQ2pHLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFO1lBQ3RFLFdBQVcsRUFBRSx1QkFBdUI7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtZQUNyRSxXQUFXLEVBQUUscUJBQXFCO1NBQ2xDLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7WUFDdkUsV0FBVyxFQUFFLG9CQUFvQjtTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFVLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUM7Z0JBQ0osTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVoQyw2Q0FBNkM7Z0JBQzdDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTNELGlCQUFpQjtnQkFDakIsTUFBTSxHQUFHLEdBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFekUsaUNBQWlDO2dCQUNqQyxHQUFHLENBQUMsT0FBTyxHQUFHO29CQUNiLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87b0JBQ3BCLEtBQUssRUFBRSxFQUFFO29CQUNULE1BQU0sRUFBRTt3QkFDUCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7d0JBQzdCLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztxQkFDOUI7aUJBQzRCLENBQUM7Z0JBRS9CLG1DQUFtQztnQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO29CQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRztvQkFDdEIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNWLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDaEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO29CQUM5QixVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztvQkFDOUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO29CQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO29CQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO2lCQUNqQyxDQUFDO2dCQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLGtCQUFrQixLQUFLLFNBQVMsTUFBTSxDQUFDLEtBQUssYUFBYSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUNsRyxDQUFDO2dCQUVGLDZEQUE2RDtnQkFDN0QsMkRBQTJEO2dCQUMzRCxxREFBcUQ7Z0JBQ3JELDJEQUEyRDtnQkFDM0QsdURBQXVEO2dCQUN2RCx1REFBdUQ7Z0JBQ3ZELDRDQUE0QztnQkFDNUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFbkQsOENBQThDO2dCQUM5QyxJQUFJLFFBQXlCLENBQUM7Z0JBQzlCLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMxQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0QsQ0FBQztxQkFBTSxDQUFDO29CQUNQLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7Z0JBRUQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUU5QixzQkFBc0I7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFNUMsaUJBQWlCO2dCQUNqQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDakIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtvQkFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJO29CQUN0QyxPQUFPLEVBQUUsTUFBTTtpQkFDZixDQUFDLENBQUM7Z0JBRUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUUzRSx3QkFBd0I7Z0JBQ3hCLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNoQixNQUFNLFlBQVksR0FBSSxLQUFlLENBQUMsT0FBTyxDQUFDO2dCQUU5QywyREFBMkQ7Z0JBQzNELDZEQUE2RDtnQkFDN0QsMkRBQTJEO2dCQUMzRCwwREFBMEQ7Z0JBQzFELElBQUksS0FBSyxZQUFZLHNCQUFzQixFQUFFLENBQUM7b0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBRXRGLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNkLG9CQUFvQixLQUFLLFVBQVUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUc7d0JBQ2pGLGVBQWUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLGNBQWMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLHFCQUFxQixDQUM3RixDQUFDO29CQUVGLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQixPQUFPO2dCQUNSLENBQUM7Z0JBRUQsNkRBQTZEO2dCQUM3RCwyREFBMkQ7Z0JBQzNELDBEQUEwRDtnQkFDMUQsMERBQTBEO2dCQUMxRCw0QkFBNEI7Z0JBQzVCLElBQUksS0FBSyxZQUFZLGlCQUFpQixFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO29CQUV0RSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDZCxxQkFBcUIsS0FBSyxVQUFVLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJO3dCQUN6RixrQkFBa0IsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLGtDQUFrQyxDQUM5RSxDQUFDO29CQUVGLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQixPQUFPO2dCQUNSLENBQUM7Z0JBRUQsOERBQThEO2dCQUM5RCw0REFBNEQ7Z0JBQzVELDBEQUEwRDtnQkFDMUQsNkRBQTZEO2dCQUM3RCxnRUFBZ0U7Z0JBQ2hFLDBEQUEwRDtnQkFDMUQscUJBQXFCO2dCQUNyQixJQUFJLEtBQUssWUFBWSxxQkFBcUIsRUFBRSxDQUFDO29CQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQztvQkFFbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2QscUJBQXFCLEtBQUssU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSTt3QkFDL0QsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixhQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxzQkFBc0IsQ0FDbEcsQ0FBQztvQkFFRixhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDcEIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTt3QkFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO3dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksU0FBUzt3QkFDcEQsTUFBTSxFQUFFLFdBQVc7cUJBQ25CLENBQUMsQ0FBQztvQkFFSCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNyQyxPQUFPO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUVsRCxpQkFBaUI7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFjLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUV0RSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNqQiw0REFBNEQ7b0JBQzVELGlFQUFpRTtvQkFDakUseURBQXlEO29CQUN6RCw4REFBOEQ7b0JBQzlELE1BQU0sT0FBTyxHQUNaLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRO3dCQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUs7d0JBQ2QsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFROzRCQUNqQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDOzRCQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMvRCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDcEIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTt3QkFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO3dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksU0FBUzt3QkFDcEQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztxQkFDakMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNoQixPQUFPLEtBQUssb0JBQW9CLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxrQkFBa0IsU0FBUyxPQUFPLFlBQVksRUFBRSxDQUN0SCxDQUFDO29CQUVGLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDUCxzQ0FBc0M7b0JBQ3RDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO3dCQUNuQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO3dCQUN6QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7d0JBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxTQUFTO3FCQUNwRCxDQUFDLENBQUM7b0JBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLE9BQU8sS0FBSyw2QkFBNkIsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLGNBQWMsWUFBWSxFQUFFLEVBQ3BGLEtBQWUsQ0FBQyxLQUFLLENBQ3RCLENBQUM7b0JBRUYsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztZQUNGLENBQUM7b0JBQVMsQ0FBQztnQkFDVixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBWSxFQUFFLFNBQWlCO1FBQ2pFLE9BQU8sSUFBSSxPQUFPLENBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVkLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNYLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNoQixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDTyxnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsU0FBa0I7UUFDN0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxpQkFBaUI7UUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLGFBQWE7UUFDL0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya2VyVHJpZ2dlciAtIEJhY2tncm91bmQgam9iIHByb2Nlc3NpbmcgZm9yIEJsb2sgd29ya2Zsb3dzXG4gKlxuICogRXh0ZW5kcyBUcmlnZ2VyQmFzZSB0byBzdXBwb3J0IGxvbmctcnVubmluZyBiYWNrZ3JvdW5kIGpvYnM6XG4gKiAtIENvbmN1cnJlbmN5IGNvbnRyb2xzIChtYXggTiBjb25jdXJyZW50IGpvYnMpXG4gKiAtIFJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICogLSBKb2IgdGltZW91dHNcbiAqIC0gSm9iIHByaW9yaXR5IGFuZCBkZWxheSBzY2hlZHVsaW5nXG4gKiAtIERlYWQgbGV0dGVyIHF1ZXVlIHN1cHBvcnRcbiAqXG4gKiBQYXR0ZXJuOlxuICogMS4gbG9hZE5vZGVzKCkgLSBMb2FkIGF2YWlsYWJsZSBub2RlcyBpbnRvIE5vZGVNYXBcbiAqIDIuIGxvYWRXb3JrZmxvd3MoKSAtIExvYWQgd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzXG4gKiAzLiBsaXN0ZW4oKSAtIENvbm5lY3QgdG8gam9iIGJhY2tlbmQgYW5kIHN0YXJ0IHByb2Nlc3NpbmdcbiAqIDQuIEZvciBlYWNoIGpvYjpcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIGpvYiBkYXRhXG4gKiAgICAtIEV4ZWN1dGUgd29ya2Zsb3cgdmlhIHRoaXMucnVuKGN0eClcbiAqICAgIC0gQWNrIG9uIHN1Y2Nlc3MsIHJldHJ5IG9yIERMUSBvbiBmYWlsdXJlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBIZWxwZXJSZXNwb25zZSwgdHlwZSBXb3JrZXJUcmlnZ2VyT3B0cywgdHJ5UGFyc2VEdXJhdGlvbiB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHtcblx0dHlwZSBCbG9rU2VydmljZSxcblx0Q29uY3VycmVuY3lMaW1pdEVycm9yLFxuXHRDb25jdXJyZW5jeU1ldHJpY3MsXG5cdERlYm91bmNlQ29vcmRpbmF0b3IsXG5cdERlZmF1bHRMb2dnZXIsXG5cdERlZmVycmVkRGlzcGF0Y2hTaWduYWwsXG5cdHR5cGUgR2xvYmFsT3B0aW9ucyxcblx0SmFuaXRvcixcblx0Tm9kZU1hcCxcblx0UXVldWVFeHBpcmVkRXJyb3IsXG5cdFJ1blRyYWNrZXIsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcblx0Y3JlYXRlQ29uY3VycmVuY3lCYWNrZW5kLFxuXHRjcmVhdGVEZWJvdW5jZUJhY2tlbmQsXG59IGZyb20gXCJAYmxva2pzL3J1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAYmxva2pzL3NoYXJlZFwiO1xuaW1wb3J0IHsgdHlwZSBTcGFuLCBTcGFuU3RhdHVzQ29kZSwgbWV0cmljcywgdHJhY2UgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcblxuLyoqXG4gKiBKb2IgcmVjZWl2ZWQgZnJvbSB3b3JrZXIgcXVldWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJKb2Ige1xuXHQvKiogVW5pcXVlIGpvYiBJRCAqL1xuXHRpZDogc3RyaW5nO1xuXHQvKiogSm9iIGRhdGEgcGF5bG9hZCAqL1xuXHRkYXRhOiB1bmtub3duO1xuXHQvKiogSm9iIG1ldGFkYXRhIGhlYWRlcnMgKi9cblx0aGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0LyoqIFF1ZXVlIG5hbWUgdGhpcyBqb2IgYmVsb25ncyB0byAqL1xuXHRxdWV1ZTogc3RyaW5nO1xuXHQvKiogSm9iIHByaW9yaXR5IChoaWdoZXIgPSBtb3JlIGltcG9ydGFudCkgKi9cblx0cHJpb3JpdHk6IG51bWJlcjtcblx0LyoqIE51bWJlciBvZiBhdHRlbXB0cyBtYWRlIHNvIGZhciAqL1xuXHRhdHRlbXB0czogbnVtYmVyO1xuXHQvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyAqL1xuXHRtYXhSZXRyaWVzOiBudW1iZXI7XG5cdC8qKiBUaW1lc3RhbXAgd2hlbiBqb2Igd2FzIGNyZWF0ZWQgKi9cblx0Y3JlYXRlZEF0OiBEYXRlO1xuXHQvKiogRGVsYXkgYmVmb3JlIHByb2Nlc3NpbmcgKG1zKSAqL1xuXHRkZWxheT86IG51bWJlcjtcblx0LyoqIEpvYiB0aW1lb3V0IChtcykgKi9cblx0dGltZW91dD86IG51bWJlcjtcblx0LyoqIE9yaWdpbmFsIHJhdyBqb2IgZnJvbSBwcm92aWRlciAqL1xuXHRyYXc6IHVua25vd247XG5cdC8qKiBNYXJrIGpvYiBhcyBjb21wbGV0ZWQgKi9cblx0Y29tcGxldGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKiBNYXJrIGpvYiBhcyBmYWlsZWQgKG9wdGlvbmFsbHkgcmVxdWV1ZSkgKi9cblx0ZmFpbDogKGVycm9yOiBFcnJvciwgcmVxdWV1ZT86IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogV29ya2VyIGFkYXB0ZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50ZWQgYnkgZWFjaCBqb2IgYmFja2VuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckFkYXB0ZXIge1xuXHQvKiogUHJvdmlkZXIgbmFtZSAoZS5nLiwgXCJidWxsbXFcIiwgXCJpbi1tZW1vcnlcIikgKi9cblx0cmVhZG9ubHkgcHJvdmlkZXI6IHN0cmluZztcblxuXHQvKiogQ29ubmVjdCB0byB0aGUgam9iIGJhY2tlbmQgKi9cblx0Y29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBEaXNjb25uZWN0IGZyb20gdGhlIGpvYiBiYWNrZW5kICovXG5cdGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogU3RhcnQgcHJvY2Vzc2luZyBqb2JzIGZyb20gYSBxdWV1ZVxuXHQgKiBAcGFyYW0gY29uZmlnIFdvcmtlciB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGhhbmRsZXIgQ2FsbGJhY2sgZm9yIGVhY2ggam9iXG5cdCAqL1xuXHRwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEFkZCBhIGpvYiB0byBhIHF1ZXVlIChmb3IgcHJvZ3JhbW1hdGljIGRpc3BhdGNoaW5nKVxuXHQgKiBAcGFyYW0gcXVldWUgUXVldWUgbmFtZVxuXHQgKiBAcGFyYW0gZGF0YSBKb2IgcGF5bG9hZFxuXHQgKiBAcGFyYW0gb3B0cyBKb2Igb3B0aW9uc1xuXHQgKi9cblx0YWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+O1xuXG5cdC8qKiBTdG9wIHByb2Nlc3NpbmcgYSBzcGVjaWZpYyBxdWV1ZSAqL1xuXHRzdG9wUHJvY2Vzc2luZyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogQ2hlY2sgaWYgY29ubmVjdGVkICovXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG5cblx0LyoqIEhlYWx0aCBjaGVjayAqL1xuXHRoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG5cdC8qKiBHZXQgcXVldWUgc3RhdHMgKi9cblx0Z2V0UXVldWVTdGF0cyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZXJRdWV1ZVN0YXRzPjtcbn1cblxuLyoqXG4gKiBRdWV1ZSBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyUXVldWVTdGF0cyB7XG5cdC8qKiBOdW1iZXIgb2Ygam9icyB3YWl0aW5nIHRvIGJlIHByb2Nlc3NlZCAqL1xuXHR3YWl0aW5nOiBudW1iZXI7XG5cdC8qKiBOdW1iZXIgb2Ygam9icyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkICovXG5cdGFjdGl2ZTogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGNvbXBsZXRlZCBqb2JzICovXG5cdGNvbXBsZXRlZDogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGZhaWxlZCBqb2JzICovXG5cdGZhaWxlZDogbnVtYmVyO1xuXHQvKiogTnVtYmVyIG9mIGRlbGF5ZWQgam9icyAqL1xuXHRkZWxheWVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogV29ya2Zsb3cgbW9kZWwgd2l0aCB3b3JrZXIgdHJpZ2dlciBjb25maWd1cmF0aW9uXG4gKi9cbmludGVyZmFjZSBXb3JrZXJXb3JrZmxvd01vZGVsIHtcblx0cGF0aDogc3RyaW5nO1xuXHRjb25maWc6IHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0dmVyc2lvbjogc3RyaW5nO1xuXHRcdHRyaWdnZXI/OiB7XG5cdFx0XHR3b3JrZXI/OiBXb3JrZXJUcmlnZ2VyT3B0cztcblx0XHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdFx0fTtcblx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHR9O1xufVxuXG4vKipcbiAqIFdvcmtlclRyaWdnZXIgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB3b3JrZXItYmFzZWQgdHJpZ2dlcnNcbiAqXG4gKiBQcm92aWRlcyBiYWNrZ3JvdW5kIGpvYiBwcm9jZXNzaW5nIHdpdGg6XG4gKiAtIENvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeSBwZXIgcXVldWVcbiAqIC0gQXV0b21hdGljIHJldHJpZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gKiAtIEpvYiB0aW1lb3V0cyB3aXRoIGF1dG9tYXRpYyBmYWlsdXJlXG4gKiAtIFByaW9yaXR5LWJhc2VkIGpvYiBvcmRlcmluZ1xuICogLSBEZWxheWVkIGpvYiBzY2hlZHVsaW5nXG4gKiAtIFF1ZXVlIHN0YXRpc3RpY3MgYW5kIG1vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdvcmtlclRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyQmFzZSB7XG5cdHByb3RlY3RlZCBub2RlTWFwOiBHbG9iYWxPcHRpb25zID0ge30gYXMgR2xvYmFsT3B0aW9ucztcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNlciA9IHRyYWNlLmdldFRyYWNlcihcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgfHwgXCJ0cmlnZ2VyLXdvcmtlci13b3JrZmxvd1wiLFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfVkVSU0lPTiB8fCBcIjAuMC4xXCIsXG5cdCk7XG5cdHByb3RlY3RlZCByZWFkb25seSBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuXHQvKipcblx0ICogdjAuNyBQUiA1IOKAlCB0aGUgXCJkZWZhdWx0XCIgYWRhcHRlciwgdXNlZCB3aGVuIGEgd29ya2Zsb3cnc1xuXHQgKiBgdHJpZ2dlci53b3JrZXIucHJvdmlkZXJgIGZpZWxkIGlzIG9taXR0ZWQgQU5EIHRoZVxuXHQgKiBgQkxPS19XT1JLRVJfQURBUFRFUmAgZW52IHZhciBpcyB1bnNldC4gU3ViY2xhc3NlcyBNQVkgc2V0IHRoaXNcblx0ICogZm9yIGJhY2stY29tcGF0IHdpdGggdGhlIHByZS12MC43IHNpbmdsZS1hZGFwdGVyIHBhdHRlcm5cblx0ICogKGBjbGFzcyBXb3JrZXJTZXJ2ZXIgZXh0ZW5kcyBXb3JrZXJUcmlnZ2VyIHsgcHJvdGVjdGVkIGFkYXB0ZXIgPSBuZXcgTkFUU1dvcmtlckFkYXB0ZXIoKSB9YCkuXG5cdCAqXG5cdCAqIFdoZW4gdW5zZXQgQU5EIG5vIHBlci13b3JrZmxvdyBwcm92aWRlciBpcyBzcGVjaWZpZWQsIHRoZSBmYWN0b3J5XG5cdCAqIGZhbGxzIGJhY2sgdG8gYGluLW1lbW9yeWAuIFRoZSBmYWN0b3J5IHBvb2wgKGBhZGFwdGVycy9mYWN0b3J5LnRzYClcblx0ICogdHJhY2tzIG9uZSBjb25uZWN0ZWQgYWRhcHRlciBwZXIgcHJvdmlkZXIgc28gbXVsdGlwbGUgd29ya2Zsb3dzXG5cdCAqIHdpdGggdGhlIHNhbWUgcHJvdmlkZXIgc2hhcmUgYSBzaW5nbGUgYnJva2VyIGNvbm5lY3Rpb24uXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlcj86IFdvcmtlckFkYXB0ZXI7XG5cblx0LyoqIEFjdGl2ZSBxdWV1ZXMgYmVpbmcgcHJvY2Vzc2VkICovXG5cdHByb3RlY3RlZCBhY3RpdmVRdWV1ZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDUg4oCUIGFkYXB0ZXIgcG9vbCwga2V5ZWQgYnkgcHJvdmlkZXIgbmFtZS4gUG9wdWxhdGVkIGxhemlseVxuXHQgKiBpbnNpZGUgYGxpc3RlbigpYCBhcyB3b3JrZmxvd3MgYXJlIG1hdGNoZWQgdG8gcHJvdmlkZXJzLiBFYWNoXG5cdCAqIGFkYXB0ZXIgaXMgY29ubmVjdGVkIG9uY2UgYW5kIHJldXNlZCBhY3Jvc3Mgd29ya2Zsb3dzIHRoYXQgc2hhcmVcblx0ICogaXRzIHByb3ZpZGVyLiBEcmFpbmVkIGluIGBzdG9wKClgLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXJQb29sOiBNYXA8c3RyaW5nLCBXb3JrZXJBZGFwdGVyPiA9IG5ldyBNYXAoKTtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHQvLyBDb25zdHJ1Y3RvciByZW1vdmVkIGluIHYwLjYuMyDigJQgcHJlLWZpeCBpdCBjYWxsZWQgYGxvYWROb2RlcygpYCArXG5cdC8vIGBsb2FkV29ya2Zsb3dzKClgLCBidXQgc3ViY2xhc3NlcyB1c2UgY2xhc3MtZmllbGQgYXNzaWdubWVudHMgZm9yXG5cdC8vIGBub2Rlc2AgLyBgd29ya2Zsb3dzYCAodGhlIGNhbm9uaWNhbCBUeXBlU2NyaXB0IHBhdHRlcm4pLiBUaG9zZVxuXHQvLyBmaWVsZHMgcnVuIEFGVEVSIHN1cGVyKCksIHNvIGFjY2Vzc2luZyBgdGhpcy5ub2Rlc2AgZnJvbSB0aGUgcGFyZW50XG5cdC8vIGNvbnN0cnVjdG9yIHJlYWQgYHVuZGVmaW5lZGAgYW5kIGNyYXNoZWQgd2l0aFxuXHQvLyBgVHlwZUVycm9yOiB1bmRlZmluZWQgaXMgbm90IGFuIG9iamVjdCAoT2JqZWN0LmtleXModGhpcy5ub2RlcykpYC5cblx0Ly8gVGhlIHJlZ2lzdHJ5IGluaXQgbm93IGhhcHBlbnMgYXQgdGhlIHN0YXJ0IG9mIGBsaXN0ZW4oKWAsIGFmdGVyXG5cdC8vIHRoZSBzdWJjbGFzcydzIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQuXG5cblx0LyoqXG5cdCAqIExvYWQgbm9kZXMgaW50byB0aGUgbm9kZSBtYXBcblx0ICovXG5cdGxvYWROb2RlcygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAubm9kZXMgPSBuZXcgTm9kZU1hcCgpO1xuXHRcdGNvbnN0IG5vZGVLZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2Ygbm9kZUtleXMpIHtcblx0XHRcdHRoaXMubm9kZU1hcC5ub2Rlcy5hZGROb2RlKGtleSwgdGhpcy5ub2Rlc1trZXldKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCB3b3JrZmxvd3MgaW50byB0aGUgd29ya2Zsb3cgbWFwXG5cdCAqL1xuXHRsb2FkV29ya2Zsb3dzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC53b3JrZmxvd3MgPSB0aGlzLndvcmtmbG93cztcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCB0aGUgd29ya2VyIHByb2Nlc3NvciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHQvLyBQb3B1bGF0ZSB0aGUgdHJpZ2dlcidzIG5vZGUgKyB3b3JrZmxvdyByZWdpc3RyaWVzIGZyb20gdGhlXG5cdFx0Ly8gc3ViY2xhc3MncyBgbm9kZXNgIC8gYHdvcmtmbG93c2AgZmllbGRzLiB2MC42LjMgZml4IOKAlCBwcmUtZml4XG5cdFx0Ly8gdGhlc2UgY2FsbHMgbGl2ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBjcmFzaGVkIGJlY2F1c2UgY2xhc3Ncblx0XHQvLyBmaWVsZHMgaGF2ZW4ndCBydW4geWV0IGF0IHN1cGVyLWNvbnN0cnVjdG9yIHRpbWUuIFNlZSB0aGUgY29tbWVudFxuXHRcdC8vIHdoZXJlIHRoZSBvbGQgY29uc3RydWN0b3IgdXNlZCB0byBsaXZlIGZvciB0aGUgZnVsbCByZWFzb24uXG5cdFx0dGhpcy5sb2FkTm9kZXMoKTtcblx0XHR0aGlzLmxvYWRXb3JrZmxvd3MoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBUaWVyIDIgIzYgZm9sbG93LXVwIMK3IGluc3RhbGwgdGhlIGNyb3NzLXByb2Nlc3MgY29uY3VycmVuY3lcblx0XHRcdC8vIGJhY2tlbmQgKE5BVFMgS1YpIHdoZW4gdGhlIG9wZXJhdG9yIG9wdGVkIGluIHZpYVxuXHRcdFx0Ly8gYEJMT0tfQ09OQ1VSUkVOQ1lfQkFDS0VORD1uYXRzLWt2YC4gRGVmYXVsdCBudWxsIHByZXNlcnZlcyB0aGVcblx0XHRcdC8vIGV4aXN0aW5nIGluLXByb2Nlc3MgYmVoYXZpb3IuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gUFIgMyBEMSDigJQgcmVjb3JkIGluc3RhbGwgYXR0ZW1wdHMgdmlhIE9UZWwgY291bnRlci5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGJhY2tlbmQgPSBjcmVhdGVDb25jdXJyZW5jeUJhY2tlbmQoKTtcblx0XHRcdFx0aWYgKGJhY2tlbmQpIHtcblx0XHRcdFx0XHRhd2FpdCBiYWNrZW5kLmNvbm5lY3QoKTtcblx0XHRcdFx0XHRSdW5UcmFja2VyLmdldEluc3RhbmNlKCkuc2V0Q29uY3VycmVuY3lCYWNrZW5kKGJhY2tlbmQpO1xuXHRcdFx0XHRcdENvbmN1cnJlbmN5TWV0cmljcy5nZXRJbnN0YW5jZSgpLnJlY29yZEJhY2tlbmRJbnN0YWxsKHtcblx0XHRcdFx0XHRcdGJhY2tlbmQ6IGJhY2tlbmQubmFtZSxcblx0XHRcdFx0XHRcdHN0YXR1czogXCJzdWNjZXNzXCIsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBbY29uY3VycmVuY3ldIGJhY2tlbmQgaW5zdGFsbGVkOiAke2JhY2tlbmQubmFtZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdENvbmN1cnJlbmN5TWV0cmljcy5nZXRJbnN0YW5jZSgpLnJlY29yZEJhY2tlbmRJbnN0YWxsKHtcblx0XHRcdFx0XHRiYWNrZW5kOiBcInVua25vd25cIixcblx0XHRcdFx0XHRzdGF0dXM6IFwiZmFpbHVyZVwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFx0YFtjb25jdXJyZW5jeV0gYmFja2VuZCBpbnN0YWxsIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9OyBmYWxsaW5nIGJhY2sgdG8gaW4tcHJvY2VzcyBiZWhhdmlvcmAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpZXIgQyAjMSDCtyBpbnN0YWxsIHRoZSBjcm9zcy1wcm9jZXNzIGRlYm91bmNlIGJhY2tlbmRcblx0XHRcdC8vIChOQVRTIEtWIC8gUmVkaXMpIHdoZW4gdGhlIG9wZXJhdG9yIG9wdGVkIGluIHZpYVxuXHRcdFx0Ly8gYEJMT0tfREVCT1VOQ0VfQkFDS0VORGAuIERlZmF1bHQgdW5zZXQgPSB0aGUgZXhpc3Rpbmdcblx0XHRcdC8vIGluLXByb2Nlc3MgYmVoYXZpb3IgaXMgcHJlc2VydmVkLiBPbiBjb25uZWN0IGZhaWx1cmUsIGxvZyArXG5cdFx0XHQvLyBmYWxsIGJhY2sgdG8gaW4tbWVtb3J5IGNvb3JkaW5hdGlvbi5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRlYm91bmNlQmFja2VuZCA9IGNyZWF0ZURlYm91bmNlQmFja2VuZCgpO1xuXHRcdFx0XHRpZiAoZGVib3VuY2VCYWNrZW5kKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGVhc2VSYXcgPSBwcm9jZXNzLmVudi5CTE9LX0RFQk9VTkNFX09XTkVSX0xFQVNFX01TO1xuXHRcdFx0XHRcdGlmIChsZWFzZVJhdyAmJiAvXlxcZCskLy50ZXN0KGxlYXNlUmF3KSkge1xuXHRcdFx0XHRcdFx0RGVib3VuY2VDb29yZGluYXRvci5nZXRJbnN0YW5jZSgpLnNldE93bmVyTGVhc2VNcyhOdW1iZXIobGVhc2VSYXcpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgZGVib3VuY2VCYWNrZW5kLmNvbm5lY3QoKTtcblx0XHRcdFx0XHREZWJvdW5jZUNvb3JkaW5hdG9yLmdldEluc3RhbmNlKCkuc2V0QmFja2VuZChkZWJvdW5jZUJhY2tlbmQpO1xuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgW2RlYm91bmNlXSBiYWNrZW5kIGluc3RhbGxlZDogJHtkZWJvdW5jZUJhY2tlbmQubmFtZX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcdGBbZGVib3VuY2VdIGJhY2tlbmQgaW5zdGFsbCBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfTsgZmFsbGluZyBiYWNrIHRvIGluLW1lbW9yeSBjb29yZGluYXRpb25gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaWVyIDIgcXVpY2std2lucyBmb2xsb3ctdXAgwrcgaW5zdGFsbCBjcmFzaCBoYW5kbGVycyArIHJlY292ZXJcblx0XHRcdC8vIG9ycGhhbmVkIHJ1bnMgZnJvbSBhIHByZXZpb3VzIChkZWFkKSBwcm9jZXNzLiBJZGVtcG90ZW50ICsgb3B0LW91dFxuXHRcdFx0Ly8gdmlhIGBCTE9LX0NSQVNIX0FVVE9GTElQX0RJU0FCTEVEPTFgLlxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0V29ya2VyVHJpZ2dlci5pbnN0YWxsQ3Jhc2hIYW5kbGVycyh0aGlzLmxvZ2dlcik7XG5cdFx0XHRcdGNvbnN0IG9ycGhhbmVkID0gV29ya2VyVHJpZ2dlci5yZWNvdmVyT3JwaGFuZWRSdW5zKHVuZGVmaW5lZCwgdGhpcy5sb2dnZXIpO1xuXHRcdFx0XHRpZiAob3JwaGFuZWQgPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBbY3Jhc2gtYXV0b2ZsaXBdIGZsaXBwZWQgJHtvcnBoYW5lZH0gb3JwaGFuZWQgcnVuKHMpIHRvIGNyYXNoZWQgb24gYm9vdGApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYFtjcmFzaC1hdXRvZmxpcF0gc2V0dXAgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIGZvbGxvdy11cCDCtyBzdGFydCB0aGUgcGVyaW9kaWMgc3RvcmFnZSBqYW5pdG9yLlxuXHRcdFx0Ly8gSWRlbXBvdGVudCAoc2luZ2xldG9uKTsgb3B0LW91dCB2aWEgYEJMT0tfSkFOSVRPUl9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdEphbml0b3IuZ2V0SW5zdGFuY2UoUnVuVHJhY2tlci5nZXRJbnN0YW5jZSgpLmdldFN0b3JlKCksIHRoaXMubG9nZ2VyKS5zdGFydCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbamFuaXRvcl0gc2V0dXAgZmFpbGVkOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGllciAyIGZvbGxvdy11cCDCtyBpbnN0YWxsIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsZXJzXG5cdFx0XHQvLyAoU0lHVEVSTSAvIFNJR0lOVCkuIElkZW1wb3RlbnQ7IG9wdC1vdXQgdmlhXG5cdFx0XHQvLyBgQkxPS19HUkFDRUZVTF9TSFVURE9XTl9ESVNBQkxFRD0xYC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdFdvcmtlclRyaWdnZXIuaW5zdGFsbFNodXRkb3duSGFuZGxlcnModGhpcywgdGhpcy5sb2dnZXIpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbc2h1dGRvd25dIHNldHVwIGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZpbmQgYWxsIHdvcmtmbG93cyB3aXRoIHdvcmtlciB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3Qgd29ya2VyV29ya2Zsb3dzID0gdGhpcy5nZXRXb3JrZXJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHdvcmtlcldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggd29ya2VyIHRyaWdnZXJzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHByb2Nlc3NpbmcgZWFjaCBxdWV1ZSwgZGlzcGF0Y2hpbmcgdG8gdGhlIHJpZ2h0IGFkYXB0ZXJcblx0XHRcdC8vIGJhc2VkIG9uIHRoZSB3b3JrZmxvdydzIGBwcm92aWRlcmAgZmllbGQgKHdpdGggYmFjay1jb21wYXRcblx0XHRcdC8vIGZhbGxiYWNrIHRvIGB0aGlzLmFkYXB0ZXJgIHdoZW4gc3ViY2xhc3NlcyBzdGlsbCBzZXQgaXQpLlxuXHRcdFx0Zm9yIChjb25zdCB3b3JrZmxvdyBvZiB3b3JrZXJXb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LndvcmtlciBhcyBXb3JrZXJUcmlnZ2VyT3B0cztcblx0XHRcdFx0Y29uc3QgYWRhcHRlciA9IGF3YWl0IHRoaXMucmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWcpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN0YXJ0aW5nIHdvcmtlciBmb3IgcXVldWU6ICR7Y29uZmlnLnF1ZXVlfSB2aWEgJHthZGFwdGVyLnByb3ZpZGVyfSAoY29uY3VycmVuY3k9JHtjb25maWcuY29uY3VycmVuY3l9LCByZXRyaWVzPSR7Y29uZmlnLnJldHJpZXN9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGhpcy5hY3RpdmVRdWV1ZXMuYWRkKGNvbmZpZy5xdWV1ZSk7XG5cblx0XHRcdFx0YXdhaXQgYWRhcHRlci5wcm9jZXNzKGNvbmZpZywgYXN5bmMgKGpvYikgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlSm9iKGpvYiwgd29ya2Zsb3csIGNvbmZpZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFdvcmtlciB0cmlnZ2VyIHN0YXJ0ZWQuIFByb2Nlc3NpbmcgJHt3b3JrZXJXb3JrZmxvd3MubGVuZ3RofSBxdWV1ZShzKWApO1xuXG5cdFx0XHQvLyBFbmFibGUgSE1SIGluIGRldmVsb3BtZW50IG1vZGVcblx0XHRcdGlmIChwcm9jZXNzLmVudi5CTE9LX0hNUiA9PT0gXCJ0cnVlXCIgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVuYWJsZUhvdFJlbG9hZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5lbmRDb3VudGVyKHN0YXJ0VGltZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc3RhcnQgd29ya2VyIHRyaWdnZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3AgYWxsIHdvcmtlcnMgYW5kIGRpc2Nvbm5lY3Rcblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gU3RvcCBlYWNoIHF1ZXVlIG9uIGl0cyBvd25pbmcgYWRhcHRlciDigJQgYWRhcHRlcnMgYXJlIHRyYWNrZWRcblx0XHQvLyBpbiB0aGUgcG9vbCBzbyBtdWx0aS1wcm92aWRlciB3b3JrZXJzIGFsbCBkcmFpbiBjbGVhbmx5LlxuXHRcdGZvciAoY29uc3QgcXVldWUgb2YgdGhpcy5hY3RpdmVRdWV1ZXMpIHtcblx0XHRcdGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgYWRhcHRlci5zdG9wUHJvY2Vzc2luZyhxdWV1ZSk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8qIHN3YWxsb3cg4oCUIGFkYXB0ZXIgbWF5IG5vdCBvd24gdGhpcyBxdWV1ZSAqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdFx0dGhpcy5hY3RpdmVRdWV1ZXMuY2xlYXIoKTtcblx0XHQvLyBEaXNjb25uZWN0IGV2ZXJ5IGFkYXB0ZXIgd2UgZXZlciBjb25uZWN0ZWQuXG5cdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbYmxva11bd29ya2VyXSBkaXNjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmFkYXB0ZXJQb29sLmNsZWFyKCk7XG5cdFx0dGhpcy5kZXN0cm95TW9uaXRvcmluZygpO1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIldvcmtlciB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBXb3JrZXIgd29ya2Zsb3cgY2hhbmdlZCwgcmVsb2FkaW5nLi4uXCIpO1xuXHRcdGF3YWl0IHRoaXMud2FpdEZvckluRmxpZ2h0UmVxdWVzdHMoKTtcblx0XHRhd2FpdCB0aGlzLnN0b3AoKTtcblx0XHR0aGlzLmxvYWRXb3JrZmxvd3MoKTtcblx0XHRhd2FpdCB0aGlzLmxpc3RlbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BhdGNoIGEgam9iIHRvIGEgd29ya2VyIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBkaXNwYXRjaChcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHtcblx0XHRcdHByaW9yaXR5PzogbnVtYmVyO1xuXHRcdFx0ZGVsYXk/OiBudW1iZXI7XG5cdFx0XHRyZXRyaWVzPzogbnVtYmVyO1xuXHRcdFx0dGltZW91dD86IG51bWJlcjtcblx0XHRcdGpvYklkPzogc3RyaW5nO1xuXHRcdH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Ly8gQmFjay1jb21wYXQ6IHdoZW4gYSBzdWJjbGFzcyBzZXQgYHRoaXMuYWRhcHRlcmAsIHVzZSBpdC5cblx0XHQvLyBPdGhlcndpc2UgZGlzcGF0Y2ggdmlhIHRoZSBmaXJzdCBwb29sIGFkYXB0ZXIg4oCUIHR5cGljYWxseSB0aGVcblx0XHQvLyBvbmx5IG9uZSB3aGVuIGEgcHJvY2VzcyBvd25zIG9uZSB0cmlnZ2VyIHdvcmtmbG93LlxuXHRcdGNvbnN0IGFkYXB0ZXIgPVxuXHRcdFx0dGhpcy5hZGFwdGVyID8/XG5cdFx0XHQodGhpcy5hZGFwdGVyUG9vbC5zaXplID4gMCA/ICh0aGlzLmFkYXB0ZXJQb29sLnZhbHVlcygpLm5leHQoKS52YWx1ZSBhcyBXb3JrZXJBZGFwdGVyKSA6IHVuZGVmaW5lZCk7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFwiW2Jsb2tdW3dvcmtlcl0gZGlzcGF0Y2goKSBjYWxsZWQgYmVmb3JlIGFueSBhZGFwdGVyIGlzIGNvbm5lY3RlZC4gQ2FsbCBsaXN0ZW4oKSBmaXJzdCwgb3Igc2V0IHRoaXMuYWRhcHRlciBvbiB0aGUgc3ViY2xhc3MuXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYWRhcHRlci5hZGRKb2IocXVldWUsIGRhdGEsIG9wdHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBzdGF0aXN0aWNzIGZvciBhIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRjb25zdCBhZGFwdGVyID1cblx0XHRcdHRoaXMuYWRhcHRlciA/P1xuXHRcdFx0KHRoaXMuYWRhcHRlclBvb2wuc2l6ZSA+IDAgPyAodGhpcy5hZGFwdGVyUG9vbC52YWx1ZXMoKS5uZXh0KCkudmFsdWUgYXMgV29ya2VyQWRhcHRlcikgOiB1bmRlZmluZWQpO1xuXHRcdGlmICghYWRhcHRlcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcIltibG9rXVt3b3JrZXJdIGdldFF1ZXVlU3RhdHMoKSBjYWxsZWQgYmVmb3JlIGFueSBhZGFwdGVyIGlzIGNvbm5lY3RlZC4gQ2FsbCBsaXN0ZW4oKSBmaXJzdCwgb3Igc2V0IHRoaXMuYWRhcHRlciBvbiB0aGUgc3ViY2xhc3MuXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYWRhcHRlci5nZXRRdWV1ZVN0YXRzKHF1ZXVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgbGlzdCBvZiBhY3RpdmUgcXVldWVzXG5cdCAqL1xuXHRnZXRBY3RpdmVRdWV1ZXMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlUXVldWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDUg4oCUIHBpY2sgdGhlIGFkYXB0ZXIgZm9yIGEgd29ya2Zsb3cncyBgcHJvdmlkZXJgIGZpZWxkLlxuXHQgKlxuXHQgKiBSZXNvbHV0aW9uIG9yZGVyOlxuXHQgKiAgIDEuIFN1YmNsYXNzLXNldCBgdGhpcy5hZGFwdGVyYCAoYmFjay1jb21wYXQ6IHByZS12MC43IHBhdHRlcm5cblx0ICogICAgICB3aGVyZSBvbmUgcHJvY2VzcyBiaW5kcyB0byBvbmUgYWRhcHRlciBhdCBjb25zdHJ1Y3Rpb24gdGltZSkuXG5cdCAqICAgMi4gUGVyLXdvcmtmbG93IGBwcm92aWRlcmAgZmllbGQsIGxvb2tlZCB1cCB2aWEgdGhlIGZhY3RvcnkuXG5cdCAqICAgMy4gYEJMT0tfV09SS0VSX0FEQVBURVJgIGVudiB2YXIuXG5cdCAqICAgNC4gYGluLW1lbW9yeWAgZmFsbGJhY2suXG5cdCAqXG5cdCAqIEFkYXB0ZXJzIGFyZSBjb25uZWN0ZWQgb24gZmlyc3QgdXNlIGFuZCBwb29sZWQgcGVyIHByb3ZpZGVyIHNvXG5cdCAqIG11bHRpcGxlIHdvcmtmbG93cyBzaGFyaW5nIGEgcHJvdmlkZXIgc2hhcmUgb25lIGJyb2tlclxuXHQgKiBjb25uZWN0aW9uLiBIZWFsdGgtZGVwZW5kZW5jeSByZWdpc3RyYXRpb24gYWxzbyBoYXBwZW5zIGhlcmUgc29cblx0ICogZWFjaCBwcm92aWRlciBpcyB0cmFja2VkIGluZGl2aWR1YWxseSBpbiBgL2hlYWx0aGAuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzKTogUHJvbWlzZTxXb3JrZXJBZGFwdGVyPiB7XG5cdFx0Ly8gU3ViY2xhc3Mgb3ZlcnJpZGUgd2lucyBmb3IgYmFjay1jb21wYXQuXG5cdFx0aWYgKHRoaXMuYWRhcHRlcikge1xuXHRcdFx0aWYgKCF0aGlzLmFkYXB0ZXIuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gd29ya2VyIHN5c3RlbSAoc3ViY2xhc3MgYWRhcHRlcilgKTtcblx0XHRcdFx0dGhpcy5yZWdpc3RlckFkYXB0ZXJIZWFsdGgodGhpcy5hZGFwdGVyKTtcblx0XHRcdH1cblx0XHRcdC8vIFBvb2wtdHJhY2sgc28gc3RvcCgpIGNhbiBkcmFpbiBpdC5cblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHRoaXMuYWRhcHRlci5wcm92aWRlciwgdGhpcy5hZGFwdGVyKTtcblx0XHRcdHJldHVybiB0aGlzLmFkYXB0ZXI7XG5cdFx0fVxuXG5cdFx0Ly8gTGF6eS1pbXBvcnQgdGhlIGZhY3Rvcnkgc28gdGhlIHdvcmtlciBwYWNrYWdlIGRvZXNuJ3QgcHVsbCBpblxuXHRcdC8vIGV2ZXJ5IGFkYXB0ZXIgb24gaW1wb3J0IOKAlCBvbmx5IHRoZSBvbmVzIGFjdHVhbGx5IGV4ZXJjaXNlZC5cblx0XHRjb25zdCB7IHJlc29sdmVQcm92aWRlciwgY3JlYXRlV29ya2VyQWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hZGFwdGVycy9mYWN0b3J5XCIpO1xuXHRcdGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZy5wcm92aWRlcik7XG5cdFx0bGV0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJQb29sLmdldChwcm92aWRlcik7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHRhZGFwdGVyID0gY3JlYXRlV29ya2VyQWRhcHRlcihwcm92aWRlcik7XG5cdFx0XHRhd2FpdCBhZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7YWRhcHRlci5wcm92aWRlcn0gd29ya2VyIHN5c3RlbWApO1xuXHRcdFx0dGhpcy5yZWdpc3RlckFkYXB0ZXJIZWFsdGgoYWRhcHRlcik7XG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldChwcm92aWRlciwgYWRhcHRlcik7XG5cdFx0fVxuXHRcdHJldHVybiBhZGFwdGVyO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckFkYXB0ZXJIZWFsdGgoYWRhcHRlcjogV29ya2VyQWRhcHRlcik6IHZvaWQge1xuXHRcdHRoaXMucmVnaXN0ZXJIZWFsdGhEZXBlbmRlbmN5KGB3b3JrZXItJHthZGFwdGVyLnByb3ZpZGVyfWAsIGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IGhlYWx0aHkgPSBhd2FpdCBhZGFwdGVyLmhlYWx0aENoZWNrKCk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdGF0dXM6IGhlYWx0aHkgPyAoXCJoZWFsdGh5XCIgYXMgY29uc3QpIDogKFwidW5oZWFsdGh5XCIgYXMgY29uc3QpLFxuXHRcdFx0XHRsYXN0Q2hlY2tlZDogRGF0ZS5ub3coKSxcblx0XHRcdFx0bWVzc2FnZTogaGVhbHRoeSA/IFwiQ29ubmVjdGVkXCIgOiBcIkNvbm5lY3Rpb24gbG9zdFwiLFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgd29ya2VyIHRyaWdnZXJzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0V29ya2VyV29ya2Zsb3dzKCk6IFdvcmtlcldvcmtmbG93TW9kZWxbXSB7XG5cdFx0Y29uc3Qgd29ya2Zsb3dzOiBXb3JrZXJXb3JrZmxvd01vZGVsW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgW3BhdGgsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm5vZGVNYXAud29ya2Zsb3dzIHx8IHt9KSkge1xuXHRcdFx0Y29uc3Qgd29ya2Zsb3dDb25maWcgPSAod29ya2Zsb3cgYXMgdW5rbm93biBhcyB7IF9jb25maWc6IFdvcmtlcldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblxuXHRcdFx0aWYgKHdvcmtmbG93Q29uZmlnPy50cmlnZ2VyKSB7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJUeXBlID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcudHJpZ2dlcilbMF07XG5cblx0XHRcdFx0aWYgKHRyaWdnZXJUeXBlID09PSBcIndvcmtlclwiICYmIHdvcmtmbG93Q29uZmlnLnRyaWdnZXIud29ya2VyKSB7XG5cdFx0XHRcdFx0d29ya2Zsb3dzLnB1c2goe1xuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gd29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBpbmNvbWluZyBqb2Jcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVKb2Ioam9iOiBXb3JrZXJKb2IsIHdvcmtmbG93OiBXb3JrZXJXb3JrZmxvd01vZGVsLCBjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgam9iSWQgPSBqb2IuaWQgfHwgdXVpZCgpO1xuXHRcdGNvbnN0IGRlZmF1bHRNZXRlciA9IG1ldHJpY3MuZ2V0TWV0ZXIoXCJkZWZhdWx0XCIpO1xuXHRcdGNvbnN0IHdvcmtlckpvYnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX3Byb2Nlc3NlZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9icyBwcm9jZXNzZWRcIixcblx0XHR9KTtcblx0XHRjb25zdCB3b3JrZXJFcnJvcnMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcIndvcmtlcl9qb2JzX2ZhaWxlZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9iIGZhaWx1cmVzXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgd29ya2VyUmV0cmllcyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwid29ya2VyX2pvYnNfcmV0cmllZFwiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJXb3JrZXIgam9iIHJldHJpZXNcIixcblx0XHR9KTtcblxuXHRcdGF3YWl0IHRoaXMudHJhY2VyLnN0YXJ0QWN0aXZlU3Bhbihgd29ya2VyOiR7Y29uZmlnLnF1ZXVlfWAsIGFzeW5jIChzcGFuOiBTcGFuKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB3b3JrZmxvd1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IGN0eDogQ29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQsIHdvcmtmbG93LnBhdGgsIGpvYklkKTtcblxuXHRcdFx0XHQvLyBQb3B1bGF0ZSByZXF1ZXN0IHdpdGggam9iIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogam9iLmRhdGEsXG5cdFx0XHRcdFx0aGVhZGVyczogam9iLmhlYWRlcnMsXG5cdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRcdFx0cXVldWU6IGpvYi5xdWV1ZSxcblx0XHRcdFx0XHRcdGpvYklkOiBqb2IuaWQsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgd29ya2VyIG1ldGFkYXRhIGluIGNvbnRleHRcblx0XHRcdFx0aWYgKCFjdHgudmFycykgY3R4LnZhcnMgPSB7fTtcblx0XHRcdFx0Y3R4LnZhcnMuX3dvcmtlcl9qb2IgPSB7XG5cdFx0XHRcdFx0aWQ6IGpvYi5pZCxcblx0XHRcdFx0XHRxdWV1ZTogam9iLnF1ZXVlLFxuXHRcdFx0XHRcdGF0dGVtcHRzOiBTdHJpbmcoam9iLmF0dGVtcHRzKSxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBTdHJpbmcoam9iLm1heFJldHJpZXMpLFxuXHRcdFx0XHRcdHByaW9yaXR5OiBTdHJpbmcoam9iLnByaW9yaXR5KSxcblx0XHRcdFx0XHRjcmVhdGVkQXQ6IGpvYi5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSxcblx0XHRcdFx0XHRkZWxheTogU3RyaW5nKGpvYi5kZWxheSA/PyAwKSxcblx0XHRcdFx0XHR0aW1lb3V0OiBTdHJpbmcoam9iLnRpbWVvdXQgPz8gMCksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFByb2Nlc3Npbmcgam9iICR7am9iSWR9IGZyb20gJHtjb25maWcucXVldWV9IChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gdjAuNiDCtyBhcHBseSB0aGUgbWVyZ2VkIG1pZGRsZXdhcmUgY2hhaW4gKHByb2Nlc3MtZ2xvYmFsIOKGklxuXHRcdFx0XHQvLyB3b3JrZmxvdy1sZXZlbCDihpIgdHJpZ2dlci1sZXZlbCkgb24gdGhlIHNhbWUgY3R4IHRoZSBtYWluXG5cdFx0XHRcdC8vIHdvcmtmbG93IHdpbGwgc2VlLiBTdGF0ZSBtdXRhdGlvbnMgZnJvbSBtaWRkbGV3YXJlXG5cdFx0XHRcdC8vIChlLmcuIGN0eC5zdGF0ZS5pZGVudGl0eSkgY2FycnkgZm9yd2FyZC4gTWlkZGxld2FyZSB0aGF0XG5cdFx0XHRcdC8vIHRocm93cyAodmlhIGBAYmxva2pzL3Rocm93YCkgcHJvcGFnYXRlcyB0byB0aGUgb3V0ZXJcblx0XHRcdFx0Ly8gY2F0Y2ggYW5kIGlzIHJvdXRlZCB0aHJvdWdoIHRoZSB3b3JrZXIncyByZXRyeSAvIERMUVxuXHRcdFx0XHQvLyBsb2dpYyBleGFjdGx5IGxpa2UgYSBtYWluLXdvcmtmbG93IGVycm9yLlxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcGx5TWlkZGxld2FyZUNoYWluKGN0eCwgdGhpcy5ub2RlTWFwKTtcblxuXHRcdFx0XHQvLyBFeGVjdXRlIHdvcmtmbG93IHdpdGggdGltZW91dCBpZiBjb25maWd1cmVkXG5cdFx0XHRcdGxldCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlO1xuXHRcdFx0XHRpZiAoY29uZmlnLnRpbWVvdXQgJiYgY29uZmlnLnRpbWVvdXQgPiAwKSB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXaXRoVGltZW91dChjdHgsIGNvbmZpZy50aW1lb3V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKGN0eCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBlbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuXHRcdFx0XHQvLyBTZXQgc3BhbiBhdHRyaWJ1dGVzXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCB0cnVlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJqb2JfaWRcIiwgam9iSWQpO1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInF1ZXVlXCIsIGNvbmZpZy5xdWV1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiYXR0ZW1wdHNcIiwgam9iLmF0dGVtcHRzKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJlbGFwc2VkX21zXCIsIGVuZCAtIHN0YXJ0KTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcblxuXHRcdFx0XHQvLyBSZWNvcmQgbWV0cmljc1xuXHRcdFx0XHR3b3JrZXJKb2JzLmFkZCgxLCB7XG5cdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbi5uYW1lLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6IFwidHJ1ZVwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgSm9iIGNvbXBsZXRlZCBpbiAkeyhlbmQgLSBzdGFydCkudG9GaXhlZCgyKX1tczogJHtqb2JJZH1gKTtcblxuXHRcdFx0XHQvLyBNYXJrIGpvYiBhcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgam9iLmNvbXBsZXRlKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0Ly8gVGllciAyICM1ICsgIzcg4oCUIGRlZmVycmVkIGRpc3BhdGNoIChkZWxheS9UVEwvZGVib3VuY2UpLlxuXHRcdFx0XHQvLyBUaGUgcnVuIHdhcyBkZWZlcnJlZCB0byBhIGZ1dHVyZSB0aW1lcjsgQUNLIHdpdGhvdXQgcmV0cnkuXG5cdFx0XHRcdC8vIFRoZSBpbi1wcm9jZXNzIHNjaGVkdWxlciBvd25zIHRoZSBldmVudHVhbCBkaXNwYXRjaCwgTk9UXG5cdFx0XHRcdC8vIHRoZSBicm9rZXIg4oCUIHJlLXF1ZXVlaW5nIGhlcmUgd291bGQgY3JlYXRlIGEgZHVwbGljYXRlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZWZlcnJlZERpc3BhdGNoU2lnbmFsKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcImRlZmVycmVkXCIsIHRydWUpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZGVmZXJyZWRfc3RhdHVzXCIsIGVycm9yLmluZm8uc3RhdHVzKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBgZGVmZXJyZWQ6JHtlcnJvci5pbmZvLnN0YXR1c31gIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFxuXHRcdFx0XHRcdFx0YFtzY2hlZHVsaW5nXSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBzdGF0dXM9JHtlcnJvci5pbmZvLnN0YXR1c30gYCArXG5cdFx0XHRcdFx0XHRcdGBzY2hlZHVsZWRBdD0ke2Vycm9yLmluZm8uc2NoZWR1bGVkQXR9IHBpbmdDb3VudD0ke2Vycm9yLmluZm8ucGluZ0NvdW50fSDihpIgQUNLIChubyByZXF1ZXVlKWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5jb21wbGV0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFBSIDEtNSBwb2xpc2gg4oCUIHF1ZXVlLW1vZGUgVFRMIGVsYXBzZWQuIFRoZSBydW4gaXMgYWxyZWFkeVxuXHRcdFx0XHQvLyBmbGlwcGVkIHRvIGBleHBpcmVkYCAoc2VlIFRyaWdnZXJCYXNlIHF1ZXVlIGJyYW5jaCk7IEFDS1xuXHRcdFx0XHQvLyB3aXRob3V0IHJldHJ5IHNvIHRoZSBicm9rZXIgZG9lc24ndCByZWRlbGl2ZXIg4oCUIHRoZSBydW5cblx0XHRcdFx0Ly8gd2lsbCBuZXZlciBzdWNjZWVkICh0aW1lciB3b24ndCByZS1maXJlKS4gRGlzdGluY3QgZnJvbVxuXHRcdFx0XHQvLyB0aGUgdGhyb3R0bGVkIE5BQ0sgYmVsb3cuXG5cdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIFF1ZXVlRXhwaXJlZEVycm9yKSB7XG5cdFx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInF1ZXVlX2V4cGlyZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSywgbWVzc2FnZTogXCJxdWV1ZV9leHBpcmVkXCIgfSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0XHRgW2NvbmN1cnJlbmN5XSBqb2IgJHtqb2JJZH0gcnVuSWQ9JHtlcnJvci5pbmZvLnJ1bklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgcXVldWVFeHBpcmVkQXQ9JHtlcnJvci5pbmZvLnF1ZXVlRXhwaXJlZEF0fSDihpIgQUNLIChubyByZXF1ZXVlLCBydW4gZXhwaXJlZClgLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuY29tcGxldGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaWVyIDIgIzYg4oCUIGNvbmN1cnJlbmN5IGdhdGUgZGVuaWFsLiBEaXN0aW5jdCBmcm9tIGEgbm9ybWFsXG5cdFx0XHRcdC8vIGZhaWx1cmU6IE5BQ0sgd2l0aCByZWRlbGl2ZXJ5IHNvIHRoZSBicm9rZXIgcmUtcXVldWVzIHRoZVxuXHRcdFx0XHQvLyBqb2Igd2l0aCBpdHMgZXhpc3RpbmcgYmFjay1vZmYgc2VtYW50aWNzLiBEb2Vzbid0IGNvdW50XG5cdFx0XHRcdC8vIGFnYWluc3QgdGhlIHdvcmtmbG93J3MgcmV0cnkgYnVkZ2V0IChkaWZmZXJlbnQgaW52YXJpYW50KS5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHBhc3MgYHdpbGxSZXRyeTogdHJ1ZWAgcmVnYXJkbGVzcyBvZiBgam9iLmF0dGVtcHRzYFxuXHRcdFx0XHQvLyBiZWNhdXNlIHRocm90dGxpbmcgaXMgYSB0cmFuc2llbnQgcmVzb3VyY2Ugc3RhdGUsIG5vdCBhXG5cdFx0XHRcdC8vIHBlcm1hbmVudCBmYWlsdXJlLlxuXHRcdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25jdXJyZW5jeUxpbWl0RXJyb3IpIHtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwid2lsbF9yZXRyeVwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInRocm90dGxlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LLCBtZXNzYWdlOiBcImNvbmN1cnJlbmN5X2xpbWl0X3JlYWNoZWRcIiB9KTtcblxuXHRcdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRcdGBbY29uY3VycmVuY3ldIGpvYiAke2pvYklkfSBrZXk9JyR7ZXJyb3IuaW5mby5jb25jdXJyZW5jeUtleX0nIGAgK1xuXHRcdFx0XHRcdFx0XHRgbGltaXQ9JHtlcnJvci5pbmZvLmNvbmN1cnJlbmN5TGltaXR9IGluRmxpZ2h0PSR7ZXJyb3IuaW5mby5jdXJyZW50SW5GbGlnaHR9IOKGkiBOQUNLICsgcmVkZWxpdmVyeWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHdvcmtlclJldHJpZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdFx0d29ya2Zsb3dfbmFtZTogdGhpcy5jb25maWd1cmF0aW9uPy5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRcdFx0cmVhc29uOiBcInRocm90dGxlZFwiLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0YXdhaXQgam9iLmZhaWwoZXJyb3IgYXMgRXJyb3IsIHRydWUpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNob3VsZFJldHJ5ID0gam9iLmF0dGVtcHRzIDwgam9iLm1heFJldHJpZXM7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJ3aWxsX3JldHJ5XCIsIHNob3VsZFJldHJ5KTtcblx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0aWYgKHNob3VsZFJldHJ5KSB7XG5cdFx0XHRcdFx0Ly8gUmV0cnkgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLiBgY29uZmlnLmRlbGF5YCB3aWRlbmVkIHRvXG5cdFx0XHRcdFx0Ly8gYHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZGAgaW4gVGllciAyICM1IChkdXJhdGlvbiBzdHJpbmdzKS5cblx0XHRcdFx0XHQvLyBgY2FsY3VsYXRlQmFja29mZmAgb25seSBoYW5kbGVzIG51bWJlcnM7IG5vcm1hbGl6ZSB2aWFcblx0XHRcdFx0XHQvLyB0cnlQYXJzZUR1cmF0aW9uLiBGYWlsLW9wZW4gdG8gdW5kZWZpbmVkIOKGkiBkZWZhdWx0IGJhY2tvZmYuXG5cdFx0XHRcdFx0Y29uc3QgZGVsYXlNcyA9XG5cdFx0XHRcdFx0XHR0eXBlb2YgY29uZmlnLmRlbGF5ID09PSBcIm51bWJlclwiXG5cdFx0XHRcdFx0XHRcdD8gY29uZmlnLmRlbGF5XG5cdFx0XHRcdFx0XHRcdDogdHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdD8gKHRyeVBhcnNlRHVyYXRpb24oY29uZmlnLmRlbGF5KSA/PyB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Y29uc3QgYmFja29mZk1zID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGpvYi5hdHRlbXB0cywgZGVsYXlNcyk7XG5cdFx0XHRcdFx0d29ya2VyUmV0cmllcy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRhdHRlbXB0OiBTdHJpbmcoam9iLmF0dGVtcHRzICsgMSksXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gZmFpbGVkIChhdHRlbXB0ICR7am9iLmF0dGVtcHRzICsgMX0vJHtqb2IubWF4UmV0cmllcyArIDF9KSwgcmV0cnlpbmcgaW4gJHtiYWNrb2ZmTXN9bXM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGF3YWl0IGpvYi5mYWlsKGVycm9yIGFzIEVycm9yLCB0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBNYXggcmV0cmllcyBleGhhdXN0ZWQgLSBzZW5kIHRvIERMUVxuXHRcdFx0XHRcdHdvcmtlckVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHRcdHF1ZXVlOiBjb25maWcucXVldWUsXG5cdFx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XHRcdGBKb2IgJHtqb2JJZH0gcGVybWFuZW50bHkgZmFpbGVkIGFmdGVyICR7am9iLmF0dGVtcHRzICsgMX0gYXR0ZW1wdHM6ICR7ZXJyb3JNZXNzYWdlfWAsXG5cdFx0XHRcdFx0XHQoZXJyb3IgYXMgRXJyb3IpLnN0YWNrLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRhd2FpdCBqb2IuZmFpbChlcnJvciBhcyBFcnJvciwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRzcGFuLmVuZCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgd29ya2Zsb3cgd2l0aCBhIHRpbWVvdXRcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBleGVjdXRlV2l0aFRpbWVvdXQoY3R4OiBDb250ZXh0LCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VHJpZ2dlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPFRyaWdnZXJSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihgSm9iIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tc2ApKTtcblx0XHRcdH0sIHRpbWVvdXRNcyk7XG5cblx0XHRcdHRoaXMucnVuKGN0eClcblx0XHRcdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgZXhwb25lbnRpYWwgYmFja29mZiBkZWxheVxuXHQgKiBGb3JtdWxhOiBtaW4oYmFzZURlbGF5ICogMl5hdHRlbXB0LCAzMDAwMCkgKyBqaXR0ZXJcblx0ICovXG5cdHByb3RlY3RlZCBjYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5PzogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBiYXNlID0gYmFzZURlbGF5ID8/IDEwMDA7XG5cdFx0Y29uc3QgbWF4RGVsYXkgPSAzMDAwMDsgLy8gMzAgc2Vjb25kcyBtYXhcblx0XHRjb25zdCBleHBvbmVudGlhbCA9IE1hdGgubWluKGJhc2UgKiAyICoqIGF0dGVtcHQsIG1heERlbGF5KTtcblx0XHRjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogZXhwb25lbnRpYWwgKiAwLjE7IC8vIDEwJSBqaXR0ZXJcblx0XHRyZXR1cm4gTWF0aC5mbG9vcihleHBvbmVudGlhbCArIGppdHRlcik7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV29ya2VyVHJpZ2dlcjtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blokjs/trigger-worker",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Worker-based trigger for Blok workflows - supports background job processing with concurrency, retries, and scheduling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"author": "Deskree Technologies Inc.",
|
|
15
15
|
"license": "Apache-2.0",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@blokjs/helper": "^0.6.
|
|
18
|
-
"@blokjs/runner": "^0.6.
|
|
19
|
-
"@blokjs/shared": "^0.6.
|
|
17
|
+
"@blokjs/helper": "^0.6.4",
|
|
18
|
+
"@blokjs/runner": "^0.6.4",
|
|
19
|
+
"@blokjs/shared": "^0.6.4",
|
|
20
20
|
"@opentelemetry/api": "^1.9.0",
|
|
21
21
|
"uuid": "^11.1.0"
|
|
22
22
|
},
|
package/src/WorkerTrigger.ts
CHANGED
|
@@ -203,11 +203,14 @@ export abstract class WorkerTrigger extends TriggerBase {
|
|
|
203
203
|
protected abstract nodes: Record<string, BlokService<unknown>>;
|
|
204
204
|
protected abstract workflows: Record<string, HelperResponse>;
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
206
|
+
// Constructor removed in v0.6.3 — pre-fix it called `loadNodes()` +
|
|
207
|
+
// `loadWorkflows()`, but subclasses use class-field assignments for
|
|
208
|
+
// `nodes` / `workflows` (the canonical TypeScript pattern). Those
|
|
209
|
+
// fields run AFTER super(), so accessing `this.nodes` from the parent
|
|
210
|
+
// constructor read `undefined` and crashed with
|
|
211
|
+
// `TypeError: undefined is not an object (Object.keys(this.nodes))`.
|
|
212
|
+
// The registry init now happens at the start of `listen()`, after
|
|
213
|
+
// the subclass's fields are initialized.
|
|
211
214
|
|
|
212
215
|
/**
|
|
213
216
|
* Load nodes into the node map
|
|
@@ -233,6 +236,14 @@ export abstract class WorkerTrigger extends TriggerBase {
|
|
|
233
236
|
async listen(): Promise<number> {
|
|
234
237
|
const startTime = this.startCounter();
|
|
235
238
|
|
|
239
|
+
// Populate the trigger's node + workflow registries from the
|
|
240
|
+
// subclass's `nodes` / `workflows` fields. v0.6.3 fix — pre-fix
|
|
241
|
+
// these calls lived in the constructor and crashed because class
|
|
242
|
+
// fields haven't run yet at super-constructor time. See the comment
|
|
243
|
+
// where the old constructor used to live for the full reason.
|
|
244
|
+
this.loadNodes();
|
|
245
|
+
this.loadWorkflows();
|
|
246
|
+
|
|
236
247
|
try {
|
|
237
248
|
// Tier 2 #6 follow-up · install the cross-process concurrency
|
|
238
249
|
// backend (NATS KV) when the operator opted in via
|
package/template/package.json
CHANGED
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"vitest": "^4.0.18"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@blokjs/api-call": "^0.6.
|
|
29
|
-
"@blokjs/helper": "^0.6.
|
|
30
|
-
"@blokjs/if-else": "^0.6.
|
|
31
|
-
"@blokjs/runner": "^0.6.
|
|
32
|
-
"@blokjs/shared": "^0.6.
|
|
33
|
-
"@blokjs/trigger-worker": "^0.6.
|
|
28
|
+
"@blokjs/api-call": "^0.6.4",
|
|
29
|
+
"@blokjs/helper": "^0.6.4",
|
|
30
|
+
"@blokjs/if-else": "^0.6.4",
|
|
31
|
+
"@blokjs/runner": "^0.6.4",
|
|
32
|
+
"@blokjs/shared": "^0.6.4",
|
|
33
|
+
"@blokjs/trigger-worker": "^0.6.4",
|
|
34
34
|
"@opentelemetry/api": "^1.9.0",
|
|
35
35
|
"@opentelemetry/exporter-prometheus": "^0.57.2",
|
|
36
36
|
"@opentelemetry/resources": "^1.30.1",
|