@archont561/qgis-sdk 0.3.0 → 0.5.0

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.
@@ -0,0 +1,433 @@
1
+ import {
2
+ QgisSdkError2
3
+ } from "./chunk-2hwva3a3.js";
4
+
5
+ // src/internal.ts
6
+ var STREAM_EVENT_KINDS = Object.freeze([
7
+ "data",
8
+ "progress",
9
+ "state"
10
+ ]);
11
+ function isPlainRecord(value) {
12
+ return typeof value === "object" && value !== null && !Array.isArray(value);
13
+ }
14
+
15
+ // src/bridge.ts
16
+ var BRIDGE_PROTOCOL_VERSION2 = 1;
17
+ var MAX_CALL_ID_LENGTH2 = 128;
18
+
19
+ class QgisSdkBridgeProtocolError2 extends QgisSdkError2 {
20
+ constructor(message) {
21
+ super(message, "invalid_bridge_message");
22
+ }
23
+ }
24
+
25
+ class QgisSdkBridgeTimeoutError2 extends QgisSdkError2 {
26
+ callId;
27
+ constructor(callId, timeoutMs) {
28
+ super(`Call ${JSON.stringify(callId)} got no reply within ${timeoutMs}ms; the host may still have run it`, "timeout");
29
+ this.callId = callId;
30
+ }
31
+ }
32
+
33
+ class QgisSdkBridgeAbortedError2 extends QgisSdkError2 {
34
+ callId;
35
+ constructor(callId) {
36
+ super(`Call ${JSON.stringify(callId)} was aborted locally`, "aborted");
37
+ this.callId = callId;
38
+ }
39
+ }
40
+
41
+ class QgisSdkBridgeClosedError2 extends QgisSdkError2 {
42
+ constructor() {
43
+ super("This bridge client is closed", "closed");
44
+ }
45
+ }
46
+
47
+ class QgisSdkBridgeSequenceError2 extends QgisSdkError2 {
48
+ subscriptionId;
49
+ expected;
50
+ received;
51
+ constructor(subscriptionId, expected, received) {
52
+ super(`Subscription ${JSON.stringify(subscriptionId)} expected frame ${expected} but received ${received}`, "stream_gap");
53
+ this.subscriptionId = subscriptionId;
54
+ this.expected = expected;
55
+ this.received = received;
56
+ }
57
+ }
58
+
59
+ class QgisSdkBridgeStreamEndedError2 extends QgisSdkError2 {
60
+ subscriptionId;
61
+ terminal;
62
+ constructor(subscriptionId, terminal) {
63
+ super(terminal.message ?? `Subscription ${JSON.stringify(subscriptionId)} ended: ${terminal.kind}`, terminal.kind);
64
+ this.subscriptionId = subscriptionId;
65
+ this.terminal = terminal;
66
+ }
67
+ }
68
+
69
+ class QgisSdkBridgeRemoteError2 extends QgisSdkError2 {
70
+ failure;
71
+ callId;
72
+ constructor(callId, failure) {
73
+ super(failure.message, failure.code);
74
+ this.callId = callId;
75
+ this.failure = failure;
76
+ }
77
+ }
78
+ function isNonEmptyString(value) {
79
+ return typeof value === "string" && value.trim().length > 0;
80
+ }
81
+ function parseInvokeReply2(raw) {
82
+ if (!isPlainRecord(raw)) {
83
+ throw new QgisSdkBridgeProtocolError2("A reply must be an object");
84
+ }
85
+ if (raw.protocol !== BRIDGE_PROTOCOL_VERSION2) {
86
+ throw new QgisSdkBridgeProtocolError2(`Unsupported bridge protocol: ${String(raw.protocol)}; this client speaks ${BRIDGE_PROTOCOL_VERSION2}`);
87
+ }
88
+ if (!isNonEmptyString(raw.call_id) || raw.call_id.length > MAX_CALL_ID_LENGTH2) {
89
+ throw new QgisSdkBridgeProtocolError2(`call_id must be a nonempty string of at most ${MAX_CALL_ID_LENGTH2} characters`);
90
+ }
91
+ const callId = raw.call_id;
92
+ if (typeof raw.ok !== "boolean") {
93
+ throw new QgisSdkBridgeProtocolError2(`${callId}: ok must be a boolean`);
94
+ }
95
+ if (raw.ok) {
96
+ if (!Object.hasOwn(raw, "value")) {
97
+ throw new QgisSdkBridgeProtocolError2(`${callId}: a success reply must carry a value`);
98
+ }
99
+ return Object.freeze({
100
+ protocol: BRIDGE_PROTOCOL_VERSION2,
101
+ call_id: callId,
102
+ ok: true,
103
+ value: raw.value
104
+ });
105
+ }
106
+ if (!isPlainRecord(raw.error)) {
107
+ throw new QgisSdkBridgeProtocolError2(`${callId}: a failure reply must carry an error object`);
108
+ }
109
+ if (!isNonEmptyString(raw.error.code)) {
110
+ throw new QgisSdkBridgeProtocolError2(`${callId}: error.code must be a string`);
111
+ }
112
+ if (typeof raw.error.message !== "string") {
113
+ throw new QgisSdkBridgeProtocolError2(`${callId}: error.message must be a string`);
114
+ }
115
+ return Object.freeze({
116
+ protocol: BRIDGE_PROTOCOL_VERSION2,
117
+ call_id: callId,
118
+ ok: false,
119
+ error: Object.freeze({
120
+ code: raw.error.code,
121
+ message: raw.error.message
122
+ })
123
+ });
124
+ }
125
+ function isIndex(value) {
126
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
127
+ }
128
+ var TERMINAL_KINDS = [
129
+ "cancelled",
130
+ "complete",
131
+ "disposed",
132
+ "error",
133
+ "gap"
134
+ ];
135
+ function parseStreamFrame2(raw) {
136
+ if (!isPlainRecord(raw)) {
137
+ throw new QgisSdkBridgeProtocolError2("A stream frame must be an object");
138
+ }
139
+ if (raw.protocol !== BRIDGE_PROTOCOL_VERSION2) {
140
+ throw new QgisSdkBridgeProtocolError2(`Unsupported bridge protocol: ${String(raw.protocol)}; this client speaks ${BRIDGE_PROTOCOL_VERSION2}`);
141
+ }
142
+ if (!isNonEmptyString(raw.subscription_id)) {
143
+ throw new QgisSdkBridgeProtocolError2("A stream frame must name its subscription");
144
+ }
145
+ if (!isIndex(raw.seq)) {
146
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: seq must be a non-negative integer`);
147
+ }
148
+ const hasEvent = Object.hasOwn(raw, "event");
149
+ const hasTerminal = Object.hasOwn(raw, "terminal");
150
+ if (hasEvent === hasTerminal) {
151
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: a stream frame carries an event or a terminal, not both`);
152
+ }
153
+ if (hasEvent) {
154
+ if (!isPlainRecord(raw.event)) {
155
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: event must be an object`);
156
+ }
157
+ const kind = raw.event.kind;
158
+ if (!STREAM_EVENT_KINDS.includes(kind)) {
159
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: ${String(kind)} is not an event kind`);
160
+ }
161
+ return Object.freeze({
162
+ protocol: BRIDGE_PROTOCOL_VERSION2,
163
+ subscription_id: raw.subscription_id,
164
+ seq: raw.seq,
165
+ event: Object.freeze({
166
+ kind,
167
+ payload: raw.event.payload
168
+ })
169
+ });
170
+ }
171
+ if (!isPlainRecord(raw.terminal)) {
172
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: terminal must be an object`);
173
+ }
174
+ const kind = raw.terminal.kind;
175
+ if (!TERMINAL_KINDS.includes(kind)) {
176
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: ${String(kind)} is not a terminal kind`);
177
+ }
178
+ if (raw.terminal.message !== undefined && typeof raw.terminal.message !== "string") {
179
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: terminal.message must be a string`);
180
+ }
181
+ if (raw.terminal.dropped !== undefined && !isIndex(raw.terminal.dropped)) {
182
+ throw new QgisSdkBridgeProtocolError2(`${raw.subscription_id}: terminal.dropped must be a non-negative integer`);
183
+ }
184
+ return Object.freeze({
185
+ protocol: BRIDGE_PROTOCOL_VERSION2,
186
+ subscription_id: raw.subscription_id,
187
+ seq: raw.seq,
188
+ terminal: Object.freeze({
189
+ kind,
190
+ ...typeof raw.terminal.message === "string" ? { message: raw.terminal.message } : {},
191
+ ...isIndex(raw.terminal.dropped) ? { dropped: raw.terminal.dropped } : {}
192
+ })
193
+ });
194
+ }
195
+
196
+ class BridgeClient2 {
197
+ transport;
198
+ timeoutMs;
199
+ pending = new Map;
200
+ subscriptions = new Map;
201
+ disposals = new Set;
202
+ unsubscribe;
203
+ counter = 0;
204
+ closed = false;
205
+ unmatched = 0;
206
+ breaks = 0;
207
+ lastProtocolError = null;
208
+ constructor(transport, options = {}) {
209
+ this.transport = transport;
210
+ this.timeoutMs = options.timeoutMs ?? 30000;
211
+ this.unsubscribe = transport.subscribe((message) => {
212
+ this.handle(message);
213
+ });
214
+ }
215
+ get isClosed() {
216
+ return this.closed;
217
+ }
218
+ get unmatchedReplies() {
219
+ return this.unmatched;
220
+ }
221
+ get pendingCalls() {
222
+ return this.pending.size;
223
+ }
224
+ invoke(operation, payload = {}, options = {}) {
225
+ if (!isNonEmptyString(operation)) {
226
+ return Promise.reject(new QgisSdkBridgeProtocolError2("operation must be a nonempty string"));
227
+ }
228
+ return this.send({ kind: "invoke", operation, payload }, options);
229
+ }
230
+ subscribe(operation, payload = {}, handlers = {}, options = {}) {
231
+ if (!isNonEmptyString(operation)) {
232
+ return Promise.reject(new QgisSdkBridgeProtocolError2("operation must be a nonempty string"));
233
+ }
234
+ return this.send({ kind: "subscribe", operation, payload }, options).then((value) => {
235
+ const id = isPlainRecord(value) ? value.subscription_id : undefined;
236
+ if (!isNonEmptyString(id)) {
237
+ throw new QgisSdkBridgeProtocolError2("A subscription acknowledgement must carry a subscription_id");
238
+ }
239
+ const open = {
240
+ id,
241
+ handlers,
242
+ expectedSeq: 0,
243
+ closed: false
244
+ };
245
+ this.subscriptions.set(id, open);
246
+ const handle = {
247
+ id,
248
+ get closed() {
249
+ return open.closed;
250
+ },
251
+ close: () => {
252
+ this.endSubscription(id, { kind: "disposed" }, true);
253
+ }
254
+ };
255
+ return handle;
256
+ });
257
+ }
258
+ handshake(options = {}) {
259
+ return this.send({ kind: "handshake" }, options);
260
+ }
261
+ get activeSubscriptions() {
262
+ return [...this.subscriptions.keys()];
263
+ }
264
+ get sequenceBreaks() {
265
+ return this.breaks;
266
+ }
267
+ send(body, options) {
268
+ if (this.closed) {
269
+ return Promise.reject(new QgisSdkBridgeClosedError2);
270
+ }
271
+ this.counter += 1;
272
+ const callId = `c${this.counter}`;
273
+ const promise = new Promise((resolve, reject) => {
274
+ if (options.signal?.aborted === true) {
275
+ reject(new QgisSdkBridgeAbortedError2(callId));
276
+ return;
277
+ }
278
+ const onAbort = () => {
279
+ const pending = this.pending.get(callId);
280
+ if (pending === undefined) {
281
+ return;
282
+ }
283
+ this.settle(callId);
284
+ pending.reject(new QgisSdkBridgeAbortedError2(callId));
285
+ };
286
+ options.signal?.addEventListener("abort", onAbort, { once: true });
287
+ const timer = this.timeoutMs > 0 ? setTimeout(() => {
288
+ const pending = this.pending.get(callId);
289
+ if (pending === undefined) {
290
+ return;
291
+ }
292
+ this.settle(callId);
293
+ pending.reject(new QgisSdkBridgeTimeoutError2(callId, this.timeoutMs));
294
+ }, this.timeoutMs) : null;
295
+ const detach = options.signal === undefined ? null : () => {
296
+ options.signal?.removeEventListener("abort", onAbort);
297
+ };
298
+ this.pending.set(callId, { resolve, reject, timer, detach });
299
+ this.transport.send({
300
+ protocol: BRIDGE_PROTOCOL_VERSION2,
301
+ call_id: callId,
302
+ ...body
303
+ });
304
+ });
305
+ return promise;
306
+ }
307
+ close() {
308
+ if (this.closed) {
309
+ return;
310
+ }
311
+ this.closed = true;
312
+ this.unsubscribe();
313
+ for (const id of [...this.subscriptions.keys()]) {
314
+ this.endSubscription(id, { kind: "disposed" }, false);
315
+ }
316
+ for (const callId of [...this.pending.keys()]) {
317
+ const pending = this.pending.get(callId);
318
+ if (pending === undefined) {
319
+ continue;
320
+ }
321
+ this.settle(callId);
322
+ pending.reject(new QgisSdkBridgeClosedError2);
323
+ }
324
+ }
325
+ settle(callId) {
326
+ const pending = this.pending.get(callId);
327
+ if (pending === undefined) {
328
+ return;
329
+ }
330
+ this.pending.delete(callId);
331
+ if (pending.timer !== null) {
332
+ clearTimeout(pending.timer);
333
+ }
334
+ pending.detach?.();
335
+ return pending;
336
+ }
337
+ handle(message) {
338
+ if (isPlainRecord(message) && Object.hasOwn(message, "subscription_id")) {
339
+ this.handleFrame(message);
340
+ return;
341
+ }
342
+ let reply;
343
+ try {
344
+ reply = parseInvokeReply2(message);
345
+ } catch (error) {
346
+ this.unmatched += 1;
347
+ if (error instanceof Error) {
348
+ this.lastProtocolError = error;
349
+ }
350
+ return;
351
+ }
352
+ if (this.disposals.delete(reply.call_id)) {
353
+ return;
354
+ }
355
+ const pending = this.settle(reply.call_id);
356
+ if (pending === undefined) {
357
+ this.unmatched += 1;
358
+ return;
359
+ }
360
+ if (reply.ok) {
361
+ pending.resolve(reply.value);
362
+ return;
363
+ }
364
+ pending.reject(new QgisSdkBridgeRemoteError2(reply.call_id, reply.error));
365
+ }
366
+ handleFrame(raw) {
367
+ let frame;
368
+ try {
369
+ frame = parseStreamFrame2(raw);
370
+ } catch (error) {
371
+ this.unmatched += 1;
372
+ if (error instanceof Error) {
373
+ this.lastProtocolError = error;
374
+ }
375
+ return;
376
+ }
377
+ const open = this.subscriptions.get(frame.subscription_id);
378
+ if (open === undefined) {
379
+ this.unmatched += 1;
380
+ return;
381
+ }
382
+ if (frame.seq !== open.expectedSeq) {
383
+ this.breaks += 1;
384
+ const expected = open.expectedSeq;
385
+ this.endSubscription(frame.subscription_id, {
386
+ kind: "gap",
387
+ message: `Expected frame ${expected} but received ${frame.seq}`,
388
+ dropped: Math.max(0, frame.seq - expected)
389
+ }, true);
390
+ return;
391
+ }
392
+ open.expectedSeq += 1;
393
+ if ("terminal" in frame) {
394
+ this.endSubscription(frame.subscription_id, frame.terminal, false);
395
+ return;
396
+ }
397
+ open.handlers.onEvent?.(frame.event);
398
+ }
399
+ endSubscription(id, terminal, notifyHost) {
400
+ const open = this.subscriptions.get(id);
401
+ if (open === undefined || open.closed) {
402
+ return;
403
+ }
404
+ open.closed = true;
405
+ this.subscriptions.delete(id);
406
+ if (notifyHost) {
407
+ this.disposeSubscription(id);
408
+ }
409
+ open.handlers.onTerminal?.(terminal);
410
+ }
411
+ disposeSubscription(id) {
412
+ if (this.closed) {
413
+ return;
414
+ }
415
+ this.counter += 1;
416
+ const callId = `c${this.counter}`;
417
+ this.disposals.add(callId);
418
+ this.transport.send({
419
+ protocol: BRIDGE_PROTOCOL_VERSION2,
420
+ call_id: callId,
421
+ kind: "unsubscribe",
422
+ subscription_id: id
423
+ });
424
+ }
425
+ get protocolError() {
426
+ return this.lastProtocolError;
427
+ }
428
+ }
429
+
430
+ export { STREAM_EVENT_KINDS, isPlainRecord, BRIDGE_PROTOCOL_VERSION2, MAX_CALL_ID_LENGTH2, QgisSdkBridgeProtocolError2, QgisSdkBridgeTimeoutError2, QgisSdkBridgeAbortedError2, QgisSdkBridgeClosedError2, QgisSdkBridgeSequenceError2, QgisSdkBridgeStreamEndedError2, QgisSdkBridgeRemoteError2, parseInvokeReply2, parseStreamFrame2, BridgeClient2 };
431
+
432
+ //# debugId=4E6A49383973AEAE64756E2164756E21
433
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2ludGVybmFsLnRzIiwgInNyYy9icmlkZ2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBIZWxwZXJzIHRoZSBlbnRyeSBwb2ludHMgc2hhcmUgYnV0IHRoZSBwYWNrYWdlIGRvZXMgbm90IGV4cG9ydC5cbiAqXG4gKiBOb3RoaW5nIGhlcmUgaXMgcGFydCBvZiB0aGUgcHVibGljIHN1cmZhY2U6IGEgcGFnZSB0aGF0IG5lZWRzIGEgcmVjb3JkIGd1YXJkXG4gKiB3cml0ZXMgaXRzIG93biBvbmUtbGluZXIgcmF0aGVyIHRoYW4gZGVwZW5kaW5nIG9uIGFuIFNESyBpbXBsZW1lbnRhdGlvblxuICogZGV0YWlsIHRoYXQgbWF5IG1vdmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdHJlYW1FdmVudEtpbmQgfSBmcm9tIFwiLi9kZWNsYXJhdGlvbnNcIjtcblxuLyoqIFRoZSBkZWNsYXJlZCBzdHJlYW0gZXZlbnQga2luZHM7IHRoZSBkZWNsYXJhdGlvbiBwYXJzZXIgYW5kIHRoZSBmcmFtZSBwYXJzZXIgY2hlY2sgdGhlIHNhbWUgbGlzdC4gKi9cbmV4cG9ydCBjb25zdCBTVFJFQU1fRVZFTlRfS0lORFM6IHJlYWRvbmx5IFN0cmVhbUV2ZW50S2luZFtdID0gT2JqZWN0LmZyZWV6ZShbXG5cdFwiZGF0YVwiLFxuXHRcInByb2dyZXNzXCIsXG5cdFwic3RhdGVcIixcbl0pO1xuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGB2YWx1ZWAgaXMgYSBub24tbnVsbCwgbm9uLWFycmF5IG9iamVjdDogdGhlIHNoYXBlIGV2ZXJ5IHdpcmVcbiAqIGVudmVsb3BlLCBkZXNjcmlwdGlvbiBhbmQgZXZlbnQgcGF5bG9hZCBtdXN0IGhhdmUgYmVmb3JlIGl0cyBmaWVsZHMgYXJlIHJlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluUmVjb3JkKFxuXHR2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iLAogICAgIi8qKlxuICogVGhlIHZlcnNpb25lZCB0cmFuc3BvcnQgY29udHJhY3QgYSB3ZWIgdmlldyBzcGVha3MuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIGNsaWVudCBoYWxmIG9mIGBxZ2lzX3Nkay5icmlkZ2VgOiBpdCBwYXJzZXMgdGhlIHJlcGxpZXMgdGhlXG4gKiBob3N0IHByb2R1Y2VzLCBjb3JyZWxhdGVzIHRoZW0gYnkgY2FsbCBpZCwgYW5kIHJlZnVzZXMgYW55dGhpbmcgdGhhdCBkb2VzIG5vdFxuICogbWF0Y2ggdGhlIHByb3RvY29sIGluc3RlYWQgb2YgZ3Vlc3NpbmcuIEl0IGlzIGRlbGliZXJhdGVseSB1c2FibGUgd2l0aG91dCBhXG4gKiBRV2ViQ2hhbm5lbCAtIHRoZSB0cmFuc3BvcnQgaXMgaW5qZWN0ZWQgLSBzbyBmYWlsdXJlcyBjYW4gYmUgc2NyaXB0ZWQgaW4gYVxuICogdGVzdCByYXRoZXIgdGhhbiByZXByb2R1Y2VkIGluc2lkZSBhIHJ1bm5pbmcgUUdJUy5cbiAqXG4gKiBUd28gcHJvcGVydGllcyBtYXR0ZXIgbW9yZSB0aGFuIHRoZSBBUEkgc3VyZmFjZTpcbiAqXG4gKiAtIEEgbWFsZm9ybWVkIHJlcGx5IGlzIHJlZnVzZWQsIG5ldmVyIGNvZXJjZWQuIEEgZnJvbnRlbmQgdGhhdCBhY2NlcHRzXG4gKiAgIGB7b2s6IFwieWVzXCJ9YCBvciBhbiBlcnJvciB3aXRob3V0IGEgY29kZSBlbmRzIHVwIHN3aXRjaGluZyBvbiB0ZXh0LlxuICogLSBBIGxvY2FsIHRpbWVvdXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBob3N0LiBUaGUgY2FsbCBtYXkgaGF2ZSBydW4sIHNvIGl0IGlzXG4gKiAgIHJlcG9ydGVkIGFzIGFuIHVua25vd24gb3V0Y29tZSBhbmQgaXMgbmV2ZXIgcmV0cmllZCBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RyZWFtRXZlbnRLaW5kIH0gZnJvbSBcIi4vZGVjbGFyYXRpb25zXCI7XG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzUGxhaW5SZWNvcmQsIFNUUkVBTV9FVkVOVF9LSU5EUyB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5cbmV4cG9ydCB0eXBlIHsgU3RyZWFtRXZlbnRLaW5kIH07XG5cbmV4cG9ydCBjb25zdCBCUklER0VfUFJPVE9DT0xfVkVSU0lPTjogMSA9IDE7XG5leHBvcnQgY29uc3QgTUFYX0NBTExfSURfTEVOR1RIOiBudW1iZXIgPSAxMjg7XG5cbi8qKiBBIGZhaWx1cmUgcmVwbHksIGFzIHRoZSBob3N0IHNlcmlhbGl6ZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUZhaWx1cmUge1xuXHRyZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIEEgcmVwbHkgdG8gb25lIGludm9jYXRpb246IGV4YWN0bHkgb25lIG9mIGB2YWx1ZWAgb3IgYGVycm9yYCBpcyBwcmVzZW50LiAqL1xuZXhwb3J0IHR5cGUgSW52b2tlUmVwbHkgPVxuXHR8IHtcblx0XHRcdHJlYWRvbmx5IHByb3RvY29sOiAxO1xuXHRcdFx0cmVhZG9ubHkgY2FsbF9pZDogc3RyaW5nO1xuXHRcdFx0cmVhZG9ubHkgb2s6IHRydWU7XG5cdFx0XHRyZWFkb25seSB2YWx1ZTogdW5rbm93bjtcblx0ICB9XG5cdHwge1xuXHRcdFx0cmVhZG9ubHkgcHJvdG9jb2w6IDE7XG5cdFx0XHRyZWFkb25seSBjYWxsX2lkOiBzdHJpbmc7XG5cdFx0XHRyZWFkb25seSBvazogZmFsc2U7XG5cdFx0XHRyZWFkb25seSBlcnJvcjogQnJpZGdlRmFpbHVyZTtcblx0ICB9O1xuXG4vKiogV2h5IGEgc3Vic2NyaXB0aW9uIHN0b3BwZWQuICovXG5leHBvcnQgdHlwZSBTdHJlYW1UZXJtaW5hbEtpbmQgPVxuXHR8IFwiY29tcGxldGVcIlxuXHR8IFwiZXJyb3JcIlxuXHR8IFwiY2FuY2VsbGVkXCJcblx0fCBcImdhcFwiXG5cdHwgXCJkaXNwb3NlZFwiO1xuXG4vKiogT25lIGV2ZW50IG9uIGEgc3Vic2NyaXB0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VTdHJlYW1FdmVudCB7XG5cdHJlYWRvbmx5IGtpbmQ6IFN0cmVhbUV2ZW50S2luZDtcblx0cmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqIFRoZSBlbmQgb2YgYSBzdWJzY3JpcHRpb24sIGFzIHRoZSBob3N0IGRlc2NyaWJlZCBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlU3RyZWFtVGVybWluYWwge1xuXHRyZWFkb25seSBraW5kOiBTdHJlYW1UZXJtaW5hbEtpbmQ7XG5cdHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGRyb3BwZWQ/OiBudW1iZXI7XG59XG5cbi8qKiBBIGZyYW1lIGNhcnJ5aW5nIG9uZSBldmVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlRXZlbnRGcmFtZSB7XG5cdHJlYWRvbmx5IHByb3RvY29sOiAxO1xuXHRyZWFkb25seSBzdWJzY3JpcHRpb25faWQ6IHN0cmluZztcblx0cmVhZG9ubHkgc2VxOiBudW1iZXI7XG5cdHJlYWRvbmx5IGV2ZW50OiBCcmlkZ2VTdHJlYW1FdmVudDtcbn1cblxuLyoqIFRoZSBmcmFtZSB0aGF0IGVuZHMgYSBzdWJzY3JpcHRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVRlcm1pbmFsRnJhbWUge1xuXHRyZWFkb25seSBwcm90b2NvbDogMTtcblx0cmVhZG9ubHkgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuXHRyZWFkb25seSB0ZXJtaW5hbDogQnJpZGdlU3RyZWFtVGVybWluYWw7XG59XG5cbi8qKiBBbnl0aGluZyB0aGUgaG9zdCBtYXkgc2VuZCBmb3IgYSBzdWJzY3JpcHRpb24uICovXG5leHBvcnQgdHlwZSBCcmlkZ2VTdHJlYW1GcmFtZSA9IEJyaWRnZUV2ZW50RnJhbWUgfCBCcmlkZ2VUZXJtaW5hbEZyYW1lO1xuXG4vKiogVGhlIHRyYW5zcG9ydCBhIGNsaWVudCBzcGVha3MgdGhyb3VnaDsgYSBRV2ViQ2hhbm5lbCBhZGFwdGVyIG9yIGEgc2NyaXB0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaXJlVHJhbnNwb3J0IHtcblx0c2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZDtcblx0c3Vic2NyaWJlKGxpc3RlbmVyOiAobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgQnJpZGdlQ2xpZW50fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlQ2xpZW50T3B0aW9ucyB7XG5cdHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIG9uZSBpbnZvY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZva2VPcHRpb25zIHtcblx0cmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQW4gZW52ZWxvcGUgb3IgcmVwbHkgZG9lcyBub3QgbWF0Y2ggdGhlIHZlcnNpb25lZCBicmlkZ2UgcHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcImludmFsaWRfYnJpZGdlX21lc3NhZ2VcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgaG9zdCBkaWQgbm90IGFuc3dlciBpbiB0aW1lLiBUaGUgY2FsbCBtYXkgc3RpbGwgaGF2ZSBydW4sIHNvIHRoaXMgaXMgYW5cbiAqIHVua25vd24gb3V0Y29tZTogcmV0cnlpbmcgYXV0b21hdGljYWxseSBpcyBmb3JiaWRkZW4sIGRlY2lkaW5nIGlzIHRoZSBjYWxsZXIncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtCcmlkZ2VUaW1lb3V0RXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgY2FsbElkOiBzdHJpbmc7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGNhbGxJZDogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlcikge1xuXHRcdHN1cGVyKFxuXHRcdFx0YENhbGwgJHtKU09OLnN0cmluZ2lmeShjYWxsSWQpfSBnb3Qgbm8gcmVwbHkgd2l0aGluICR7dGltZW91dE1zfW1zOyB0aGUgaG9zdCBtYXkgc3RpbGwgaGF2ZSBydW4gaXRgLFxuXHRcdFx0XCJ0aW1lb3V0XCIsXG5cdFx0KTtcblx0XHR0aGlzLmNhbGxJZCA9IGNhbGxJZDtcblx0fVxufVxuXG4vKipcbiAqIFRoZSBjYWxsZXIgYWJvcnRlZCBsb2NhbGx5LiBEaXN0aW5jdCBmcm9tIHRoZSBob3N0IGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbixcbiAqIHdoaWNoIGFycml2ZXMgYXMgYSBmYWlsdXJlIHJlcGx5IGNhcnJ5aW5nIHRoZSBgY2FuY2VsbGVkYCBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBjYWxsSWQ6IHN0cmluZztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoY2FsbElkOiBzdHJpbmcpIHtcblx0XHRzdXBlcihgQ2FsbCAke0pTT04uc3RyaW5naWZ5KGNhbGxJZCl9IHdhcyBhYm9ydGVkIGxvY2FsbHlgLCBcImFib3J0ZWRcIik7XG5cdFx0dGhpcy5jYWxsSWQgPSBjYWxsSWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgY2xpZW50IHdhcyBjbG9zZWQsIHNvIHBlbmRpbmcgY2FsbHMgY2FuIG5vIGxvbmdlciBiZSBhbnN3ZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtCcmlkZ2VDbG9zZWRFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihcIlRoaXMgYnJpZGdlIGNsaWVudCBpcyBjbG9zZWRcIiwgXCJjbG9zZWRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBBIHN1YnNjcmlwdGlvbidzIGZyYW1lcyB3ZXJlIG5vdCB0aGUgc2VxdWVuY2UgdGhlIGhvc3QgcHJvbWlzZWQuXG4gKlxuICogVGhlIGNsaWVudCBkb2VzIG5vdCB0cnkgdG8gcmVhc3NlbWJsZTogYSBtaXNzZWQgZnJhbWUgaXMgYSBmYWN0IGFib3V0IHRoZVxuICogc3Vic2NyaXB0aW9uLCBub3Qgc29tZXRoaW5nIHRvIHBhcGVyIG92ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlU2VxdWVuY2VFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBzdWJzY3JpcHRpb25JZDogc3RyaW5nO1xuXHRwdWJsaWMgcmVhZG9ubHkgZXhwZWN0ZWQ6IG51bWJlcjtcblx0cHVibGljIHJlYWRvbmx5IHJlY2VpdmVkOiBudW1iZXI7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHN1YnNjcmlwdGlvbklkOiBzdHJpbmcsXG5cdFx0ZXhwZWN0ZWQ6IG51bWJlcixcblx0XHRyZWNlaXZlZDogbnVtYmVyLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGBTdWJzY3JpcHRpb24gJHtKU09OLnN0cmluZ2lmeShzdWJzY3JpcHRpb25JZCl9IGV4cGVjdGVkIGZyYW1lICR7ZXhwZWN0ZWR9IGJ1dCByZWNlaXZlZCAke3JlY2VpdmVkfWAsXG5cdFx0XHRcInN0cmVhbV9nYXBcIixcblx0XHQpO1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBzdWJzY3JpcHRpb25JZDtcblx0XHR0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG5cdFx0dGhpcy5yZWNlaXZlZCA9IHJlY2VpdmVkO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIHN1YnNjcmlwdGlvbiBlbmRlZCB3aXRoIGEgdGVybWluYWwgZnJhbWUgdGhlIGNhbGxlciBtYXkgd2FudCB0byBpbnNwZWN0LlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZVN0cmVhbUVuZGVkRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZztcblx0cHVibGljIHJlYWRvbmx5IHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Ioc3Vic2NyaXB0aW9uSWQ6IHN0cmluZywgdGVybWluYWw6IEJyaWRnZVN0cmVhbVRlcm1pbmFsKSB7XG5cdFx0c3VwZXIoXG5cdFx0XHR0ZXJtaW5hbC5tZXNzYWdlID8/XG5cdFx0XHRcdGBTdWJzY3JpcHRpb24gJHtKU09OLnN0cmluZ2lmeShzdWJzY3JpcHRpb25JZCl9IGVuZGVkOiAke3Rlcm1pbmFsLmtpbmR9YCxcblx0XHRcdHRlcm1pbmFsLmtpbmQsXG5cdFx0KTtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWQ7XG5cdFx0dGhpcy50ZXJtaW5hbCA9IHRlcm1pbmFsO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIGhvc3QgcmVmdXNlZCBvciBmYWlsZWQgdGhlIG9wZXJhdGlvbjsgYGZhaWx1cmUuY29kZWAgaXMgdGhlIGNvbnRyYWN0LlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZVJlbW90ZUVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIHJlYWRvbmx5IGZhaWx1cmU6IEJyaWRnZUZhaWx1cmU7XG5cdHB1YmxpYyByZWFkb25seSBjYWxsSWQ6IHN0cmluZztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoY2FsbElkOiBzdHJpbmcsIGZhaWx1cmU6IEJyaWRnZUZhaWx1cmUpIHtcblx0XHRzdXBlcihmYWlsdXJlLm1lc3NhZ2UsIGZhaWx1cmUuY29kZSk7XG5cdFx0dGhpcy5jYWxsSWQgPSBjYWxsSWQ7XG5cdFx0dGhpcy5mYWlsdXJlID0gZmFpbHVyZTtcblx0fVxufVxuXG5mdW5jdGlvbiBpc05vbkVtcHR5U3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBQYXJzZSBvbmUgcmVwbHksIHJlZnVzaW5nIGFueXRoaW5nIHRoZSBob3N0IGNvdWxkIG5vdCBsZWdpdGltYXRlbHkgaGF2ZSBzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnZva2VSZXBseShyYXc6IHVua25vd24pOiBJbnZva2VSZXBseSB7XG5cdGlmICghaXNQbGFpblJlY29yZChyYXcpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFwiQSByZXBseSBtdXN0IGJlIGFuIG9iamVjdFwiKTtcblx0fVxuXHRpZiAocmF3LnByb3RvY29sICE9PSBCUklER0VfUFJPVE9DT0xfVkVSU0lPTikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdGBVbnN1cHBvcnRlZCBicmlkZ2UgcHJvdG9jb2w6ICR7U3RyaW5nKHJhdy5wcm90b2NvbCl9OyB0aGlzIGNsaWVudCBzcGVha3MgJHtCUklER0VfUFJPVE9DT0xfVkVSU0lPTn1gLFxuXHRcdCk7XG5cdH1cblx0aWYgKFxuXHRcdCFpc05vbkVtcHR5U3RyaW5nKHJhdy5jYWxsX2lkKSB8fFxuXHRcdHJhdy5jYWxsX2lkLmxlbmd0aCA+IE1BWF9DQUxMX0lEX0xFTkdUSFxuXHQpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgY2FsbF9pZCBtdXN0IGJlIGEgbm9uZW1wdHkgc3RyaW5nIG9mIGF0IG1vc3QgJHtNQVhfQ0FMTF9JRF9MRU5HVEh9IGNoYXJhY3RlcnNgLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgY2FsbElkID0gcmF3LmNhbGxfaWQ7XG5cdGlmICh0eXBlb2YgcmF3Lm9rICE9PSBcImJvb2xlYW5cIikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihgJHtjYWxsSWR9OiBvayBtdXN0IGJlIGEgYm9vbGVhbmApO1xuXHR9XG5cdGlmIChyYXcub2spIHtcblx0XHRpZiAoIU9iamVjdC5oYXNPd24ocmF3LCBcInZhbHVlXCIpKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06IGEgc3VjY2VzcyByZXBseSBtdXN0IGNhcnJ5IGEgdmFsdWVgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIE9iamVjdC5mcmVlemUoe1xuXHRcdFx0cHJvdG9jb2w6IEJSSURHRV9QUk9UT0NPTF9WRVJTSU9OLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0b2s6IHRydWUgYXMgY29uc3QsXG5cdFx0XHR2YWx1ZTogcmF3LnZhbHVlLFxuXHRcdH0pO1xuXHR9XG5cdGlmICghaXNQbGFpblJlY29yZChyYXcuZXJyb3IpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFxuXHRcdFx0YCR7Y2FsbElkfTogYSBmYWlsdXJlIHJlcGx5IG11c3QgY2FycnkgYW4gZXJyb3Igb2JqZWN0YCxcblx0XHQpO1xuXHR9XG5cdGlmICghaXNOb25FbXB0eVN0cmluZyhyYXcuZXJyb3IuY29kZSkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgJHtjYWxsSWR9OiBlcnJvci5jb2RlIG11c3QgYmUgYSBzdHJpbmdgLFxuXHRcdCk7XG5cdH1cblx0aWYgKHR5cGVvZiByYXcuZXJyb3IubWVzc2FnZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdGAke2NhbGxJZH06IGVycm9yLm1lc3NhZ2UgbXVzdCBiZSBhIHN0cmluZ2AsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0cHJvdG9jb2w6IEJSSURHRV9QUk9UT0NPTF9WRVJTSU9OLFxuXHRcdGNhbGxfaWQ6IGNhbGxJZCxcblx0XHRvazogZmFsc2UgYXMgY29uc3QsXG5cdFx0ZXJyb3I6IE9iamVjdC5mcmVlemUoe1xuXHRcdFx0Y29kZTogcmF3LmVycm9yLmNvZGUsXG5cdFx0XHRtZXNzYWdlOiByYXcuZXJyb3IubWVzc2FnZSxcblx0XHR9KSxcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwO1xufVxuXG5jb25zdCBURVJNSU5BTF9LSU5EUzogcmVhZG9ubHkgU3RyZWFtVGVybWluYWxLaW5kW10gPSBbXG5cdFwiY2FuY2VsbGVkXCIsXG5cdFwiY29tcGxldGVcIixcblx0XCJkaXNwb3NlZFwiLFxuXHRcImVycm9yXCIsXG5cdFwiZ2FwXCIsXG5dO1xuXG4vKipcbiAqIFBhcnNlIG9uZSBzdHJlYW0gZnJhbWUsIHJlZnVzaW5nIGFueXRoaW5nIHRoZSBob3N0IGNvdWxkIG5vdCBsZWdpdGltYXRlbHlcbiAqIGhhdmUgc2VudC5cbiAqXG4gKiBFeGFjdGx5IG9uZSBvZiBgZXZlbnRgIGFuZCBgdGVybWluYWxgIGhhcyB0byBiZSBwcmVzZW50OiBhIGZyYW1lIHRoYXQgY2Fycmllc1xuICogYm90aCBsZWF2ZXMgdGhlIGNsaWVudCBndWVzc2luZyB3aGljaCBvbmUgd2lucywgYW5kIGEgY2xpZW50IHRoYXQgZ3Vlc3NlcyBpc1xuICogYSBjbGllbnQgdGhhdCB3aWxsIGV2ZW50dWFsbHkgZGVsaXZlciBhbiBldmVudCBhZnRlciB0aGUgZW5kIG9mIGEgc3RyZWFtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJlYW1GcmFtZShyYXc6IHVua25vd24pOiBCcmlkZ2VTdHJlYW1GcmFtZSB7XG5cdGlmICghaXNQbGFpblJlY29yZChyYXcpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFwiQSBzdHJlYW0gZnJhbWUgbXVzdCBiZSBhbiBvYmplY3RcIik7XG5cdH1cblx0aWYgKHJhdy5wcm90b2NvbCAhPT0gQlJJREdFX1BST1RPQ09MX1ZFUlNJT04pIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgVW5zdXBwb3J0ZWQgYnJpZGdlIHByb3RvY29sOiAke1N0cmluZyhyYXcucHJvdG9jb2wpfTsgdGhpcyBjbGllbnQgc3BlYWtzICR7QlJJREdFX1BST1RPQ09MX1ZFUlNJT059YCxcblx0XHQpO1xuXHR9XG5cdGlmICghaXNOb25FbXB0eVN0cmluZyhyYXcuc3Vic2NyaXB0aW9uX2lkKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdFwiQSBzdHJlYW0gZnJhbWUgbXVzdCBuYW1lIGl0cyBzdWJzY3JpcHRpb25cIixcblx0XHQpO1xuXHR9XG5cdGlmICghaXNJbmRleChyYXcuc2VxKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdGAke3Jhdy5zdWJzY3JpcHRpb25faWR9OiBzZXEgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCxcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGhhc0V2ZW50ID0gT2JqZWN0Lmhhc093bihyYXcsIFwiZXZlbnRcIik7XG5cdGNvbnN0IGhhc1Rlcm1pbmFsID0gT2JqZWN0Lmhhc093bihyYXcsIFwidGVybWluYWxcIik7XG5cdGlmIChoYXNFdmVudCA9PT0gaGFzVGVybWluYWwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgJHtyYXcuc3Vic2NyaXB0aW9uX2lkfTogYSBzdHJlYW0gZnJhbWUgY2FycmllcyBhbiBldmVudCBvciBhIHRlcm1pbmFsLCBub3QgYm90aGAsXG5cdFx0KTtcblx0fVxuXHRpZiAoaGFzRXZlbnQpIHtcblx0XHRpZiAoIWlzUGxhaW5SZWNvcmQocmF3LmV2ZW50KSkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFxuXHRcdFx0XHRgJHtyYXcuc3Vic2NyaXB0aW9uX2lkfTogZXZlbnQgbXVzdCBiZSBhbiBvYmplY3RgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29uc3Qga2luZCA9IHJhdy5ldmVudC5raW5kO1xuXHRcdGlmICghU1RSRUFNX0VWRU5UX0tJTkRTLmluY2x1ZGVzKGtpbmQgYXMgU3RyZWFtRXZlbnRLaW5kKSkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFxuXHRcdFx0XHRgJHtyYXcuc3Vic2NyaXB0aW9uX2lkfTogJHtTdHJpbmcoa2luZCl9IGlzIG5vdCBhbiBldmVudCBraW5kYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRcdHByb3RvY29sOiBCUklER0VfUFJPVE9DT0xfVkVSU0lPTixcblx0XHRcdHN1YnNjcmlwdGlvbl9pZDogcmF3LnN1YnNjcmlwdGlvbl9pZCxcblx0XHRcdHNlcTogcmF3LnNlcSxcblx0XHRcdGV2ZW50OiBPYmplY3QuZnJlZXplKHtcblx0XHRcdFx0a2luZDoga2luZCBhcyBTdHJlYW1FdmVudEtpbmQsXG5cdFx0XHRcdHBheWxvYWQ6IHJhdy5ldmVudC5wYXlsb2FkLFxuXHRcdFx0fSksXG5cdFx0fSk7XG5cdH1cblx0aWYgKCFpc1BsYWluUmVjb3JkKHJhdy50ZXJtaW5hbCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgJHtyYXcuc3Vic2NyaXB0aW9uX2lkfTogdGVybWluYWwgbXVzdCBiZSBhbiBvYmplY3RgLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qga2luZCA9IHJhdy50ZXJtaW5hbC5raW5kO1xuXHRpZiAoIVRFUk1JTkFMX0tJTkRTLmluY2x1ZGVzKGtpbmQgYXMgU3RyZWFtVGVybWluYWxLaW5kKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdGAke3Jhdy5zdWJzY3JpcHRpb25faWR9OiAke1N0cmluZyhraW5kKX0gaXMgbm90IGEgdGVybWluYWwga2luZGAsXG5cdFx0KTtcblx0fVxuXHRpZiAoXG5cdFx0cmF3LnRlcm1pbmFsLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJlxuXHRcdHR5cGVvZiByYXcudGVybWluYWwubWVzc2FnZSAhPT0gXCJzdHJpbmdcIlxuXHQpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXG5cdFx0XHRgJHtyYXcuc3Vic2NyaXB0aW9uX2lkfTogdGVybWluYWwubWVzc2FnZSBtdXN0IGJlIGEgc3RyaW5nYCxcblx0XHQpO1xuXHR9XG5cdGlmIChyYXcudGVybWluYWwuZHJvcHBlZCAhPT0gdW5kZWZpbmVkICYmICFpc0luZGV4KHJhdy50ZXJtaW5hbC5kcm9wcGVkKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdGAke3Jhdy5zdWJzY3JpcHRpb25faWR9OiB0ZXJtaW5hbC5kcm9wcGVkIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcmAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0cHJvdG9jb2w6IEJSSURHRV9QUk9UT0NPTF9WRVJTSU9OLFxuXHRcdHN1YnNjcmlwdGlvbl9pZDogcmF3LnN1YnNjcmlwdGlvbl9pZCxcblx0XHRzZXE6IHJhdy5zZXEsXG5cdFx0dGVybWluYWw6IE9iamVjdC5mcmVlemUoe1xuXHRcdFx0a2luZDoga2luZCBhcyBTdHJlYW1UZXJtaW5hbEtpbmQsXG5cdFx0XHQuLi4odHlwZW9mIHJhdy50ZXJtaW5hbC5tZXNzYWdlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdD8geyBtZXNzYWdlOiByYXcudGVybWluYWwubWVzc2FnZSB9XG5cdFx0XHRcdDoge30pLFxuXHRcdFx0Li4uKGlzSW5kZXgocmF3LnRlcm1pbmFsLmRyb3BwZWQpXG5cdFx0XHRcdD8geyBkcm9wcGVkOiByYXcudGVybWluYWwuZHJvcHBlZCB9XG5cdFx0XHRcdDoge30pLFxuXHRcdH0pLFxuXHR9KTtcbn1cblxuLyoqIENhbGxiYWNrcyBhIHN1YnNjcmlwdGlvbiByZXBvcnRzIHRocm91Z2guICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmlwdGlvbkhhbmRsZXJzIHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogQnJpZGdlU3RyZWFtRXZlbnQpID0+IHZvaWQ7XG5cdHJlYWRvbmx5IG9uVGVybWluYWw/OiAodGVybWluYWw6IEJyaWRnZVN0cmVhbVRlcm1pbmFsKSA9PiB2b2lkO1xufVxuXG4vKiogQSBsaXZlIHN1YnNjcmlwdGlvbiwgYXMgdGhlIGNhbGxlciBob2xkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlU3Vic2NyaXB0aW9uIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgT3BlblN1YnNjcmlwdGlvbiB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXJzOiBTdWJzY3JpcHRpb25IYW5kbGVycztcblx0ZXhwZWN0ZWRTZXE6IG51bWJlcjtcblx0Y2xvc2VkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGVuZGluZ0NhbGwge1xuXHRyZWFkb25seSByZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG5cdHJlYWRvbmx5IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblx0cmVhZG9ubHkgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcblx0cmVhZG9ubHkgZGV0YWNoOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xufVxuXG4vKipcbiAqIENvcnJlbGF0ZSBpbnZvY2F0aW9ucyB3aXRoIHJlcGxpZXMgb3ZlciBhbiBpbmplY3RlZCB0cmFuc3BvcnQuXG4gKlxuICogVGhlIGNsaWVudCBuZXZlciByZXRyaWVzOiBhIHRpbWVvdXQsIGFuIGFib3J0IGFuZCBhIGNsb3NlZCBjbGllbnQgYXJlIHRocmVlXG4gKiBkaWZmZXJlbnQgYW5zd2VycywgYW5kIGVhY2ggaXMgcmVwb3J0ZWQgYXMgaXRzZWxmLlxuICovXG5leHBvcnQgY2xhc3MgQnJpZGdlQ2xpZW50IHtcblx0cHJpdmF0ZSByZWFkb25seSB0cmFuc3BvcnQ6IFdpcmVUcmFuc3BvcnQ7XG5cdHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG5cdHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZzogTWFwPHN0cmluZywgUGVuZGluZ0NhbGw+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIE9wZW5TdWJzY3JpcHRpb24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2FsczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG5cdHByaXZhdGUgY291bnRlcjogbnVtYmVyID0gMDtcblx0cHJpdmF0ZSBjbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSB1bm1hdGNoZWQ6IG51bWJlciA9IDA7XG5cdHByaXZhdGUgYnJlYWtzOiBudW1iZXIgPSAwO1xuXHRwcml2YXRlIGxhc3RQcm90b2NvbEVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHR0cmFuc3BvcnQ6IFdpcmVUcmFuc3BvcnQsXG5cdFx0b3B0aW9uczogQnJpZGdlQ2xpZW50T3B0aW9ucyA9IHt9LFxuXHQpIHtcblx0XHR0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDtcblx0XHR0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IDMwXzAwMDtcblx0XHR0aGlzLnVuc3Vic2NyaWJlID0gdHJhbnNwb3J0LnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuXHRcdFx0dGhpcy5oYW5kbGUobWVzc2FnZSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKiogV2hldGhlciB7QGxpbmsgY2xvc2V9IGhhcyBydW47IGEgY2xvc2VkIGNsaWVudCBhbnN3ZXJzIG5vdGhpbmcuICovXG5cdHB1YmxpYyBnZXQgaXNDbG9zZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2VkO1xuXHR9XG5cblx0LyoqIFJlcGxpZXMgdGhhdCBuYW1lZCBubyBwZW5kaW5nIGNhbGw6IGEgbGF0ZSBkdXBsaWNhdGUsIG9yIGEgc3RyYXkgbWVzc2FnZS4gKi9cblx0cHVibGljIGdldCB1bm1hdGNoZWRSZXBsaWVzKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudW5tYXRjaGVkO1xuXHR9XG5cblx0LyoqIE51bWJlciBvZiBjYWxscyBzdGlsbCB3YWl0aW5nIGZvciBhIHJlcGx5LiAqL1xuXHRwdWJsaWMgZ2V0IHBlbmRpbmdDYWxscygpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLnBlbmRpbmcuc2l6ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZva2Ugb25lIG9wZXJhdGlvbiBhbmQgc2V0dGxlIHdpdGggaXRzIHZhbHVlIG9yIHdpdGggYSB0eXBlZCBmYWlsdXJlLlxuXHQgKi9cblx0cHVibGljIGludm9rZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fSxcblx0XHRvcHRpb25zOiBJbnZva2VPcHRpb25zID0ge30sXG5cdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdGlmICghaXNOb25FbXB0eVN0cmluZyhvcGVyYXRpb24pKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXG5cdFx0XHRcdG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcIm9wZXJhdGlvbiBtdXN0IGJlIGEgbm9uZW1wdHkgc3RyaW5nXCIpLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc2VuZCh7IGtpbmQ6IFwiaW52b2tlXCIsIG9wZXJhdGlvbiwgcGF5bG9hZCB9LCBvcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPcGVuIGEgc3Vic2NyaXB0aW9uIGFuZCByZXNvbHZlIG9uY2UgdGhlIGhvc3QgaGFzIGFja25vd2xlZGdlZCBpdC5cblx0ICpcblx0ICogRnJhbWVzIGFyZSBtYXRjaGVkIHRvIHRoZSBzdWJzY3JpcHRpb24gYnkgaWQgYW5kIGJ5IHNlcXVlbmNlOyBhIGZyYW1lIHRoYXRcblx0ICogZG9lcyBub3QgY29udGludWUgdGhlIHNlcXVlbmNlIGVuZHMgdGhlIHN1YnNjcmlwdGlvbiBpbnN0ZWFkIG9mIGJlaW5nXG5cdCAqIGRlbGl2ZXJlZCBvdXQgb2Ygb3JkZXIuXG5cdCAqL1xuXHRwdWJsaWMgc3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbjogc3RyaW5nLFxuXHRcdHBheWxvYWQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHt9LFxuXHRcdGhhbmRsZXJzOiBTdWJzY3JpcHRpb25IYW5kbGVycyA9IHt9LFxuXHRcdG9wdGlvbnM6IEludm9rZU9wdGlvbnMgPSB7fSxcblx0KTogUHJvbWlzZTxCcmlkZ2VTdWJzY3JpcHRpb24+IHtcblx0XHRpZiAoIWlzTm9uRW1wdHlTdHJpbmcob3BlcmF0aW9uKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFxuXHRcdFx0XHRuZXcgUWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IoXCJvcGVyYXRpb24gbXVzdCBiZSBhIG5vbmVtcHR5IHN0cmluZ1wiKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNlbmQoeyBraW5kOiBcInN1YnNjcmliZVwiLCBvcGVyYXRpb24sIHBheWxvYWQgfSwgb3B0aW9ucykudGhlbihcblx0XHRcdCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZCA9IGlzUGxhaW5SZWNvcmQodmFsdWUpID8gdmFsdWUuc3Vic2NyaXB0aW9uX2lkIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzTm9uRW1wdHlTdHJpbmcoaWQpKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFxuXHRcdFx0XHRcdFx0XCJBIHN1YnNjcmlwdGlvbiBhY2tub3dsZWRnZW1lbnQgbXVzdCBjYXJyeSBhIHN1YnNjcmlwdGlvbl9pZFwiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb3BlbjogT3BlblN1YnNjcmlwdGlvbiA9IHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRoYW5kbGVycyxcblx0XHRcdFx0XHRleHBlY3RlZFNlcTogMCxcblx0XHRcdFx0XHRjbG9zZWQ6IGZhbHNlLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGlkLCBvcGVuKTtcblx0XHRcdFx0Y29uc3QgaGFuZGxlOiBCcmlkZ2VTdWJzY3JpcHRpb24gPSB7XG5cdFx0XHRcdFx0aWQsXG5cdFx0XHRcdFx0Z2V0IGNsb3NlZCgpOiBib29sZWFuIHtcblx0XHRcdFx0XHRcdHJldHVybiBvcGVuLmNsb3NlZDtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGNsb3NlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmVuZFN1YnNjcmlwdGlvbihpZCwgeyBraW5kOiBcImRpc3Bvc2VkXCIgfSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIGhhbmRsZTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBc2sgdGhlIGhvc3QgZm9yIHRoZSBoYW5kc2hha2U6IHRoZSBjb250cmFjdCB0aGlzIHZpZXcgbWF5IHVzZS5cblx0ICpcblx0ICogVGhlIGhvc3QgYm91bmQgdGhlIHZpZXcgYmVmb3JlIGl0cyBmaXJzdCBtZXNzYWdlLCBzbyB0aGlzIGlzIGEgY2FsbCwgbm90XG5cdCAqIGEgYmluZGluZy4gVGhlIHZhbHVlIGlzIHdoYXQgYERpc3BhdGNoZXIuaGFuZHNoYWtlYCBidWlsZHMgLSBwcm90b2NvbCxcblx0ICogZ2VuZXJhdGlvbiwgdGhlIHBsdWdpbiBkZXNjcmlwdGlvbiwgdGhlIGhvc3Qgc2NoZW1hIHZlcnNpb24gYW5kIHRoZVxuXHQgKiBvcGVyYXRpb25zIHRoaXMgdmlldyBpcyBhdXRob3JpemVkIGZvci5cblx0ICovXG5cdHB1YmxpYyBoYW5kc2hha2Uob3B0aW9uczogSW52b2tlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2VuZCh7IGtpbmQ6IFwiaGFuZHNoYWtlXCIgfSwgb3B0aW9ucyk7XG5cdH1cblxuXHQvKiogU3Vic2NyaXB0aW9ucyBzdGlsbCBvcGVuOyBhIGxlYWsgY2hlY2sgZm9yIGNhbGxlcnMgYW5kIHRlc3RzLiAqL1xuXHRwdWJsaWMgZ2V0IGFjdGl2ZVN1YnNjcmlwdGlvbnMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5zdWJzY3JpcHRpb25zLmtleXMoKV07XG5cdH1cblxuXHQvKiogRnJhbWVzIHRoYXQgZGlkIG5vdCBjb250aW51ZSB0aGVpciBzdWJzY3JpcHRpb24ncyBzZXF1ZW5jZS4gKi9cblx0cHVibGljIGdldCBzZXF1ZW5jZUJyZWFrcygpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmJyZWFrcztcblx0fVxuXG5cdHByaXZhdGUgc2VuZChcblx0XHRib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0b3B0aW9uczogSW52b2tlT3B0aW9ucyxcblx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0aWYgKHRoaXMuY2xvc2VkKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFFnaXNTZGtCcmlkZ2VDbG9zZWRFcnJvcigpKTtcblx0XHR9XG5cdFx0dGhpcy5jb3VudGVyICs9IDE7XG5cdFx0Y29uc3QgY2FsbElkID0gYGMke3RoaXMuY291bnRlcn1gO1xuXG5cdFx0Y29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPHVua25vd24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZWplY3QobmV3IFFnaXNTZGtCcmlkZ2VBYm9ydGVkRXJyb3IoY2FsbElkKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuZ2V0KGNhbGxJZCk7XG5cdFx0XHRcdGlmIChwZW5kaW5nID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXR0bGUoY2FsbElkKTtcblx0XHRcdFx0cGVuZGluZy5yZWplY3QobmV3IFFnaXNTZGtCcmlkZ2VBYm9ydGVkRXJyb3IoY2FsbElkKSk7XG5cdFx0XHR9O1xuXHRcdFx0b3B0aW9ucy5zaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG5cblx0XHRcdGNvbnN0IHRpbWVyID1cblx0XHRcdFx0dGhpcy50aW1lb3V0TXMgPiAwXG5cdFx0XHRcdFx0PyBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoY2FsbElkKTtcblx0XHRcdFx0XHRcdFx0aWYgKHBlbmRpbmcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLnNldHRsZShjYWxsSWQpO1xuXHRcdFx0XHRcdFx0XHRwZW5kaW5nLnJlamVjdChcblx0XHRcdFx0XHRcdFx0XHRuZXcgUWdpc1Nka0JyaWRnZVRpbWVvdXRFcnJvcihjYWxsSWQsIHRoaXMudGltZW91dE1zKSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sIHRoaXMudGltZW91dE1zKVxuXHRcdFx0XHRcdDogbnVsbDtcblxuXHRcdFx0Y29uc3QgZGV0YWNoID1cblx0XHRcdFx0b3B0aW9ucy5zaWduYWwgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gbnVsbFxuXHRcdFx0XHRcdDogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0dGhpcy5wZW5kaW5nLnNldChjYWxsSWQsIHsgcmVzb2x2ZSwgcmVqZWN0LCB0aW1lciwgZGV0YWNoIH0pO1xuXHRcdFx0dGhpcy50cmFuc3BvcnQuc2VuZCh7XG5cdFx0XHRcdHByb3RvY29sOiBCUklER0VfUFJPVE9DT0xfVkVSU0lPTixcblx0XHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0XHQuLi5ib2R5LFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZ1c2UgZnVydGhlciBjYWxscywgcmVqZWN0IHdoYXQgaXMgc3RpbGwgcGVuZGluZywgYW5kIHN0b3AgbGlzdGVuaW5nLlxuXHQgKi9cblx0cHVibGljIGNsb3NlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNsb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmNsb3NlZCA9IHRydWU7XG5cdFx0dGhpcy51bnN1YnNjcmliZSgpO1xuXHRcdGZvciAoY29uc3QgaWQgb2YgWy4uLnRoaXMuc3Vic2NyaXB0aW9ucy5rZXlzKCldKSB7XG5cdFx0XHR0aGlzLmVuZFN1YnNjcmlwdGlvbihpZCwgeyBraW5kOiBcImRpc3Bvc2VkXCIgfSwgZmFsc2UpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGNhbGxJZCBvZiBbLi4udGhpcy5wZW5kaW5nLmtleXMoKV0pIHtcblx0XHRcdGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuZ2V0KGNhbGxJZCk7XG5cdFx0XHRpZiAocGVuZGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zZXR0bGUoY2FsbElkKTtcblx0XHRcdHBlbmRpbmcucmVqZWN0KG5ldyBRZ2lzU2RrQnJpZGdlQ2xvc2VkRXJyb3IoKSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzZXR0bGUoY2FsbElkOiBzdHJpbmcpOiBQZW5kaW5nQ2FsbCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoY2FsbElkKTtcblx0XHRpZiAocGVuZGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmcuZGVsZXRlKGNhbGxJZCk7XG5cdFx0aWYgKHBlbmRpbmcudGltZXIgIT09IG51bGwpIHtcblx0XHRcdGNsZWFyVGltZW91dChwZW5kaW5nLnRpbWVyKTtcblx0XHR9XG5cdFx0cGVuZGluZy5kZXRhY2g/LigpO1xuXHRcdHJldHVybiBwZW5kaW5nO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGUobWVzc2FnZTogdW5rbm93bik6IHZvaWQge1xuXHRcdGlmIChpc1BsYWluUmVjb3JkKG1lc3NhZ2UpICYmIE9iamVjdC5oYXNPd24obWVzc2FnZSwgXCJzdWJzY3JpcHRpb25faWRcIikpIHtcblx0XHRcdHRoaXMuaGFuZGxlRnJhbWUobWVzc2FnZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxldCByZXBseTogSW52b2tlUmVwbHk7XG5cdFx0dHJ5IHtcblx0XHRcdHJlcGx5ID0gcGFyc2VJbnZva2VSZXBseShtZXNzYWdlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Ly8gQSBtYWxmb3JtZWQgbWVzc2FnZSBjYW5ub3QgYmUgYXR0cmlidXRlZCB0byBhIGNhbGwsIHNvIGl0IGNhbm5vdFxuXHRcdFx0Ly8gc2V0dGxlIG9uZTogdGhlIGNhbGwga2VlcHMgd2FpdGluZyBhbmQgZXZlbnR1YWxseSB0aW1lcyBvdXQsIHdoaWNoXG5cdFx0XHQvLyBpcyB0aGUgaG9uZXN0IGFuc3dlciBhYm91dCBhbiBvdXRjb21lIHRoZSBjbGllbnQgY291bGQgbm90IHJlYWQuXG5cdFx0XHR0aGlzLnVubWF0Y2hlZCArPSAxO1xuXHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sYXN0UHJvdG9jb2xFcnJvciA9IGVycm9yO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5kaXNwb3NhbHMuZGVsZXRlKHJlcGx5LmNhbGxfaWQpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHBlbmRpbmcgPSB0aGlzLnNldHRsZShyZXBseS5jYWxsX2lkKTtcblx0XHRpZiAocGVuZGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnVubWF0Y2hlZCArPSAxO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAocmVwbHkub2spIHtcblx0XHRcdHBlbmRpbmcucmVzb2x2ZShyZXBseS52YWx1ZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBlbmRpbmcucmVqZWN0KG5ldyBRZ2lzU2RrQnJpZGdlUmVtb3RlRXJyb3IocmVwbHkuY2FsbF9pZCwgcmVwbHkuZXJyb3IpKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlRnJhbWUocmF3OiB1bmtub3duKTogdm9pZCB7XG5cdFx0bGV0IGZyYW1lOiBCcmlkZ2VTdHJlYW1GcmFtZTtcblx0XHR0cnkge1xuXHRcdFx0ZnJhbWUgPSBwYXJzZVN0cmVhbUZyYW1lKHJhdyk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdC8vIEEgZnJhbWUgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNhbm5vdCBiZSBhdHRyaWJ1dGVkIGVpdGhlciwgc28gaXQgaXNcblx0XHRcdC8vIGNvdW50ZWQgcmF0aGVyIHRoYW4gZGVsaXZlcmVkIHRvIHdoYXRldmVyIHN1YnNjcmlwdGlvbiBsb29rcyBjbG9zZXN0LlxuXHRcdFx0dGhpcy51bm1hdGNoZWQgKz0gMTtcblx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRcdHRoaXMubGFzdFByb3RvY29sRXJyb3IgPSBlcnJvcjtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgb3BlbiA9IHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZnJhbWUuc3Vic2NyaXB0aW9uX2lkKTtcblx0XHRpZiAob3BlbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnVubWF0Y2hlZCArPSAxO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZnJhbWUuc2VxICE9PSBvcGVuLmV4cGVjdGVkU2VxKSB7XG5cdFx0XHR0aGlzLmJyZWFrcyArPSAxO1xuXHRcdFx0Y29uc3QgZXhwZWN0ZWQgPSBvcGVuLmV4cGVjdGVkU2VxO1xuXHRcdFx0dGhpcy5lbmRTdWJzY3JpcHRpb24oXG5cdFx0XHRcdGZyYW1lLnN1YnNjcmlwdGlvbl9pZCxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtpbmQ6IFwiZ2FwXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogYEV4cGVjdGVkIGZyYW1lICR7ZXhwZWN0ZWR9IGJ1dCByZWNlaXZlZCAke2ZyYW1lLnNlcX1gLFxuXHRcdFx0XHRcdGRyb3BwZWQ6IE1hdGgubWF4KDAsIGZyYW1lLnNlcSAtIGV4cGVjdGVkKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG9wZW4uZXhwZWN0ZWRTZXEgKz0gMTtcblx0XHRpZiAoXCJ0ZXJtaW5hbFwiIGluIGZyYW1lKSB7XG5cdFx0XHR0aGlzLmVuZFN1YnNjcmlwdGlvbihmcmFtZS5zdWJzY3JpcHRpb25faWQsIGZyYW1lLnRlcm1pbmFsLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG9wZW4uaGFuZGxlcnMub25FdmVudD8uKGZyYW1lLmV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgZW5kU3Vic2NyaXB0aW9uKFxuXHRcdGlkOiBzdHJpbmcsXG5cdFx0dGVybWluYWw6IEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRcdG5vdGlmeUhvc3Q6IGJvb2xlYW4sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wZW4gPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGlkKTtcblx0XHRpZiAob3BlbiA9PT0gdW5kZWZpbmVkIHx8IG9wZW4uY2xvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG9wZW4uY2xvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGlkKTtcblx0XHRpZiAobm90aWZ5SG9zdCkge1xuXHRcdFx0dGhpcy5kaXNwb3NlU3Vic2NyaXB0aW9uKGlkKTtcblx0XHR9XG5cdFx0b3Blbi5oYW5kbGVycy5vblRlcm1pbmFsPy4odGVybWluYWwpO1xuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlU3Vic2NyaXB0aW9uKGlkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jbG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5jb3VudGVyICs9IDE7XG5cdFx0Y29uc3QgY2FsbElkID0gYGMke3RoaXMuY291bnRlcn1gO1xuXHRcdHRoaXMuZGlzcG9zYWxzLmFkZChjYWxsSWQpO1xuXHRcdHRoaXMudHJhbnNwb3J0LnNlbmQoe1xuXHRcdFx0cHJvdG9jb2w6IEJSSURHRV9QUk9UT0NPTF9WRVJTSU9OLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0a2luZDogXCJ1bnN1YnNjcmliZVwiLFxuXHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBpZCxcblx0XHR9KTtcblx0fVxuXG5cdC8qKiBUaGUgbGFzdCBtYWxmb3JtZWQgbWVzc2FnZSB0aGlzIGNsaWVudCByZWZ1c2VkLCBpZiBhbnkuICovXG5cdHB1YmxpYyBnZXQgcHJvdG9jb2xFcnJvcigpOiBFcnJvciB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLmxhc3RQcm90b2NvbEVycm9yO1xuXHR9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVdPLElBQU0scUJBQWlELE9BQU8sT0FBTztBQUFBLEVBQzNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRCxDQUFDO0FBTU0sU0FBUyxhQUFhLENBQzVCLE9BQ21DO0FBQUEsRUFDbkMsT0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUFBOzs7QUNEcEUsSUFBTSwyQkFBNkI7QUFDbkMsSUFBTSxzQkFBNkI7QUFBQTtBQWtGbkMsTUFBTSxvQ0FBbUMsY0FBYTtBQUFBLEVBQ3JELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyx3QkFBd0I7QUFBQTtBQUV6QztBQUFBO0FBTU8sTUFBTSxtQ0FBa0MsY0FBYTtBQUFBLEVBQzNDO0FBQUEsRUFFVCxXQUFXLENBQUMsUUFBZ0IsV0FBbUI7QUFBQSxJQUNyRCxNQUNDLFFBQVEsS0FBSyxVQUFVLE1BQU0seUJBQXlCLCtDQUN0RCxTQUNEO0FBQUEsSUFDQSxLQUFLLFNBQVM7QUFBQTtBQUVoQjtBQUFBO0FBTU8s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QSxNQUdmLEtBQUssYUFBYTtBQUFBLE1BQ2xCLElBQUksaUJBQWlCLE9BQU87QUFBQSxRQUMzQixLQUFLLG9CQUFvQjtBQUFBLE1BQzFCO0FBQUEsTUFDQTtBQUFBO0FBQUEsSUFFRCxNQUFNLE9BQU8sS0FBSyxjQUFjLElBQUksTUFBTSxlQUFlO0FBQUEsSUFDekQsSUFBSSxTQUFTLFdBQVc7QUFBQSxNQUN2QixLQUFLLGFBQWE7QUFBQSxNQUNsQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLElBQUksTUFBTSxRQUFRLEtBQUssYUFBYTtBQUFBLE1BQ25DLEtBQUssVUFBVTtBQUFBLE1BQ2YsTUFBTSxXQUFXLEtBQUs7QUFBQSxNQUN0QixLQUFLLGdCQUNKLE1BQU0saUJBQ047QUFBQSxRQUNDLE1BQU07QUFBQSxRQUNOLFNBQVMsa0JBQWtCLHlCQUF5QixNQUFNO0FBQUEsUUFDMUQsU0FBUyxLQUFLLElBQUksR0FBRyxNQUFNLE1BQU0sUUFBUTtBQUFBLE1BQzFDLEdBQ0EsSUFDRDtBQUFBLE1BQ0E7QUFBQSxJQUNEO0FBQUEsSUFDQSxLQUFLLGVBQWU7QUFBQSxJQUNwQixJQUFJLGNBQWMsT0FBTztBQUFBLE1BQ3hCLEtBQUssZ0JBQWdCLE1BQU0saUJBQWlCLE1BQU0sVUFBVSxLQUFLO0FBQUEsTUFDakU7QUFBQSxJQUNEO0FBQUEsSUFDQSxLQUFLLFNBQVMsVUFBVSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBRzVCLGVBQWUsQ0FDdEIsSUFDQSxVQUNBLFlBQ087QUFBQSxJQUNQLE1BQU0sT0FBTyxLQUFLLGNBQWMsSUFBSSxFQUFFO0FBQUEsSUFDdEMsSUFBSSxTQUFTLGFBQWEsS0FBSyxRQUFRO0FBQUEsTUFDdEM7QUFBQSxJQUNEO0FBQUEsSUFDQSxLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssY0FBYyxPQUFPLEVBQUU7QUFBQSxJQUM1QixJQUFJLFlBQVk7QUFBQSxNQUNmLEtBQUssb0JBQW9CLEVBQUU7QUFBQSxJQUM1QjtBQUFBLElBQ0EsS0FBSyxTQUFTLGFBQWEsUUFBUTtBQUFBO0FBQUEsRUFHNUIsbUJBQW1CLENBQUMsSUFBa0I7QUFBQSxJQUM3QyxJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2hCO0FBQUEsSUFDRDtBQUFBLElBQ0EsS0FBSyxXQUFXO0FBQUEsSUFDaEIsTUFBTSxTQUFTLElBQUksS0FBSztBQUFBLElBQ3hCLEtBQUssVUFBVSxJQUFJLE1BQU07QUFBQSxJQUN6QixLQUFLLFVBQVUsS0FBSztBQUFBLE1BQ25CLFVBQVU7QUFBQSxNQUNWLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLGlCQUFpQjtBQUFBLElBQ2xCLENBQUM7QUFBQTtBQUFBLE1BSVMsYUFBYSxHQUFpQjtBQUFBLElBQ3hDLE9BQU8sS0FBSztBQUFBO0FBRWQ7IiwKICAiZGVidWdJZCI6ICI0RTZBNDkzODM5NzNBRUFFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -0,0 +1,155 @@
1
+ import { PluginDescription2, BridgeStreamTerminal2, WireTransport2, InvokeOptions2, BridgeSubscription2, BridgeClient2 } from "./chunk-wtv4vt4q.js";
2
+ import { HostOperationId2, HostOperations2 } from "./chunk-7tgzmz0m.js";
3
+ /** What one declared action promises: an object in, a value out. */
4
+ interface OperationShape2 {
5
+ readonly request: object;
6
+ readonly result: unknown;
7
+ }
8
+ /** What one declared stream promises: an object in, discriminated events out. */
9
+ interface StreamShape2 {
10
+ readonly request: object;
11
+ readonly event: {
12
+ readonly kind: string;
13
+ readonly payload: unknown;
14
+ };
15
+ }
16
+ /** The default, untyped map: any id, any shape. */
17
+ type OperationMap2 = {
18
+ readonly [id: string]: OperationShape2;
19
+ };
20
+ /** The default, untyped map: any id, any shape. */
21
+ type StreamMap2 = {
22
+ readonly [id: string]: StreamShape2;
23
+ };
24
+ /**
25
+ * A parsed plugin description carrying its `Operations` and `Streams` types.
26
+ *
27
+ * The `"~types"` member is compile-time only: it is never set, and a schema is
28
+ * a frozen {@link PluginDescription} and nothing more at run time. It is a
29
+ * string key, not a unique symbol, so the type stays structurally the same
30
+ * across the package's entry points.
31
+ */
32
+ interface BridgeSchema2<
33
+ O = OperationMap2,
34
+ S = StreamMap2
35
+ > extends PluginDescription2 {
36
+ readonly "~types"?: {
37
+ readonly operations: O;
38
+ readonly streams: S;
39
+ };
40
+ }
41
+ /** The `Operations` map a schema carries. */
42
+ type OperationsOf2<Schema> = Schema extends BridgeSchema2<infer O, unknown> ? O : never;
43
+ /** The `Streams` map a schema carries. */
44
+ type StreamsOf2<Schema> = Schema extends BridgeSchema2<unknown, infer S> ? S : never;
45
+ /**
46
+ * Parse a description and type it; the generated module is the only caller.
47
+ *
48
+ * The description is checked the way any description is (`schema_version`,
49
+ * ids, handlers, declared streams), so a hand-edited or stale module fails
50
+ * here, at import, rather than on the first call.
51
+ */
52
+ declare function defineBridgeSchema2<
53
+ O extends Record<keyof O, OperationShape2>,
54
+ S extends Record<keyof S, StreamShape2>
55
+ >(input: string | Readonly<Record<string, unknown>>): BridgeSchema2<O, S>;
56
+ /** Options for {@link QgisSdk.fromBridgeSchema}. */
57
+ interface QgisSdkOptions2 {
58
+ /** A transport to speak through; defaults to the page's QWebChannel. */
59
+ readonly transport?: WireTransport2;
60
+ /** A client the caller owns; `close()` leaves it open. Excludes `transport`. */
61
+ readonly client?: BridgeClient2;
62
+ /** Per-call timeout for an owned client. */
63
+ readonly timeoutMs?: number;
64
+ /** The channel object's name when the default transport is used. */
65
+ readonly channelObject?: string;
66
+ }
67
+ /** Handlers for a typed stream: events as declared, then exactly one end. */
68
+ interface StreamHandlers2<E> {
69
+ readonly onEvent?: (event: E) => void;
70
+ readonly onTerminal?: (terminal: BridgeStreamTerminal2) => void;
71
+ }
72
+ /** A live stream, as the caller holds it. */
73
+ type StreamHandle2 = BridgeSubscription2;
74
+ /** The method one declared action becomes; an empty request may be omitted. */
75
+ type OperationMethod2<Op extends OperationShape2> = {} extends Op["request"] ? (request?: Op["request"], options?: InvokeOptions2) => Promise<Op["result"]> : (request: Op["request"], options?: InvokeOptions2) => Promise<Op["result"]>;
76
+ /** The method one declared stream becomes. */
77
+ type StreamMethod2<St extends StreamShape2> = (request: St["request"], handlers: StreamHandlers2<St["event"]>, options?: InvokeOptions2) => Promise<StreamHandle2>;
78
+ /**
79
+ * The running palette, when the handshake carried one (decision-16): the
80
+ * `QPalette` colour roles the host read, as CSS hex (`#rrggbb` or
81
+ * `#rrggbbaa`) by their camel-cased role name, and whether the window colour
82
+ * is dark. `qgis-sdk-ui` turns it into the `--qgis-sdk-*` custom properties;
83
+ * a page outside QGIS sees `null` and keeps the documented defaults.
84
+ */
85
+ interface QgisSdkHostTheme2 {
86
+ readonly palette: Readonly<Record<string, string>>;
87
+ readonly dark: boolean;
88
+ }
89
+ /** What the handshake told this page about the host (decision-27). */
90
+ interface QgisSdkHost2 extends HostOperations2 {
91
+ /**
92
+ * The host operation ids the handshake advertised for this view; empty
93
+ * until {@link QgisSdkCore.ready} has resolved.
94
+ */
95
+ readonly granted: readonly HostOperationId2[];
96
+ /**
97
+ * The host's palette, `null` until {@link QgisSdkCore.ready} has resolved
98
+ * and when the host sent none.
99
+ */
100
+ readonly theme: QgisSdkHostTheme2 | null;
101
+ }
102
+ /** The members every `QgisSdk` has, whatever its schema declares. */
103
+ interface QgisSdkCore2<
104
+ O = OperationMap2,
105
+ S = StreamMap2
106
+ > {
107
+ /** The schema this instance was built from. */
108
+ readonly schema: BridgeSchema2<O, S>;
109
+ /** The client under the methods, for what a method does not cover. */
110
+ readonly client: BridgeClient2;
111
+ /** The curated host surface, and what this view was granted of it. */
112
+ readonly host: QgisSdkHost2;
113
+ /** Resolves once the handshake answered; rejects when the host refused it. */
114
+ readonly ready: Promise<void>;
115
+ /** Close an owned client; a client the caller passed in is left alone. */
116
+ close(): void;
117
+ }
118
+ /** The first segment of a dotted id, or the whole id when it has none. */
119
+ type Head<K extends string> = K extends `${infer H}.${string}` ? H : K;
120
+ /** The members of `M` under one head, keyed by the rest of their ids. */
121
+ type Under<
122
+ M,
123
+ H extends string
124
+ > = { [K in keyof M & string as K extends `${H}.${infer Rest}` ? Rest : never] : M[K] };
125
+ /**
126
+ * The declared actions as a tree: a plain id is a method, a dotted id nests
127
+ * one object per segment. An id that is both a leaf and a prefix of another
128
+ * is refused at run time, so the type need not say what it would mean.
129
+ */
130
+ type OperationTree2<O> = { readonly [H in Head<keyof O & string>] : H extends keyof O ? O[H] extends OperationShape2 ? OperationMethod2<O[H]> : never : OperationTree2<Under<O, H>> };
131
+ /** The declared streams as the same tree, with a stream method at each leaf. */
132
+ type StreamTree2<S> = { readonly [H in Head<keyof S & string>] : H extends keyof S ? S[H] extends StreamShape2 ? StreamMethod2<S[H]> : never : StreamTree2<Under<S, H>> };
133
+ /**
134
+ * A page's handle on QGIS: the core, plus one method per declared operation
135
+ * nested under the segments of its id.
136
+ */
137
+ type QgisSdk2<
138
+ O = OperationMap2,
139
+ S = StreamMap2
140
+ > = QgisSdkCore2<O, S> & OperationTree2<O> & StreamTree2<S>;
141
+ /** Names {@link QgisSdkCore} keeps; a declared id may not start with one. */
142
+ declare const QGIS_SDK_MEMBERS2: readonly string[];
143
+ /**
144
+ * The entry point: `QgisSdk.fromBridgeSchema(schema)`.
145
+ *
146
+ * A namespace rather than a constant so the value and the instance type share
147
+ * one name through every declaration bundler.
148
+ */
149
+ declare namespace QgisSdk2 {
150
+ function fromBridgeSchema<
151
+ O extends Record<keyof O, OperationShape2>,
152
+ S extends Record<keyof S, StreamShape2>
153
+ >(schema: BridgeSchema2<O, S>, options?: QgisSdkOptions2): QgisSdk2<O, S>;
154
+ }
155
+ export { OperationShape2, StreamShape2, OperationMap2, StreamMap2, BridgeSchema2, OperationsOf2, StreamsOf2, defineBridgeSchema2, QgisSdkOptions2, StreamHandlers2, StreamHandle2, OperationMethod2, StreamMethod2, QgisSdkHostTheme2, QgisSdkHost2, QgisSdkCore2, OperationTree2, StreamTree2, QGIS_SDK_MEMBERS2, QgisSdk2 };