circuit-json-to-spice 0.0.26 → 0.0.28
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 +1 -0
- package/dist/index.js +80 -26
- package/lib/circuitJsonToSpice.ts +73 -4
- package/package.json +1 -1
- package/tests/examples/assets/buck-converter.json +1266 -0
- package/tests/examples/assets/switch.json +999 -0
- package/tests/examples/boost-converter.test.tsx +2 -2
- package/tests/examples/buck-converter.test.tsx +30 -0
- package/tests/examples/switch.test.tsx +29 -0
package/README.md
CHANGED
|
@@ -69,6 +69,7 @@ Currently supports the following tscircuit components:
|
|
|
69
69
|
|
|
70
70
|
- **Resistors** (`simple_resistor`) - Converted to SPICE R components
|
|
71
71
|
- **Capacitors** (`simple_capacitor`) - Converted to SPICE C components
|
|
72
|
+
- **Transistors** (`simple_transistor`) - Converted to SPICE Q components (BJT)
|
|
72
73
|
|
|
73
74
|
More components will be added in future releases.
|
|
74
75
|
|
package/dist/index.js
CHANGED
|
@@ -145,6 +145,27 @@ var VoltageSourceCommand = class {
|
|
|
145
145
|
}
|
|
146
146
|
};
|
|
147
147
|
|
|
148
|
+
// lib/spice-commands/BJTCommand.ts
|
|
149
|
+
var BJTCommand = class {
|
|
150
|
+
commandName = "bjt";
|
|
151
|
+
props;
|
|
152
|
+
constructor(props) {
|
|
153
|
+
this.props = props;
|
|
154
|
+
}
|
|
155
|
+
toSpiceString() {
|
|
156
|
+
const { name, collector, base, emitter, substrate, model, area } = this.props;
|
|
157
|
+
let spiceString = `Q${name} ${collector} ${base} ${emitter}`;
|
|
158
|
+
if (substrate) {
|
|
159
|
+
spiceString += ` ${substrate}`;
|
|
160
|
+
}
|
|
161
|
+
spiceString += ` ${model}`;
|
|
162
|
+
if (area) {
|
|
163
|
+
spiceString += ` ${area}`;
|
|
164
|
+
}
|
|
165
|
+
return spiceString;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
|
|
148
169
|
// lib/spice-commands/DiodeCommand.ts
|
|
149
170
|
var DiodeCommand = class {
|
|
150
171
|
commandName = "diode";
|
|
@@ -472,16 +493,28 @@ function circuitJsonToSpice(circuitJson) {
|
|
|
472
493
|
const drainNode = nodeMap.get(drainPort?.source_port_id ?? "") || "0";
|
|
473
494
|
const gateNode = nodeMap.get(gatePort?.source_port_id ?? "") || "0";
|
|
474
495
|
const sourceNode = nodeMap.get(sourcePort?.source_port_id ?? "") || "0";
|
|
475
|
-
const
|
|
496
|
+
const channel_type = component.channel_type;
|
|
497
|
+
let positiveControl = gateNode;
|
|
498
|
+
let negativeControl = sourceNode;
|
|
499
|
+
if (channel_type === "p") {
|
|
500
|
+
positiveControl = sourceNode;
|
|
501
|
+
negativeControl = gateNode;
|
|
502
|
+
}
|
|
503
|
+
const modelName = "ENH_SW";
|
|
504
|
+
if (!netlist.models.has(modelName)) {
|
|
505
|
+
netlist.models.set(
|
|
506
|
+
modelName,
|
|
507
|
+
`.MODEL ${modelName} SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)`
|
|
508
|
+
);
|
|
509
|
+
}
|
|
476
510
|
const switchCmd = new VoltageControlledSwitchCommand({
|
|
477
511
|
name: component.name,
|
|
478
512
|
positiveNode: drainNode,
|
|
479
513
|
negativeNode: sourceNode,
|
|
480
|
-
positiveControl
|
|
481
|
-
negativeControl
|
|
514
|
+
positiveControl,
|
|
515
|
+
negativeControl,
|
|
482
516
|
model: modelName
|
|
483
517
|
});
|
|
484
|
-
netlist.models.set(modelName, `.MODEL ${modelName} SW`);
|
|
485
518
|
spiceComponent = new SpiceComponent(component.name, switchCmd, [
|
|
486
519
|
drainNode,
|
|
487
520
|
gateNode,
|
|
@@ -490,6 +523,48 @@ function circuitJsonToSpice(circuitJson) {
|
|
|
490
523
|
}
|
|
491
524
|
break;
|
|
492
525
|
}
|
|
526
|
+
case "simple_transistor": {
|
|
527
|
+
if ("name" in component) {
|
|
528
|
+
const collectorPort = componentPorts.find(
|
|
529
|
+
(p) => p.name?.toLowerCase() === "collector" || p.port_hints?.includes("collector")
|
|
530
|
+
);
|
|
531
|
+
const basePort = componentPorts.find(
|
|
532
|
+
(p) => p.name?.toLowerCase() === "base" || p.port_hints?.includes("base")
|
|
533
|
+
);
|
|
534
|
+
const emitterPort = componentPorts.find(
|
|
535
|
+
(p) => p.name?.toLowerCase() === "emitter" || p.port_hints?.includes("emitter")
|
|
536
|
+
);
|
|
537
|
+
if (!collectorPort || !basePort || !emitterPort) {
|
|
538
|
+
throw new Error(
|
|
539
|
+
`Transistor ${component.name} is missing required ports (collector, base, emitter)`
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
const collectorNode = nodeMap.get(collectorPort.source_port_id) || "0";
|
|
543
|
+
const baseNode = nodeMap.get(basePort.source_port_id) || "0";
|
|
544
|
+
const emitterNode = nodeMap.get(emitterPort.source_port_id) || "0";
|
|
545
|
+
const transistor_type = component.transistor_type ?? "npn";
|
|
546
|
+
const modelName = transistor_type.toUpperCase();
|
|
547
|
+
if (!netlist.models.has(modelName)) {
|
|
548
|
+
netlist.models.set(
|
|
549
|
+
modelName,
|
|
550
|
+
`.MODEL ${modelName} ${transistor_type.toUpperCase()}`
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
const bjtCmd = new BJTCommand({
|
|
554
|
+
name: component.name,
|
|
555
|
+
collector: collectorNode,
|
|
556
|
+
base: baseNode,
|
|
557
|
+
emitter: emitterNode,
|
|
558
|
+
model: modelName
|
|
559
|
+
});
|
|
560
|
+
spiceComponent = new SpiceComponent(component.name, bjtCmd, [
|
|
561
|
+
collectorNode,
|
|
562
|
+
baseNode,
|
|
563
|
+
emitterNode
|
|
564
|
+
]);
|
|
565
|
+
}
|
|
566
|
+
break;
|
|
567
|
+
}
|
|
493
568
|
}
|
|
494
569
|
if (spiceComponent) {
|
|
495
570
|
netlist.addComponent(spiceComponent);
|
|
@@ -720,27 +795,6 @@ var SpiceSubcircuit = class {
|
|
|
720
795
|
}
|
|
721
796
|
};
|
|
722
797
|
|
|
723
|
-
// lib/spice-commands/BJTCommand.ts
|
|
724
|
-
var BJTCommand = class {
|
|
725
|
-
commandName = "bjt";
|
|
726
|
-
props;
|
|
727
|
-
constructor(props) {
|
|
728
|
-
this.props = props;
|
|
729
|
-
}
|
|
730
|
-
toSpiceString() {
|
|
731
|
-
const { name, collector, base, emitter, substrate, model, area } = this.props;
|
|
732
|
-
let spiceString = `Q${name} ${collector} ${base} ${emitter}`;
|
|
733
|
-
if (substrate) {
|
|
734
|
-
spiceString += ` ${substrate}`;
|
|
735
|
-
}
|
|
736
|
-
spiceString += ` ${model}`;
|
|
737
|
-
if (area) {
|
|
738
|
-
spiceString += ` ${area}`;
|
|
739
|
-
}
|
|
740
|
-
return spiceString;
|
|
741
|
-
}
|
|
742
|
-
};
|
|
743
|
-
|
|
744
798
|
// lib/spice-commands/CurrentSourceCommand.ts
|
|
745
799
|
var CurrentSourceCommand = class {
|
|
746
800
|
commandName = "current_source";
|
|
@@ -902,4 +956,4 @@ export {
|
|
|
902
956
|
circuitJsonToSpice,
|
|
903
957
|
convertSpiceNetlistToString
|
|
904
958
|
};
|
|
905
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0N1cnJlbnRTb3VyY2VDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1N1YmNpcmN1aXRDYWxsQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgLy8gQWRkIHN1YmNpcmN1aXQgZGVmaW5pdGlvbnNcbiAgZm9yIChjb25zdCBzdWJjaXJjdWl0IG9mIG5ldGxpc3Quc3ViY2lyY3VpdHMpIHtcbiAgICBsaW5lcy5wdXNoKHN1YmNpcmN1aXQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzKVxuICB9XG5cbiAgLy8gQWRkIGNvbnRyb2wgYmxvY2sgaWYgcHJlc2VudFxuICBpZiAobmV0bGlzdC5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIi5jb250cm9sXCIpXG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LmNvbnRyb2xzKVxuICAgIGxpbmVzLnB1c2goXCIuZW5kY1wiKVxuICB9XG5cbiAgaWYgKFxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgJiZcbiAgICAhbGluZXMuc29tZSgobCkgPT4gbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiLnRyYW5cIikpXG4gICkge1xuICAgIGxpbmVzLnB1c2gobmV0bGlzdC50cmFuQ29tbWFuZClcbiAgfVxuXG4gIC8vIEVuZCB3aXRoIC5FTkRcbiAgbGluZXMucHVzaChcIi5FTkRcIilcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIiwgImltcG9ydCB7IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyB9IGZyb20gXCIuLi9zcGljZS11dGlscy9jb252ZXJ0U3BpY2VOZXRsaXN0VG9TdHJpbmdcIlxuaW1wb3J0IHR5cGUgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcIi4vU3BpY2VTdWJjaXJjdWl0XCJcblxuZXhwb3J0IGNsYXNzIFNwaWNlTmV0bGlzdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgY29tcG9uZW50czogU3BpY2VDb21wb25lbnRbXVxuICBub2RlczogU2V0PHN0cmluZz5cbiAgY29udHJvbHM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXRzOiBTcGljZVN1YmNpcmN1aXRbXVxuICBtb2RlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgdHJhbkNvbW1hbmQ6IHN0cmluZyB8IG51bGxcbiAgcHJpbnRTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy50cmFuQ29tbWFuZCA9IG51bGxcbiAgICB0aGlzLnByaW50U3RhdGVtZW50cyA9IFtdXG4gIH1cblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBTcGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudClcbiAgICAvLyBBZGQgbm9kZXMgdG8gdGhlIHNldFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjb21wb25lbnQubm9kZXMpIHtcbiAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3ViY2lyY3VpdChzdWJjaXJjdWl0OiBTcGljZVN1YmNpcmN1aXQpIHtcbiAgICBpZiAodGhpcy5zdWJjaXJjdWl0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHN1YmNpcmN1aXQubmFtZSkpIHJldHVyblxuICAgIHRoaXMuc3ViY2lyY3VpdHMucHVzaChzdWJjaXJjdWl0KVxuICB9XG5cbiAgdG9TcGljZVN0cmluZygpIHtcbiAgICByZXR1cm4gY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nKHRoaXMpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi4vc3BpY2UtY29tbWFuZHMvQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBjbGFzcyBTcGljZUNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBjb21tYW5kOiBCYXNlU3BpY2VDb21tYW5kXG4gIG5vZGVzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZCwgbm9kZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLm5vZGVzID0gbm9kZXNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnRvU3BpY2VTdHJpbmcoKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFYke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlvZGVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBEaW9kZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImRpb2RlXCIgYXMgY29uc3RcbiAgcHJvcHM6IERpb2RlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IERpb2RlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgRCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgaW5pdGlhbENvbmRpdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJpbmR1Y3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSwgaW5pdGlhbENvbmRpdGlvbiB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHttb2RlbH1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBwb3NpdGl2ZUNvbnRyb2w6IHN0cmluZ1xuICBuZWdhdGl2ZUNvbnRyb2w6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInZvbHRhZ2VfY29udHJvbGxlZF9zd2l0Y2hcIiBhcyBjb25zdFxuICBwcm9wczogVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgcG9zaXRpdmVDb250cm9sLFxuICAgICAgbmVnYXRpdmVDb250cm9sLFxuICAgICAgbW9kZWwsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gYFMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX0gJHtwb3NpdGl2ZUNvbnRyb2x9ICR7bmVnYXRpdmVDb250cm9sfSAke21vZGVsfWBcbiAgfVxufVxuIiwgImltcG9ydCB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBSZXNpc3RvckNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9SZXNpc3RvckNvbW1hbmRcIlxuaW1wb3J0IHsgQ2FwYWNpdG9yQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0NhcGFjaXRvckNvbW1hbmRcIlxuaW1wb3J0IHsgVm9sdGFnZVNvdXJjZUNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZFwiXG5pbXBvcnQgeyBEaW9kZUNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9EaW9kZUNvbW1hbmRcIlxuaW1wb3J0IHsgSW5kdWN0b3JDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kXCJcbmltcG9ydCB7IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL1ZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFwiXG5pbXBvcnQgdHlwZSB7XG4gIEFueUNpcmN1aXRFbGVtZW50LFxuICBTaW11bGF0aW9uU3dpdGNoLFxuICBTaW11bGF0aW9uVm9sdGFnZVByb2JlLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24gfSBmcm9tIFwiY2lyY3VpdC1qc29uLXRvLWNvbm5lY3Rpdml0eS1tYXBcIlxuaW1wb3J0IHsgc3UgfSBmcm9tIFwiQHRzY2lyY3VpdC9jaXJjdWl0LWpzb24tdXRpbFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjdWl0SnNvblRvU3BpY2UoXG4gIGNpcmN1aXRKc29uOiBBbnlDaXJjdWl0RWxlbWVudFtdLFxuKTogU3BpY2VOZXRsaXN0IHtcbiAgY29uc3QgbmV0bGlzdCA9IG5ldyBTcGljZU5ldGxpc3QoXCIqIENpcmN1aXQgSlNPTiB0byBTUElDRSBOZXRsaXN0XCIpXG4gIGNvbnN0IHNvdXJjZUNvbXBvbmVudHMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX2NvbXBvbmVudC5saXN0KClcbiAgY29uc3Qgc291cmNlUG9ydHMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3BvcnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVRyYWNlcyA9IHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfdHJhY2UubGlzdCgpXG4gIGNvbnN0IHNpbXVsYXRpb25Qcm9iZXMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlXCIsXG4gICkgYXMgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZVtdXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hlcyA9IGNpcmN1aXRKc29uXG4gICAgLmZpbHRlcihcbiAgICAgIChlbGVtZW50KSA9PiAoZWxlbWVudCBhcyB7IHR5cGU/OiBzdHJpbmcgfSkudHlwZSA9PT0gXCJzaW11bGF0aW9uX3N3aXRjaFwiLFxuICAgIClcbiAgICAubWFwKChlbGVtZW50KSA9PiBlbGVtZW50IGFzIHVua25vd24gYXMgU2ltdWxhdGlvblN3aXRjaClcbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTaW11bGF0aW9uU3dpdGNoPigpXG5cbiAgZm9yIChjb25zdCBzaW1Td2l0Y2ggb2Ygc2ltdWxhdGlvblN3aXRjaGVzKSB7XG4gICAgaWYgKHNpbVN3aXRjaC5zb3VyY2VfY29tcG9uZW50X2lkKSB7XG4gICAgICBzaW11bGF0aW9uU3dpdGNoTWFwLnNldChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCwgc2ltU3dpdGNoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbm5NYXAgPSBnZXRTb3VyY2VQb3J0Q29ubmVjdGl2aXR5TWFwRnJvbUNpcmN1aXRKc29uKGNpcmN1aXRKc29uKVxuXG4gIC8vIENyZWF0ZSBub2RlIG1hcHBpbmcgZnJvbSBwb3J0IGNvbm5lY3Rpb25zXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGNvbnN0IG5ldFRvTm9kZU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGxldCBub2RlQ291bnRlciA9IDFcblxuICBjb25zdCBwcm9iZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgaWYgKHByb2JlLm5hbWUpIHtcbiAgICAgICAgcHJvYmVOYW1lcy5hZGQocHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgcHJvYmUgbmFtZXMgbGlrZSBOMSwgTjIsIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGNvbmZsaWN0c1xuICBjb25zdCBudW1lcmljUHJvYmVOYW1lcyA9IFsuLi5wcm9iZU5hbWVzXVxuICAgIC5tYXAoKG5hbWUpID0+IC9eTihcXGQrKSQvaS5leGVjKG5hbWUpKVxuICAgIC5maWx0ZXIoKG0pOiBtIGlzIFJlZ0V4cEV4ZWNBcnJheSA9PiBtICE9PSBudWxsKVxuICAgIC5tYXAoKG0pID0+IHBhcnNlSW50KG1bMV0sIDEwKSlcblxuICBpZiAobnVtZXJpY1Byb2JlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vZGVDb3VudGVyID0gTWF0aC5tYXgoLi4ubnVtZXJpY1Byb2JlTmFtZXMpICsgMVxuICB9XG5cbiAgY29uc3QgZ3JvdW5kTmV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgLy8gRmluZCBncm91bmQgZnJvbSBzb3VyY2UgbmV0cyB0aGF0IGluY2x1ZGUgXCJnbmRcIiBpbiB0aGUgbmFtZVxuICBjb25zdCBnbmRTb3VyY2VOZXRJZHMgPSBuZXcgU2V0KFxuICAgIHN1KGNpcmN1aXRKc29uKVxuICAgICAgLnNvdXJjZV9uZXQubGlzdCgpXG4gICAgICAuZmlsdGVyKChzbikgPT4gc24ubmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImduZFwiKSlcbiAgICAgIC5tYXAoKHNuKSA9PiBzbi5zb3VyY2VfbmV0X2lkKSxcbiAgKVxuXG4gIGlmIChnbmRTb3VyY2VOZXRJZHMuc2l6ZSA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfdHJhY2UubGlzdCgpKSB7XG4gICAgICBpZiAodHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzT25HbmROZXQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuc29tZSgobmV0SWQpID0+XG4gICAgICAgICAgZ25kU291cmNlTmV0SWRzLmhhcyhuZXRJZCksXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzT25HbmROZXQpIHtcbiAgICAgICAgICBjb25zdCBhUG9ydE9uR25kID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgICAgIGNvbnN0IGduZE5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChhUG9ydE9uR25kKVxuICAgICAgICAgIGlmIChnbmROZXQpIHtcbiAgICAgICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZE5ldClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaW5kIGdyb3VuZCBub2RlIGZyb20gcG9ydHMgbmFtZWQgXCJHTkRcIlxuICBjb25zdCBncm91bmRQb3J0cyA9IHNvdXJjZVBvcnRzLmZpbHRlcigocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImduZFwiKVxuICBmb3IgKGNvbnN0IGdyb3VuZFBvcnQgb2YgZ3JvdW5kUG9ydHMpIHtcbiAgICBjb25zdCBncm91bmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoZ3JvdW5kUG9ydC5zb3VyY2VfcG9ydF9pZClcbiAgICBpZiAoZ3JvdW5kTmV0KSB7XG4gICAgICBncm91bmROZXRzLmFkZChncm91bmROZXQpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBzaW1Tb3VyY2Ugb2Ygc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpKSB7XG4gICAgY29uc3QgbmVnX3BvcnRfaWQgPVxuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkID8/XG4gICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgaWYgKG5lZ19wb3J0X2lkKSB7XG4gICAgICBjb25zdCBnbmRfbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKG5lZ19wb3J0X2lkKVxuICAgICAgaWYgKGduZF9uZXQpIHtcbiAgICAgICAgZ3JvdW5kTmV0cy5hZGQoZ25kX25ldClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGdyb3VuZE5ldCBvZiBncm91bmROZXRzKSB7XG4gICAgbmV0VG9Ob2RlTmFtZS5zZXQoZ3JvdW5kTmV0LCBcIjBcIilcbiAgfVxuXG4gIC8vIFByZS1hc3NpZ24gbm9kZSBuYW1lcyBmcm9tIHZvbHRhZ2UgcHJvYmVzXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmICghcHJvYmUubmFtZSkgY29udGludWVcblxuICAgICAgaWYgKFxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWQgfHxcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgbmV0OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG4gICAgICBjb25zdCBzaWduYWxfcG9ydF9pZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3Qgc2lnbmFsX25ldF9pZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfbmV0X2lkXG5cbiAgICAgIGlmIChzaWduYWxfcG9ydF9pZCkge1xuICAgICAgICBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoc2lnbmFsX3BvcnRfaWQpXG4gICAgICB9IGVsc2UgaWYgKHNpZ25hbF9uZXRfaWQpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSBzb3VyY2VUcmFjZXMuZmluZCgodCkgPT5cbiAgICAgICAgICB0LmNvbm5lY3RlZF9zb3VyY2VfbmV0X2lkcy5pbmNsdWRlcyhzaWduYWxfbmV0X2lkISksXG4gICAgICAgIClcbiAgICAgICAgaWYgKHRyYWNlICYmIHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBvcnRJZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQocG9ydElkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXQpIHtcbiAgICAgICAgaWYgKCFuZXRUb05vZGVOYW1lLmhhcyhuZXQpKSB7XG4gICAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBwcm9iZS5uYW1lKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNpZ25hbF9wb3J0X2lkICYmIHByb2JlLm5hbWUpIHtcbiAgICAgICAgLy8gSXQncyBhIGZsb2F0aW5nIHBvcnQgd2l0aCBhIHByb2JlLCBzbyB3ZSBtYXAgaXQgZGlyZWN0bHkuIFRoaXMgcG9ydFxuICAgICAgICAvLyB3aWxsIG5vdyBiZSBza2lwcGVkIGluIHRoZSBzZWNvbmQtcGFzcyBmb3IgdW5jb25uZWN0ZWQgcG9ydHMuXG4gICAgICAgIG5vZGVNYXAuc2V0KHNpZ25hbF9wb3J0X2lkLCBwcm9iZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IHBhc3M6IGFzc2lnbiBub2RlIG51bWJlcnMgdG8gYWxsIGNvbm5lY3RlZCBuZXRzXG4gIGZvciAoY29uc3QgcG9ydCBvZiBzb3VyY2VQb3J0cykge1xuICAgIGNvbnN0IHBvcnRJZCA9IHBvcnQuc291cmNlX3BvcnRfaWRcbiAgICBjb25zdCBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQocG9ydElkKVxuICAgIGlmIChuZXQpIHtcbiAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICBuZXRUb05vZGVOYW1lLnNldChuZXQsIGBOJHtub2RlQ291bnRlcisrfWApXG4gICAgICB9XG4gICAgICBub2RlTWFwLnNldChwb3J0SWQsIG5ldFRvTm9kZU5hbWUuZ2V0KG5ldCkhKVxuICAgIH1cbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIHVuY29ubmVjdGVkIHBvcnRzXG4gIGZvciAoY29uc3QgcG9ydCBvZiBzb3VyY2VQb3J0cykge1xuICAgIGNvbnN0IHBvcnRJZCA9IHBvcnQuc291cmNlX3BvcnRfaWRcbiAgICAvLyBJZiBhIHBvcnQgd2Fzbid0IGluIGEgbmV0LCBpdCB3b24ndCBiZSBpbiB0aGUgbm9kZU1hcCB5ZXRcbiAgICBpZiAoIW5vZGVNYXAuaGFzKHBvcnRJZCkpIHtcbiAgICAgIC8vIFVuY29ubmVjdGVkIHBvcnQsIGNyZWF0ZSBhIG5ldyBmbG9hdGluZyBub2RlIGZvciBpdFxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3MgZWFjaCBjb21wb25lbnRcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc291cmNlQ29tcG9uZW50cykge1xuICAgIGlmIChjb21wb25lbnQudHlwZSAhPT0gXCJzb3VyY2VfY29tcG9uZW50XCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBjb21wb25lbnRQb3J0cyA9IHN1KGNpcmN1aXRKc29uKVxuICAgICAgLnNvdXJjZV9wb3J0Lmxpc3Qoe1xuICAgICAgICBzb3VyY2VfY29tcG9uZW50X2lkOiBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEucGluX251bWJlciA/PyAwKSAtIChiLnBpbl9udW1iZXIgPz8gMCkpXG5cbiAgICAvLyBHZXQgbm9kZSBuYW1lcyBmb3IgY29tcG9uZW50IHBvcnRzXG4gICAgY29uc3Qgbm9kZXMgPSBjb21wb25lbnRQb3J0cy5tYXAoKHBvcnQpID0+IHtcbiAgICAgIHJldHVybiBub2RlTWFwLmdldChwb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgU1BJQ0UgY29tcG9uZW50IGJhc2VkIG9uIHR5cGVcbiAgICBpZiAoXCJmdHlwZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgbGV0IHNwaWNlQ29tcG9uZW50OiBTcGljZUNvbXBvbmVudCB8IG51bGwgPSBudWxsXG5cbiAgICAgIHN3aXRjaCAoY29tcG9uZW50LmZ0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfcmVzaXN0b3JcIjoge1xuICAgICAgICAgIGlmIChcInJlc2lzdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZXNpc3RvckNtZCA9IG5ldyBSZXNpc3RvckNvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBub2Rlc1sxXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdFJlc2lzdGFuY2UoY29tcG9uZW50LnJlc2lzdGFuY2UpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgICBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcmVzaXN0b3JDbWQsXG4gICAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfc3dpdGNoXCI6IHtcbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZWRCYXNlID0gc2FuaXRpemVJZGVudGlmaWVyKFxuICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUgPz8gY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICAgICAgICBcIlNXXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVzWzBdIHx8IFwiMFwiXG4gICAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZXNbMV0gfHwgXCIwXCJcbiAgICAgICAgICBjb25zdCBjb250cm9sTm9kZSA9IGBOQ1RSTF8ke3Nhbml0aXplZEJhc2V9YFxuICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGBTV18ke3Nhbml0aXplZEJhc2V9YFxuXG4gICAgICAgICAgY29uc3QgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2ggPSBzaW11bGF0aW9uU3dpdGNoTWFwLmdldChcbiAgICAgICAgICAgIGNvbXBvbmVudC5zb3VyY2VfY29tcG9uZW50X2lkLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgICAgICAgICAgIGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGNvbnN0IHN3aXRjaENtZCA9IG5ldyBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2FuaXRpemVkQmFzZSxcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIHBvc2l0aXZlQ29udHJvbDogY29udHJvbE5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZUNvbnRyb2w6IFwiMFwiLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoc2FuaXRpemVkQmFzZSwgc3dpdGNoQ21kLCBbXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICBjb250cm9sTm9kZSxcbiAgICAgICAgICAgIFwiMFwiLFxuICAgICAgICAgIF0pXG5cbiAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQoXG4gICAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gU1coUm9uPTAuMSBSb2ZmPTFlOSBWdD0yLjUgVmg9MC4xKWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29udHJvbFNvdXJjZU5hbWUgPSBgQ1RSTF8ke3Nhbml0aXplZEJhc2V9YFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogY29udHJvbFNvdXJjZU5hbWUsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IGNvbnRyb2xOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBcIjBcIixcbiAgICAgICAgICAgIHZhbHVlOiBjb250cm9sVmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBjb250cm9sU291cmNlTmFtZSxcbiAgICAgICAgICAgIGNvbnRyb2xTb3VyY2VDbWQsXG4gICAgICAgICAgICBbY29udHJvbE5vZGUsIFwiMFwiXSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChjb250cm9sQ29tcG9uZW50KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwic2ltcGxlX2NhcGFjaXRvclwiOiB7XG4gICAgICAgICAgaWYgKFwiY2FwYWNpdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjYXBhY2l0b3JDbWQgPSBuZXcgQ2FwYWNpdG9yQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IG5vZGVzWzBdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0Q2FwYWNpdGFuY2UoY29tcG9uZW50LmNhcGFjaXRhbmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIGNhcGFjaXRvckNtZCxcbiAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9kaW9kZVwiOiB7XG4gICAgICAgICAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgYW5vZGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImFub2RlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiYW5vZGVcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBjYXRob2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJjYXRob2RlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiY2F0aG9kZVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9XG4gICAgICAgICAgICAgIG5vZGVNYXAuZ2V0KGFub2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9XG4gICAgICAgICAgICAgIG5vZGVNYXAuZ2V0KGNhdGhvZGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuXG4gICAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBcIkRcIlxuICAgICAgICAgICAgY29uc3QgZGlvZGVDbWQgPSBuZXcgRGlvZGVDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLCAvLyBnZW5lcmljIG1vZGVsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KG1vZGVsTmFtZSwgYC5NT0RFTCAke21vZGVsTmFtZX0gRGApXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSwgZGlvZGVDbWQsIFtcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfaW5kdWN0b3JcIjoge1xuICAgICAgICAgIGlmIChcImluZHVjdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmR1Y3RvckNtZCA9IG5ldyBJbmR1Y3RvckNvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBub2Rlc1sxXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdEluZHVjdGFuY2UoY29tcG9uZW50LmluZHVjdGFuY2UpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgICBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgaW5kdWN0b3JDbWQsXG4gICAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfbW9zZmV0XCI6IHtcbiAgICAgICAgICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBkcmFpblBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZHJhaW5cIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJkcmFpblwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGdhdGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImdhdGVcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJnYXRlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgc291cmNlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJzb3VyY2VcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJzb3VyY2VcIiksXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGRyYWluTm9kZSA9XG4gICAgICAgICAgICAgIG5vZGVNYXAuZ2V0KGRyYWluUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IGdhdGVOb2RlID0gbm9kZU1hcC5nZXQoZ2F0ZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VOb2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoc291cmNlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcblxuICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gXCJTV01PRFwiXG4gICAgICAgICAgICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogZHJhaW5Ob2RlLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGU6IHNvdXJjZU5vZGUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlQ29udHJvbDogZ2F0ZU5vZGUsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlQ29udHJvbDogc291cmNlTm9kZSxcbiAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQobW9kZWxOYW1lLCBgLk1PREVMICR7bW9kZWxOYW1lfSBTV2ApXG5cbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBzd2l0Y2hDbWQsIFtcbiAgICAgICAgICAgICAgZHJhaW5Ob2RlLFxuICAgICAgICAgICAgICBnYXRlTm9kZSxcbiAgICAgICAgICAgICAgc291cmNlTm9kZSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNwaWNlQ29tcG9uZW50KSB7XG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3Mgc2ltdWxhdGlvbiB2b2x0YWdlIHNvdXJjZXNcbiAgY29uc3Qgc2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzID1cbiAgICBzdShjaXJjdWl0SnNvbikuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZS5saXN0KClcblxuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMpIHtcbiAgICBpZiAoc2ltU291cmNlLnR5cGUgIT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZVwiKSBjb250aW51ZVxuXG4gICAgaWYgKChzaW1Tb3VyY2UgYXMgYW55KS5pc19kY19zb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAvLyBBQyBTb3VyY2VcbiAgICAgIGlmIChcbiAgICAgICAgXCJ0ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgXCJ0ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCAmJlxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldCgoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgbGV0IHZhbHVlID0gXCJcIlxuICAgICAgICBjb25zdCB3YXZlX3NoYXBlID0gKHNpbVNvdXJjZSBhcyBhbnkpLndhdmVfc2hhcGVcbiAgICAgICAgaWYgKHdhdmVfc2hhcGUgPT09IFwic2luZXdhdmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfb2Zmc2V0ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCB2X3BlYWsgPSAoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IChzaW1Tb3VyY2UgYXMgYW55KS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBkYW1waW5nX2ZhY3RvciA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSAoc2ltU291cmNlIGFzIGFueSkucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7dl9vZmZzZXR9ICR7dl9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSA/PyAwfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCB2X3B1bHNlZCA9IChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gKHNpbVNvdXJjZSBhcyBhbnkpLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgcGVyaW9kID0gKHNpbVNvdXJjZSBhcyBhbnkpLnBlcmlvZCA/PyBwZXJpb2RfZnJvbV9mcmVxXG4gICAgICAgICAgY29uc3QgZHV0eV9jeWNsZSA9IChzaW1Tb3VyY2UgYXMgYW55KS5kdXR5X2N5Y2xlID8/IDAuNVxuICAgICAgICAgIGNvbnN0IHB1bHNlX3dpZHRoID0gcGVyaW9kICogZHV0eV9jeWNsZVxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMFxuICAgICAgICAgIGNvbnN0IHJpc2VfdGltZSA9IFwiMW5cIlxuICAgICAgICAgIGNvbnN0IGZhbGxfdGltZSA9IFwiMW5cIlxuICAgICAgICAgIHZhbHVlID0gYFBVTFNFKCR7dl9pbml0aWFsfSAke3ZfcHVsc2VkfSAke2RlbGF5fSAke3Jpc2VfdGltZX0gJHtmYWxsX3RpbWV9ICR7cHVsc2Vfd2lkdGh9ICR7cGVyaW9kfSlgXG4gICAgICAgIH0gZWxzZSBpZiAoKHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gYERDICR7KHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2V9YFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3Qgdm9sdGFnZVNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgdm9sdGFnZVNvdXJjZUNtZCxcbiAgICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgICAgKVxuICAgICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERDIFNvdXJjZSAoaXNfZGNfc291cmNlIGlzIHRydWUgb3IgdW5kZWZpbmVkKVxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPVxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkucG9zaXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3QgbmVnYXRpdmVQb3J0SWQgPVxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkubmVnYXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwidm9sdGFnZVwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlfWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgdm9sdGFnZVNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNpbUV4cGVyaW1lbnQgPSBjaXJjdWl0SnNvbi5maW5kKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fZXhwZXJpbWVudFwiLFxuICApXG5cbiAgaWYgKHNpbUV4cGVyaW1lbnQpIHtcbiAgICAvLyBQcm9jZXNzIHNpbXVsYXRpb24gdm9sdGFnZSBwcm9iZXNcbiAgICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2Rlc1RvUHJvYmUgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgICBjb25zdCBnZXRQb3J0SWRGcm9tTmV0SWQgPSAobmV0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB0cmFjZSA9IHNvdXJjZVRyYWNlcy5maW5kKCh0KSA9PlxuICAgICAgICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKG5ldElkKSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdHJhY2U/LmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICAgIGxldCBzaWduYWxQb3J0SWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgICAgaWYgKCFzaWduYWxQb3J0SWQpIHtcbiAgICAgICAgICBjb25zdCBzaWduYWxOZXRJZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICAgICAgaWYgKHNpZ25hbE5ldElkKSB7XG4gICAgICAgICAgICBzaWduYWxQb3J0SWQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoc2lnbmFsTmV0SWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaWduYWxQb3J0SWQpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3Qgc2lnbmFsTm9kZU5hbWUgPSBub2RlTWFwLmdldChzaWduYWxQb3J0SWQpXG4gICAgICAgIGlmICghc2lnbmFsTm9kZU5hbWUpIGNvbnRpbnVlXG5cbiAgICAgICAgbGV0IHJlZmVyZW5jZVBvcnRJZCA9IHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgICBpZiAoIXJlZmVyZW5jZVBvcnRJZCAmJiBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZCkge1xuICAgICAgICAgIHJlZmVyZW5jZVBvcnRJZCA9IGdldFBvcnRJZEZyb21OZXRJZChcbiAgICAgICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWZlcmVuY2VQb3J0SWQpIHtcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlTmFtZSA9IG5vZGVNYXAuZ2V0KHJlZmVyZW5jZVBvcnRJZClcbiAgICAgICAgICBpZiAocmVmZXJlbmNlTm9kZU5hbWUgJiYgcmVmZXJlbmNlTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKGBWKCR7c2lnbmFsTm9kZU5hbWV9LCR7cmVmZXJlbmNlTm9kZU5hbWV9KWApXG4gICAgICAgICAgfSBlbHNlIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoYFYoJHtzaWduYWxOb2RlTmFtZX0pYClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2luZ2xlLWVuZGVkIHByb2JlXG4gICAgICAgICAgaWYgKHNpZ25hbE5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChgVigke3NpZ25hbE5vZGVOYW1lfSlgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIG5vZGVzVG9Qcm9iZS5zaXplID4gMCAmJlxuICAgICAgICAoc2ltRXhwZXJpbWVudCBhcyBhbnkpLmV4cGVyaW1lbnRfdHlwZT8uaW5jbHVkZXMoXCJ0cmFuc2llbnRcIilcbiAgICAgICkge1xuICAgICAgICBuZXRsaXN0LnByaW50U3RhdGVtZW50cy5wdXNoKFxuICAgICAgICAgIGAuUFJJTlQgVFJBTiAke1suLi5ub2Rlc1RvUHJvYmVdLmpvaW4oXCIgXCIpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0aW1lUGVyU3RlcCA9IChzaW1FeHBlcmltZW50IGFzIGFueSkudGltZV9wZXJfc3RlcFxuICAgIGNvbnN0IGVuZFRpbWUgPSAoc2ltRXhwZXJpbWVudCBhcyBhbnkpLmVuZF90aW1lX21zXG4gICAgY29uc3Qgc3RhcnRUaW1lTXMgPSAoc2ltRXhwZXJpbWVudCBhcyBhbnkpLnN0YXJ0X3RpbWVfbXNcblxuICAgIGlmICh0aW1lUGVyU3RlcCAmJiBlbmRUaW1lKSB7XG4gICAgICAvLyBjaXJjdWl0LWpzb24gdmFsdWVzIGFyZSBpbiBtcywgU1BJQ0UgcmVxdWlyZXMgc2Vjb25kc1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gKHN0YXJ0VGltZU1zID8/IDApIC8gMTAwMFxuXG4gICAgICBsZXQgdHJhbkNtZCA9IGAudHJhbiAke2Zvcm1hdE51bWJlckZvclNwaWNlKFxuICAgICAgICB0aW1lUGVyU3RlcCAvIDEwMDAsXG4gICAgICApfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGVuZFRpbWUgLyAxMDAwKX1gXG4gICAgICBpZiAoc3RhcnRUaW1lID4gMCkge1xuICAgICAgICB0cmFuQ21kICs9IGAgJHtmb3JtYXROdW1iZXJGb3JTcGljZShzdGFydFRpbWUpfWBcbiAgICAgIH1cbiAgICAgIHRyYW5DbWQgKz0gXCIgVUlDXCJcbiAgICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgPSB0cmFuQ21kXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldGxpc3Rcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzaXN0YW5jZShyZXNpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmVzaXN0YW5jZSA+PSAxZTYpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWU2fU1FR2BcbiAgaWYgKHJlc2lzdGFuY2UgPj0gMWUzKSByZXR1cm4gYCR7cmVzaXN0YW5jZSAvIDFlM31LYFxuICByZXR1cm4gcmVzaXN0YW5jZS50b1N0cmluZygpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdENhcGFjaXRhbmNlKGNhcGFjaXRhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWUzfU1gXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS02KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTZ9VWBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTkpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlOX1OYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlMTJ9UGBcbiAgcmV0dXJuIGNhcGFjaXRhbmNlLnRvU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0SW5kdWN0YW5jZShpbmR1Y3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5kdWN0YW5jZSA+PSAxKSByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG4gIGlmIChpbmR1Y3RhbmNlID49IDFlLTMpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUzfW1gXG4gIGlmIChpbmR1Y3RhbmNlID49IDFlLTYpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWU2fXVgXG4gIGlmIChpbmR1Y3RhbmNlID49IDFlLTkpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWU5fW5gXG4gIGlmIChpbmR1Y3RhbmNlID49IDFlLTEyKSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlMTJ9cGBcbiAgcmV0dXJuIGluZHVjdGFuY2UudG9TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJlZml4OiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHByZWZpeFxuICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKVxuICBpZiAoIXNhbml0aXplZCkgcmV0dXJuIHByZWZpeFxuICBpZiAoL15bMC05XS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1fJHtzYW5pdGl6ZWR9YFxuICB9XG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuZnVuY3Rpb24gYnVpbGRTaW11bGF0aW9uU3dpdGNoQ29udHJvbFZhbHVlKFxuICBzaW11bGF0aW9uU3dpdGNoOiBTaW11bGF0aW9uU3dpdGNoIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IGhpZ2hWb2x0YWdlID0gNVxuICBjb25zdCBsb3dWb2x0YWdlID0gMFxuICBjb25zdCByaXNlVGltZSA9IFwiMW5cIlxuICBjb25zdCBmYWxsVGltZSA9IFwiMW5cIlxuXG4gIGlmICghc2ltdWxhdGlvblN3aXRjaCkge1xuICAgIHJldHVybiBgREMgJHtsb3dWb2x0YWdlfWBcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0c0Nsb3NlZCA9IHNpbXVsYXRpb25Td2l0Y2guc3RhcnRzX2Nsb3NlZCA/PyBmYWxzZVxuICBjb25zdCBjbG9zZXNBdCA9IHNpbXVsYXRpb25Td2l0Y2guY2xvc2VzX2F0ID8/IDBcbiAgY29uc3Qgb3BlbnNBdCA9IHNpbXVsYXRpb25Td2l0Y2gub3BlbnNfYXRcbiAgY29uc3Qgc3dpdGNoaW5nRnJlcXVlbmN5ID0gc2ltdWxhdGlvblN3aXRjaC5zd2l0Y2hpbmdfZnJlcXVlbmN5XG5cbiAgY29uc3QgW2luaXRpYWxWb2x0YWdlLCBwdWxzZWRWb2x0YWdlXSA9IHN0YXJ0c0Nsb3NlZFxuICAgID8gW2hpZ2hWb2x0YWdlLCBsb3dWb2x0YWdlXVxuICAgIDogW2xvd1ZvbHRhZ2UsIGhpZ2hWb2x0YWdlXVxuXG4gIGlmIChzd2l0Y2hpbmdGcmVxdWVuY3kgJiYgc3dpdGNoaW5nRnJlcXVlbmN5ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IDEgLyBzd2l0Y2hpbmdGcmVxdWVuY3lcbiAgICBjb25zdCB3aWR0aEZyb21PcGVuQ2xvc2UgPVxuICAgICAgb3BlbnNBdCAmJiBvcGVuc0F0ID4gY2xvc2VzQXQgPyBNYXRoLm1pbihvcGVuc0F0IC0gY2xvc2VzQXQsIHBlcmlvZCkgOiAwXG4gICAgY29uc3QgcHVsc2VXaWR0aCA9XG4gICAgICB3aWR0aEZyb21PcGVuQ2xvc2UgPiAwID8gd2lkdGhGcm9tT3BlbkNsb3NlIDogTWF0aC5tYXgocGVyaW9kIC8gMiwgMWUtOSlcblxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIGlmIChvcGVuc0F0ICE9PSB1bmRlZmluZWQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0KSB7XG4gICAgY29uc3QgcHVsc2VXaWR0aCA9IE1hdGgubWF4KG9wZW5zQXQgLSBjbG9zZXNBdCwgMWUtOSlcbiAgICBjb25zdCBwZXJpb2QgPSBjbG9zZXNBdCArIHB1bHNlV2lkdGggKiAyXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAoY2xvc2VzQXQgPiAwKSB7XG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKiAyXG4gICAgY29uc3QgcHVsc2VXaWR0aCA9IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgcmV0dXJuIGBEQyAke3N0YXJ0c0Nsb3NlZCA/IGhpZ2hWb2x0YWdlIDogbG93Vm9sdGFnZX1gXG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bWJlckZvclNwaWNlKHZhbHVlOiBudW1iZXIpIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gYCR7dmFsdWV9YFxuICBpZiAodmFsdWUgPT09IDApIHJldHVybiBcIjBcIlxuXG4gIGNvbnN0IGFic1ZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGFic1ZhbHVlID49IDFlMyB8fCBhYnNWYWx1ZSA8PSAxZS0zKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0V4cG9uZW50aWFsKDYpKS50b1N0cmluZygpXG4gIH1cblxuICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvUHJlY2lzaW9uKDYpKS50b1N0cmluZygpXG59XG4iLCAiZXhwb3J0IGNsYXNzIFNwaWNlU3ViY2lyY3VpdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBwaW5zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcGluczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5waW5zID0gcGluc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBpblN0cmluZyA9IHRoaXMucGlucy5qb2luKFwiIFwiKVxuICAgIGNvbnN0IGhlYWRlciA9IGAuU1VCQ0tUICR7dGhpcy5uYW1lfSAke3BpblN0cmluZ31gXG4gICAgY29uc3QgZm9vdGVyID0gYC5FTkRTICR7dGhpcy5uYW1lfWBcblxuICAgIGNvbnN0IGJvZHkgPSBgKiBQbGFjZWhvbGRlciBmb3IgJHt0aGlzLm5hbWV9LiBObyBkZWZpbml0aW9uIGZvdW5kIGluIGNpcmN1aXQgSlNPTi5gXG5cbiAgICByZXR1cm4gW1wiXCIsIGhlYWRlciwgYm9keSwgZm9vdGVyXS5qb2luKFwiXFxuXCIpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBCSlRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgY29sbGVjdG9yOiBzdHJpbmdcbiAgYmFzZTogc3RyaW5nXG4gIGVtaXR0ZXI6IHN0cmluZ1xuICBzdWJzdHJhdGU/OiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCSlRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJianRcIiBhcyBjb25zdFxuICBwcm9wczogQkpUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEJKVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgY29sbGVjdG9yLCBiYXNlLCBlbWl0dGVyLCBzdWJzdHJhdGUsIG1vZGVsLCBhcmVhIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBRJHtuYW1lfSAke2NvbGxlY3Rvcn0gJHtiYXNlfSAke2VtaXR0ZXJ9YFxuICAgIGlmIChzdWJzdHJhdGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHtzdWJzdHJhdGV9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIGlmIChhcmVhKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7YXJlYX1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICBhY01hZ25pdHVkZT86IHN0cmluZ1xuICBhY1BoYXNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDdXJyZW50U291cmNlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiY3VycmVudF9zb3VyY2VcIiBhcyBjb25zdFxuICBwcm9wczogQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgdmFsdWUsIGFjTWFnbml0dWRlLCBhY1BoYXNlIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBJJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICB9XG4gICAgaWYgKGFjTWFnbml0dWRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEFDICR7YWNNYWduaXR1ZGV9YFxuICAgICAgaWYgKGFjUGhhc2UpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FjUGhhc2V9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgaW5kdWN0b3JzOiBzdHJpbmdbXVxuICBjb3VwbGluZzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JfY291cGxpbmdcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBpbmR1Y3RvcnMsIGNvdXBsaW5nIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBLJHtuYW1lfSAke2luZHVjdG9ycy5qb2luKFwiIFwiKX0gJHtjb3VwbGluZ31gXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBKRkVUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRyYWluOiBzdHJpbmdcbiAgZ2F0ZTogc3RyaW5nXG4gIHNvdXJjZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSkZFVENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImpmZXRcIiBhcyBjb25zdFxuICBwcm9wczogSkZFVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBKRkVUQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBkcmFpbiwgZ2F0ZSwgc291cmNlLCBtb2RlbCwgYXJlYSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBKJHtuYW1lfSAke2RyYWlufSAke2dhdGV9ICR7c291cmNlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIE1PU0ZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBzdWJzdHJhdGU6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGxlbmd0aD86IHN0cmluZ1xuICB3aWR0aD86IHN0cmluZ1xuICBkcmFpbkFyZWE/OiBzdHJpbmdcbiAgc291cmNlQXJlYT86IHN0cmluZ1xuICBkcmFpblBlcmltZXRlcj86IHN0cmluZ1xuICBzb3VyY2VQZXJpbWV0ZXI/OiBzdHJpbmdcbiAgZHJhaW5SZXNpc3RhbmNlPzogc3RyaW5nXG4gIHNvdXJjZVJlc2lzdGFuY2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIE1PU0ZFVENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcIm1vc2ZldFwiIGFzIGNvbnN0XG4gIHByb3BzOiBNT1NGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIGRyYWluLFxuICAgICAgZ2F0ZSxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHN1YnN0cmF0ZSxcbiAgICAgIG1vZGVsLFxuICAgICAgbGVuZ3RoLFxuICAgICAgd2lkdGgsXG4gICAgICBkcmFpbkFyZWEsXG4gICAgICBzb3VyY2VBcmVhLFxuICAgICAgZHJhaW5QZXJpbWV0ZXIsXG4gICAgICBzb3VyY2VQZXJpbWV0ZXIsXG4gICAgICBkcmFpblJlc2lzdGFuY2UsXG4gICAgICBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTSR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHtzdWJzdHJhdGV9ICR7bW9kZWx9YFxuXG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge1xuICAgICAgTDogbGVuZ3RoLFxuICAgICAgVzogd2lkdGgsXG4gICAgICBBRDogZHJhaW5BcmVhLFxuICAgICAgQVM6IHNvdXJjZUFyZWEsXG4gICAgICBQRDogZHJhaW5QZXJpbWV0ZXIsXG4gICAgICBQUzogc291cmNlUGVyaW1ldGVyLFxuICAgICAgTlJEOiBkcmFpblJlc2lzdGFuY2UsXG4gICAgICBOUlM6IHNvdXJjZVJlc2lzdGFuY2UsXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMocGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7a2V5fT0ke3ZhbHVlfWBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBub2Rlczogc3RyaW5nW11cbiAgc3ViY2lyY3VpdE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgU3ViY2lyY3VpdENhbGxDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJzdWJjaXJjdWl0X2NhbGxcIiBhcyBjb25zdFxuICBwcm9wczogU3ViY2lyY3VpdENhbGxDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3ViY2lyY3VpdENhbGxDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIG5vZGVzLCBzdWJjaXJjdWl0TmFtZSB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgWCR7bmFtZX0gJHtub2Rlcy5qb2luKFwiIFwiKX0gJHtzdWJjaXJjdWl0TmFtZX1gXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGFQb3NpdGl2ZTogc3RyaW5nXG4gIGFOZWdhdGl2ZTogc3RyaW5nXG4gIGJQb3NpdGl2ZTogc3RyaW5nXG4gIGJOZWdhdGl2ZTogc3RyaW5nXG4gIGltcGVkYW5jZTogc3RyaW5nXG4gIGRlbGF5Pzogc3RyaW5nXG4gIGZyZXF1ZW5jeT86IHN0cmluZ1xuICBub3JtYWxpemVkTGVuZ3RoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc21pc3Npb25MaW5lQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidHJhbnNtaXNzaW9uX2xpbmVcIiBhcyBjb25zdFxuICBwcm9wczogVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIGFQb3NpdGl2ZSxcbiAgICAgIGFOZWdhdGl2ZSxcbiAgICAgIGJQb3NpdGl2ZSxcbiAgICAgIGJOZWdhdGl2ZSxcbiAgICAgIGltcGVkYW5jZSxcbiAgICAgIGRlbGF5LFxuICAgICAgZnJlcXVlbmN5LFxuICAgICAgbm9ybWFsaXplZExlbmd0aCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBUJHtuYW1lfSAke2FQb3NpdGl2ZX0gJHthTmVnYXRpdmV9ICR7YlBvc2l0aXZlfSAke2JOZWdhdGl2ZX0gWjA9JHtpbXBlZGFuY2V9YFxuICAgIGlmIChkZWxheSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBURD0ke2RlbGF5fWBcbiAgICB9IGVsc2UgaWYgKGZyZXF1ZW5jeSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBGPSR7ZnJlcXVlbmN5fWBcbiAgICAgIGlmIChub3JtYWxpemVkTGVuZ3RoKSB7XG4gICAgICAgIHNwaWNlU3RyaW5nICs9IGAgTkw9JHtub3JtYWxpemVkTGVuZ3RofWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLDhCQUE4QixDQUFDLFlBQWtDO0FBQzVFLFFBQU0sUUFBa0IsQ0FBQztBQUd6QixRQUFNLEtB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
|
|
959
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0N1cnJlbnRTb3VyY2VDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1N1YmNpcmN1aXRDYWxsQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgLy8gQWRkIHN1YmNpcmN1aXQgZGVmaW5pdGlvbnNcbiAgZm9yIChjb25zdCBzdWJjaXJjdWl0IG9mIG5ldGxpc3Quc3ViY2lyY3VpdHMpIHtcbiAgICBsaW5lcy5wdXNoKHN1YmNpcmN1aXQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzKVxuICB9XG5cbiAgLy8gQWRkIGNvbnRyb2wgYmxvY2sgaWYgcHJlc2VudFxuICBpZiAobmV0bGlzdC5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIi5jb250cm9sXCIpXG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LmNvbnRyb2xzKVxuICAgIGxpbmVzLnB1c2goXCIuZW5kY1wiKVxuICB9XG5cbiAgaWYgKFxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgJiZcbiAgICAhbGluZXMuc29tZSgobCkgPT4gbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiLnRyYW5cIikpXG4gICkge1xuICAgIGxpbmVzLnB1c2gobmV0bGlzdC50cmFuQ29tbWFuZClcbiAgfVxuXG4gIC8vIEVuZCB3aXRoIC5FTkRcbiAgbGluZXMucHVzaChcIi5FTkRcIilcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIiwgImltcG9ydCB7IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyB9IGZyb20gXCIuLi9zcGljZS11dGlscy9jb252ZXJ0U3BpY2VOZXRsaXN0VG9TdHJpbmdcIlxuaW1wb3J0IHR5cGUgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcIi4vU3BpY2VTdWJjaXJjdWl0XCJcblxuZXhwb3J0IGNsYXNzIFNwaWNlTmV0bGlzdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgY29tcG9uZW50czogU3BpY2VDb21wb25lbnRbXVxuICBub2RlczogU2V0PHN0cmluZz5cbiAgY29udHJvbHM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXRzOiBTcGljZVN1YmNpcmN1aXRbXVxuICBtb2RlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgdHJhbkNvbW1hbmQ6IHN0cmluZyB8IG51bGxcbiAgcHJpbnRTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy50cmFuQ29tbWFuZCA9IG51bGxcbiAgICB0aGlzLnByaW50U3RhdGVtZW50cyA9IFtdXG4gIH1cblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBTcGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudClcbiAgICAvLyBBZGQgbm9kZXMgdG8gdGhlIHNldFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjb21wb25lbnQubm9kZXMpIHtcbiAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3ViY2lyY3VpdChzdWJjaXJjdWl0OiBTcGljZVN1YmNpcmN1aXQpIHtcbiAgICBpZiAodGhpcy5zdWJjaXJjdWl0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHN1YmNpcmN1aXQubmFtZSkpIHJldHVyblxuICAgIHRoaXMuc3ViY2lyY3VpdHMucHVzaChzdWJjaXJjdWl0KVxuICB9XG5cbiAgdG9TcGljZVN0cmluZygpIHtcbiAgICByZXR1cm4gY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nKHRoaXMpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi4vc3BpY2UtY29tbWFuZHMvQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBjbGFzcyBTcGljZUNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBjb21tYW5kOiBCYXNlU3BpY2VDb21tYW5kXG4gIG5vZGVzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZCwgbm9kZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLm5vZGVzID0gbm9kZXNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnRvU3BpY2VTdHJpbmcoKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFYke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERpb2RlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRGlvZGVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJkaW9kZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCBhcmVhIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEQke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbD86IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIGluaXRpYWxDb25kaXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEluZHVjdG9yQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCBtb2RlbCwgdmFsdWUsIGluaXRpYWxDb25kaXRpb24gfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEwke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIGlmIChpbml0aWFsQ29uZGl0aW9uKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIElDPSR7aW5pdGlhbENvbmRpdGlvbn1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgcG9zaXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbmVnYXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX2NvbnRyb2xsZWRfc3dpdGNoXCIgYXMgY29uc3RcbiAgcHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIHBvc2l0aXZlQ29udHJvbCxcbiAgICAgIG5lZ2F0aXZlQ29udHJvbCxcbiAgICAgIG1vZGVsLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBTJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9ICR7cG9zaXRpdmVDb250cm9sfSAke25lZ2F0aXZlQ29udHJvbH0gJHttb2RlbH1gXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwiLi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgUmVzaXN0b3JDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvUmVzaXN0b3JDb21tYW5kXCJcbmltcG9ydCB7IENhcGFjaXRvckNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9DYXBhY2l0b3JDb21tYW5kXCJcbmltcG9ydCB7IFZvbHRhZ2VTb3VyY2VDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmRcIlxuaW1wb3J0IHsgQkpUQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmRcIlxuaW1wb3J0IHsgRGlvZGVDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvRGlvZGVDb21tYW5kXCJcbmltcG9ydCB7IEluZHVjdG9yQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0luZHVjdG9yQ29tbWFuZFwiXG5pbXBvcnQgeyBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRcIlxuaW1wb3J0IHR5cGUge1xuICBBbnlDaXJjdWl0RWxlbWVudCxcbiAgU2ltdWxhdGlvblN3aXRjaCxcbiAgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZSxcbn0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBnZXRTb3VyY2VQb3J0Q29ubmVjdGl2aXR5TWFwRnJvbUNpcmN1aXRKc29uIH0gZnJvbSBcImNpcmN1aXQtanNvbi10by1jb25uZWN0aXZpdHktbWFwXCJcbmltcG9ydCB7IHN1IH0gZnJvbSBcIkB0c2NpcmN1aXQvY2lyY3VpdC1qc29uLXV0aWxcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uU3dpdGNoZXMgPSBjaXJjdWl0SnNvblxuICAgIC5maWx0ZXIoXG4gICAgICAoZWxlbWVudCkgPT4gKGVsZW1lbnQgYXMgeyB0eXBlPzogc3RyaW5nIH0pLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zd2l0Y2hcIixcbiAgICApXG4gICAgLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudCBhcyB1bmtub3duIGFzIFNpbXVsYXRpb25Td2l0Y2gpXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hNYXAgPSBuZXcgTWFwPHN0cmluZywgU2ltdWxhdGlvblN3aXRjaD4oKVxuXG4gIGZvciAoY29uc3Qgc2ltU3dpdGNoIG9mIHNpbXVsYXRpb25Td2l0Y2hlcykge1xuICAgIGlmIChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCkge1xuICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcC5zZXQoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQsIHNpbVN3aXRjaClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25uTWFwID0gZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbihjaXJjdWl0SnNvbilcblxuICAvLyBDcmVhdGUgbm9kZSBtYXBwaW5nIGZyb20gcG9ydCBjb25uZWN0aW9uc1xuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBjb25zdCBuZXRUb05vZGVOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBsZXQgbm9kZUNvdW50ZXIgPSAxXG5cbiAgY29uc3QgcHJvYmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmIChwcm9iZS5uYW1lKSB7XG4gICAgICAgIHByb2JlTmFtZXMuYWRkKHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHByb2JlIG5hbWVzIGxpa2UgTjEsIE4yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBjb25mbGljdHNcbiAgY29uc3QgbnVtZXJpY1Byb2JlTmFtZXMgPSBbLi4ucHJvYmVOYW1lc11cbiAgICAubWFwKChuYW1lKSA9PiAvXk4oXFxkKykkL2kuZXhlYyhuYW1lKSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBSZWdFeHBFeGVjQXJyYXkgPT4gbSAhPT0gbnVsbClcbiAgICAubWFwKChtKSA9PiBwYXJzZUludChtWzFdLCAxMCkpXG5cbiAgaWYgKG51bWVyaWNQcm9iZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBub2RlQ291bnRlciA9IE1hdGgubWF4KC4uLm51bWVyaWNQcm9iZU5hbWVzKSArIDFcbiAgfVxuXG4gIGNvbnN0IGdyb3VuZE5ldHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIEZpbmQgZ3JvdW5kIGZyb20gc291cmNlIG5ldHMgdGhhdCBpbmNsdWRlIFwiZ25kXCIgaW4gdGhlIG5hbWVcbiAgY29uc3QgZ25kU291cmNlTmV0SWRzID0gbmV3IFNldChcbiAgICBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfbmV0Lmxpc3QoKVxuICAgICAgLmZpbHRlcigoc24pID0+IHNuLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJnbmRcIikpXG4gICAgICAubWFwKChzbikgPT4gc24uc291cmNlX25ldF9pZCksXG4gIClcblxuICBpZiAoZ25kU291cmNlTmV0SWRzLnNpemUgPiAwKSB7XG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKSkge1xuICAgICAgaWYgKHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBpc09uR25kTmV0ID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLnNvbWUoKG5ldElkKSA9PlxuICAgICAgICAgIGduZFNvdXJjZU5ldElkcy5oYXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIGlmIChpc09uR25kTmV0KSB7XG4gICAgICAgICAgY29uc3QgYVBvcnRPbkduZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBjb25zdCBnbmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoYVBvcnRPbkduZClcbiAgICAgICAgICBpZiAoZ25kTmV0KSB7XG4gICAgICAgICAgICBncm91bmROZXRzLmFkZChnbmROZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBncm91bmQgbm9kZSBmcm9tIHBvcnRzIG5hbWVkIFwiR05EXCJcbiAgY29uc3QgZ3JvdW5kUG9ydHMgPSBzb3VyY2VQb3J0cy5maWx0ZXIoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnbmRcIilcbiAgZm9yIChjb25zdCBncm91bmRQb3J0IG9mIGdyb3VuZFBvcnRzKSB7XG4gICAgY29uc3QgZ3JvdW5kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGdyb3VuZFBvcnQuc291cmNlX3BvcnRfaWQpXG4gICAgaWYgKGdyb3VuZE5ldCkge1xuICAgICAgZ3JvdW5kTmV0cy5hZGQoZ3JvdW5kTmV0KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSkge1xuICAgIGNvbnN0IG5lZ19wb3J0X2lkID1cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgIGlmIChuZWdfcG9ydF9pZCkge1xuICAgICAgY29uc3QgZ25kX25ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChuZWdfcG9ydF9pZClcbiAgICAgIGlmIChnbmRfbmV0KSB7XG4gICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZF9uZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBncm91bmROZXQgb2YgZ3JvdW5kTmV0cykge1xuICAgIG5ldFRvTm9kZU5hbWUuc2V0KGdyb3VuZE5ldCwgXCIwXCIpXG4gIH1cblxuICAvLyBQcmUtYXNzaWduIG5vZGUgbmFtZXMgZnJvbSB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAoIXByb2JlLm5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkIHx8XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IG5ldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgY29uc3Qgc2lnbmFsX3BvcnRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IHNpZ25hbF9uZXRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoc2lnbmFsX3BvcnRfaWQpIHtcbiAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHNpZ25hbF9wb3J0X2lkKVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfbmV0X2lkKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMoc2lnbmFsX25ldF9pZCEpLFxuICAgICAgICApXG4gICAgICAgIGlmICh0cmFjZSAmJiB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0SWQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV0KSB7XG4gICAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgcHJvYmUubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfcG9ydF9pZCAmJiBwcm9iZS5uYW1lKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZyBwb3J0IHdpdGggYSBwcm9iZSwgc28gd2UgbWFwIGl0IGRpcmVjdGx5LiBUaGlzIHBvcnRcbiAgICAgICAgLy8gd2lsbCBub3cgYmUgc2tpcHBlZCBpbiB0aGUgc2Vjb25kLXBhc3MgZm9yIHVuY29ubmVjdGVkIHBvcnRzLlxuICAgICAgICBub2RlTWFwLnNldChzaWduYWxfcG9ydF9pZCwgcHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIGFsbCBjb25uZWN0ZWQgbmV0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgY29uc3QgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICBpZiAobmV0KSB7XG4gICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgICAgfVxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBuZXRUb05vZGVOYW1lLmdldChuZXQpISlcbiAgICB9XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byB1bmNvbm5lY3RlZCBwb3J0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgLy8gSWYgYSBwb3J0IHdhc24ndCBpbiBhIG5ldCwgaXQgd29uJ3QgYmUgaW4gdGhlIG5vZGVNYXAgeWV0XG4gICAgaWYgKCFub2RlTWFwLmhhcyhwb3J0SWQpKSB7XG4gICAgICAvLyBVbmNvbm5lY3RlZCBwb3J0LCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgbm9kZSBmb3IgaXRcbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGVhY2ggY29tcG9uZW50XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNvdXJjZUNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09IFwic291cmNlX2NvbXBvbmVudFwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydHMgPSBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfcG9ydC5saXN0KHtcbiAgICAgICAgc291cmNlX2NvbXBvbmVudF9pZDogY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnBpbl9udW1iZXIgPz8gMCkgLSAoYi5waW5fbnVtYmVyID8/IDApKVxuXG4gICAgLy8gR2V0IG5vZGUgbmFtZXMgZm9yIGNvbXBvbmVudCBwb3J0c1xuICAgIGNvbnN0IG5vZGVzID0gY29tcG9uZW50UG9ydHMubWFwKChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQocG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIFNQSUNFIGNvbXBvbmVudCBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKFwiZnR5cGVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgIGxldCBzcGljZUNvbXBvbmVudDogU3BpY2VDb21wb25lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgICBzd2l0Y2ggKGNvbXBvbmVudC5mdHlwZSkge1xuICAgICAgICBjYXNlIFwic2ltcGxlX3Jlc2lzdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJyZXNpc3RhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgcmVzaXN0b3JDbWQgPSBuZXcgUmVzaXN0b3JDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRSZXNpc3RhbmNlKGNvbXBvbmVudC5yZXNpc3RhbmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHJlc2lzdG9yQ21kLFxuICAgICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3N3aXRjaFwiOiB7XG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVkQmFzZSA9IHNhbml0aXplSWRlbnRpZmllcihcbiAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lID8/IGNvbXBvbmVudC5zb3VyY2VfY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgXCJTV1wiLFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2Rlc1swXSB8fCBcIjBcIlxuICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVzWzFdIHx8IFwiMFwiXG4gICAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSBgTkNUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBgU1dfJHtzYW5pdGl6ZWRCYXNlfWBcblxuICAgICAgICAgIGNvbnN0IGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoID0gc2ltdWxhdGlvblN3aXRjaE1hcC5nZXQoXG4gICAgICAgICAgICBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gICAgICAgICAgICBhc3NvY2lhdGVkU2ltdWxhdGlvblN3aXRjaCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNhbml0aXplZEJhc2UsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICBwb3NpdGl2ZUNvbnRyb2w6IGNvbnRyb2xOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVDb250cm9sOiBcIjBcIixcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KHNhbml0aXplZEJhc2UsIHN3aXRjaENtZCwgW1xuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgY29udHJvbE5vZGUsXG4gICAgICAgICAgICBcIjBcIixcbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9IFNXKFJvbj0wLjEgUm9mZj0xZTkgVnQ9Mi41IFZoPTAuMSlgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xTb3VyY2VOYW1lID0gYENUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgICAgICAgICBjb25zdCBjb250cm9sU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IGNvbnRyb2xTb3VyY2VOYW1lLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBjb250cm9sTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogXCIwXCIsXG4gICAgICAgICAgICB2YWx1ZTogY29udHJvbFZhbHVlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBjb250cm9sQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgY29udHJvbFNvdXJjZU5hbWUsXG4gICAgICAgICAgICBjb250cm9sU291cmNlQ21kLFxuICAgICAgICAgICAgW2NvbnRyb2xOb2RlLCBcIjBcIl0sXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoY29udHJvbENvbXBvbmVudClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcInNpbXBsZV9jYXBhY2l0b3JcIjoge1xuICAgICAgICAgIGlmIChcImNhcGFjaXRhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgY2FwYWNpdG9yQ21kID0gbmV3IENhcGFjaXRvckNvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBub2Rlc1sxXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdENhcGFjaXRhbmNlKGNvbXBvbmVudC5jYXBhY2l0YW5jZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBjYXBhY2l0b3JDbWQsXG4gICAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfZGlvZGVcIjoge1xuICAgICAgICAgIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFub2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJhbm9kZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImFub2RlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgY2F0aG9kZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY2F0aG9kZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNhdGhvZGVcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChhbm9kZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChjYXRob2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcblxuICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gXCJEXCJcbiAgICAgICAgICAgIGNvbnN0IGRpb2RlQ21kID0gbmV3IERpb2RlQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSwgLy8gZ2VuZXJpYyBtb2RlbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIGAuTU9ERUwgJHttb2RlbE5hbWV9IERgKVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUsIGRpb2RlQ21kLCBbXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2luZHVjdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJpbmR1Y3RhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kdWN0b3JDbWQgPSBuZXcgSW5kdWN0b3JDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRJbmR1Y3RhbmNlKGNvbXBvbmVudC5pbmR1Y3RhbmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIGluZHVjdG9yQ21kLFxuICAgICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX21vc2ZldFwiOiB7XG4gICAgICAgICAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgZHJhaW5Qb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImRyYWluXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZHJhaW5cIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBnYXRlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnYXRlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZ2F0ZVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwic291cmNlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwic291cmNlXCIpLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBkcmFpbk5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChkcmFpblBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBnYXRlTm9kZSA9IG5vZGVNYXAuZ2V0KGdhdGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9XG4gICAgICAgICAgICAgIG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxfdHlwZSA9IGNvbXBvbmVudC5jaGFubmVsX3R5cGVcblxuICAgICAgICAgICAgbGV0IHBvc2l0aXZlQ29udHJvbCA9IGdhdGVOb2RlXG4gICAgICAgICAgICBsZXQgbmVnYXRpdmVDb250cm9sID0gc291cmNlTm9kZVxuICAgICAgICAgICAgaWYgKGNoYW5uZWxfdHlwZSA9PT0gXCJwXCIpIHtcbiAgICAgICAgICAgICAgcG9zaXRpdmVDb250cm9sID0gc291cmNlTm9kZVxuICAgICAgICAgICAgICBuZWdhdGl2ZUNvbnRyb2wgPSBnYXRlTm9kZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBcIkVOSF9TV1wiXG4gICAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gU1coUm9uPTAuMSBSb2ZmPTFlOSBWdD0yLjUgVmg9MC4xKWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3dpdGNoQ21kID0gbmV3IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IGRyYWluTm9kZSxcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBzb3VyY2VOb2RlLFxuICAgICAgICAgICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlQ29udHJvbCxcbiAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBzd2l0Y2hDbWQsIFtcbiAgICAgICAgICAgICAgZHJhaW5Ob2RlLFxuICAgICAgICAgICAgICBnYXRlTm9kZSxcbiAgICAgICAgICAgICAgc291cmNlTm9kZSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV90cmFuc2lzdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0b3JQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNvbGxlY3RvclwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNvbGxlY3RvclwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGJhc2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImJhc2VcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJiYXNlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZW1pdHRlclBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZW1pdHRlclwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImVtaXR0ZXJcIiksXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmICghY29sbGVjdG9yUG9ydCB8fCAhYmFzZVBvcnQgfHwgIWVtaXR0ZXJQb3J0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVHJhbnNpc3RvciAke2NvbXBvbmVudC5uYW1lfSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBvcnRzIChjb2xsZWN0b3IsIGJhc2UsIGVtaXR0ZXIpYCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0b3JOb2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoY29sbGVjdG9yUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VOb2RlID0gbm9kZU1hcC5nZXQoYmFzZVBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBlbWl0dGVyTm9kZSA9IG5vZGVNYXAuZ2V0KGVtaXR0ZXJQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2lzdG9yX3R5cGUgPSAoY29tcG9uZW50IGFzIGFueSkudHJhbnNpc3Rvcl90eXBlID8/IFwibnBuXCJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHt0cmFuc2lzdG9yX3R5cGUudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJqdENtZCA9IG5ldyBCSlRDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIGNvbGxlY3RvcjogY29sbGVjdG9yTm9kZSxcbiAgICAgICAgICAgICAgYmFzZTogYmFzZU5vZGUsXG4gICAgICAgICAgICAgIGVtaXR0ZXI6IGVtaXR0ZXJOb2RlLFxuICAgICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBianRDbWQsIFtcbiAgICAgICAgICAgICAgY29sbGVjdG9yTm9kZSxcbiAgICAgICAgICAgICAgYmFzZU5vZGUsXG4gICAgICAgICAgICAgIGVtaXR0ZXJOb2RlLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3BpY2VDb21wb25lbnQpIHtcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBzaW11bGF0aW9uIHZvbHRhZ2Ugc291cmNlc1xuICBjb25zdCBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMgPVxuICAgIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlcykge1xuICAgIGlmIChzaW1Tb3VyY2UudHlwZSAhPT0gXCJzaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlXCIpIGNvbnRpbnVlXG5cbiAgICBpZiAoKHNpbVNvdXJjZSBhcyBhbnkpLmlzX2RjX3NvdXJjZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEFDIFNvdXJjZVxuICAgICAgaWYgKFxuICAgICAgICBcInRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBcInRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkICYmXG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9XG4gICAgICAgICAgbm9kZU1hcC5nZXQoKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcblxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiXG4gICAgICAgIGNvbnN0IHdhdmVfc2hhcGUgPSAoc2ltU291cmNlIGFzIGFueSkud2F2ZV9zaGFwZVxuICAgICAgICBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzaW5ld2F2ZVwiKSB7XG4gICAgICAgICAgY29uc3Qgdl9vZmZzZXQgPSAwIC8vIG5vdCBwcm92aWRlZCBpbiBjaXJjdWl0SnNvblxuICAgICAgICAgIGNvbnN0IHZfcGVhayA9IChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gKHNpbVNvdXJjZSBhcyBhbnkpLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwIC8vIG5vdCBwcm92aWRlZCBpbiBjaXJjdWl0SnNvblxuICAgICAgICAgIGNvbnN0IGRhbXBpbmdfZmFjdG9yID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBwaGFzZSA9IChzaW1Tb3VyY2UgYXMgYW55KS5waGFzZSA/PyAwXG4gICAgICAgICAgaWYgKGZyZXEgPiAwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGBTSU4oJHt2X29mZnNldH0gJHt2X3BlYWt9ICR7ZnJlcX0gJHtkZWxheX0gJHtkYW1waW5nX2ZhY3Rvcn0gJHtwaGFzZX0pYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlID8/IDB9YFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXZlX3NoYXBlID09PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgY29uc3Qgdl9pbml0aWFsID0gMFxuICAgICAgICAgIGNvbnN0IHZfcHVsc2VkID0gKHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgPz8gMFxuICAgICAgICAgIGNvbnN0IGZyZXEgPSAoc2ltU291cmNlIGFzIGFueSkuZnJlcXVlbmN5ID8/IDBcbiAgICAgICAgICBjb25zdCBwZXJpb2RfZnJvbV9mcmVxID0gZnJlcSA9PT0gMCA/IEluZmluaXR5IDogMSAvIGZyZXFcbiAgICAgICAgICBjb25zdCBwZXJpb2QgPSAoc2ltU291cmNlIGFzIGFueSkucGVyaW9kID8/IHBlcmlvZF9mcm9tX2ZyZXFcbiAgICAgICAgICBjb25zdCBkdXR5X2N5Y2xlID0gKHNpbVNvdXJjZSBhcyBhbnkpLmR1dHlfY3ljbGUgPz8gMC41XG4gICAgICAgICAgY29uc3QgcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgcmlzZV90aW1lID0gXCIxblwiXG4gICAgICAgICAgY29uc3QgZmFsbF90aW1lID0gXCIxblwiXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHt2X2luaXRpYWx9ICR7dl9wdWxzZWR9ICR7ZGVsYXl9ICR7cmlzZV90aW1lfSAke2ZhbGxfdGltZX0gJHtwdWxzZV93aWR0aH0gJHtwZXJpb2R9KWBcbiAgICAgICAgfSBlbHNlIGlmICgoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgICApXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gREMgU291cmNlIChpc19kY19zb3VyY2UgaXMgdHJ1ZSBvciB1bmRlZmluZWQpXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5wb3NpdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG5cbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpdmVQb3J0SWQgJiZcbiAgICAgICAgbmVnYXRpdmVQb3J0SWQgJiZcbiAgICAgICAgXCJ2b2x0YWdlXCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2RlTWFwLmdldChwb3NpdGl2ZVBvcnRJZCkgfHwgXCIwXCJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZU1hcC5nZXQobmVnYXRpdmVQb3J0SWQpIHx8IFwiMFwiXG5cbiAgICAgICAgY29uc3Qgdm9sdGFnZVNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICB2YWx1ZTogYERDICR7KHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2V9YCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgIClcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2ltRXhwZXJpbWVudCA9IGNpcmN1aXRKc29uLmZpbmQoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9leHBlcmltZW50XCIsXG4gIClcblxuICBpZiAoc2ltRXhwZXJpbWVudCkge1xuICAgIC8vIFByb2Nlc3Mgc2ltdWxhdGlvbiB2b2x0YWdlIHByb2Jlc1xuICAgIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGVzVG9Qcm9iZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICAgIGNvbnN0IGdldFBvcnRJZEZyb21OZXRJZCA9IChuZXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiB0cmFjZT8uY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgICAgbGV0IHNpZ25hbFBvcnRJZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgICBpZiAoIXNpZ25hbFBvcnRJZCkge1xuICAgICAgICAgIGNvbnN0IHNpZ25hbE5ldElkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWRcbiAgICAgICAgICBpZiAoc2lnbmFsTmV0SWQpIHtcbiAgICAgICAgICAgIHNpZ25hbFBvcnRJZCA9IGdldFBvcnRJZEZyb21OZXRJZChzaWduYWxOZXRJZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNpZ25hbFBvcnRJZCkgY29udGludWVcblxuICAgICAgICBjb25zdCBzaWduYWxOb2RlTmFtZSA9IG5vZGVNYXAuZ2V0KHNpZ25hbFBvcnRJZClcbiAgICAgICAgaWYgKCFzaWduYWxOb2RlTmFtZSkgY29udGludWVcblxuICAgICAgICBsZXQgcmVmZXJlbmNlUG9ydElkID0gcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICAgIGlmICghcmVmZXJlbmNlUG9ydElkICYmIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkKSB7XG4gICAgICAgICAgcmVmZXJlbmNlUG9ydElkID0gZ2V0UG9ydElkRnJvbU5ldElkKFxuICAgICAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZmVyZW5jZVBvcnRJZCkge1xuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGVOYW1lID0gbm9kZU1hcC5nZXQocmVmZXJlbmNlUG9ydElkKVxuICAgICAgICAgIGlmIChyZWZlcmVuY2VOb2RlTmFtZSAmJiByZWZlcmVuY2VOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoYFYoJHtzaWduYWxOb2RlTmFtZX0sJHtyZWZlcmVuY2VOb2RlTmFtZX0pYClcbiAgICAgICAgICB9IGVsc2UgaWYgKHNpZ25hbE5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChgVigke3NpZ25hbE5vZGVOYW1lfSlgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW5nbGUtZW5kZWQgcHJvYmVcbiAgICAgICAgICBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKGBWKCR7c2lnbmFsTm9kZU5hbWV9KWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZXNUb1Byb2JlLnNpemUgPiAwICYmXG4gICAgICAgIChzaW1FeHBlcmltZW50IGFzIGFueSkuZXhwZXJpbWVudF90eXBlPy5pbmNsdWRlcyhcInRyYW5zaWVudFwiKVxuICAgICAgKSB7XG4gICAgICAgIG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLnB1c2goXG4gICAgICAgICAgYC5QUklOVCBUUkFOICR7Wy4uLm5vZGVzVG9Qcm9iZV0uam9pbihcIiBcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVQZXJTdGVwID0gKHNpbUV4cGVyaW1lbnQgYXMgYW55KS50aW1lX3Blcl9zdGVwXG4gICAgY29uc3QgZW5kVGltZSA9IChzaW1FeHBlcmltZW50IGFzIGFueSkuZW5kX3RpbWVfbXNcbiAgICBjb25zdCBzdGFydFRpbWVNcyA9IChzaW1FeHBlcmltZW50IGFzIGFueSkuc3RhcnRfdGltZV9tc1xuXG4gICAgaWYgKHRpbWVQZXJTdGVwICYmIGVuZFRpbWUpIHtcbiAgICAgIC8vIGNpcmN1aXQtanNvbiB2YWx1ZXMgYXJlIGluIG1zLCBTUElDRSByZXF1aXJlcyBzZWNvbmRzXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSAoc3RhcnRUaW1lTXMgPz8gMCkgLyAxMDAwXG5cbiAgICAgIGxldCB0cmFuQ21kID0gYC50cmFuICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoXG4gICAgICAgIHRpbWVQZXJTdGVwIC8gMTAwMCxcbiAgICAgICl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoZW5kVGltZSAvIDEwMDApfWBcbiAgICAgIGlmIChzdGFydFRpbWUgPiAwKSB7XG4gICAgICAgIHRyYW5DbWQgKz0gYCAke2Zvcm1hdE51bWJlckZvclNwaWNlKHN0YXJ0VGltZSl9YFxuICAgICAgfVxuICAgICAgdHJhbkNtZCArPSBcIiBVSUNcIlxuICAgICAgbmV0bGlzdC50cmFuQ29tbWFuZCA9IHRyYW5DbWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV0bGlzdFxufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXNpc3RhbmNlKHJlc2lzdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChyZXNpc3RhbmNlID49IDFlNikgcmV0dXJuIGAke3Jlc2lzdGFuY2UgLyAxZTZ9TUVHYFxuICBpZiAocmVzaXN0YW5jZSA+PSAxZTMpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWUzfUtgXG4gIHJldHVybiByZXNpc3RhbmNlLnRvU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2FwYWNpdGFuY2UoY2FwYWNpdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS0zKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTN9TWBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTYpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlNn1VYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU5fU5gXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS0xMikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWUxMn1QYFxuICByZXR1cm4gY2FwYWNpdGFuY2UudG9TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRJbmR1Y3RhbmNlKGluZHVjdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmR1Y3RhbmNlID49IDEpIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTN9bWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTZ9dWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTl9bmBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUxMn1wYFxuICByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG59XG5cbmZ1bmN0aW9uIHNhbml0aXplSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gcHJlZml4XG4gIGNvbnN0IHNhbml0aXplZCA9IHZhbHVlLnJlcGxhY2UoL1teQS1aYS16MC05X10vZywgXCJfXCIpXG4gIGlmICghc2FuaXRpemVkKSByZXR1cm4gcHJlZml4XG4gIGlmICgvXlswLTldLy50ZXN0KHNhbml0aXplZCkpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fV8ke3Nhbml0aXplZH1gXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplZFxufVxuXG5mdW5jdGlvbiBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gIHNpbXVsYXRpb25Td2l0Y2g6IFNpbXVsYXRpb25Td2l0Y2ggfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgaGlnaFZvbHRhZ2UgPSA1XG4gIGNvbnN0IGxvd1ZvbHRhZ2UgPSAwXG4gIGNvbnN0IHJpc2VUaW1lID0gXCIxblwiXG4gIGNvbnN0IGZhbGxUaW1lID0gXCIxblwiXG5cbiAgaWYgKCFzaW11bGF0aW9uU3dpdGNoKSB7XG4gICAgcmV0dXJuIGBEQyAke2xvd1ZvbHRhZ2V9YFxuICB9XG5cbiAgY29uc3Qgc3RhcnRzQ2xvc2VkID0gc2ltdWxhdGlvblN3aXRjaC5zdGFydHNfY2xvc2VkID8/IGZhbHNlXG4gIGNvbnN0IGNsb3Nlc0F0ID0gc2ltdWxhdGlvblN3aXRjaC5jbG9zZXNfYXQgPz8gMFxuICBjb25zdCBvcGVuc0F0ID0gc2ltdWxhdGlvblN3aXRjaC5vcGVuc19hdFxuICBjb25zdCBzd2l0Y2hpbmdGcmVxdWVuY3kgPSBzaW11bGF0aW9uU3dpdGNoLnN3aXRjaGluZ19mcmVxdWVuY3lcblxuICBjb25zdCBbaW5pdGlhbFZvbHRhZ2UsIHB1bHNlZFZvbHRhZ2VdID0gc3RhcnRzQ2xvc2VkXG4gICAgPyBbaGlnaFZvbHRhZ2UsIGxvd1ZvbHRhZ2VdXG4gICAgOiBbbG93Vm9sdGFnZSwgaGlnaFZvbHRhZ2VdXG5cbiAgaWYgKHN3aXRjaGluZ0ZyZXF1ZW5jeSAmJiBzd2l0Y2hpbmdGcmVxdWVuY3kgPiAwKSB7XG4gICAgY29uc3QgcGVyaW9kID0gMSAvIHN3aXRjaGluZ0ZyZXF1ZW5jeVxuICAgIGNvbnN0IHdpZHRoRnJvbU9wZW5DbG9zZSA9XG4gICAgICBvcGVuc0F0ICYmIG9wZW5zQXQgPiBjbG9zZXNBdCA/IE1hdGgubWluKG9wZW5zQXQgLSBjbG9zZXNBdCwgcGVyaW9kKSA6IDBcbiAgICBjb25zdCBwdWxzZVdpZHRoID1cbiAgICAgIHdpZHRoRnJvbU9wZW5DbG9zZSA+IDAgPyB3aWR0aEZyb21PcGVuQ2xvc2UgOiBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKG9wZW5zQXQgIT09IHVuZGVmaW5lZCAmJiBvcGVuc0F0ID4gY2xvc2VzQXQpIHtcbiAgICBjb25zdCBwdWxzZVdpZHRoID0gTWF0aC5tYXgob3BlbnNBdCAtIGNsb3Nlc0F0LCAxZS05KVxuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICsgcHVsc2VXaWR0aCAqIDJcblxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIGlmIChjbG9zZXNBdCA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSBjbG9zZXNBdCAqIDJcbiAgICBjb25zdCBwdWxzZVdpZHRoID0gTWF0aC5tYXgocGVyaW9kIC8gMiwgMWUtOSlcbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICByZXR1cm4gYERDICR7c3RhcnRzQ2xvc2VkID8gaGlnaFZvbHRhZ2UgOiBsb3dWb2x0YWdlfWBcbn1cblxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyRm9yU3BpY2UodmFsdWU6IG51bWJlcikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBgJHt2YWx1ZX1gXG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFwiMFwiXG5cbiAgY29uc3QgYWJzVmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoYWJzVmFsdWUgPj0gMWUzIHx8IGFic1ZhbHVlIDw9IDFlLTMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRXhwb25lbnRpYWwoNikpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKClcbn1cbiIsICJleHBvcnQgY2xhc3MgU3BpY2VTdWJjaXJjdWl0IHtcbiAgbmFtZTogc3RyaW5nXG4gIHBpbnM6IHN0cmluZ1tdXG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwaW5zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLnBpbnMgPSBwaW5zXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGluU3RyaW5nID0gdGhpcy5waW5zLmpvaW4oXCIgXCIpXG4gICAgY29uc3QgaGVhZGVyID0gYC5TVUJDS1QgJHt0aGlzLm5hbWV9ICR7cGluU3RyaW5nfWBcbiAgICBjb25zdCBmb290ZXIgPSBgLkVORFMgJHt0aGlzLm5hbWV9YFxuXG4gICAgY29uc3QgYm9keSA9IGAqIFBsYWNlaG9sZGVyIGZvciAke3RoaXMubmFtZX0uIE5vIGRlZmluaXRpb24gZm91bmQgaW4gY2lyY3VpdCBKU09OLmBcblxuICAgIHJldHVybiBbXCJcIiwgaGVhZGVyLCBib2R5LCBmb290ZXJdLmpvaW4oXCJcXG5cIilcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgYWNNYWduaXR1ZGU/OiBzdHJpbmdcbiAgYWNQaGFzZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQ3VycmVudFNvdXJjZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImN1cnJlbnRfc291cmNlXCIgYXMgY29uc3RcbiAgcHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIHZhbHVlLCBhY01hZ25pdHVkZSwgYWNQaGFzZSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSSR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgfVxuICAgIGlmIChhY01hZ25pdHVkZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBBQyAke2FjTWFnbml0dWRlfWBcbiAgICAgIGlmIChhY1BoYXNlKSB7XG4gICAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthY1BoYXNlfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGluZHVjdG9yczogc3RyaW5nW11cbiAgY291cGxpbmc6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yX2NvdXBsaW5nXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgaW5kdWN0b3JzLCBjb3VwbGluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgSyR7bmFtZX0gJHtpbmR1Y3RvcnMuam9pbihcIiBcIil9ICR7Y291cGxpbmd9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSkZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEpGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJqZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEpGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSkZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgZHJhaW4sIGdhdGUsIHNvdXJjZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSiR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBNT1NGRVRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgZHJhaW46IHN0cmluZ1xuICBnYXRlOiBzdHJpbmdcbiAgc291cmNlOiBzdHJpbmdcbiAgc3Vic3RyYXRlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBsZW5ndGg/OiBzdHJpbmdcbiAgd2lkdGg/OiBzdHJpbmdcbiAgZHJhaW5BcmVhPzogc3RyaW5nXG4gIHNvdXJjZUFyZWE/OiBzdHJpbmdcbiAgZHJhaW5QZXJpbWV0ZXI/OiBzdHJpbmdcbiAgc291cmNlUGVyaW1ldGVyPzogc3RyaW5nXG4gIGRyYWluUmVzaXN0YW5jZT86IHN0cmluZ1xuICBzb3VyY2VSZXNpc3RhbmNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBNT1NGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJtb3NmZXRcIiBhcyBjb25zdFxuICBwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBkcmFpbixcbiAgICAgIGdhdGUsXG4gICAgICBzb3VyY2UsXG4gICAgICBzdWJzdHJhdGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHdpZHRoLFxuICAgICAgZHJhaW5BcmVhLFxuICAgICAgc291cmNlQXJlYSxcbiAgICAgIGRyYWluUGVyaW1ldGVyLFxuICAgICAgc291cmNlUGVyaW1ldGVyLFxuICAgICAgZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgc291cmNlUmVzaXN0YW5jZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYE0ke25hbWV9ICR7ZHJhaW59ICR7Z2F0ZX0gJHtzb3VyY2V9ICR7c3Vic3RyYXRlfSAke21vZGVsfWBcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIEw6IGxlbmd0aCxcbiAgICAgIFc6IHdpZHRoLFxuICAgICAgQUQ6IGRyYWluQXJlYSxcbiAgICAgIEFTOiBzb3VyY2VBcmVhLFxuICAgICAgUEQ6IGRyYWluUGVyaW1ldGVyLFxuICAgICAgUFM6IHNvdXJjZVBlcmltZXRlcixcbiAgICAgIE5SRDogZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgTlJTOiBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViY2lyY3VpdENhbGxDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgbm9kZXM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmNpcmN1aXRDYWxsQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwic3ViY2lyY3VpdF9jYWxsXCIgYXMgY29uc3RcbiAgcHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBub2Rlcywgc3ViY2lyY3VpdE5hbWUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gYFgke25hbWV9ICR7bm9kZXMuam9pbihcIiBcIil9ICR7c3ViY2lyY3VpdE5hbWV9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBhUG9zaXRpdmU6IHN0cmluZ1xuICBhTmVnYXRpdmU6IHN0cmluZ1xuICBiUG9zaXRpdmU6IHN0cmluZ1xuICBiTmVnYXRpdmU6IHN0cmluZ1xuICBpbXBlZGFuY2U6IHN0cmluZ1xuICBkZWxheT86IHN0cmluZ1xuICBmcmVxdWVuY3k/OiBzdHJpbmdcbiAgbm9ybWFsaXplZExlbmd0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInRyYW5zbWlzc2lvbl9saW5lXCIgYXMgY29uc3RcbiAgcHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBhUG9zaXRpdmUsXG4gICAgICBhTmVnYXRpdmUsXG4gICAgICBiUG9zaXRpdmUsXG4gICAgICBiTmVnYXRpdmUsXG4gICAgICBpbXBlZGFuY2UsXG4gICAgICBkZWxheSxcbiAgICAgIGZyZXF1ZW5jeSxcbiAgICAgIG5vcm1hbGl6ZWRMZW5ndGgsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgVCR7bmFtZX0gJHthUG9zaXRpdmV9ICR7YU5lZ2F0aXZlfSAke2JQb3NpdGl2ZX0gJHtiTmVnYXRpdmV9IFowPSR7aW1wZWRhbmNlfWBcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgVEQ9JHtkZWxheX1gXG4gICAgfSBlbHNlIGlmIChmcmVxdWVuY3kpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgRj0ke2ZyZXF1ZW5jeX1gXG4gICAgICBpZiAobm9ybWFsaXplZExlbmd0aCkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgIE5MPSR7bm9ybWFsaXplZExlbmd0aH1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sSUFBTSw4QkFBOEIsQ0FBQyxZQUFrQztBQUM1RSxRQUFNLFFBQWtCLENBQUM7QUFHekIsUUFBTSxLQUFLLFFBQVEsS0FBSztBQUd4QixNQUFJLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFDM0IsVUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ25EO0FBR0EsYUFBVyxhQUFhLFFBQVEsWUFBWTtBQUMxQyxVQUFNLEtBQUssVUFBVSxjQUFjLENBQUM7QUFBQSxFQUN0QztBQUdBLGFBQVcsY0FBYyxRQUFRLGFBQWE7QUFDNUMsVUFB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
|
|
@@ -3,6 +3,7 @@ import { SpiceComponent } from "./spice-classes/SpiceComponent"
|
|
|
3
3
|
import { ResistorCommand } from "./spice-commands/ResistorCommand"
|
|
4
4
|
import { CapacitorCommand } from "./spice-commands/CapacitorCommand"
|
|
5
5
|
import { VoltageSourceCommand } from "./spice-commands/VoltageSourceCommand"
|
|
6
|
+
import { BJTCommand } from "./spice-commands/BJTCommand"
|
|
6
7
|
import { DiodeCommand } from "./spice-commands/DiodeCommand"
|
|
7
8
|
import { InductorCommand } from "./spice-commands/InductorCommand"
|
|
8
9
|
import { VoltageControlledSwitchCommand } from "./spice-commands/VoltageControlledSwitchCommand"
|
|
@@ -360,16 +361,31 @@ export function circuitJsonToSpice(
|
|
|
360
361
|
const sourceNode =
|
|
361
362
|
nodeMap.get(sourcePort?.source_port_id ?? "") || "0"
|
|
362
363
|
|
|
363
|
-
const
|
|
364
|
+
const channel_type = component.channel_type
|
|
365
|
+
|
|
366
|
+
let positiveControl = gateNode
|
|
367
|
+
let negativeControl = sourceNode
|
|
368
|
+
if (channel_type === "p") {
|
|
369
|
+
positiveControl = sourceNode
|
|
370
|
+
negativeControl = gateNode
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const modelName = "ENH_SW"
|
|
374
|
+
if (!netlist.models.has(modelName)) {
|
|
375
|
+
netlist.models.set(
|
|
376
|
+
modelName,
|
|
377
|
+
`.MODEL ${modelName} SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)`,
|
|
378
|
+
)
|
|
379
|
+
}
|
|
380
|
+
|
|
364
381
|
const switchCmd = new VoltageControlledSwitchCommand({
|
|
365
382
|
name: component.name,
|
|
366
383
|
positiveNode: drainNode,
|
|
367
384
|
negativeNode: sourceNode,
|
|
368
|
-
positiveControl
|
|
369
|
-
negativeControl
|
|
385
|
+
positiveControl,
|
|
386
|
+
negativeControl,
|
|
370
387
|
model: modelName,
|
|
371
388
|
})
|
|
372
|
-
netlist.models.set(modelName, `.MODEL ${modelName} SW`)
|
|
373
389
|
|
|
374
390
|
spiceComponent = new SpiceComponent(component.name, switchCmd, [
|
|
375
391
|
drainNode,
|
|
@@ -379,6 +395,59 @@ export function circuitJsonToSpice(
|
|
|
379
395
|
}
|
|
380
396
|
break
|
|
381
397
|
}
|
|
398
|
+
case "simple_transistor": {
|
|
399
|
+
if ("name" in component) {
|
|
400
|
+
const collectorPort = componentPorts.find(
|
|
401
|
+
(p) =>
|
|
402
|
+
p.name?.toLowerCase() === "collector" ||
|
|
403
|
+
p.port_hints?.includes("collector"),
|
|
404
|
+
)
|
|
405
|
+
const basePort = componentPorts.find(
|
|
406
|
+
(p) =>
|
|
407
|
+
p.name?.toLowerCase() === "base" ||
|
|
408
|
+
p.port_hints?.includes("base"),
|
|
409
|
+
)
|
|
410
|
+
const emitterPort = componentPorts.find(
|
|
411
|
+
(p) =>
|
|
412
|
+
p.name?.toLowerCase() === "emitter" ||
|
|
413
|
+
p.port_hints?.includes("emitter"),
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
if (!collectorPort || !basePort || !emitterPort) {
|
|
417
|
+
throw new Error(
|
|
418
|
+
`Transistor ${component.name} is missing required ports (collector, base, emitter)`,
|
|
419
|
+
)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const collectorNode =
|
|
423
|
+
nodeMap.get(collectorPort.source_port_id) || "0"
|
|
424
|
+
const baseNode = nodeMap.get(basePort.source_port_id) || "0"
|
|
425
|
+
const emitterNode = nodeMap.get(emitterPort.source_port_id) || "0"
|
|
426
|
+
|
|
427
|
+
const transistor_type = (component as any).transistor_type ?? "npn"
|
|
428
|
+
const modelName = transistor_type.toUpperCase()
|
|
429
|
+
if (!netlist.models.has(modelName)) {
|
|
430
|
+
netlist.models.set(
|
|
431
|
+
modelName,
|
|
432
|
+
`.MODEL ${modelName} ${transistor_type.toUpperCase()}`,
|
|
433
|
+
)
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const bjtCmd = new BJTCommand({
|
|
437
|
+
name: component.name,
|
|
438
|
+
collector: collectorNode,
|
|
439
|
+
base: baseNode,
|
|
440
|
+
emitter: emitterNode,
|
|
441
|
+
model: modelName,
|
|
442
|
+
})
|
|
443
|
+
spiceComponent = new SpiceComponent(component.name, bjtCmd, [
|
|
444
|
+
collectorNode,
|
|
445
|
+
baseNode,
|
|
446
|
+
emitterNode,
|
|
447
|
+
])
|
|
448
|
+
}
|
|
449
|
+
break
|
|
450
|
+
}
|
|
382
451
|
}
|
|
383
452
|
|
|
384
453
|
if (spiceComponent) {
|