scoundrel-remote-eval 1.0.19 → 1.0.20

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 CHANGED
@@ -25,7 +25,7 @@ const client = new Client(clientWebSocket)
25
25
 
26
26
  const math = await client.import("math")
27
27
  const pi = await math.readAttributeWithReference("pi")
28
- const cosOfPi = await math.callMethodWithReference("cos", pi)
28
+ const cosOfPi = await math.callMethod("cos", {returnReference: true}, pi)
29
29
  const result = await cosOfPi.serialize()
30
30
 
31
31
  expect(result).toEqual(-1)
@@ -34,6 +34,44 @@ client.close()
34
34
  pythonWebSocketRunner.close()
35
35
  ```
36
36
 
37
+ ## Client and reference examples
38
+
39
+ Create remote objects, call methods, and fetch attributes:
40
+
41
+ ```js
42
+ const arrayRef = await client.newObjectWithReference("Array")
43
+ await arrayRef.callMethod("push", "one", "two")
44
+ const joined = await arrayRef.callMethod("join", ", ")
45
+ expect(joined).toEqual("one, two")
46
+
47
+ const lengthRef = await arrayRef.callMethod("push", {returnReference: true}, "three")
48
+ const length = await lengthRef.serialize()
49
+ expect(length).toEqual(3)
50
+ ```
51
+
52
+ Read attributes directly or as references:
53
+
54
+ ```js
55
+ const math = await client.import("math")
56
+ const piRef = await math.readAttributeWithReference("pi")
57
+ const pi = await piRef.serialize()
58
+
59
+ const e = await math.readAttribute("E")
60
+ expect([pi, e].every((value) => typeof value === "number")).toEqual(true)
61
+ ```
62
+
63
+ Fetch globally available or registered objects:
64
+
65
+ ```js
66
+ client.registerObject("config", {mode: "test"})
67
+
68
+ const configRef = await client.getObject("config")
69
+ const config = await configRef.serialize()
70
+ expect(config).toEqual({mode: "test"})
71
+
72
+ client.unregisterObject("config")
73
+ ```
74
+
37
75
  ## Serialization
38
76
 
39
77
  `Reference#serialize()` only supports JSON-safe values (strings, numbers, booleans, null, plain objects, and arrays). It throws an error if the value contains functions, symbols, bigints, class instances/non-plain objects, circular references, non-finite numbers, or other unsupported types.
@@ -82,7 +120,13 @@ const client = new Client(clientWebSocket, {enableServerControl: false})
82
120
  // equivalent to: new Client(clientWebSocket)
83
121
  ```
84
122
 
85
- Registered objects and classes are available inside `evalWithReference`:
123
+ You can also enable it after construction:
124
+
125
+ ```js
126
+ client.enableServerControl()
127
+ ```
128
+
129
+ Registered objects and classes are available inside `eval`:
86
130
 
87
131
  ```js
88
132
  const client = new Client(clientWebSocket, {enableServerControl: true})
@@ -101,15 +145,28 @@ client.registerClass("TestGreeter", TestGreeter)
101
145
  client.registerObject("testSettings", {prefix: "Hello"})
102
146
 
103
147
  const serverClient = server.getClients()[0] // from your ScoundrelServer instance
104
- const greetingRef = await serverClient.evalWithReference("(() => { const greeter = new TestGreeter(testSettings.prefix); return greeter.greet('World') })()")
148
+ const greetingRef = await serverClient.eval("(() => { const greeter = new TestGreeter(testSettings.prefix); return greeter.greet('World') })()")
105
149
  const greeting = await greetingRef.serialize()
106
150
 
107
151
  expect(greeting).toEqual("Hello World")
108
152
  ```
109
153
 
110
- You can unregister classes or objects to remove them from server-side lookups and `evalWithReference` scope:
154
+ You can unregister classes or objects to remove them from server-side lookups and `eval` scope:
111
155
 
112
156
  ```js
113
157
  client.unregisterClass("TestGreeter")
114
158
  client.unregisterObject("testSettings")
