@blokjs/trigger-pubsub 0.2.3 → 0.6.2
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/__tests__/integration/gcp-pubsub.real-emulator.test.ts +235 -0
- package/__tests__/integration/kafka-pubsub.real-kafka.test.ts +269 -0
- package/__tests__/integration/nats-pubsub.real-nats.test.ts +138 -0
- package/dist/PubSubTrigger.d.ts +43 -3
- package/dist/PubSubTrigger.js +70 -16
- package/dist/adapters/AWSSNSAdapter.d.ts +16 -0
- package/dist/adapters/AWSSNSAdapter.js +52 -9
- package/dist/adapters/AzureServiceBusAdapter.d.ts +15 -0
- package/dist/adapters/AzureServiceBusAdapter.js +44 -11
- package/dist/adapters/GCPPubSubAdapter.d.ts +16 -0
- package/dist/adapters/GCPPubSubAdapter.js +42 -8
- package/dist/adapters/KafkaPubSubAdapter.d.ts +53 -0
- package/dist/adapters/KafkaPubSubAdapter.js +168 -0
- package/dist/adapters/NATSPubSubAdapter.d.ts +52 -0
- package/dist/adapters/NATSPubSubAdapter.js +260 -0
- package/dist/adapters/RedisStreamsPubSubAdapter.d.ts +49 -0
- package/dist/adapters/RedisStreamsPubSubAdapter.js +193 -0
- package/dist/adapters/factory.d.ts +22 -0
- package/dist/adapters/factory.js +80 -0
- package/dist/index.d.ts +36 -45
- package/dist/index.js +39 -46
- package/package.json +22 -10
- package/src/PubSubTrigger.ts +84 -18
- package/src/adapters/AWSSNSAdapter.ts +76 -12
- package/src/adapters/AzureServiceBusAdapter.ts +57 -14
- package/src/adapters/GCPPubSubAdapter.ts +50 -10
- package/src/adapters/KafkaPubSubAdapter.ts +194 -0
- package/src/adapters/NATSPubSubAdapter.ts +326 -0
- package/src/adapters/RedisStreamsPubSubAdapter.ts +225 -0
- package/src/adapters/factory.test.ts +87 -0
- package/src/adapters/factory.ts +88 -0
- package/src/adapters/new-adapters.test.ts +108 -0
- package/src/index.ts +40 -41
- package/template/package.json +6 -6
- package/template/src/runner/PubSubServer.ts +2 -2
- package/template/src/workflows/messages/on-message.ts +38 -34
package/dist/PubSubTrigger.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* - Ack/nack based on response
|
|
19
19
|
*/
|
|
20
20
|
import type { HelperResponse, PubSubProvider, PubSubTriggerOpts } from "@blokjs/helper";
|
|
21
|
-
import { DefaultLogger, type GlobalOptions,
|
|
21
|
+
import { type BlokService, DefaultLogger, type GlobalOptions, TriggerBase } from "@blokjs/runner";
|
|
22
22
|
/**
|
|
23
23
|
* Message received from pub/sub
|
|
24
24
|
*/
|
|
@@ -56,6 +56,20 @@ export interface PubSubAdapter {
|
|
|
56
56
|
subscribe(config: PubSubTriggerOpts, handler: (message: PubSubMessage) => Promise<void>): Promise<void>;
|
|
57
57
|
/** Unsubscribe from a topic */
|
|
58
58
|
unsubscribe(subscription: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* v0.7 PR 6 — publish a single message to a topic. Used by the
|
|
61
|
+
* `@blokjs/pubsub-publish` helper and any workflow that fan-outs
|
|
62
|
+
* events to subscribers. Provider-portable: each adapter wraps its
|
|
63
|
+
* native producer client.
|
|
64
|
+
*
|
|
65
|
+
* Optional `partitionKey` / `orderingKey` is honored by providers
|
|
66
|
+
* that support per-key ordering (Kafka, GCP Pub/Sub ordered
|
|
67
|
+
* delivery). Ignored otherwise.
|
|
68
|
+
*/
|
|
69
|
+
publish(topic: string, payload: unknown, opts?: {
|
|
70
|
+
partitionKey?: string;
|
|
71
|
+
orderingKey?: string;
|
|
72
|
+
}): Promise<void>;
|
|
59
73
|
/** Check if connected */
|
|
60
74
|
isConnected(): boolean;
|
|
61
75
|
/** Health check */
|
|
@@ -83,7 +97,20 @@ export declare abstract class PubSubTrigger extends TriggerBase {
|
|
|
83
97
|
protected nodeMap: GlobalOptions;
|
|
84
98
|
protected readonly tracer: import("@opentelemetry/api").Tracer;
|
|
85
99
|
protected readonly logger: DefaultLogger;
|
|
86
|
-
|
|
100
|
+
/**
|
|
101
|
+
* v0.7 PR 6 — back-compat default adapter. When subclasses set
|
|
102
|
+
* `protected adapter = new GCPPubSubAdapter()` (pre-v0.7 pattern),
|
|
103
|
+
* ALL workflows route through it regardless of their `provider`
|
|
104
|
+
* field. When unset, each workflow's `provider` is resolved via
|
|
105
|
+
* the factory.
|
|
106
|
+
*/
|
|
107
|
+
protected adapter?: PubSubAdapter;
|
|
108
|
+
/**
|
|
109
|
+
* v0.7 PR 6 — adapter pool, keyed by provider. Populated lazily in
|
|
110
|
+
* `listen()` as workflows are matched to providers. Drained in
|
|
111
|
+
* `stop()`. One adapter (one broker connection) per provider.
|
|
112
|
+
*/
|
|
113
|
+
protected adapterPool: Map<string, PubSubAdapter>;
|
|
87
114
|
protected abstract nodes: Record<string, BlokService<unknown>>;
|
|
88
115
|
protected abstract workflows: Record<string, HelperResponse>;
|
|
89
116
|
/**
|
|
@@ -99,9 +126,22 @@ export declare abstract class PubSubTrigger extends TriggerBase {
|
|
|
99
126
|
*/
|
|
100
127
|
listen(): Promise<number>;
|
|
101
128
|
/**
|
|
102
|
-
* Stop the pub/sub subscriber
|
|
129
|
+
* Stop the pub/sub subscriber — drains every adapter in the pool
|
|
130
|
+
* plus the subclass-set adapter (if any).
|
|
103
131
|
*/
|
|
104
132
|
stop(): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* v0.7 PR 6 — pick the adapter for a workflow's `provider` field.
|
|
135
|
+
*
|
|
136
|
+
* Resolution order:
|
|
137
|
+
* 1. Subclass-set `this.adapter` (back-compat).
|
|
138
|
+
* 2. Per-workflow `provider` field via the factory.
|
|
139
|
+
* 3. `BLOK_PUBSUB_ADAPTER` env var.
|
|
140
|
+
* 4. `"nats"` fallback.
|
|
141
|
+
*
|
|
142
|
+
* Adapters are connected on first use and pooled per provider.
|
|
143
|
+
*/
|
|
144
|
+
protected resolveAdapterForWorkflow(config: PubSubTriggerOpts): Promise<PubSubAdapter>;
|
|
105
145
|
protected onHmrWorkflowChange(): Promise<void>;
|
|
106
146
|
/**
|
|
107
147
|
* Get all workflows that have pub/sub triggers
|
package/dist/PubSubTrigger.js
CHANGED
|
@@ -27,6 +27,20 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
27
27
|
nodeMap = {};
|
|
28
28
|
tracer = trace.getTracer(process.env.PROJECT_NAME || "trigger-pubsub-workflow", process.env.PROJECT_VERSION || "0.0.1");
|
|
29
29
|
logger = new DefaultLogger();
|
|
30
|
+
/**
|
|
31
|
+
* v0.7 PR 6 — back-compat default adapter. When subclasses set
|
|
32
|
+
* `protected adapter = new GCPPubSubAdapter()` (pre-v0.7 pattern),
|
|
33
|
+
* ALL workflows route through it regardless of their `provider`
|
|
34
|
+
* field. When unset, each workflow's `provider` is resolved via
|
|
35
|
+
* the factory.
|
|
36
|
+
*/
|
|
37
|
+
adapter;
|
|
38
|
+
/**
|
|
39
|
+
* v0.7 PR 6 — adapter pool, keyed by provider. Populated lazily in
|
|
40
|
+
* `listen()` as workflows are matched to providers. Drained in
|
|
41
|
+
* `stop()`. One adapter (one broker connection) per provider.
|
|
42
|
+
*/
|
|
43
|
+
adapterPool = new Map();
|
|
30
44
|
/**
|
|
31
45
|
* Load nodes into the node map
|
|
32
46
|
*/
|
|
@@ -53,20 +67,20 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
53
67
|
this.loadNodes();
|
|
54
68
|
this.loadWorkflows();
|
|
55
69
|
try {
|
|
56
|
-
// Connect to pub/sub system
|
|
57
|
-
await this.adapter.connect();
|
|
58
|
-
this.logger.log(`Connected to ${this.adapter.provider} pub/sub system`);
|
|
59
70
|
// Find all workflows with pub/sub triggers
|
|
60
71
|
const pubsubWorkflows = this.getPubSubWorkflows();
|
|
61
72
|
if (pubsubWorkflows.length === 0) {
|
|
62
73
|
this.logger.log("No workflows with pub/sub triggers found");
|
|
63
74
|
return this.endCounter(startTime);
|
|
64
75
|
}
|
|
65
|
-
// Subscribe to each topic
|
|
76
|
+
// Subscribe to each topic via the adapter that owns its
|
|
77
|
+
// provider. Per-workflow `provider` field with subclass-
|
|
78
|
+
// adapter back-compat (handled in resolveAdapterForWorkflow).
|
|
66
79
|
for (const workflow of pubsubWorkflows) {
|
|
67
80
|
const config = workflow.config.trigger?.pubsub;
|
|
68
|
-
|
|
69
|
-
|
|
81
|
+
const adapter = await this.resolveAdapterForWorkflow(config);
|
|
82
|
+
this.logger.log(`Subscribing to topic: ${config.topic} via ${adapter.provider} (subscription: ${config.subscription ?? "<auto>"}, group: ${config.consumerGroup ?? "<fan-out>"})`);
|
|
83
|
+
await adapter.subscribe(config, async (message) => {
|
|
70
84
|
await this.handleMessage(message, workflow, config);
|
|
71
85
|
});
|
|
72
86
|
}
|
|
@@ -83,12 +97,52 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
83
97
|
}
|
|
84
98
|
}
|
|
85
99
|
/**
|
|
86
|
-
* Stop the pub/sub subscriber
|
|
100
|
+
* Stop the pub/sub subscriber — drains every adapter in the pool
|
|
101
|
+
* plus the subclass-set adapter (if any).
|
|
87
102
|
*/
|
|
88
103
|
async stop() {
|
|
89
|
-
|
|
104
|
+
for (const adapter of this.adapterPool.values()) {
|
|
105
|
+
try {
|
|
106
|
+
await adapter.disconnect();
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
this.logger.error(`[blok][pubsub] disconnect failed: ${err.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
this.adapterPool.clear();
|
|
90
113
|
this.logger.log("Pub/Sub trigger stopped");
|
|
91
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* v0.7 PR 6 — pick the adapter for a workflow's `provider` field.
|
|
117
|
+
*
|
|
118
|
+
* Resolution order:
|
|
119
|
+
* 1. Subclass-set `this.adapter` (back-compat).
|
|
120
|
+
* 2. Per-workflow `provider` field via the factory.
|
|
121
|
+
* 3. `BLOK_PUBSUB_ADAPTER` env var.
|
|
122
|
+
* 4. `"nats"` fallback.
|
|
123
|
+
*
|
|
124
|
+
* Adapters are connected on first use and pooled per provider.
|
|
125
|
+
*/
|
|
126
|
+
async resolveAdapterForWorkflow(config) {
|
|
127
|
+
if (this.adapter) {
|
|
128
|
+
if (!this.adapter.isConnected()) {
|
|
129
|
+
await this.adapter.connect();
|
|
130
|
+
this.logger.log(`Connected to ${this.adapter.provider} pub/sub system (subclass adapter)`);
|
|
131
|
+
}
|
|
132
|
+
this.adapterPool.set(this.adapter.provider, this.adapter);
|
|
133
|
+
return this.adapter;
|
|
134
|
+
}
|
|
135
|
+
const { resolveProvider, createPubSubAdapter } = await import("./adapters/factory");
|
|
136
|
+
const provider = resolveProvider(config.provider);
|
|
137
|
+
let adapter = this.adapterPool.get(provider);
|
|
138
|
+
if (!adapter) {
|
|
139
|
+
adapter = createPubSubAdapter(provider);
|
|
140
|
+
await adapter.connect();
|
|
141
|
+
this.logger.log(`Connected to ${adapter.provider} pub/sub system`);
|
|
142
|
+
this.adapterPool.set(provider, adapter);
|
|
143
|
+
}
|
|
144
|
+
return adapter;
|
|
145
|
+
}
|
|
92
146
|
async onHmrWorkflowChange() {
|
|
93
147
|
this.logger.log("[HMR] Pub/Sub workflow changed, reloading...");
|
|
94
148
|
await this.waitForInFlightRequests();
|
|
@@ -149,7 +203,7 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
149
203
|
// Store message metadata in context
|
|
150
204
|
if (!ctx.vars)
|
|
151
205
|
ctx.vars = {};
|
|
152
|
-
ctx.vars
|
|
206
|
+
ctx.vars._pubsub_message = {
|
|
153
207
|
topic: message.topic,
|
|
154
208
|
subscription: message.subscription || "",
|
|
155
209
|
publishTime: message.publishTime?.toISOString() ?? "",
|
|
@@ -163,16 +217,16 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
163
217
|
span.setAttribute("success", true);
|
|
164
218
|
span.setAttribute("message_id", id);
|
|
165
219
|
span.setAttribute("topic", config.topic);
|
|
166
|
-
span.setAttribute("subscription", config.subscription);
|
|
167
|
-
span.setAttribute("provider", config.provider);
|
|
220
|
+
span.setAttribute("subscription", config.subscription ?? "<auto>");
|
|
221
|
+
span.setAttribute("provider", config.provider ?? "<default>");
|
|
168
222
|
span.setAttribute("elapsed_ms", end - start);
|
|
169
223
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
170
224
|
// Record metrics
|
|
171
225
|
pubsubMessages.add(1, {
|
|
172
226
|
env: process.env.NODE_ENV,
|
|
173
227
|
topic: config.topic,
|
|
174
|
-
subscription: config.subscription,
|
|
175
|
-
provider: config.provider,
|
|
228
|
+
subscription: config.subscription ?? "<auto>",
|
|
229
|
+
provider: config.provider ?? "<default>",
|
|
176
230
|
workflow_name: this.configuration.name,
|
|
177
231
|
success: "true",
|
|
178
232
|
});
|
|
@@ -193,8 +247,8 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
193
247
|
pubsubErrors.add(1, {
|
|
194
248
|
env: process.env.NODE_ENV,
|
|
195
249
|
topic: config.topic,
|
|
196
|
-
subscription: config.subscription,
|
|
197
|
-
provider: config.provider,
|
|
250
|
+
subscription: config.subscription ?? "<auto>",
|
|
251
|
+
provider: config.provider ?? "<default>",
|
|
198
252
|
workflow_name: this.configuration?.name || "unknown",
|
|
199
253
|
});
|
|
200
254
|
this.logger.error(`Failed to process message ${id}: ${errorMessage}`, error.stack);
|
|
@@ -211,4 +265,4 @@ export class PubSubTrigger extends TriggerBase {
|
|
|
211
265
|
}
|
|
212
266
|
}
|
|
213
267
|
export default PubSubTrigger;
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHViU3ViVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QdWJTdWJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFHSCxPQUFPLEVBQ04sYUFBYSxFQUdiLE9BQU8sRUFDUCxXQUFXLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQWEsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW9FbEM7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGFBQWMsU0FBUSxXQUFXO0lBQzVDLE9BQU8sR0FBa0IsRUFBbUIsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUkseUJBQXlCLEVBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FDdEMsQ0FBQztJQUNpQixNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQU9oRDs7T0FFRztJQUNILFNBQVM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFD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Q0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEtBQUssWUFBWSxFQUFFLEVBQUcsS0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUU5RixlQUFlO2dCQUNmLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0YsQ0FBQztvQkFBUyxDQUFDO2dCQUNWLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRDtBQUVELGVBQWUsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJTdWJUcmlnZ2VyIC0gQmFzZSBjbGFzcyBmb3IgcHViL3N1Yi1iYXNlZCB3b3JrZmxvdyB0cmlnZ2Vyc1xuICpcbiAqIEV4dGVuZHMgVHJpZ2dlckJhc2UgdG8gc3VwcG9ydCBwdWIvc3ViIHRyaWdnZXJzOlxuICogLSBHQ1AgUHViL1N1YlxuICogLSBBV1MgU05TICh2aWEgU1FTIHN1YnNjcmlwdGlvbilcbiAqIC0gQXp1cmUgU2VydmljZSBCdXNcbiAqXG4gKiBQYXR0ZXJuOlxuICogMS4gbG9hZE5vZGVzKCkgLSBMb2FkIGF2YWlsYWJsZSBub2RlcyBpbnRvIE5vZGVNYXBcbiAqIDIuIGxvYWRXb3JrZmxvd3MoKSAtIExvYWQgd29ya2Zsb3dzIHdpdGggcHVic3ViIHRyaWdnZXJzXG4gKiAzLiBzdGFydFN1YnNjcmliZXIoKSAtIENvbm5lY3QgdG8gcHViL3N1YiBhbmQgc3RhcnQgcmVjZWl2aW5nIG1lc3NhZ2VzXG4gKiA0LiBGb3IgZWFjaCBtZXNzYWdlOlxuICogICAgLSBNYXRjaCB3b3JrZmxvdyBieSB0cmlnZ2VyIGNvbmZpZyAodG9waWMvc3Vic2NyaXB0aW9uKVxuICogICAgLSBDcmVhdGUgY29udGV4dCB3aXRoIHRoaXMuY3JlYXRlQ29udGV4dCgpXG4gKiAgICAtIFBvcHVsYXRlIGN0eC5yZXF1ZXN0IHdpdGggbWVzc2FnZSBkYXRhXG4gKiAgICAtIEV4ZWN1dGUgd29ya2Zsb3cgdmlhIHRoaXMucnVuKGN0eClcbiAqICAgIC0gQWNrL25hY2sgYmFzZWQgb24gcmVzcG9uc2VcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEhlbHBlclJlc3BvbnNlLCBQdWJTdWJQcm92aWRlciwgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7XG5cdERlZmF1bHRMb2dnZXIsXG5cdHR5cGUgR2xvYmFsT3B0aW9ucyxcblx0dHlwZSBCbG9rU2VydmljZSxcblx0Tm9kZU1hcCxcblx0VHJpZ2dlckJhc2UsXG5cdHR5cGUgVHJpZ2dlclJlc3BvbnNlLFxufSBmcm9tIFwiQGJsb2tqcy9ydW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCwgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGJsb2tqcy9zaGFyZWRcIjtcbmltcG9ydCB7IHR5cGUgU3BhbiwgU3BhblN0YXR1c0NvZGUsIG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbi8qKlxuICogTWVzc2FnZSByZWNlaXZlZCBmcm9tIHB1Yi9zdWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJTdWJNZXNzYWdlIHtcblx0LyoqIFVuaXF1ZSBtZXNzYWdlIElEICovXG5cdGlkOiBzdHJpbmc7XG5cdC8qKiBNZXNzYWdlIGJvZHkgKHBhcnNlZCkgKi9cblx0Ym9keTogdW5rbm93bjtcblx0LyoqIE1lc3NhZ2UgYXR0cmlidXRlcy9tZXRhZGF0YSAqL1xuXHRhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHQvKiogT3JpZ2luYWwgcmF3IG1lc3NhZ2UgZnJvbSBwcm92aWRlciAqL1xuXHRyYXc6IHVua25vd247XG5cdC8qKiBUb3BpYyBuYW1lICovXG5cdHRvcGljOiBzdHJpbmc7XG5cdC8qKiBTdWJzY3JpcHRpb24gbmFtZSAqL1xuXHRzdWJzY3JpcHRpb24/OiBzdHJpbmc7XG5cdC8qKiBQdWJsaXNoIHRpbWVzdGFtcCAqL1xuXHRwdWJsaXNoVGltZT86IERhdGU7XG5cdC8qKiBBY2tub3dsZWRnZSB0aGUgbWVzc2FnZSAqL1xuXHRhY2s6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdC8qKiBSZWplY3QvbmFjayB0aGUgbWVzc2FnZSAqL1xuXHRuYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFB1Yi9TdWIgYWRhcHRlciBpbnRlcmZhY2UgLSBpbXBsZW1lbnRlZCBieSBlYWNoIHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHViU3ViQWRhcHRlciB7XG5cdC8qKiBQcm92aWRlciBuYW1lICovXG5cdHJlYWRvbmx5IHByb3ZpZGVyOiBQdWJTdWJQcm92aWRlcjtcblxuXHQvKiogQ29ubmVjdCB0byB0aGUgcHViL3N1YiBzeXN0ZW0gKi9cblx0Y29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBEaXNjb25uZWN0IGZyb20gdGhlIHB1Yi9zdWIgc3lzdGVtICovXG5cdGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogU3Vic2NyaWJlIHRvIGEgdG9waWMgYW5kIHJlY2VpdmUgbWVzc2FnZXMgKi9cblx0c3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogVW5zdWJzY3JpYmUgZnJvbSBhIHRvcGljICovXG5cdHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogQ2hlY2sgaWYgY29ubmVjdGVkICovXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG5cblx0LyoqIEhlYWx0aCBjaGVjayAqL1xuXHRoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIFdvcmtmbG93IG1vZGVsIHdpdGggcHViL3N1YiB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuaW50ZXJmYWNlIFB1YlN1YldvcmtmbG93TW9kZWwge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGNvbmZpZzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHR2ZXJzaW9uOiBzdHJpbmc7XG5cdFx0dHJpZ2dlcj86IHtcblx0XHRcdHB1YnN1Yj86IFB1YlN1YlRyaWdnZXJPcHRzO1xuXHRcdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0XHR9O1xuXHRcdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdH07XG59XG5cbi8qKlxuICogUHViU3ViVHJpZ2dlciAtIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHB1Yi9zdWItYmFzZWQgdHJpZ2dlcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFB1YlN1YlRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyQmFzZSB7XG5cdHByb3RlY3RlZCBub2RlTWFwOiBHbG9iYWxPcHRpb25zID0ge30gYXMgR2xvYmFsT3B0aW9ucztcblx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNlciA9IHRyYWNlLmdldFRyYWNlcihcblx0XHRwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgfHwgXCJ0cmlnZ2VyLXB1YnN1Yi13b3JrZmxvd1wiLFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfVkVSU0lPTiB8fCBcIjAuMC4xXCIsXG5cdCk7XG5cdHByb3RlY3RlZCByZWFkb25seSBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgYWRhcHRlcjogUHViU3ViQWRhcHRlcjtcblxuXHQvLyBTdWJjbGFzc2VzIHByb3ZpZGUgdGhlc2Vcblx0cHJvdGVjdGVkIGFic3RyYWN0IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBCbG9rU2VydmljZTx1bmtub3duPj47XG5cdHByb3RlY3RlZCBhYnN0cmFjdCB3b3JrZmxvd3M6IFJlY29yZDxzdHJpbmcsIEhlbHBlclJlc3BvbnNlPjtcblxuXHQvKipcblx0ICogTG9hZCBub2RlcyBpbnRvIHRoZSBub2RlIG1hcFxuXHQgKi9cblx0bG9hZE5vZGVzKCk6IHZvaWQge1xuXHRcdHRoaXMubm9kZU1hcC5ub2RlcyA9IG5ldyBOb2RlTWFwKCk7XG5cdFx0Y29uc3Qgbm9kZUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKTtcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBub2RlS2V5cykge1xuXHRcdFx0dGhpcy5ub2RlTWFwLm5vZGVzLmFkZE5vZGUoa2V5LCB0aGlzLm5vZGVzW2tleV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkIHdvcmtmbG93cyBpbnRvIHRoZSB3b3JrZmxvdyBtYXBcblx0ICovXG5cdGxvYWRXb3JrZmxvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLndvcmtmbG93cyA9IHRoaXMud29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHRoZSBwdWIvc3ViIHN1YnNjcmliZXIgLSBtYWluIGVudHJ5IHBvaW50XG5cdCAqL1xuXHRhc3luYyBsaXN0ZW4oKTogUHJvbWlzZTxudW1iZXI+IHtcblx0XHRjb25zdCBzdGFydFRpbWUgPSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBub2RlcyBhbmQgd29ya2Zsb3dzIChjYWxsZWQgaGVyZSBiZWNhdXNlIHN1YmNsYXNzIHByb3BlcnRpZXNcblx0XHQvLyBhcmVuJ3QgYXZhaWxhYmxlIGluIHBhcmVudCBjb25zdHJ1Y3Rvcilcblx0XHR0aGlzLmxvYWROb2RlcygpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENvbm5lY3QgdG8gcHViL3N1YiBzeXN0ZW1cblx0XHRcdGF3YWl0IHRoaXMuYWRhcHRlci5jb25uZWN0KCk7XG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW1gKTtcblxuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3QgcHVic3ViV29ya2Zsb3dzID0gdGhpcy5nZXRQdWJTdWJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHB1YnN1YldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2VycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdWJzY3JpYmUgdG8gZWFjaCB0b3BpYy9zdWJzY3JpcHRpb25cblx0XHRcdGZvciAoY29uc3Qgd29ya2Zsb3cgb2YgcHVic3ViV29ya2Zsb3dzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmZpZyA9IHdvcmtmbG93LmNvbmZpZy50cmlnZ2VyPy5wdWJzdWIgYXMgUHViU3ViVHJpZ2dlck9wdHM7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmxvZyhcblx0XHRcdFx0XHRgU3Vic2NyaWJpbmcgdG8gdG9waWM6ICR7Y29uZmlnLnRvcGljfSwgc3Vic2NyaXB0aW9uOiAke2NvbmZpZy5zdWJzY3JpcHRpb259IGZvciB3b3JrZmxvdzogJHt3b3JrZmxvdy5wYXRofWAsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5hZGFwdGVyLnN1YnNjcmliZShjb25maWcsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UsIHdvcmtmbG93LCBjb25maWcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sb2dnZXIubG9nKGBQdWIvU3ViIHRyaWdnZXIgc3RhcnRlZC4gTGlzdGVuaW5nIHRvICR7cHVic3ViV29ya2Zsb3dzLmxlbmd0aH0gc3Vic2NyaXB0aW9uKHMpYCk7XG5cblx0XHRcdC8vIEVuYWJsZSBITVIgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuXHRcdFx0aWYgKHByb2Nlc3MuZW52LkJMT0tfSE1SID09PSBcInRydWVcIiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZW5hYmxlSG90UmVsb2FkKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVuZENvdW50ZXIoc3RhcnRUaW1lKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzdGFydCBwdWIvc3ViIHRyaWdnZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3AgdGhlIHB1Yi9zdWIgc3Vic2NyaWJlclxuXHQgKi9cblx0YXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdHRoaXMubG9nZ2VyLmxvZyhcIlB1Yi9TdWIgdHJpZ2dlciBzdG9wcGVkXCIpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSG1yV29ya2Zsb3dDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiW0hNUl0gUHViL1N1YiB3b3JrZmxvdyBjaGFuZ2VkLCByZWxvYWRpbmcuLi5cIik7XG5cdFx0YXdhaXQgdGhpcy53YWl0Rm9ySW5GbGlnaHRSZXF1ZXN0cygpO1xuXHRcdGF3YWl0IHRoaXMuc3RvcCgpO1xuXHRcdHRoaXMubG9hZFdvcmtmbG93cygpO1xuXHRcdGF3YWl0IHRoaXMubGlzdGVuKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCB3b3JrZmxvd3MgdGhhdCBoYXZlIHB1Yi9zdWIgdHJpZ2dlcnNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRQdWJTdWJXb3JrZmxvd3MoKTogUHViU3ViV29ya2Zsb3dNb2RlbFtdIHtcblx0XHRjb25zdCB3b3JrZmxvd3M6IFB1YlN1YldvcmtmbG93TW9kZWxbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBbcGF0aCwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubm9kZU1hcC53b3JrZmxvd3MgfHwge30pKSB7XG5cdFx0XHQvLyBIZWxwZXJSZXNwb25zZSBoYXMgYSBwcm90ZWN0ZWQgX2NvbmZpZyBwcm9wZXJ0eVxuXHRcdFx0Y29uc3Qgd29ya2Zsb3dDb25maWcgPSAod29ya2Zsb3cgYXMgdW5rbm93biBhcyB7IF9jb25maWc6IFB1YlN1YldvcmtmbG93TW9kZWxbXCJjb25maWdcIl0gfSkuX2NvbmZpZztcblxuXHRcdFx0aWYgKHdvcmtmbG93Q29uZmlnPy50cmlnZ2VyKSB7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJUeXBlID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcudHJpZ2dlcilbMF07XG5cblx0XHRcdFx0aWYgKHRyaWdnZXJUeXBlID09PSBcInB1YnN1YlwiICYmIHdvcmtmbG93Q29uZmlnLnRyaWdnZXIucHVic3ViKSB7XG5cdFx0XHRcdFx0d29ya2Zsb3dzLnB1c2goe1xuXHRcdFx0XHRcdFx0cGF0aCxcblx0XHRcdFx0XHRcdGNvbmZpZzogd29ya2Zsb3dDb25maWcsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gd29ya2Zsb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBpbmNvbWluZyBtZXNzYWdlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlTWVzc2FnZShcblx0XHRtZXNzYWdlOiBQdWJTdWJNZXNzYWdlLFxuXHRcdHdvcmtmbG93OiBQdWJTdWJXb3JrZmxvd01vZGVsLFxuXHRcdGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGlkID0gbWVzc2FnZS5pZCB8fCB1dWlkKCk7XG5cdFx0Y29uc3QgZGVmYXVsdE1ldGVyID0gbWV0cmljcy5nZXRNZXRlcihcImRlZmF1bHRcIik7XG5cdFx0Y29uc3QgcHVic3ViTWVzc2FnZXMgPSBkZWZhdWx0TWV0ZXIuY3JlYXRlQ291bnRlcihcInB1YnN1Yl9tZXNzYWdlc1wiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJQdWIvU3ViIG1lc3NhZ2VzIHByb2Nlc3NlZFwiLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHB1YnN1YkVycm9ycyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwicHVic3ViX2Vycm9yc1wiLCB7XG5cdFx0XHRkZXNjcmlwdGlvbjogXCJQdWIvU3ViIG1lc3NhZ2UgcHJvY2Vzc2luZyBlcnJvcnNcIixcblx0XHR9KTtcblxuXHRcdGF3YWl0IHRoaXMudHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihgcHVic3ViOiR7Y29uZmlnLnRvcGljfWAsIGFzeW5jIChzcGFuOiBTcGFuKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0XHRcdC8vIEluaXRpYWxpemUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB3b3JrZmxvd1xuXHRcdFx0XHRhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uaW5pdCh3b3JrZmxvdy5wYXRoLCB0aGlzLm5vZGVNYXApO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IGN0eDogQ29udGV4dCA9IHRoaXMuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQsIHdvcmtmbG93LnBhdGgsIGlkKTtcblxuXHRcdFx0XHQvLyBQb3B1bGF0ZSByZXF1ZXN0IHdpdGggbWVzc2FnZSBkYXRhXG5cdFx0XHRcdGN0eC5yZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdGJvZHk6IG1lc3NhZ2UuYm9keSxcblx0XHRcdFx0XHRoZWFkZXJzOiBtZXNzYWdlLmF0dHJpYnV0ZXMsXG5cdFx0XHRcdFx0cXVlcnk6IHt9LFxuXHRcdFx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRcdFx0dG9waWM6IG1lc3NhZ2UudG9waWMsXG5cdFx0XHRcdFx0XHRzdWJzY3JpcHRpb246IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uIHx8IFwiXCIsXG5cdFx0XHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2UuaWQsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSBhcyB1bmtub3duIGFzIFJlcXVlc3RDb250ZXh0O1xuXG5cdFx0XHRcdC8vIFN0b3JlIG1lc3NhZ2UgbWV0YWRhdGEgaW4gY29udGV4dFxuXHRcdFx0XHRpZiAoIWN0eC52YXJzKSBjdHgudmFycyA9IHt9O1xuXHRcdFx0XHRjdHgudmFyc1tcIl9wdWJzdWJfbWVzc2FnZVwiXSA9IHtcblx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uIHx8IFwiXCIsXG5cdFx0XHRcdFx0cHVibGlzaFRpbWU6IG1lc3NhZ2UucHVibGlzaFRpbWU/LnRvSVNPU3RyaW5nKCkgPz8gXCJcIixcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiBKU09OLnN0cmluZ2lmeShtZXNzYWdlLmF0dHJpYnV0ZXMpLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke2NvbmZpZy50b3BpY306ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB3b3JrZmxvd1xuXHRcdFx0XHRjb25zdCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwibWVzc2FnZV9pZFwiLCBpZCk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwidG9waWNcIiwgY29uZmlnLnRvcGljKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWJzY3JpcHRpb25cIiwgY29uZmlnLnN1YnNjcmlwdGlvbik7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwicHJvdmlkZXJcIiwgY29uZmlnLnByb3ZpZGVyKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJlbGFwc2VkX21zXCIsIGVuZCAtIHN0YXJ0KTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcblxuXHRcdFx0XHQvLyBSZWNvcmQgbWV0cmljc1xuXHRcdFx0XHRwdWJzdWJNZXNzYWdlcy5hZGQoMSwge1xuXHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0dG9waWM6IGNvbmZpZy50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IGNvbmZpZy5zdWJzY3JpcHRpb24sXG5cdFx0XHRcdFx0cHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubmFtZSxcblx0XHRcdFx0XHRzdWNjZXNzOiBcInRydWVcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYE1lc3NhZ2UgcHJvY2Vzc2VkIGluICR7KGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zOiAke2lkfWApO1xuXG5cdFx0XHRcdC8vIEFja25vd2xlZGdlIG1lc3NhZ2UgaWYgY29uZmlndXJlZFxuXHRcdFx0XHRpZiAoY29uZmlnLmFjayAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlLmFjaygpO1xuXHRcdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBNZXNzYWdlIGFja25vd2xlZGdlZDogJHtpZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlO1xuXG5cdFx0XHRcdC8vIFNldCBzcGFuIGVycm9yXG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwic3VjY2Vzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yIGFzIEVycm9yKTtcblx0XHRcdFx0c3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwgbWVzc2FnZTogZXJyb3JNZXNzYWdlIH0pO1xuXG5cdFx0XHRcdC8vIFJlY29yZCBlcnJvciBtZXRyaWNzXG5cdFx0XHRcdHB1YnN1YkVycm9ycy5hZGQoMSwge1xuXHRcdFx0XHRcdGVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG5cdFx0XHRcdFx0dG9waWM6IGNvbmZpZy50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IGNvbmZpZy5zdWJzY3JpcHRpb24sXG5cdFx0XHRcdFx0cHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBtZXNzYWdlICR7aWR9OiAke2Vycm9yTWVzc2FnZX1gLCAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrKTtcblxuXHRcdFx0XHQvLyBOYWNrIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKGNvbmZpZy5hY2sgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0YXdhaXQgbWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBNZXNzYWdlIG5hY2tlZDogJHtpZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0c3Bhbi5lbmQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJTdWJUcmlnZ2VyO1xuIl19
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHViU3ViVHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QdWJTdWJUcmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFHSCxPQUFPLEVBRU4sYUFBYSxFQUViLE9BQU8sRUFDUCxXQUFXLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQWEsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWdGbEM7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGFBQWMsU0FBUSxXQUFXO0lBQzVDLE9BQU8sR0FBa0IsRUFBbUIsQ0FBQztJQUNwQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUkseUJBQXlCLEVBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FDdEMsQ0FBQztJQUNpQixNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUVoRDs7Ozs7O09BTUc7SUFDTyxPQUFPLENBQWlCO0lBRWxDOzs7O09BSUc7SUFDTyxXQUFXLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNOUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFH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LEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBRXRFLHVCQUF1QjtnQkFDdkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7b0JBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDbkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksUUFBUTtvQkFDN0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVztvQkFDeEMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLFNBQVM7aUJBQ3BELENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLFlBQVksRUFBRSxFQUFHLEtBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFOUYsZUFBZTtnQkFDZixJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNGLENBQUM7b0JBQVMsQ0FBQztnQkFDVixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Q7QUFFRCxlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHViU3ViVHJpZ2dlciAtIEJhc2UgY2xhc3MgZm9yIHB1Yi9zdWItYmFzZWQgd29ya2Zsb3cgdHJpZ2dlcnNcbiAqXG4gKiBFeHRlbmRzIFRyaWdnZXJCYXNlIHRvIHN1cHBvcnQgcHViL3N1YiB0cmlnZ2VyczpcbiAqIC0gR0NQIFB1Yi9TdWJcbiAqIC0gQVdTIFNOUyAodmlhIFNRUyBzdWJzY3JpcHRpb24pXG4gKiAtIEF6dXJlIFNlcnZpY2UgQnVzXG4gKlxuICogUGF0dGVybjpcbiAqIDEuIGxvYWROb2RlcygpIC0gTG9hZCBhdmFpbGFibGUgbm9kZXMgaW50byBOb2RlTWFwXG4gKiAyLiBsb2FkV29ya2Zsb3dzKCkgLSBMb2FkIHdvcmtmbG93cyB3aXRoIHB1YnN1YiB0cmlnZ2Vyc1xuICogMy4gc3RhcnRTdWJzY3JpYmVyKCkgLSBDb25uZWN0IHRvIHB1Yi9zdWIgYW5kIHN0YXJ0IHJlY2VpdmluZyBtZXNzYWdlc1xuICogNC4gRm9yIGVhY2ggbWVzc2FnZTpcbiAqICAgIC0gTWF0Y2ggd29ya2Zsb3cgYnkgdHJpZ2dlciBjb25maWcgKHRvcGljL3N1YnNjcmlwdGlvbilcbiAqICAgIC0gQ3JlYXRlIGNvbnRleHQgd2l0aCB0aGlzLmNyZWF0ZUNvbnRleHQoKVxuICogICAgLSBQb3B1bGF0ZSBjdHgucmVxdWVzdCB3aXRoIG1lc3NhZ2UgZGF0YVxuICogICAgLSBFeGVjdXRlIHdvcmtmbG93IHZpYSB0aGlzLnJ1bihjdHgpXG4gKiAgICAtIEFjay9uYWNrIGJhc2VkIG9uIHJlc3BvbnNlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIZWxwZXJSZXNwb25zZSwgUHViU3ViUHJvdmlkZXIsIFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJsb2tTZXJ2aWNlLFxuXHREZWZhdWx0TG9nZ2VyLFxuXHR0eXBlIEdsb2JhbE9wdGlvbnMsXG5cdE5vZGVNYXAsXG5cdFRyaWdnZXJCYXNlLFxuXHR0eXBlIFRyaWdnZXJSZXNwb25zZSxcbn0gZnJvbSBcIkBibG9ranMvcnVubmVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBibG9ranMvc2hhcmVkXCI7XG5pbXBvcnQgeyB0eXBlIFNwYW4sIFNwYW5TdGF0dXNDb2RlLCBtZXRyaWNzLCB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuXG4vKipcbiAqIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBwdWIvc3ViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHViU3ViTWVzc2FnZSB7XG5cdC8qKiBVbmlxdWUgbWVzc2FnZSBJRCAqL1xuXHRpZDogc3RyaW5nO1xuXHQvKiogTWVzc2FnZSBib2R5IChwYXJzZWQpICovXG5cdGJvZHk6IHVua25vd247XG5cdC8qKiBNZXNzYWdlIGF0dHJpYnV0ZXMvbWV0YWRhdGEgKi9cblx0YXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0LyoqIE9yaWdpbmFsIHJhdyBtZXNzYWdlIGZyb20gcHJvdmlkZXIgKi9cblx0cmF3OiB1bmtub3duO1xuXHQvKiogVG9waWMgbmFtZSAqL1xuXHR0b3BpYzogc3RyaW5nO1xuXHQvKiogU3Vic2NyaXB0aW9uIG5hbWUgKi9cblx0c3Vic2NyaXB0aW9uPzogc3RyaW5nO1xuXHQvKiogUHVibGlzaCB0aW1lc3RhbXAgKi9cblx0cHVibGlzaFRpbWU/OiBEYXRlO1xuXHQvKiogQWNrbm93bGVkZ2UgdGhlIG1lc3NhZ2UgKi9cblx0YWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogUmVqZWN0L25hY2sgdGhlIG1lc3NhZ2UgKi9cblx0bmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQdWIvU3ViIGFkYXB0ZXIgaW50ZXJmYWNlIC0gaW1wbGVtZW50ZWQgYnkgZWFjaCBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YlN1YkFkYXB0ZXIge1xuXHQvKiogUHJvdmlkZXIgbmFtZSAqL1xuXHRyZWFkb25seSBwcm92aWRlcjogUHViU3ViUHJvdmlkZXI7XG5cblx0LyoqIENvbm5lY3QgdG8gdGhlIHB1Yi9zdWIgc3lzdGVtICovXG5cdGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKiogRGlzY29ubmVjdCBmcm9tIHRoZSBwdWIvc3ViIHN5c3RlbSAqL1xuXHRkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFN1YnNjcmliZSB0byBhIHRvcGljIGFuZCByZWNlaXZlIG1lc3NhZ2VzICovXG5cdHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD47XG5cblx0LyoqIFVuc3Vic2NyaWJlIGZyb20gYSB0b3BpYyAqL1xuXHR1bnN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCBhIHNpbmdsZSBtZXNzYWdlIHRvIGEgdG9waWMuIFVzZWQgYnkgdGhlXG5cdCAqIGBAYmxva2pzL3B1YnN1Yi1wdWJsaXNoYCBoZWxwZXIgYW5kIGFueSB3b3JrZmxvdyB0aGF0IGZhbi1vdXRzXG5cdCAqIGV2ZW50cyB0byBzdWJzY3JpYmVycy4gUHJvdmlkZXItcG9ydGFibGU6IGVhY2ggYWRhcHRlciB3cmFwcyBpdHNcblx0ICogbmF0aXZlIHByb2R1Y2VyIGNsaWVudC5cblx0ICpcblx0ICogT3B0aW9uYWwgYHBhcnRpdGlvbktleWAgLyBgb3JkZXJpbmdLZXlgIGlzIGhvbm9yZWQgYnkgcHJvdmlkZXJzXG5cdCAqIHRoYXQgc3VwcG9ydCBwZXIta2V5IG9yZGVyaW5nIChLYWZrYSwgR0NQIFB1Yi9TdWIgb3JkZXJlZFxuXHQgKiBkZWxpdmVyeSkuIElnbm9yZWQgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGlzaCh0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duLCBvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG5cdC8qKiBDaGVjayBpZiBjb25uZWN0ZWQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcblxuXHQvKiogSGVhbHRoIGNoZWNrICovXG5cdGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogV29ya2Zsb3cgbW9kZWwgd2l0aCBwdWIvc3ViIHRyaWdnZXIgY29uZmlndXJhdGlvblxuICovXG5pbnRlcmZhY2UgUHViU3ViV29ya2Zsb3dNb2RlbCB7XG5cdHBhdGg6IHN0cmluZztcblx0Y29uZmlnOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdHZlcnNpb246IHN0cmluZztcblx0XHR0cmlnZ2VyPzoge1xuXHRcdFx0cHVic3ViPzogUHViU3ViVHJpZ2dlck9wdHM7XG5cdFx0XHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHRcdH07XG5cdFx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0fTtcbn1cblxuLyoqXG4gKiBQdWJTdWJUcmlnZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHViL3N1Yi1iYXNlZCB0cmlnZ2Vyc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHViU3ViVHJpZ2dlciBleHRlbmRzIFRyaWdnZXJCYXNlIHtcblx0cHJvdGVjdGVkIG5vZGVNYXA6IEdsb2JhbE9wdGlvbnMgPSB7fSBhcyBHbG9iYWxPcHRpb25zO1xuXHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKFxuXHRcdHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSB8fCBcInRyaWdnZXItcHVic3ViLXdvcmtmbG93XCIsXG5cdFx0cHJvY2Vzcy5lbnYuUFJPSkVDVF9WRVJTSU9OIHx8IFwiMC4wLjFcIixcblx0KTtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgYmFjay1jb21wYXQgZGVmYXVsdCBhZGFwdGVyLiBXaGVuIHN1YmNsYXNzZXMgc2V0XG5cdCAqIGBwcm90ZWN0ZWQgYWRhcHRlciA9IG5ldyBHQ1BQdWJTdWJBZGFwdGVyKClgIChwcmUtdjAuNyBwYXR0ZXJuKSxcblx0ICogQUxMIHdvcmtmbG93cyByb3V0ZSB0aHJvdWdoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlaXIgYHByb3ZpZGVyYFxuXHQgKiBmaWVsZC4gV2hlbiB1bnNldCwgZWFjaCB3b3JrZmxvdydzIGBwcm92aWRlcmAgaXMgcmVzb2x2ZWQgdmlhXG5cdCAqIHRoZSBmYWN0b3J5LlxuXHQgKi9cblx0cHJvdGVjdGVkIGFkYXB0ZXI/OiBQdWJTdWJBZGFwdGVyO1xuXG5cdC8qKlxuXHQgKiB2MC43IFBSIDYg4oCUIGFkYXB0ZXIgcG9vbCwga2V5ZWQgYnkgcHJvdmlkZXIuIFBvcHVsYXRlZCBsYXppbHkgaW5cblx0ICogYGxpc3RlbigpYCBhcyB3b3JrZmxvd3MgYXJlIG1hdGNoZWQgdG8gcHJvdmlkZXJzLiBEcmFpbmVkIGluXG5cdCAqIGBzdG9wKClgLiBPbmUgYWRhcHRlciAob25lIGJyb2tlciBjb25uZWN0aW9uKSBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWRhcHRlclBvb2w6IE1hcDxzdHJpbmcsIFB1YlN1YkFkYXB0ZXI+ID0gbmV3IE1hcCgpO1xuXG5cdC8vIFN1YmNsYXNzZXMgcHJvdmlkZSB0aGVzZVxuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgbm9kZXM6IFJlY29yZDxzdHJpbmcsIEJsb2tTZXJ2aWNlPHVua25vd24+Pjtcblx0cHJvdGVjdGVkIGFic3RyYWN0IHdvcmtmbG93czogUmVjb3JkPHN0cmluZywgSGVscGVyUmVzcG9uc2U+O1xuXG5cdC8qKlxuXHQgKiBMb2FkIG5vZGVzIGludG8gdGhlIG5vZGUgbWFwXG5cdCAqL1xuXHRsb2FkTm9kZXMoKTogdm9pZCB7XG5cdFx0dGhpcy5ub2RlTWFwLm5vZGVzID0gbmV3IE5vZGVNYXAoKTtcblx0XHRjb25zdCBub2RlS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIG5vZGVLZXlzKSB7XG5cdFx0XHR0aGlzLm5vZGVNYXAubm9kZXMuYWRkTm9kZShrZXksIHRoaXMubm9kZXNba2V5XSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvYWQgd29ya2Zsb3dzIGludG8gdGhlIHdvcmtmbG93IG1hcFxuXHQgKi9cblx0bG9hZFdvcmtmbG93cygpOiB2b2lkIHtcblx0XHR0aGlzLm5vZGVNYXAud29ya2Zsb3dzID0gdGhpcy53b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogU3RhcnQgdGhlIHB1Yi9zdWIgc3Vic2NyaWJlciAtIG1haW4gZW50cnkgcG9pbnRcblx0ICovXG5cdGFzeW5jIGxpc3RlbigpOiBQcm9taXNlPG51bWJlcj4ge1xuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRDb3VudGVyKCk7XG5cblx0XHQvLyBJbml0aWFsaXplIG5vZGVzIGFuZCB3b3JrZmxvd3MgKGNhbGxlZCBoZXJlIGJlY2F1c2Ugc3ViY2xhc3MgcHJvcGVydGllc1xuXHRcdC8vIGFyZW4ndCBhdmFpbGFibGUgaW4gcGFyZW50IGNvbnN0cnVjdG9yKVxuXHRcdHRoaXMubG9hZE5vZGVzKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRmluZCBhbGwgd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2Vyc1xuXHRcdFx0Y29uc3QgcHVic3ViV29ya2Zsb3dzID0gdGhpcy5nZXRQdWJTdWJXb3JrZmxvd3MoKTtcblxuXHRcdFx0aWYgKHB1YnN1YldvcmtmbG93cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKFwiTm8gd29ya2Zsb3dzIHdpdGggcHViL3N1YiB0cmlnZ2VycyBmb3VuZFwiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdWJzY3JpYmUgdG8gZWFjaCB0b3BpYyB2aWEgdGhlIGFkYXB0ZXIgdGhhdCBvd25zIGl0c1xuXHRcdFx0Ly8gcHJvdmlkZXIuIFBlci13b3JrZmxvdyBgcHJvdmlkZXJgIGZpZWxkIHdpdGggc3ViY2xhc3MtXG5cdFx0XHQvLyBhZGFwdGVyIGJhY2stY29tcGF0IChoYW5kbGVkIGluIHJlc29sdmVBZGFwdGVyRm9yV29ya2Zsb3cpLlxuXHRcdFx0Zm9yIChjb25zdCB3b3JrZmxvdyBvZiBwdWJzdWJXb3JrZmxvd3MpIHtcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gd29ya2Zsb3cuY29uZmlnLnRyaWdnZXI/LnB1YnN1YiBhcyBQdWJTdWJUcmlnZ2VyT3B0cztcblx0XHRcdFx0Y29uc3QgYWRhcHRlciA9IGF3YWl0IHRoaXMucmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWcpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coXG5cdFx0XHRcdFx0YFN1YnNjcmliaW5nIHRvIHRvcGljOiAke2NvbmZpZy50b3BpY30gdmlhICR7YWRhcHRlci5wcm92aWRlcn0gKHN1YnNjcmlwdGlvbjogJHtjb25maWcuc3Vic2NyaXB0aW9uID8/IFwiPGF1dG8+XCJ9LCBncm91cDogJHtjb25maWcuY29uc3VtZXJHcm91cCA/PyBcIjxmYW4tb3V0PlwifSlgLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuc3Vic2NyaWJlKGNvbmZpZywgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSwgd29ya2Zsb3csIGNvbmZpZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxvZ2dlci5sb2coYFB1Yi9TdWIgdHJpZ2dlciBzdGFydGVkLiBMaXN0ZW5pbmcgdG8gJHtwdWJzdWJXb3JrZmxvd3MubGVuZ3RofSBzdWJzY3JpcHRpb24ocylgKTtcblxuXHRcdFx0Ly8gRW5hYmxlIEhNUiBpbiBkZXZlbG9wbWVudCBtb2RlXG5cdFx0XHRpZiAocHJvY2Vzcy5lbnYuQkxPS19ITVIgPT09IFwidHJ1ZVwiIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lbmFibGVIb3RSZWxvYWQoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZW5kQ291bnRlcihzdGFydFRpbWUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHB1Yi9zdWIgdHJpZ2dlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3RvcCB0aGUgcHViL3N1YiBzdWJzY3JpYmVyIOKAlCBkcmFpbnMgZXZlcnkgYWRhcHRlciBpbiB0aGUgcG9vbFxuXHQgKiBwbHVzIHRoZSBzdWJjbGFzcy1zZXQgYWRhcHRlciAoaWYgYW55KS5cblx0ICovXG5cdGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Zm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlclBvb2wudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGFkYXB0ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBbYmxva11bcHVic3ViXSBkaXNjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmFkYXB0ZXJQb29sLmNsZWFyKCk7XG5cdFx0dGhpcy5sb2dnZXIubG9nKFwiUHViL1N1YiB0cmlnZ2VyIHN0b3BwZWRcIik7XG5cdH1cblxuXHQvKipcblx0ICogdjAuNyBQUiA2IOKAlCBwaWNrIHRoZSBhZGFwdGVyIGZvciBhIHdvcmtmbG93J3MgYHByb3ZpZGVyYCBmaWVsZC5cblx0ICpcblx0ICogUmVzb2x1dGlvbiBvcmRlcjpcblx0ICogICAxLiBTdWJjbGFzcy1zZXQgYHRoaXMuYWRhcHRlcmAgKGJhY2stY29tcGF0KS5cblx0ICogICAyLiBQZXItd29ya2Zsb3cgYHByb3ZpZGVyYCBmaWVsZCB2aWEgdGhlIGZhY3RvcnkuXG5cdCAqICAgMy4gYEJMT0tfUFVCU1VCX0FEQVBURVJgIGVudiB2YXIuXG5cdCAqICAgNC4gYFwibmF0c1wiYCBmYWxsYmFjay5cblx0ICpcblx0ICogQWRhcHRlcnMgYXJlIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UgYW5kIHBvb2xlZCBwZXIgcHJvdmlkZXIuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYXN5bmMgcmVzb2x2ZUFkYXB0ZXJGb3JXb3JrZmxvdyhjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzKTogUHJvbWlzZTxQdWJTdWJBZGFwdGVyPiB7XG5cdFx0aWYgKHRoaXMuYWRhcHRlcikge1xuXHRcdFx0aWYgKCF0aGlzLmFkYXB0ZXIuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFkYXB0ZXIuY29ubmVjdCgpO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5sb2coYENvbm5lY3RlZCB0byAke3RoaXMuYWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW0gKHN1YmNsYXNzIGFkYXB0ZXIpYCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFkYXB0ZXJQb29sLnNldCh0aGlzLmFkYXB0ZXIucHJvdmlkZXIsIHRoaXMuYWRhcHRlcik7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGFwdGVyO1xuXHRcdH1cblx0XHRjb25zdCB7IHJlc29sdmVQcm92aWRlciwgY3JlYXRlUHViU3ViQWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9hZGFwdGVycy9mYWN0b3J5XCIpO1xuXHRcdGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZy5wcm92aWRlcik7XG5cdFx0bGV0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJQb29sLmdldChwcm92aWRlcik7XG5cdFx0aWYgKCFhZGFwdGVyKSB7XG5cdFx0XHRhZGFwdGVyID0gY3JlYXRlUHViU3ViQWRhcHRlcihwcm92aWRlcik7XG5cdFx0XHRhd2FpdCBhZGFwdGVyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMubG9nZ2VyLmxvZyhgQ29ubmVjdGVkIHRvICR7YWRhcHRlci5wcm92aWRlcn0gcHViL3N1YiBzeXN0ZW1gKTtcblx0XHRcdHRoaXMuYWRhcHRlclBvb2wuc2V0KHByb3ZpZGVyLCBhZGFwdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFkYXB0ZXI7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgb25IbXJXb3JrZmxvd0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ2dlci5sb2coXCJbSE1SXSBQdWIvU3ViIHdvcmtmbG93IGNoYW5nZWQsIHJlbG9hZGluZy4uLlwiKTtcblx0XHRhd2FpdCB0aGlzLndhaXRGb3JJbkZsaWdodFJlcXVlc3RzKCk7XG5cdFx0YXdhaXQgdGhpcy5zdG9wKCk7XG5cdFx0dGhpcy5sb2FkV29ya2Zsb3dzKCk7XG5cdFx0YXdhaXQgdGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYWxsIHdvcmtmbG93cyB0aGF0IGhhdmUgcHViL3N1YiB0cmlnZ2Vyc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldFB1YlN1YldvcmtmbG93cygpOiBQdWJTdWJXb3JrZmxvd01vZGVsW10ge1xuXHRcdGNvbnN0IHdvcmtmbG93czogUHViU3ViV29ya2Zsb3dNb2RlbFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IFtwYXRoLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ub2RlTWFwLndvcmtmbG93cyB8fCB7fSkpIHtcblx0XHRcdC8vIEhlbHBlclJlc3BvbnNlIGhhcyBhIHByb3RlY3RlZCBfY29uZmlnIHByb3BlcnR5XG5cdFx0XHRjb25zdCB3b3JrZmxvd0NvbmZpZyA9ICh3b3JrZmxvdyBhcyB1bmtub3duIGFzIHsgX2NvbmZpZzogUHViU3ViV29ya2Zsb3dNb2RlbFtcImNvbmZpZ1wiXSB9KS5fY29uZmlnO1xuXG5cdFx0XHRpZiAod29ya2Zsb3dDb25maWc/LnRyaWdnZXIpIHtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlclR5cGUgPSBPYmplY3Qua2V5cyh3b3JrZmxvd0NvbmZpZy50cmlnZ2VyKVswXTtcblxuXHRcdFx0XHRpZiAodHJpZ2dlclR5cGUgPT09IFwicHVic3ViXCIgJiYgd29ya2Zsb3dDb25maWcudHJpZ2dlci5wdWJzdWIpIHtcblx0XHRcdFx0XHR3b3JrZmxvd3MucHVzaCh7XG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0Y29uZmlnOiB3b3JrZmxvd0NvbmZpZyxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB3b3JrZmxvd3M7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlIGFuIGluY29taW5nIG1lc3NhZ2Vcblx0ICovXG5cdHByb3RlY3RlZCBhc3luYyBoYW5kbGVNZXNzYWdlKFxuXHRcdG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UsXG5cdFx0d29ya2Zsb3c6IFB1YlN1YldvcmtmbG93TW9kZWwsXG5cdFx0Y29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaWQgPSBtZXNzYWdlLmlkIHx8IHV1aWQoKTtcblx0XHRjb25zdCBkZWZhdWx0TWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKFwiZGVmYXVsdFwiKTtcblx0XHRjb25zdCBwdWJzdWJNZXNzYWdlcyA9IGRlZmF1bHRNZXRlci5jcmVhdGVDb3VudGVyKFwicHVic3ViX21lc3NhZ2VzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZXMgcHJvY2Vzc2VkXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3QgcHVic3ViRXJyb3JzID0gZGVmYXVsdE1ldGVyLmNyZWF0ZUNvdW50ZXIoXCJwdWJzdWJfZXJyb3JzXCIsIHtcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlB1Yi9TdWIgbWVzc2FnZSBwcm9jZXNzaW5nIGVycm9yc1wiLFxuXHRcdH0pO1xuXG5cdFx0YXdhaXQgdGhpcy50cmFjZXIuc3RhcnRBY3RpdmVTcGFuKGBwdWJzdWI6JHtjb25maWcudG9waWN9YCwgYXN5bmMgKHNwYW46IFNwYW4pID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHdvcmtmbG93XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5pbml0KHdvcmtmbG93LnBhdGgsIHRoaXMubm9kZU1hcCk7XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgY3R4OiBDb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCwgd29ya2Zsb3cucGF0aCwgaWQpO1xuXG5cdFx0XHRcdC8vIFBvcHVsYXRlIHJlcXVlc3Qgd2l0aCBtZXNzYWdlIGRhdGFcblx0XHRcdFx0Y3R4LnJlcXVlc3QgPSB7XG5cdFx0XHRcdFx0Ym9keTogbWVzc2FnZS5ib2R5LFxuXHRcdFx0XHRcdGhlYWRlcnM6IG1lc3NhZ2UuYXR0cmlidXRlcyxcblx0XHRcdFx0XHRxdWVyeToge30sXG5cdFx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogbWVzc2FnZS5zdWJzY3JpcHRpb24gfHwgXCJcIixcblx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZS5pZCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9IGFzIHVua25vd24gYXMgUmVxdWVzdENvbnRleHQ7XG5cblx0XHRcdFx0Ly8gU3RvcmUgbWVzc2FnZSBtZXRhZGF0YSBpbiBjb250ZXh0XG5cdFx0XHRcdGlmICghY3R4LnZhcnMpIGN0eC52YXJzID0ge307XG5cdFx0XHRcdGN0eC52YXJzLl9wdWJzdWJfbWVzc2FnZSA9IHtcblx0XHRcdFx0XHR0b3BpYzogbWVzc2FnZS50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IG1lc3NhZ2Uuc3Vic2NyaXB0aW9uIHx8IFwiXCIsXG5cdFx0XHRcdFx0cHVibGlzaFRpbWU6IG1lc3NhZ2UucHVibGlzaFRpbWU/LnRvSVNPU3RyaW5nKCkgPz8gXCJcIixcblx0XHRcdFx0XHRhdHRyaWJ1dGVzOiBKU09OLnN0cmluZ2lmeShtZXNzYWdlLmF0dHJpYnV0ZXMpLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGN0eC5sb2dnZXIubG9nKGBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke2NvbmZpZy50b3BpY306ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSB3b3JrZmxvd1xuXHRcdFx0XHRjb25zdCByZXNwb25zZTogVHJpZ2dlclJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oY3R4KTtcblx0XHRcdFx0Y29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gYXR0cmlidXRlc1xuXHRcdFx0XHRzcGFuLnNldEF0dHJpYnV0ZShcInN1Y2Nlc3NcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwibWVzc2FnZV9pZFwiLCBpZCk7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwidG9waWNcIiwgY29uZmlnLnRvcGljKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWJzY3JpcHRpb25cIiwgY29uZmlnLnN1YnNjcmlwdGlvbiA/PyBcIjxhdXRvPlwiKTtcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJwcm92aWRlclwiLCBjb25maWcucHJvdmlkZXIgPz8gXCI8ZGVmYXVsdD5cIik7XG5cdFx0XHRcdHNwYW4uc2V0QXR0cmlidXRlKFwiZWxhcHNlZF9tc1wiLCBlbmQgLSBzdGFydCk7XG5cdFx0XHRcdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIG1ldHJpY3Ncblx0XHRcdFx0cHVic3ViTWVzc2FnZXMuYWRkKDEsIHtcblx0XHRcdFx0XHRlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuXHRcdFx0XHRcdHRvcGljOiBjb25maWcudG9waWMsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uOiBjb25maWcuc3Vic2NyaXB0aW9uID8/IFwiPGF1dG8+XCIsXG5cdFx0XHRcdFx0cHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlciA/PyBcIjxkZWZhdWx0PlwiLFxuXHRcdFx0XHRcdHdvcmtmbG93X25hbWU6IHRoaXMuY29uZmlndXJhdGlvbi5uYW1lLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6IFwidHJ1ZVwiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjdHgubG9nZ2VyLmxvZyhgTWVzc2FnZSBwcm9jZXNzZWQgaW4gJHsoZW5kIC0gc3RhcnQpLnRvRml4ZWQoMil9bXM6ICR7aWR9YCk7XG5cblx0XHRcdFx0Ly8gQWNrbm93bGVkZ2UgbWVzc2FnZSBpZiBjb25maWd1cmVkXG5cdFx0XHRcdGlmIChjb25maWcuYWNrICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2UuYWNrKCk7XG5cdFx0XHRcdFx0Y3R4LmxvZ2dlci5sb2coYE1lc3NhZ2UgYWNrbm93bGVkZ2VkOiAke2lkfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2U7XG5cblx0XHRcdFx0Ly8gU2V0IHNwYW4gZXJyb3Jcblx0XHRcdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoXCJzdWNjZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0c3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyb3IgYXMgRXJyb3IpO1xuXHRcdFx0XHRzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLCBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgfSk7XG5cblx0XHRcdFx0Ly8gUmVjb3JkIGVycm9yIG1ldHJpY3Ncblx0XHRcdFx0cHVic3ViRXJyb3JzLmFkZCgxLCB7XG5cdFx0XHRcdFx0ZW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcblx0XHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogY29uZmlnLnN1YnNjcmlwdGlvbiA/PyBcIjxhdXRvPlwiLFxuXHRcdFx0XHRcdHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIgPz8gXCI8ZGVmYXVsdD5cIixcblx0XHRcdFx0XHR3b3JrZmxvd19uYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24/Lm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBtZXNzYWdlICR7aWR9OiAke2Vycm9yTWVzc2FnZX1gLCAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrKTtcblxuXHRcdFx0XHQvLyBOYWNrIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKGNvbmZpZy5hY2sgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0YXdhaXQgbWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdFx0dGhpcy5sb2dnZXIubG9nKGBNZXNzYWdlIG5hY2tlZDogJHtpZH1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0c3Bhbi5lbmQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdWJTdWJUcmlnZ2VyO1xuIl19
|
|
@@ -33,6 +33,11 @@ export declare class AWSSNSAdapter implements PubSubAdapter {
|
|
|
33
33
|
private config;
|
|
34
34
|
private pollingIntervals;
|
|
35
35
|
private shouldStop;
|
|
36
|
+
/**
|
|
37
|
+
* Type-narrowing accessor for `this.sqsClient`. Field is undefined
|
|
38
|
+
* until `connect()` runs.
|
|
39
|
+
*/
|
|
40
|
+
private requireSqsClient;
|
|
36
41
|
constructor(config?: Partial<AWSSNSConfig>);
|
|
37
42
|
/**
|
|
38
43
|
* Connect to AWS
|
|
@@ -59,6 +64,17 @@ export declare class AWSSNSAdapter implements PubSubAdapter {
|
|
|
59
64
|
* Check if connected to AWS
|
|
60
65
|
*/
|
|
61
66
|
isConnected(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* v0.7 PR 6 — publish to an SNS topic.
|
|
69
|
+
*
|
|
70
|
+
* `topic` must be the SNS topic ARN. `partitionKey` /
|
|
71
|
+
* `orderingKey` map to the FIFO `MessageGroupId` field for
|
|
72
|
+
* `.fifo` topics; ignored otherwise.
|
|
73
|
+
*/
|
|
74
|
+
publish(topic: string, payload: unknown, opts?: {
|
|
75
|
+
partitionKey?: string;
|
|
76
|
+
orderingKey?: string;
|
|
77
|
+
}): Promise<void>;
|
|
62
78
|
/**
|
|
63
79
|
* Health check - verify AWS connectivity
|
|
64
80
|
*/
|
|
@@ -24,6 +24,16 @@ export class AWSSNSAdapter {
|
|
|
24
24
|
config;
|
|
25
25
|
pollingIntervals = new Map();
|
|
26
26
|
shouldStop = false;
|
|
27
|
+
/**
|
|
28
|
+
* Type-narrowing accessor for `this.sqsClient`. Field is undefined
|
|
29
|
+
* until `connect()` runs.
|
|
30
|
+
*/
|
|
31
|
+
requireSqsClient() {
|
|
32
|
+
if (!this.sqsClient) {
|
|
33
|
+
throw new Error("[AWSSNSAdapter] SQS client is not initialised — call connect() first");
|
|
34
|
+
}
|
|
35
|
+
return this.sqsClient;
|
|
36
|
+
}
|
|
27
37
|
constructor(config) {
|
|
28
38
|
this.config = {
|
|
29
39
|
region: config?.region || process.env.AWS_REGION || "us-east-1",
|
|
@@ -48,8 +58,7 @@ export class AWSSNSAdapter {
|
|
|
48
58
|
console.log(`[AWSSNSAdapter] Connected to AWS SNS/SQS: ${this.config.region}`);
|
|
49
59
|
}
|
|
50
60
|
catch (error) {
|
|
51
|
-
throw new Error(`Failed to connect to AWS: ${error.message}. `
|
|
52
|
-
`Make sure @aws-sdk/client-sqs is installed: npm install @aws-sdk/client-sqs`);
|
|
61
|
+
throw new Error(`Failed to connect to AWS: ${error.message}. Make sure @aws-sdk/client-sqs is installed: npm install @aws-sdk/client-sqs`);
|
|
53
62
|
}
|
|
54
63
|
}
|
|
55
64
|
/**
|
|
@@ -75,7 +84,10 @@ export class AWSSNSAdapter {
|
|
|
75
84
|
if (!this.connected) {
|
|
76
85
|
throw new Error("Not connected to AWS. Call connect() first.");
|
|
77
86
|
}
|
|
78
|
-
// In AWS, subscription is the SQS queue URL that's subscribed to the SNS topic
|
|
87
|
+
// In AWS, subscription is the SQS queue URL that's subscribed to the SNS topic.
|
|
88
|
+
if (!config.subscription) {
|
|
89
|
+
throw new Error("[AWSSNSAdapter] `subscription` is required — must be the SQS queue URL bound to the SNS topic.");
|
|
90
|
+
}
|
|
79
91
|
const queueUrl = config.subscription;
|
|
80
92
|
// Start polling the SQS queue
|
|
81
93
|
this.poll(queueUrl, config, handler);
|
|
@@ -96,7 +108,7 @@ export class AWSSNSAdapter {
|
|
|
96
108
|
MessageAttributeNames: ["All"],
|
|
97
109
|
AttributeNames: ["All"],
|
|
98
110
|
});
|
|
99
|
-
const response = await this.
|
|
111
|
+
const response = await this.requireSqsClient().send(command);
|
|
100
112
|
if (response.Messages && response.Messages.length > 0) {
|
|
101
113
|
for (const msg of response.Messages) {
|
|
102
114
|
// Parse SNS message wrapper
|
|
@@ -126,7 +138,8 @@ export class AWSSNSAdapter {
|
|
|
126
138
|
// SQS message attributes
|
|
127
139
|
if (msg.MessageAttributes) {
|
|
128
140
|
for (const [key, attr] of Object.entries(msg.MessageAttributes)) {
|
|
129
|
-
|
|
141
|
+
const sqsAttr = attr;
|
|
142
|
+
attributes[key] = sqsAttr.StringValue || "";
|
|
130
143
|
}
|
|
131
144
|
}
|
|
132
145
|
// SNS message attributes (if present)
|
|
@@ -149,7 +162,7 @@ export class AWSSNSAdapter {
|
|
|
149
162
|
QueueUrl: queueUrl,
|
|
150
163
|
ReceiptHandle: msg.ReceiptHandle,
|
|
151
164
|
});
|
|
152
|
-
await this.
|
|
165
|
+
await this.requireSqsClient().send(deleteCommand);
|
|
153
166
|
},
|
|
154
167
|
nack: async () => {
|
|
155
168
|
// Let the visibility timeout expire to return the message
|
|
@@ -160,7 +173,7 @@ export class AWSSNSAdapter {
|
|
|
160
173
|
ReceiptHandle: msg.ReceiptHandle,
|
|
161
174
|
VisibilityTimeout: 0,
|
|
162
175
|
});
|
|
163
|
-
await this.
|
|
176
|
+
await this.requireSqsClient().send(changeCommand);
|
|
164
177
|
},
|
|
165
178
|
};
|
|
166
179
|
// Process message
|
|
@@ -199,6 +212,36 @@ export class AWSSNSAdapter {
|
|
|
199
212
|
isConnected() {
|
|
200
213
|
return this.connected;
|
|
201
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* v0.7 PR 6 — publish to an SNS topic.
|
|
217
|
+
*
|
|
218
|
+
* `topic` must be the SNS topic ARN. `partitionKey` /
|
|
219
|
+
* `orderingKey` map to the FIFO `MessageGroupId` field for
|
|
220
|
+
* `.fifo` topics; ignored otherwise.
|
|
221
|
+
*/
|
|
222
|
+
async publish(topic, payload, opts) {
|
|
223
|
+
if (!this.connected)
|
|
224
|
+
throw new Error("[blok][pubsub-aws] not connected. Call connect() first.");
|
|
225
|
+
const moduleName = "@aws-sdk/client-sns";
|
|
226
|
+
// biome-ignore lint/suspicious/noExplicitAny: SDK loaded at runtime as a peer dep.
|
|
227
|
+
const sns = await import(moduleName);
|
|
228
|
+
const client = new sns.SNSClient({ region: this.config.region });
|
|
229
|
+
const isFifo = topic.endsWith(".fifo");
|
|
230
|
+
const params = {
|
|
231
|
+
TopicArn: topic,
|
|
232
|
+
Message: typeof payload === "string" ? payload : JSON.stringify(payload),
|
|
233
|
+
};
|
|
234
|
+
if (isFifo) {
|
|
235
|
+
params.MessageGroupId = opts?.partitionKey ?? opts?.orderingKey ?? "default";
|
|
236
|
+
params.MessageDeduplicationId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
await client.send(new sns.PublishCommand(params));
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
client.destroy?.();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
202
245
|
/**
|
|
203
246
|
* Health check - verify AWS connectivity
|
|
204
247
|
*/
|
|
@@ -208,7 +251,7 @@ export class AWSSNSAdapter {
|
|
|
208
251
|
try {
|
|
209
252
|
const { ListQueuesCommand } = await import("@aws-sdk/client-sqs");
|
|
210
253
|
const command = new ListQueuesCommand({ MaxResults: 1 });
|
|
211
|
-
await this.
|
|
254
|
+
await this.requireSqsClient().send(command);
|
|
212
255
|
return true;
|
|
213
256
|
}
|
|
214
257
|
catch {
|
|
@@ -217,4 +260,4 @@ export class AWSSNSAdapter {
|
|
|
217
260
|
}
|
|
218
261
|
}
|
|
219
262
|
export default AWSSNSAdapter;
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVdTU05TQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9BV1NTTlNBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFZbEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUNoQixRQUFRLEdBQUcsS0FBYyxDQUFDO0lBRTNCLFNBQVMsQ0FBTTtJQUNmLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsTUFBTSxDQUFlO0lBQ3JCLGdCQUFnQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzFELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFM0IsWUFBWSxNQUE4QjtRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ2IsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksV0FBVztZQUMvRCxlQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMxRyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7U0FDN0csQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDO1lBQ0osNEJBQTRCO1lBQzVCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRTFELElB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QUE0QyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQztZQUNKLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0YsQ0FBQztDQUNEO0FBRUQsZUFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFXU1NOU0FkYXB0ZXIgLSBBV1MgU05TL1NRUyBhZGFwdGVyIGZvciBQdWJTdWJUcmlnZ2VyXG4gKlxuICogVXNlcyBBV1MgU0RLIHYzIGZvciBTTlMvU1FTIGNvbm5lY3Rpdml0eS5cbiAqIFNOUyB0b3BpY3MgZGVsaXZlciB0byBTUVMgcXVldWVzLCB3aGljaCB0aGlzIGFkYXB0ZXIgcG9sbHMuXG4gKlxuICogUmVxdWlyZXM6IG5wbSBpbnN0YWxsIEBhd3Mtc2RrL2NsaWVudC1zbnMgQGF3cy1zZGsvY2xpZW50LXNxc1xuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gQVdTX1JFR0lPTjogQVdTIHJlZ2lvbiAoZGVmYXVsdDogdXMtZWFzdC0xKVxuICogLSBBV1NfQUNDRVNTX0tFWV9JRDogQVdTIGFjY2VzcyBrZXkgKG9wdGlvbmFsIGlmIHVzaW5nIElBTSByb2xlcylcbiAqIC0gQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZOiBBV1Mgc2VjcmV0IGtleSAob3B0aW9uYWwgaWYgdXNpbmcgSUFNIHJvbGVzKVxuICogLSBTUVNfV0FJVF9USU1FX1NFQ09ORFM6IExvbmcgcG9sbGluZyB3YWl0IHRpbWUgKGRlZmF1bHQ6IDIwKVxuICogLSBTUVNfTUFYX01FU1NBR0VTOiBNYXggbWVzc2FnZXMgcGVyIHJlY2VpdmUgKGRlZmF1bHQ6IDEwKVxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBBV1MgU05TL1NRUyBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVdTU05TQ29uZmlnIHtcblx0cmVnaW9uOiBzdHJpbmc7XG5cdHdhaXRUaW1lU2Vjb25kcz86IG51bWJlcjtcblx0bWF4TnVtYmVyT2ZNZXNzYWdlcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBV1NTTlNBZGFwdGVyIC0gQVdTIFNOUyBpbXBsZW1lbnRhdGlvbiB1c2luZyBTUVMgc3Vic2NyaXB0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgQVdTU05TQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiYXdzXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBzcXNDbGllbnQ6IGFueTtcblx0cHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBjb25maWc6IEFXU1NOU0NvbmZpZztcblx0cHJpdmF0ZSBwb2xsaW5nSW50ZXJ2YWxzOiBNYXA8c3RyaW5nLCBOb2RlSlMuVGltZW91dD4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgc2hvdWxkU3RvcCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8QVdTU05TQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cmVnaW9uOiBjb25maWc/LnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCIsXG5cdFx0XHR3YWl0VGltZVNlY29uZHM6IGNvbmZpZz8ud2FpdFRpbWVTZWNvbmRzID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5TUVNfV0FJVF9USU1FX1NFQ09ORFMgfHwgXCIyMFwiLCAxMCksXG5cdFx0XHRtYXhOdW1iZXJPZk1lc3NhZ2VzOiBjb25maWc/Lm1heE51bWJlck9mTWVzc2FnZXMgPz8gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52LlNRU19NQVhfTUVTU0FHRVMgfHwgXCIxMFwiLCAxMCksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIEFXU1xuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBBV1MgU0RLXG5cdFx0XHRjb25zdCB7IFNRU0NsaWVudCB9ID0gYXdhaXQgaW1wb3J0KFwiQGF3cy1zZGsvY2xpZW50LXNxc1wiKTtcblxuXHRcdFx0dGhpcy5zcXNDbGllbnQgPSBuZXcgU1FTQ2xpZW50KHtcblx0XHRcdFx0cmVnaW9uOiB0aGlzLmNvbmZpZy5yZWdpb24sXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5zaG91bGRTdG9wID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0FXU1NOU0FkYXB0ZXJdIENvbm5lY3RlZCB0byBBV1MgU05TL1NRUzogJHt0aGlzLmNvbmZpZy5yZWdpb259YCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEZhaWxlZCB0byBjb25uZWN0IHRvIEFXUzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LiBgICtcblx0XHRcdFx0XHRgTWFrZSBzdXJlIEBhd3Mtc2RrL2NsaWVudC1zcXMgaXMgaW5zdGFsbGVkOiBucG0gaW5zdGFsbCBAYXdzLXNkay9jbGllbnQtc3FzYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgZnJvbSBBV1Ncblx0ICovXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dGhpcy5zaG91bGRTdG9wID0gdHJ1ZTtcblxuXHRcdC8vIENsZWFyIGFsbCBwb2xsaW5nIGludGVydmFsc1xuXHRcdGZvciAoY29uc3QgW3F1ZXVlVXJsLCBpbnRlcnZhbF0gb2YgdGhpcy5wb2xsaW5nSW50ZXJ2YWxzKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQoaW50ZXJ2YWwpO1xuXHRcdH1cblx0XHR0aGlzLnBvbGxpbmdJbnRlcnZhbHMuY2xlYXIoKTtcblxuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdFx0Y29uc29sZS5sb2coXCJbQVdTU05TQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gQVdTIFNOUy9TUVNcIik7XG5cdH1cblxuXHQvKipcblx0ICogU3Vic2NyaWJlIHRvIGFuIFNOUyB0b3BpYyB2aWEgU1FTIHF1ZXVlXG5cdCAqIE5vdGU6IFRoZSBTUVMgcXVldWUgc2hvdWxkIGJlIHByZS1jb25maWd1cmVkIGFzIGFuIFNOUyBzdWJzY3JpcHRpb25cblx0ICovXG5cdGFzeW5jIHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgdG8gQVdTLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gSW4gQVdTLCBzdWJzY3JpcHRpb24gaXMgdGhlIFNRUyBxdWV1ZSBVUkwgdGhhdCdzIHN1YnNjcmliZWQgdG8gdGhlIFNOUyB0b3BpY1xuXHRcdGNvbnN0IHF1ZXVlVXJsID0gY29uZmlnLnN1YnNjcmlwdGlvbjtcblxuXHRcdC8vIFN0YXJ0IHBvbGxpbmcgdGhlIFNRUyBxdWV1ZVxuXHRcdHRoaXMucG9sbChxdWV1ZVVybCwgY29uZmlnLCBoYW5kbGVyKTtcblxuXHRcdGNvbnNvbGUubG9nKGBbQVdTU05TQWRhcHRlcl0gU3Vic2NyaWJlZCB0byBxdWV1ZTogJHtxdWV1ZVVybH0gKHRvcGljOiAke2NvbmZpZy50b3BpY30pYCk7XG5cdH1cblxuXHQvKipcblx0ICogUG9sbCBTUVMgcXVldWUgZm9yIG1lc3NhZ2VzIChsb25nIHBvbGxpbmcpXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBvbGwoXG5cdFx0cXVldWVVcmw6IHN0cmluZyxcblx0XHRjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLFxuXHRcdGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5zaG91bGRTdG9wKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBSZWNlaXZlTWVzc2FnZUNvbW1hbmQsIERlbGV0ZU1lc3NhZ2VDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoXCJAYXdzLXNkay9jbGllbnQtc3FzXCIpO1xuXG5cdFx0XHRjb25zdCBjb21tYW5kID0gbmV3IFJlY2VpdmVNZXNzYWdlQ29tbWFuZCh7XG5cdFx0XHRcdFF1ZXVlVXJsOiBxdWV1ZVVybCxcblx0XHRcdFx0TWF4TnVtYmVyT2ZNZXNzYWdlczogY29uZmlnLm1heE1lc3NhZ2VzIHx8IHRoaXMuY29uZmlnLm1heE51bWJlck9mTWVzc2FnZXMsXG5cdFx0XHRcdFdhaXRUaW1lU2Vjb25kczogdGhpcy5jb25maWcud2FpdFRpbWVTZWNvbmRzLFxuXHRcdFx0XHRNZXNzYWdlQXR0cmlidXRlTmFtZXM6IFtcIkFsbFwiXSxcblx0XHRcdFx0QXR0cmlidXRlTmFtZXM6IFtcIkFsbFwiXSxcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3FzQ2xpZW50LnNlbmQoY29tbWFuZCk7XG5cblx0XHRcdGlmIChyZXNwb25zZS5NZXNzYWdlcyAmJiByZXNwb25zZS5NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgbXNnIG9mIHJlc3BvbnNlLk1lc3NhZ2VzKSB7XG5cdFx0XHRcdFx0Ly8gUGFyc2UgU05TIG1lc3NhZ2Ugd3JhcHBlclxuXHRcdFx0XHRcdGxldCBzbnNNZXNzYWdlOiBhbnk7XG5cdFx0XHRcdFx0bGV0IGJvZHk6IHVua25vd247XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0c25zTWVzc2FnZSA9IEpTT04ucGFyc2UobXNnLkJvZHkgfHwgXCJ7fVwiKTtcblx0XHRcdFx0XHRcdC8vIFNOUyB3cmFwcyB0aGUgYWN0dWFsIG1lc3NhZ2UgaW4gYSBcIk1lc3NhZ2VcIiBmaWVsZFxuXHRcdFx0XHRcdFx0aWYgKHNuc01lc3NhZ2UuVHlwZSA9PT0gXCJOb3RpZmljYXRpb25cIiAmJiBzbnNNZXNzYWdlLk1lc3NhZ2UpIHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRib2R5ID0gSlNPTi5wYXJzZShzbnNNZXNzYWdlLk1lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRib2R5ID0gc25zTWVzc2FnZS5NZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRib2R5ID0gc25zTWVzc2FnZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBtc2cuQm9keTtcblx0XHRcdFx0XHRcdHNuc01lc3NhZ2UgPSB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgZnJvbSBib3RoIFNRUyBhbmQgU05TXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdFx0XHRcdFx0Ly8gU1FTIG1lc3NhZ2UgYXR0cmlidXRlc1xuXHRcdFx0XHRcdGlmIChtc2cuTWVzc2FnZUF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXMobXNnLk1lc3NhZ2VBdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdFx0XHRhdHRyaWJ1dGVzW2tleV0gPSAoYXR0ciBhcyBhbnkpLlN0cmluZ1ZhbHVlIHx8IFwiXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU05TIG1lc3NhZ2UgYXR0cmlidXRlcyAoaWYgcHJlc2VudClcblx0XHRcdFx0XHRpZiAoc25zTWVzc2FnZS5NZXNzYWdlQXR0cmlidXRlcykge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCBhdHRyXSBvZiBPYmplY3QuZW50cmllcyhzbnNNZXNzYWdlLk1lc3NhZ2VBdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdFx0XHRhdHRyaWJ1dGVzW2BzbnNfJHtrZXl9YF0gPSAoYXR0ciBhcyBhbnkpLlZhbHVlIHx8IFwiXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIHB1Yi9zdWIgbWVzc2FnZVxuXHRcdFx0XHRcdGNvbnN0IHB1YnN1Yk1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRcdFx0XHRpZDogc25zTWVzc2FnZS5NZXNzYWdlSWQgfHwgbXNnLk1lc3NhZ2VJZCB8fCB1dWlkKCksXG5cdFx0XHRcdFx0XHRib2R5LFxuXHRcdFx0XHRcdFx0YXR0cmlidXRlcyxcblx0XHRcdFx0XHRcdHJhdzogbXNnLFxuXHRcdFx0XHRcdFx0dG9waWM6IHNuc01lc3NhZ2UuVG9waWNBcm4gfHwgY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdFx0c3Vic2NyaXB0aW9uOiBxdWV1ZVVybCxcblx0XHRcdFx0XHRcdHB1Ymxpc2hUaW1lOiBzbnNNZXNzYWdlLlRpbWVzdGFtcCA/IG5ldyBEYXRlKHNuc01lc3NhZ2UuVGltZXN0YW1wKSA6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVNZXNzYWdlQ29tbWFuZCh7XG5cdFx0XHRcdFx0XHRcdFx0UXVldWVVcmw6IHF1ZXVlVXJsLFxuXHRcdFx0XHRcdFx0XHRcdFJlY2VpcHRIYW5kbGU6IG1zZy5SZWNlaXB0SGFuZGxlLFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zcXNDbGllbnQuc2VuZChkZWxldGVDb21tYW5kKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIExldCB0aGUgdmlzaWJpbGl0eSB0aW1lb3V0IGV4cGlyZSB0byByZXR1cm4gdGhlIG1lc3NhZ2Vcblx0XHRcdFx0XHRcdFx0Ly8gT3IgY2hhbmdlIHZpc2liaWxpdHkgdG8gMCBmb3IgaW1tZWRpYXRlIHJldHJ5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHsgQ2hhbmdlTWVzc2FnZVZpc2liaWxpdHlDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoXCJAYXdzLXNkay9jbGllbnQtc3FzXCIpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VDb21tYW5kID0gbmV3IENoYW5nZU1lc3NhZ2VWaXNpYmlsaXR5Q29tbWFuZCh7XG5cdFx0XHRcdFx0XHRcdFx0UXVldWVVcmw6IHF1ZXVlVXJsLFxuXHRcdFx0XHRcdFx0XHRcdFJlY2VpcHRIYW5kbGU6IG1zZy5SZWNlaXB0SGFuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFZpc2liaWxpdHlUaW1lb3V0OiAwLFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5zcXNDbGllbnQuc2VuZChjaGFuZ2VDb21tYW5kKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdC8vIFByb2Nlc3MgbWVzc2FnZVxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyKHB1YnN1Yk1lc3NhZ2UpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBbQVdTU05TQWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0FXU1NOU0FkYXB0ZXJdIFBvbGxpbmcgZXJyb3I6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblxuXHRcdC8vIENvbnRpbnVlIHBvbGxpbmcgdW5sZXNzIHN0b3BwZWRcblx0XHRpZiAoIXRoaXMuc2hvdWxkU3RvcCkge1xuXHRcdFx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wb2xsKHF1ZXVlVXJsLCBjb25maWcsIGhhbmRsZXIpLCAwKTtcblx0XHRcdHRoaXMucG9sbGluZ0ludGVydmFscy5zZXQocXVldWVVcmwsIHRpbWVvdXQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVbnN1YnNjcmliZSBmcm9tIGEgcXVldWUgKHN0b3BzIHBvbGxpbmcpXG5cdCAqL1xuXHRhc3luYyB1bnN1YnNjcmliZShxdWV1ZVVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaW50ZXJ2YWwgPSB0aGlzLnBvbGxpbmdJbnRlcnZhbHMuZ2V0KHF1ZXVlVXJsKTtcblx0XHRpZiAoaW50ZXJ2YWwpIHtcblx0XHRcdGNsZWFyVGltZW91dChpbnRlcnZhbCk7XG5cdFx0XHR0aGlzLnBvbGxpbmdJbnRlcnZhbHMuZGVsZXRlKHF1ZXVlVXJsKTtcblx0XHRcdGNvbnNvbGUubG9nKGBbQVdTU05TQWRhcHRlcl0gVW5zdWJzY3JpYmVkIGZyb20gcXVldWU6ICR7cXVldWVVcmx9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBBV1Ncblx0ICovXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWFsdGggY2hlY2sgLSB2ZXJpZnkgQVdTIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHsgTGlzdFF1ZXVlc0NvbW1hbmQgfSA9IGF3YWl0IGltcG9ydChcIkBhd3Mtc2RrL2NsaWVudC1zcXNcIik7XG5cdFx0XHRjb25zdCBjb21tYW5kID0gbmV3IExpc3RRdWV1ZXNDb21tYW5kKHsgTWF4UmVzdWx0czogMSB9KTtcblx0XHRcdGF3YWl0IHRoaXMuc3FzQ2xpZW50LnNlbmQoY29tbWFuZCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQVdTU05TQWRhcHRlcjtcbiJdfQ==
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVdTU05TQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9BV1NTTlNBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBSUgsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUE0QmxDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDaEIsUUFBUSxHQUFHLEtBQWMsQ0FBQztJQUUzQixTQUFTLENBQXdCO0lBQ2pDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsTUFBTSxDQUFlO0lBQ3JCLGdCQUFnQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzFELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFM0I7OztPQUdHO0lBQ0ssZ0JBQWdCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVksTUFBOEI7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7WUFDL0QsZUFBZSxFQUFFLE1BQU0sRUFBRSxlQUFlLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDMUcsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1NBQzdHLENBQUM7SUFDSCxDQUFDO0lB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IjpbIi8qKlxuICogQVdTU05TQWRhcHRlciAtIEFXUyBTTlMvU1FTIGFkYXB0ZXIgZm9yIFB1YlN1YlRyaWdnZXJcbiAqXG4gKiBVc2VzIEFXUyBTREsgdjMgZm9yIFNOUy9TUVMgY29ubmVjdGl2aXR5LlxuICogU05TIHRvcGljcyBkZWxpdmVyIHRvIFNRUyBxdWV1ZXMsIHdoaWNoIHRoaXMgYWRhcHRlciBwb2xscy5cbiAqXG4gKiBSZXF1aXJlczogbnBtIGluc3RhbGwgQGF3cy1zZGsvY2xpZW50LXNucyBAYXdzLXNkay9jbGllbnQtc3FzXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBBV1NfUkVHSU9OOiBBV1MgcmVnaW9uIChkZWZhdWx0OiB1cy1lYXN0LTEpXG4gKiAtIEFXU19BQ0NFU1NfS0VZX0lEOiBBV1MgYWNjZXNzIGtleSAob3B0aW9uYWwgaWYgdXNpbmcgSUFNIHJvbGVzKVxuICogLSBBV1NfU0VDUkVUX0FDQ0VTU19LRVk6IEFXUyBzZWNyZXQga2V5IChvcHRpb25hbCBpZiB1c2luZyBJQU0gcm9sZXMpXG4gKiAtIFNRU19XQUlUX1RJTUVfU0VDT05EUzogTG9uZyBwb2xsaW5nIHdhaXQgdGltZSAoZGVmYXVsdDogMjApXG4gKiAtIFNRU19NQVhfTUVTU0FHRVM6IE1heCBtZXNzYWdlcyBwZXIgcmVjZWl2ZSAoZGVmYXVsdDogMTApXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQXR0cmlidXRlVmFsdWUsIFNRU0NsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc3FzXCI7XG5pbXBvcnQgdHlwZSB7IFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgUHViU3ViQWRhcHRlciwgUHViU3ViTWVzc2FnZSB9IGZyb20gXCIuLi9QdWJTdWJUcmlnZ2VyXCI7XG5cbi8qKlxuICogU2hhcGUgb2YgYW4gU05TIG5vdGlmaWNhdGlvbiB3aGVuIGRlbGl2ZXJlZCB0byBhbiBTUVMgc3Vic2NyaXB0aW9uLlxuICogU05TLXRvLVNRUyBzdWJzY3JpcHRpb25zIHdyYXAgdGhlIHB1Ymxpc2hlcidzIHBheWxvYWQgaW5zaWRlIGEgSlNPTlxuICogZW52ZWxvcGU7IHRoZSByZWNlaXZlciBwYXJzZXMgYG1zZy5Cb2R5YCBhcyB0aGlzIGVudmVsb3BlIGFuZCByZWFkc1xuICogYE1lc3NhZ2VgICh0aGUgYWN0dWFsIHBheWxvYWQpIHBsdXMgdGhlIFNOUy1zaWRlIGF0dHJpYnV0ZXMuXG4gKi9cbmludGVyZmFjZSBTTlNOb3RpZmljYXRpb25FbnZlbG9wZSB7XG5cdFR5cGU/OiBzdHJpbmc7XG5cdE1lc3NhZ2VJZD86IHN0cmluZztcblx0VG9waWNBcm4/OiBzdHJpbmc7XG5cdE1lc3NhZ2U/OiBzdHJpbmc7XG5cdFN1YmplY3Q/OiBzdHJpbmc7XG5cdFRpbWVzdGFtcD86IHN0cmluZztcblx0TWVzc2FnZUF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IFR5cGU/OiBzdHJpbmc7IFZhbHVlPzogc3RyaW5nIH0+O1xufVxuXG4vKipcbiAqIEFXUyBTTlMvU1FTIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBV1NTTlNDb25maWcge1xuXHRyZWdpb246IHN0cmluZztcblx0d2FpdFRpbWVTZWNvbmRzPzogbnVtYmVyO1xuXHRtYXhOdW1iZXJPZk1lc3NhZ2VzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFXU1NOU0FkYXB0ZXIgLSBBV1MgU05TIGltcGxlbWVudGF0aW9uIHVzaW5nIFNRUyBzdWJzY3JpcHRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBBV1NTTlNBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJhd3NcIiBhcyBjb25zdDtcblxuXHRwcml2YXRlIHNxc0NsaWVudDogU1FTQ2xpZW50IHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogQVdTU05TQ29uZmlnO1xuXHRwcml2YXRlIHBvbGxpbmdJbnRlcnZhbHM6IE1hcDxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSBzaG91bGRTdG9wID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFR5cGUtbmFycm93aW5nIGFjY2Vzc29yIGZvciBgdGhpcy5zcXNDbGllbnRgLiBGaWVsZCBpcyB1bmRlZmluZWRcblx0ICogdW50aWwgYGNvbm5lY3QoKWAgcnVucy5cblx0ICovXG5cdHByaXZhdGUgcmVxdWlyZVNxc0NsaWVudCgpOiBTUVNDbGllbnQge1xuXHRcdGlmICghdGhpcy5zcXNDbGllbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIltBV1NTTlNBZGFwdGVyXSBTUVMgY2xpZW50IGlzIG5vdCBpbml0aWFsaXNlZCDigJQgY2FsbCBjb25uZWN0KCkgZmlyc3RcIik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNxc0NsaWVudDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8QVdTU05TQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cmVnaW9uOiBjb25maWc/LnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCIsXG5cdFx0XHR3YWl0VGltZVNlY29uZHM6IGNvbmZpZz8ud2FpdFRpbWVTZWNvbmRzID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5TUVNfV0FJVF9USU1FX1NFQ09ORFMgfHwgXCIyMFwiLCAxMCksXG5cdFx0XHRtYXhOdW1iZXJPZk1lc3NhZ2VzOiBjb25maWc/Lm1heE51bWJlck9mTWVzc2FnZXMgPz8gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52LlNRU19NQVhfTUVTU0FHRVMgfHwgXCIxMFwiLCAxMCksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIEFXU1xuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBBV1MgU0RLXG5cdFx0XHRjb25zdCB7IFNRU0NsaWVudCB9ID0gYXdhaXQgaW1wb3J0KFwiQGF3cy1zZGsvY2xpZW50LXNxc1wiKTtcblxuXHRcdFx0dGhpcy5zcXNDbGllbnQgPSBuZXcgU1FTQ2xpZW50KHtcblx0XHRcdFx0cmVnaW9uOiB0aGlzLmNvbmZpZy5yZWdpb24sXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5zaG91bGRTdG9wID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0FXU1NOU0FkYXB0ZXJdIENvbm5lY3RlZCB0byBBV1MgU05TL1NRUzogJHt0aGlzLmNvbmZpZy5yZWdpb259YCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEZhaWxlZCB0byBjb25uZWN0IHRvIEFXUzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LiBNYWtlIHN1cmUgQGF3cy1zZGsvY2xpZW50LXNxcyBpcyBpbnN0YWxsZWQ6IG5wbSBpbnN0YWxsIEBhd3Mtc2RrL2NsaWVudC1zcXNgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIEFXU1xuXHQgKi9cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0aGlzLnNob3VsZFN0b3AgPSB0cnVlO1xuXG5cdFx0Ly8gQ2xlYXIgYWxsIHBvbGxpbmcgaW50ZXJ2YWxzXG5cdFx0Zm9yIChjb25zdCBbcXVldWVVcmwsIGludGVydmFsXSBvZiB0aGlzLnBvbGxpbmdJbnRlcnZhbHMpIHtcblx0XHRcdGNsZWFyVGltZW91dChpbnRlcnZhbCk7XG5cdFx0fVxuXHRcdHRoaXMucG9sbGluZ0ludGVydmFscy5jbGVhcigpO1xuXG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0XHRjb25zb2xlLmxvZyhcIltBV1NTTlNBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBBV1MgU05TL1NRU1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gYW4gU05TIHRvcGljIHZpYSBTUVMgcXVldWVcblx0ICogTm90ZTogVGhlIFNRUyBxdWV1ZSBzaG91bGQgYmUgcHJlLWNvbmZpZ3VyZWQgYXMgYW4gU05TIHN1YnNjcmlwdGlvblxuXHQgKi9cblx0YXN5bmMgc3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZCB0byBBV1MuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHQvLyBJbiBBV1MsIHN1YnNjcmlwdGlvbiBpcyB0aGUgU1FTIHF1ZXVlIFVSTCB0aGF0J3Mgc3Vic2NyaWJlZCB0byB0aGUgU05TIHRvcGljLlxuXHRcdGlmICghY29uZmlnLnN1YnNjcmlwdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW0FXU1NOU0FkYXB0ZXJdIGBzdWJzY3JpcHRpb25gIGlzIHJlcXVpcmVkIOKAlCBtdXN0IGJlIHRoZSBTUVMgcXVldWUgVVJMIGJvdW5kIHRvIHRoZSBTTlMgdG9waWMuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBxdWV1ZVVybCA9IGNvbmZpZy5zdWJzY3JpcHRpb247XG5cblx0XHQvLyBTdGFydCBwb2xsaW5nIHRoZSBTUVMgcXVldWVcblx0XHR0aGlzLnBvbGwocXVldWVVcmwsIGNvbmZpZywgaGFuZGxlcik7XG5cblx0XHRjb25zb2xlLmxvZyhgW0FXU1NOU0FkYXB0ZXJdIFN1YnNjcmliZWQgdG8gcXVldWU6ICR7cXVldWVVcmx9ICh0b3BpYzogJHtjb25maWcudG9waWN9KWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvbGwgU1FTIHF1ZXVlIGZvciBtZXNzYWdlcyAobG9uZyBwb2xsaW5nKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwb2xsKFxuXHRcdHF1ZXVlVXJsOiBzdHJpbmcsXG5cdFx0Y29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0XHRoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuc2hvdWxkU3RvcCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHsgUmVjZWl2ZU1lc3NhZ2VDb21tYW5kLCBEZWxldGVNZXNzYWdlQ29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KFwiQGF3cy1zZGsvY2xpZW50LXNxc1wiKTtcblxuXHRcdFx0Y29uc3QgY29tbWFuZCA9IG5ldyBSZWNlaXZlTWVzc2FnZUNvbW1hbmQoe1xuXHRcdFx0XHRRdWV1ZVVybDogcXVldWVVcmwsXG5cdFx0XHRcdE1heE51bWJlck9mTWVzc2FnZXM6IGNvbmZpZy5tYXhNZXNzYWdlcyB8fCB0aGlzLmNvbmZpZy5tYXhOdW1iZXJPZk1lc3NhZ2VzLFxuXHRcdFx0XHRXYWl0VGltZVNlY29uZHM6IHRoaXMuY29uZmlnLndhaXRUaW1lU2Vjb25kcyxcblx0XHRcdFx0TWVzc2FnZUF0dHJpYnV0ZU5hbWVzOiBbXCJBbGxcIl0sXG5cdFx0XHRcdEF0dHJpYnV0ZU5hbWVzOiBbXCJBbGxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVpcmVTcXNDbGllbnQoKS5zZW5kKGNvbW1hbmQpO1xuXG5cdFx0XHRpZiAocmVzcG9uc2UuTWVzc2FnZXMgJiYgcmVzcG9uc2UuTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IG1zZyBvZiByZXNwb25zZS5NZXNzYWdlcykge1xuXHRcdFx0XHRcdC8vIFBhcnNlIFNOUyBtZXNzYWdlIHdyYXBwZXJcblx0XHRcdFx0XHRsZXQgc25zTWVzc2FnZTogU05TTm90aWZpY2F0aW9uRW52ZWxvcGU7XG5cdFx0XHRcdFx0bGV0IGJvZHk6IHVua25vd247XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0c25zTWVzc2FnZSA9IEpTT04ucGFyc2UobXNnLkJvZHkgfHwgXCJ7fVwiKSBhcyBTTlNOb3RpZmljYXRpb25FbnZlbG9wZTtcblx0XHRcdFx0XHRcdC8vIFNOUyB3cmFwcyB0aGUgYWN0dWFsIG1lc3NhZ2UgaW4gYSBcIk1lc3NhZ2VcIiBmaWVsZFxuXHRcdFx0XHRcdFx0aWYgKHNuc01lc3NhZ2UuVHlwZSA9PT0gXCJOb3RpZmljYXRpb25cIiAmJiBzbnNNZXNzYWdlLk1lc3NhZ2UpIHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRib2R5ID0gSlNPTi5wYXJzZShzbnNNZXNzYWdlLk1lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRib2R5ID0gc25zTWVzc2FnZS5NZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRib2R5ID0gc25zTWVzc2FnZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBtc2cuQm9keTtcblx0XHRcdFx0XHRcdHNuc01lc3NhZ2UgPSB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgZnJvbSBib3RoIFNRUyBhbmQgU05TXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdFx0XHRcdFx0Ly8gU1FTIG1lc3NhZ2UgYXR0cmlidXRlc1xuXHRcdFx0XHRcdGlmIChtc2cuTWVzc2FnZUF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXMobXNnLk1lc3NhZ2VBdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzcXNBdHRyID0gYXR0ciBhcyBNZXNzYWdlQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdFx0XHRcdGF0dHJpYnV0ZXNba2V5XSA9IHNxc0F0dHIuU3RyaW5nVmFsdWUgfHwgXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTTlMgbWVzc2FnZSBhdHRyaWJ1dGVzIChpZiBwcmVzZW50KVxuXHRcdFx0XHRcdGlmIChzbnNNZXNzYWdlLk1lc3NhZ2VBdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtrZXksIGF0dHJdIG9mIE9iamVjdC5lbnRyaWVzKHNuc01lc3NhZ2UuTWVzc2FnZUF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdFx0XHRcdGF0dHJpYnV0ZXNbYHNuc18ke2tleX1gXSA9IGF0dHIuVmFsdWUgfHwgXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBDcmVhdGUgcHViL3N1YiBtZXNzYWdlXG5cdFx0XHRcdFx0Y29uc3QgcHVic3ViTWVzc2FnZTogUHViU3ViTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRcdGlkOiBzbnNNZXNzYWdlLk1lc3NhZ2VJZCB8fCBtc2cuTWVzc2FnZUlkIHx8IHV1aWQoKSxcblx0XHRcdFx0XHRcdGJvZHksXG5cdFx0XHRcdFx0XHRhdHRyaWJ1dGVzLFxuXHRcdFx0XHRcdFx0cmF3OiBtc2csXG5cdFx0XHRcdFx0XHR0b3BpYzogc25zTWVzc2FnZS5Ub3BpY0FybiB8fCBjb25maWcudG9waWMsXG5cdFx0XHRcdFx0XHRzdWJzY3JpcHRpb246IHF1ZXVlVXJsLFxuXHRcdFx0XHRcdFx0cHVibGlzaFRpbWU6IHNuc01lc3NhZ2UuVGltZXN0YW1wID8gbmV3IERhdGUoc25zTWVzc2FnZS5UaW1lc3RhbXApIDogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkZWxldGVDb21tYW5kID0gbmV3IERlbGV0ZU1lc3NhZ2VDb21tYW5kKHtcblx0XHRcdFx0XHRcdFx0XHRRdWV1ZVVybDogcXVldWVVcmwsXG5cdFx0XHRcdFx0XHRcdFx0UmVjZWlwdEhhbmRsZTogbXNnLlJlY2VpcHRIYW5kbGUsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlcXVpcmVTcXNDbGllbnQoKS5zZW5kKGRlbGV0ZUNvbW1hbmQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG5hY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gTGV0IHRoZSB2aXNpYmlsaXR5IHRpbWVvdXQgZXhwaXJlIHRvIHJldHVybiB0aGUgbWVzc2FnZVxuXHRcdFx0XHRcdFx0XHQvLyBPciBjaGFuZ2UgdmlzaWJpbGl0eSB0byAwIGZvciBpbW1lZGlhdGUgcmV0cnlcblx0XHRcdFx0XHRcdFx0Y29uc3QgeyBDaGFuZ2VNZXNzYWdlVmlzaWJpbGl0eUNvbW1hbmQgfSA9IGF3YWl0IGltcG9ydChcIkBhd3Mtc2RrL2NsaWVudC1zcXNcIik7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZUNvbW1hbmQgPSBuZXcgQ2hhbmdlTWVzc2FnZVZpc2liaWxpdHlDb21tYW5kKHtcblx0XHRcdFx0XHRcdFx0XHRRdWV1ZVVybDogcXVldWVVcmwsXG5cdFx0XHRcdFx0XHRcdFx0UmVjZWlwdEhhbmRsZTogbXNnLlJlY2VpcHRIYW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0VmlzaWJpbGl0eVRpbWVvdXQ6IDAsXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlcXVpcmVTcXNDbGllbnQoKS5zZW5kKGNoYW5nZUNvbW1hbmQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gUHJvY2VzcyBtZXNzYWdlXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGhhbmRsZXIocHVic3ViTWVzc2FnZSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtBV1NTTlNBZGFwdGVyXSBFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBbQVdTU05TQWRhcHRlcl0gUG9sbGluZyBlcnJvcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udGludWUgcG9sbGluZyB1bmxlc3Mgc3RvcHBlZFxuXHRcdGlmICghdGhpcy5zaG91bGRTdG9wKSB7XG5cdFx0XHRjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnBvbGwocXVldWVVcmwsIGNvbmZpZywgaGFuZGxlciksIDApO1xuXHRcdFx0dGhpcy5wb2xsaW5nSW50ZXJ2YWxzLnNldChxdWV1ZVVybCwgdGltZW91dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVuc3Vic2NyaWJlIGZyb20gYSBxdWV1ZSAoc3RvcHMgcG9sbGluZylcblx0ICovXG5cdGFzeW5jIHVuc3Vic2NyaWJlKHF1ZXVlVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBpbnRlcnZhbCA9IHRoaXMucG9sbGluZ0ludGVydmFscy5nZXQocXVldWVVcmwpO1xuXHRcdGlmIChpbnRlcnZhbCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KGludGVydmFsKTtcblx0XHRcdHRoaXMucG9sbGluZ0ludGVydmFscy5kZWxldGUocXVldWVVcmwpO1xuXHRcdFx0Y29uc29sZS5sb2coYFtBV1NTTlNBZGFwdGVyXSBVbnN1YnNjcmliZWQgZnJvbSBxdWV1ZTogJHtxdWV1ZVVybH1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgY29ubmVjdGVkIHRvIEFXU1xuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCB0byBhbiBTTlMgdG9waWMuXG5cdCAqXG5cdCAqIGB0b3BpY2AgbXVzdCBiZSB0aGUgU05TIHRvcGljIEFSTi4gYHBhcnRpdGlvbktleWAgL1xuXHQgKiBgb3JkZXJpbmdLZXlgIG1hcCB0byB0aGUgRklGTyBgTWVzc2FnZUdyb3VwSWRgIGZpZWxkIGZvclxuXHQgKiBgLmZpZm9gIHRvcGljczsgaWdub3JlZCBvdGhlcndpc2UuXG5cdCAqL1xuXHRhc3luYyBwdWJsaXNoKFxuXHRcdHRvcGljOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogdW5rbm93bixcblx0XHRvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWItYXdzXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgbW9kdWxlTmFtZSA9IFwiQGF3cy1zZGsvY2xpZW50LXNuc1wiO1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogU0RLIGxvYWRlZCBhdCBydW50aW1lIGFzIGEgcGVlciBkZXAuXG5cdFx0Y29uc3Qgc25zOiBhbnkgPSBhd2FpdCBpbXBvcnQobW9kdWxlTmFtZSk7XG5cdFx0Y29uc3QgY2xpZW50ID0gbmV3IHNucy5TTlNDbGllbnQoeyByZWdpb246IHRoaXMuY29uZmlnLnJlZ2lvbiB9KTtcblx0XHRjb25zdCBpc0ZpZm8gPSB0b3BpYy5lbmRzV2l0aChcIi5maWZvXCIpO1xuXHRcdGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0XHRUb3BpY0FybjogdG9waWMsXG5cdFx0XHRNZXNzYWdlOiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcblx0XHR9O1xuXHRcdGlmIChpc0ZpZm8pIHtcblx0XHRcdHBhcmFtcy5NZXNzYWdlR3JvdXBJZCA9IG9wdHM/LnBhcnRpdGlvbktleSA/PyBvcHRzPy5vcmRlcmluZ0tleSA/PyBcImRlZmF1bHRcIjtcblx0XHRcdHBhcmFtcy5NZXNzYWdlRGVkdXBsaWNhdGlvbklkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgY2xpZW50LnNlbmQobmV3IHNucy5QdWJsaXNoQ29tbWFuZChwYXJhbXMpKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y2xpZW50LmRlc3Ryb3k/LigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIZWFsdGggY2hlY2sgLSB2ZXJpZnkgQVdTIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHsgTGlzdFF1ZXVlc0NvbW1hbmQgfSA9IGF3YWl0IGltcG9ydChcIkBhd3Mtc2RrL2NsaWVudC1zcXNcIik7XG5cdFx0XHRjb25zdCBjb21tYW5kID0gbmV3IExpc3RRdWV1ZXNDb21tYW5kKHsgTWF4UmVzdWx0czogMSB9KTtcblx0XHRcdGF3YWl0IHRoaXMucmVxdWlyZVNxc0NsaWVudCgpLnNlbmQoY29tbWFuZCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQVdTU05TQWRhcHRlcjtcbiJdfQ==
|
|
@@ -26,6 +26,11 @@ export declare class AzureServiceBusAdapter implements PubSubAdapter {
|
|
|
26
26
|
private receivers;
|
|
27
27
|
private connected;
|
|
28
28
|
private config;
|
|
29
|
+
/**
|
|
30
|
+
* Type-narrowing accessor for `this.client`. Field is undefined until
|
|
31
|
+
* `connect()` runs.
|
|
32
|
+
*/
|
|
33
|
+
private requireClient;
|
|
29
34
|
constructor(config?: AzureServiceBusConfig);
|
|
30
35
|
/**
|
|
31
36
|
* Connect to Azure Service Bus
|
|
@@ -47,6 +52,16 @@ export declare class AzureServiceBusAdapter implements PubSubAdapter {
|
|
|
47
52
|
* Check if connected to Azure Service Bus
|
|
48
53
|
*/
|
|
49
54
|
isConnected(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* v0.7 PR 6 — publish to an Azure Service Bus topic.
|
|
57
|
+
*
|
|
58
|
+
* `partitionKey` maps to Service Bus's `partitionKey`; `orderingKey`
|
|
59
|
+
* maps to `sessionId` (for session-enabled topics).
|
|
60
|
+
*/
|
|
61
|
+
publish(topic: string, payload: unknown, opts?: {
|
|
62
|
+
partitionKey?: string;
|
|
63
|
+
orderingKey?: string;
|
|
64
|
+
}): Promise<void>;
|
|
50
65
|
/**
|
|
51
66
|
* Health check - verify Azure Service Bus connectivity
|
|
52
67
|
*/
|