@archont561/qgis-sdk 0.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@archont561/qgis-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "TypeScript bridge contracts and error primitives for QGIS SDK WebEngine plugin interfaces.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,6 +27,16 @@
27
27
  "import": "./dist/react.js",
28
28
  "default": "./dist/react.js"
29
29
  },
30
+ "./vue": {
31
+ "types": "./dist/vue.d.ts",
32
+ "import": "./dist/vue.js",
33
+ "default": "./dist/vue.js"
34
+ },
35
+ "./svelte": {
36
+ "types": "./dist/svelte.d.ts",
37
+ "import": "./dist/svelte.js",
38
+ "default": "./dist/svelte.js"
39
+ },
30
40
  "./testing": {
31
41
  "types": "./dist/testing.d.ts",
32
42
  "import": "./dist/testing.js",
@@ -47,18 +57,26 @@
47
57
  "access": "public"
48
58
  },
49
59
  "scripts": {
50
- "build": "bunup && tsc -p tsconfig.dist.json",
60
+ "build": "bunup && bun tests/consumer/isolation.ts && tsc -p tsconfig.dist.json",
51
61
  "test": "bun test",
52
62
  "coverage": "bun --cwd=../.. --config=bunfig.toml test --coverage packages/qgis-sdk-typescript/tests",
53
63
  "typecheck": "tsc --noEmit",
54
64
  "generate:contract-types": "json2ts -i 'tests/contracts/generated/schemas/*.json' -o tests/contracts/generated/types/ && json2ts -i 'tests/contracts/pydantic/generated/schemas/*.json' -o tests/contracts/pydantic/generated/types/"
55
65
  },
56
66
  "peerDependencies": {
57
- "react": ">=18"
67
+ "react": ">=18",
68
+ "svelte": ">=5",
69
+ "vue": ">=3.4"
58
70
  },
59
71
  "peerDependenciesMeta": {
60
72
  "react": {
61
73
  "optional": true
74
+ },
75
+ "svelte": {
76
+ "optional": true
77
+ },
78
+ "vue": {
79
+ "optional": true
62
80
  }
63
81
  }
64
82
  }
