scoundrel-remote-eval 1.0.19 → 1.0.21
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 +136 -11
- package/build/client/index.d.ts +148 -11
- package/build/client/index.d.ts.map +1 -1
- package/build/client/index.js +367 -32
- package/build/client/reference-proxy.d.ts +19 -1
- package/build/client/reference-proxy.d.ts.map +1 -1
- package/build/client/reference-proxy.js +37 -5
- package/build/client/reference.d.ts +27 -14
- package/build/client/reference.d.ts.map +1 -1
- package/build/client/reference.js +34 -18
- package/package.json +2 -2
package/build/client/index.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import Logger from "../logger.js";
|
|
3
3
|
import Reference from "./reference.js";
|
|
4
|
+
import referenceProxy from "./reference-proxy.js";
|
|
4
5
|
import safeJSONStringify from "../utils/safe-json-stringify.js";
|
|
5
6
|
const logger = new Logger("Scoundrel Client");
|
|
7
|
+
/** @typedef {import("./reference-proxy.js").Proxy} Proxy */
|
|
6
8
|
// logger.setDebug(true)
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {{reference?: boolean, result?: boolean, proxy?: boolean}} ReturnOptions
|
|
11
|
+
* @typedef {ReturnOptions & {result?: false}} ReturnReferenceOptions
|
|
12
|
+
* @typedef {ReturnOptions & {result: true, reference?: false}} ReturnResultOptions
|
|
13
|
+
*/
|
|
7
14
|
export default class Client {
|
|
8
15
|
/**
|
|
9
16
|
* Creates a new Scoundrel Client
|
|
@@ -285,18 +292,98 @@ export default class Client {
|
|
|
285
292
|
}
|
|
286
293
|
/**
|
|
287
294
|
* Calls a method on a reference and returns the result directly
|
|
295
|
+
* @overload
|
|
288
296
|
* @param {number} referenceId Reference identifier
|
|
289
297
|
* @param {string} methodName Method name to invoke
|
|
290
298
|
* @param {...any} args Arguments to pass to the method
|
|
291
299
|
* @returns {Promise<any>} Result from the method call
|
|
292
300
|
*/
|
|
293
|
-
|
|
301
|
+
/**
|
|
302
|
+
* Calls a method on a reference and returns a new reference
|
|
303
|
+
* @overload
|
|
304
|
+
* @param {number} referenceId Reference identifier
|
|
305
|
+
* @param {string} methodName Method name to invoke
|
|
306
|
+
* @param {ReturnReferenceOptions} options Options for the call
|
|
307
|
+
* @param {...any} args Arguments to pass to the method
|
|
308
|
+
* @returns {Promise<Reference | Proxy>} Reference or proxy to the returned value
|
|
309
|
+
*/
|
|
310
|
+
/**
|
|
311
|
+
* Calls a method on a reference and returns the result directly
|
|
312
|
+
* @overload
|
|
313
|
+
* @param {number} referenceId Reference identifier
|
|
314
|
+
* @param {string} methodName Method name to invoke
|
|
315
|
+
* @param {ReturnResultOptions} options Options for the call
|
|
316
|
+
* @param {...any} args Arguments to pass to the method
|
|
317
|
+
* @returns {Promise<any>} Result from the method call
|
|
318
|
+
*/
|
|
319
|
+
/**
|
|
320
|
+
* Calls a method on a reference and returns the result directly
|
|
321
|
+
* @param {number} referenceId Reference identifier
|
|
322
|
+
* @param {string} methodName Method name to invoke
|
|
323
|
+
* @param {ReturnOptions | any} [optionsOrArg] Options for the call or first argument
|
|
324
|
+
* @param {...any} args Arguments to pass to the method
|
|
325
|
+
* @returns {Promise<Reference | Proxy | any>} Result or reference from the method call
|
|
326
|
+
*/
|
|
327
|
+
async callMethodOnReference(referenceId, methodName, optionsOrArg, ...args) {
|
|
328
|
+
const allowedOptions = new Set(["reference", "result", "proxy"]);
|
|
329
|
+
/** @type {ReturnOptions | undefined} */
|
|
330
|
+
let options;
|
|
331
|
+
/** @type {any[]} */
|
|
332
|
+
let methodArgs;
|
|
333
|
+
if (typeof optionsOrArg === "undefined") {
|
|
334
|
+
methodArgs = args;
|
|
335
|
+
}
|
|
336
|
+
else if (this.isPlainObject(optionsOrArg)) {
|
|
337
|
+
const optionKeys = Object.keys(optionsOrArg);
|
|
338
|
+
const hasOptionKey = optionKeys.some((key) => allowedOptions.has(key));
|
|
339
|
+
if (hasOptionKey) {
|
|
340
|
+
const unknownOptions = optionKeys.filter((key) => !allowedOptions.has(key));
|
|
341
|
+
if (unknownOptions.length === 0) {
|
|
342
|
+
const optionValuesAreBoolean = optionKeys
|
|
343
|
+
.filter((key) => allowedOptions.has(key))
|
|
344
|
+
.every((key) => typeof optionsOrArg[key] === "boolean");
|
|
345
|
+
if (optionValuesAreBoolean) {
|
|
346
|
+
options = /** @type {ReturnOptions} */ (optionsOrArg);
|
|
347
|
+
methodArgs = args;
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
methodArgs = [optionsOrArg, ...args];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
throw new Error(`Unknown callMethodOnReference options: ${unknownOptions.join(", ")}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
methodArgs = [optionsOrArg, ...args];
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
methodArgs = [optionsOrArg, ...args];
|
|
363
|
+
}
|
|
364
|
+
const returnReference = options?.reference === true;
|
|
365
|
+
const returnResult = options?.result === true;
|
|
366
|
+
const returnProxy = options?.proxy === true;
|
|
367
|
+
const returnFlags = [returnReference, returnResult, returnProxy].filter(Boolean).length;
|
|
368
|
+
if (returnFlags > 1) {
|
|
369
|
+
throw new Error("callMethodOnReference options reference, result, and proxy are mutually exclusive");
|
|
370
|
+
}
|
|
371
|
+
const withReference = returnReference || returnProxy;
|
|
294
372
|
const result = await this.sendCommand("call_method_on_reference", {
|
|
295
|
-
args: this.parseArg(
|
|
373
|
+
args: this.parseArg(methodArgs),
|
|
296
374
|
method_name: methodName,
|
|
297
375
|
reference_id: referenceId,
|
|
298
|
-
with: "result"
|
|
376
|
+
with: withReference ? "reference" : "result"
|
|
299
377
|
});
|
|
378
|
+
if (!result)
|
|
379
|
+
throw new Error("Blank result given");
|
|
380
|
+
if (withReference) {
|
|
381
|
+
const objectId = result.response;
|
|
382
|
+
if (!objectId)
|
|
383
|
+
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
384
|
+
const spawnedReference = this.spawnReference(objectId);
|
|
385
|
+
return returnProxy ? referenceProxy(spawnedReference) : spawnedReference;
|
|
386
|
+
}
|
|
300
387
|
return result.response;
|
|
301
388
|
}
|
|
302
389
|
/**
|
|
@@ -307,21 +394,39 @@ export default class Client {
|
|
|
307
394
|
* @returns {Promise<Reference>} Reference to the return value
|
|
308
395
|
*/
|
|
309
396
|
async callMethodOnReferenceWithReference(referenceId, methodName, ...args) {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
397
|
+
console.warn("Scoundrel Client", "callMethodOnReferenceWithReference is deprecated; use callMethodOnReference with reference instead.");
|
|
398
|
+
return this.callMethodOnReference(referenceId, methodName, { reference: true }, ...args);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Evaluates a string and returns a proxy
|
|
402
|
+
* @param {string} evalString Code to evaluate
|
|
403
|
+
* @returns {Promise<Proxy>} Proxy to the evaluated value
|
|
404
|
+
*/
|
|
405
|
+
async eval(evalString) {
|
|
406
|
+
if (typeof evalString !== "string") {
|
|
407
|
+
throw new Error("eval requires an eval string");
|
|
408
|
+
}
|
|
409
|
+
const result = await this.sendCommand("eval", {
|
|
410
|
+
eval_string: evalString,
|
|
411
|
+
with_reference: true
|
|
315
412
|
});
|
|
316
|
-
|
|
317
|
-
|
|
413
|
+
if (!result)
|
|
414
|
+
throw new Error("Blank result given");
|
|
415
|
+
const objectId = result.object_id;
|
|
416
|
+
if (!objectId)
|
|
417
|
+
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
418
|
+
const spawnedReference = this.spawnReference(objectId);
|
|
419
|
+
return referenceProxy(spawnedReference);
|
|
318
420
|
}
|
|
319
421
|
/**
|
|
320
|
-
* Evaluates a string and returns a
|
|
422
|
+
* Evaluates a string and returns a reference
|
|
321
423
|
* @param {string} evalString Code to evaluate
|
|
322
424
|
* @returns {Promise<Reference>} Reference to the evaluated value
|
|
323
425
|
*/
|
|
324
|
-
async
|
|
426
|
+
async evalReference(evalString) {
|
|
427
|
+
if (typeof evalString !== "string") {
|
|
428
|
+
throw new Error("evalReference requires an eval string");
|
|
429
|
+
}
|
|
325
430
|
const result = await this.sendCommand("eval", {
|
|
326
431
|
eval_string: evalString,
|
|
327
432
|
with_reference: true
|
|
@@ -333,12 +438,53 @@ export default class Client {
|
|
|
333
438
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
334
439
|
return this.spawnReference(objectId);
|
|
335
440
|
}
|
|
441
|
+
/**
|
|
442
|
+
* Evaluates a string and returns the result directly
|
|
443
|
+
* @param {string} evalString Code to evaluate
|
|
444
|
+
* @returns {Promise<any>} Evaluated result
|
|
445
|
+
*/
|
|
446
|
+
async evalResult(evalString) {
|
|
447
|
+
if (typeof evalString !== "string") {
|
|
448
|
+
throw new Error("evalResult requires an eval string");
|
|
449
|
+
}
|
|
450
|
+
const result = await this.sendCommand("eval", {
|
|
451
|
+
eval_string: evalString,
|
|
452
|
+
with_reference: false
|
|
453
|
+
});
|
|
454
|
+
if (!result)
|
|
455
|
+
throw new Error("Blank result given");
|
|
456
|
+
if (!("response" in result))
|
|
457
|
+
throw new Error(`No response given in result: ${JSON.stringify(result)}`);
|
|
458
|
+
return result.response;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Imports a module and returns a proxy to it
|
|
462
|
+
* @param {string} importName Module name to import
|
|
463
|
+
* @returns {Promise<Proxy>} Proxy to the module
|
|
464
|
+
*/
|
|
465
|
+
async import(importName) {
|
|
466
|
+
if (typeof importName !== "string")
|
|
467
|
+
throw new Error("import requires a module name");
|
|
468
|
+
const result = await this.sendCommand("import", {
|
|
469
|
+
import_name: importName
|
|
470
|
+
});
|
|
471
|
+
logger.log(() => ["import", { result }]);
|
|
472
|
+
if (!result)
|
|
473
|
+
throw new Error("No result given");
|
|
474
|
+
if (!result.object_id)
|
|
475
|
+
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
476
|
+
const id = result.object_id;
|
|
477
|
+
const spawnedReference = this.spawnReference(id);
|
|
478
|
+
return referenceProxy(spawnedReference);
|
|
479
|
+
}
|
|
336
480
|
/**
|
|
337
481
|
* Imports a module and returns a reference to it
|
|
338
482
|
* @param {string} importName Module name to import
|
|
339
483
|
* @returns {Promise<Reference>} Reference to the module
|
|
340
484
|
*/
|
|
341
|
-
async
|
|
485
|
+
async importReference(importName) {
|
|
486
|
+
if (typeof importName !== "string")
|
|
487
|
+
throw new Error("importReference requires a module name");
|
|
342
488
|
const result = await this.sendCommand("import", {
|
|
343
489
|
import_name: importName
|
|
344
490
|
});
|
|
@@ -351,11 +497,31 @@ export default class Client {
|
|
|
351
497
|
return this.spawnReference(id);
|
|
352
498
|
}
|
|
353
499
|
/**
|
|
354
|
-
*
|
|
500
|
+
* Imports a module and returns the serialized result
|
|
501
|
+
* @param {string} importName Module name to import
|
|
502
|
+
* @returns {Promise<any>} Serialized result for the module
|
|
503
|
+
*/
|
|
504
|
+
async importResult(importName) {
|
|
505
|
+
const reference = await this.importReference(importName);
|
|
506
|
+
return await reference.serialize();
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Gets a registered object by name and returns a proxy
|
|
355
510
|
* @param {string} objectName Registered object name
|
|
356
|
-
* @returns {Promise<
|
|
511
|
+
* @returns {Promise<Proxy>} Proxy to the object
|
|
357
512
|
*/
|
|
358
513
|
async getObject(objectName) {
|
|
514
|
+
const reference = await this.getObjectReference(objectName);
|
|
515
|
+
return referenceProxy(reference);
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Gets a registered object by name and returns a reference
|
|
519
|
+
* @param {string} objectName Registered object name
|
|
520
|
+
* @returns {Promise<Reference>} Reference to the object
|
|
521
|
+
*/
|
|
522
|
+
async getObjectReference(objectName) {
|
|
523
|
+
if (typeof objectName !== "string")
|
|
524
|
+
throw new Error("getObjectReference requires an object name");
|
|
359
525
|
const result = await this.sendCommand("get_object", {
|
|
360
526
|
object_name: objectName
|
|
361
527
|
});
|
|
@@ -365,12 +531,44 @@ export default class Client {
|
|
|
365
531
|
return this.spawnReference(id);
|
|
366
532
|
}
|
|
367
533
|
/**
|
|
368
|
-
*
|
|
534
|
+
* Gets a registered object by name and returns the serialized result
|
|
535
|
+
* @param {string} objectName Registered object name
|
|
536
|
+
* @returns {Promise<any>} Serialized result for the object
|
|
537
|
+
*/
|
|
538
|
+
async getObjectResult(objectName) {
|
|
539
|
+
const reference = await this.getObjectReference(objectName);
|
|
540
|
+
return await reference.serialize();
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Spawns a new reference to an object and returns a proxy
|
|
544
|
+
* @param {string} className Class name to construct
|
|
545
|
+
* @param {...any} args Constructor arguments
|
|
546
|
+
* @returns {Promise<Proxy>} Proxy to the new instance
|
|
547
|
+
*/
|
|
548
|
+
async newObject(className, ...args) {
|
|
549
|
+
if (typeof className !== "string")
|
|
550
|
+
throw new Error("newObject requires a class name");
|
|
551
|
+
const result = await this.sendCommand("new_object_with_reference", {
|
|
552
|
+
args: this.parseArg(args),
|
|
553
|
+
class_name: className
|
|
554
|
+
});
|
|
555
|
+
if (!result)
|
|
556
|
+
throw new Error("Blank result given");
|
|
557
|
+
const id = result.object_id;
|
|
558
|
+
if (!id)
|
|
559
|
+
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
560
|
+
const spawnedReference = this.spawnReference(id);
|
|
561
|
+
return referenceProxy(spawnedReference);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Spawns a new reference to an object and returns a reference
|
|
369
565
|
* @param {string} className Class name to construct
|
|
370
566
|
* @param {...any} args Constructor arguments
|
|
371
567
|
* @returns {Promise<Reference>} Reference to the new instance
|
|
372
568
|
*/
|
|
373
|
-
async
|
|
569
|
+
async newObjectReference(className, ...args) {
|
|
570
|
+
if (typeof className !== "string")
|
|
571
|
+
throw new Error("newObjectReference requires a class name");
|
|
374
572
|
const result = await this.sendCommand("new_object_with_reference", {
|
|
375
573
|
args: this.parseArg(args),
|
|
376
574
|
class_name: className
|
|
@@ -382,6 +580,16 @@ export default class Client {
|
|
|
382
580
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
383
581
|
return this.spawnReference(id);
|
|
384
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Spawns a new reference to an object and returns the serialized result
|
|
585
|
+
* @param {string} className Class name to construct
|
|
586
|
+
* @param {...any} args Constructor arguments
|
|
587
|
+
* @returns {Promise<any>} Serialized result for the new instance
|
|
588
|
+
*/
|
|
589
|
+
async newObjectResult(className, ...args) {
|
|
590
|
+
const reference = await this.newObjectReference(className, ...args);
|
|
591
|
+
return await reference.serialize();
|
|
592
|
+
}
|
|
385
593
|
/**
|
|
386
594
|
* Checks if the input is a plain object
|
|
387
595
|
* @param {any} input Value to inspect
|
|
@@ -421,32 +629,159 @@ export default class Client {
|
|
|
421
629
|
}
|
|
422
630
|
/**
|
|
423
631
|
* Reads an attribute on a reference and returns a new reference
|
|
632
|
+
* @overload
|
|
424
633
|
* @param {number} referenceId Reference identifier
|
|
425
|
-
* @param {string} attributeName Attribute name to read
|
|
634
|
+
* @param {string | number} attributeName Attribute name to read
|
|
426
635
|
* @returns {Promise<Reference>} Reference to the attribute value
|
|
427
636
|
*/
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
637
|
+
/**
|
|
638
|
+
* Reads an attribute on a reference and returns a new reference
|
|
639
|
+
* @overload
|
|
640
|
+
* @param {number} referenceId Reference identifier
|
|
641
|
+
* @param {string | number} attributeName Attribute name to read
|
|
642
|
+
* @param {ReturnReferenceOptions} optionsOrArg Options for the read
|
|
643
|
+
* @returns {Promise<Reference | Proxy>} Reference or proxy to the attribute value
|
|
644
|
+
*/
|
|
645
|
+
/**
|
|
646
|
+
* Reads an attribute on a reference and returns the result directly
|
|
647
|
+
* @overload
|
|
648
|
+
* @param {number} referenceId Reference identifier
|
|
649
|
+
* @param {string | number} attributeName Attribute name to read
|
|
650
|
+
* @param {ReturnResultOptions} optionsOrArg Options for the read
|
|
651
|
+
* @returns {Promise<any>} Attribute value
|
|
652
|
+
*/
|
|
653
|
+
/**
|
|
654
|
+
* Reads an attribute on a reference and returns a new reference
|
|
655
|
+
* @param {number} referenceId Reference identifier
|
|
656
|
+
* @param {string | number} attributeName Attribute name to read
|
|
657
|
+
* @param {ReturnOptions} [optionsOrArg] Options for the read
|
|
658
|
+
* @returns {Promise<Reference | Proxy | any>} Reference, proxy, or result
|
|
659
|
+
*/
|
|
660
|
+
async readAttributeOnReferenceWithReference(referenceId, attributeName, optionsOrArg) {
|
|
661
|
+
const allowedOptions = new Set(["reference", "result", "proxy"]);
|
|
662
|
+
/** @type {ReturnOptions} */
|
|
663
|
+
let options = { reference: true };
|
|
664
|
+
if (typeof optionsOrArg === "undefined") {
|
|
665
|
+
options = { reference: true };
|
|
666
|
+
}
|
|
667
|
+
else if (this.isPlainObject(optionsOrArg)) {
|
|
668
|
+
const optionKeys = Object.keys(optionsOrArg);
|
|
669
|
+
const hasOptionKey = optionKeys.some((key) => allowedOptions.has(key));
|
|
670
|
+
if (hasOptionKey) {
|
|
671
|
+
const unknownOptions = optionKeys.filter((key) => !allowedOptions.has(key));
|
|
672
|
+
if (unknownOptions.length === 0) {
|
|
673
|
+
const hasExplicitReturn = Object.prototype.hasOwnProperty.call(optionsOrArg, "reference")
|
|
674
|
+
|| Object.prototype.hasOwnProperty.call(optionsOrArg, "result")
|
|
675
|
+
|| Object.prototype.hasOwnProperty.call(optionsOrArg, "proxy");
|
|
676
|
+
options = /** @type {ReturnOptions} */ ({
|
|
677
|
+
...(hasExplicitReturn ? {} : { reference: true }),
|
|
678
|
+
...optionsOrArg
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
else {
|
|
682
|
+
throw new Error(`Unknown readAttributeOnReferenceWithReference options: ${unknownOptions.join(", ")}`);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
else {
|
|
686
|
+
throw new Error("readAttributeOnReferenceWithReference does not accept positional arguments");
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
throw new Error("readAttributeOnReferenceWithReference does not accept positional arguments");
|
|
691
|
+
}
|
|
692
|
+
const returnReference = options?.reference === true;
|
|
693
|
+
const returnResult = options?.result === true;
|
|
694
|
+
const returnProxy = options?.proxy === true;
|
|
695
|
+
const returnFlags = [returnReference, returnResult, returnProxy].filter(Boolean).length;
|
|
696
|
+
if (returnFlags > 1) {
|
|
697
|
+
throw new Error("readAttributeOnReferenceWithReference options reference, result, and proxy are mutually exclusive");
|
|
698
|
+
}
|
|
699
|
+
return this.readAttributeOnReference(referenceId, options, attributeName);
|
|
436
700
|
}
|
|
437
701
|
/**
|
|
438
702
|
* Reads an attribute on a reference and returns the result directly
|
|
703
|
+
* @overload
|
|
704
|
+
* @param {number} referenceId Reference identifier
|
|
705
|
+
* @param {string | number} attributeName Attribute name to read
|
|
706
|
+
* @returns {Promise<any>} Attribute value
|
|
707
|
+
*/
|
|
708
|
+
/**
|
|
709
|
+
* Reads an attribute on a reference and returns a new reference
|
|
710
|
+
* @overload
|
|
711
|
+
* @param {number} referenceId Reference identifier
|
|
712
|
+
* @param {ReturnReferenceOptions} options Options for the read
|
|
713
|
+
* @param {string | number} attributeName Attribute name to read
|
|
714
|
+
* @returns {Promise<Reference | Proxy>} Reference or proxy to the attribute value
|
|
715
|
+
*/
|
|
716
|
+
/**
|
|
717
|
+
* Reads an attribute on a reference and returns a result or reference
|
|
718
|
+
* @overload
|
|
719
|
+
* @param {number} referenceId Reference identifier
|
|
720
|
+
* @param {ReturnOptions} options Options for the read
|
|
721
|
+
* @param {string | number} attributeName Attribute name to read
|
|
722
|
+
* @returns {Promise<Reference | Proxy | any>} Attribute value or reference
|
|
723
|
+
*/
|
|
724
|
+
/**
|
|
725
|
+
* Reads an attribute on a reference and returns the result directly
|
|
726
|
+
* @overload
|
|
439
727
|
* @param {number} referenceId Reference identifier
|
|
440
|
-
* @param {
|
|
728
|
+
* @param {ReturnResultOptions} options Options for the read
|
|
729
|
+
* @param {string | number} attributeName Attribute name to read
|
|
441
730
|
* @returns {Promise<any>} Attribute value
|
|
442
731
|
*/
|
|
443
|
-
|
|
732
|
+
/**
|
|
733
|
+
* Reads an attribute on a reference and returns the result directly
|
|
734
|
+
* @param {number} referenceId Reference identifier
|
|
735
|
+
* @param {string | number | ReturnOptions} attributeNameOrOptions Attribute name or options
|
|
736
|
+
* @param {string | number} [attributeName] Attribute name when using options
|
|
737
|
+
* @returns {Promise<Reference | Proxy | any>} Attribute value or reference
|
|
738
|
+
*/
|
|
739
|
+
async readAttributeOnReference(referenceId, attributeNameOrOptions, attributeName) {
|
|
740
|
+
const allowedOptions = new Set(["reference", "result", "proxy"]);
|
|
741
|
+
/** @type {ReturnOptions | undefined} */
|
|
742
|
+
let options;
|
|
743
|
+
/** @type {string | number | undefined} */
|
|
744
|
+
let targetAttributeName = attributeName;
|
|
745
|
+
if (this.isPlainObject(attributeNameOrOptions)) {
|
|
746
|
+
const optionKeys = Object.keys(attributeNameOrOptions);
|
|
747
|
+
const hasOptionKey = optionKeys.some((key) => allowedOptions.has(key));
|
|
748
|
+
if (hasOptionKey) {
|
|
749
|
+
const unknownOptions = optionKeys.filter((key) => !allowedOptions.has(key));
|
|
750
|
+
if (unknownOptions.length === 0) {
|
|
751
|
+
options = /** @type {ReturnOptions} */ (attributeNameOrOptions);
|
|
752
|
+
}
|
|
753
|
+
else {
|
|
754
|
+
throw new Error(`Unknown readAttributeOnReference options: ${unknownOptions.join(", ")}`);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
targetAttributeName = /** @type {string | number} */ (attributeNameOrOptions);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
else {
|
|
762
|
+
targetAttributeName = /** @type {string | number} */ (attributeNameOrOptions);
|
|
763
|
+
}
|
|
764
|
+
if (typeof targetAttributeName === "undefined") {
|
|
765
|
+
throw new Error("readAttributeOnReference requires an attribute name");
|
|
766
|
+
}
|
|
767
|
+
const returnReference = options?.reference === true;
|
|
768
|
+
const returnResult = options?.result === true;
|
|
769
|
+
const returnProxy = options?.proxy === true;
|
|
770
|
+
const returnFlags = [returnReference, returnResult, returnProxy].filter(Boolean).length;
|
|
771
|
+
if (returnFlags > 1) {
|
|
772
|
+
throw new Error("readAttributeOnReference options reference, result, and proxy are mutually exclusive");
|
|
773
|
+
}
|
|
774
|
+
const withReference = returnReference || returnProxy;
|
|
444
775
|
const result = await this.sendCommand("read_attribute", {
|
|
445
|
-
attribute_name:
|
|
776
|
+
attribute_name: targetAttributeName,
|
|
446
777
|
reference_id: referenceId,
|
|
447
|
-
with: "result"
|
|
778
|
+
with: withReference ? "reference" : "result"
|
|
448
779
|
});
|
|
449
|
-
|
|
780
|
+
if (!withReference)
|
|
781
|
+
return result.response;
|
|
782
|
+
const id = result.response;
|
|
783
|
+
const spawnedReference = this.spawnReference(id);
|
|
784
|
+
return returnProxy ? referenceProxy(spawnedReference) : spawnedReference;
|
|
450
785
|
}
|
|
451
786
|
/**
|
|
452
787
|
* Registers a class by name
|
|
@@ -571,4 +906,4 @@ export default class Client {
|
|
|
571
906
|
this.serverControlEnabled = true;
|
|
572
907
|
}
|
|
573
908
|
}
|
|
574
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRTdDLHdCQUF3QjtBQUV4QixNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDekI7Ozs7T0FJRztJQUNILFlBQVksT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBa0tqQzs7Ozs7Ozs7V0FRRztRQUNILGNBQVMsR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxRQUFRLEVBQUMsRUFBRSxFQUFFO1lBQ3JGLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQTtZQUV4RixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDdEYsQ0FBQztxQkFBTSxJQUFJLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzt3QkFDMUMs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QkFDUCxVQUFVLEVBQUUsb0JBQW9CO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQTtZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBQyxDQUFBO1lBQy9GLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxJQUFJO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVztRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUV2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsRUFBRTtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUUvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gXCIuL3JlZmVyZW5jZS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2NvdW5kcmVsIENsaWVudFwiKVxuXG4vLyBsb2dnZXIuc2V0RGVidWcodHJ1ZSlcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2NvdW5kcmVsIENsaWVudFxuICAgKiBAcGFyYW0ge2FueX0gYmFja2VuZCBUaGUgYmFja2VuZCBjb25uZWN0aW9uIChlLmcuLCBXZWJTb2NrZXQpXG4gICAqIEBwYXJhbSB7e2VuYWJsZVNlcnZlckNvbnRyb2w/OiBib29sZWFufX0gW29wdGlvbnNdIENsaWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmRcbiAgICB0aGlzLmJhY2tlbmQub25Db21tYW5kKHRoaXMub25Db21tYW5kKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5pbmNvbWluZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9jbGFzc2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9vYmplY3RzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPn0gKi9cbiAgICB0aGlzLnJlZmVyZW5jZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub2JqZWN0cyA9IHt9XG5cbiAgICB0aGlzLm9iamVjdHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gQm9vbGVhbihvcHRpb25zLmVuYWJsZVNlcnZlckNvbnRyb2wpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5iYWNrZW5kLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIG1ldGhvZF9uYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVmZXJlbmNlXCJcbiAgICB9KVxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGV2YWxXaXRoUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgbW9kdWxlXG4gICAqL1xuICBhc3luYyBpbXBvcnQoaW1wb3J0TmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJpbXBvcnRcIiwge1xuICAgICAgaW1wb3J0X25hbWU6IGltcG9ydE5hbWVcbiAgICB9KVxuXG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJpbXBvcnRcIiwge3Jlc3VsdH1dKVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3VsdCBnaXZlblwiKVxuICAgIGlmICghcmVzdWx0Lm9iamVjdF9pZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgUmVnaXN0ZXJlZCBvYmplY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0V2l0aFJlZmVyZW5jZShjbGFzc05hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgICogQHBhcmFtIHthbnl9IGlucHV0IFZhbHVlIHRvIGluc3BlY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3RcbiAgICovXG4gIGlzUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGluY29taW5nIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyBDb21tYW5kIHBheWxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY29tbWFuZF9pZCBDb21tYW5kIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZGF0YSBDb21tYW5kIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yXSBFcnJvciBtZXNzYWdlIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yU3RhY2tdIEVycm9yIHN0YWNrIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIG9uQ29tbWFuZCA9ICh7Y29tbWFuZCwgY29tbWFuZF9pZDogY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgLi4ucmVzdEFyZ3N9KSA9PiB7XG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJvbkNvbW1hbmRcIiwge2NvbW1hbmQsIGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlc3RBcmdzfV0pXG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBrZXkgZ2l2ZW4gaW4gZGF0YTogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjb21tYW5kX3Jlc3BvbnNlXCIpIHtcbiAgICAgICAgaWYgKCEoY29tbWFuZElEIGluIHRoaXMub3V0Z29pbmdDb21tYW5kcykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dGdvaW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IG5vdCBmb3VuZDogJHtPYmplY3Qua2V5cyh0aGlzLm91dGdvaW5nQ29tbWFuZHMpLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2F2ZWRDb21tYW5kID0gdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvclRvVGhyb3cgPSBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVTdGFjayA9IChzdGFjaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGFjaykgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhL25vZGVfbW9kdWxlc1xcL3dzLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6Ly50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6aW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpaW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoXCJFcnJvcjpcIikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFwiU2VydmVyIGNvbnRyb2wgaXMgZGlzYWJsZWRcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZ2V0X29iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlck9iamVjdCA9IHRoaXMuX2dldFJlZ2lzdGVyZWRPYmplY3QoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgY29uc3Qgc2VydmVyQ2xhc3MgPSB0aGlzLl9nZXRSZWdpc3RlcmVkQ2xhc3MoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmIChzZXJ2ZXJPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlck9iamVjdFxuICAgICAgICB9IGVsc2UgaWYgKHNlcnZlckNsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJDbGFzc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdCA9IGdsb2JhbFRoaXNbZGF0YS5vYmplY3RfbmFtZV1cblxuICAgICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFRoaXNbY2xhc3NOYW1lXVxuXG4gICAgICAgICAgaWYgKCFDbGFzc0luc3RhbmNlKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggY2xhc3M6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICAgICAgICBvYmplY3QgPSBuZXcgQ2xhc3NJbnN0YW5jZSguLi5kYXRhLmFyZ3MpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgY2xhc3MgbmFtZTogJHt0eXBlb2YgY2xhc3NOYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgbWV0aG9kID0gb2JqZWN0W2RhdGEubWV0aG9kX25hbWVdXG5cbiAgICAgICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kIGNhbGxlZCAnJHtkYXRhLm1ldGhvZF9uYW1lfScgb24gYSAnJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0nYClcblxuICAgICAgICBjb25zdCByZXNwb25kV2l0aFZhbHVlID0gKHJlc3BvbnNlVmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gcmVzcG9uc2VWYWx1ZVxuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogcmVzcG9uc2VWYWx1ZX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBtZXRob2QuY2FsbChvYmplY3QsIC4uLmRhdGEuYXJncylcblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzcG9uc2UudGhlbihyZXNwb25kV2l0aFZhbHVlKS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFZhbHVlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzZXJpYWxpemVfcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc2FmZUpTT05TdHJpbmdpZnkob2JqZWN0KVxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCBzZXJpYWxpemVkKVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwicmVhZF9hdHRyaWJ1dGVcIikge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gZGF0YS5hdHRyaWJ1dGVfbmFtZVxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IHJldHVybldpdGggPSBkYXRhLndpdGhcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gb2JqZWN0W2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgICAgaWYgKHJldHVybldpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGF0dHJpYnV0ZVxuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogb2JqZWN0SWR9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogYXR0cmlidXRlfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZXZhbFwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoUmVzdWx0ID0gKGV2YWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBldmFsUmVzdWx0XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogZXZhbFJlc3VsdH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB7Li4udGhpcy5fb2JqZWN0cywgLi4udGhpcy5fY2xhc3Nlc31cbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwiYnJlYWtcIixcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgXCJkZWJ1Z2dlclwiLFxuICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgXCJkb1wiLFxuICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgIFwiZXhwb3J0XCIsXG4gICAgICAgICAgXCJleHRlbmRzXCIsXG4gICAgICAgICAgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgXCJmb3JcIixcbiAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJpZlwiLFxuICAgICAgICAgIFwiaW1wb3J0XCIsXG4gICAgICAgICAgXCJpblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgICAgICAgIFwibmV3XCIsXG4gICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICBcInN1cGVyXCIsXG4gICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICBcInRoaXNcIixcbiAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgXCJ0cnlcIixcbiAgICAgICAgICBcInR5cGVvZlwiLFxuICAgICAgICAgIFwidmFyXCIsXG4gICAgICAgICAgXCJ2b2lkXCIsXG4gICAgICAgICAgXCJ3aGlsZVwiLFxuICAgICAgICAgIFwid2l0aFwiLFxuICAgICAgICAgIFwieWllbGRcIixcbiAgICAgICAgICBcImxldFwiLFxuICAgICAgICAgIFwiZW51bVwiLFxuICAgICAgICAgIFwiYXdhaXRcIixcbiAgICAgICAgICBcImltcGxlbWVudHNcIixcbiAgICAgICAgICBcInBhY2thZ2VcIixcbiAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICAgIFwiZXZhbFwiXG4gICAgICAgIF0pXG5cbiAgICAgICAgY29uc3QgaXNWYWxpZElkZW50aWZpZXIgPSAobmFtZSkgPT5cbiAgICAgICAgICAvXig/OlskX118XFxwe0lEX1N0YXJ0fSkoPzpbJF9dfFxccHtJRF9Db250aW51ZX0pKiQvdS50ZXN0KG5hbWUpICYmICFyZXNlcnZlZElkZW50aWZpZXJzLmhhcyhuYW1lKVxuXG4gICAgICAgIGNvbnN0IHNjb3BlS2V5cyA9IE9iamVjdC5rZXlzKHNjb3BlKVxuICAgICAgICBjb25zdCBpbnZhbGlkS2V5cyA9IHNjb3BlS2V5cy5maWx0ZXIoKGtleSkgPT4gIWlzVmFsaWRJZGVudGlmaWVyKGtleSkpXG5cbiAgICAgICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVnaXN0ZXJlZCBpZGVudGlmaWVyKHMpOiAke2ludmFsaWRLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHJlZ2lzdGVyZWQgb2JqZWN0cy9jbGFzc2VzIGFyZSBhdmFpbGFibGUgYXMgbG9jYWxzIGluc2lkZSB0aGUgZXZhbFxuICAgICAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgRnVuY3Rpb24oXCJfX2V2YWxTdHJpbmdcIiwgLi4uc2NvcGVLZXlzLCBcInJldHVybiBldmFsKF9fZXZhbFN0cmluZylcIilcbiAgICAgICAgY29uc3QgZXZhbFJlc3VsdCA9IGV2YWx1YXRvcihkYXRhLmV2YWxfc3RyaW5nLCAuLi5zY29wZUtleXMubWFwKChrZXkpID0+IHNjb3BlW2tleV0pKVxuXG4gICAgICAgIGlmIChldmFsUmVzdWx0ICYmIHR5cGVvZiBldmFsUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXZhbFJlc3VsdC50aGVuKHJlc3BvbmRXaXRoUmVzdWx0KS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFJlc3VsdChldmFsUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IGVycm9yLnN0YWNrfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhlcnJvcil9KVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFzZXMgYW4gYXJndW1lbnQgZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHNlcmlhbGl6ZSBmb3IgdHJhbnNwb3J0XG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VBcmcoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgcmV0dXJuIGFyZy5tYXAoKGFyZ0luQXJyYXkpID0+IHRoaXMucGFyc2VBcmcoYXJnSW5BcnJheSkpXG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fc2NvdW5kcmVsX29iamVjdF9pZDogYXJnLmlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcInJlZmVyZW5jZVwiXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoYXJnKSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8YW55LCBhbnk+fSAqL1xuICAgICAgY29uc3QgbmV3T2JqZWN0ID0ge31cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXJnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJnW2tleV1cblxuICAgICAgICBuZXdPYmplY3Rba2V5XSA9IHRoaXMucGFyc2VBcmcodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJyZWFkX2F0dHJpYnV0ZVwiLCB7XG4gICAgICBhdHRyaWJ1dGVfbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlZmVyZW5jZVwiXG4gICAgfSlcbiAgICBjb25zdCBpZCA9IHJlc3VsdC5yZXNwb25zZVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwicmVhZF9hdHRyaWJ1dGVcIiwge1xuICAgICAgYXR0cmlidXRlX25hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZXN1bHRcIlxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlIENsYXNzIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3RlckNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICghKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSkgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBkb2VzIG5vdCBleGlzdDogJHtjbGFzc05hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBpZiAoIShvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBkb2VzIG5vdCBleGlzdDogJHtvYmplY3ROYW1lfWApXG5cbiAgICBkZWxldGUgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byBhIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWFuZElkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBSZXNwb25zZSBwYXlsb2FkXG4gICAqL1xuICByZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJZCwgZGF0YSkge1xuICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YToge2NvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YX19KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgYmFja2VuZCBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgQ29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3BvbnNlIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3V0Z29pbmdDb21tYW5kQ291bnQgPSArK3RoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50XG4gICAgICBjb25zdCBvcmlnaW5FcnJvciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtjb21tYW5kfScgZGlzcGF0Y2hlZGApXG4gICAgICAvLyBTdHJpcCB0aGUgc2VuZENvbW1hbmQgZnJhbWUgdG8gaGlnaGxpZ2h0IHRoZSBjYWxsZXIgc2l0ZS5cbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uob3JpZ2luRXJyb3IsIHRoaXMuc2VuZENvbW1hbmQpXG4gICAgICBjb25zdCBjb21tYW5kRGF0YSA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgY29tbWFuZF9pZDogb3V0Z29pbmdDb21tYW5kQ291bnQsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW291dGdvaW5nQ29tbWFuZENvdW50XSA9IHtyZXNvbHZlLCByZWplY3QsIG9yaWdpblN0YWNrOiBvcmlnaW5FcnJvci5zdGFja31cbiAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiU2VuZGluZ1wiLCBjb21tYW5kRGF0YV0pXG4gICAgICB0aGlzLnNlbmQoY29tbWFuZERhdGEpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBkYXRhIHRvIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFBheWxvYWQgdG8gc2VuZFxuICAgKi9cbiAgc2VuZChkYXRhKSB7XG4gICAgdGhpcy5iYWNrZW5kLnNlbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFBhcnNlZCBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIiwge3JlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWR9KVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1JlZmVyZW5jZX0gUmVmZXJlbmNlIGluc3RhbmNlXG4gICAqL1xuICBzcGF3blJlZmVyZW5jZShpZCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UodGhpcywgaWQpXG5cbiAgICB0aGlzLnJlZmVyZW5jZXNbaWRdID0gcmVmZXJlbmNlXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlXG4gIH1cblxuICBlbmFibGVTZXJ2ZXJDb250cm9sKCkge1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSB0cnVlXG4gIH1cbn1cbiJdfQ==
|
|
909
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRTdDLDREQUE0RDtBQUU1RCx3QkFBd0I7QUFFeEI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTTtJQUN6Qjs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUErWGpDOzs7Ozs7OztXQVFHO1FBQ0gsY0FBUyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsRUFBQyxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXhGLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ3pDLElBQUks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QUFDLENBQUMsQ0FBQTtRQUV2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsRUFBRTtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUUvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gXCIuL3JlZmVyZW5jZS5qc1wiXG5pbXBvcnQgcmVmZXJlbmNlUHJveHkgZnJvbSBcIi4vcmVmZXJlbmNlLXByb3h5LmpzXCJcbmltcG9ydCBzYWZlSlNPTlN0cmluZ2lmeSBmcm9tIFwiLi4vdXRpbHMvc2FmZS1qc29uLXN0cmluZ2lmeS5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgQ2xpZW50XCIpXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9yZWZlcmVuY2UtcHJveHkuanNcIikuUHJveHl9IFByb3h5ICovXG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG4vKipcbiAqIEB0eXBlZGVmIHt7cmVmZXJlbmNlPzogYm9vbGVhbiwgcmVzdWx0PzogYm9vbGVhbiwgcHJveHk/OiBib29sZWFufX0gUmV0dXJuT3B0aW9uc1xuICogQHR5cGVkZWYge1JldHVybk9wdGlvbnMgJiB7cmVzdWx0PzogZmFsc2V9fSBSZXR1cm5SZWZlcmVuY2VPcHRpb25zXG4gKiBAdHlwZWRlZiB7UmV0dXJuT3B0aW9ucyAmIHtyZXN1bHQ6IHRydWUsIHJlZmVyZW5jZT86IGZhbHNlfX0gUmV0dXJuUmVzdWx0T3B0aW9uc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTY291bmRyZWwgQ2xpZW50XG4gICAqIEBwYXJhbSB7YW55fSBiYWNrZW5kIFRoZSBiYWNrZW5kIGNvbm5lY3Rpb24gKGUuZy4sIFdlYlNvY2tldClcbiAgICogQHBhcmFtIHt7ZW5hYmxlU2VydmVyQ29udHJvbD86IGJvb2xlYW59fSBbb3B0aW9uc10gQ2xpZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYmFja2VuZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZFxuICAgIHRoaXMuYmFja2VuZC5vbkNvbW1hbmQodGhpcy5vbkNvbW1hbmQpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIGFueT59ICovXG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLmluY29taW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX2NsYXNzZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX29iamVjdHMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+fSAqL1xuICAgIHRoaXMucmVmZXJlbmNlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIGFueT59ICovXG4gICAgdGhpcy5vYmplY3RzID0ge31cblxuICAgIHRoaXMub2JqZWN0c0NvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMuZW5hYmxlU2VydmVyQ29udHJvbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNsaWVudCBjb25uZWN0aW9uXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICB0aGlzLmJhY2tlbmQuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgY2FsbFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eT59IFJlZmVyZW5jZSBvciBwcm94eSB0byB0aGUgcmV0dXJuZWQgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVzdWx0T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgY2FsbFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBSZXN1bHQgZnJvbSB0aGUgbWV0aG9kIGNhbGxcbiAgICovXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHtSZXR1cm5PcHRpb25zIHwgYW55fSBbb3B0aW9uc09yQXJnXSBPcHRpb25zIGZvciB0aGUgY2FsbCBvciBmaXJzdCBhcmd1bWVudFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eSB8IGFueT59IFJlc3VsdCBvciByZWZlcmVuY2UgZnJvbSB0aGUgbWV0aG9kIGNhbGxcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgb3B0aW9uc09yQXJnLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgYWxsb3dlZE9wdGlvbnMgPSBuZXcgU2V0KFtcInJlZmVyZW5jZVwiLCBcInJlc3VsdFwiLCBcInByb3h5XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9ucyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7YW55W119ICovXG4gICAgbGV0IG1ldGhvZEFyZ3NcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBtZXRob2RBcmdzID0gYXJnc1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BsYWluT2JqZWN0KG9wdGlvbnNPckFyZykpIHtcbiAgICAgIGNvbnN0IG9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zT3JBcmcpXG4gICAgICBjb25zdCBoYXNPcHRpb25LZXkgPSBvcHRpb25LZXlzLnNvbWUoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG5cbiAgICAgIGlmIChoYXNPcHRpb25LZXkpIHtcbiAgICAgICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBvcHRpb25LZXlzLmZpbHRlcigoa2V5KSA9PiAhYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgIGlmICh1bmtub3duT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25WYWx1ZXNBcmVCb29sZWFuID0gb3B0aW9uS2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgICAgIC5ldmVyeSgoa2V5KSA9PiB0eXBlb2Ygb3B0aW9uc09yQXJnW2tleV0gPT09IFwiYm9vbGVhblwiKVxuXG4gICAgICAgICAgaWYgKG9wdGlvblZhbHVlc0FyZUJvb2xlYW4pIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSAvKiogQHR5cGUge1JldHVybk9wdGlvbnN9ICovIChvcHRpb25zT3JBcmcpXG4gICAgICAgICAgICBtZXRob2RBcmdzID0gYXJnc1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RBcmdzID0gW29wdGlvbnNPckFyZywgLi4uYXJnc11cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNhbGxNZXRob2RPblJlZmVyZW5jZSBvcHRpb25zOiAke3Vua25vd25PcHRpb25zLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2RBcmdzID0gW29wdGlvbnNPckFyZywgLi4uYXJnc11cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuUmVmZXJlbmNlID0gb3B0aW9ucz8ucmVmZXJlbmNlID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUmVzdWx0ID0gb3B0aW9ucz8ucmVzdWx0ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUHJveHkgPSBvcHRpb25zPy5wcm94eSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVybkZsYWdzID0gW3JldHVyblJlZmVyZW5jZSwgcmV0dXJuUmVzdWx0LCByZXR1cm5Qcm94eV0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aFxuXG4gICAgaWYgKHJldHVybkZsYWdzID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlIG9wdGlvbnMgcmVmZXJlbmNlLCByZXN1bHQsIGFuZCBwcm94eSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXCIpXG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aFJlZmVyZW5jZSA9IHJldHVyblJlZmVyZW5jZSB8fCByZXR1cm5Qcm94eVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhtZXRob2RBcmdzKSxcbiAgICAgIG1ldGhvZF9uYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IHdpdGhSZWZlcmVuY2UgPyBcInJlZmVyZW5jZVwiIDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBpZiAod2l0aFJlZmVyZW5jZSkge1xuICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXN1bHQucmVzcG9uc2VcblxuICAgICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2Uob2JqZWN0SWQpXG4gICAgICByZXR1cm4gcmV0dXJuUHJveHkgPyByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKSA6IHNwYXduZWRSZWZlcmVuY2VcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oXCJTY291bmRyZWwgQ2xpZW50XCIsIFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBpcyBkZXByZWNhdGVkOyB1c2UgY2FsbE1ldGhvZE9uUmVmZXJlbmNlIHdpdGggcmVmZXJlbmNlIGluc3RlYWQuXCIpXG4gICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCB7cmVmZXJlbmNlOiB0cnVlfSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbChldmFsU3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImV2YWxcIiwge1xuICAgICAgZXZhbF9zdHJpbmc6IGV2YWxTdHJpbmcsXG4gICAgICB3aXRoX3JlZmVyZW5jZTogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZClcbiAgICByZXR1cm4gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbFJlZmVyZW5jZShldmFsU3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsUmVmZXJlbmNlIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImV2YWxcIiwge1xuICAgICAgZXZhbF9zdHJpbmc6IGV2YWxTdHJpbmcsXG4gICAgICB3aXRoX3JlZmVyZW5jZTogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEV2YWx1YXRlZCByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV2YWxSZXN1bHQoZXZhbFN0cmluZykge1xuICAgIGlmICh0eXBlb2YgZXZhbFN0cmluZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXZhbFJlc3VsdCByZXF1aXJlcyBhbiBldmFsIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJldmFsXCIsIHtcbiAgICAgIGV2YWxfc3RyaW5nOiBldmFsU3RyaW5nLFxuICAgICAgd2l0aF9yZWZlcmVuY2U6IGZhbHNlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIShcInJlc3BvbnNlXCIgaW4gcmVzdWx0KSkgdGhyb3cgbmV3IEVycm9yKGBObyByZXNwb25zZSBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgYSBwcm94eSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgbW9kdWxlXG4gICAqL1xuICBhc3luYyBpbXBvcnQoaW1wb3J0TmFtZSkge1xuICAgIGlmICh0eXBlb2YgaW1wb3J0TmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiaW1wb3J0IHJlcXVpcmVzIGEgbW9kdWxlIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJpbXBvcnRcIiwge1xuICAgICAgaW1wb3J0X25hbWU6IGltcG9ydE5hbWVcbiAgICB9KVxuXG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJpbXBvcnRcIiwge3Jlc3VsdH1dKVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3VsdCBnaXZlblwiKVxuICAgIGlmICghcmVzdWx0Lm9iamVjdF9pZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuICAgIGNvbnN0IHNwYXduZWRSZWZlcmVuY2UgPSB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBpbXBvcnROYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbXBvcnRSZWZlcmVuY2UgcmVxdWlyZXMgYSBtb2R1bGUgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIHRoZSBzZXJpYWxpemVkIHJlc3VsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydFJlc3VsdChpbXBvcnROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5pbXBvcnRSZWZlcmVuY2UoaW1wb3J0TmFtZSlcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBSZWdpc3RlcmVkIG9iamVjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLmdldE9iamVjdFJlZmVyZW5jZShvYmplY3ROYW1lKVxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShyZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgUmVnaXN0ZXJlZCBvYmplY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0UmVmZXJlbmNlKG9iamVjdE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG9iamVjdE5hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcImdldE9iamVjdFJlZmVyZW5jZSByZXF1aXJlcyBhbiBvYmplY3QgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImdldF9vYmplY3RcIiwge1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdE5hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgc2VyaWFsaXplZCByZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgUmVnaXN0ZXJlZCBvYmplY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0UmVzdWx0KG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLmdldE9iamVjdFJlZmVyZW5jZShvYmplY3ROYW1lKVxuICAgIHJldHVybiBhd2FpdCByZWZlcmVuY2Uuc2VyaWFsaXplKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhIHByb3h5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcm94eT59IFByb3h5IHRvIHRoZSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIG5ld09iamVjdChjbGFzc05hbWUsIC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwibmV3T2JqZWN0IHJlcXVpcmVzIGEgY2xhc3MgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIGNsYXNzX25hbWU6IGNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcblxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJuZXdPYmplY3RSZWZlcmVuY2UgcmVxdWlyZXMgYSBjbGFzcyBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBzZXJpYWxpemVkIHJlc3VsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIG5ld09iamVjdFJlc3VsdChjbGFzc05hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLm5ld09iamVjdFJlZmVyZW5jZShjbGFzc05hbWUsIC4uLmFyZ3MpXG4gICAgcmV0dXJuIGF3YWl0IHJlZmVyZW5jZS5zZXJpYWxpemUoKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgICogQHBhcmFtIHthbnl9IGlucHV0IFZhbHVlIHRvIGluc3BlY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3RcbiAgICovXG4gIGlzUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGluY29taW5nIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyBDb21tYW5kIHBheWxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuY29tbWFuZF9pZCBDb21tYW5kIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZGF0YSBDb21tYW5kIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yXSBFcnJvciBtZXNzYWdlIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yU3RhY2tdIEVycm9yIHN0YWNrIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIG9uQ29tbWFuZCA9ICh7Y29tbWFuZCwgY29tbWFuZF9pZDogY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgLi4ucmVzdEFyZ3N9KSA9PiB7XG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJvbkNvbW1hbmRcIiwge2NvbW1hbmQsIGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlc3RBcmdzfV0pXG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBrZXkgZ2l2ZW4gaW4gZGF0YTogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjb21tYW5kX3Jlc3BvbnNlXCIpIHtcbiAgICAgICAgaWYgKCEoY29tbWFuZElEIGluIHRoaXMub3V0Z29pbmdDb21tYW5kcykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dGdvaW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IG5vdCBmb3VuZDogJHtPYmplY3Qua2V5cyh0aGlzLm91dGdvaW5nQ29tbWFuZHMpLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2F2ZWRDb21tYW5kID0gdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvclRvVGhyb3cgPSBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVTdGFjayA9IChzdGFjaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGFjaykgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhL25vZGVfbW9kdWxlc1xcL3dzLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6Ly50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKW5vZGU6aW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpaW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoXCJFcnJvcjpcIikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFwiU2VydmVyIGNvbnRyb2wgaXMgZGlzYWJsZWRcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZ2V0X29iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlck9iamVjdCA9IHRoaXMuX2dldFJlZ2lzdGVyZWRPYmplY3QoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgY29uc3Qgc2VydmVyQ2xhc3MgPSB0aGlzLl9nZXRSZWdpc3RlcmVkQ2xhc3MoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmIChzZXJ2ZXJPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlck9iamVjdFxuICAgICAgICB9IGVsc2UgaWYgKHNlcnZlckNsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJDbGFzc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdCA9IGdsb2JhbFRoaXNbZGF0YS5vYmplY3RfbmFtZV1cblxuICAgICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFRoaXNbY2xhc3NOYW1lXVxuXG4gICAgICAgICAgaWYgKCFDbGFzc0luc3RhbmNlKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggY2xhc3M6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICAgICAgICBvYmplY3QgPSBuZXcgQ2xhc3NJbnN0YW5jZSguLi5kYXRhLmFyZ3MpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgY2xhc3MgbmFtZTogJHt0eXBlb2YgY2xhc3NOYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgbWV0aG9kID0gb2JqZWN0W2RhdGEubWV0aG9kX25hbWVdXG5cbiAgICAgICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kIGNhbGxlZCAnJHtkYXRhLm1ldGhvZF9uYW1lfScgb24gYSAnJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0nYClcblxuICAgICAgICBjb25zdCByZXNwb25kV2l0aFZhbHVlID0gKHJlc3BvbnNlVmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gcmVzcG9uc2VWYWx1ZVxuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogcmVzcG9uc2VWYWx1ZX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBtZXRob2QuY2FsbChvYmplY3QsIC4uLmRhdGEuYXJncylcblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzcG9uc2UudGhlbihyZXNwb25kV2l0aFZhbHVlKS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFZhbHVlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJzZXJpYWxpemVfcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc2FmZUpTT05TdHJpbmdpZnkob2JqZWN0KVxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCBzZXJpYWxpemVkKVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwicmVhZF9hdHRyaWJ1dGVcIikge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gZGF0YS5hdHRyaWJ1dGVfbmFtZVxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IHJldHVybldpdGggPSBkYXRhLndpdGhcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gb2JqZWN0W2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgICAgaWYgKHJldHVybldpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGF0dHJpYnV0ZVxuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogb2JqZWN0SWR9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogYXR0cmlidXRlfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZXZhbFwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoUmVzdWx0ID0gKGV2YWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBldmFsUmVzdWx0XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogZXZhbFJlc3VsdH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB7Li4udGhpcy5fb2JqZWN0cywgLi4udGhpcy5fY2xhc3Nlc31cbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwiYnJlYWtcIixcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgXCJkZWJ1Z2dlclwiLFxuICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgXCJkb1wiLFxuICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgIFwiZXhwb3J0XCIsXG4gICAgICAgICAgXCJleHRlbmRzXCIsXG4gICAgICAgICAgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgXCJmb3JcIixcbiAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJpZlwiLFxuICAgICAgICAgIFwiaW1wb3J0XCIsXG4gICAgICAgICAgXCJpblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgICAgICAgIFwibmV3XCIsXG4gICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICBcInN1cGVyXCIsXG4gICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICBcInRoaXNcIixcbiAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgXCJ0cnlcIixcbiAgICAgICAgICBcInR5cGVvZlwiLFxuICAgICAgICAgIFwidmFyXCIsXG4gICAgICAgICAgXCJ2b2lkXCIsXG4gICAgICAgICAgXCJ3aGlsZVwiLFxuICAgICAgICAgIFwid2l0aFwiLFxuICAgICAgICAgIFwieWllbGRcIixcbiAgICAgICAgICBcImxldFwiLFxuICAgICAgICAgIFwiZW51bVwiLFxuICAgICAgICAgIFwiYXdhaXRcIixcbiAgICAgICAgICBcImltcGxlbWVudHNcIixcbiAgICAgICAgICBcInBhY2thZ2VcIixcbiAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICAgIFwiZXZhbFwiXG4gICAgICAgIF0pXG5cbiAgICAgICAgY29uc3QgaXNWYWxpZElkZW50aWZpZXIgPSAobmFtZSkgPT5cbiAgICAgICAgICAvXig/OlskX118XFxwe0lEX1N0YXJ0fSkoPzpbJF9dfFxccHtJRF9Db250aW51ZX0pKiQvdS50ZXN0KG5hbWUpICYmICFyZXNlcnZlZElkZW50aWZpZXJzLmhhcyhuYW1lKVxuXG4gICAgICAgIGNvbnN0IHNjb3BlS2V5cyA9IE9iamVjdC5rZXlzKHNjb3BlKVxuICAgICAgICBjb25zdCBpbnZhbGlkS2V5cyA9IHNjb3BlS2V5cy5maWx0ZXIoKGtleSkgPT4gIWlzVmFsaWRJZGVudGlmaWVyKGtleSkpXG5cbiAgICAgICAgaWYgKGludmFsaWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVnaXN0ZXJlZCBpZGVudGlmaWVyKHMpOiAke2ludmFsaWRLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHJlZ2lzdGVyZWQgb2JqZWN0cy9jbGFzc2VzIGFyZSBhdmFpbGFibGUgYXMgbG9jYWxzIGluc2lkZSB0aGUgZXZhbFxuICAgICAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgRnVuY3Rpb24oXCJfX2V2YWxTdHJpbmdcIiwgLi4uc2NvcGVLZXlzLCBcInJldHVybiBldmFsKF9fZXZhbFN0cmluZylcIilcbiAgICAgICAgY29uc3QgZXZhbFJlc3VsdCA9IGV2YWx1YXRvcihkYXRhLmV2YWxfc3RyaW5nLCAuLi5zY29wZUtleXMubWFwKChrZXkpID0+IHNjb3BlW2tleV0pKVxuXG4gICAgICAgIGlmIChldmFsUmVzdWx0ICYmIHR5cGVvZiBldmFsUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXZhbFJlc3VsdC50aGVuKHJlc3BvbmRXaXRoUmVzdWx0KS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFJlc3VsdChldmFsUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IGVycm9yLnN0YWNrfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhlcnJvcil9KVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFzZXMgYW4gYXJndW1lbnQgZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHNlcmlhbGl6ZSBmb3IgdHJhbnNwb3J0XG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VBcmcoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgcmV0dXJuIGFyZy5tYXAoKGFyZ0luQXJyYXkpID0+IHRoaXMucGFyc2VBcmcoYXJnSW5BcnJheSkpXG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fc2NvdW5kcmVsX29iamVjdF9pZDogYXJnLmlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcInJlZmVyZW5jZVwiXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoYXJnKSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8YW55LCBhbnk+fSAqL1xuICAgICAgY29uc3QgbmV3T2JqZWN0ID0ge31cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXJnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJnW2tleV1cblxuICAgICAgICBuZXdPYmplY3Rba2V5XSA9IHRoaXMucGFyc2VBcmcodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnNPckFyZyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eT59IFJlZmVyZW5jZSBvciBwcm94eSB0byB0aGUgYXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVzdWx0T3B0aW9uc30gb3B0aW9uc09yQXJnIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtIHtSZXR1cm5PcHRpb25zfSBbb3B0aW9uc09yQXJnXSBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eSB8IGFueT59IFJlZmVyZW5jZSwgcHJveHksIG9yIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSwgb3B0aW9uc09yQXJnKSB7XG4gICAgY29uc3QgYWxsb3dlZE9wdGlvbnMgPSBuZXcgU2V0KFtcInJlZmVyZW5jZVwiLCBcInJlc3VsdFwiLCBcInByb3h5XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi9cbiAgICBsZXQgb3B0aW9ucyA9IHtyZWZlcmVuY2U6IHRydWV9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgb3B0aW9ucyA9IHtyZWZlcmVuY2U6IHRydWV9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qob3B0aW9uc09yQXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnNPckFyZylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UmV0dXJuID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnNPckFyZywgXCJyZWZlcmVuY2VcIilcbiAgICAgICAgICAgIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zT3JBcmcsIFwicmVzdWx0XCIpXG4gICAgICAgICAgICB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9uc09yQXJnLCBcInByb3h5XCIpXG4gICAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKHtcbiAgICAgICAgICAgIC4uLihoYXNFeHBsaWNpdFJldHVybiA/IHt9IDoge3JlZmVyZW5jZTogdHJ1ZX0pLFxuICAgICAgICAgICAgLi4ub3B0aW9uc09yQXJnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBvcHRpb25zOiAke3Vua25vd25PcHRpb25zLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG9wdGlvbnMsIGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eT59IFJlZmVyZW5jZSBvciBwcm94eSB0byB0aGUgYXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9yIHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgUmV0dXJuT3B0aW9uc30gYXR0cmlidXRlTmFtZU9yT3B0aW9ucyBBdHRyaWJ1dGUgbmFtZSBvciBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBbYXR0cmlidXRlTmFtZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lT3JPcHRpb25zLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYWxsb3dlZE9wdGlvbnMgPSBuZXcgU2V0KFtcInJlZmVyZW5jZVwiLCBcInJlc3VsdFwiLCBcInByb3h5XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9ucyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0YXJnZXRBdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZVxuXG4gICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVOYW1lT3JPcHRpb25zKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICBjb25zdCBoYXNPcHRpb25LZXkgPSBvcHRpb25LZXlzLnNvbWUoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG5cbiAgICAgIGlmIChoYXNPcHRpb25LZXkpIHtcbiAgICAgICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBvcHRpb25LZXlzLmZpbHRlcigoa2V5KSA9PiAhYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgIGlmICh1bmtub3duT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXRBdHRyaWJ1dGVOYW1lID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2UgcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5SZWZlcmVuY2UgPSBvcHRpb25zPy5yZWZlcmVuY2UgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5SZXN1bHQgPSBvcHRpb25zPy5yZXN1bHQgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5Qcm94eSA9IG9wdGlvbnM/LnByb3h5ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRmxhZ3MgPSBbcmV0dXJuUmVmZXJlbmNlLCByZXR1cm5SZXN1bHQsIHJldHVyblByb3h5XS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoXG5cbiAgICBpZiAocmV0dXJuRmxhZ3MgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoUmVmZXJlbmNlID0gcmV0dXJuUmVmZXJlbmNlIHx8IHJldHVyblByb3h5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInJlYWRfYXR0cmlidXRlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZV9uYW1lOiB0YXJnZXRBdHRyaWJ1dGVOYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IHdpdGhSZWZlcmVuY2UgPyBcInJlZmVyZW5jZVwiIDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXdpdGhSZWZlcmVuY2UpIHJldHVybiByZXN1bHQucmVzcG9uc2VcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG5cbiAgICByZXR1cm4gcmV0dXJuUHJveHkgPyByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKSA6IHNwYXduZWRSZWZlcmVuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueX0gY2xhc3NJbnN0YW5jZSBDbGFzcyBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZVxuICAgKi9cbiAgcmVnaXN0ZXJDbGFzcyhjbGFzc05hbWUsIGNsYXNzSW5zdGFuY2UpIHtcbiAgICBpZiAoY2xhc3NOYW1lIGluIHRoaXMuX2NsYXNzZXMpIHRocm93IG5ldyBFcnJvcihgQ2xhc3MgYWxyZWFkeSBleGlzdHM6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV0gPSBjbGFzc0luc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byByZW1vdmVcbiAgICovXG4gIHVucmVnaXN0ZXJDbGFzcyhjbGFzc05hbWUpIHtcbiAgICBpZiAoIShjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykpIHRocm93IG5ldyBFcnJvcihgQ2xhc3MgZG9lcyBub3QgZXhpc3Q6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICBkZWxldGUgdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gbG9vayB1cFxuICAgKiBAcmV0dXJucyB7YW55fSBSZWdpc3RlcmVkIGNsYXNzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgX2dldFJlZ2lzdGVyZWRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gbG9vayB1cFxuICAgKiBAcmV0dXJucyB7YW55fSBSZWdpc3RlcmVkIGNsYXNzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0Q2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueX0gb2JqZWN0SW5zdGFuY2UgT2JqZWN0IGluc3RhbmNlXG4gICAqL1xuICByZWdpc3Rlck9iamVjdChvYmplY3ROYW1lLCBvYmplY3RJbnN0YW5jZSkge1xuICAgIGlmIChvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGFscmVhZHkgZXhpc3RzOiAke29iamVjdE5hbWV9YClcblxuICAgIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV0gPSBvYmplY3RJbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3Rlck9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgaWYgKCEob2JqZWN0TmFtZSBpbiB0aGlzLl9vYmplY3RzKSkgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgZG9lcyBub3QgZXhpc3Q6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgZGVsZXRlIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgb2JqZWN0IG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgX2dldFJlZ2lzdGVyZWRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVzcG9uZHMgdG8gYSBjb21tYW5kIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvbW1hbmRJZCBDb21tYW5kIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgUmVzcG9uc2UgcGF5bG9hZFxuICAgKi9cbiAgcmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSWQsIGRhdGEpIHtcbiAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSWQsIGRhdGE6IHtjb21tYW5kX2lkOiBjb21tYW5kSWQsIGRhdGF9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgdG8gdGhlIGJhY2tlbmQgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgQ29tbWFuZCBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIENvbW1hbmQgcGF5bG9hZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBSZXNwb25zZSBmcm9tIHRoZSBiYWNrZW5kXG4gICAqL1xuICBzZW5kQ29tbWFuZChjb21tYW5kLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG91dGdvaW5nQ29tbWFuZENvdW50ID0gKyt0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudFxuICAgICAgY29uc3Qgb3JpZ2luRXJyb3IgPSBuZXcgRXJyb3IoYENvbW1hbmQgJyR7Y29tbWFuZH0nIGRpc3BhdGNoZWRgKVxuICAgICAgLy8gU3RyaXAgdGhlIHNlbmRDb21tYW5kIGZyYW1lIHRvIGhpZ2hsaWdodCB0aGUgY2FsbGVyIHNpdGUuXG4gICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKG9yaWdpbkVycm9yLCB0aGlzLnNlbmRDb21tYW5kKVxuICAgICAgY29uc3QgY29tbWFuZERhdGEgPSB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGNvbW1hbmRfaWQ6IG91dGdvaW5nQ29tbWFuZENvdW50LFxuICAgICAgICBkYXRhXG4gICAgICB9XG5cbiAgICAgIHRoaXMub3V0Z29pbmdDb21tYW5kc1tvdXRnb2luZ0NvbW1hbmRDb3VudF0gPSB7cmVzb2x2ZSwgcmVqZWN0LCBvcmlnaW5TdGFjazogb3JpZ2luRXJyb3Iuc3RhY2t9XG4gICAgICBsb2dnZXIubG9nKCgpID0+IFtcIlNlbmRpbmdcIiwgY29tbWFuZERhdGFdKVxuICAgICAgdGhpcy5zZW5kKGNvbW1hbmREYXRhKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgZGF0YSB0byB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBQYXlsb2FkIHRvIHNlbmRcbiAgICovXG4gIHNlbmQoZGF0YSkge1xuICAgIHRoaXMuYmFja2VuZC5zZW5kKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQYXJzZWQgSlNPTiByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplUmVmZXJlbmNlKHJlZmVyZW5jZUlkKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJzZXJpYWxpemVfcmVmZXJlbmNlXCIsIHtyZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkfSlcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtSZWZlcmVuY2V9IFJlZmVyZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgc3Bhd25SZWZlcmVuY2UoaWQpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKHRoaXMsIGlkKVxuXG4gICAgdGhpcy5yZWZlcmVuY2VzW2lkXSA9IHJlZmVyZW5jZVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVxuICB9XG5cbiAgZW5hYmxlU2VydmVyQ29udHJvbCgpIHtcbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gdHJ1ZVxuICB9XG59XG4iXX0=
|