@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.
- package/README.md +35 -33
- package/dist/bridge.d.ts +2 -205
- package/dist/bridge.js +3 -4
- package/dist/host.d.ts +2 -157
- package/dist/host.js +72 -430
- package/dist/index.d.ts +62 -95
- package/dist/index.js +399 -12
- package/dist/react.d.ts +61 -161
- package/dist/react.js +70 -139
- package/dist/shared/chunk-2hwva3a3.js +14 -0
- package/dist/shared/chunk-3zscfm3y.d.ts +342 -0
- package/dist/shared/chunk-7tgzmz0m.d.ts +252 -0
- package/dist/shared/chunk-8gawbn19.js +433 -0
- package/dist/shared/chunk-a33y575v.d.ts +155 -0
- package/dist/shared/chunk-pdj2fxjb.d.ts +17 -0
- package/dist/shared/chunk-stre69mw.js +777 -0
- package/dist/shared/chunk-t1vpt5yq.js +895 -0
- package/dist/shared/chunk-wtv4vt4q.d.ts +280 -0
- package/dist/svelte.d.ts +75 -0
- package/dist/svelte.js +70 -0
- package/dist/testing.d.ts +58 -30
- package/dist/testing.js +51 -5
- package/dist/vue.d.ts +106 -0
- package/dist/vue.js +91 -0
- package/package.json +21 -3
- package/dist/shared/chunk-0fknax6w.js +0 -207
- package/dist/shared/chunk-a7bjgeve.js +0 -422
|
@@ -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 };
|