@@ -1,55 +0,0 @@
1
- import { PluginDescription2 } from "./chunk-wtv4vt4q.js";
2
- /** What one declared action promises: an object in, a value out. */
3
- interface OperationShape2 {
4
- readonly request: object;
5
- readonly result: unknown;
6
- }
7
- /** What one declared stream promises: an object in, discriminated events out. */
8
- interface StreamShape2 {
9
- readonly request: object;
10
- readonly event: {
11
- readonly kind: string;
12
- readonly payload: unknown;
13
- };
14
- }
15
- /** The default, untyped map: any id, any shape. */
16
- type OperationMap2 = {
17
- readonly [id: string]: OperationShape2;
18
- };
19
- /** The default, untyped map: any id, any shape. */
20
- type StreamMap2 = {
21
- readonly [id: string]: StreamShape2;
22
- };
23
- /**
24
- * A parsed plugin description carrying its `Operations` and `Streams` types.
25
- *
26
- * The `"~types"` member is compile-time only: it is never set, and a schema is
27
- * a frozen {@link PluginDescription} and nothing more at run time. It is a
28
- * string key, not a unique symbol, so the type stays structurally the same
29
- * across the package's entry points.
30
- */
31
- interface BridgeSchema2<
32
- O = OperationMap2,
33
- S = StreamMap2
34
- > extends PluginDescription2 {
35
- readonly "~types"?: {
36
- readonly operations: O;
37
- readonly streams: S;
38
- };
39
- }
40
- /** The `Operations` map a schema carries. */
41
- type OperationsOf2<Schema> = Schema extends BridgeSchema2<infer O, unknown> ? O : never;
42
- /** The `Streams` map a schema carries. */
43
- type StreamsOf2<Schema> = Schema extends BridgeSchema2<unknown, infer S> ? S : never;
44
- /**
45
- * Parse a description and type it; the generated module is the only caller.
46
- *
47
- * The description is checked the way any description is (`schema_version`,
48
- * ids, handlers, declared streams), so a hand-edited or stale module fails
49
- * here, at import, rather than on the first call.
50
- */
51
- declare function defineBridgeSchema2<
52
- O extends Record<keyof O, OperationShape2>,
53
- S extends Record<keyof S, StreamShape2>
54
- >(input: string | Readonly<Record<string, unknown>>): BridgeSchema2<O, S>;
55
- export { OperationShape2, StreamShape2, OperationMap2, StreamMap2, BridgeSchema2, OperationsOf2, StreamsOf2, defineBridgeSchema2 };
@@ -1,414 +0,0 @@
1
- import {
2
- QgisSdkError2
3
- } from "./chunk-2hwva3a3.js";
4
-
5
- // src/generated/host.ts
6
- var HOST_ID2 = "qgis.host";
7
- var HOST_FINGERPRINT2 = "sha256:f96bdf1046434de3c5eae01efb34c8ad2bcd1cf241a3dc42f6c4b613dc7d7d6f";
8
- var HOST_SCHEMA_VERSION2 = 1;
9
- var HOST_OPERATIONS2 = [
10
- "files.export",
11
- "layers.get",
12
- "layers.list",
13
- "layers.open_vector",
14
- "network.fetch",
15
- "notifications.info",
16
- "project.layer_ids",
17
- "settings.get",
18
- "styles.apply"
19
- ];
20
-
21
- class QgisSdkHostContractError2 extends QgisSdkError2 {
22
- operation;
23
- constructor(operation, message) {
24
- super(`operation "${operation}": ${message}`, "contract_validation_failed");
25
- this.operation = operation;
26
- }
27
- }
28
- function isRecord(value) {
29
- return typeof value === "object" && value !== null && !Array.isArray(value);
30
- }
31
- function hasOnly(value, keys) {
32
- return Object.keys(value).every((key) => keys.includes(key));
33
- }
34
- function isSafeInteger(value) {
35
- return typeof value === "number" && Number.isSafeInteger(value);
36
- }
37
- function ExportRequest2(value, strict = false) {
38
- if (!isRecord(value))
39
- return false;
40
- if (!("file" in value))
41
- return false;
42
- if (!("content" in value))
43
- return false;
44
- if (value["content"] !== undefined && !(typeof value["content"] === "string")) {
45
- return false;
46
- }
47
- if (value["file"] !== undefined && !FileRef2(value["file"], strict)) {
48
- return false;
49
- }
50
- if (strict && !hasOnly(value, ["content", "file"]))
51
- return false;
52
- return true;
53
- }
54
- function ExportResult2(value, strict = false) {
55
- if (!isRecord(value))
56
- return false;
57
- if (!("bytes_written" in value))
58
- return false;
59
- if (!("name" in value))
60
- return false;
61
- if (value["bytes_written"] !== undefined && !isSafeInteger(value["bytes_written"])) {
62
- return false;
63
- }
64
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
65
- return false;
66
- }
67
- if (strict && !hasOnly(value, ["bytes_written", "name"]))
68
- return false;
69
- return true;
70
- }
71
- function FetchRequest2(value, strict = false) {
72
- if (!isRecord(value))
73
- return false;
74
- if (!("url" in value))
75
- return false;
76
- if (value["auth_config"] !== undefined && !(typeof value["auth_config"] === "string")) {
77
- return false;
78
- }
79
- if (value["body"] !== undefined && !(typeof value["body"] === "string")) {
80
- return false;
81
- }
82
- if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader2(item, strict)))) {
83
- return false;
84
- }
85
- if (value["method"] !== undefined && !(value["method"] === "GET" || value["method"] === "HEAD" || value["method"] === "POST" || value["method"] === "PUT" || value["method"] === "PATCH" || value["method"] === "DELETE" || value["method"] === "OPTIONS")) {
86
- return false;
87
- }
88
- if (value["timeout_seconds"] !== undefined && !(typeof value["timeout_seconds"] === "number" && Number.isFinite(value["timeout_seconds"]) && value["timeout_seconds"] >= 0.1 && value["timeout_seconds"] <= 300)) {
89
- return false;
90
- }
91
- if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
92
- return false;
93
- }
94
- if (strict && !hasOnly(value, ["auth_config", "body", "headers", "method", "timeout_seconds", "url"]))
95
- return false;
96
- return true;
97
- }
98
- function FileRef2(value, strict = false) {
99
- if (!isRecord(value))
100
- return false;
101
- if (!("kind" in value))
102
- return false;
103
- if (!("id" in value))
104
- return false;
105
- if (value["id"] !== undefined && !(typeof value["id"] === "string" && new RegExp("^(?:[a-f0-9]{16,64})$").test(value["id"]))) {
106
- return false;
107
- }
108
- if (value["kind"] !== undefined && !(value["kind"] === "file")) {
109
- return false;
110
- }
111
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
112
- return false;
113
- }
114
- if (value["operations"] !== undefined && !(Array.isArray(value["operations"]) && value["operations"].every((item) => item === "read" || item === "write"))) {
115
- return false;
116
- }
117
- if (strict && !hasOnly(value, ["id", "kind", "name", "operations"]))
118
- return false;
119
- return true;
120
- }
121
- function HttpHeader2(value, strict = false) {
122
- if (!isRecord(value))
123
- return false;
124
- if (!("name" in value))
125
- return false;
126
- if (!("value" in value))
127
- return false;
128
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
129
- return false;
130
- }
131
- if (value["value"] !== undefined && !(typeof value["value"] === "string")) {
132
- return false;
133
- }
134
- if (strict && !hasOnly(value, ["name", "value"]))
135
- return false;
136
- return true;
137
- }
138
- function IdPage2(value, strict = false) {
139
- if (!isRecord(value))
140
- return false;
141
- if (!("items" in value))
142
- return false;
143
- if (!("truncated" in value))
144
- return false;
145
- if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => typeof item === "string"))) {
146
- return false;
147
- }
148
- if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
149
- return false;
150
- }
151
- if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
152
- return false;
153
- }
154
- if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
155
- return false;
156
- return true;
157
- }
158
- function LayerPage2(value, strict = false) {
159
- if (!isRecord(value))
160
- return false;
161
- if (!("items" in value))
162
- return false;
163
- if (!("truncated" in value))
164
- return false;
165
- if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => VectorLayerInfo2(item, strict)))) {
166
- return false;
167
- }
168
- if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
169
- return false;
170
- }
171
- if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
172
- return false;
173
- }
174
- if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
175
- return false;
176
- return true;
177
- }
178
- function LayerRequest2(value, strict = false) {
179
- if (!isRecord(value))
180
- return false;
181
- if (!("layer_id" in value))
182
- return false;
183
- if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
184
- return false;
185
- }
186
- if (strict && !hasOnly(value, ["layer_id"]))
187
- return false;
188
- return true;
189
- }
190
- function NetworkFetchData2(value, strict = false) {
191
- if (!isRecord(value))
192
- return false;
193
- if (!("url" in value))
194
- return false;
195
- if (!("status_code" in value))
196
- return false;
197
- if (!("reason" in value))
198
- return false;
199
- if (!("headers" in value))
200
- return false;
201
- if (!("text" in value))
202
- return false;
203
- if (!("base64" in value))
204
- return false;
205
- if (value["base64"] !== undefined && !(typeof value["base64"] === "string" || value["base64"] === null)) {
206
- return false;
207
- }
208
- if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader2(item, strict)))) {
209
- return false;
210
- }
211
- if (value["reason"] !== undefined && !(typeof value["reason"] === "string")) {
212
- return false;
213
- }
214
- if (value["status_code"] !== undefined && !isSafeInteger(value["status_code"])) {
215
- return false;
216
- }
217
- if (value["text"] !== undefined && !(typeof value["text"] === "string" || value["text"] === null)) {
218
- return false;
219
- }
220
- if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
221
- return false;
222
- }
223
- if (strict && !hasOnly(value, ["base64", "headers", "reason", "status_code", "text", "url"]))
224
- return false;
225
- return true;
226
- }
227
- function NotificationsInfoRequest2(value, strict = false) {
228
- if (!isRecord(value))
229
- return false;
230
- if (!("message" in value))
231
- return false;
232
- if (value["message"] !== undefined && !(typeof value["message"] === "string")) {
233
- return false;
234
- }
235
- if (strict && !hasOnly(value, ["message"]))
236
- return false;
237
- return true;
238
- }
239
- function OpenVectorRequest2(value, strict = false) {
240
- if (!isRecord(value))
241
- return false;
242
- if (!("file" in value))
243
- return false;
244
- if (value["file"] !== undefined && !FileRef2(value["file"], strict)) {
245
- return false;
246
- }
247
- if (strict && !hasOnly(value, ["file"]))
248
- return false;
249
- return true;
250
- }
251
- function PageRequest2(value, strict = false) {
252
- if (!isRecord(value))
253
- return false;
254
- if (value["cursor"] !== undefined && !(typeof value["cursor"] === "string" && new RegExp("^(?:[0-9]+)$").test(value["cursor"]))) {
255
- return false;
256
- }
257
- if (value["limit"] !== undefined && !(isSafeInteger(value["limit"]) && value["limit"] >= 1 && value["limit"] <= 200)) {
258
- return false;
259
- }
260
- if (strict && !hasOnly(value, ["cursor", "limit"]))
261
- return false;
262
- return true;
263
- }
264
- function SettingsGetRequest2(value, strict = false) {
265
- if (!isRecord(value))
266
- return false;
267
- if (!("key" in value))
268
- return false;
269
- if (value["default"] !== undefined && !(typeof value["default"] === "string" || value["default"] === null)) {
270
- return false;
271
- }
272
- if (value["key"] !== undefined && !(typeof value["key"] === "string")) {
273
- return false;
274
- }
275
- if (strict && !hasOnly(value, ["default", "key"]))
276
- return false;
277
- return true;
278
- }
279
- function StylesApplyRequest2(value, strict = false) {
280
- if (!isRecord(value))
281
- return false;
282
- if (!("layer_id" in value))
283
- return false;
284
- if (!("style" in value))
285
- return false;
286
- if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
287
- return false;
288
- }
289
- if (value["style"] !== undefined && !(typeof value["style"] === "string")) {
290
- return false;
291
- }
292
- if (strict && !hasOnly(value, ["layer_id", "style"]))
293
- return false;
294
- return true;
295
- }
296
- function VectorLayerInfo2(value, strict = false) {
297
- if (!isRecord(value))
298
- return false;
299
- if (!("id" in value))
300
- return false;
301
- if (!("name" in value))
302
- return false;
303
- if (!("geometry_type" in value))
304
- return false;
305
- if (!("field_names" in value))
306
- return false;
307
- if (!("crs" in value))
308
- return false;
309
- if (value["crs"] !== undefined && !(typeof value["crs"] === "string" || value["crs"] === null)) {
310
- return false;
311
- }
312
- if (value["field_names"] !== undefined && !(Array.isArray(value["field_names"]) && value["field_names"].every((item) => typeof item === "string"))) {
313
- return false;
314
- }
315
- if (value["geometry_type"] !== undefined && !(value["geometry_type"] === "point" || value["geometry_type"] === "line" || value["geometry_type"] === "polygon" || value["geometry_type"] === "none")) {
316
- return false;
317
- }
318
- if (value["id"] !== undefined && !(typeof value["id"] === "string")) {
319
- return false;
320
- }
321
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
322
- return false;
323
- }
324
- if (strict && !hasOnly(value, ["crs", "field_names", "geometry_type", "id", "name"]))
325
- return false;
326
- return true;
327
- }
328
- function NetworkFetchEvent2(value, strict = false) {
329
- if (!isRecord(value))
330
- return false;
331
- if (value.kind === "data")
332
- return NetworkFetchData2(value.payload, strict);
333
- return false;
334
- }
335
- function createHost2(client) {
336
- return {
337
- files: {
338
- export: (input, options) => call(client, "files.export", input, options, ExportRequest2, ExportResult2)
339
- },
340
- layers: {
341
- get: (input, options) => call(client, "layers.get", input, options, LayerRequest2, VectorLayerInfo2),
342
- list: (input, options) => call(client, "layers.list", input, options, PageRequest2, LayerPage2),
343
- open_vector: (input, options) => call(client, "layers.open_vector", input, options, OpenVectorRequest2, VectorLayerInfo2)
344
- },
345
- network: {
346
- fetch: (input, handlers, options) => open(client, "network.fetch", input, handlers, options, FetchRequest2, NetworkFetchEvent2)
347
- },
348
- notifications: {
349
- info: (input, options) => call(client, "notifications.info", input, options, NotificationsInfoRequest2, (candidate) => candidate === null)
350
- },
351
- project: {
352
- layer_ids: (input, options) => call(client, "project.layer_ids", input, options, PageRequest2, IdPage2)
353
- },
354
- settings: {
355
- get: (input, options) => call(client, "settings.get", input, options, SettingsGetRequest2, (candidate) => typeof candidate === "string" || candidate === null)
356
- },
357
- styles: {
358
- apply: (input, options) => call(client, "styles.apply", input, options, StylesApplyRequest2, (candidate) => candidate === null)
359
- }
360
- };
361
- }
362
- async function call(client, operation, input, options, acceptInput, acceptOutput) {
363
- if (input !== undefined && !acceptInput(input, true)) {
364
- throw new QgisSdkHostContractError2(operation, "the arguments do not match the declared request");
365
- }
366
- const value = await client.invoke(operation, input ?? {}, options);
367
- if (!acceptOutput(value)) {
368
- throw new QgisSdkHostContractError2(operation, "the response does not match the declared result");
369
- }
370
- return value;
371
- }
372
- async function open(client, operation, input, handlers, options, acceptInput, acceptEvent) {
373
- if (!acceptInput(input, true)) {
374
- throw new QgisSdkHostContractError2(operation, "the arguments do not match the declared request");
375
- }
376
- let ended = false;
377
- let violated = false;
378
- let handle = null;
379
- const end = (terminal) => {
380
- if (ended)
381
- return;
382
- ended = true;
383
- handlers.onTerminal?.(terminal);
384
- };
385
- handle = await client.subscribe(operation, input, {
386
- onEvent: (event) => {
387
- if (ended)
388
- return;
389
- if (acceptEvent(event)) {
390
- handlers.onEvent?.(event);
391
- return;
392
- }
393
- end({
394
- kind: "error",
395
- message: new QgisSdkHostContractError2(operation, "an event does not match the declared events").message
396
- });
397
- if (handle === null) {
398
- violated = true;
399
- } else {
400
- handle.close();
401
- }
402
- },
403
- onTerminal: end
404
- }, options);
405
- if (violated) {
406
- handle.close();
407
- }
408
- return handle;
409
- }
410
-
411
- export { HOST_ID2, HOST_FINGERPRINT2, HOST_SCHEMA_VERSION2, HOST_OPERATIONS2, QgisSdkHostContractError2, ExportRequest2, ExportResult2, FetchRequest2, FileRef2, HttpHeader2, IdPage2, LayerPage2, LayerRequest2, NetworkFetchData2, NotificationsInfoRequest2, OpenVectorRequest2, PageRequest2, SettingsGetRequest2, StylesApplyRequest2, VectorLayerInfo2, NetworkFetchEvent2, createHost2 };
412
-
413
- //# debugId=14FA6E1BACC48E4964756E2164756E21
414
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2dlbmVyYXRlZC9ob3N0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEdlbmVyYXRlZCBieSBxZ2lzLXNkay4gRG8gbm90IGVkaXQuXG4vLyBTb3VyY2U6IHRoZSBjdXJhdGVkIGhvc3QgbWFuaWZlc3QgaW4gcWdpc19zZGsuYnJpZGdlLmhvc3QuXG4vLyBSZWdlbmVyYXRlIHdpdGggYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZSAtLWhvc3RgOyBDSSBmYWlscyBvbiBkcmlmdC5cblxuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuXG5leHBvcnQgY29uc3QgSE9TVF9JRCA9IFwicWdpcy5ob3N0XCI7XG5leHBvcnQgY29uc3QgSE9TVF9GSU5HRVJQUklOVCA9IFwic2hhMjU2OmY5NmJkZjEwNDY0MzRkZTNjNWVhZTAxZWZiMzRjOGFkMmJjZDFjZjI0MWEzZGM0MmY2YzRiNjEzZGM3ZDdkNmZcIjtcbmV4cG9ydCBjb25zdCBIT1NUX1NDSEVNQV9WRVJTSU9OID0gMTtcblxuLyoqIEV2ZXJ5IGRlY2xhcmVkIG9wZXJhdGlvbiBpZCwgc28gYSBuYW1lIGNhbiBiZSBjaGVja2VkLCBub3QgZ3Vlc3NlZC4gKi9cbmV4cG9ydCBjb25zdCBIT1NUX09QRVJBVElPTlMgPSBbXG5cdFwiZmlsZXMuZXhwb3J0XCIsXG5cdFwibGF5ZXJzLmdldFwiLFxuXHRcImxheWVycy5saXN0XCIsXG5cdFwibGF5ZXJzLm9wZW5fdmVjdG9yXCIsXG5cdFwibmV0d29yay5mZXRjaFwiLFxuXHRcIm5vdGlmaWNhdGlvbnMuaW5mb1wiLFxuXHRcInByb2plY3QubGF5ZXJfaWRzXCIsXG5cdFwic2V0dGluZ3MuZ2V0XCIsXG5cdFwic3R5bGVzLmFwcGx5XCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBIb3N0T3BlcmF0aW9uSWQgPSAodHlwZW9mIEhPU1RfT1BFUkFUSU9OUylbbnVtYmVyXTtcblxuZXhwb3J0IGludGVyZmFjZSBIb3N0SW52b2tlT3B0aW9ucyB7XG5cdHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogVGhlIGNsaWVudCB0aGlzIG1vZHVsZSB3cmFwczogYW55dGhpbmcgd2l0aCBhIGNvcnJlbGF0ZWQgaW52b2tlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Q2xpZW50TGlrZSB7XG5cdGludm9rZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucyxcblx0KTogUHJvbWlzZTx1bmtub3duPjtcblx0c3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbjogc3RyaW5nLFxuXHRcdHBheWxvYWQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0aGFuZGxlcnM/OiBIb3N0U3RyZWFtSGFuZGxlcnM8e1xuXHRcdFx0cmVhZG9ubHkga2luZDogXCJkYXRhXCIgfCBcInByb2dyZXNzXCIgfCBcInN0YXRlXCI7XG5cdFx0XHRyZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xuXHRcdH0+LFxuXHRcdG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucyxcblx0KTogUHJvbWlzZTxIb3N0U3RyZWFtSGFuZGxlPjtcbn1cblxuLyoqIEhvdyBhIHN0cmVhbSBlbmRlZDsgYGRyb3BwZWRgIGlzIG9ubHkgcHJlc2VudCBmb3IgYSBnYXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RTdHJlYW1UZXJtaW5hbCB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiY29tcGxldGVcIiB8IFwiZXJyb3JcIiB8IFwiY2FuY2VsbGVkXCIgfCBcImdhcFwiIHwgXCJkaXNwb3NlZFwiO1xuXHRyZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXHRyZWFkb25seSBkcm9wcGVkPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBhIHN0cmVhbSByZXBvcnRzOiB0eXBlZCBldmVudHMsIHRoZW4gZXhhY3RseSBvbmUgZW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtSGFuZGxlcnM8RT4ge1xuXHRyZWFkb25seSBvbkV2ZW50PzogKGV2ZW50OiBFKSA9PiB2b2lkO1xuXHRyZWFkb25seSBvblRlcm1pbmFsPzogKHRlcm1pbmFsOiBIb3N0U3RyZWFtVGVybWluYWwpID0+IHZvaWQ7XG59XG5cbi8qKiBBIGxpdmUgc3RyZWFtLCBhcyB0aGUgY2FsbGVyIGhvbGRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtSGFuZGxlIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogQW4gYXJndW1lbnQgb3IgYSByZXNwb25zZSB0aGF0IGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJlZCBzY2hlbWEuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRwdWJsaWMgY29uc3RydWN0b3Iob3BlcmF0aW9uOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKGBvcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIjogJHttZXNzYWdlfWAsIFwiY29udHJhY3RfdmFsaWRhdGlvbl9mYWlsZWRcIik7XG5cdFx0dGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBoYXNPbmx5KFxuXHR2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkuZXZlcnkoKGtleSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbn1cblxuZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFJlcXVlc3Qge1xuXHRyZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGZpbGU6IEZpbGVSZWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0UmVzdWx0IHtcblx0cmVhZG9ubHkgYnl0ZXNfd3JpdHRlbjogbnVtYmVyO1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hSZXF1ZXN0IHtcblx0cmVhZG9ubHkgYXV0aF9jb25maWc/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGJvZHk/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhlYWRlcnM/OiByZWFkb25seSBIdHRwSGVhZGVyW107XG5cdHJlYWRvbmx5IG1ldGhvZD86IFwiR0VUXCIgfCBcIkhFQURcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCIgfCBcIk9QVElPTlNcIjtcblx0cmVhZG9ubHkgdGltZW91dF9zZWNvbmRzPzogbnVtYmVyO1xuXHRyZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUmVmIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkga2luZDogXCJmaWxlXCI7XG5cdHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbnM/OiByZWFkb25seSAoXCJyZWFkXCIgfCBcIndyaXRlXCIpW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEhlYWRlciB7XG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0cmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZFBhZ2Uge1xuXHRyZWFkb25seSBpdGVtczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IG5leHRfY3Vyc29yPzogc3RyaW5nO1xuXHRyZWFkb25seSB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJQYWdlIHtcblx0cmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IFZlY3RvckxheWVySW5mb1tdO1xuXHRyZWFkb25seSBuZXh0X2N1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGxheWVyX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0ZldGNoRGF0YSB7XG5cdHJlYWRvbmx5IGJhc2U2NDogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgaGVhZGVyczogcmVhZG9ubHkgSHR0cEhlYWRlcltdO1xuXHRyZWFkb25seSByZWFzb246IHN0cmluZztcblx0cmVhZG9ubHkgc3RhdHVzX2NvZGU6IG51bWJlcjtcblx0cmVhZG9ubHkgdGV4dDogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0IHtcblx0cmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5WZWN0b3JSZXF1ZXN0IHtcblx0cmVhZG9ubHkgZmlsZTogRmlsZVJlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGN1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NHZXRSZXF1ZXN0IHtcblx0cmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlc0FwcGx5UmVxdWVzdCB7XG5cdHJlYWRvbmx5IGxheWVyX2lkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0eWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yTGF5ZXJJbmZvIHtcblx0cmVhZG9ubHkgY3JzOiBzdHJpbmcgfCBudWxsO1xuXHRyZWFkb25seSBmaWVsZF9uYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IGdlb21ldHJ5X3R5cGU6IFwicG9pbnRcIiB8IFwibGluZVwiIHwgXCJwb2x5Z29uXCIgfCBcIm5vbmVcIjtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0UmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBFeHBvcnRSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiY29udGVudFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJjb250ZW50XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJjb250ZW50XCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQgJiYgIShGaWxlUmVmKHZhbHVlW1wiZmlsZVwiXSwgc3RyaWN0KSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiY29udGVudFwiLCBcImZpbGVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0UmVzdWx0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIEV4cG9ydFJlc3VsdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiYnl0ZXNfd3JpdHRlblwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm5hbWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYnl0ZXNfd3JpdHRlblwiXSAhPT0gdW5kZWZpbmVkICYmICEoaXNTYWZlSW50ZWdlcih2YWx1ZVtcImJ5dGVzX3dyaXR0ZW5cIl0pKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJieXRlc193cml0dGVuXCIsIFwibmFtZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGZXRjaFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRmV0Y2hSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJ1cmxcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYXV0aF9jb25maWdcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImF1dGhfY29uZmlnXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJib2R5XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJib2R5XCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJoZWFkZXJzXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcImhlYWRlcnNcIl0pICYmIHZhbHVlW1wiaGVhZGVyc1wiXS5ldmVyeSgoaXRlbSkgPT4gSHR0cEhlYWRlcihpdGVtLCBzdHJpY3QpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcIm1ldGhvZFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wibWV0aG9kXCJdID09PSBcIkdFVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIkhFQURcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJQT1NUXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUFVUXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUEFUQ0hcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJERUxFVEVcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJPUFRJT05TXCIpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdKSAmJiB2YWx1ZVtcInRpbWVvdXRfc2Vjb25kc1wiXSA+PSAwLjEgJiYgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPD0gMzAwKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widXJsXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ1cmxcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImF1dGhfY29uZmlnXCIsIFwiYm9keVwiLCBcImhlYWRlcnNcIiwgXCJtZXRob2RcIiwgXCJ0aW1lb3V0X3NlY29uZHNcIiwgXCJ1cmxcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmlsZVJlZih2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBGaWxlUmVmIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJraW5kXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImlkXCJdID09PSBcInN0cmluZ1wiICYmIG5ldyBSZWdFeHAoXCJeKD86W2EtZjAtOV17MTYsNjR9KSRcIikudGVzdCh2YWx1ZVtcImlkXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wia2luZFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wia2luZFwiXSA9PT0gXCJmaWxlXCIpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJvcGVyYXRpb25zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIm9wZXJhdGlvbnNcIl0pICYmIHZhbHVlW1wib3BlcmF0aW9uc1wiXS5ldmVyeSgoaXRlbSkgPT4gKGl0ZW0gPT09IFwicmVhZFwiIHx8IGl0ZW0gPT09IFwid3JpdGVcIikpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaWRcIiwgXCJraW5kXCIsIFwibmFtZVwiLCBcIm9wZXJhdGlvbnNcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSHR0cEhlYWRlcih2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBIdHRwSGVhZGVyIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJuYW1lXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidmFsdWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widmFsdWVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInZhbHVlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJuYW1lXCIsIFwidmFsdWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSWRQYWdlKHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIElkUGFnZSB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaXRlbXNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJ0cnVuY2F0ZWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiaXRlbXNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChBcnJheS5pc0FycmF5KHZhbHVlW1wiaXRlbXNcIl0pICYmIHZhbHVlW1wiaXRlbXNcIl0uZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcIm5leHRfY3Vyc29yXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuZXh0X2N1cnNvclwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widHJ1bmNhdGVkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ0cnVuY2F0ZWRcIl0gPT09IFwiYm9vbGVhblwiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJpdGVtc1wiLCBcIm5leHRfY3Vyc29yXCIsIFwidHJ1bmNhdGVkXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExheWVyUGFnZSh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBMYXllclBhZ2Uge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIml0ZW1zXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidHJ1bmNhdGVkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIml0ZW1zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIml0ZW1zXCJdKSAmJiB2YWx1ZVtcIml0ZW1zXCJdLmV2ZXJ5KChpdGVtKSA9PiBWZWN0b3JMYXllckluZm8oaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuZXh0X2N1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRydW5jYXRlZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widHJ1bmNhdGVkXCJdID09PSBcImJvb2xlYW5cIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaXRlbXNcIiwgXCJuZXh0X2N1cnNvclwiLCBcInRydW5jYXRlZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXllclJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTGF5ZXJSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJsYXllcl9pZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJsYXllcl9pZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibGF5ZXJfaWRcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImxheWVyX2lkXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5ldHdvcmtGZXRjaERhdGEodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTmV0d29ya0ZldGNoRGF0YSB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidXJsXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwic3RhdHVzX2NvZGVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJyZWFzb25cIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJoZWFkZXJzXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidGV4dFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImJhc2U2NFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJiYXNlNjRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJiYXNlNjRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJiYXNlNjRcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJoZWFkZXJzXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcImhlYWRlcnNcIl0pICYmIHZhbHVlW1wiaGVhZGVyc1wiXS5ldmVyeSgoaXRlbSkgPT4gSHR0cEhlYWRlcihpdGVtLCBzdHJpY3QpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInJlYXNvblwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wicmVhc29uXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJzdGF0dXNfY29kZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoaXNTYWZlSW50ZWdlcih2YWx1ZVtcInN0YXR1c19jb2RlXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widGV4dFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHR5cGVvZiB2YWx1ZVtcInRleHRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJ0ZXh0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widXJsXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ1cmxcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImJhc2U2NFwiLCBcImhlYWRlcnNcIiwgXCJyZWFzb25cIiwgXCJzdGF0dXNfY29kZVwiLCBcInRleHRcIiwgXCJ1cmxcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibWVzc2FnZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJtZXNzYWdlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJtZXNzYWdlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJtZXNzYWdlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE9wZW5WZWN0b3JSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE9wZW5WZWN0b3JSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImZpbGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKEZpbGVSZWYodmFsdWVbXCJmaWxlXCJdLCBzdHJpY3QpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJmaWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBhZ2VSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIFBhZ2VSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY3Vyc29yXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJjdXJzb3JcIl0gPT09IFwic3RyaW5nXCIgJiYgbmV3IFJlZ0V4cChcIl4oPzpbMC05XSspJFwiKS50ZXN0KHZhbHVlW1wiY3Vyc29yXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibGltaXRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChpc1NhZmVJbnRlZ2VyKHZhbHVlW1wibGltaXRcIl0pICYmIHZhbHVlW1wibGltaXRcIl0gPj0gMSAmJiB2YWx1ZVtcImxpbWl0XCJdIDw9IDIwMCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImN1cnNvclwiLCBcImxpbWl0XCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNldHRpbmdzR2V0UmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBTZXR0aW5nc0dldFJlcXVlc3Qge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImtleVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJkZWZhdWx0XCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiZGVmYXVsdFwiXSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZVtcImRlZmF1bHRcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJrZXlcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImtleVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiZGVmYXVsdFwiLCBcImtleVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTdHlsZXNBcHBseVJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgU3R5bGVzQXBwbHlSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJsYXllcl9pZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInN0eWxlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImxheWVyX2lkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJsYXllcl9pZFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wic3R5bGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInN0eWxlXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJsYXllcl9pZFwiLCBcInN0eWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFZlY3RvckxheWVySW5mbyh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBWZWN0b3JMYXllckluZm8ge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImlkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibmFtZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImdlb21ldHJ5X3R5cGVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJmaWVsZF9uYW1lc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImNyc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJjcnNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJjcnNcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJjcnNcIl0gPT09IG51bGwpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJmaWVsZF9uYW1lc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJmaWVsZF9uYW1lc1wiXSkgJiYgdmFsdWVbXCJmaWVsZF9uYW1lc1wiXS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJwb2ludFwiIHx8IHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJsaW5lXCIgfHwgdmFsdWVbXCJnZW9tZXRyeV90eXBlXCJdID09PSBcInBvbHlnb25cIiB8fCB2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwibm9uZVwiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImlkXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJuYW1lXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJjcnNcIiwgXCJmaWVsZF9uYW1lc1wiLCBcImdlb21ldHJ5X3R5cGVcIiwgXCJpZFwiLCBcIm5hbWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG4vKiogT25lIGV2ZW50IG9mIGBuZXR3b3JrLmZldGNoYCwgbmFycm93ZWQgYnkgaXRzIGtpbmQuICovXG5leHBvcnQgdHlwZSBOZXR3b3JrRmV0Y2hFdmVudCA9XG5cdHwgeyByZWFkb25seSBraW5kOiBcImRhdGFcIjsgcmVhZG9ubHkgcGF5bG9hZDogTmV0d29ya0ZldGNoRGF0YSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gTmV0d29ya0ZldGNoRXZlbnQodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTmV0d29ya0ZldGNoRXZlbnQge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWUua2luZCA9PT0gXCJkYXRhXCIpIHJldHVybiBOZXR3b3JrRmV0Y2hEYXRhKHZhbHVlLnBheWxvYWQsIHN0cmljdCk7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqIEV2ZXJ5IG9wZXJhdGlvbiB0aGlzIHN1cmZhY2UgZGVjbGFyZXMsIGFzIGNhbGxhYmxlIG1ldGhvZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RPcGVyYXRpb25zIHtcblx0cmVhZG9ubHkgZmlsZXM6IHtcblx0XHRyZWFkb25seSBleHBvcnQ6IChpbnB1dDogRXhwb3J0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPEV4cG9ydFJlc3VsdD47XG5cdH07XG5cdHJlYWRvbmx5IGxheWVyczoge1xuXHRcdHJlYWRvbmx5IGdldDogKGlucHV0OiBMYXllclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxWZWN0b3JMYXllckluZm8+O1xuXHRcdHJlYWRvbmx5IGxpc3Q6IChpbnB1dD86IFBhZ2VSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8TGF5ZXJQYWdlPjtcblx0XHRyZWFkb25seSBvcGVuX3ZlY3RvcjogKGlucHV0OiBPcGVuVmVjdG9yUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPFZlY3RvckxheWVySW5mbz47XG5cdH07XG5cdHJlYWRvbmx5IG5ldHdvcms6IHtcblx0XHRyZWFkb25seSBmZXRjaDogKGlucHV0OiBGZXRjaFJlcXVlc3QsIGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8TmV0d29ya0ZldGNoRXZlbnQ+LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT47XG5cdH07XG5cdHJlYWRvbmx5IG5vdGlmaWNhdGlvbnM6IHtcblx0XHRyZWFkb25seSBpbmZvOiAoaW5wdXQ6IE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPG51bGw+O1xuXHR9O1xuXHRyZWFkb25seSBwcm9qZWN0OiB7XG5cdFx0cmVhZG9ubHkgbGF5ZXJfaWRzOiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPElkUGFnZT47XG5cdH07XG5cdHJlYWRvbmx5IHNldHRpbmdzOiB7XG5cdFx0cmVhZG9ubHkgZ2V0OiAoaW5wdXQ6IFNldHRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuXHR9O1xuXHRyZWFkb25seSBzdHlsZXM6IHtcblx0XHRyZWFkb25seSBhcHBseTogKGlucHV0OiBTdHlsZXNBcHBseVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxudWxsPjtcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvc3QoY2xpZW50OiBIb3N0Q2xpZW50TGlrZSk6IEhvc3RPcGVyYXRpb25zIHtcblx0cmV0dXJuIHtcblx0XHRmaWxlczoge1xuXHRcdFx0ZXhwb3J0OiAoaW5wdXQ6IEV4cG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxFeHBvcnRSZXN1bHQ+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJmaWxlcy5leHBvcnRcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0RXhwb3J0UmVxdWVzdCxcblx0XHRcdFx0XHRFeHBvcnRSZXN1bHQsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRsYXllcnM6IHtcblx0XHRcdGdldDogKGlucHV0OiBMYXllclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxWZWN0b3JMYXllckluZm8+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJsYXllcnMuZ2V0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdExheWVyUmVxdWVzdCxcblx0XHRcdFx0XHRWZWN0b3JMYXllckluZm8sXG5cdFx0XHRcdCksXG5cdFx0XHRsaXN0OiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPExheWVyUGFnZT4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcImxheWVycy5saXN0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdFBhZ2VSZXF1ZXN0LFxuXHRcdFx0XHRcdExheWVyUGFnZSxcblx0XHRcdFx0KSxcblx0XHRcdG9wZW5fdmVjdG9yOiAoaW5wdXQ6IE9wZW5WZWN0b3JSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8VmVjdG9yTGF5ZXJJbmZvPihcblx0XHRcdFx0XHRjbGllbnQsIFwibGF5ZXJzLm9wZW5fdmVjdG9yXCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdE9wZW5WZWN0b3JSZXF1ZXN0LFxuXHRcdFx0XHRcdFZlY3RvckxheWVySW5mbyxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdG5ldHdvcms6IHtcblx0XHRcdGZldGNoOiAoaW5wdXQ6IEZldGNoUmVxdWVzdCwgaGFuZGxlcnM6IEhvc3RTdHJlYW1IYW5kbGVyczxOZXR3b3JrRmV0Y2hFdmVudD4sIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0b3BlbjxOZXR3b3JrRmV0Y2hFdmVudD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcIm5ldHdvcmsuZmV0Y2hcIiwgaW5wdXQsIGhhbmRsZXJzLCBvcHRpb25zLFxuXHRcdFx0XHRcdEZldGNoUmVxdWVzdCxcblx0XHRcdFx0XHROZXR3b3JrRmV0Y2hFdmVudCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdG5vdGlmaWNhdGlvbnM6IHtcblx0XHRcdGluZm86IChpbnB1dDogTm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8bnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcIm5vdGlmaWNhdGlvbnMuaW5mb1wiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHROb3RpZmljYXRpb25zSW5mb1JlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gY2FuZGlkYXRlID09PSBudWxsLFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdFx0cHJvamVjdDoge1xuXHRcdFx0bGF5ZXJfaWRzOiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPElkUGFnZT4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInByb2plY3QubGF5ZXJfaWRzXCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdFBhZ2VSZXF1ZXN0LFxuXHRcdFx0XHRcdElkUGFnZSxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHNldHRpbmdzOiB7XG5cdFx0XHRnZXQ6IChpbnB1dDogU2V0dGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8c3RyaW5nIHwgbnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInNldHRpbmdzLmdldFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRTZXR0aW5nc0dldFJlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gKHR5cGVvZiBjYW5kaWRhdGUgPT09IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlID09PSBudWxsKSxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHN0eWxlczoge1xuXHRcdFx0YXBwbHk6IChpbnB1dDogU3R5bGVzQXBwbHlSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8bnVsbD4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcInN0eWxlcy5hcHBseVwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRTdHlsZXNBcHBseVJlcXVlc3QsXG5cdFx0XHRcdFx0KGNhbmRpZGF0ZTogdW5rbm93bikgPT4gY2FuZGlkYXRlID09PSBudWxsLFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGw8VD4oXG5cdGNsaWVudDogSG9zdENsaWVudExpa2UsXG5cdG9wZXJhdGlvbjogc3RyaW5nLFxuXHRpbnB1dDogdW5rbm93bixcblx0b3B0aW9uczogSG9zdEludm9rZU9wdGlvbnMgfCB1bmRlZmluZWQsXG5cdGFjY2VwdElucHV0OiAodmFsdWU6IHVua25vd24sIHN0cmljdD86IGJvb2xlYW4pID0+IGJvb2xlYW4sXG5cdGFjY2VwdE91dHB1dDogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuLFxuKTogUHJvbWlzZTxUPiB7XG5cdGlmIChpbnB1dCAhPT0gdW5kZWZpbmVkICYmICFhY2NlcHRJbnB1dChpbnB1dCwgdHJ1ZSkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdChpbnB1dCA/PyB7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICghYWNjZXB0T3V0cHV0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrSG9zdENvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInRoZSByZXNwb25zZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVzdWx0XCIpO1xuXHR9XG5cdHJldHVybiB2YWx1ZSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuPEUgZXh0ZW5kcyB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZyB9Pihcblx0Y2xpZW50OiBIb3N0Q2xpZW50TGlrZSxcblx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdGlucHV0OiB1bmtub3duLFxuXHRoYW5kbGVyczogSG9zdFN0cmVhbUhhbmRsZXJzPEU+LFxuXHRvcHRpb25zOiBIb3N0SW52b2tlT3B0aW9ucyB8IHVuZGVmaW5lZCxcblx0YWNjZXB0SW5wdXQ6ICh2YWx1ZTogdW5rbm93biwgc3RyaWN0PzogYm9vbGVhbikgPT4gYm9vbGVhbixcblx0YWNjZXB0RXZlbnQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgRSxcbik6IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT4ge1xuXHRpZiAoIWFjY2VwdElucHV0KGlucHV0LCB0cnVlKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrSG9zdENvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInRoZSBhcmd1bWVudHMgZG8gbm90IG1hdGNoIHRoZSBkZWNsYXJlZCByZXF1ZXN0XCIpO1xuXHR9XG5cdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHQvLyBjb250cmFjdCB2aW9sYXRpb24gZW5kcyBpdCBoZXJlLCBjbG9zZXMgdGhlIHN1YnNjcmlwdGlvbiwgYW5kIHRoZVxuXHQvLyBgZGlzcG9zZWRgIHRoZSBjbGllbnQgdGhlbiByZXBvcnRzIGlzIG5vdCBkZWxpdmVyZWQgYSBzZWNvbmQgdGltZS5cblx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuXHRsZXQgaGFuZGxlOiBIb3N0U3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdGNvbnN0IGVuZCA9ICh0ZXJtaW5hbDogSG9zdFN0cmVhbVRlcm1pbmFsKTogdm9pZCA9PiB7XG5cdFx0aWYgKGVuZGVkKSByZXR1cm47XG5cdFx0ZW5kZWQgPSB0cnVlO1xuXHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdH07XG5cdGhhbmRsZSA9IGF3YWl0IGNsaWVudC5zdWJzY3JpYmUoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdGlucHV0IGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHR7XG5cdFx0XHRvbkV2ZW50OiAoZXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGVuZGVkKSByZXR1cm47XG5cdFx0XHRcdGlmIChhY2NlcHRFdmVudChldmVudCkpIHtcblx0XHRcdFx0XHRoYW5kbGVycy5vbkV2ZW50Py4oZXZlbnQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbmQoe1xuXHRcdFx0XHRcdGtpbmQ6IFwiZXJyb3JcIixcblx0XHRcdFx0XHRtZXNzYWdlOiBuZXcgUWdpc1Nka0hvc3RDb250cmFjdEVycm9yKFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0XHRcdFx0XCJhbiBldmVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgZXZlbnRzXCIsXG5cdFx0XHRcdFx0KS5tZXNzYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZpb2xhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICh2aW9sYXRlZCkge1xuXHRcdGhhbmRsZS5jbG9zZSgpO1xuXHR9XG5cdHJldHVybiBoYW5kbGU7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQU1PLElBQU0sV0FBVTtBQUNoQixJQUFNLG9CQUFtQjtBQUN6QixJQUFNLHVCQUFzQjtBQUc1QixJQUFNLG1CQUFrQjtBQUFBLEVBQzlCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUFBO0FBK0NPLE1BQU0sa0NBQWlDLGNBQWE7QUFBQSxFQUMxQztBQUFBLEVBQ1QsV0FBVyxDQUFDLFdBQW1CLFNB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VUFDQSxTQUNBLGFBQ0EsYUFDNEI7QUFBQSxFQUM1QixJQUFJLENBQUMsWUFBWSxPQUFPLElBQUksR0FBRztBQUFBLElBQzlCLE1BQU0sSUFBSSwwQkFBeUIsV0FBVyxpREFBaUQ7QUFBQSxFQUNoRztBQUFBLEVBSUEsSUFBSSxRQUFRO0FBQUEsRUFDWixJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksU0FBa0M7QUFBQSxFQUN0QyxNQUFNLE1BQU0sQ0FBQyxhQUF1QztBQUFBLElBQ25ELElBQUk7QUFBQSxNQUFPO0FBQUEsSUFDWCxRQUFRO0FBQUEsSUFDUixTQUFTLGFBQWEsUUFBUTtBQUFBO0FBQUEsRUFFL0IsU0FBUyxNQUFNLE9BQU8sVUFDckIsV0FDQSxPQUNBO0FBQUEsSUFDQyxTQUFTLENBQUMsVUFBVTtBQUFBLE1BQ25CLElBQUk7QUFBQSxRQUFPO0FBQUEsTUFDWCxJQUFJLFlBQVksS0FBSyxHQUFHO0FBQUEsUUFDdkIsU0FBUyxVQUFVLEtBQUs7QUFBQSxRQUN4QjtBQUFBLE1BQ0Q7QUFBQSxNQUNBLElBQUk7QUFBQSxRQUNILE1BQU07QUFBQSxRQUNOLFNBQVMsSUFBSSwwQkFDWixXQUNBLDZDQUNELEVBQUU7QUFBQSxNQUNILENBQUM7QUFBQSxNQUNELElBQUksV0FBVyxNQUFNO0FBQUEsUUFDcEIsV0FBVztBQUFBLE1BQ1osRUFBTztBQUFBLFFBQ04sT0FBTyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBR2YsWUFBWTtBQUFBLEVBQ2IsR0FDQSxPQUNEO0FBQUEsRUFDQSxJQUFJLFVBQVU7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLEVBQ2Q7QUFBQSxFQUNBLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjE0RkE2RTFCQUNDNDhFNDk2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9