115
159
  ```
160
+
161
+ `eval` defaults to returning a reference, but you can request the raw result:
162
+
163
+ ```js
164
+ const result = await serverClient.eval({returnResult: true}, "(() => 1 + 1)()")
165
+ expect(result).toEqual(2)
166
+ ```
167
+
168
+ Use `eval` with `returnReference` if you need to be explicit:
169
+
170
+ ```js
171
+ const greetingRef = await serverClient.eval({returnReference: true}, "(() => { return 'Hello' })()")
172
+ ```
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @typedef {{returnReference?: boolean, returnResult?: boolean}} ReturnOptions
3
+ * @typedef {ReturnOptions & {returnResult?: false}} ReturnReferenceOptions
4
+ * @typedef {ReturnOptions & {returnResult: true, returnReference?: false}} ReturnResultOptions
5
+ */
1
6
  export default class Client {
2
7
  /**
3
8
  * Creates a new Scoundrel Client
@@ -29,12 +34,33 @@ export default class Client {
29
34
  close(): Promise<void>;
30
35
  /**
31
36
  * Calls a method on a reference and returns the result directly
37
+ * @overload
32
38
  * @param {number} referenceId Reference identifier
33
39
  * @param {string} methodName Method name to invoke
34
40
  * @param {...any} args Arguments to pass to the method
35
41
  * @returns {Promise<any>} Result from the method call
36
42
  */
37
43
  callMethodOnReference(referenceId: number, methodName: string, ...args: any[]): Promise<any>;
44
+ /**
45
+ * Calls a method on a reference and returns a new reference
46
+ * @overload
47
+ * @param {number} referenceId Reference identifier
48
+ * @param {string} methodName Method name to invoke
49
+ * @param {ReturnReferenceOptions} options Options for the call
50
+ * @param {...any} args Arguments to pass to the method
51
+ * @returns {Promise<Reference>} Reference to the returned value
52
+ */
53
+ callMethodOnReference(referenceId: number, methodName: string, options: ReturnReferenceOptions, ...args: any[]): Promise<Reference>;
54
+ /**
55
+ * Calls a method on a reference and returns the result directly
56
+ * @overload
57
+ * @param {number} referenceId Reference identifier
58
+ * @param {string} methodName Method name to invoke
59
+ * @param {ReturnResultOptions} options Options for the call
60
+ * @param {...any} args Arguments to pass to the method
61
+ * @returns {Promise<any>} Result from the method call
62
+ */
63
+ callMethodOnReference(referenceId: number, methodName: string, options: ReturnResultOptions, ...args: any[]): Promise<any>;
38
64
  /**
39
65
  * Calls a method on a reference and returns a new reference
40
66
  * @param {number} referenceId Reference identifier
@@ -43,6 +69,29 @@ export default class Client {
43
69
  * @returns {Promise<Reference>} Reference to the return value
44
70
  */
45
71
  callMethodOnReferenceWithReference(referenceId: number, methodName: string, ...args: any[]): Promise<Reference>;
72
+ /**
73
+ * Evaluates a string and returns a reference or result
74
+ * @overload
75
+ * @param {string} evalString Code to evaluate
76
+ * @returns {Promise<Reference>} Reference to the evaluated value
77
+ */
78
+ eval(evalString: string): Promise<Reference>;
79
+ /**
80
+ * Evaluates a string and returns a reference or result
81
+ * @overload
82
+ * @param {ReturnReferenceOptions} options Eval options
83
+ * @param {string} evalString Code to evaluate
84
+ * @returns {Promise<Reference>} Reference to the evaluated value
85
+ */
86
+ eval(options: ReturnReferenceOptions, evalString: string): Promise<Reference>;
87
+ /**
88
+ * Evaluates a string and returns a reference or result
89
+ * @overload
90
+ * @param {ReturnResultOptions} options Eval options
91
+ * @param {string} evalString Code to evaluate
92
+ * @returns {Promise<any>} Evaluated result
93
+ */
94
+ eval(options: ReturnResultOptions, evalString: string): Promise<any>;
46
95
  /**
47
96
  * Evaluates a string and returns a new reference
48
97
  * @param {string} evalString Code to evaluate
@@ -182,5 +231,16 @@ export default class Client {
182
231
  spawnReference(id: string): Reference;
183
232
  enableServerControl(): void;
184
233
  }
234
+ export type ReturnOptions = {
235
+ returnReference?: boolean;
236
+ returnResult?: boolean;
237
+ };
238
+ export type ReturnReferenceOptions = ReturnOptions & {
239
+ returnResult?: false;
240
+ };
241
+ export type ReturnResultOptions = ReturnOptions & {
242
+ returnResult: true;
243
+ returnReference?: false;
244
+ };
185
245
  import Reference from "./reference.js";
186
246
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"AAUA;IACE;;;;OAIG;IACH,qBAHW,GAAG,YACH;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAC,EA2BzC;IAxBC,aAAsB;IAGtB,kCAAkC;IAClC,kBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACJ;IAC1B,qBAA0B;IAC1B,8BAA8B;IAE9B,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,wCAAwC;IACxC,YADW,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAChB;IAEpB,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACb;IAEjB,qBAAqB;IAErB,sBAAsB;IACtB,sBADW,OAAO,CAC8C;IAGlE;;OAEG;IACH,uBAEC;IAED;;;;;;OAMG;IACH,mCALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAWxB;IAED;;;;;;OAMG;IACH,gDALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;OAIG;IACH,8BAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;;OAKG;IACH,kCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;OAIG;IACH,qBAHW,GAAG,GACD,OAAO,CAQnB;IAED;;;;;;;;OAQG;IACH,YAAa,0EANV;QAAqB,OAAO,EAApB,MAAM;QACO,UAAU,EAAvB,MAAM;QACI,IAAI,EAAd,GAAG;QACW,KAAK,GAAnB,MAAM;QACQ,UAAU,GAAxB,MAAM;KAEkE,UAuPlF;IAED;;;;OAIG;IACH,cAHW,GAAG,GACD,GAAG,CAwBf;IAED;;;;;OAKG;IACH,mDAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAW9B;IAED;;;;;OAKG;IACH,sCAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CASxB;IAED;;;;OAIG;IACH,yBAHW,MAAM,iBACN,GAAG,QAMb;IAED;;;OAGG;IACH,2BAFW,MAAM,QAMhB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;OAIG;IACH,oBAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;OAIG;IACH,2BAHW,MAAM,kBACN,GAAG,QAMb;IAED;;;OAGG;IACH,6BAFW,MAAM,QAMhB;IAED;;;;OAIG;IACH,iCAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;OAIG;IACH,4BAHW,MAAM,QACN,GAAG,QAIb;IAED;;;;;OAKG;IACH,qBAJW,MAAM,QACN,GAAG,GACD,OAAO,CAAC,GAAG,CAAC,CAkBxB;IAED;;;OAGG;IACH,WAFW,GAAG,QAIb;IAED;;;;OAIG;IACH,gCAHW,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CAMxB;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,SAAS,CAQrB;IAED,4BAEC;CACF;sBAvnBqB,gBAAgB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"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"}
@@ -4,6 +4,11 @@ import Reference from "./reference.js";
4
4
  import safeJSONStringify from "../utils/safe-json-stringify.js";
5
5
  const logger = new Logger("Scoundrel Client");
6
6
  // logger.setDebug(true)
7
+ /**
8
+ * @typedef {{returnReference?: boolean, returnResult?: boolean}} ReturnOptions
9
+ * @typedef {ReturnOptions & {returnResult?: false}} ReturnReferenceOptions
10
+ * @typedef {ReturnOptions & {returnResult: true, returnReference?: false}} ReturnResultOptions
11
+ */
7
12
  export default class Client {
8
13
  /**
9
14
  * Creates a new Scoundrel Client
@@ -285,18 +290,85 @@ export default class Client {
285
290
  }
286
291
  /**
287
292
  * Calls a method on a reference and returns the result directly
293
+ * @overload
288
294
  * @param {number} referenceId Reference identifier
289
295
  * @param {string} methodName Method name to invoke
290
296
  * @param {...any} args Arguments to pass to the method
291
297
  * @returns {Promise<any>} Result from the method call
292
298
  */
293
- async callMethodOnReference(referenceId, methodName, ...args) {
299
+ /**
300
+ * Calls a method on a reference and returns a new reference
301
+ * @overload
302
+ * @param {number} referenceId Reference identifier
303
+ * @param {string} methodName Method name to invoke
304
+ * @param {ReturnReferenceOptions} options Options for the call
305
+ * @param {...any} args Arguments to pass to the method
306
+ * @returns {Promise<Reference>} Reference to the returned value
307
+ */
308
+ /**
309
+ * Calls a method on a reference and returns the result directly
310
+ * @overload
311
+ * @param {number} referenceId Reference identifier
312
+ * @param {string} methodName Method name to invoke
313
+ * @param {ReturnResultOptions} options Options for the call
314
+ * @param {...any} args Arguments to pass to the method
315
+ * @returns {Promise<any>} Result from the method call
316
+ */
317
+ /**
318
+ * Calls a method on a reference and returns the result directly
319
+ * @param {number} referenceId Reference identifier
320
+ * @param {string} methodName Method name to invoke
321
+ * @param {ReturnOptions | any} [optionsOrArg] Options for the call or first argument
322
+ * @param {...any} args Arguments to pass to the method
323
+ * @returns {Promise<Reference | any>} Result or reference from the method call
324
+ */
325
+ async callMethodOnReference(referenceId, methodName, optionsOrArg, ...args) {
326
+ const allowedOptions = new Set(["returnReference", "returnResult"]);
327
+ /** @type {ReturnOptions | undefined} */
328
+ let options;
329
+ /** @type {any[]} */
330
+ let methodArgs;
331
+ if (typeof optionsOrArg === "undefined") {
332
+ methodArgs = [];
333
+ }
334
+ else if (this.isPlainObject(optionsOrArg)) {
335
+ const optionKeys = Object.keys(optionsOrArg);
336
+ const hasOptionKey = optionKeys.some((key) => allowedOptions.has(key));
337
+ if (hasOptionKey) {
338
+ const unknownOptions = optionKeys.filter((key) => !allowedOptions.has(key));
339
+ if (unknownOptions.length > 0) {
340
+ throw new Error(`Unknown callMethodOnReference options: ${unknownOptions.join(", ")}`);
341
+ }
342
+ options = /** @type {ReturnOptions} */ (optionsOrArg);
343
+ methodArgs = args;
344
+ }
345
+ else {
346
+ methodArgs = [optionsOrArg, ...args];
347
+ }
348
+ }
349
+ else {
350
+ methodArgs = [optionsOrArg, ...args];
351
+ }
352
+ const returnReference = options?.returnReference === true;
353
+ const returnResult = options?.returnResult === true;
354
+ if (returnReference && returnResult) {
355
+ throw new Error("callMethodOnReference options returnReference and returnResult cannot both be true");
356
+ }
357
+ const withReference = returnReference;
294
358
  const result = await this.sendCommand("call_method_on_reference", {
295
- args: this.parseArg(args),
359
+ args: this.parseArg(methodArgs),
296
360
  method_name: methodName,
297
361
  reference_id: referenceId,
298
- with: "result"
362
+ with: withReference ? "reference" : "result"
299
363
  });
364
+ if (!result)
365
+ throw new Error("Blank result given");
366
+ if (withReference) {
367
+ const objectId = result.response;
368
+ if (!objectId)
369
+ throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
370
+ return this.spawnReference(objectId);
371
+ }
300
372
  return result.response;
301
373
  }
302
374
  /**
@@ -307,31 +379,87 @@ export default class Client {
307
379
  * @returns {Promise<Reference>} Reference to the return value
308
380
  */
309
381
  async callMethodOnReferenceWithReference(referenceId, methodName, ...args) {
310
- const result = await this.sendCommand("call_method_on_reference", {
311
- args: this.parseArg(args),
312
- method_name: methodName,
313
- reference_id: referenceId,
314
- with: "reference"
315
- });
316
- const id = result.response;
317
- return this.spawnReference(id);
382
+ console.warn("Scoundrel Client", "callMethodOnReferenceWithReference is deprecated; use callMethodOnReference with returnReference instead.");
383
+ return this.callMethodOnReference(referenceId, methodName, { returnReference: true }, ...args);
318
384
  }
319
385
  /**
320
- * Evaluates a string and returns a new reference
386
+ * Evaluates a string and returns a reference or result
387
+ * @overload
321
388
  * @param {string} evalString Code to evaluate
322
389
  * @returns {Promise<Reference>} Reference to the evaluated value
323
390
  */
324
- async evalWithReference(evalString) {
391
+ /**
392
+ * Evaluates a string and returns a reference or result
393
+ * @overload
394
+ * @param {ReturnReferenceOptions} options Eval options
395
+ * @param {string} evalString Code to evaluate
396
+ * @returns {Promise<Reference>} Reference to the evaluated value
397
+ */
398
+ /**
399
+ * Evaluates a string and returns a reference or result
400
+ * @overload
401
+ * @param {ReturnResultOptions} options Eval options
402
+ * @param {string} evalString Code to evaluate
403
+ * @returns {Promise<any>} Evaluated result
404
+ */
405
+ /**
406
+ * Evaluates a string and returns a reference or result
407
+ * @param {string | ReturnOptions} optionsOrEvalString Options or code to evaluate
408
+ * @param {string} [evalString] Code to evaluate
409
+ * @returns {Promise<Reference | any>} Reference or evaluated result
410
+ */
411
+ async eval(optionsOrEvalString, evalString) {
412
+ const allowedOptions = new Set(["returnReference", "returnResult"]);
413
+ /** @type {ReturnOptions} */
414
+ let options = {};
415
+ /** @type {string | undefined} */
416
+ let targetEvalString = evalString;
417
+ if (typeof evalString === "undefined") {
418
+ if (this.isPlainObject(optionsOrEvalString)) {
419
+ throw new Error("eval requires an eval string when options are provided");
420
+ }
421
+ targetEvalString = /** @type {string} */ (optionsOrEvalString);
422
+ }
423
+ else {
424
+ options = /** @type {ReturnOptions} */ (optionsOrEvalString ?? {});
425
+ if (!this.isPlainObject(options)) {
426
+ throw new Error("eval options must be a plain object");
427
+ }
428
+ }
429
+ const unknownOptions = Object.keys(options).filter((key) => !allowedOptions.has(key));
430
+ if (unknownOptions.length > 0) {
431
+ throw new Error(`Unknown eval options: ${unknownOptions.join(", ")}`);
432
+ }
433
+ const returnReference = options.returnReference === true;
434
+ const returnResult = options.returnResult === true;
435
+ if (returnReference && returnResult) {
436
+ throw new Error("eval options returnReference and returnResult cannot both be true");
437
+ }
438
+ const withReference = returnReference || !returnResult;
325
439
  const result = await this.sendCommand("eval", {
326
- eval_string: evalString,
327
- with_reference: true
440
+ eval_string: targetEvalString,
441
+ with_reference: withReference
328
442
  });
329
443
  if (!result)
330
444
  throw new Error("Blank result given");
331
- const objectId = result.object_id;
332
- if (!objectId)
333
- throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
334
- return this.spawnReference(objectId);
445
+ if (withReference) {
446
+ const objectId = result.object_id;
447
+ if (!objectId)
448
+ throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
449
+ return this.spawnReference(objectId);
450
+ }
451
+ if (!("response" in result))
452
+ throw new Error(`No response given in result: ${JSON.stringify(result)}`);
453
+ return result.response;
454
+ }
455
+ /**
456
+ * Evaluates a string and returns a new reference
457
+ * @param {string} evalString Code to evaluate
458
+ * @returns {Promise<Reference>} Reference to the evaluated value
459
+ */
460
+ async evalWithReference(evalString) {
461
+ console.warn("Scoundrel Client", "evalWithReference is deprecated; use eval instead.");
462
+ return this.eval({ returnReference: true }, evalString);
335
463
  }
336
464
  /**
337
465
  * Imports a module and returns a reference to it
@@ -571,4 +699,4 @@ export default class Client {
571
699
  this.serverControlEnabled = true;
572
700
  }
573
701
  }
574
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRTdDLHdCQUF3QjtBQUV4QixNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDekI7Ozs7T0FJRztJQUNILFlBQVksT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBa0tqQzs7Ozs7Ozs7V0FRRztRQUNILGNBQVMsR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxRQUFRLEVBQUMsRUFBRSxFQUFFO1lBQ3JGLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQTtZQUV4RixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDdEYsQ0FBQztxQkFBTSxJQUFJLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzt3QkFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsU0FBUyxlQUFlLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDOUcsQ0FBQztvQkFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUE7b0JBRXJELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFBO29CQUV2QyxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUNyQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUM5QixJQUFJLENBQUMsS0FBSztnQ0FBRSxPQUFPLEVBQUUsQ0FBQTs0QkFDckIsT0FBTyxLQUFLO2lDQUNULEtBQUssQ0FBQyxJQUFJLENBQUM7aUNBQ1gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7aUNBQzFCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO2lDQUN0QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lDQUNoRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQ0FDN0MsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQ0FDdkQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQ0FDbEQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTt3QkFDakQsQ0FBQyxDQUFBO3dCQUVELE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFOzRCQUNyQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7NEJBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dDQUFFLE9BQU8sRUFBRSxDQUFBOzRCQUNqQyxPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7d0JBQ3BELENBQUMsQ0FBQTt3QkFFRCxNQUFNLGFBQWEsR0FBRzs0QkFDcEIsVUFBVSxLQUFLLEVBQUU7NEJBQ2pCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQzs0QkFDbkQsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQzs0QkFDMUQsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3lCQUM3SCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFFWixZQUFZLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQTt3QkFFbEMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtvQkFDbkMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxxQkFBcUIsU0FBUyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTt3QkFDcEUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ2pDLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUMsQ0FBQyxDQUFBO29CQUNwRyxPQUFNO2dCQUNSLENBQUM7cUJBQU0sSUFBSSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBQ2hFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBQzlELElBQUksTUFBTSxDQUFBO29CQUVWLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUMvQixNQUFNLEdBQUcsWUFBWSxDQUFBO29CQUN2QixDQUFDO3lCQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNyQyxNQUFNLEdBQUcsV0FBVyxDQUFBO29CQUN0QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7d0JBRXJDLElBQUksTUFBTSxLQUFLLFNBQVM7NEJBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7b0JBQ2xGLENBQUM7b0JBRUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFBO29CQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO2dCQUN6RCxDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLDJCQUEyQixFQUFFLENBQUM7b0JBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUE7b0JBQ2pDLElBQUksTUFBTSxDQUFBO29CQUVWLElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7d0JBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUV2RSxJQUFJLENBQUMsYUFBYTs0QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixTQUFTLEVBQUUsQ0FBQyxDQUFBO3dCQUVsRSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzFDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUE7b0JBQzdFLENBQUM7b0JBRUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFBO29CQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQTtvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO2dCQUN6RCxDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLDBCQUEwQixFQUFFLENBQUM7b0JBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7b0JBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBRXhDLElBQUksQ0FBQyxNQUFNO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFdBQVcsRUFBRSxDQUFDLENBQUE7b0JBRXBFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBRXZDLElBQUksQ0FBQyxNQUFNO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLElBQUksQ0FBQyxXQUFXLFdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO29CQUV4RyxNQUFNLGdCQUFnQixHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ3pDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQzs0QkFDN0IsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFBOzRCQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQTs0QkFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO3dCQUN4RCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQyxDQUFBO3dCQUM3RCxDQUFDO29CQUNILENBQUMsQ0FBQTtvQkFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFFbEQsSUFBSSxRQUFRLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNuRCxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7NEJBQ3JELElBQUksWUFBWSxZQUFZLEtBQUssRUFBRSxDQUFDO2dDQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFBOzRCQUM5SCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUM5RixDQUFDO3dCQUNILENBQUMsQ0FBQyxDQUFBO29CQUNKLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7b0JBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7b0JBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBRXhDLElBQUksQ0FBQyxNQUFNO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFdBQVcsRUFBRSxDQUFDLENBQUE7b0JBRXBFLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUM5QyxDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7b0JBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7b0JBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7b0JBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7b0JBRXhDLElBQUksQ0FBQyxNQUFNO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFdBQVcsRUFBRSxDQUFDLENBQUE7b0JBRXBFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQkFFdkMsSUFBSSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7d0JBQzlCLE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQTt3QkFFcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUE7d0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtvQkFDeEQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtvQkFDekQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUM3QixNQUFNLGlCQUFpQixHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3ZDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOzRCQUN4QixNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUE7NEJBRXBDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFBOzRCQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7d0JBQ3pELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7d0JBQzFELENBQUM7b0JBQ0gsQ0FBQyxDQUFBO29CQUVELE1BQU0sS0FBSyxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBQyxDQUFBO29CQUNsRCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO3dCQUNsQyxPQUFPO3dCQUNQLE1BQU07d0JBQ04sT0FBTzt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsVUFBVTt3QkFDVixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixJQUFJO3dCQUNKLE1BQU07d0JBQ04sUUFBUTt3QkFDUixTQUFTO3dCQUNULFNBQVM7d0JBQ1QsS0FBSzt3QkFDTCxVQUFVO3dCQUNWLElBQUk7d0JBQ0osUUFBUTt3QkFDUixJQUFJO3dCQUNKLFlBQVk7d0JBQ1osS0FBSzt3QkFDTCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsUUFBUTt3QkFDUixNQUFNO3dCQUNOLE9BQU87d0JBQ1AsS0FBSzt3QkFDTCxRQUFRO3dCQUNSLEtBQUs7d0JBQ0wsTUFBTTt3QkFDTixPQUFPO3dCQUNQLE1BQU07d0JBQ04sT0FBTzt3QkFDUCxLQUFLO3dCQUNMLE1BQU07d0JBQ04sT0FBTzt3QkFDUCxZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsV0FBVzt3QkFDWCxRQUFRO3dCQUNSLFdBQVc7d0JBQ1gsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLE1BQU07cUJBQ1AsQ0FBQyxDQUFBO29CQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNqQyxtREFBbUQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBRWxHLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3BDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtvQkFFdEUsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDaEYsQ0FBQztvQkFFRCw0RUFBNEU7b0JBQzVFLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLFNBQVMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFBO29CQUN6RixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBRXJGLElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDdkQsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFOzRCQUN4RCxJQUFJLFlBQVksWUFBWSxLQUFLLEVBQUUsQ0FBQztnQ0FDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQTs0QkFDOUgsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQTs0QkFDOUYsQ0FBQzt3QkFDSCxDQUFDLENBQUMsQ0FBQTtvQkFDSixDQUFDO3lCQUFNLENBQUM7d0JBQ04saUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUE7b0JBQy9CLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQ2hELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQTtnQkFDaEgsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQkFDdkYsQ0FBQztnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3JCLENBQUM7UUFDSCxDQUFDLENBQUE7UUFqYUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRDLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFBO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtRQUU5QixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFFbEIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFBO1FBRWxCLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVwQixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFakIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUE7UUFFckIsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixFQUFFO1lBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN6QixXQUFXLEVBQUUsVUFBVTtZQUN2QixZQUFZLEVBQUUsV0FBVztZQUN6QixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQTtRQUVGLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJO1FBQ3ZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRTtZQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDekIsV0FBVyxFQUFFLFVBQVU7WUFDdkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsSUFBSSxFQUFFLFdBQVc7U0FDbEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtRQUUxQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBVTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQzVDLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRWxELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUE7UUFFakMsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUV6RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtZQUM5QyxXQUFXLEVBQUUsVUFBVTtTQUN4QixDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXRDLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWpHLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUE7UUFFM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUU7WUFDbEQsV0FBVyxFQUFFLFVBQVU7U0FDeEIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFFbEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQTtRQUUzQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUk7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLDJCQUEyQixFQUFFO1lBQ2pFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN6QixVQUFVLEVBQUUsU0FBUztTQUN0QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUVsRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFBO1FBRTNCLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFbkYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQW9RRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEdBQUc7UUFDVixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO2FBQU0sSUFBSSxHQUFHLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDcEMsT0FBTztnQkFDTCxxQkFBcUIsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDN0IsZ0JBQWdCLEVBQUUsV0FBVzthQUM5QixDQUFBO1FBQ0gsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLCtCQUErQjtZQUMvQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7WUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUV0QixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2QyxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLFdBQVcsRUFBRSxhQUFhO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0RCxjQUFjLEVBQUUsYUFBYTtZQUM3QixZQUFZLEVBQUUsV0FBVztZQUN6QixJQUFJLEVBQUUsV0FBVztTQUNsQixDQUFDLENBQUE7UUFDRixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO1FBRTFCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGFBQWE7UUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO1lBQ3RELGNBQWMsRUFBRSxhQUFhO1lBQzdCLFlBQVksRUFBRSxXQUFXO1lBQ3pCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhO1FBQ3BDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUVyRixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLFNBQVM7UUFDdkIsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRXhGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFNBQVM7UUFDM0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLFVBQVUsRUFBRSxjQUFjO1FBQ3ZDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGNBQWMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsVUFBVTtRQUN6QixJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFFM0YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsVUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSTtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQTtZQUN6RCxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxZQUFZLE9BQU8sY0FBYyxDQUFDLENBQUE7WUFDaEUsNERBQTREO1lBQzVELElBQUksS0FBSyxDQUFDLGlCQUFpQjtnQkFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNuRixNQUFNLFdBQVcsR0FBRztnQkFDbEIsT0FBTztnQkFDUCxVQUFVLEVBQUUsb0JBQW9CO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQTtZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBQyxDQUFBO1lBQy9GLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxJQUFJO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVztRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUV2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsRUFBRTtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUUvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gXCIuL3JlZmVyZW5jZS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2NvdW5kcmVsIENsaWVudFwiKVxuXG4vLyBsb2dnZXIuc2V0RGVidWcodHJ1ZSlcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2NvdW5kcmVsIENsaWVudFxuICAgKiBAcGFyYW0ge2FueX0gYmFja2VuZCBUaGUgYmFja2VuZCBjb25uZWN0aW9uIChlLmcuLCBXZWJTb2NrZXQpXG4gICAqIEBwYXJhbSB7e2VuYWJsZVNlcnZlckNvbnRyb2w/OiBib29sZWFufX0gW29wdGlvbnNdIENsaWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmRcbiAgICB0aGlzLmJhY2tlbmQub25Db21tYW5kKHRoaXMub25Db21tYW5kKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5pbmNvbWluZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9jbGFzc2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9vYmplY3RzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPn0gKi9cbiAgICB0aGlzLnJlZmVyZW5jZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub2JqZWN0cyA9IHt9XG5cbiAgICB0aGlzLm9iamVjdHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gQm9vbGVhbihvcHRpb25zLmVuYWJsZVNlcnZlckNvbnRyb2wpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5iYWNrZW5kLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIG1ldGhvZF9uYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVmZXJlbmNlXCJcbiAgICB9KVxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGV2YWxXaXRoUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgbW9kdWxlXG4gICAqL1xuICBhc3luYyBpbXBvcnQoaW1wb3J0TmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJpbXBvcnRcIiwge1xuICAgICAgaW1wb3J0X25hbWU6IGltcG9ydE5hbWVcbiAgICB9KVxuXG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJpbXBvcnRcIiwge3Jlc3VsdH1dKVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3VsdCBnaXZlblwiKVxuICAgIGlmICghcmVzdWx0Lm9iamVjdF9pZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgUmVnaXN0ZXJlZCBvYmplY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0V2l0aFJlZmVyZW5jZShjbGFzc05hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgICogQHBhcmFtIHthbnl9IGlucHV0IFZhbHVlIHRvIGluc3BlY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3RcbiAgICovXG4gIGlzUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGluY29taW5nIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyBDb21tYW5kIHBheWxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY29tbWFuZF9pZCBDb21tYW5kIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZGF0YSBDb21tYW5kIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yXSBFcnJvciBtZXNzYWdlIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yU3RhY2tdIEVycm9yIHN0YWNrIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIG9uQ29tbWFuZCA9ICh7Y29tbWFuZCwgY29tbWFuZF9pZDogY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgLi4ucmVzdEFyZ3N9KSA9PiB7XG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJvbkNvbW1hbmRcIiwge2NvbW1hbmQsIGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlc3RBcmdzfV0pXG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBrZXkgZ2l2ZW4gaW4gZGF0YTogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjb21tYW5kX3Jlc3BvbnNlXCIpIHtcbiAgICAgICAgaWYgKCEoY29tbWFuZElEIGluIHRoaXMub3V0Z29pbmdDb21tYW5kcykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dGdvaW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IG5vdCBmb3VuZDogJHtPYmplY3Qua2V5cyh0aGlzLm91dGdvaW5nQ29tbWFuZHMpLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2F2ZWRDb21tYW5kID0gdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvclRvVGhyb3cgPSBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVTdGFjayA9IChzdGFjaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGFjaykgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhL25vZGVfbW9kdWxlc1xcL3dzLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6Ly50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6aW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpaW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoXCJFcnJvcjpcIikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFwiU2VydmVyIGNvbnRyb2wgaXMgZGlzYWJsZWRcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZ2V0X29iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlck9iamVjdCA9IHRoaXMuX2dldFJlZ2lzdGVyZWRPYmplY3QoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgY29uc3Qgc2VydmVyQ2xhc3MgPSB0aGlzLl9nZXRSZWdpc3RlcmVkQ2xhc3MoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmIChzZXJ2ZXJPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlck9iamVjdFxuICAgICAgICB9IGVsc2UgaWYgKHNlcnZlckNsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJDbGFzc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdCA9IGdsb2JhbFRoaXNbZGF0YS5vYmplY3RfbmFtZV1cblxuICAgICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFRoaXNbY2xhc3NOYW1lXVxuXG4gICAgICAgICAgaWYgKCFDbGFzc0luc3RhbmNlKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggY2xhc3M6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICAgICAgICBvYmplY3QgPSBuZXcgQ2xhc3NJbnN0YW5jZSguLi5kYXRhLmFyZ3MpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgY2xhc3MgbmFtZTogJHt0eXBlb2YgY2xhc3NOYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgbWV0aG9kID0gb2JqZWN0W2RhdGEubWV0aG9kX25hbWVdXG5cbiAgICAgICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kIGNhbGxlZCAnJHtkYXRhLm1ldGhvZF9uYW1lfScgb24gYSAnJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0nYClcblxuICAgICAgICBjb25zdCByZXNwb25kV2l0aFZhbHVlID0gKHJlc3BvbnNlVmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gcmVzcG9uc2VWYWx1ZVxuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogcmVzcG9uc2VWYWx1ZX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBtZXRob2QuY2FsbChvYmplY3QsIC4uLmRhdGEuYXJncylcblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzcG9uc2UudGhlbihyZXNwb25kV2l0aFZhbHVlKS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFZhbHVlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzZXJpYWxpemVfcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc2FmZUpTT05TdHJpbmdpZnkob2JqZWN0KVxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCBzZXJpYWxpemVkKVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwicmVhZF9hdHRyaWJ1dGVcIikge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gZGF0YS5hdHRyaWJ1dGVfbmFtZVxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IHJldHVybldpdGggPSBkYXRhLndpdGhcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gb2JqZWN0W2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgICAgaWYgKHJldHVybldpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGF0dHJpYnV0ZVxuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogb2JqZWN0SWR9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogYXR0cmlidXRlfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZXZhbFwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoUmVzdWx0ID0gKGV2YWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBldmFsUmVzdWx0XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogZXZhbFJlc3VsdH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB7Li4udGhpcy5fb2JqZWN0cywgLi4udGhpcy5fY2xhc3Nlc31cbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwiYnJlYWtcIixcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgXCJkZWJ1Z2dlclwiLFxuICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgXCJkb1wiLFxuICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgIFwiZXhwb3J0XCIsXG4gICAgICAgICAgXCJleHRlbmRzXCIsXG4gICAgICAgICAgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgXCJmb3JcIixcbiAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJpZlwiLFxuICAgICAgICAgIFwiaW1wb3J0XCIsXG4gICAgICAgICAgXCJpblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgICAgICAgIFwibmV3XCIsXG4gICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICBcInN1cGVyXCIsXG4gICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICBcInRoaXNcIixcbiAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgXCJ0cnlcIixcbiAgICAgICAgICBcInR5cGVvZlwiLFxuICAgICAgICAgIFwidmFyXCIsXG4gICAgICAgICAgXCJ2b2lkXCIsXG4gICAgICAgICAgXCJ3aGlsZVwiLFxuICAgICAgICAgIFwid2l0aFwiLFxuICAgICAgICAgIFwieWllbGRcIixcbiAgICAgICAgICBcImxldFwiLFxuICAgICAgICAgIFwiZW51bVwiLFxuICAgICAgICAgIFwiYXdhaXRcIixcbiAgICAgICAgICBcImltcGxlbWVudHNcIixcbiAgICAgICAgICBcInBhY2thZ2VcIixcbiAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICAgIFwiZXZhbFwiXG4gICAgICAgIF0pXG5cbiAgICAgICAgY29uc3QgaXNWYWxpZElkZW50aWZpZXIgPSAobmFtZSkgPT5cbiAgICAgICAgICAvXig/OlskX118XFxwe0lEX1N0YXJ0fSkoPzpbJF9dfFxccHtJRF9Db250aW51ZX0pKiQvdS50ZXN0KG5hbWUpICYmICFyZXNlcnZlZElkZW50aWZpZXJzLmhhcyhuYW1lKVxuXG4gICAgICAgIGNvbnN0IHNjb3BlS2V5cyA9IE9iamVjdC5rZXlzKHNjb3BlKVxuICAgICAgICBjb25zdCBpbnZhbGlkS2V5cyA9IHNjb3BlS2V5cy5maWx0ZXIoKGtleSkgPT4gIWlzVmFsaWRJZGVudGlmaWVyKGtleSkpXG5cbiAgICAgICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVnaXN0ZXJlZCBpZGVudGlmaWVyKHMpOiAke2ludmFsaWRLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHJlZ2lzdGVyZWQgb2JqZWN0cy9jbGFzc2VzIGFyZSBhdmFpbGFibGUgYXMgbG9jYWxzIGluc2lkZSB0aGUgZXZhbFxuICAgICAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgRnVuY3Rpb24oXCJfX2V2YWxTdHJpbmdcIiwgLi4uc2NvcGVLZXlzLCBcInJldHVybiBldmFsKF9fZXZhbFN0cmluZylcIilcbiAgICAgICAgY29uc3QgZXZhbFJlc3VsdCA9IGV2YWx1YXRvcihkYXRhLmV2YWxfc3RyaW5nLCAuLi5zY29wZUtleXMubWFwKChrZXkpID0+IHNjb3BlW2tleV0pKVxuXG4gICAgICAgIGlmIChldmFsUmVzdWx0ICYmIHR5cGVvZiBldmFsUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXZhbFJlc3VsdC50aGVuKHJlc3BvbmRXaXRoUmVzdWx0KS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFJlc3VsdChldmFsUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IGVycm9yLnN0YWNrfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhlcnJvcil9KVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFzZXMgYW4gYXJndW1lbnQgZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHNlcmlhbGl6ZSBmb3IgdHJhbnNwb3J0XG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VBcmcoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgcmV0dXJuIGFyZy5tYXAoKGFyZ0luQXJyYXkpID0+IHRoaXMucGFyc2VBcmcoYXJnSW5BcnJheSkpXG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fc2NvdW5kcmVsX29iamVjdF9pZDogYXJnLmlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcInJlZmVyZW5jZVwiXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoYXJnKSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8YW55LCBhbnk+fSAqL1xuICAgICAgY29uc3QgbmV3T2JqZWN0ID0ge31cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXJnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJnW2tleV1cblxuICAgICAgICBuZXdPYmplY3Rba2V5XSA9IHRoaXMucGFyc2VBcmcodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJyZWFkX2F0dHJpYnV0ZVwiLCB7XG4gICAgICBhdHRyaWJ1dGVfbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlZmVyZW5jZVwiXG4gICAgfSlcbiAgICBjb25zdCBpZCA9IHJlc3VsdC5yZXNwb25zZVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwicmVhZF9hdHRyaWJ1dGVcIiwge1xuICAgICAgYXR0cmlidXRlX25hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZXN1bHRcIlxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlIENsYXNzIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3RlckNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICghKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSkgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBkb2VzIG5vdCBleGlzdDogJHtjbGFzc05hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBpZiAoIShvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBkb2VzIG5vdCBleGlzdDogJHtvYmplY3ROYW1lfWApXG5cbiAgICBkZWxldGUgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byBhIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWFuZElkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBSZXNwb25zZSBwYXlsb2FkXG4gICAqL1xuICByZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJZCwgZGF0YSkge1xuICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YToge2NvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YX19KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgYmFja2VuZCBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgQ29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3BvbnNlIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3V0Z29pbmdDb21tYW5kQ291bnQgPSArK3RoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50XG4gICAgICBjb25zdCBvcmlnaW5FcnJvciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtjb21tYW5kfScgZGlzcGF0Y2hlZGApXG4gICAgICAvLyBTdHJpcCB0aGUgc2VuZENvbW1hbmQgZnJhbWUgdG8gaGlnaGxpZ2h0IHRoZSBjYWxsZXIgc2l0ZS5cbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uob3JpZ2luRXJyb3IsIHRoaXMuc2VuZENvbW1hbmQpXG4gICAgICBjb25zdCBjb21tYW5kRGF0YSA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgY29tbWFuZF9pZDogb3V0Z29pbmdDb21tYW5kQ291bnQsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW291dGdvaW5nQ29tbWFuZENvdW50XSA9IHtyZXNvbHZlLCByZWplY3QsIG9yaWdpblN0YWNrOiBvcmlnaW5FcnJvci5zdGFja31cbiAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiU2VuZGluZ1wiLCBjb21tYW5kRGF0YV0pXG4gICAgICB0aGlzLnNlbmQoY29tbWFuZERhdGEpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBkYXRhIHRvIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFBheWxvYWQgdG8gc2VuZFxuICAgKi9cbiAgc2VuZChkYXRhKSB7XG4gICAgdGhpcy5iYWNrZW5kLnNlbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFBhcnNlZCBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIiwge3JlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWR9KVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1JlZmVyZW5jZX0gUmVmZXJlbmNlIGluc3RhbmNlXG4gICAqL1xuICBzcGF3blJlZmVyZW5jZShpZCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UodGhpcywgaWQpXG5cbiAgICB0aGlzLnJlZmVyZW5jZXNbaWRdID0gcmVmZXJlbmNlXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlXG4gIH1cblxuICBlbmFibGVTZXJ2ZXJDb250cm9sKCkge1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSB0cnVlXG4gIH1cbn1cbiJdfQ==
702
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRTdDLHdCQUF3QjtBQUV4Qjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7O09BSUc7SUFDSCxZQUFZLE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRTtRQXlTakM7Ozs7Ozs7O1dBUUc7UUFDSCxjQUFTLEdBQUcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxFQUFDLEVBQUUsRUFBRTtZQUNyRixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUE7WUFFeEYsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ3RGLENBQUM7cUJBQU0sSUFBSSxPQUFPLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFF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QVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUE7UUFFL0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuaW1wb3J0IHNhZmVKU09OU3RyaW5naWZ5IGZyb20gXCIuLi91dGlscy9zYWZlLWpzb24tc3RyaW5naWZ5LmpzXCJcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlNjb3VuZHJlbCBDbGllbnRcIilcblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge3tyZXR1cm5SZWZlcmVuY2U/OiBib29sZWFuLCByZXR1cm5SZXN1bHQ/OiBib29sZWFufX0gUmV0dXJuT3B0aW9uc1xuICogQHR5cGVkZWYge1JldHVybk9wdGlvbnMgJiB7cmV0dXJuUmVzdWx0PzogZmFsc2V9fSBSZXR1cm5SZWZlcmVuY2VPcHRpb25zXG4gKiBAdHlwZWRlZiB7UmV0dXJuT3B0aW9ucyAmIHtyZXR1cm5SZXN1bHQ6IHRydWUsIHJldHVyblJlZmVyZW5jZT86IGZhbHNlfX0gUmV0dXJuUmVzdWx0T3B0aW9uc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTY291bmRyZWwgQ2xpZW50XG4gICAqIEBwYXJhbSB7YW55fSBiYWNrZW5kIFRoZSBiYWNrZW5kIGNvbm5lY3Rpb24gKGUuZy4sIFdlYlNvY2tldClcbiAgICogQHBhcmFtIHt7ZW5hYmxlU2VydmVyQ29udHJvbD86IGJvb2xlYW59fSBbb3B0aW9uc10gQ2xpZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYmFja2VuZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZFxuICAgIHRoaXMuYmFja2VuZC5vbkNvbW1hbmQodGhpcy5vbkNvbW1hbmQpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIGFueT59ICovXG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLmluY29taW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX2NsYXNzZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX29iamVjdHMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+fSAqL1xuICAgIHRoaXMucmVmZXJlbmNlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIGFueT59ICovXG4gICAgdGhpcy5vYmplY3RzID0ge31cblxuICAgIHRoaXMub2JqZWN0c0NvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMuZW5hYmxlU2VydmVyQ29udHJvbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNsaWVudCBjb25uZWN0aW9uXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICB0aGlzLmJhY2tlbmQuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgY2FsbFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9ucyB8IGFueX0gW29wdGlvbnNPckFyZ10gT3B0aW9ucyBmb3IgdGhlIGNhbGwgb3IgZmlyc3QgYXJndW1lbnRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgYW55Pn0gUmVzdWx0IG9yIHJlZmVyZW5jZSBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCBvcHRpb25zT3JBcmcsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmV0dXJuUmVmZXJlbmNlXCIsIFwicmV0dXJuUmVzdWx0XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9ucyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7YW55W119ICovXG4gICAgbGV0IG1ldGhvZEFyZ3NcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBtZXRob2RBcmdzID0gW11cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JBcmcpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMob3B0aW9uc09yQXJnKVxuICAgICAgY29uc3QgaGFzT3B0aW9uS2V5ID0gb3B0aW9uS2V5cy5zb21lKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuXG4gICAgICBpZiAoaGFzT3B0aW9uS2V5KSB7XG4gICAgICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gb3B0aW9uS2V5cy5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICBpZiAodW5rbm93bk9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjYWxsTWV0aG9kT25SZWZlcmVuY2Ugb3B0aW9uczogJHt1bmtub3duT3B0aW9ucy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSAvKiogQHR5cGUge1JldHVybk9wdGlvbnN9ICovIChvcHRpb25zT3JBcmcpXG4gICAgICAgIG1ldGhvZEFyZ3MgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2RBcmdzID0gW29wdGlvbnNPckFyZywgLi4uYXJnc11cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuUmVmZXJlbmNlID0gb3B0aW9ucz8ucmV0dXJuUmVmZXJlbmNlID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUmVzdWx0ID0gb3B0aW9ucz8ucmV0dXJuUmVzdWx0ID09PSB0cnVlXG5cbiAgICBpZiAocmV0dXJuUmVmZXJlbmNlICYmIHJldHVyblJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlIG9wdGlvbnMgcmV0dXJuUmVmZXJlbmNlIGFuZCByZXR1cm5SZXN1bHQgY2Fubm90IGJvdGggYmUgdHJ1ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2VcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcobWV0aG9kQXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiB3aXRoUmVmZXJlbmNlID8gXCJyZWZlcmVuY2VcIiA6IFwicmVzdWx0XCJcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgaWYgKHdpdGhSZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnNvbGUud2FybihcIlNjb3VuZHJlbCBDbGllbnRcIiwgXCJjYWxsTWV0aG9kT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGlzIGRlcHJlY2F0ZWQ7IHVzZSBjYWxsTWV0aG9kT25SZWZlcmVuY2Ugd2l0aCByZXR1cm5SZWZlcmVuY2UgaW5zdGVhZC5cIilcbiAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIHtyZXR1cm5SZWZlcmVuY2U6IHRydWV9LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSBvciByZXN1bHRcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSByZWZlcmVuY2Ugb3IgcmVzdWx0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgRXZhbCBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSByZWZlcmVuY2Ugb3IgcmVzdWx0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgRXZhbCBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gRXZhbHVhdGVkIHJlc3VsdFxuICAgKi9cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSBvciByZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZXR1cm5PcHRpb25zfSBvcHRpb25zT3JFdmFsU3RyaW5nIE9wdGlvbnMgb3IgY29kZSB0byBldmFsdWF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2YWxTdHJpbmddIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgYW55Pn0gUmVmZXJlbmNlIG9yIGV2YWx1YXRlZCByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWwob3B0aW9uc09yRXZhbFN0cmluZywgZXZhbFN0cmluZykge1xuICAgIGNvbnN0IGFsbG93ZWRPcHRpb25zID0gbmV3IFNldChbXCJyZXR1cm5SZWZlcmVuY2VcIiwgXCJyZXR1cm5SZXN1bHRcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqL1xuICAgIGxldCBvcHRpb25zID0ge31cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgdGFyZ2V0RXZhbFN0cmluZyA9IGV2YWxTdHJpbmdcblxuICAgIGlmICh0eXBlb2YgZXZhbFN0cmluZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JFdmFsU3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nIHdoZW4gb3B0aW9ucyBhcmUgcHJvdmlkZWRcIilcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0RXZhbFN0cmluZyA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAob3B0aW9uc09yRXZhbFN0cmluZylcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKG9wdGlvbnNPckV2YWxTdHJpbmcgPz8ge30pXG5cbiAgICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWwgb3B0aW9ucyBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgIGlmICh1bmtub3duT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZXZhbCBvcHRpb25zOiAke3Vua25vd25PcHRpb25zLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnMucmV0dXJuUmVmZXJlbmNlID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUmVzdWx0ID0gb3B0aW9ucy5yZXR1cm5SZXN1bHQgPT09IHRydWVcblxuICAgIGlmIChyZXR1cm5SZWZlcmVuY2UgJiYgcmV0dXJuUmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIG9wdGlvbnMgcmV0dXJuUmVmZXJlbmNlIGFuZCByZXR1cm5SZXN1bHQgY2Fubm90IGJvdGggYmUgdHJ1ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2UgfHwgIXJldHVyblJlc3VsdFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJldmFsXCIsIHtcbiAgICAgIGV2YWxfc3RyaW5nOiB0YXJnZXRFdmFsU3RyaW5nLFxuICAgICAgd2l0aF9yZWZlcmVuY2U6IHdpdGhSZWZlcmVuY2VcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgaWYgKHdpdGhSZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgICBpZiAoIW9iamVjdElkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZClcbiAgICB9XG5cbiAgICBpZiAoIShcInJlc3BvbnNlXCIgaW4gcmVzdWx0KSkgdGhyb3cgbmV3IEVycm9yKGBObyByZXNwb25zZSBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbFdpdGhSZWZlcmVuY2UoZXZhbFN0cmluZykge1xuICAgIGNvbnNvbGUud2FybihcIlNjb3VuZHJlbCBDbGllbnRcIiwgXCJldmFsV2l0aFJlZmVyZW5jZSBpcyBkZXByZWNhdGVkOyB1c2UgZXZhbCBpbnN0ZWFkLlwiKVxuICAgIHJldHVybiB0aGlzLmV2YWwoe3JldHVyblJlZmVyZW5jZTogdHJ1ZX0sIGV2YWxTdHJpbmcpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydChpbXBvcnROYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBSZWdpc3RlcmVkIG9iamVjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJnZXRfb2JqZWN0XCIsIHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3ROYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3RXaXRoUmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXQgVmFsdWUgdG8gaW5zcGVjdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuICAgKi9cbiAgaXNQbGFpbk9iamVjdChpbnB1dCkge1xuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIENvbW1hbmQgcGF5bG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21tYW5kX2lkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5kYXRhIENvbW1hbmQgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JdIEVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JTdGFja10gRXJyb3Igc3RhY2sgZnJvbSB0aGUgYmFja2VuZFxuICAgKi9cbiAgb25Db21tYW5kID0gKHtjb21tYW5kLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGRhdGEsIGVycm9yLCBlcnJvclN0YWNrLCAuLi5yZXN0QXJnc30pID0+IHtcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uQ29tbWFuZFwiLCB7Y29tbWFuZCwgY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgcmVzdEFyZ3N9XSlcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGtleSBnaXZlbiBpbiBkYXRhOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNvbW1hbmRfcmVzcG9uc2VcIikge1xuICAgICAgICBpZiAoIShjb21tYW5kSUQgaW4gdGhpcy5vdXRnb2luZ0NvbW1hbmRzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0Z29pbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gbm90IGZvdW5kOiAke09iamVjdC5rZXlzKHRoaXMub3V0Z29pbmdDb21tYW5kcykuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYXZlZENvbW1hbmQgPSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yVG9UaHJvdyA9IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZVN0YWNrID0gKHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvbm9kZV9tb2R1bGVzXFwvd3MvLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTovLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTppbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClpbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb3JtYXRTZWN0aW9uID0gKGxhYmVsLCBzdGFjaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzYW5pdGl6ZVN0YWNrKHN0YWNrKVxuICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gW2Ake2xhYmVsfSAke2xpbmVzWzBdfWAsIC4uLmxpbmVzLnNsaWNlKDEpXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkU3RhY2sgPSBbXG4gICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5URFJFTC1TRVJWRVJdXCIsIGVycm9yU3RhY2spLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTkRSRUwtQ0xJRU5UXVwiLCBlcnJvclRvVGhyb3cuc3RhY2spLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTkRSRUwtQ0xJRU5UXVwiLCBzYXZlZENvbW1hbmQub3JpZ2luU3RhY2sgPyBgQ29tbWFuZCBjcmVhdGVkIGF0OlxcbiR7c2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrfWAgOiBudWxsKVxuICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuXG4gICAgICAgICAgZXJyb3JUb1Rocm93LnN0YWNrID0gY29tYmluZWRTdGFja1xuXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlamVjdChlcnJvclRvVGhyb3cpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbYFJlc29sdmluZyBjb21tYW5kICR7Y29tbWFuZElEfSB3aXRoIGRhdGFgLCBkYXRhXSlcbiAgICAgICAgICBzYXZlZENvbW1hbmQucmVzb2x2ZShkYXRhLmRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogXCJTZXJ2ZXIgY29udHJvbCBpcyBkaXNhYmxlZFwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJnZXRfb2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyT2JqZWN0ID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZE9iamVjdChkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBjb25zdCBzZXJ2ZXJDbGFzcyA9IHRoaXMuX2dldFJlZ2lzdGVyZWRDbGFzcyhkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHNlcnZlck9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyT2JqZWN0XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmVyQ2xhc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlckNsYXNzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqZWN0ID0gZ2xvYmFsVGhpc1tkYXRhLm9iamVjdF9uYW1lXVxuXG4gICAgICAgICAgaWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggb2JqZWN0OiAke2RhdGEub2JqZWN0X25hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBvYmplY3RcbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWR9KVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRhdGEuY2xhc3NfbmFtZVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnN0IENsYXNzSW5zdGFuY2UgPSB0aGlzLmdldENsYXNzKGNsYXNzTmFtZSkgfHwgZ2xvYmFsVGhpc1tjbGFzc05hbWVdXG5cbiAgICAgICAgICBpZiAoIUNsYXNzSW5zdGFuY2UpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBjbGFzczogJHtjbGFzc05hbWV9YClcblxuICAgICAgICAgIG9iamVjdCA9IG5ldyBDbGFzc0luc3RhbmNlKC4uLmRhdGEuYXJncylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSBjbGFzcyBuYW1lOiAke3R5cGVvZiBjbGFzc05hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBvYmplY3RcbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWR9KVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBtZXRob2QgPSBvYmplY3RbZGF0YS5tZXRob2RfbmFtZV1cblxuICAgICAgICBpZiAoIW1ldGhvZCkgdGhyb3cgbmV3IEVycm9yKGBObyBtZXRob2QgY2FsbGVkICcke2RhdGEubWV0aG9kX25hbWV9JyBvbiBhICcke29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSdgKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG1ldGhvZC5jYWxsKG9iamVjdCwgLi4uZGF0YS5hcmdzKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXNwb25zZS50aGVuKHJlc3BvbmRXaXRoVmFsdWUpLmNhdGNoKChwcm9taXNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBwcm9taXNlRXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogcHJvbWlzZUVycm9yLnN0YWNrfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhwcm9taXNlRXJyb3IpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzYWZlSlNPTlN0cmluZ2lmeShvYmplY3QpXG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHNlcmlhbGl6ZWQpXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyZWFkX2F0dHJpYnV0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBkYXRhLmF0dHJpYnV0ZV9uYW1lXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3QgcmV0dXJuV2l0aCA9IGRhdGEud2l0aFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvYmplY3RbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAocmV0dXJuV2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gYXR0cmlidXRlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBhdHRyaWJ1dGV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJldmFsXCIpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uZFdpdGhSZXN1bHQgPSAoZXZhbFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGhfcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGV2YWxSZXN1bHRcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBldmFsUmVzdWx0fSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY29wZSA9IHsuLi50aGlzLl9vYmplY3RzLCAuLi50aGlzLl9jbGFzc2VzfVxuICAgICAgICBjb25zdCByZXNlcnZlZElkZW50aWZpZXJzID0gbmV3IFNldChbXG4gICAgICAgICAgXCJicmVha1wiLFxuICAgICAgICAgIFwiY2FzZVwiLFxuICAgICAgICAgIFwiY2F0Y2hcIixcbiAgICAgICAgICBcImNsYXNzXCIsXG4gICAgICAgICAgXCJjb25zdFwiLFxuICAgICAgICAgIFwiY29udGludWVcIixcbiAgICAgICAgICBcImRlYnVnZ2VyXCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCIsXG4gICAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgICBcImRvXCIsXG4gICAgICAgICAgXCJlbHNlXCIsXG4gICAgICAgICAgXCJleHBvcnRcIixcbiAgICAgICAgICBcImV4dGVuZHNcIixcbiAgICAgICAgICBcImZpbmFsbHlcIixcbiAgICAgICAgICBcImZvclwiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBcImlmXCIsXG4gICAgICAgICAgXCJpbXBvcnRcIixcbiAgICAgICAgICBcImluXCIsXG4gICAgICAgICAgXCJpbnN0YW5jZW9mXCIsXG4gICAgICAgICAgXCJuZXdcIixcbiAgICAgICAgICBcInJldHVyblwiLFxuICAgICAgICAgIFwic3VwZXJcIixcbiAgICAgICAgICBcInN3aXRjaFwiLFxuICAgICAgICAgIFwidGhpc1wiLFxuICAgICAgICAgIFwidGhyb3dcIixcbiAgICAgICAgICBcInRyeVwiLFxuICAgICAgICAgIFwidHlwZW9mXCIsXG4gICAgICAgICAgXCJ2YXJcIixcbiAgICAgICAgICBcInZvaWRcIixcbiAgICAgICAgICBcIndoaWxlXCIsXG4gICAgICAgICAgXCJ3aXRoXCIsXG4gICAgICAgICAgXCJ5aWVsZFwiLFxuICAgICAgICAgIFwibGV0XCIsXG4gICAgICAgICAgXCJlbnVtXCIsXG4gICAgICAgICAgXCJhd2FpdFwiLFxuICAgICAgICAgIFwiaW1wbGVtZW50c1wiLFxuICAgICAgICAgIFwicGFja2FnZVwiLFxuICAgICAgICAgIFwicHJvdGVjdGVkXCIsXG4gICAgICAgICAgXCJzdGF0aWNcIixcbiAgICAgICAgICBcImludGVyZmFjZVwiLFxuICAgICAgICAgIFwicHJpdmF0ZVwiLFxuICAgICAgICAgIFwicHVibGljXCIsXG4gICAgICAgICAgXCJldmFsXCJcbiAgICAgICAgXSlcblxuICAgICAgICBjb25zdCBpc1ZhbGlkSWRlbnRpZmllciA9IChuYW1lKSA9PlxuICAgICAgICAgIC9eKD86WyRfXXxcXHB7SURfU3RhcnR9KSg/OlskX118XFxwe0lEX0NvbnRpbnVlfSkqJC91LnRlc3QobmFtZSkgJiYgIXJlc2VydmVkSWRlbnRpZmllcnMuaGFzKG5hbWUpXG5cbiAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgIGNvbnN0IGludmFsaWRLZXlzID0gc2NvcGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhaXNWYWxpZElkZW50aWZpZXIoa2V5KSlcblxuICAgICAgICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWdpc3RlcmVkIGlkZW50aWZpZXIocyk6ICR7aW52YWxpZEtleXMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgcmVnaXN0ZXJlZCBvYmplY3RzL2NsYXNzZXMgYXJlIGF2YWlsYWJsZSBhcyBsb2NhbHMgaW5zaWRlIHRoZSBldmFsXG4gICAgICAgIGNvbnN0IGV2YWx1YXRvciA9IG5ldyBGdW5jdGlvbihcIl9fZXZhbFN0cmluZ1wiLCAuLi5zY29wZUtleXMsIFwicmV0dXJuIGV2YWwoX19ldmFsU3RyaW5nKVwiKVxuICAgICAgICBjb25zdCBldmFsUmVzdWx0ID0gZXZhbHVhdG9yKGRhdGEuZXZhbF9zdHJpbmcsIC4uLnNjb3BlS2V5cy5tYXAoKGtleSkgPT4gc2NvcGVba2V5XSkpXG5cbiAgICAgICAgaWYgKGV2YWxSZXN1bHQgJiYgdHlwZW9mIGV2YWxSZXN1bHQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBldmFsUmVzdWx0LnRoZW4ocmVzcG9uZFdpdGhSZXN1bHQpLmNhdGNoKChwcm9taXNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBwcm9taXNlRXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogcHJvbWlzZUVycm9yLnN0YWNrfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhwcm9taXNlRXJyb3IpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoUmVzdWx0KGV2YWxSZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogZXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogZXJyb3Iuc3RhY2t9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKGVycm9yKX0pXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyYXNlcyBhbiBhcmd1bWVudCBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplIGZvciB0cmFuc3BvcnRcbiAgICogQHJldHVybnMge2FueX0gU2VyaWFsaXplZCBhcmd1bWVudCBwYXlsb2FkXG4gICAqL1xuICBwYXJzZUFyZyhhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYXJnSW5BcnJheSkgPT4gdGhpcy5wYXJzZUFyZyhhcmdJbkFycmF5KSlcbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBhcmcuaWQsXG4gICAgICAgIF9fc2NvdW5kcmVsX3R5cGU6IFwicmVmZXJlbmNlXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XVxuXG4gICAgICAgIG5ld09iamVjdFtrZXldID0gdGhpcy5wYXJzZUFyZyh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgYXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInJlYWRfYXR0cmlidXRlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZV9uYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVmZXJlbmNlXCJcbiAgICB9KVxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBBdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIGFzeW5jIHJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJyZWFkX2F0dHJpYnV0ZVwiLCB7XG4gICAgICBhdHRyaWJ1dGVfbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlc3VsdFwiXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnl9IGNsYXNzSW5zdGFuY2UgQ2xhc3MgY29uc3RydWN0b3Igb3IgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyQ2xhc3MoY2xhc3NOYW1lLCBjbGFzc0luc3RhbmNlKSB7XG4gICAgaWYgKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSB0aHJvdyBuZXcgRXJyb3IoYENsYXNzIGFscmVhZHkgZXhpc3RzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdID0gY2xhc3NJbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCEoY2xhc3NOYW1lIGluIHRoaXMuX2NsYXNzZXMpKSB0aHJvdyBuZXcgRXJyb3IoYENsYXNzIGRvZXMgbm90IGV4aXN0OiAke2NsYXNzTmFtZX1gKVxuXG4gICAgZGVsZXRlIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBjbGFzcyBvciB1bmRlZmluZWRcbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBjbGFzcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnl9IG9iamVjdEluc3RhbmNlIE9iamVjdCBpbnN0YW5jZVxuICAgKi9cbiAgcmVnaXN0ZXJPYmplY3Qob2JqZWN0TmFtZSwgb2JqZWN0SW5zdGFuY2UpIHtcbiAgICBpZiAob2JqZWN0TmFtZSBpbiB0aGlzLl9vYmplY3RzKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBhbHJlYWR5IGV4aXN0czogJHtvYmplY3ROYW1lfWApXG5cbiAgICB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdID0gb2JqZWN0SW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhbiBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byByZW1vdmVcbiAgICovXG4gIHVucmVnaXN0ZXJPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGlmICghKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykpIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGRvZXMgbm90IGV4aXN0OiAke29iamVjdE5hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gbG9vayB1cFxuICAgKiBAcmV0dXJucyB7YW55fSBSZWdpc3RlcmVkIG9iamVjdCBvciB1bmRlZmluZWRcbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbmRzIHRvIGEgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tYW5kSWQgQ29tbWFuZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFJlc3BvbnNlIHBheWxvYWRcbiAgICovXG4gIHJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElkLCBkYXRhKSB7XG4gICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhOiB7Y29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhfX0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBiYWNrZW5kIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBDb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzcG9uc2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKi9cbiAgc2VuZENvbW1hbmQoY29tbWFuZCwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvdXRnb2luZ0NvbW1hbmRDb3VudCA9ICsrdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnRcbiAgICAgIGNvbnN0IG9yaWdpbkVycm9yID0gbmV3IEVycm9yKGBDb21tYW5kICcke2NvbW1hbmR9JyBkaXNwYXRjaGVkYClcbiAgICAgIC8vIFN0cmlwIHRoZSBzZW5kQ29tbWFuZCBmcmFtZSB0byBoaWdobGlnaHQgdGhlIGNhbGxlciBzaXRlLlxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvcmlnaW5FcnJvciwgdGhpcy5zZW5kQ29tbWFuZClcbiAgICAgIGNvbnN0IGNvbW1hbmREYXRhID0ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBjb21tYW5kX2lkOiBvdXRnb2luZ0NvbW1hbmRDb3VudCxcbiAgICAgICAgZGF0YVxuICAgICAgfVxuXG4gICAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNbb3V0Z29pbmdDb21tYW5kQ291bnRdID0ge3Jlc29sdmUsIHJlamVjdCwgb3JpZ2luU3RhY2s6IG9yaWdpbkVycm9yLnN0YWNrfVxuICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJTZW5kaW5nXCIsIGNvbW1hbmREYXRhXSlcbiAgICAgIHRoaXMuc2VuZChjb21tYW5kRGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGRhdGEgdG8gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgUGF5bG9hZCB0byBzZW5kXG4gICAqL1xuICBzZW5kKGRhdGEpIHtcbiAgICB0aGlzLmJhY2tlbmQuc2VuZChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUGFyc2VkIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZVJlZmVyZW5jZShyZWZlcmVuY2VJZCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwic2VyaWFsaXplX3JlZmVyZW5jZVwiLCB7cmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZH0pXG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyB7UmVmZXJlbmNlfSBSZWZlcmVuY2UgaW5zdGFuY2VcbiAgICovXG4gIHNwYXduUmVmZXJlbmNlKGlkKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSh0aGlzLCBpZClcblxuICAgIHRoaXMucmVmZXJlbmNlc1tpZF0gPSByZWZlcmVuY2VcblxuICAgIHJldHVybiByZWZlcmVuY2VcbiAgfVxuXG4gIGVuYWJsZVNlcnZlckNvbnRyb2woKSB7XG4gICAgdGhpcy5zZXJ2ZXJDb250cm9sRW5hYmxlZCA9IHRydWVcbiAgfVxufVxuIl19
@@ -9,11 +9,36 @@ export default class Reference {
9
9
  id: string;
10
10
  /**
11
11
  * Calls a method on the reference
12
+ * @overload
12
13
  * @param {string} methodName Method name to invoke
13
14
  * @param {...any} args Arguments to pass to the method
14
15
  * @returns {Promise<any>} Result from the method call
15
16
  */
16
17
  callMethod(methodName: string, ...args: any[]): Promise<any>;
18
+ /**
19
+ * Calls a method on the reference
20
+ * @overload
21
+ * @param {string} methodName Method name to invoke
22
+ * @param {{returnReference?: boolean, returnResult?: false}} options Options for the call
23
+ * @param {...any} args Arguments to pass to the method
24
+ * @returns {Promise<Reference>} Reference to the return value
25
+ */
26
+ callMethod(methodName: string, options: {
27
+ returnReference?: boolean;
28
+ returnResult?: false;
29
+ }, ...args: any[]): Promise<Reference>;
30
+ /**
31
+ * Calls a method on the reference
32
+ * @overload
33
+ * @param {string} methodName Method name to invoke
34
+ * @param {{returnResult: true, returnReference?: false}} options Options for the call
35
+ * @param {...any} args Arguments to pass to the method
36
+ * @returns {Promise<any>} Result from the method call
37
+ */
38
+ callMethod(methodName: string, options: {
39
+ returnResult: true;
40
+ returnReference?: false;
41
+ }, ...args: any[]): Promise<any>;
17
42
  /**
18
43
  * Calls a method on the reference using another reference as argument
19
44
  * @param {string} methodName Method name to invoke
@@ -1 +1 @@
1
- {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/client/reference.js"],"names":[],"mappings":"AAEA;IACE;;;;OAIG;IACH,oBAHW,GAAG,MACH,MAAM,EAOhB;IAJC,YAAoB;IACpB,WAAY;IAKd;;;;;OAKG;IACH,uBAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;;OAKG;IACH,oCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;;OAKG;IACH,6BAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;;OAKG;IACH,0CAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;OAGG;IACH,aAFa,OAAO,CAAC,GAAG,CAAC,CAIxB;CACF"}
1
+ {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/client/reference.js"],"names":[],"mappings":"AAEA;IACE;;;;OAIG;IACH,oBAHW,GAAG,MACH,MAAM,EAOhB;IAJC,YAAoB;IACpB,WAAY;;;;;;;;IAOX,uBACQ,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CACxB;;;;;;;;;IAGE,uBACQ,MAAM,WACN;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,KAAK,CAAA;KAAC,WAC7C,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAC9B;;;;;;;;;IAGE,uBACQ,MAAM,WACN;QAAC,YAAY,EAAE,IAAI,CAAC;QAAC,eAAe,CAAC,EAAE,KAAK,CAAA;KAAC,WACzC,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CACxB;IAYD;;;;;OAKG;IACH,oCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;;OAKG;IACH,6BAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;;OAKG;IACH,0CAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;OAGG;IACH,aAFa,OAAO,CAAC,GAAG,CAAC,CAIxB;CACF"}
@@ -13,12 +13,36 @@ export default class Reference {
13
13
  }
14
14
  /**
15
15
  * Calls a method on the reference
16
+ * @overload
16
17
  * @param {string} methodName Method name to invoke
17
18
  * @param {...any} args Arguments to pass to the method
18
19
  * @returns {Promise<any>} Result from the method call
19
20
  */
20
- async callMethod(methodName, ...args) {
21
- return await this.client.callMethodOnReference(this.id, methodName, ...args);
21
+ /**
22
+ * Calls a method on the reference
23
+ * @overload
24
+ * @param {string} methodName Method name to invoke
25
+ * @param {{returnReference?: boolean, returnResult?: false}} options Options for the call
26
+ * @param {...any} args Arguments to pass to the method
27
+ * @returns {Promise<Reference>} Reference to the return value
28
+ */
29
+ /**
30
+ * Calls a method on the reference
31
+ * @overload
32
+ * @param {string} methodName Method name to invoke
33
+ * @param {{returnResult: true, returnReference?: false}} options Options for the call
34
+ * @param {...any} args Arguments to pass to the method
35
+ * @returns {Promise<any>} Result from the method call
36
+ */
37
+ /**
38
+ * Calls a method on the reference
39
+ * @param {string} methodName Method name to invoke
40
+ * @param {any} [optionsOrArg] Options for the call or first argument
41
+ * @param {...any} args Arguments to pass to the method
42
+ * @returns {Promise<Reference | any>} Result or reference from the method call
43
+ */
44
+ async callMethod(methodName, optionsOrArg, ...args) {
45
+ return await this.client.callMethodOnReference(this.id, methodName, optionsOrArg, ...args);
22
46
  }
23
47
  /**
24
48
  * Calls a method on the reference using another reference as argument
@@ -27,7 +51,7 @@ export default class Reference {
27
51
  * @returns {Promise<any>} Result from the method call
28
52
  */
29
53
  async callMethodWithReference(methodName, ...args) {
30
- return await this.client.callMethodOnReferenceWithReference(this.id, methodName, ...args);
54
+ return await this.client.callMethodOnReference(this.id, methodName, { returnReference: true }, ...args);
31
55
  }
32
56
  /**
33
57
  * Reads an attribute from the reference
@@ -55,4 +79,4 @@ export default class Reference {
55
79
  return await this.client.serializeReference(this.id);
56
80
  }
57
81
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9yZWZlcmVuY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE1BQU0sQ0FBQyxPQUFPLE9BQU8sU0FBUztJQUM1Qjs7OztPQUlHO0lBQ0gsWUFBWSxNQUFNLEVBQUUsRUFBRTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUVaLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSTtRQUMvQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSTtRQUN4QyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3BGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLEVBQUUsR0FBRyxJQUFJO1FBQ3JELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3RELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZlcmVuY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBSZWZlcmVuY2VcbiAgICogQHBhcmFtIHthbnl9IGNsaWVudCBUaGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgcmVmZXJlbmNlIElEXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGlkKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmlkID0gaWRcblxuICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBJRCBnaXZlbjogJHtpZH1gKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZChtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGxNZXRob2RPblJlZmVyZW5jZSh0aGlzLmlkLCBtZXRob2ROYW1lLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSByZWZlcmVuY2UgdXNpbmcgYW5vdGhlciByZWZlcmVuY2UgYXMgYXJndW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZFdpdGhSZWZlcmVuY2UobWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsTWV0aG9kT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHRoaXMuaWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIGZyb20gdGhlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBBdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIGFzeW5jIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2UodGhpcy5pZCwgYXR0cmlidXRlTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVmZXJlbmNlIHVzaW5nIGFub3RoZXIgcmVmZXJlbmNlIGFzIGFyZ3VtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZVdpdGhSZWZlcmVuY2UoYXR0cmlidXRlTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHRoaXMuaWQsIGF0dHJpYnV0ZU5hbWUsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUGFyc2VkIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuc2VyaWFsaXplUmVmZXJlbmNlKHRoaXMuaWQpXG4gIH1cbn1cbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9yZWZlcmVuY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE1BQU0sQ0FBQyxPQUFPLE9BQU8sU0FBUztJQUM1Qjs7OztPQUlHO0lBQ0gsWUFBWSxNQUFNLEVBQUUsRUFBRTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUVaLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0g7Ozs7Ozs7T0FPRztJQUNIOzs7Ozs7O09BT0c7SUFDSDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJO1FBQ2hELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQzVGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJO1FBQy9DLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUMsZUFBZSxFQUFFLElBQUksRUFBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7SUFDdkcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxJQUFJO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLDBCQUEwQixDQUFDLGFBQWEsRUFBRSxHQUFHLElBQUk7UUFDckQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUNqRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVM7UUFDYixPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDdEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge2FueX0gY2xpZW50IFRoZSBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSByZWZlcmVuY2UgSURcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgaWQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIElEIGdpdmVuOiAke2lkfWApXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gdGhlIHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge3tyZXR1cm5SZWZlcmVuY2U/OiBib29sZWFuLCByZXR1cm5SZXN1bHQ/OiBmYWxzZX19IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiB0aGUgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHt7cmV0dXJuUmVzdWx0OiB0cnVlLCByZXR1cm5SZWZlcmVuY2U/OiBmYWxzZX19IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gdGhlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHthbnl9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSBjYWxsIG9yIGZpcnN0IGFyZ3VtZW50XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IGFueT59IFJlc3VsdCBvciByZWZlcmVuY2UgZnJvbSB0aGUgbWV0aG9kIGNhbGxcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2QobWV0aG9kTmFtZSwgb3B0aW9uc09yQXJnLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGxNZXRob2RPblJlZmVyZW5jZSh0aGlzLmlkLCBtZXRob2ROYW1lLCBvcHRpb25zT3JBcmcsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gdGhlIHJlZmVyZW5jZSB1c2luZyBhbm90aGVyIHJlZmVyZW5jZSBhcyBhcmd1bWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kV2l0aFJlZmVyZW5jZShtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGxNZXRob2RPblJlZmVyZW5jZSh0aGlzLmlkLCBtZXRob2ROYW1lLCB7cmV0dXJuUmVmZXJlbmNlOiB0cnVlfSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSh0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSByZWZlcmVuY2UgdXNpbmcgYW5vdGhlciByZWZlcmVuY2UgYXMgYXJndW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlV2l0aFJlZmVyZW5jZShhdHRyaWJ1dGVOYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UodGhpcy5pZCwgYXR0cmlidXRlTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQYXJzZWQgSlNPTiByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5zZXJpYWxpemVSZWZlcmVuY2UodGhpcy5pZClcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scoundrel-remote-eval",
3
3
  "type": "module",
4
- "version": "1.0.19",
4
+ "version": "1.0.20",
5
5
  "description": "",
6
6
  "main": "build/index.js",
7
7
  "types": "build/index.d.ts",
@@ -35,7 +35,7 @@
35
35
  "@types/jasmine": "^5.1.13",
36
36
  "@types/node": "^25.0.2",
37
37
  "eslint": "^9.39.2",
38
- "eslint-plugin-jsdoc": "^50.6.0",
38
+ "eslint-plugin-jsdoc": "^61.5.0",
39
39
  "globals": "^16.5.0",
40
40
  "jasmine": "^5.1.0",
41
41
  "typescript": "^5.9.3"