circuit-json-to-spice 0.0.36 → 0.0.38

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/dist/index.d.ts CHANGED
@@ -28,8 +28,11 @@ declare class SpiceNetlist {
28
28
  controls: string[];
29
29
  subcircuits: SpiceSubcircuit[];
30
30
  models: Map<string, string>;
31
+ optionStatements: string[];
32
+ metadataComments: string[];
31
33
  tranCommand: string | null;
32
34
  printStatements: string[];
35
+ saveStatements: string[];
33
36
  constructor(title?: string);
34
37
  addComponent(component: SpiceComponent): void;
35
38
  addSubcircuit(subcircuit: SpiceSubcircuit): void;
package/dist/index.js CHANGED
@@ -8,12 +8,21 @@ var convertSpiceNetlistToString = (netlist) => {
8
8
  for (const component of netlist.components) {
9
9
  lines.push(component.toSpiceString());
10
10
  }
11
+ if (netlist.optionStatements.length > 0) {
12
+ lines.push(...netlist.optionStatements);
13
+ }
14
+ if (netlist.metadataComments.length > 0) {
15
+ lines.push(...netlist.metadataComments);
16
+ }
11
17
  for (const subcircuit of netlist.subcircuits) {
12
18
  lines.push(subcircuit.toSpiceString());
13
19
  }
14
20
  if (netlist.printStatements.length > 0) {
15
21
  lines.push(...netlist.printStatements);
16
22
  }
23
+ if (netlist.saveStatements.length > 0) {
24
+ lines.push(...netlist.saveStatements);
25
+ }
17
26
  if (netlist.controls.length > 0) {
18
27
  lines.push(".control");
19
28
  lines.push(...netlist.controls);
@@ -34,8 +43,11 @@ var SpiceNetlist = class {
34
43
  controls;
35
44
  subcircuits;
36
45
  models;
46
+ optionStatements;
47
+ metadataComments;
37
48
  tranCommand;
38
49
  printStatements;
50
+ saveStatements;
39
51
  constructor(title = "Circuit Netlist") {
40
52
  this.title = title;
41
53
  this.components = [];
@@ -43,8 +55,11 @@ var SpiceNetlist = class {
43
55
  this.controls = [];
44
56
  this.subcircuits = [];
45
57
  this.models = /* @__PURE__ */ new Map();
58
+ this.optionStatements = [];
59
+ this.metadataComments = [];
46
60
  this.tranCommand = null;
47
61
  this.printStatements = [];
62
+ this.saveStatements = [];
48
63
  }
49
64
  addComponent(component) {
50
65
  this.components.push(component);
@@ -440,6 +455,30 @@ function formatNumberForSpice(value) {
440
455
  }
441
456
  return Number(value.toPrecision(6)).toString();
442
457
  }
458
+ function formatSecondsForSpice(value) {
459
+ if (!Number.isFinite(value)) return `${value}`;
460
+ if (value === 0) return "0";
461
+ const units = [
462
+ ["T", 1e12],
463
+ ["G", 1e9],
464
+ ["MEG", 1e6],
465
+ ["k", 1e3],
466
+ ["m", 1e-3],
467
+ ["u", 1e-6],
468
+ ["n", 1e-9],
469
+ ["p", 1e-12]
470
+ ];
471
+ for (const [suffix, multiplier] of units) {
472
+ const scaled = value / multiplier;
473
+ if (Math.abs(scaled) >= 0.999999 && Math.abs(scaled) < 999.999999) {
474
+ const rounded = Number(scaled.toPrecision(6));
475
+ if (Math.abs(rounded * multiplier - value) <= Math.abs(value) * 1e-9) {
476
+ return `${rounded}${suffix}`;
477
+ }
478
+ }
479
+ }
480
+ return formatNumberForSpice(value);
481
+ }
443
482
 
444
483
  // lib/processors/simple-resistor.ts
445
484
  var processSimpleResistor = ({
@@ -751,13 +790,17 @@ var processSimulationVoltageSources = (netlist, simulationVoltageSources, nodeMa
751
790
  const v_pulsed = simSource.voltage ?? 0;
752
791
  const freq = simSource.frequency ?? 0;
753
792
  const period_from_freq = freq === 0 ? Infinity : 1 / freq;
754
- const period = period_from_freq;
793
+ const hasExplicitPeriod = simSource.period !== void 0;
794
+ const hasExplicitPulseWidth = simSource.pulse_width !== void 0;
795
+ const period = hasExplicitPeriod ? simSource.period / 1e3 : period_from_freq;
755
796
  const duty_cycle = simSource.duty_cycle ?? 0.5;
756
797
  const pulse_width = period * duty_cycle;
757
- const delay = 0;
758
- const rise_time = "1n";
759
- const fall_time = "1n";
760
- value = `PULSE(${v_initial} ${v_pulsed} ${delay} ${rise_time} ${fall_time} ${pulse_width} ${period})`;
798
+ const delay = simSource.pulse_delay !== void 0 ? simSource.pulse_delay / 1e3 : 0;
799
+ const rise_time = simSource.rise_time !== void 0 ? formatSecondsForSpice(simSource.rise_time / 1e3) : "1n";
800
+ const fall_time = simSource.fall_time !== void 0 ? formatSecondsForSpice(simSource.fall_time / 1e3) : "1n";
801
+ const pulseWidthText = hasExplicitPulseWidth ? formatSecondsForSpice(simSource.pulse_width / 1e3) : formatSecondsForSpice(pulse_width);
802
+ const periodText = formatSecondsForSpice(period);
803
+ value = `PULSE(${v_initial} ${v_pulsed} ${formatSecondsForSpice(delay)} ${rise_time} ${fall_time} ${pulseWidthText} ${periodText})`;
761
804
  } else if (simSource.voltage !== void 0) {
762
805
  value = `DC ${simSource.voltage}`;
763
806
  }
@@ -875,10 +918,22 @@ var processSimulationCurrentSources = (netlist, simulationCurrentSources, nodeMa
875
918
  };
876
919
 
877
920
  // lib/processors/process-simulation-experiment.ts
921
+ var spiceOptionOrder = ["method", "reltol", "abstol", "vntol"];
878
922
  var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sourceTraces, nodeMap) => {
879
923
  if (!simExperiment) return;
924
+ const spiceOptions = simExperiment.spice_options;
925
+ if (spiceOptions) {
926
+ const optionParts = spiceOptionOrder.map((key) => {
927
+ const value = spiceOptions[key];
928
+ return value === void 0 ? null : `${key}=${value}`;
929
+ }).filter((part) => part !== null);
930
+ if (optionParts.length > 0) {
931
+ netlist.optionStatements.push(`.options ${optionParts.join(" ")}`);
932
+ }
933
+ }
880
934
  if (simulationProbes.length > 0) {
881
935
  const nodesToProbe = /* @__PURE__ */ new Set();
936
+ const probeVectorMappings = [];
882
937
  const getPortIdFromNetId = (netId) => {
883
938
  const trace = sourceTraces.find(
884
939
  (t) => t.connected_source_net_ids.includes(netId)
@@ -905,18 +960,48 @@ var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sou
905
960
  if (referencePortId) {
906
961
  const referenceNodeName = nodeMap.get(referencePortId);
907
962
  if (referenceNodeName && referenceNodeName !== "0") {
908
- nodesToProbe.add(`V(${signalNodeName},${referenceNodeName})`);
963
+ const spiceVector = `V(${signalNodeName},${referenceNodeName})`;
964
+ nodesToProbe.add(spiceVector);
965
+ probeVectorMappings.push({
966
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
967
+ name: probe.name,
968
+ spice_vector: spiceVector,
969
+ source_node_name: signalNodeName,
970
+ reference_node_name: referenceNodeName
971
+ });
909
972
  } else if (signalNodeName !== "0") {
910
- nodesToProbe.add(`V(${signalNodeName})`);
973
+ const spiceVector = `V(${signalNodeName})`;
974
+ nodesToProbe.add(spiceVector);
975
+ probeVectorMappings.push({
976
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
977
+ name: probe.name,
978
+ spice_vector: spiceVector,
979
+ source_node_name: signalNodeName,
980
+ reference_node_name: referenceNodeName
981
+ });
911
982
  }
912
983
  } else {
913
984
  if (signalNodeName !== "0") {
914
- nodesToProbe.add(`V(${signalNodeName})`);
985
+ const spiceVector = `V(${signalNodeName})`;
986
+ nodesToProbe.add(spiceVector);
987
+ probeVectorMappings.push({
988
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
989
+ name: probe.name,
990
+ spice_vector: spiceVector,
991
+ source_node_name: signalNodeName
992
+ });
915
993
  }
916
994
  }
917
995
  }
918
996
  if (nodesToProbe.size > 0 && simExperiment.experiment_type?.includes("transient")) {
919
- netlist.printStatements.push(`.PRINT TRAN ${[...nodesToProbe].join(" ")}`);
997
+ for (const mapping of probeVectorMappings) {
998
+ netlist.metadataComments.push(
999
+ `* tscircuit_probe ${JSON.stringify(mapping)}`
1000
+ );
1001
+ }
1002
+ const probeVectors = [...nodesToProbe].join(" ");
1003
+ netlist.printStatements.push(`.PRINT TRAN ${probeVectors}`);
1004
+ netlist.saveStatements.push(`.SAVE ${probeVectors}`);
920
1005
  }
921
1006
  }
922
1007
  const timePerStep = simExperiment.time_per_step;
@@ -1285,4 +1370,4 @@ export {
1285
1370
  circuitJsonToSpice,
1286
1371
  convertSpiceNetlistToString
1287
1372
  };
1288
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQkpUQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ3VycmVudFNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvU3ViY2lyY3VpdENhbGxDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9UcmFuc21pc3Npb25MaW5lQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9oZWxwZXJzLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3IudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvc2ltcGxlLWRpb2RlLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0LnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS10cmFuc2lzdG9yLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi12b2x0YWdlLXNvdXJjZXMudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWN1cnJlbnQtc291cmNlcy50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tb3AtYW1wLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0cy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgLy8gQWRkIHN1YmNpcmN1aXQgZGVmaW5pdGlvbnNcbiAgZm9yIChjb25zdCBzdWJjaXJjdWl0IG9mIG5ldGxpc3Quc3ViY2lyY3VpdHMpIHtcbiAgICBsaW5lcy5wdXNoKHN1YmNpcmN1aXQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzKVxuICB9XG5cbiAgLy8gQWRkIGNvbnRyb2wgYmxvY2sgaWYgcHJlc2VudFxuICBpZiAobmV0bGlzdC5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIi5jb250cm9sXCIpXG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LmNvbnRyb2xzKVxuICAgIGxpbmVzLnB1c2goXCIuZW5kY1wiKVxuICB9XG5cbiAgaWYgKFxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgJiZcbiAgICAhbGluZXMuc29tZSgobCkgPT4gbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiLnRyYW5cIikpXG4gICkge1xuICAgIGxpbmVzLnB1c2gobmV0bGlzdC50cmFuQ29tbWFuZClcbiAgfVxuXG4gIC8vIEVuZCB3aXRoIC5FTkRcbiAgbGluZXMucHVzaChcIi5FTkRcIilcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIiwgImltcG9ydCB7IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyB9IGZyb20gXCIuLi9zcGljZS11dGlscy9jb252ZXJ0U3BpY2VOZXRsaXN0VG9TdHJpbmdcIlxuaW1wb3J0IHR5cGUgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcIi4vU3BpY2VTdWJjaXJjdWl0XCJcblxuZXhwb3J0IGNsYXNzIFNwaWNlTmV0bGlzdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgY29tcG9uZW50czogU3BpY2VDb21wb25lbnRbXVxuICBub2RlczogU2V0PHN0cmluZz5cbiAgY29udHJvbHM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXRzOiBTcGljZVN1YmNpcmN1aXRbXVxuICBtb2RlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgdHJhbkNvbW1hbmQ6IHN0cmluZyB8IG51bGxcbiAgcHJpbnRTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy50cmFuQ29tbWFuZCA9IG51bGxcbiAgICB0aGlzLnByaW50U3RhdGVtZW50cyA9IFtdXG4gIH1cblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBTcGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudClcbiAgICAvLyBBZGQgbm9kZXMgdG8gdGhlIHNldFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjb21wb25lbnQubm9kZXMpIHtcbiAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3ViY2lyY3VpdChzdWJjaXJjdWl0OiBTcGljZVN1YmNpcmN1aXQpIHtcbiAgICBpZiAodGhpcy5zdWJjaXJjdWl0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHN1YmNpcmN1aXQubmFtZSkpIHJldHVyblxuICAgIHRoaXMuc3ViY2lyY3VpdHMucHVzaChzdWJjaXJjdWl0KVxuICB9XG5cbiAgdG9TcGljZVN0cmluZygpIHtcbiAgICByZXR1cm4gY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nKHRoaXMpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi4vc3BpY2UtY29tbWFuZHMvQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBjbGFzcyBTcGljZUNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBjb21tYW5kOiBCYXNlU3BpY2VDb21tYW5kXG4gIG5vZGVzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZCwgbm9kZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLm5vZGVzID0gbm9kZXNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnRvU3BpY2VTdHJpbmcoKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwiLi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHtcbiAgQW55Q2lyY3VpdEVsZW1lbnQsXG4gIFNpbXVsYXRpb25PcEFtcCxcbiAgU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdCxcbiAgU2ltdWxhdGlvblN3aXRjaCxcbiAgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZSxcbiAgU291cmNlU2ltcGxlRGlvZGUsXG4gIFNvdXJjZVNpbXBsZUxlZCxcbiAgU291cmNlU2ltcGxlTW9zZmV0LFxuICBTb3VyY2VTaW1wbGVTd2l0Y2gsXG4gIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbiB9IGZyb20gXCJjaXJjdWl0LWpzb24tdG8tY29ubmVjdGl2aXR5LW1hcFwiXG5pbXBvcnQgeyBzdSB9IGZyb20gXCJAdHNjaXJjdWl0L2NpcmN1aXQtanNvbi11dGlsXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVSZXNpc3RvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLXJlc2lzdG9yXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVTd2l0Y2ggfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1zd2l0Y2hcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZUNhcGFjaXRvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLWNhcGFjaXRvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlRGlvZGUsIHByb2Nlc3NTaW1wbGVMZWQgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1kaW9kZVwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlSW5kdWN0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlTW9zZmV0IH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0XCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVUcmFuc2lzdG9yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtdHJhbnNpc3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tdm9sdGFnZS1zb3VyY2VzXCJcbmltcG9ydCB7IHByb2Nlc3NTaW11bGF0aW9uQ3VycmVudFNvdXJjZXMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1jdXJyZW50LXNvdXJjZXNcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25FeHBlcmltZW50IH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvbk9wQW1wcyB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLW9wLWFtcFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjdWl0SnNvblRvU3BpY2UoXG4gIGNpcmN1aXRKc29uOiBBbnlDaXJjdWl0RWxlbWVudFtdLFxuKTogU3BpY2VOZXRsaXN0IHtcbiAgY29uc3QgbmV0bGlzdCA9IG5ldyBTcGljZU5ldGxpc3QoXCIqIENpcmN1aXQgSlNPTiB0byBTUElDRSBOZXRsaXN0XCIpXG4gIGNvbnN0IHNvdXJjZUNvbXBvbmVudHMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX2NvbXBvbmVudC5saXN0KClcbiAgY29uc3Qgc291cmNlUG9ydHMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3BvcnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVRyYWNlcyA9IHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfdHJhY2UubGlzdCgpXG4gIGNvbnN0IHNpbXVsYXRpb25Qcm9iZXMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlXCIsXG4gICkgYXMgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZVtdXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hlcyA9IGNpcmN1aXRKc29uXG4gICAgLmZpbHRlcihcbiAgICAgIChlbGVtZW50KSA9PiAoZWxlbWVudCBhcyB7IHR5cGU/OiBzdHJpbmcgfSkudHlwZSA9PT0gXCJzaW11bGF0aW9uX3N3aXRjaFwiLFxuICAgIClcbiAgICAubWFwKChlbGVtZW50KSA9PiBlbGVtZW50IGFzIHVua25vd24gYXMgU2ltdWxhdGlvblN3aXRjaClcbiAgY29uc3Qgc2ltdWxhdGlvbk9wQW1wcyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX29wX2FtcFwiLFxuICApIGFzIFNpbXVsYXRpb25PcEFtcFtdXG4gIGNvbnN0IHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fc3BpY2Vfc3ViY2lyY3VpdFwiLFxuICApIGFzIFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRbXVxuICBjb25zdCBzaW11bGF0aW9uU3dpdGNoTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNpbXVsYXRpb25Td2l0Y2g+KClcblxuICBmb3IgKGNvbnN0IHNpbVN3aXRjaCBvZiBzaW11bGF0aW9uU3dpdGNoZXMpIHtcbiAgICBpZiAoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQpIHtcbiAgICAgIHNpbXVsYXRpb25Td2l0Y2hNYXAuc2V0KHNpbVN3aXRjaC5zb3VyY2VfY29tcG9uZW50X2lkLCBzaW1Td2l0Y2gpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29ubk1hcCA9IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24oY2lyY3VpdEpzb24pXG5cbiAgLy8gQ3JlYXRlIG5vZGUgbWFwcGluZyBmcm9tIHBvcnQgY29ubmVjdGlvbnNcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgY29uc3QgbmV0VG9Ob2RlTmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgbGV0IG5vZGVDb3VudGVyID0gMVxuXG4gIGNvbnN0IHByb2JlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAocHJvYmUubmFtZSkge1xuICAgICAgICBwcm9iZU5hbWVzLmFkZChwcm9iZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBwcm9iZSBuYW1lcyBsaWtlIE4xLCBOMiwgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgY29uZmxpY3RzXG4gIGNvbnN0IG51bWVyaWNQcm9iZU5hbWVzID0gWy4uLnByb2JlTmFtZXNdXG4gICAgLm1hcCgobmFtZSkgPT4gL15OKFxcZCspJC9pLmV4ZWMobmFtZSkpXG4gICAgLmZpbHRlcigobSk6IG0gaXMgUmVnRXhwRXhlY0FycmF5ID0+IG0gIT09IG51bGwpXG4gICAgLm1hcCgobSkgPT4gcGFyc2VJbnQobVsxXSwgMTApKVxuXG4gIGlmIChudW1lcmljUHJvYmVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgbm9kZUNvdW50ZXIgPSBNYXRoLm1heCguLi5udW1lcmljUHJvYmVOYW1lcykgKyAxXG4gIH1cblxuICBjb25zdCBncm91bmROZXRzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAvLyBGaW5kIGdyb3VuZCBmcm9tIHNvdXJjZSBuZXRzIHRoYXQgaW5jbHVkZSBcImduZFwiIGluIHRoZSBuYW1lXG4gIGNvbnN0IGduZFNvdXJjZU5ldElkcyA9IG5ldyBTZXQoXG4gICAgc3UoY2lyY3VpdEpzb24pXG4gICAgICAuc291cmNlX25ldC5saXN0KClcbiAgICAgIC5maWx0ZXIoKHNuKSA9PiBzbi5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiZ25kXCIpKVxuICAgICAgLm1hcCgoc24pID0+IHNuLnNvdXJjZV9uZXRfaWQpLFxuICApXG5cbiAgaWYgKGduZFNvdXJjZU5ldElkcy5zaXplID4gMCkge1xuICAgIGZvciAoY29uc3QgdHJhY2Ugb2Ygc3UoY2lyY3VpdEpzb24pLnNvdXJjZV90cmFjZS5saXN0KCkpIHtcbiAgICAgIGlmICh0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaXNPbkduZE5ldCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfbmV0X2lkcy5zb21lKChuZXRJZCkgPT5cbiAgICAgICAgICBnbmRTb3VyY2VOZXRJZHMuaGFzKG5ldElkKSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNPbkduZE5ldCkge1xuICAgICAgICAgIGNvbnN0IGFQb3J0T25HbmQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgY29uc3QgZ25kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGFQb3J0T25HbmQpXG4gICAgICAgICAgaWYgKGduZE5ldCkge1xuICAgICAgICAgICAgZ3JvdW5kTmV0cy5hZGQoZ25kTmV0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgZ3JvdW5kIG5vZGUgZnJvbSBwb3J0cyBuYW1lZCBcIkdORFwiXG4gIGNvbnN0IGdyb3VuZFBvcnRzID0gc291cmNlUG9ydHMuZmlsdGVyKChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZ25kXCIpXG4gIGZvciAoY29uc3QgZ3JvdW5kUG9ydCBvZiBncm91bmRQb3J0cykge1xuICAgIGNvbnN0IGdyb3VuZE5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChncm91bmRQb3J0LnNvdXJjZV9wb3J0X2lkKVxuICAgIGlmIChncm91bmROZXQpIHtcbiAgICAgIGdyb3VuZE5ldHMuYWRkKGdyb3VuZE5ldClcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzdShjaXJjdWl0SnNvbikuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZS5saXN0KCkpIHtcbiAgICBjb25zdCBuZWdfcG9ydF9pZCA9XG4gICAgICAoc2ltU291cmNlIGFzIGFueSkubmVnYXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcbiAgICBpZiAobmVnX3BvcnRfaWQpIHtcbiAgICAgIGNvbnN0IGduZF9uZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQobmVnX3BvcnRfaWQpXG4gICAgICBpZiAoZ25kX25ldCkge1xuICAgICAgICBncm91bmROZXRzLmFkZChnbmRfbmV0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZ3JvdW5kTmV0IG9mIGdyb3VuZE5ldHMpIHtcbiAgICBuZXRUb05vZGVOYW1lLnNldChncm91bmROZXQsIFwiMFwiKVxuICB9XG5cbiAgLy8gUHJlLWFzc2lnbiBub2RlIG5hbWVzIGZyb20gdm9sdGFnZSBwcm9iZXNcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgaWYgKCFwcm9iZS5uYW1lKSBjb250aW51ZVxuXG4gICAgICBpZiAoXG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfcG9ydF9pZCB8fFxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBuZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcbiAgICAgIGNvbnN0IHNpZ25hbF9wb3J0X2lkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBzaWduYWxfbmV0X2lkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWRcblxuICAgICAgaWYgKHNpZ25hbF9wb3J0X2lkKSB7XG4gICAgICAgIG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChzaWduYWxfcG9ydF9pZClcbiAgICAgIH0gZWxzZSBpZiAoc2lnbmFsX25ldF9pZCkge1xuICAgICAgICBjb25zdCB0cmFjZSA9IHNvdXJjZVRyYWNlcy5maW5kKCh0KSA9PlxuICAgICAgICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKHNpZ25hbF9uZXRfaWQhKSxcbiAgICAgICAgKVxuICAgICAgICBpZiAodHJhY2UgJiYgdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcG9ydElkID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgICAgIG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChwb3J0SWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ldCkge1xuICAgICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgICBuZXRUb05vZGVOYW1lLnNldChuZXQsIHByb2JlLm5hbWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2lnbmFsX3BvcnRfaWQgJiYgcHJvYmUubmFtZSkge1xuICAgICAgICAvLyBJdCdzIGEgZmxvYXRpbmcgcG9ydCB3aXRoIGEgcHJvYmUsIHNvIHdlIG1hcCBpdCBkaXJlY3RseS4gVGhpcyBwb3J0XG4gICAgICAgIC8vIHdpbGwgbm93IGJlIHNraXBwZWQgaW4gdGhlIHNlY29uZC1wYXNzIGZvciB1bmNvbm5lY3RlZCBwb3J0cy5cbiAgICAgICAgbm9kZU1hcC5zZXQoc2lnbmFsX3BvcnRfaWQsIHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byBhbGwgY29ubmVjdGVkIG5ldHNcbiAgZm9yIChjb25zdCBwb3J0IG9mIHNvdXJjZVBvcnRzKSB7XG4gICAgY29uc3QgcG9ydElkID0gcG9ydC5zb3VyY2VfcG9ydF9pZFxuICAgIGNvbnN0IG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChwb3J0SWQpXG4gICAgaWYgKG5ldCkge1xuICAgICAgaWYgKCFuZXRUb05vZGVOYW1lLmhhcyhuZXQpKSB7XG4gICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICAgIH1cbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgbmV0VG9Ob2RlTmFtZS5nZXQobmV0KSEpXG4gICAgfVxuICB9XG5cbiAgLy8gU2Vjb25kIHBhc3M6IGFzc2lnbiBub2RlIG51bWJlcnMgdG8gdW5jb25uZWN0ZWQgcG9ydHNcbiAgZm9yIChjb25zdCBwb3J0IG9mIHNvdXJjZVBvcnRzKSB7XG4gICAgY29uc3QgcG9ydElkID0gcG9ydC5zb3VyY2VfcG9ydF9pZFxuICAgIC8vIElmIGEgcG9ydCB3YXNuJ3QgaW4gYSBuZXQsIGl0IHdvbid0IGJlIGluIHRoZSBub2RlTWFwIHlldFxuICAgIGlmICghbm9kZU1hcC5oYXMocG9ydElkKSkge1xuICAgICAgLy8gVW5jb25uZWN0ZWQgcG9ydCwgY3JlYXRlIGEgbmV3IGZsb2F0aW5nIG5vZGUgZm9yIGl0XG4gICAgICBub2RlTWFwLnNldChwb3J0SWQsIGBOJHtub2RlQ291bnRlcisrfWApXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBlYWNoIGNvbXBvbmVudFxuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBzb3VyY2VDb21wb25lbnRzKSB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlICE9PSBcInNvdXJjZV9jb21wb25lbnRcIikgY29udGludWVcblxuICAgIGNvbnN0IGNvbXBvbmVudFBvcnRzID0gc3UoY2lyY3VpdEpzb24pXG4gICAgICAuc291cmNlX3BvcnQubGlzdCh7XG4gICAgICAgIHNvdXJjZV9jb21wb25lbnRfaWQ6IGNvbXBvbmVudC5zb3VyY2VfY29tcG9uZW50X2lkLFxuICAgICAgfSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5waW5fbnVtYmVyID8/IDApIC0gKGIucGluX251bWJlciA/PyAwKSlcblxuICAgIC8vIEdldCBub2RlIG5hbWVzIGZvciBjb21wb25lbnQgcG9ydHNcbiAgICBjb25zdCBub2RlcyA9IGNvbXBvbmVudFBvcnRzLm1hcCgocG9ydCkgPT4ge1xuICAgICAgcmV0dXJuIG5vZGVNYXAuZ2V0KHBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgfSlcblxuICAgIC8vIENyZWF0ZSBTUElDRSBjb21wb25lbnQgYmFzZWQgb24gdHlwZVxuICAgIGlmIChcImZ0eXBlXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICBsZXQgc3BpY2VDb21wb25lbnQ6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9IG51bGxcblxuICAgICAgc3dpdGNoICgoY29tcG9uZW50IGFzIHsgZnR5cGU6IHN0cmluZyB9KS5mdHlwZSkge1xuICAgICAgICBjYXNlIFwic2ltcGxlX3Jlc2lzdG9yXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVSZXNpc3Rvcih7IGNvbXBvbmVudCwgbm9kZXMgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfc3dpdGNoXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVTd2l0Y2goe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZVN3aXRjaCxcbiAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9jYXBhY2l0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZUNhcGFjaXRvcih7IGNvbXBvbmVudCwgbm9kZXMgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfZGlvZGVcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZURpb2RlKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVEaW9kZSxcbiAgICAgICAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9sZWRcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZUxlZCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlTGVkLFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2luZHVjdG9yXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVJbmR1Y3Rvcih7IGNvbXBvbmVudCwgbm9kZXMgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfbW9zZmV0XCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVNb3NmZXQoe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZU1vc2ZldCxcbiAgICAgICAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV90cmFuc2lzdG9yXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVUcmFuc2lzdG9yKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yLFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3BpY2VDb21wb25lbnQpIHtcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1NpbXVsYXRpb25Wb2x0YWdlU291cmNlcyhcbiAgICBuZXRsaXN0LFxuICAgIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSxcbiAgICBub2RlTWFwLFxuICApXG5cbiAgcHJvY2Vzc1NpbXVsYXRpb25DdXJyZW50U291cmNlcyhcbiAgICBuZXRsaXN0LFxuICAgIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlLmxpc3QoKSxcbiAgICBub2RlTWFwLFxuICApXG5cbiAgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMobmV0bGlzdCwgc2ltdWxhdGlvbk9wQW1wcywgbm9kZU1hcClcblxuICBwcm9jZXNzU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMoXG4gICAgbmV0bGlzdCxcbiAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyxcbiAgICBub2RlTWFwLFxuICApXG5cbiAgY29uc3Qgc2ltdWxhdGlvbkV4cGVyaW1lbnQgPSBjaXJjdWl0SnNvbi5maW5kKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fZXhwZXJpbWVudFwiLFxuICApXG4gIGlmIChzaW11bGF0aW9uRXhwZXJpbWVudClcbiAgICBwcm9jZXNzU2ltdWxhdGlvbkV4cGVyaW1lbnQoXG4gICAgICBuZXRsaXN0LFxuICAgICAgc2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gICAgICBzaW11bGF0aW9uUHJvYmVzLFxuICAgICAgc291cmNlVHJhY2VzLFxuICAgICAgbm9kZU1hcCxcbiAgICApXG5cbiAgcmV0dXJuIG5ldGxpc3Rcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBCSlRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgY29sbGVjdG9yOiBzdHJpbmdcbiAgYmFzZTogc3RyaW5nXG4gIGVtaXR0ZXI6IHN0cmluZ1xuICBzdWJzdHJhdGU/OiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCSlRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJianRcIiBhcyBjb25zdFxuICBwcm9wczogQkpUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEJKVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgY29sbGVjdG9yLCBiYXNlLCBlbWl0dGVyLCBzdWJzdHJhdGUsIG1vZGVsLCBhcmVhIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBRJHtuYW1lfSAke2NvbGxlY3Rvcn0gJHtiYXNlfSAke2VtaXR0ZXJ9YFxuICAgIGlmIChzdWJzdHJhdGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHtzdWJzdHJhdGV9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIGlmIChhcmVhKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7YXJlYX1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwYWNpdG9yQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsTmFtZT86IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIGluaXRpYWxDb25kaXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIENhcGFjaXRvckNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImNhcGFjaXRvclwiIGFzIGNvbnN0XG5cbiAgcHJvcHM6IENhcGFjaXRvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBpbml0aWFsQ29uZGl0aW9uLFxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgQyR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAobW9kZWxOYW1lKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWxOYW1lfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICBpZiAoaW5pdGlhbENvbmRpdGlvbikge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBJQz0ke2luaXRpYWxDb25kaXRpb259YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgYWNNYWduaXR1ZGU/OiBzdHJpbmdcbiAgYWNQaGFzZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQ3VycmVudFNvdXJjZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImN1cnJlbnRfc291cmNlXCIgYXMgY29uc3RcbiAgcHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIHZhbHVlLCBhY01hZ25pdHVkZSwgYWNQaGFzZSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSSR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgfVxuICAgIGlmIChhY01hZ25pdHVkZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBBQyAke2FjTWFnbml0dWRlfWBcbiAgICAgIGlmIChhY1BoYXNlKSB7XG4gICAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthY1BoYXNlfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBEaW9kZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIERpb2RlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiZGlvZGVcIiBhcyBjb25zdFxuICBwcm9wczogRGlvZGVDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlvZGVDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCBtb2RlbCwgYXJlYSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBEJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9ICR7bW9kZWx9YFxuICAgIGlmIChhcmVhKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7YXJlYX1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5kdWN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJbmR1Y3RvckNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEluZHVjdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIHZhbHVlLCBpbml0aWFsQ29uZGl0aW9uIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBMJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICBpZiAoaW5pdGlhbENvbmRpdGlvbikge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBJQz0ke2luaXRpYWxDb25kaXRpb259YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgaW5kdWN0b3JzOiBzdHJpbmdbXVxuICBjb3VwbGluZzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JfY291cGxpbmdcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBpbmR1Y3RvcnMsIGNvdXBsaW5nIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBLJHtuYW1lfSAke2luZHVjdG9ycy5qb2luKFwiIFwiKX0gJHtjb3VwbGluZ31gXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBKRkVUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRyYWluOiBzdHJpbmdcbiAgZ2F0ZTogc3RyaW5nXG4gIHNvdXJjZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSkZFVENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImpmZXRcIiBhcyBjb25zdFxuICBwcm9wczogSkZFVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBKRkVUQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBkcmFpbiwgZ2F0ZSwgc291cmNlLCBtb2RlbCwgYXJlYSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBKJHtuYW1lfSAke2RyYWlufSAke2dhdGV9ICR7c291cmNlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIE1PU0ZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBzdWJzdHJhdGU6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGxlbmd0aD86IHN0cmluZ1xuICB3aWR0aD86IHN0cmluZ1xuICBkcmFpbkFyZWE/OiBzdHJpbmdcbiAgc291cmNlQXJlYT86IHN0cmluZ1xuICBkcmFpblBlcmltZXRlcj86IHN0cmluZ1xuICBzb3VyY2VQZXJpbWV0ZXI/OiBzdHJpbmdcbiAgZHJhaW5SZXNpc3RhbmNlPzogc3RyaW5nXG4gIHNvdXJjZVJlc2lzdGFuY2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIE1PU0ZFVENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcIm1vc2ZldFwiIGFzIGNvbnN0XG4gIHByb3BzOiBNT1NGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIGRyYWluLFxuICAgICAgZ2F0ZSxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHN1YnN0cmF0ZSxcbiAgICAgIG1vZGVsLFxuICAgICAgbGVuZ3RoLFxuICAgICAgd2lkdGgsXG4gICAgICBkcmFpbkFyZWEsXG4gICAgICBzb3VyY2VBcmVhLFxuICAgICAgZHJhaW5QZXJpbWV0ZXIsXG4gICAgICBzb3VyY2VQZXJpbWV0ZXIsXG4gICAgICBkcmFpblJlc2lzdGFuY2UsXG4gICAgICBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTSR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHtzdWJzdHJhdGV9ICR7bW9kZWx9YFxuXG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge1xuICAgICAgTDogbGVuZ3RoLFxuICAgICAgVzogd2lkdGgsXG4gICAgICBBRDogZHJhaW5BcmVhLFxuICAgICAgQVM6IHNvdXJjZUFyZWEsXG4gICAgICBQRDogZHJhaW5QZXJpbWV0ZXIsXG4gICAgICBQUzogc291cmNlUGVyaW1ldGVyLFxuICAgICAgTlJEOiBkcmFpblJlc2lzdGFuY2UsXG4gICAgICBOUlM6IHNvdXJjZVJlc2lzdGFuY2UsXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMocGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7a2V5fT0ke3ZhbHVlfWBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBSZXNpc3RvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbD86IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpc3RvckNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInJlc2lzdG9yXCIgYXMgY29uc3RcbiAgcHJvcHM6IFJlc2lzdG9yQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlc2lzdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIHZhbHVlIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFIke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViY2lyY3VpdENhbGxDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgbm9kZXM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmNpcmN1aXRDYWxsQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwic3ViY2lyY3VpdF9jYWxsXCIgYXMgY29uc3RcbiAgcHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBub2Rlcywgc3ViY2lyY3VpdE5hbWUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gYFgke25hbWV9ICR7bm9kZXMuam9pbihcIiBcIil9ICR7c3ViY2lyY3VpdE5hbWV9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBhUG9zaXRpdmU6IHN0cmluZ1xuICBhTmVnYXRpdmU6IHN0cmluZ1xuICBiUG9zaXRpdmU6IHN0cmluZ1xuICBiTmVnYXRpdmU6IHN0cmluZ1xuICBpbXBlZGFuY2U6IHN0cmluZ1xuICBkZWxheT86IHN0cmluZ1xuICBmcmVxdWVuY3k/OiBzdHJpbmdcbiAgbm9ybWFsaXplZExlbmd0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInRyYW5zbWlzc2lvbl9saW5lXCIgYXMgY29uc3RcbiAgcHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBhUG9zaXRpdmUsXG4gICAgICBhTmVnYXRpdmUsXG4gICAgICBiUG9zaXRpdmUsXG4gICAgICBiTmVnYXRpdmUsXG4gICAgICBpbXBlZGFuY2UsXG4gICAgICBkZWxheSxcbiAgICAgIGZyZXF1ZW5jeSxcbiAgICAgIG5vcm1hbGl6ZWRMZW5ndGgsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgVCR7bmFtZX0gJHthUG9zaXRpdmV9ICR7YU5lZ2F0aXZlfSAke2JQb3NpdGl2ZX0gJHtiTmVnYXRpdmV9IFowPSR7aW1wZWRhbmNlfWBcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgVEQ9JHtkZWxheX1gXG4gICAgfSBlbHNlIGlmIChmcmVxdWVuY3kpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgRj0ke2ZyZXF1ZW5jeX1gXG4gICAgICBpZiAobm9ybWFsaXplZExlbmd0aCkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgIE5MPSR7bm9ybWFsaXplZExlbmd0aH1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgcG9zaXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbmVnYXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX2NvbnRyb2xsZWRfc3dpdGNoXCIgYXMgY29uc3RcbiAgcHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIHBvc2l0aXZlQ29udHJvbCxcbiAgICAgIG5lZ2F0aXZlQ29udHJvbCxcbiAgICAgIG1vZGVsLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBTJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9ICR7cG9zaXRpdmVDb250cm9sfSAke25lZ2F0aXZlQ29udHJvbH0gJHttb2RlbH1gXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFYke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uU3dpdGNoIH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZXNpc3RhbmNlKHJlc2lzdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChyZXNpc3RhbmNlID49IDFlNikgcmV0dXJuIGAke3Jlc2lzdGFuY2UgLyAxZTZ9TUVHYFxuICBpZiAocmVzaXN0YW5jZSA+PSAxZTMpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWUzfUtgXG4gIHJldHVybiByZXNpc3RhbmNlLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhcGFjaXRhbmNlKGNhcGFjaXRhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWUzfU1gXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS02KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTZ9VWBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTkpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlOX1OYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlMTJ9UGBcbiAgcmV0dXJuIGNhcGFjaXRhbmNlLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEluZHVjdGFuY2UoaW5kdWN0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluZHVjdGFuY2UgPj0gMSkgcmV0dXJuIGluZHVjdGFuY2UudG9TdHJpbmcoKVxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS0zKSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlM31tYFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS02KSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlNn11YFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlOX1uYFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS0xMikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTEyfXBgXG4gIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gcHJlZml4XG4gIGNvbnN0IHNhbml0aXplZCA9IHZhbHVlLnJlcGxhY2UoL1teQS1aYS16MC05X10vZywgXCJfXCIpXG4gIGlmICghc2FuaXRpemVkKSByZXR1cm4gcHJlZml4XG4gIGlmICgvXlswLTldLy50ZXN0KHNhbml0aXplZCkpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fV8ke3Nhbml0aXplZH1gXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaW11bGF0aW9uU3dpdGNoQ29udHJvbFZhbHVlKFxuICBzaW11bGF0aW9uU3dpdGNoOiBTaW11bGF0aW9uU3dpdGNoIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IGhpZ2hWb2x0YWdlID0gNVxuICBjb25zdCBsb3dWb2x0YWdlID0gMFxuICBjb25zdCByaXNlVGltZSA9IFwiMW5cIlxuICBjb25zdCBmYWxsVGltZSA9IFwiMW5cIlxuXG4gIGlmICghc2ltdWxhdGlvblN3aXRjaCkge1xuICAgIHJldHVybiBgREMgJHtsb3dWb2x0YWdlfWBcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0c0Nsb3NlZCA9IHNpbXVsYXRpb25Td2l0Y2guc3RhcnRzX2Nsb3NlZCA/PyBmYWxzZVxuICBjb25zdCBjbG9zZXNBdCA9IHNpbXVsYXRpb25Td2l0Y2guY2xvc2VzX2F0ID8/IDBcbiAgY29uc3Qgb3BlbnNBdCA9IHNpbXVsYXRpb25Td2l0Y2gub3BlbnNfYXRcbiAgY29uc3Qgc3dpdGNoaW5nRnJlcXVlbmN5ID0gc2ltdWxhdGlvblN3aXRjaC5zd2l0Y2hpbmdfZnJlcXVlbmN5XG5cbiAgY29uc3QgW2luaXRpYWxWb2x0YWdlLCBwdWxzZWRWb2x0YWdlXSA9IHN0YXJ0c0Nsb3NlZFxuICAgID8gW2hpZ2hWb2x0YWdlLCBsb3dWb2x0YWdlXVxuICAgIDogW2xvd1ZvbHRhZ2UsIGhpZ2hWb2x0YWdlXVxuXG4gIGlmIChzd2l0Y2hpbmdGcmVxdWVuY3kgJiYgc3dpdGNoaW5nRnJlcXVlbmN5ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IDEgLyBzd2l0Y2hpbmdGcmVxdWVuY3lcbiAgICBjb25zdCB3aWR0aEZyb21PcGVuQ2xvc2UgPVxuICAgICAgb3BlbnNBdCAmJiBvcGVuc0F0ID4gY2xvc2VzQXQgPyBNYXRoLm1pbihvcGVuc0F0IC0gY2xvc2VzQXQsIHBlcmlvZCkgOiAwXG4gICAgY29uc3QgcHVsc2VXaWR0aCA9XG4gICAgICB3aWR0aEZyb21PcGVuQ2xvc2UgPiAwID8gd2lkdGhGcm9tT3BlbkNsb3NlIDogTWF0aC5tYXgocGVyaW9kIC8gMiwgMWUtOSlcblxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIGlmIChvcGVuc0F0ICE9PSB1bmRlZmluZWQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0KSB7XG4gICAgY29uc3QgcHVsc2VXaWR0aCA9IE1hdGgubWF4KG9wZW5zQXQgLSBjbG9zZXNBdCwgMWUtOSlcbiAgICBjb25zdCBwZXJpb2QgPSBjbG9zZXNBdCArIHB1bHNlV2lkdGggKiAyXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAoY2xvc2VzQXQgPiAwKSB7XG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKiAyXG4gICAgY29uc3QgcHVsc2VXaWR0aCA9IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgcmV0dXJuIGBEQyAke3N0YXJ0c0Nsb3NlZCA/IGhpZ2hWb2x0YWdlIDogbG93Vm9sdGFnZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXJGb3JTcGljZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGAke3ZhbHVlfWBcbiAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gXCIwXCJcblxuICBjb25zdCBhYnNWYWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChhYnNWYWx1ZSA+PSAxZTMgfHwgYWJzVmFsdWUgPD0gMWUtMykge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUudG9FeHBvbmVudGlhbCg2KSkudG9TdHJpbmcoKVxuICB9XG5cbiAgcmV0dXJuIE51bWJlcih2YWx1ZS50b1ByZWNpc2lvbig2KSkudG9TdHJpbmcoKVxufVxuIiwgImltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB7IFJlc2lzdG9yQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZm9ybWF0UmVzaXN0YW5jZSB9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXBsZVJlc2lzdG9yID0gKHtcbiAgY29tcG9uZW50LFxuICBub2Rlcyxcbn06IHtcbiAgY29tcG9uZW50OiBBbnlDaXJjdWl0RWxlbWVudFxuICBub2Rlczogc3RyaW5nW11cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJyZXNpc3RhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IHJlc2lzdG9yQ21kID0gbmV3IFJlc2lzdG9yQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBwb3NpdGl2ZU5vZGU6IG5vZGVzWzBdIHx8IFwiMFwiLFxuICAgICAgbmVnYXRpdmVOb2RlOiBub2Rlc1sxXSB8fCBcIjBcIixcbiAgICAgIHZhbHVlOiBmb3JtYXRSZXNpc3RhbmNlKGNvbXBvbmVudC5yZXNpc3RhbmNlIGFzIG51bWJlciksXG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgcmVzaXN0b3JDbWQsIG5vZGVzKVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB7XG4gIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCxcbiAgVm9sdGFnZVNvdXJjZUNvbW1hbmQsXG59IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uU3dpdGNoLCBTb3VyY2VTaW1wbGVTd2l0Y2ggfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7XG4gIGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZSxcbiAgc2FuaXRpemVJZGVudGlmaWVyLFxufSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVTd2l0Y2ggPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIG5vZGVzLFxuICBzaW11bGF0aW9uU3dpdGNoTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVTd2l0Y2hcbiAgbm9kZXM6IHN0cmluZ1tdXG4gIHNpbXVsYXRpb25Td2l0Y2hNYXA6IE1hcDxzdHJpbmcsIFNpbXVsYXRpb25Td2l0Y2g+XG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgY29uc3Qgc2FuaXRpemVkQmFzZSA9IHNhbml0aXplSWRlbnRpZmllcihcbiAgICBjb21wb25lbnQubmFtZSA/PyBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICBcIlNXXCIsXG4gIClcbiAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZXNbMF0gfHwgXCIwXCJcbiAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZXNbMV0gfHwgXCIwXCJcbiAgY29uc3QgY29udHJvbE5vZGUgPSBgTkNUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgY29uc3QgbW9kZWxOYW1lID0gYFNXXyR7c2FuaXRpemVkQmFzZX1gXG5cbiAgY29uc3QgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2ggPSBzaW11bGF0aW9uU3dpdGNoTWFwLmdldChcbiAgICBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgKVxuXG4gIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgICBhc3NvY2lhdGVkU2ltdWxhdGlvblN3aXRjaCxcbiAgKVxuXG4gIGNvbnN0IHN3aXRjaENtZCA9IG5ldyBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQoe1xuICAgIG5hbWU6IHNhbml0aXplZEJhc2UsXG4gICAgcG9zaXRpdmVOb2RlLFxuICAgIG5lZ2F0aXZlTm9kZSxcbiAgICBwb3NpdGl2ZUNvbnRyb2w6IGNvbnRyb2xOb2RlLFxuICAgIG5lZ2F0aXZlQ29udHJvbDogXCIwXCIsXG4gICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgfSlcblxuICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gU1coUm9uPTAuMSBSb2ZmPTFlOSBWdD0yLjUgVmg9MC4xKWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY29udHJvbFNvdXJjZU5hbWUgPSBgQ1RSTF8ke3Nhbml0aXplZEJhc2V9YFxuICBjb25zdCBjb250cm9sU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICBuYW1lOiBjb250cm9sU291cmNlTmFtZSxcbiAgICBwb3NpdGl2ZU5vZGU6IGNvbnRyb2xOb2RlLFxuICAgIG5lZ2F0aXZlTm9kZTogXCIwXCIsXG4gICAgdmFsdWU6IGNvbnRyb2xWYWx1ZSxcbiAgfSlcblxuICBjb25zdCBjb250cm9sQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgIGNvbnRyb2xTb3VyY2VOYW1lLFxuICAgIGNvbnRyb2xTb3VyY2VDbWQsXG4gICAgW2NvbnRyb2xOb2RlLCBcIjBcIl0sXG4gIClcblxuICBuZXRsaXN0LmFkZENvbXBvbmVudChjb250cm9sQ29tcG9uZW50KVxuXG4gIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoc2FuaXRpemVkQmFzZSwgc3dpdGNoQ21kLCBbXG4gICAgcG9zaXRpdmVOb2RlLFxuICAgIG5lZ2F0aXZlTm9kZSxcbiAgICBjb250cm9sTm9kZSxcbiAgICBcIjBcIixcbiAgXSlcbn1cbiIsICJpbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBDYXBhY2l0b3JDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBmb3JtYXRDYXBhY2l0YW5jZSB9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXBsZUNhcGFjaXRvciA9ICh7XG4gIGNvbXBvbmVudCxcbiAgbm9kZXMsXG59OiB7XG4gIGNvbXBvbmVudDogQW55Q2lyY3VpdEVsZW1lbnRcbiAgbm9kZXM6IHN0cmluZ1tdXG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwiY2FwYWNpdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgY2FwYWNpdG9yQ21kID0gbmV3IENhcGFjaXRvckNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICB2YWx1ZTogZm9ybWF0Q2FwYWNpdGFuY2UoY29tcG9uZW50LmNhcGFjaXRhbmNlIGFzIG51bWJlciksXG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgY2FwYWNpdG9yQ21kLCBub2RlcylcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBEaW9kZUNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHtcbiAgU291cmNlUG9ydCxcbiAgU291cmNlU2ltcGxlRGlvZGUsXG4gIFNvdXJjZVNpbXBsZUxlZCxcbn0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGdldERpb2RlTm9kZXMgPSAoXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W10sXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pID0+IHtcbiAgY29uc3QgYW5vZGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImFub2RlXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImFub2RlXCIpLFxuICApXG4gIGNvbnN0IGNhdGhvZGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAocCkgPT5cbiAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJjYXRob2RlXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNhdGhvZGVcIiksXG4gIClcblxuICByZXR1cm4ge1xuICAgIHBvc2l0aXZlTm9kZTogbm9kZU1hcC5nZXQoYW5vZGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIixcbiAgICBuZWdhdGl2ZU5vZGU6IG5vZGVNYXAuZ2V0KGNhdGhvZGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIixcbiAgfVxufVxuXG5jb25zdCBwcm9jZXNzRGlvZGVMaWtlQ29tcG9uZW50ID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbiAgbW9kZWxOYW1lLFxuICBtb2RlbERlZmluaXRpb24sXG59OiB7XG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdFxuICBjb21wb25lbnQ6IFNvdXJjZVNpbXBsZURpb2RlIHwgU291cmNlU2ltcGxlTGVkXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxuICBtb2RlbE5hbWU6IHN0cmluZ1xuICBtb2RlbERlZmluaXRpb246IHN0cmluZ1xufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCB7IHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlIH0gPSBnZXREaW9kZU5vZGVzKFxuICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICBub2RlTWFwLFxuICAgIClcblxuICAgIGNvbnN0IGRpb2RlQ21kID0gbmV3IERpb2RlQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgIH0pXG4gICAgbmV0bGlzdC5tb2RlbHMuc2V0KG1vZGVsTmFtZSwgbW9kZWxEZWZpbml0aW9uKVxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBkaW9kZUNtZCwgW1xuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgIF0pXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVEaW9kZSA9ICh7XG4gIG5ldGxpc3QsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UG9ydHMsXG4gIG5vZGVNYXAsXG59OiB7XG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdFxuICBjb21wb25lbnQ6IFNvdXJjZVNpbXBsZURpb2RlXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIHJldHVybiBwcm9jZXNzRGlvZGVMaWtlQ29tcG9uZW50KHtcbiAgICBuZXRsaXN0LFxuICAgIGNvbXBvbmVudCxcbiAgICBjb21wb25lbnRQb3J0cyxcbiAgICBub2RlTWFwLFxuICAgIG1vZGVsTmFtZTogXCJEXCIsXG4gICAgbW9kZWxEZWZpbml0aW9uOiBcIi5NT0RFTCBEIERcIixcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVMZWQgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVMZWRcbiAgY29tcG9uZW50UG9ydHM6IFNvdXJjZVBvcnRbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgcmV0dXJuIHByb2Nlc3NEaW9kZUxpa2VDb21wb25lbnQoe1xuICAgIG5ldGxpc3QsXG4gICAgY29tcG9uZW50LFxuICAgIGNvbXBvbmVudFBvcnRzLFxuICAgIG5vZGVNYXAsXG4gICAgbW9kZWxOYW1lOiBcIkxFRFwiLFxuICAgIG1vZGVsRGVmaW5pdGlvbjpcbiAgICAgIFwiLk1PREVMIExFRCBEKElTPTFlLTIwIE49MiBSUz0xMCBDSk89MnAgRUc9Mi4xIEJWPTUgSUJWPTEwdSlcIixcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBJbmR1Y3RvckNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGZvcm1hdEluZHVjdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVJbmR1Y3RvciA9ICh7XG4gIGNvbXBvbmVudCxcbiAgbm9kZXMsXG59OiB7XG4gIGNvbXBvbmVudDogQW55Q2lyY3VpdEVsZW1lbnRcbiAgbm9kZXM6IHN0cmluZ1tdXG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwiaW5kdWN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCBpbmR1Y3RvckNtZCA9IG5ldyBJbmR1Y3RvckNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICB2YWx1ZTogZm9ybWF0SW5kdWN0YW5jZShjb21wb25lbnQuaW5kdWN0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIGluZHVjdG9yQ21kLCBub2RlcylcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBNT1NGRVRDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IFNvdXJjZVBvcnQsIFNvdXJjZVNpbXBsZU1vc2ZldCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXBsZU1vc2ZldCA9ICh7XG4gIG5ldGxpc3QsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UG9ydHMsXG4gIG5vZGVNYXAsXG59OiB7XG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdFxuICBjb21wb25lbnQ6IFNvdXJjZVNpbXBsZU1vc2ZldFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgZHJhaW5Qb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PlxuICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZHJhaW5cIiB8fCBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZHJhaW5cIiksXG4gICAgKVxuICAgIGNvbnN0IGdhdGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZ2F0ZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJnYXRlXCIpLFxuICAgIClcbiAgICBjb25zdCBzb3VyY2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PlxuICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwic291cmNlXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcInNvdXJjZVwiKSxcbiAgICApXG5cbiAgICBjb25zdCBkcmFpbk5vZGUgPSBub2RlTWFwLmdldChkcmFpblBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgY29uc3QgZ2F0ZU5vZGUgPSBub2RlTWFwLmdldChnYXRlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcbiAgICBjb25zdCBzb3VyY2VOb2RlID0gbm9kZU1hcC5nZXQoc291cmNlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcblxuICAgIC8vIEZvciAzLXBpbiBNT1NGRVRzLCBzdWJzdHJhdGUgaXMgdHlwaWNhbGx5IGNvbm5lY3RlZCB0byBzb3VyY2VcbiAgICBjb25zdCBzdWJzdHJhdGVOb2RlID0gc291cmNlTm9kZVxuXG4gICAgY29uc3QgY2hhbm5lbF90eXBlID0gY29tcG9uZW50LmNoYW5uZWxfdHlwZSA/PyBcIm5cIlxuICAgIGNvbnN0IG1vc2ZldF9tb2RlID0gY29tcG9uZW50Lm1vc2ZldF9tb2RlID8/IFwiZW5oYW5jZW1lbnRcIlxuXG4gICAgY29uc3QgbW9kZWxUeXBlID0gYCR7Y2hhbm5lbF90eXBlLnRvVXBwZXJDYXNlKCl9TU9TYFxuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGAke21vZGVsVHlwZX1fJHttb3NmZXRfbW9kZS50b1VwcGVyQ2FzZSgpfWBcblxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIGlmIChtb3NmZXRfbW9kZSA9PT0gXCJlbmhhbmNlbWVudFwiKSB7XG4gICAgICAgIGNvbnN0IHZ0byA9IGNoYW5uZWxfdHlwZSA9PT0gXCJwXCIgPyAtMSA6IDFcbiAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSAke21vZGVsVHlwZX0gKFZUTz0ke3Z0b30gS1A9MC4xKWAsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHttb2RlbFR5cGV9IChLUD0wLjEpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vc2ZldENtZCA9IG5ldyBNT1NGRVRDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIGRyYWluOiBkcmFpbk5vZGUsXG4gICAgICBnYXRlOiBnYXRlTm9kZSxcbiAgICAgIHNvdXJjZTogc291cmNlTm9kZSxcbiAgICAgIHN1YnN0cmF0ZTogc3Vic3RyYXRlTm9kZSxcbiAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgfSlcblxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBtb3NmZXRDbWQsIFtcbiAgICAgIGRyYWluTm9kZSxcbiAgICAgIGdhdGVOb2RlLFxuICAgICAgc291cmNlTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB7IEJKVENvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgU291cmNlUG9ydCwgU291cmNlU2ltcGxlVHJhbnNpc3RvciB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXBsZVRyYW5zaXN0b3IgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCBjb2xsZWN0b3JQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PlxuICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY29sbGVjdG9yXCIgfHxcbiAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNvbGxlY3RvclwiKSxcbiAgICApXG4gICAgY29uc3QgYmFzZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJiYXNlXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImJhc2VcIiksXG4gICAgKVxuICAgIGNvbnN0IGVtaXR0ZXJQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PlxuICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZW1pdHRlclwiIHx8XG4gICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJlbWl0dGVyXCIpLFxuICAgIClcblxuICAgIGlmICghY29sbGVjdG9yUG9ydCB8fCAhYmFzZVBvcnQgfHwgIWVtaXR0ZXJQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2lzdG9yICR7Y29tcG9uZW50Lm5hbWV9IGlzIG1pc3NpbmcgcmVxdWlyZWQgcG9ydHMgKGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlcilgLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rvck5vZGUgPSBub2RlTWFwLmdldChjb2xsZWN0b3JQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIGNvbnN0IGJhc2VOb2RlID0gbm9kZU1hcC5nZXQoYmFzZVBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgY29uc3QgZW1pdHRlck5vZGUgPSBub2RlTWFwLmdldChlbWl0dGVyUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcblxuICAgIGNvbnN0IHRyYW5zaXN0b3JfdHlwZSA9IGNvbXBvbmVudC50cmFuc2lzdG9yX3R5cGUgPz8gXCJucG5cIlxuICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpXG4gICAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9ICR7dHJhbnNpc3Rvcl90eXBlLnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBianRDbWQgPSBuZXcgQkpUQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBjb2xsZWN0b3I6IGNvbGxlY3Rvck5vZGUsXG4gICAgICBiYXNlOiBiYXNlTm9kZSxcbiAgICAgIGVtaXR0ZXI6IGVtaXR0ZXJOb2RlLFxuICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICB9KVxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBianRDbWQsIFtcbiAgICAgIGNvbGxlY3Rvck5vZGUsXG4gICAgICBiYXNlTm9kZSxcbiAgICAgIGVtaXR0ZXJOb2RlLFxuICAgIF0pXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50LCBTaW11bGF0aW9uVm9sdGFnZVNvdXJjZSB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFZvbHRhZ2VTb3VyY2VDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlczogU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMpIHtcbiAgICBpZiAoc2ltU291cmNlLnR5cGUgIT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZVwiKSBjb250aW51ZVxuXG4gICAgaWYgKHNpbVNvdXJjZS5pc19kY19zb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAvLyBBQyBTb3VyY2VcbiAgICAgIGlmIChcbiAgICAgICAgXCJ0ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgXCJ0ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCAmJlxuICAgICAgICBzaW1Tb3VyY2UudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldChzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgbGV0IHZhbHVlID0gXCJcIlxuICAgICAgICBjb25zdCB3YXZlX3NoYXBlID0gc2ltU291cmNlLndhdmVfc2hhcGVcbiAgICAgICAgaWYgKHdhdmVfc2hhcGUgPT09IFwic2luZXdhdmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfb2Zmc2V0ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCB2X3BlYWsgPSBzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBkYW1waW5nX2ZhY3RvciA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7dl9vZmZzZXR9ICR7dl9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCB2X3B1bHNlZCA9IHNpbVNvdXJjZS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgcGVyaW9kID0gcGVyaW9kX2Zyb21fZnJlcVxuICAgICAgICAgIGNvbnN0IGR1dHlfY3ljbGUgPSBzaW1Tb3VyY2UuZHV0eV9jeWNsZSA/PyAwLjVcbiAgICAgICAgICBjb25zdCBwdWxzZV93aWR0aCA9IHBlcmlvZCAqIGR1dHlfY3ljbGVcbiAgICAgICAgICBjb25zdCBkZWxheSA9IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICBjb25zdCBmYWxsX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICB2YWx1ZSA9IGBQVUxTRSgke3ZfaW5pdGlhbH0gJHt2X3B1bHNlZH0gJHtkZWxheX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlX3dpZHRofSAke3BlcmlvZH0pYFxuICAgICAgICB9IGVsc2UgaWYgKHNpbVNvdXJjZS52b2x0YWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IGBEQyAke3NpbVNvdXJjZS52b2x0YWdlfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICAgIHZvbHRhZ2VTb3VyY2VDbWQsXG4gICAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICAgIClcbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEQyBTb3VyY2UgKGlzX2RjX3NvdXJjZSBpcyB0cnVlIG9yIHVuZGVmaW5lZClcbiAgICAgIGNvbnN0IHBvc2l0aXZlUG9ydElkID0gc2ltU291cmNlLnBvc2l0aXZlX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwidm9sdGFnZVwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBzaW1Tb3VyY2Uudm9sdGFnZSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlfWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgdm9sdGFnZVNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBDdXJyZW50U291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXVsYXRpb25DdXJyZW50U291cmNlcyA9IChcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uQ3VycmVudFNvdXJjZXM6IEFueUNpcmN1aXRFbGVtZW50W10sXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pID0+IHtcbiAgZm9yIChjb25zdCBzaW1Tb3VyY2Ugb2Ygc2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzKSB7XG4gICAgaWYgKHNpbVNvdXJjZS50eXBlICE9PSBcInNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VcIikgY29udGludWVcblxuICAgIGlmIChzaW1Tb3VyY2UuaXNfZGNfc291cmNlID09PSBmYWxzZSkge1xuICAgICAgLy8gQUMvUFVMU0UgU291cmNlXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IG5lZ2F0aXZlUG9ydElkID0gc2ltU291cmNlLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAocG9zaXRpdmVQb3J0SWQgJiYgbmVnYXRpdmVQb3J0SWQpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGxldCB2YWx1ZSA9IFwiXCJcbiAgICAgICAgY29uc3Qgd2F2ZV9zaGFwZSA9IHNpbVNvdXJjZS53YXZlX3NoYXBlXG4gICAgICAgIGlmICh3YXZlX3NoYXBlID09PSBcInNpbmV3YXZlXCIpIHtcbiAgICAgICAgICBjb25zdCBpX29mZnNldCA9IDAgLy8gbm90IHByb3ZpZGVkXG4gICAgICAgICAgY29uc3QgaV9wZWFrID0gKHNpbVNvdXJjZS5wZWFrX3RvX3BlYWtfY3VycmVudCA/PyAwKSAvIDJcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgZGFtcGluZ19mYWN0b3IgPSAwXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7aV9vZmZzZXR9ICR7aV9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtpX3BlYWt9YFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXZlX3NoYXBlID09PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgY29uc3QgaV9pbml0aWFsID0gMFxuICAgICAgICAgIGNvbnN0IGlfcHVsc2VkID0gc2ltU291cmNlLnBlYWtfdG9fcGVha19jdXJyZW50ID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgcGVyaW9kID0gcGVyaW9kX2Zyb21fZnJlcVxuICAgICAgICAgIGNvbnN0IGR1dHlfY3ljbGUgPSBzaW1Tb3VyY2UuZHV0eV9jeWNsZSA/PyAwLjVcbiAgICAgICAgICBjb25zdCBwdWxzZV93aWR0aCA9IHBlcmlvZCAqIGR1dHlfY3ljbGVcbiAgICAgICAgICBjb25zdCBkZWxheSA9IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICBjb25zdCBmYWxsX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICB2YWx1ZSA9IGBQVUxTRSgke2lfaW5pdGlhbH0gJHtpX3B1bHNlZH0gJHtkZWxheX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlX3dpZHRofSAke3BlcmlvZH0pYFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUNtZCA9IG5ldyBDdXJyZW50U291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlX2lkLFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZUNtZCxcbiAgICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgICAgKVxuICAgICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERDIFNvdXJjZVxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UucG9zaXRpdmVfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IG5lZ2F0aXZlUG9ydElkID0gc2ltU291cmNlLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkXG5cbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpdmVQb3J0SWQgJiZcbiAgICAgICAgbmVnYXRpdmVQb3J0SWQgJiZcbiAgICAgICAgXCJjdXJyZW50XCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIHNpbVNvdXJjZS5jdXJyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2RlTWFwLmdldChwb3NpdGl2ZVBvcnRJZCkgfHwgXCIwXCJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZU1hcC5nZXQobmVnYXRpdmVQb3J0SWQpIHx8IFwiMFwiXG5cbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUNtZCA9IG5ldyBDdXJyZW50U291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICB2YWx1ZTogYERDICR7c2ltU291cmNlLmN1cnJlbnR9YCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICBjdXJyZW50U291cmNlQ21kLFxuICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgIClcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBTaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZSxcbiAgU291cmNlVHJhY2UsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IGZvcm1hdE51bWJlckZvclNwaWNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvbkV4cGVyaW1lbnQgPSAoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltRXhwZXJpbWVudDogU2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gIHNpbXVsYXRpb25Qcm9iZXM6IFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXSxcbiAgc291cmNlVHJhY2VzOiBTb3VyY2VUcmFjZVtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGlmICghc2ltRXhwZXJpbWVudCkgcmV0dXJuXG5cbiAgLy8gUHJvY2VzcyBzaW11bGF0aW9uIHZvbHRhZ2UgcHJvYmVzXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2Rlc1RvUHJvYmUgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgY29uc3QgZ2V0UG9ydElkRnJvbU5ldElkID0gKG5ldElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKG5ldElkKSxcbiAgICAgIClcbiAgICAgIHJldHVybiB0cmFjZT8uY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgbGV0IHNpZ25hbFBvcnRJZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgaWYgKCFzaWduYWxQb3J0SWQpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsTmV0SWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuICAgICAgICBpZiAoc2lnbmFsTmV0SWQpIHtcbiAgICAgICAgICBzaWduYWxQb3J0SWQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoc2lnbmFsTmV0SWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzaWduYWxQb3J0SWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHNpZ25hbE5vZGVOYW1lID0gbm9kZU1hcC5nZXQoc2lnbmFsUG9ydElkKVxuICAgICAgaWYgKCFzaWduYWxOb2RlTmFtZSkgY29udGludWVcblxuICAgICAgbGV0IHJlZmVyZW5jZVBvcnRJZCA9IHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgaWYgKCFyZWZlcmVuY2VQb3J0SWQgJiYgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWQpIHtcbiAgICAgICAgcmVmZXJlbmNlUG9ydElkID0gZ2V0UG9ydElkRnJvbU5ldElkKFxuICAgICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChyZWZlcmVuY2VQb3J0SWQpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZU5hbWUgPSBub2RlTWFwLmdldChyZWZlcmVuY2VQb3J0SWQpXG4gICAgICAgIGlmIChyZWZlcmVuY2VOb2RlTmFtZSAmJiByZWZlcmVuY2VOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKGBWKCR7c2lnbmFsTm9kZU5hbWV9LCR7cmVmZXJlbmNlTm9kZU5hbWV9KWApXG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChgVigke3NpZ25hbE5vZGVOYW1lfSlgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5nbGUtZW5kZWQgcHJvYmVcbiAgICAgICAgaWYgKHNpZ25hbE5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoYFYoJHtzaWduYWxOb2RlTmFtZX0pYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG5vZGVzVG9Qcm9iZS5zaXplID4gMCAmJlxuICAgICAgc2ltRXhwZXJpbWVudC5leHBlcmltZW50X3R5cGU/LmluY2x1ZGVzKFwidHJhbnNpZW50XCIpXG4gICAgKSB7XG4gICAgICBuZXRsaXN0LnByaW50U3RhdGVtZW50cy5wdXNoKGAuUFJJTlQgVFJBTiAke1suLi5ub2Rlc1RvUHJvYmVdLmpvaW4oXCIgXCIpfWApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGltZVBlclN0ZXAgPSBzaW1FeHBlcmltZW50LnRpbWVfcGVyX3N0ZXBcbiAgY29uc3QgZW5kVGltZSA9IHNpbUV4cGVyaW1lbnQuZW5kX3RpbWVfbXNcbiAgY29uc3Qgc3RhcnRUaW1lTXMgPSBzaW1FeHBlcmltZW50LnN0YXJ0X3RpbWVfbXNcblxuICBpZiAodGltZVBlclN0ZXAgJiYgZW5kVGltZSkge1xuICAgIC8vIGNpcmN1aXQtanNvbiB2YWx1ZXMgYXJlIGluIG1zLCBTUElDRSByZXF1aXJlcyBzZWNvbmRzXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gKHN0YXJ0VGltZU1zID8/IDApIC8gMTAwMFxuXG4gICAgbGV0IHRyYW5DbWQgPSBgLnRyYW4gJHtmb3JtYXROdW1iZXJGb3JTcGljZShcbiAgICAgIHRpbWVQZXJTdGVwIC8gMTAwMCxcbiAgICApfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGVuZFRpbWUgLyAxMDAwKX1gXG4gICAgaWYgKHN0YXJ0VGltZSA+IDApIHtcbiAgICAgIHRyYW5DbWQgKz0gYCAke2Zvcm1hdE51bWJlckZvclNwaWNlKHN0YXJ0VGltZSl9YFxuICAgIH1cbiAgICB0cmFuQ21kICs9IFwiIFVJQ1wiXG4gICAgbmV0bGlzdC50cmFuQ29tbWFuZCA9IHRyYW5DbWRcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltdWxhdGlvbk9wQW1wIH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3ViY2lyY3VpdENhbGxDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5cbmNvbnN0IE9QQU1QX1NVQkNJUkNVSVRfTkFNRSA9IFwiR0VORVJJQ19PUEFNUFwiXG5jb25zdCBPUEFNUF9TVUJDSVJDVUlUX0RFRklOSVRJT04gPSBgXG4uU1VCQ0tUICR7T1BBTVBfU1VCQ0lSQ1VJVF9OQU1FfSBub25faW52ZXJ0aW5nX2lucHV0IGludmVydGluZ19pbnB1dCBwb3NpdGl2ZV9zdXBwbHkgbmVnYXRpdmVfc3VwcGx5IG91dHB1dFxuKiBHZW5lcmljIE9wLUFtcCBNb2RlbFxuRTEgaW50ZXJuYWxfb3V0cHV0IDAgbm9uX2ludmVydGluZ19pbnB1dCBpbnZlcnRpbmdfaW5wdXQgMTAwa1xuUmluIG5vbl9pbnZlcnRpbmdfaW5wdXQgaW52ZXJ0aW5nX2lucHV0IDEwTWVnXG5Sb3V0IGludGVybmFsX291dHB1dCBvdXRwdXQgNzVcbkQxIG91dHB1dCBwb3NpdGl2ZV9zdXBwbHkgb3BhbXBfZGlvZGVcbkQyIG5lZ2F0aXZlX3N1cHBseSBvdXRwdXQgb3BhbXBfZGlvZGVcbi5tb2RlbCBvcGFtcF9kaW9kZSBEXG4uRU5EUyAke09QQU1QX1NVQkNJUkNVSVRfTkFNRX1cbmAudHJpbSgpXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvbk9wQW1wcyA9IChcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uT3BBbXBzOiBTaW11bGF0aW9uT3BBbXBbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBpZiAoc2ltdWxhdGlvbk9wQW1wcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKE9QQU1QX1NVQkNJUkNVSVRfTkFNRSkpIHtcbiAgICBuZXRsaXN0Lm1vZGVscy5zZXQoT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FLCBPUEFNUF9TVUJDSVJDVUlUX0RFRklOSVRJT04pXG4gIH1cblxuICBmb3IgKGNvbnN0IHNpbU9wQW1wIG9mIHNpbXVsYXRpb25PcEFtcHMpIHtcbiAgICBpZiAoc2ltT3BBbXAudHlwZSAhPT0gXCJzaW11bGF0aW9uX29wX2FtcFwiKSBjb250aW51ZVxuXG4gICAgY29uc3Qgbm9uSW52ZXJ0aW5nSW5wdXROb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLm5vbl9pbnZlcnRpbmdfaW5wdXRfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3QgaW52ZXJ0aW5nSW5wdXROb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLmludmVydGluZ19pbnB1dF9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBvdXRwdXROb2RlID0gbm9kZU1hcC5nZXQoc2ltT3BBbXAub3V0cHV0X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IHBvc2l0aXZlU3VwcGx5Tm9kZSA9XG4gICAgICBub2RlTWFwLmdldChzaW1PcEFtcC5wb3NpdGl2ZV9zdXBwbHlfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3QgbmVnYXRpdmVTdXBwbHlOb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLm5lZ2F0aXZlX3N1cHBseV9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcblxuICAgIGNvbnN0IG5vZGVzID0gW1xuICAgICAgbm9uSW52ZXJ0aW5nSW5wdXROb2RlLFxuICAgICAgaW52ZXJ0aW5nSW5wdXROb2RlLFxuICAgICAgcG9zaXRpdmVTdXBwbHlOb2RlLFxuICAgICAgbmVnYXRpdmVTdXBwbHlOb2RlLFxuICAgICAgb3V0cHV0Tm9kZSxcbiAgICBdXG5cbiAgICBjb25zdCBvcEFtcENtZCA9IG5ldyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQoe1xuICAgICAgbmFtZTogc2ltT3BBbXAuc2ltdWxhdGlvbl9vcF9hbXBfaWQsXG4gICAgICBub2RlcyxcbiAgICAgIHN1YmNpcmN1aXROYW1lOiBPUEFNUF9TVUJDSVJDVUlUX05BTUUsXG4gICAgfSlcblxuICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgc2ltT3BBbXAuc2ltdWxhdGlvbl9vcF9hbXBfaWQsXG4gICAgICBvcEFtcENtZCxcbiAgICAgIG5vZGVzLFxuICAgIClcbiAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFN1YmNpcmN1aXRDYWxsQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTcGljZVN1YmNrdChcbiAgc291cmNlOiBzdHJpbmcsXG4pOiB7IG1vZGVsTmFtZTogc3RyaW5nOyBwaW5OYW1lczogc3RyaW5nW10gfSB8IG51bGwge1xuICBjb25zdCBsaW5lID0gc291cmNlXG4gICAgLnNwbGl0KC9cXHI/XFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAuZmluZCgobGluZSkgPT4gL15cXC5zdWJja3RcXHMrL2kudGVzdChsaW5lKSlcblxuICBpZiAoIWxpbmUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgdG9rZW5zID0gbGluZS5zcGxpdCgvXFxzKy8pXG4gIGNvbnN0IG1vZGVsTmFtZSA9IHRva2Vuc1sxXVxuICBjb25zdCBwaW5OYW1lcyA9IHRva2Vucy5zbGljZSgyKVxuXG4gIGlmICghbW9kZWxOYW1lIHx8IHBpbk5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHsgbW9kZWxOYW1lLCBwaW5OYW1lcyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHM6IFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikge1xuICBpZiAoc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBmb3IgKGNvbnN0IHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQgb2Ygc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMpIHtcbiAgICBjb25zdCBwYXJzZWRTdWJja3QgPSBwYXJzZVNwaWNlU3ViY2t0KFxuICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zdWJjaXJjdWl0X3NvdXJjZSxcbiAgICApXG5cbiAgICBpZiAoIXBhcnNlZFN1YmNrdCkgY29udGludWVcblxuICAgIGNvbnN0IHsgbW9kZWxOYW1lLCBwaW5OYW1lcyB9ID0gcGFyc2VkU3ViY2t0XG5cbiAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICBuZXRsaXN0Lm1vZGVscy5zZXQobW9kZWxOYW1lLCBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnN1YmNpcmN1aXRfc291cmNlKVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gcGluTmFtZXMubWFwKChzcGljZVBpbk5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBvcnRJZCA9XG4gICAgICAgIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc3BpY2VfcGluX3RvX3NvdXJjZV9wb3J0X21hcFtzcGljZVBpbk5hbWVdXG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQoc291cmNlUG9ydElkKSA/PyBcIjBcIlxuICAgIH0pXG5cbiAgICBjb25zdCBzdWJjaXJjdWl0Q2FsbENvbW1hbmQgPSBuZXcgU3ViY2lyY3VpdENhbGxDb21tYW5kKHtcbiAgICAgIG5hbWU6IHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc2ltdWxhdGlvbl9zcGljZV9zdWJjaXJjdWl0X2lkLFxuICAgICAgbm9kZXMsXG4gICAgICBzdWJjaXJjdWl0TmFtZTogbW9kZWxOYW1lLFxuICAgIH0pXG5cbiAgICBuZXRsaXN0LmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICAgIHN1YmNpcmN1aXRDYWxsQ29tbWFuZCxcbiAgICAgICAgbm9kZXMsXG4gICAgICApLFxuICAgIClcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBTcGljZVN1YmNpcmN1aXQge1xuICBuYW1lOiBzdHJpbmdcbiAgcGluczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHBpbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMucGlucyA9IHBpbnNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwaW5TdHJpbmcgPSB0aGlzLnBpbnMuam9pbihcIiBcIilcbiAgICBjb25zdCBoZWFkZXIgPSBgLlNVQkNLVCAke3RoaXMubmFtZX0gJHtwaW5TdHJpbmd9YFxuICAgIGNvbnN0IGZvb3RlciA9IGAuRU5EUyAke3RoaXMubmFtZX1gXG5cbiAgICBjb25zdCBib2R5ID0gYCogUGxhY2Vob2xkZXIgZm9yICR7dGhpcy5uYW1lfS4gTm8gZGVmaW5pdGlvbiBmb3VuZCBpbiBjaXJjdWl0IEpTT04uYFxuXG4gICAgcmV0dXJuIFtcIlwiLCBoZWFkZXIsIGJvZHksIGZvb3Rlcl0uam9pbihcIlxcblwiKVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sSUFBTSw4QkFBOEIsQ0FBQyxZQUFrQztBQUM1RSxRQUFNLFFBQWtCLENBQUM7QUFHekIsUUFBTSxLQUFLLFFBQVEsS0FBSztBQUd4QixNQUFJLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFDM0IsVUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ25EO0FBR0EsYUFBVyxhQUFhLFFBQVEsWUFBWTtBQUMxQyxVQUFNLEtBQUssVUFBVSxjQUFjLENBQUM7QUFBQSxFQUN0QztBQUdBLGFBQVcsY0FBYyxRQUFRLGFBQWE7QUFDNUMsVUFBTSxLQUFLLFdBQVcsY0FBYyxDQUFDO0FBQUEsRUFDdkM7QUFFQSxNQUFJLFFBQVEsZ0JBQWdCLFNBQVMsR0FBRztBQUN0QyxVQUFNLEtBQUssR0FBRyxRQUFRLGVBQWU7QUFBQSxFQUN2QztBQUdBLE1BQUksUUFBUSxTQUFTLFNBQVMsR0FBRztBQUMvQixVQUFNLEtBQUssVUFBVTtBQUNyQixVQUFNLEtBQUssR0FBRyxRQUFRLFFBQVE7QUFDOUIsVUFBTSxLQUFLLE9BQU87QUFBQSxFQUNwQjtBQUVBLE1BQ0UsUUFBUSxlQUNSLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxPQUFPLENBQUMsR0FDN0Q7QUFDQSxVQUFNLEtBQUssUUFBUSxXQUFXO0FBQUEsRUFDaEM7QUFHQSxRQUFNLEtBQUssTUFBTTtBQUVqQixTQUFPLE1BQU0sS0FBSyxJQUFJO0FBQ3hCOzs7QUN6Q08sSUFBTSxlQUFOLE1BQW1CO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
1373
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQkpUQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ3VycmVudFNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvU3ViY2lyY3VpdENhbGxDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9UcmFuc21pc3Npb25MaW5lQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9oZWxwZXJzLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3IudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvc2ltcGxlLWRpb2RlLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0LnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS10cmFuc2lzdG9yLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi12b2x0YWdlLXNvdXJjZXMudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWN1cnJlbnQtc291cmNlcy50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tb3AtYW1wLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0cy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3Qub3B0aW9uU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMpXG4gIH1cblxuICBpZiAobmV0bGlzdC5tZXRhZGF0YUNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QubWV0YWRhdGFDb21tZW50cylcbiAgfVxuXG4gIC8vIEFkZCBzdWJjaXJjdWl0IGRlZmluaXRpb25zXG4gIGZvciAoY29uc3Qgc3ViY2lyY3VpdCBvZiBuZXRsaXN0LnN1YmNpcmN1aXRzKSB7XG4gICAgbGluZXMucHVzaChzdWJjaXJjdWl0LnRvU3BpY2VTdHJpbmcoKSlcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnByaW50U3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LnByaW50U3RhdGVtZW50cylcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3Quc2F2ZVN0YXRlbWVudHMpXG4gIH1cblxuICAvLyBBZGQgY29udHJvbCBibG9jayBpZiBwcmVzZW50XG4gIGlmIChuZXRsaXN0LmNvbnRyb2xzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKFwiLmNvbnRyb2xcIilcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QuY29udHJvbHMpXG4gICAgbGluZXMucHVzaChcIi5lbmRjXCIpXG4gIH1cblxuICBpZiAoXG4gICAgbmV0bGlzdC50cmFuQ29tbWFuZCAmJlxuICAgICFsaW5lcy5zb21lKChsKSA9PiBsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCIudHJhblwiKSlcbiAgKSB7XG4gICAgbGluZXMucHVzaChuZXRsaXN0LnRyYW5Db21tYW5kKVxuICB9XG5cbiAgLy8gRW5kIHdpdGggLkVORFxuICBsaW5lcy5wdXNoKFwiLkVORFwiKVxuXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpXG59XG4iLCAiaW1wb3J0IHsgY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nIH0gZnJvbSBcIi4uL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZ1wiXG5pbXBvcnQgdHlwZSB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZVN1YmNpcmN1aXQgfSBmcm9tIFwiLi9TcGljZVN1YmNpcmN1aXRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VOZXRsaXN0IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBjb21wb25lbnRzOiBTcGljZUNvbXBvbmVudFtdXG4gIG5vZGVzOiBTZXQ8c3RyaW5nPlxuICBjb250cm9sczogc3RyaW5nW11cbiAgc3ViY2lyY3VpdHM6IFNwaWNlU3ViY2lyY3VpdFtdXG4gIG1vZGVsczogTWFwPHN0cmluZywgc3RyaW5nPlxuICBvcHRpb25TdGF0ZW1lbnRzOiBzdHJpbmdbXVxuICBtZXRhZGF0YUNvbW1lbnRzOiBzdHJpbmdbXVxuICB0cmFuQ29tbWFuZDogc3RyaW5nIHwgbnVsbFxuICBwcmludFN0YXRlbWVudHM6IHN0cmluZ1tdXG4gIHNhdmVTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5vcHRpb25TdGF0ZW1lbnRzID0gW11cbiAgICB0aGlzLm1ldGFkYXRhQ29tbWVudHMgPSBbXVxuICAgIHRoaXMudHJhbkNvbW1hbmQgPSBudWxsXG4gICAgdGhpcy5wcmludFN0YXRlbWVudHMgPSBbXVxuICAgIHRoaXMuc2F2ZVN0YXRlbWVudHMgPSBbXVxuICB9XG5cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogU3BpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgLy8gQWRkIG5vZGVzIHRvIHRoZSBzZXRcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY29tcG9uZW50Lm5vZGVzKSB7XG4gICAgICB0aGlzLm5vZGVzLmFkZChub2RlKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN1YmNpcmN1aXQoc3ViY2lyY3VpdDogU3BpY2VTdWJjaXJjdWl0KSB7XG4gICAgaWYgKHRoaXMuc3ViY2lyY3VpdHMuZmluZCgocykgPT4gcy5uYW1lID09PSBzdWJjaXJjdWl0Lm5hbWUpKSByZXR1cm5cbiAgICB0aGlzLnN1YmNpcmN1aXRzLnB1c2goc3ViY2lyY3VpdClcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyh0aGlzKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4uL3NwaWNlLWNvbW1hbmRzL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VDb21wb25lbnQge1xuICBuYW1lOiBzdHJpbmdcbiAgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZFxuICBub2Rlczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IEJhc2VTcGljZUNvbW1hbmQsIG5vZGVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZC50b1NwaWNlU3RyaW5nKClcbiAgfVxufVxuIiwgImltcG9ydCB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7XG4gIEFueUNpcmN1aXRFbGVtZW50LFxuICBTaW11bGF0aW9uT3BBbXAsXG4gIFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQsXG4gIFNpbXVsYXRpb25Td2l0Y2gsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG4gIFNvdXJjZVNpbXBsZU1vc2ZldCxcbiAgU291cmNlU2ltcGxlU3dpdGNoLFxuICBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24gfSBmcm9tIFwiY2lyY3VpdC1qc29uLXRvLWNvbm5lY3Rpdml0eS1tYXBcIlxuaW1wb3J0IHsgc3UgfSBmcm9tIFwiQHRzY2lyY3VpdC9jaXJjdWl0LWpzb24tdXRpbFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlUmVzaXN0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlU3dpdGNoIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZURpb2RlLCBwcm9jZXNzU2ltcGxlTGVkIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtZGlvZGVcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZUluZHVjdG9yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtaW5kdWN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZU1vc2ZldCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLW1vc2ZldFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlVHJhbnNpc3RvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLXRyYW5zaXN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25Wb2x0YWdlU291cmNlcyB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLXZvbHRhZ2Utc291cmNlc1wiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tY3VycmVudC1zb3VyY2VzXCJcbmltcG9ydCB7IHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWV4cGVyaW1lbnRcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1vcC1hbXBcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tc3BpY2Utc3ViY2lyY3VpdHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uU3dpdGNoZXMgPSBjaXJjdWl0SnNvblxuICAgIC5maWx0ZXIoXG4gICAgICAoZWxlbWVudCkgPT4gKGVsZW1lbnQgYXMgeyB0eXBlPzogc3RyaW5nIH0pLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zd2l0Y2hcIixcbiAgICApXG4gICAgLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudCBhcyB1bmtub3duIGFzIFNpbXVsYXRpb25Td2l0Y2gpXG4gIGNvbnN0IHNpbXVsYXRpb25PcEFtcHMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9vcF9hbXBcIixcbiAgKSBhcyBTaW11bGF0aW9uT3BBbXBbXVxuICBjb25zdCBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRcIixcbiAgKSBhcyBTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0W11cbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTaW11bGF0aW9uU3dpdGNoPigpXG5cbiAgZm9yIChjb25zdCBzaW1Td2l0Y2ggb2Ygc2ltdWxhdGlvblN3aXRjaGVzKSB7XG4gICAgaWYgKHNpbVN3aXRjaC5zb3VyY2VfY29tcG9uZW50X2lkKSB7XG4gICAgICBzaW11bGF0aW9uU3dpdGNoTWFwLnNldChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCwgc2ltU3dpdGNoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbm5NYXAgPSBnZXRTb3VyY2VQb3J0Q29ubmVjdGl2aXR5TWFwRnJvbUNpcmN1aXRKc29uKGNpcmN1aXRKc29uKVxuXG4gIC8vIENyZWF0ZSBub2RlIG1hcHBpbmcgZnJvbSBwb3J0IGNvbm5lY3Rpb25zXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGNvbnN0IG5ldFRvTm9kZU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGxldCBub2RlQ291bnRlciA9IDFcblxuICBjb25zdCBwcm9iZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgaWYgKHByb2JlLm5hbWUpIHtcbiAgICAgICAgcHJvYmVOYW1lcy5hZGQocHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgcHJvYmUgbmFtZXMgbGlrZSBOMSwgTjIsIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGNvbmZsaWN0c1xuICBjb25zdCBudW1lcmljUHJvYmVOYW1lcyA9IFsuLi5wcm9iZU5hbWVzXVxuICAgIC5tYXAoKG5hbWUpID0+IC9eTihcXGQrKSQvaS5leGVjKG5hbWUpKVxuICAgIC5maWx0ZXIoKG0pOiBtIGlzIFJlZ0V4cEV4ZWNBcnJheSA9PiBtICE9PSBudWxsKVxuICAgIC5tYXAoKG0pID0+IHBhcnNlSW50KG1bMV0sIDEwKSlcblxuICBpZiAobnVtZXJpY1Byb2JlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIG5vZGVDb3VudGVyID0gTWF0aC5tYXgoLi4ubnVtZXJpY1Byb2JlTmFtZXMpICsgMVxuICB9XG5cbiAgY29uc3QgZ3JvdW5kTmV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgLy8gRmluZCBncm91bmQgZnJvbSBzb3VyY2UgbmV0cyB0aGF0IGluY2x1ZGUgXCJnbmRcIiBpbiB0aGUgbmFtZVxuICBjb25zdCBnbmRTb3VyY2VOZXRJZHMgPSBuZXcgU2V0KFxuICAgIHN1KGNpcmN1aXRKc29uKVxuICAgICAgLnNvdXJjZV9uZXQubGlzdCgpXG4gICAgICAuZmlsdGVyKChzbikgPT4gc24ubmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImduZFwiKSlcbiAgICAgIC5tYXAoKHNuKSA9PiBzbi5zb3VyY2VfbmV0X2lkKSxcbiAgKVxuXG4gIGlmIChnbmRTb3VyY2VOZXRJZHMuc2l6ZSA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfdHJhY2UubGlzdCgpKSB7XG4gICAgICBpZiAodHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzT25HbmROZXQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuc29tZSgobmV0SWQpID0+XG4gICAgICAgICAgZ25kU291cmNlTmV0SWRzLmhhcyhuZXRJZCksXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzT25HbmROZXQpIHtcbiAgICAgICAgICBjb25zdCBhUG9ydE9uR25kID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgICAgIGNvbnN0IGduZE5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChhUG9ydE9uR25kKVxuICAgICAgICAgIGlmIChnbmROZXQpIHtcbiAgICAgICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZE5ldClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaW5kIGdyb3VuZCBub2RlIGZyb20gcG9ydHMgbmFtZWQgXCJHTkRcIlxuICBjb25zdCBncm91bmRQb3J0cyA9IHNvdXJjZVBvcnRzLmZpbHRlcigocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImduZFwiKVxuICBmb3IgKGNvbnN0IGdyb3VuZFBvcnQgb2YgZ3JvdW5kUG9ydHMpIHtcbiAgICBjb25zdCBncm91bmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoZ3JvdW5kUG9ydC5zb3VyY2VfcG9ydF9pZClcbiAgICBpZiAoZ3JvdW5kTmV0KSB7XG4gICAgICBncm91bmROZXRzLmFkZChncm91bmROZXQpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBzaW1Tb3VyY2Ugb2Ygc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpKSB7XG4gICAgY29uc3QgbmVnX3BvcnRfaWQgPVxuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkID8/XG4gICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgaWYgKG5lZ19wb3J0X2lkKSB7XG4gICAgICBjb25zdCBnbmRfbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKG5lZ19wb3J0X2lkKVxuICAgICAgaWYgKGduZF9uZXQpIHtcbiAgICAgICAgZ3JvdW5kTmV0cy5hZGQoZ25kX25ldClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGdyb3VuZE5ldCBvZiBncm91bmROZXRzKSB7XG4gICAgbmV0VG9Ob2RlTmFtZS5zZXQoZ3JvdW5kTmV0LCBcIjBcIilcbiAgfVxuXG4gIC8vIFByZS1hc3NpZ24gbm9kZSBuYW1lcyBmcm9tIHZvbHRhZ2UgcHJvYmVzXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmICghcHJvYmUubmFtZSkgY29udGludWVcblxuICAgICAgaWYgKFxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWQgfHxcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgbmV0OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG4gICAgICBjb25zdCBzaWduYWxfcG9ydF9pZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3Qgc2lnbmFsX25ldF9pZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfbmV0X2lkXG5cbiAgICAgIGlmIChzaWduYWxfcG9ydF9pZCkge1xuICAgICAgICBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoc2lnbmFsX3BvcnRfaWQpXG4gICAgICB9IGVsc2UgaWYgKHNpZ25hbF9uZXRfaWQpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSBzb3VyY2VUcmFjZXMuZmluZCgodCkgPT5cbiAgICAgICAgICB0LmNvbm5lY3RlZF9zb3VyY2VfbmV0X2lkcy5pbmNsdWRlcyhzaWduYWxfbmV0X2lkISksXG4gICAgICAgIClcbiAgICAgICAgaWYgKHRyYWNlICYmIHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBvcnRJZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQocG9ydElkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXQpIHtcbiAgICAgICAgaWYgKCFuZXRUb05vZGVOYW1lLmhhcyhuZXQpKSB7XG4gICAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBwcm9iZS5uYW1lKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNpZ25hbF9wb3J0X2lkICYmIHByb2JlLm5hbWUpIHtcbiAgICAgICAgLy8gSXQncyBhIGZsb2F0aW5nIHBvcnQgd2l0aCBhIHByb2JlLCBzbyB3ZSBtYXAgaXQgZGlyZWN0bHkuIFRoaXMgcG9ydFxuICAgICAgICAvLyB3aWxsIG5vdyBiZSBza2lwcGVkIGluIHRoZSBzZWNvbmQtcGFzcyBmb3IgdW5jb25uZWN0ZWQgcG9ydHMuXG4gICAgICAgIG5vZGVNYXAuc2V0KHNpZ25hbF9wb3J0X2lkLCBwcm9iZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IHBhc3M6IGFzc2lnbiBub2RlIG51bWJlcnMgdG8gYWxsIGNvbm5lY3RlZCBuZXRzXG4gIGZvciAoY29uc3QgcG9ydCBvZiBzb3VyY2VQb3J0cykge1xuICAgIGNvbnN0IHBvcnRJZCA9IHBvcnQuc291cmNlX3BvcnRfaWRcbiAgICBjb25zdCBuZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQocG9ydElkKVxuICAgIGlmIChuZXQpIHtcbiAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICBuZXRUb05vZGVOYW1lLnNldChuZXQsIGBOJHtub2RlQ291bnRlcisrfWApXG4gICAgICB9XG4gICAgICBub2RlTWFwLnNldChwb3J0SWQsIG5ldFRvTm9kZU5hbWUuZ2V0KG5ldCkhKVxuICAgIH1cbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIHVuY29ubmVjdGVkIHBvcnRzXG4gIGZvciAoY29uc3QgcG9ydCBvZiBzb3VyY2VQb3J0cykge1xuICAgIGNvbnN0IHBvcnRJZCA9IHBvcnQuc291cmNlX3BvcnRfaWRcbiAgICAvLyBJZiBhIHBvcnQgd2Fzbid0IGluIGEgbmV0LCBpdCB3b24ndCBiZSBpbiB0aGUgbm9kZU1hcCB5ZXRcbiAgICBpZiAoIW5vZGVNYXAuaGFzKHBvcnRJZCkpIHtcbiAgICAgIC8vIFVuY29ubmVjdGVkIHBvcnQsIGNyZWF0ZSBhIG5ldyBmbG9hdGluZyBub2RlIGZvciBpdFxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3MgZWFjaCBjb21wb25lbnRcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc291cmNlQ29tcG9uZW50cykge1xuICAgIGlmIChjb21wb25lbnQudHlwZSAhPT0gXCJzb3VyY2VfY29tcG9uZW50XCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBjb21wb25lbnRQb3J0cyA9IHN1KGNpcmN1aXRKc29uKVxuICAgICAgLnNvdXJjZV9wb3J0Lmxpc3Qoe1xuICAgICAgICBzb3VyY2VfY29tcG9uZW50X2lkOiBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEucGluX251bWJlciA/PyAwKSAtIChiLnBpbl9udW1iZXIgPz8gMCkpXG5cbiAgICAvLyBHZXQgbm9kZSBuYW1lcyBmb3IgY29tcG9uZW50IHBvcnRzXG4gICAgY29uc3Qgbm9kZXMgPSBjb21wb25lbnRQb3J0cy5tYXAoKHBvcnQpID0+IHtcbiAgICAgIHJldHVybiBub2RlTWFwLmdldChwb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgU1BJQ0UgY29tcG9uZW50IGJhc2VkIG9uIHR5cGVcbiAgICBpZiAoXCJmdHlwZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgbGV0IHNwaWNlQ29tcG9uZW50OiBTcGljZUNvbXBvbmVudCB8IG51bGwgPSBudWxsXG5cbiAgICAgIHN3aXRjaCAoKGNvbXBvbmVudCBhcyB7IGZ0eXBlOiBzdHJpbmcgfSkuZnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInNpbXBsZV9yZXNpc3RvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlUmVzaXN0b3IoeyBjb21wb25lbnQsIG5vZGVzIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3N3aXRjaFwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlU3dpdGNoKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVTd2l0Y2gsXG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIHNpbXVsYXRpb25Td2l0Y2hNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfY2FwYWNpdG9yXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IoeyBjb21wb25lbnQsIG5vZGVzIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2Rpb2RlXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVEaW9kZSh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlRGlvZGUsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfbGVkXCI6IHtcbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IHByb2Nlc3NTaW1wbGVMZWQoe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZUxlZCxcbiAgICAgICAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9pbmR1Y3RvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlSW5kdWN0b3IoeyBjb21wb25lbnQsIG5vZGVzIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX21vc2ZldFwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlTW9zZmV0KHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVNb3NmZXQsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfdHJhbnNpc3RvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlVHJhbnNpc3Rvcih7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlVHJhbnNpc3RvcixcbiAgICAgICAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNwaWNlQ29tcG9uZW50KSB7XG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMoXG4gICAgbmV0bGlzdCxcbiAgICBzdShjaXJjdWl0SnNvbikuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZS5saXN0KCksXG4gICAgbm9kZU1hcCxcbiAgKVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uQ3VycmVudFNvdXJjZXMoXG4gICAgbmV0bGlzdCxcbiAgICBzdShjaXJjdWl0SnNvbikuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZS5saXN0KCksXG4gICAgbm9kZU1hcCxcbiAgKVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uT3BBbXBzKG5ldGxpc3QsIHNpbXVsYXRpb25PcEFtcHMsIG5vZGVNYXApXG5cbiAgcHJvY2Vzc1NpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzKFxuICAgIG5ldGxpc3QsXG4gICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMsXG4gICAgbm9kZU1hcCxcbiAgKVxuXG4gIGNvbnN0IHNpbXVsYXRpb25FeHBlcmltZW50ID0gY2lyY3VpdEpzb24uZmluZChcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX2V4cGVyaW1lbnRcIixcbiAgKVxuICBpZiAoc2ltdWxhdGlvbkV4cGVyaW1lbnQpXG4gICAgcHJvY2Vzc1NpbXVsYXRpb25FeHBlcmltZW50KFxuICAgICAgbmV0bGlzdCxcbiAgICAgIHNpbXVsYXRpb25FeHBlcmltZW50LFxuICAgICAgc2ltdWxhdGlvblByb2JlcyxcbiAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgIG5vZGVNYXAsXG4gICAgKVxuXG4gIHJldHVybiBuZXRsaXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEN1cnJlbnRTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjdXJyZW50X3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEkke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlvZGVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBEaW9kZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImRpb2RlXCIgYXMgY29uc3RcbiAgcHJvcHM6IERpb2RlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IERpb2RlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgRCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgaW5pdGlhbENvbmRpdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJpbmR1Y3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSwgaW5pdGlhbENvbmRpdGlvbiB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHttb2RlbH1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGluZHVjdG9yczogc3RyaW5nW11cbiAgY291cGxpbmc6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yX2NvdXBsaW5nXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgaW5kdWN0b3JzLCBjb3VwbGluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgSyR7bmFtZX0gJHtpbmR1Y3RvcnMuam9pbihcIiBcIil9ICR7Y291cGxpbmd9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSkZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEpGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJqZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEpGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSkZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgZHJhaW4sIGdhdGUsIHNvdXJjZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSiR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBNT1NGRVRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgZHJhaW46IHN0cmluZ1xuICBnYXRlOiBzdHJpbmdcbiAgc291cmNlOiBzdHJpbmdcbiAgc3Vic3RyYXRlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBsZW5ndGg/OiBzdHJpbmdcbiAgd2lkdGg/OiBzdHJpbmdcbiAgZHJhaW5BcmVhPzogc3RyaW5nXG4gIHNvdXJjZUFyZWE/OiBzdHJpbmdcbiAgZHJhaW5QZXJpbWV0ZXI/OiBzdHJpbmdcbiAgc291cmNlUGVyaW1ldGVyPzogc3RyaW5nXG4gIGRyYWluUmVzaXN0YW5jZT86IHN0cmluZ1xuICBzb3VyY2VSZXNpc3RhbmNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBNT1NGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJtb3NmZXRcIiBhcyBjb25zdFxuICBwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBkcmFpbixcbiAgICAgIGdhdGUsXG4gICAgICBzb3VyY2UsXG4gICAgICBzdWJzdHJhdGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHdpZHRoLFxuICAgICAgZHJhaW5BcmVhLFxuICAgICAgc291cmNlQXJlYSxcbiAgICAgIGRyYWluUGVyaW1ldGVyLFxuICAgICAgc291cmNlUGVyaW1ldGVyLFxuICAgICAgZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgc291cmNlUmVzaXN0YW5jZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYE0ke25hbWV9ICR7ZHJhaW59ICR7Z2F0ZX0gJHtzb3VyY2V9ICR7c3Vic3RyYXRlfSAke21vZGVsfWBcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIEw6IGxlbmd0aCxcbiAgICAgIFc6IHdpZHRoLFxuICAgICAgQUQ6IGRyYWluQXJlYSxcbiAgICAgIEFTOiBzb3VyY2VBcmVhLFxuICAgICAgUEQ6IGRyYWluUGVyaW1ldGVyLFxuICAgICAgUFM6IHNvdXJjZVBlcmltZXRlcixcbiAgICAgIE5SRDogZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgTlJTOiBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzdWJjaXJjdWl0TmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInN1YmNpcmN1aXRfY2FsbFwiIGFzIGNvbnN0XG4gIHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgbm9kZXMsIHN1YmNpcmN1aXROYW1lIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBYJHtuYW1lfSAke25vZGVzLmpvaW4oXCIgXCIpfSAke3N1YmNpcmN1aXROYW1lfWBcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgYVBvc2l0aXZlOiBzdHJpbmdcbiAgYU5lZ2F0aXZlOiBzdHJpbmdcbiAgYlBvc2l0aXZlOiBzdHJpbmdcbiAgYk5lZ2F0aXZlOiBzdHJpbmdcbiAgaW1wZWRhbmNlOiBzdHJpbmdcbiAgZGVsYXk/OiBzdHJpbmdcbiAgZnJlcXVlbmN5Pzogc3RyaW5nXG4gIG5vcm1hbGl6ZWRMZW5ndGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ0cmFuc21pc3Npb25fbGluZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgYVBvc2l0aXZlLFxuICAgICAgYU5lZ2F0aXZlLFxuICAgICAgYlBvc2l0aXZlLFxuICAgICAgYk5lZ2F0aXZlLFxuICAgICAgaW1wZWRhbmNlLFxuICAgICAgZGVsYXksXG4gICAgICBmcmVxdWVuY3ksXG4gICAgICBub3JtYWxpemVkTGVuZ3RoLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFQke25hbWV9ICR7YVBvc2l0aXZlfSAke2FOZWdhdGl2ZX0gJHtiUG9zaXRpdmV9ICR7Yk5lZ2F0aXZlfSBaMD0ke2ltcGVkYW5jZX1gXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIFREPSR7ZGVsYXl9YFxuICAgIH0gZWxzZSBpZiAoZnJlcXVlbmN5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEY9JHtmcmVxdWVuY3l9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRMZW5ndGgpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCBOTD0ke25vcm1hbGl6ZWRMZW5ndGh9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHBvc2l0aXZlQ29udHJvbDogc3RyaW5nXG4gIG5lZ2F0aXZlQ29udHJvbDogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9jb250cm9sbGVkX3N3aXRjaFwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICBuZWdhdGl2ZUNvbnRyb2wsXG4gICAgICBtb2RlbCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgUyR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke3Bvc2l0aXZlQ29udHJvbH0gJHtuZWdhdGl2ZUNvbnRyb2x9ICR7bW9kZWx9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICBhY01hZ25pdHVkZT86IHN0cmluZ1xuICBhY1BoYXNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBWb2x0YWdlU291cmNlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9zb3VyY2VcIiBhcyBjb25zdFxuICBwcm9wczogVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgdmFsdWUsIGFjTWFnbml0dWRlLCBhY1BoYXNlIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBWJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICB9XG4gICAgaWYgKGFjTWFnbml0dWRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEFDICR7YWNNYWduaXR1ZGV9YFxuICAgICAgaWYgKGFjUGhhc2UpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FjUGhhc2V9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzaXN0YW5jZShyZXNpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmVzaXN0YW5jZSA+PSAxZTYpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWU2fU1FR2BcbiAgaWYgKHJlc2lzdGFuY2UgPj0gMWUzKSByZXR1cm4gYCR7cmVzaXN0YW5jZSAvIDFlM31LYFxuICByZXR1cm4gcmVzaXN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXBhY2l0YW5jZShjYXBhY2l0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTMpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlM31NYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU2fVVgXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTl9TmBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTEyKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTEyfVBgXG4gIHJldHVybiBjYXBhY2l0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRJbmR1Y3RhbmNlKGluZHVjdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmR1Y3RhbmNlID49IDEpIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTN9bWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTZ9dWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTl9bmBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUxMn1wYFxuICByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJlZml4OiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHByZWZpeFxuICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKVxuICBpZiAoIXNhbml0aXplZCkgcmV0dXJuIHByZWZpeFxuICBpZiAoL15bMC05XS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1fJHtzYW5pdGl6ZWR9YFxuICB9XG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgc2ltdWxhdGlvblN3aXRjaDogU2ltdWxhdGlvblN3aXRjaCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBoaWdoVm9sdGFnZSA9IDVcbiAgY29uc3QgbG93Vm9sdGFnZSA9IDBcbiAgY29uc3QgcmlzZVRpbWUgPSBcIjFuXCJcbiAgY29uc3QgZmFsbFRpbWUgPSBcIjFuXCJcblxuICBpZiAoIXNpbXVsYXRpb25Td2l0Y2gpIHtcbiAgICByZXR1cm4gYERDICR7bG93Vm9sdGFnZX1gXG4gIH1cblxuICBjb25zdCBzdGFydHNDbG9zZWQgPSBzaW11bGF0aW9uU3dpdGNoLnN0YXJ0c19jbG9zZWQgPz8gZmFsc2VcbiAgY29uc3QgY2xvc2VzQXQgPSBzaW11bGF0aW9uU3dpdGNoLmNsb3Nlc19hdCA/PyAwXG4gIGNvbnN0IG9wZW5zQXQgPSBzaW11bGF0aW9uU3dpdGNoLm9wZW5zX2F0XG4gIGNvbnN0IHN3aXRjaGluZ0ZyZXF1ZW5jeSA9IHNpbXVsYXRpb25Td2l0Y2guc3dpdGNoaW5nX2ZyZXF1ZW5jeVxuXG4gIGNvbnN0IFtpbml0aWFsVm9sdGFnZSwgcHVsc2VkVm9sdGFnZV0gPSBzdGFydHNDbG9zZWRcbiAgICA/IFtoaWdoVm9sdGFnZSwgbG93Vm9sdGFnZV1cbiAgICA6IFtsb3dWb2x0YWdlLCBoaWdoVm9sdGFnZV1cblxuICBpZiAoc3dpdGNoaW5nRnJlcXVlbmN5ICYmIHN3aXRjaGluZ0ZyZXF1ZW5jeSA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSAxIC8gc3dpdGNoaW5nRnJlcXVlbmN5XG4gICAgY29uc3Qgd2lkdGhGcm9tT3BlbkNsb3NlID1cbiAgICAgIG9wZW5zQXQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0ID8gTWF0aC5taW4ob3BlbnNBdCAtIGNsb3Nlc0F0LCBwZXJpb2QpIDogMFxuICAgIGNvbnN0IHB1bHNlV2lkdGggPVxuICAgICAgd2lkdGhGcm9tT3BlbkNsb3NlID4gMCA/IHdpZHRoRnJvbU9wZW5DbG9zZSA6IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAob3BlbnNBdCAhPT0gdW5kZWZpbmVkICYmIG9wZW5zQXQgPiBjbG9zZXNBdCkge1xuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChvcGVuc0F0IC0gY2xvc2VzQXQsIDFlLTkpXG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKyBwdWxzZVdpZHRoICogMlxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKGNsb3Nlc0F0ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICogMlxuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIHJldHVybiBgREMgJHtzdGFydHNDbG9zZWQgPyBoaWdoVm9sdGFnZSA6IGxvd1ZvbHRhZ2V9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyRm9yU3BpY2UodmFsdWU6IG51bWJlcikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBgJHt2YWx1ZX1gXG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFwiMFwiXG5cbiAgY29uc3QgYWJzVmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoYWJzVmFsdWUgPj0gMWUzIHx8IGFic1ZhbHVlIDw9IDFlLTMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRXhwb25lbnRpYWwoNikpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNlY29uZHNGb3JTcGljZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGAke3ZhbHVlfWBcbiAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gXCIwXCJcblxuICBjb25zdCB1bml0cyA9IFtcbiAgICBbXCJUXCIsIDFlMTJdLFxuICAgIFtcIkdcIiwgMWU5XSxcbiAgICBbXCJNRUdcIiwgMWU2XSxcbiAgICBbXCJrXCIsIDFlM10sXG4gICAgW1wibVwiLCAxZS0zXSxcbiAgICBbXCJ1XCIsIDFlLTZdLFxuICAgIFtcIm5cIiwgMWUtOV0sXG4gICAgW1wicFwiLCAxZS0xMl0sXG4gIF0gYXMgY29uc3RcblxuICBmb3IgKGNvbnN0IFtzdWZmaXgsIG11bHRpcGxpZXJdIG9mIHVuaXRzKSB7XG4gICAgY29uc3Qgc2NhbGVkID0gdmFsdWUgLyBtdWx0aXBsaWVyXG4gICAgaWYgKE1hdGguYWJzKHNjYWxlZCkgPj0gMC45OTk5OTkgJiYgTWF0aC5hYnMoc2NhbGVkKSA8IDk5OS45OTk5OTkpIHtcbiAgICAgIGNvbnN0IHJvdW5kZWQgPSBOdW1iZXIoc2NhbGVkLnRvUHJlY2lzaW9uKDYpKVxuICAgICAgaWYgKE1hdGguYWJzKHJvdW5kZWQgKiBtdWx0aXBsaWVyIC0gdmFsdWUpIDw9IE1hdGguYWJzKHZhbHVlKSAqIDFlLTkpIHtcbiAgICAgICAgcmV0dXJuIGAke3JvdW5kZWR9JHtzdWZmaXh9YFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXROdW1iZXJGb3JTcGljZSh2YWx1ZSlcbn1cbiIsICJpbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBSZXNpc3RvckNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGZvcm1hdFJlc2lzdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVSZXNpc3RvciA9ICh7XG4gIGNvbXBvbmVudCxcbiAgbm9kZXMsXG59OiB7XG4gIGNvbXBvbmVudDogQW55Q2lyY3VpdEVsZW1lbnRcbiAgbm9kZXM6IHN0cmluZ1tdXG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwicmVzaXN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCByZXNpc3RvckNtZCA9IG5ldyBSZXNpc3RvckNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICB2YWx1ZTogZm9ybWF0UmVzaXN0YW5jZShjb21wb25lbnQucmVzaXN0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIHJlc2lzdG9yQ21kLCBub2RlcylcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQge1xuICBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQsXG4gIFZvbHRhZ2VTb3VyY2VDb21tYW5kLFxufSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCwgU291cmNlU2ltcGxlU3dpdGNoIH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQge1xuICBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUsXG4gIHNhbml0aXplSWRlbnRpZmllcixcbn0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlU3dpdGNoID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBub2RlcyxcbiAgc2ltdWxhdGlvblN3aXRjaE1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlU3dpdGNoXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzaW11bGF0aW9uU3dpdGNoTWFwOiBNYXA8c3RyaW5nLCBTaW11bGF0aW9uU3dpdGNoPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNhbml0aXplZEJhc2UgPSBzYW5pdGl6ZUlkZW50aWZpZXIoXG4gICAgY29tcG9uZW50Lm5hbWUgPz8gY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgXCJTV1wiLFxuICApXG4gIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVzWzBdIHx8IFwiMFwiXG4gIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVzWzFdIHx8IFwiMFwiXG4gIGNvbnN0IGNvbnRyb2xOb2RlID0gYE5DVFJMXyR7c2FuaXRpemVkQmFzZX1gXG4gIGNvbnN0IG1vZGVsTmFtZSA9IGBTV18ke3Nhbml0aXplZEJhc2V9YFxuXG4gIGNvbnN0IGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoID0gc2ltdWxhdGlvblN3aXRjaE1hcC5nZXQoXG4gICAgY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gIClcblxuICBjb25zdCBjb250cm9sVmFsdWUgPSBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gICAgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2gsXG4gIClcblxuICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICBuYW1lOiBzYW5pdGl6ZWRCYXNlLFxuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgcG9zaXRpdmVDb250cm9sOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZUNvbnRyb2w6IFwiMFwiLFxuICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gIH0pXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9IFNXKFJvbj0wLjEgUm9mZj0xZTkgVnQ9Mi41IFZoPTAuMSlgLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xTb3VyY2VOYW1lID0gYENUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgY29uc3QgY29udHJvbFNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgbmFtZTogY29udHJvbFNvdXJjZU5hbWUsXG4gICAgcG9zaXRpdmVOb2RlOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGU6IFwiMFwiLFxuICAgIHZhbHVlOiBjb250cm9sVmFsdWUsXG4gIH0pXG5cbiAgY29uc3QgY29udHJvbENvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICBjb250cm9sU291cmNlTmFtZSxcbiAgICBjb250cm9sU291cmNlQ21kLFxuICAgIFtjb250cm9sTm9kZSwgXCIwXCJdLFxuICApXG5cbiAgbmV0bGlzdC5hZGRDb21wb25lbnQoY29udHJvbENvbXBvbmVudClcblxuICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KHNhbml0aXplZEJhc2UsIHN3aXRjaENtZCwgW1xuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgY29udHJvbE5vZGUsXG4gICAgXCIwXCIsXG4gIF0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgQ2FwYWNpdG9yQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZm9ybWF0Q2FwYWNpdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImNhcGFjaXRhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGNhcGFjaXRvckNtZCA9IG5ldyBDYXBhY2l0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdENhcGFjaXRhbmNlKGNvbXBvbmVudC5jYXBhY2l0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIGNhcGFjaXRvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgRGlvZGVDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7XG4gIFNvdXJjZVBvcnQsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5jb25zdCBnZXREaW9kZU5vZGVzID0gKFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGNvbnN0IGFub2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJhbm9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJhbm9kZVwiKSxcbiAgKVxuICBjb25zdCBjYXRob2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+XG4gICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY2F0aG9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjYXRob2RlXCIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwb3NpdGl2ZU5vZGU6IG5vZGVNYXAuZ2V0KGFub2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gICAgbmVnYXRpdmVOb2RlOiBub2RlTWFwLmdldChjYXRob2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gIH1cbn1cblxuY29uc3QgcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCA9ICh7XG4gIG5ldGxpc3QsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UG9ydHMsXG4gIG5vZGVNYXAsXG4gIG1vZGVsTmFtZSxcbiAgbW9kZWxEZWZpbml0aW9uLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZSB8IFNvdXJjZVNpbXBsZUxlZFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgbW9kZWxOYW1lOiBzdHJpbmdcbiAgbW9kZWxEZWZpbml0aW9uOiBzdHJpbmdcbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSB9ID0gZ2V0RGlvZGVOb2RlcyhcbiAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgbm9kZU1hcCxcbiAgICApXG5cbiAgICBjb25zdCBkaW9kZUNtZCA9IG5ldyBEaW9kZUNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICB9KVxuICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIG1vZGVsRGVmaW5pdGlvbilcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgZGlvZGVDbWQsIFtcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlRGlvZGUgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZVxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCh7XG4gICAgbmV0bGlzdCxcbiAgICBjb21wb25lbnQsXG4gICAgY29tcG9uZW50UG9ydHMsXG4gICAgbm9kZU1hcCxcbiAgICBtb2RlbE5hbWU6IFwiRFwiLFxuICAgIG1vZGVsRGVmaW5pdGlvbjogXCIuTU9ERUwgRCBEXCIsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlTGVkID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlTGVkXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIHJldHVybiBwcm9jZXNzRGlvZGVMaWtlQ29tcG9uZW50KHtcbiAgICBuZXRsaXN0LFxuICAgIGNvbXBvbmVudCxcbiAgICBjb21wb25lbnRQb3J0cyxcbiAgICBub2RlTWFwLFxuICAgIG1vZGVsTmFtZTogXCJMRURcIixcbiAgICBtb2RlbERlZmluaXRpb246XG4gICAgICBcIi5NT0RFTCBMRUQgRChJUz0xZS0yMCBOPTIgUlM9MTAgQ0pPPTJwIEVHPTIuMSBCVj01IElCVj0xMHUpXCIsXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgSW5kdWN0b3JDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBmb3JtYXRJbmR1Y3RhbmNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlSW5kdWN0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImluZHVjdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgaW5kdWN0b3JDbWQgPSBuZXcgSW5kdWN0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdEluZHVjdGFuY2UoY29tcG9uZW50LmluZHVjdGFuY2UgYXMgbnVtYmVyKSxcbiAgICB9KVxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBpbmR1Y3RvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgTU9TRkVUQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBTb3VyY2VQb3J0LCBTb3VyY2VTaW1wbGVNb3NmZXQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVNb3NmZXQgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVNb3NmZXRcbiAgY29tcG9uZW50UG9ydHM6IFNvdXJjZVBvcnRbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGRyYWluUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImRyYWluXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImRyYWluXCIpLFxuICAgIClcbiAgICBjb25zdCBnYXRlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImdhdGVcIiB8fCBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZ2F0ZVwiKSxcbiAgICApXG4gICAgY29uc3Qgc291cmNlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcInNvdXJjZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJzb3VyY2VcIiksXG4gICAgKVxuXG4gICAgY29uc3QgZHJhaW5Ob2RlID0gbm9kZU1hcC5nZXQoZHJhaW5Qb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgIGNvbnN0IGdhdGVOb2RlID0gbm9kZU1hcC5nZXQoZ2F0ZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAvLyBGb3IgMy1waW4gTU9TRkVUcywgc3Vic3RyYXRlIGlzIHR5cGljYWxseSBjb25uZWN0ZWQgdG8gc291cmNlXG4gICAgY29uc3Qgc3Vic3RyYXRlTm9kZSA9IHNvdXJjZU5vZGVcblxuICAgIGNvbnN0IGNoYW5uZWxfdHlwZSA9IGNvbXBvbmVudC5jaGFubmVsX3R5cGUgPz8gXCJuXCJcbiAgICBjb25zdCBtb3NmZXRfbW9kZSA9IGNvbXBvbmVudC5tb3NmZXRfbW9kZSA/PyBcImVuaGFuY2VtZW50XCJcblxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IGAke2NoYW5uZWxfdHlwZS50b1VwcGVyQ2FzZSgpfU1PU2BcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBgJHttb2RlbFR5cGV9XyR7bW9zZmV0X21vZGUudG9VcHBlckNhc2UoKX1gXG5cbiAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICBpZiAobW9zZmV0X21vZGUgPT09IFwiZW5oYW5jZW1lbnRcIikge1xuICAgICAgICBjb25zdCB2dG8gPSBjaGFubmVsX3R5cGUgPT09IFwicFwiID8gLTEgOiAxXG4gICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHttb2RlbFR5cGV9IChWVE89JHt2dG99IEtQPTAuMSlgLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQoXG4gICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9ICR7bW9kZWxUeXBlfSAoS1A9MC4xKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb3NmZXRDbWQgPSBuZXcgTU9TRkVUQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBkcmFpbjogZHJhaW5Ob2RlLFxuICAgICAgZ2F0ZTogZ2F0ZU5vZGUsXG4gICAgICBzb3VyY2U6IHNvdXJjZU5vZGUsXG4gICAgICBzdWJzdHJhdGU6IHN1YnN0cmF0ZU5vZGUsXG4gICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgbW9zZmV0Q21kLCBbXG4gICAgICBkcmFpbk5vZGUsXG4gICAgICBnYXRlTm9kZSxcbiAgICAgIHNvdXJjZU5vZGUsXG4gICAgXSlcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBCSlRDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IFNvdXJjZVBvcnQsIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVUcmFuc2lzdG9yID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlVHJhbnNpc3RvclxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgY29sbGVjdG9yUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNvbGxlY3RvclwiIHx8XG4gICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjb2xsZWN0b3JcIiksXG4gICAgKVxuICAgIGNvbnN0IGJhc2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmFzZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJiYXNlXCIpLFxuICAgIClcbiAgICBjb25zdCBlbWl0dGVyUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImVtaXR0ZXJcIiB8fFxuICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZW1pdHRlclwiKSxcbiAgICApXG5cbiAgICBpZiAoIWNvbGxlY3RvclBvcnQgfHwgIWJhc2VQb3J0IHx8ICFlbWl0dGVyUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNpc3RvciAke2NvbXBvbmVudC5uYW1lfSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBvcnRzIChjb2xsZWN0b3IsIGJhc2UsIGVtaXR0ZXIpYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0b3JOb2RlID0gbm9kZU1hcC5nZXQoY29sbGVjdG9yUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICBjb25zdCBiYXNlTm9kZSA9IG5vZGVNYXAuZ2V0KGJhc2VQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIGNvbnN0IGVtaXR0ZXJOb2RlID0gbm9kZU1hcC5nZXQoZW1pdHRlclBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICBjb25zdCB0cmFuc2lzdG9yX3R5cGUgPSBjb21wb25lbnQudHJhbnNpc3Rvcl90eXBlID8/IFwibnBuXCJcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0cmFuc2lzdG9yX3R5cGUudG9VcHBlckNhc2UoKVxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSAke3RyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYmp0Q21kID0gbmV3IEJKVENvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgY29sbGVjdG9yOiBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZTogYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyOiBlbWl0dGVyTm9kZSxcbiAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgYmp0Q21kLCBbXG4gICAgICBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCwgU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2UgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHsgZm9ybWF0U2Vjb25kc0ZvclNwaWNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlczogU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMpIHtcbiAgICBpZiAoc2ltU291cmNlLnR5cGUgIT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZVwiKSBjb250aW51ZVxuXG4gICAgaWYgKHNpbVNvdXJjZS5pc19kY19zb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAvLyBBQyBTb3VyY2VcbiAgICAgIGlmIChcbiAgICAgICAgXCJ0ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgXCJ0ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCAmJlxuICAgICAgICBzaW1Tb3VyY2UudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldChzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgbGV0IHZhbHVlID0gXCJcIlxuICAgICAgICBjb25zdCB3YXZlX3NoYXBlID0gc2ltU291cmNlLndhdmVfc2hhcGVcbiAgICAgICAgaWYgKHdhdmVfc2hhcGUgPT09IFwic2luZXdhdmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfb2Zmc2V0ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCB2X3BlYWsgPSBzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBkYW1waW5nX2ZhY3RvciA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7dl9vZmZzZXR9ICR7dl9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCB2X3B1bHNlZCA9IHNpbVNvdXJjZS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQZXJpb2QgPSBzaW1Tb3VyY2UucGVyaW9kICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFB1bHNlV2lkdGggPSBzaW1Tb3VyY2UucHVsc2Vfd2lkdGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IGhhc0V4cGxpY2l0UGVyaW9kXG4gICAgICAgICAgICA/IHNpbVNvdXJjZS5wZXJpb2QhIC8gMTAwMFxuICAgICAgICAgICAgOiBwZXJpb2RfZnJvbV9mcmVxXG4gICAgICAgICAgY29uc3QgZHV0eV9jeWNsZSA9IHNpbVNvdXJjZS5kdXR5X2N5Y2xlID8/IDAuNVxuICAgICAgICAgIGNvbnN0IHB1bHNlX3dpZHRoID0gcGVyaW9kICogZHV0eV9jeWNsZVxuICAgICAgICAgIGNvbnN0IGRlbGF5ID1cbiAgICAgICAgICAgIHNpbVNvdXJjZS5wdWxzZV9kZWxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gc2ltU291cmNlLnB1bHNlX2RlbGF5IC8gMTAwMFxuICAgICAgICAgICAgICA6IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPVxuICAgICAgICAgICAgc2ltU291cmNlLnJpc2VfdGltZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5yaXNlX3RpbWUgLyAxMDAwKVxuICAgICAgICAgICAgICA6IFwiMW5cIlxuICAgICAgICAgIGNvbnN0IGZhbGxfdGltZSA9XG4gICAgICAgICAgICBzaW1Tb3VyY2UuZmFsbF90aW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBmb3JtYXRTZWNvbmRzRm9yU3BpY2Uoc2ltU291cmNlLmZhbGxfdGltZSAvIDEwMDApXG4gICAgICAgICAgICAgIDogXCIxblwiXG4gICAgICAgICAgY29uc3QgcHVsc2VXaWR0aFRleHQgPSBoYXNFeHBsaWNpdFB1bHNlV2lkdGhcbiAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5wdWxzZV93aWR0aCEgLyAxMDAwKVxuICAgICAgICAgICAgOiBmb3JtYXRTZWNvbmRzRm9yU3BpY2UocHVsc2Vfd2lkdGgpXG4gICAgICAgICAgY29uc3QgcGVyaW9kVGV4dCA9IGZvcm1hdFNlY29uZHNGb3JTcGljZShwZXJpb2QpXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHt2X2luaXRpYWx9ICR7dl9wdWxzZWR9ICR7Zm9ybWF0U2Vjb25kc0ZvclNwaWNlKGRlbGF5KX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlV2lkdGhUZXh0fSAke3BlcmlvZFRleHR9KWBcbiAgICAgICAgfSBlbHNlIGlmIChzaW1Tb3VyY2Uudm9sdGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgICApXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gREMgU291cmNlIChpc19kY19zb3VyY2UgaXMgdHJ1ZSBvciB1bmRlZmluZWQpXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5wb3NpdGl2ZV9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3QgbmVnYXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UubmVnYXRpdmVfc291cmNlX3BvcnRfaWRcblxuICAgICAgaWYgKFxuICAgICAgICBwb3NpdGl2ZVBvcnRJZCAmJlxuICAgICAgICBuZWdhdGl2ZVBvcnRJZCAmJlxuICAgICAgICBcInZvbHRhZ2VcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnZvbHRhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KHBvc2l0aXZlUG9ydElkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2RlTWFwLmdldChuZWdhdGl2ZVBvcnRJZCkgfHwgXCIwXCJcblxuICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgIHZhbHVlOiBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZX1gLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHZvbHRhZ2VTb3VyY2VDbWQsXG4gICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgKVxuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgQ3VycmVudFNvdXJjZUNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uQ3VycmVudFNvdXJjZXMgPSAoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzOiBBbnlDaXJjdWl0RWxlbWVudFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHNpbXVsYXRpb25DdXJyZW50U291cmNlcykge1xuICAgIGlmIChzaW1Tb3VyY2UudHlwZSAhPT0gXCJzaW11bGF0aW9uX2N1cnJlbnRfc291cmNlXCIpIGNvbnRpbnVlXG5cbiAgICBpZiAoc2ltU291cmNlLmlzX2RjX3NvdXJjZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEFDL1BVTFNFIFNvdXJjZVxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcblxuICAgICAgaWYgKHBvc2l0aXZlUG9ydElkICYmIG5lZ2F0aXZlUG9ydElkKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KHBvc2l0aXZlUG9ydElkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2RlTWFwLmdldChuZWdhdGl2ZVBvcnRJZCkgfHwgXCIwXCJcblxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiXG4gICAgICAgIGNvbnN0IHdhdmVfc2hhcGUgPSBzaW1Tb3VyY2Uud2F2ZV9zaGFwZVxuICAgICAgICBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzaW5ld2F2ZVwiKSB7XG4gICAgICAgICAgY29uc3QgaV9vZmZzZXQgPSAwIC8vIG5vdCBwcm92aWRlZFxuICAgICAgICAgIGNvbnN0IGlfcGVhayA9IChzaW1Tb3VyY2UucGVha190b19wZWFrX2N1cnJlbnQgPz8gMCkgLyAyXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMFxuICAgICAgICAgIGNvbnN0IGRhbXBpbmdfZmFjdG9yID0gMFxuICAgICAgICAgIGNvbnN0IHBoYXNlID0gc2ltU291cmNlLnBoYXNlID8/IDBcbiAgICAgICAgICBpZiAoZnJlcSA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gYFNJTigke2lfb2Zmc2V0fSAke2lfcGVha30gJHtmcmVxfSAke2RlbGF5fSAke2RhbXBpbmdfZmFjdG9yfSAke3BoYXNlfSlgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gYERDICR7aV9wZWFrfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IGlfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCBpX3B1bHNlZCA9IHNpbVNvdXJjZS5wZWFrX3RvX3BlYWtfY3VycmVudCA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IHBlcmlvZF9mcm9tX2ZyZXEgPSBmcmVxID09PSAwID8gSW5maW5pdHkgOiAxIC8gZnJlcVxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IHBlcmlvZF9mcm9tX2ZyZXFcbiAgICAgICAgICBjb25zdCBkdXR5X2N5Y2xlID0gc2ltU291cmNlLmR1dHlfY3ljbGUgPz8gMC41XG4gICAgICAgICAgY29uc3QgcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgcmlzZV90aW1lID0gXCIxblwiXG4gICAgICAgICAgY29uc3QgZmFsbF90aW1lID0gXCIxblwiXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHtpX2luaXRpYWx9ICR7aV9wdWxzZWR9ICR7ZGVsYXl9ICR7cmlzZV90aW1lfSAke2ZhbGxfdGltZX0gJHtwdWxzZV93aWR0aH0gJHtwZXJpb2R9KWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2VDbWQsXG4gICAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICAgIClcbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEQyBTb3VyY2VcbiAgICAgIGNvbnN0IHBvc2l0aXZlUG9ydElkID0gc2ltU291cmNlLnBvc2l0aXZlX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwiY3VycmVudFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBzaW1Tb3VyY2UuY3VycmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAke3NpbVNvdXJjZS5jdXJyZW50fWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgY3VycmVudFNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgU2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVRyYWNlLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBmb3JtYXROdW1iZXJGb3JTcGljZSB9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5jb25zdCBzcGljZU9wdGlvbk9yZGVyID0gW1wibWV0aG9kXCIsIFwicmVsdG9sXCIsIFwiYWJzdG9sXCIsIFwidm50b2xcIl0gYXMgY29uc3RcblxuaW50ZXJmYWNlIFByb2JlVmVjdG9yTWFwcGluZyB7XG4gIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgc3BpY2VfdmVjdG9yOiBzdHJpbmdcbiAgc291cmNlX25vZGVfbmFtZTogc3RyaW5nXG4gIHJlZmVyZW5jZV9ub2RlX25hbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudCA9IChcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW1FeHBlcmltZW50OiBTaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgc2ltdWxhdGlvblByb2JlczogU2ltdWxhdGlvblZvbHRhZ2VQcm9iZVtdLFxuICBzb3VyY2VUcmFjZXM6IFNvdXJjZVRyYWNlW10sXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pID0+IHtcbiAgaWYgKCFzaW1FeHBlcmltZW50KSByZXR1cm5cblxuICBjb25zdCBzcGljZU9wdGlvbnMgPSBzaW1FeHBlcmltZW50LnNwaWNlX29wdGlvbnNcbiAgaWYgKHNwaWNlT3B0aW9ucykge1xuICAgIGNvbnN0IG9wdGlvblBhcnRzID0gc3BpY2VPcHRpb25PcmRlclxuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3BpY2VPcHRpb25zW2tleV1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogYCR7a2V5fT0ke3ZhbHVlfWBcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gcGFydCAhPT0gbnVsbClcblxuICAgIGlmIChvcHRpb25QYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMucHVzaChgLm9wdGlvbnMgJHtvcHRpb25QYXJ0cy5qb2luKFwiIFwiKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3Mgc2ltdWxhdGlvbiB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZXNUb1Byb2JlID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBjb25zdCBwcm9iZVZlY3Rvck1hcHBpbmdzOiBQcm9iZVZlY3Rvck1hcHBpbmdbXSA9IFtdXG5cbiAgICBjb25zdCBnZXRQb3J0SWRGcm9tTmV0SWQgPSAobmV0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSBzb3VyY2VUcmFjZXMuZmluZCgodCkgPT5cbiAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMobmV0SWQpLFxuICAgICAgKVxuICAgICAgcmV0dXJuIHRyYWNlPy5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBsZXQgc2lnbmFsUG9ydElkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICBpZiAoIXNpZ25hbFBvcnRJZCkge1xuICAgICAgICBjb25zdCBzaWduYWxOZXRJZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICAgIGlmIChzaWduYWxOZXRJZCkge1xuICAgICAgICAgIHNpZ25hbFBvcnRJZCA9IGdldFBvcnRJZEZyb21OZXRJZChzaWduYWxOZXRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXNpZ25hbFBvcnRJZCkgY29udGludWVcblxuICAgICAgY29uc3Qgc2lnbmFsTm9kZU5hbWUgPSBub2RlTWFwLmdldChzaWduYWxQb3J0SWQpXG4gICAgICBpZiAoIXNpZ25hbE5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICBsZXQgcmVmZXJlbmNlUG9ydElkID0gcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICBpZiAoIXJlZmVyZW5jZVBvcnRJZCAmJiBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZCkge1xuICAgICAgICByZWZlcmVuY2VQb3J0SWQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoXG4gICAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWQsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZmVyZW5jZVBvcnRJZCkge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlTmFtZSA9IG5vZGVNYXAuZ2V0KHJlZmVyZW5jZVBvcnRJZClcbiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGVOYW1lICYmIHJlZmVyZW5jZU5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgIGNvbnN0IHNwaWNlVmVjdG9yID0gYFYoJHtzaWduYWxOb2RlTmFtZX0sJHtyZWZlcmVuY2VOb2RlTmFtZX0pYFxuICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoc3BpY2VWZWN0b3IpXG4gICAgICAgICAgcHJvYmVWZWN0b3JNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogcHJvYmUuc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkLFxuICAgICAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgICAgIHNwaWNlX3ZlY3Rvcjogc3BpY2VWZWN0b3IsXG4gICAgICAgICAgICBzb3VyY2Vfbm9kZV9uYW1lOiBzaWduYWxOb2RlTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZV9ub2RlX25hbWU6IHJlZmVyZW5jZU5vZGVOYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgY29uc3Qgc3BpY2VWZWN0b3IgPSBgVigke3NpZ25hbE5vZGVOYW1lfSlgXG4gICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChzcGljZVZlY3RvcilcbiAgICAgICAgICBwcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkOiBwcm9iZS5zaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQsXG4gICAgICAgICAgICBuYW1lOiBwcm9iZS5uYW1lLFxuICAgICAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgICAgIHNvdXJjZV9ub2RlX25hbWU6IHNpZ25hbE5vZGVOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlX25vZGVfbmFtZTogcmVmZXJlbmNlTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luZ2xlLWVuZGVkIHByb2JlXG4gICAgICAgIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBWKCR7c2lnbmFsTm9kZU5hbWV9KWBcbiAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKHNwaWNlVmVjdG9yKVxuICAgICAgICAgIHByb2JlVmVjdG9yTWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZCxcbiAgICAgICAgICAgIG5hbWU6IHByb2JlLm5hbWUsXG4gICAgICAgICAgICBzcGljZV92ZWN0b3I6IHNwaWNlVmVjdG9yLFxuICAgICAgICAgICAgc291cmNlX25vZGVfbmFtZTogc2lnbmFsTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG5vZGVzVG9Qcm9iZS5zaXplID4gMCAmJlxuICAgICAgc2ltRXhwZXJpbWVudC5leHBlcmltZW50X3R5cGU/LmluY2x1ZGVzKFwidHJhbnNpZW50XCIpXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgcHJvYmVWZWN0b3JNYXBwaW5ncykge1xuICAgICAgICBuZXRsaXN0Lm1ldGFkYXRhQ29tbWVudHMucHVzaChcbiAgICAgICAgICBgKiB0c2NpcmN1aXRfcHJvYmUgJHtKU09OLnN0cmluZ2lmeShtYXBwaW5nKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBwcm9iZVZlY3RvcnMgPSBbLi4ubm9kZXNUb1Byb2JlXS5qb2luKFwiIFwiKVxuICAgICAgbmV0bGlzdC5wcmludFN0YXRlbWVudHMucHVzaChgLlBSSU5UIFRSQU4gJHtwcm9iZVZlY3RvcnN9YClcbiAgICAgIG5ldGxpc3Quc2F2ZVN0YXRlbWVudHMucHVzaChgLlNBVkUgJHtwcm9iZVZlY3RvcnN9YClcbiAgICB9XG4gIH1cblxuICBjb25zdCB0aW1lUGVyU3RlcCA9IHNpbUV4cGVyaW1lbnQudGltZV9wZXJfc3RlcFxuICBjb25zdCBlbmRUaW1lID0gc2ltRXhwZXJpbWVudC5lbmRfdGltZV9tc1xuICBjb25zdCBzdGFydFRpbWVNcyA9IHNpbUV4cGVyaW1lbnQuc3RhcnRfdGltZV9tc1xuXG4gIGlmICh0aW1lUGVyU3RlcCAmJiBlbmRUaW1lKSB7XG4gICAgLy8gY2lyY3VpdC1qc29uIHZhbHVlcyBhcmUgaW4gbXMsIFNQSUNFIHJlcXVpcmVzIHNlY29uZHNcbiAgICBjb25zdCBzdGFydFRpbWUgPSAoc3RhcnRUaW1lTXMgPz8gMCkgLyAxMDAwXG5cbiAgICBsZXQgdHJhbkNtZCA9IGAudHJhbiAke2Zvcm1hdE51bWJlckZvclNwaWNlKFxuICAgICAgdGltZVBlclN0ZXAgLyAxMDAwLFxuICAgICl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoZW5kVGltZSAvIDEwMDApfWBcbiAgICBpZiAoc3RhcnRUaW1lID4gMCkge1xuICAgICAgdHJhbkNtZCArPSBgICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2Uoc3RhcnRUaW1lKX1gXG4gICAgfVxuICAgIHRyYW5DbWQgKz0gXCIgVUlDXCJcbiAgICBuZXRsaXN0LnRyYW5Db21tYW5kID0gdHJhbkNtZFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uT3BBbXAgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuY29uc3QgT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FID0gXCJHRU5FUklDX09QQU1QXCJcbmNvbnN0IE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTiA9IGBcbi5TVUJDS1QgJHtPUEFNUF9TVUJDSVJDVUlUX05BTUV9IG5vbl9pbnZlcnRpbmdfaW5wdXQgaW52ZXJ0aW5nX2lucHV0IHBvc2l0aXZlX3N1cHBseSBuZWdhdGl2ZV9zdXBwbHkgb3V0cHV0XG4qIEdlbmVyaWMgT3AtQW1wIE1vZGVsXG5FMSBpbnRlcm5hbF9vdXRwdXQgMCBub25faW52ZXJ0aW5nX2lucHV0IGludmVydGluZ19pbnB1dCAxMDBrXG5SaW4gbm9uX2ludmVydGluZ19pbnB1dCBpbnZlcnRpbmdfaW5wdXQgMTBNZWdcblJvdXQgaW50ZXJuYWxfb3V0cHV0IG91dHB1dCA3NVxuRDEgb3V0cHV0IHBvc2l0aXZlX3N1cHBseSBvcGFtcF9kaW9kZVxuRDIgbmVnYXRpdmVfc3VwcGx5IG91dHB1dCBvcGFtcF9kaW9kZVxuLm1vZGVsIG9wYW1wX2Rpb2RlIERcbi5FTkRTICR7T1BBTVBfU1VCQ0lSQ1VJVF9OQU1FfVxuYC50cmltKClcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uT3BBbXBzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25PcEFtcHM6IFNpbXVsYXRpb25PcEFtcFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGlmIChzaW11bGF0aW9uT3BBbXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMoT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChPUEFNUF9TVUJDSVJDVUlUX05BTUUsIE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTilcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltT3BBbXAgb2Ygc2ltdWxhdGlvbk9wQW1wcykge1xuICAgIGlmIChzaW1PcEFtcC50eXBlICE9PSBcInNpbXVsYXRpb25fb3BfYW1wXCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBub25JbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubm9uX2ludmVydGluZ19pbnB1dF9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBpbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAuaW52ZXJ0aW5nX2lucHV0X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IG91dHB1dE5vZGUgPSBub2RlTWFwLmdldChzaW1PcEFtcC5vdXRwdXRfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3QgcG9zaXRpdmVTdXBwbHlOb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLnBvc2l0aXZlX3N1cHBseV9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBuZWdhdGl2ZVN1cHBseU5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubmVnYXRpdmVfc3VwcGx5X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuXG4gICAgY29uc3Qgbm9kZXMgPSBbXG4gICAgICBub25JbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBpbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBwb3NpdGl2ZVN1cHBseU5vZGUsXG4gICAgICBuZWdhdGl2ZVN1cHBseU5vZGUsXG4gICAgICBvdXRwdXROb2RlLFxuICAgIF1cblxuICAgIGNvbnN0IG9wQW1wQ21kID0gbmV3IFN1YmNpcmN1aXRDYWxsQ29tbWFuZCh7XG4gICAgICBuYW1lOiBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG5vZGVzLFxuICAgICAgc3ViY2lyY3VpdE5hbWU6IE9QQU1QX1NVQkNJUkNVSVRfTkFNRSxcbiAgICB9KVxuXG4gICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG9wQW1wQ21kLFxuICAgICAgbm9kZXMsXG4gICAgKVxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3ViY2lyY3VpdENhbGxDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNwaWNlU3ViY2t0KFxuICBzb3VyY2U6IHN0cmluZyxcbik6IHsgbW9kZWxOYW1lOiBzdHJpbmc7IHBpbk5hbWVzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gIGNvbnN0IGxpbmUgPSBzb3VyY2VcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maW5kKChsaW5lKSA9PiAvXlxcLnN1YmNrdFxccysvaS50ZXN0KGxpbmUpKVxuXG4gIGlmICghbGluZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCB0b2tlbnMgPSBsaW5lLnNwbGl0KC9cXHMrLylcbiAgY29uc3QgbW9kZWxOYW1lID0gdG9rZW5zWzFdXG4gIGNvbnN0IHBpbk5hbWVzID0gdG9rZW5zLnNsaWNlKDIpXG5cbiAgaWYgKCFtb2RlbE5hbWUgfHwgcGluTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICByZXR1cm4geyBtb2RlbE5hbWUsIHBpbk5hbWVzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0czogU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSB7XG4gIGlmIChzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGZvciAoY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdCBvZiBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cykge1xuICAgIGNvbnN0IHBhcnNlZFN1YmNrdCA9IHBhcnNlU3BpY2VTdWJja3QoXG4gICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnN1YmNpcmN1aXRfc291cmNlLFxuICAgIClcblxuICAgIGlmICghcGFyc2VkU3ViY2t0KSBjb250aW51ZVxuXG4gICAgY29uc3QgeyBtb2RlbE5hbWUsIHBpbk5hbWVzIH0gPSBwYXJzZWRTdWJja3RcblxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc3ViY2lyY3VpdF9zb3VyY2UpXG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBwaW5OYW1lcy5tYXAoKHNwaWNlUGluTmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUG9ydElkID1cbiAgICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zcGljZV9waW5fdG9fc291cmNlX3BvcnRfbWFwW3NwaWNlUGluTmFtZV1cbiAgICAgIHJldHVybiBub2RlTWFwLmdldChzb3VyY2VQb3J0SWQpID8/IFwiMFwiXG4gICAgfSlcblxuICAgIGNvbnN0IHN1YmNpcmN1aXRDYWxsQ29tbWFuZCA9IG5ldyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQoe1xuICAgICAgbmFtZTogc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICBub2RlcyxcbiAgICAgIHN1YmNpcmN1aXROYW1lOiBtb2RlbE5hbWUsXG4gICAgfSlcblxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnNpbXVsYXRpb25fc3BpY2Vfc3ViY2lyY3VpdF9pZCxcbiAgICAgICAgc3ViY2lyY3VpdENhbGxDb21tYW5kLFxuICAgICAgICBub2RlcyxcbiAgICAgICksXG4gICAgKVxuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNwaWNlU3ViY2lyY3VpdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBwaW5zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcGluczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5waW5zID0gcGluc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBpblN0cmluZyA9IHRoaXMucGlucy5qb2luKFwiIFwiKVxuICAgIGNvbnN0IGhlYWRlciA9IGAuU1VCQ0tUICR7dGhpcy5uYW1lfSAke3BpblN0cmluZ31gXG4gICAgY29uc3QgZm9vdGVyID0gYC5FTkRTICR7dGhpcy5uYW1lfWBcblxuICAgIGNvbnN0IGJvZHkgPSBgKiBQbGFjZWhvbGRlciBmb3IgJHt0aGlzLm5hbWV9LiBObyBkZWZpbml0aW9uIGZvdW5kIGluIGNpcmN1aXQgSlNPTi5gXG5cbiAgICByZXR1cm4gW1wiXCIsIGhlYWRlciwgYm9keSwgZm9vdGVyXS5qb2luKFwiXFxuXCIpXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLDhCQUE4QixDQUFDLFlBQWtDO0FBQzVFLFFBQU0sUUFBa0IsQ0FBQztBQUd6QixRQUFNLEtBQUssUUFBUSxLQUFLO0FBR3hCLE1BQUksUUFBUSxPQUFPLE9BQU8sR0FBRztBQUMzQixVQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDbkQ7QUFHQSxhQUFXLGFBQWEsUUFBUSxZQUFZO0FBQzFDLFVBQU0sS0FBSyxVQUFVLGNBQWMsQ0FBQztBQUFBLEVBQ3RDO0FBRUEsTUFBSSxRQUFRLGlCQUFpQixTQUFTLEdBQUc7QUFDdkMsVUFBTSxLQUFLLEdBQUcsUUFBUSxnQkFBZ0I7QUFBQSxFQUN4QztBQUVBLE1BQUksUUFBUSxpQkFBaUIsU0FBUyxHQUFHO0FBQ3ZDLFVBQU0sS0FBSyxHQUFHLFFBQVEsZ0JBQWdCO0FBQUEsRUFDeEM7QUFHQSxhQUFXLGNBQWMsUUFBUSxhQUFhO0FBQzVDLFVBQU0sS0FBSyxXQUFXLGNBQWMsQ0FBQztBQUFBLEVBQ3ZDO0FBRUEsTUFBSSxRQUFRLGdCQUFnQixTQUFTLEdBQUc7QUFDdEMsVUFBTSxLQUFLLEdBQUcsUUFBUSxlQUFlO0FBQUEsRUFDdkM7QUFFQSxNQUFJLFFBQVEsZUFBZSxTQUFTLEdBQUc7QUFDckMsVUFBTSxLQUFLLEdBQUcsUUFBUSxjQUFjO0FBQUEsRUFDdEM7QUFHQSxNQUFJLFFBQVEsU0FBUyxTQUFTLEdBQUc7QUFDL0IsVUFBTSxLQUFLLFVBQVU7QUFDckIsVUFBTSxLQUFLLEdBQUcsUUFBUSxRQUFRO0FBQzlCLFVBQU0sS0FBSyxPQUFPO0FBQUEsRUFDcEI7QUFFQSxNQUNFLFFBQVEsZUFDUixDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsT0FBTyxDQUFDLEdBQzdEO0FBQ0EsVUFBTSxLQUFLLFFBQVEsV0FBVztBQUFBLEVBQ2hDO0FBR0EsUUFBTSxLQUFLLE1BQU07QUFFakIsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4Qjs7O0FDckRPLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRUEsWUFBWSxRQUFRLG1CQUFtQjtBQUNyQyxTQUFLLFFBQVE7QUFDYixTQUFLLGFBQWEsQ0FBQztBQUNuQixTQUFLLFFBQVEsb0JBQUksSUFBSTtBQUNyQixTQUFLLFdBQVcsQ0FBQztBQUNqQixTQUFLLGNBQWMsQ0FBQztBQUNwQixTQUFLLFNBQVMsb0JBQUksSUFBSTtBQUN0QixTQUFLLG1CQUFtQixDQUFDO0FBQ3pCLFNBQUssbUJBQW1CLENBQUM7QUFDekIsU0FBSyxjQUFjO0FBQ25CLFNBQUssa0JBQWtCLENBQUM7QUFDeEIsU0FBSyxpQkFBaUIsQ0FBQztBQUFBLEVBQ3pCO0FBQUEsRUFFQSxhQUFhLFdBQTJCO0FBQ3RDLFNBQUssV0FBVyxLQUFLLFNBQVM7QUFFOUIsZUFBVyxRQUFRLFVBQVUsT0FBTztBQUNsQyxXQUFLLE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQUEsRUFFQSxjQUFjLFlBQTZCO0FBQ3pDLFFBQUksS0FBSyxZQUFZLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxXQUFXLElBQUksRUFBRztBQUM5RCxTQUFLLFlBQVksS0FBSyxVQUFVO0FBQUEsRUFDbEM7QUFBQSxFQUVBLGdCQUFnQjtBQUNkLFdBQU8sNEJBQTRCLElBQUk7QUFBQSxFQUN6QztBQUNGOzs7QUM3Q08sSUFBTSxpQkFBTixNQUFxQjtBQUFBLEVBQzFCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVBLFlBQVksTUFBYyxTQUEyQixPQUFpQjtBQUNwRSxTQUFLLE9BQU87QUFDWixTQUFLLFVBQVU7QUFDZixTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsV0FBTyxLQUFLLFFBQVEsY0FBYztBQUFBLEVBQ3BDO0FBQ0Y7OztBQ0ZBLFNBQVMsbURBQW1EO0FBQzVELFNBQVMsVUFBVTs7O0FDSFosSUFBTSxhQUFOLE1BQTZDO0FBQUEsRUFDbEQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBd0I7QUFDbEMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLFdBQVcsTUFBTSxTQUFTLFdBQVcsT0FBTyxLQUFLLElBQzdELEtBQUs7QUFDUCxRQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxPQUFPO0FBQzFELFFBQUksV0FBVztBQUNiLHFCQUFlLElBQUksU0FBUztBQUFBLElBQzlCO0FBQ0EsbUJBQWUsSUFBSSxLQUFLO0FBQ3hCLFFBQUksTUFBTTtBQUNSLHFCQUFlLElBQUksSUFBSTtBQUFBLElBQ3pCO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDdEJPLElBQU0sbUJBQU4sTUFBbUQ7QUFBQSxFQUN4RCxjQUFjO0FBQUEsRUFFZDtBQUFBLEVBRUEsWUFBWSxPQUE4QjtBQUN4QyxTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSSxLQUFLO0FBRVQsUUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxZQUFZO0FBQzFELFFBQUksV0FBVztBQUNiLHFCQUFlLElBQUksU0FBUztBQUFBLElBQzlCO0FBQ0EsbUJBQWUsSUFBSSxLQUFLO0FBQ3hCLFFBQUksa0JBQWtCO0FBQ3BCLHFCQUFlLE9BQU8sZ0JBQWdCO0FBQUEsSUFDeEM7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUM3Qk8sSUFBTSx1QkFBTixNQUF1RDtBQUFBLEVBQzVELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQWtDO0FBQzVDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxjQUFjLGNBQWMsT0FBTyxhQUFhLFFBQVEsSUFDcEUsS0FBSztBQUNQLFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWTtBQUMxRCxRQUFJLE9BQU87QUFDVCxxQkFBZSxJQUFJLEtBQUs7QUFBQSxJQUMxQjtBQUNBLFFBQUksYUFBYTtBQUNmLHFCQUFlLE9BQU8sV0FBVztBQUNqQyxVQUFJLFNBQVM7QUFDWCx1QkFBZSxJQUFJLE9BQU87QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUN4Qk8sSUFBTSxlQUFOLE1BQStDO0FBQUEsRUFDcEQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBMEI7QUFDcEMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLEtBQUssSUFBSSxLQUFLO0FBQy9ELFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLEtBQUs7QUFDbkUsUUFBSSxNQUFNO0FBQ1IscUJBQWUsSUFBSSxJQUFJO0FBQUEsSUFDekI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNmTyxJQUFNLGtCQUFOLE1BQWtEO0FBQUEsRUFDdkQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBNkI7QUFDdkMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLE9BQU8saUJBQWlCLElBQ3ZFLEtBQUs7QUFDUCxRQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLFlBQVk7QUFDMUQsUUFBSSxPQUFPO0FBQ1QscUJBQWUsSUFBSSxLQUFLO0FBQUEsSUFDMUI7QUFDQSxtQkFBZSxJQUFJLEtBQUs7QUFDeEIsUUFBSSxrQkFBa0I7QUFDcEIscUJBQWUsT0FBTyxnQkFBZ0I7QUFBQSxJQUN4QztBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3hCTyxJQUFNLDBCQUFOLE1BQTBEO0FBQUEsRUFDL0QsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBcUM7QUFDL0MsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLFdBQVcsU0FBUyxJQUFJLEtBQUs7QUFDM0MsV0FBTyxJQUFJLElBQUksSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUTtBQUFBLEVBQ3BEO0FBQ0Y7OztBQ1RPLElBQU0sY0FBTixNQUE4QztBQUFBLEVBQ25ELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQXlCO0FBQ25DLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxPQUFPLE1BQU0sUUFBUSxPQUFPLEtBQUssSUFBSSxLQUFLO0FBQ3hELFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLO0FBQzlELFFBQUksTUFBTTtBQUNSLHFCQUFlLElBQUksSUFBSTtBQUFBLElBQ3pCO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDUk8sSUFBTSxnQkFBTixNQUFnRDtBQUFBLEVBQ3JELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQTJCO0FBQ3JDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUksS0FBSztBQUVULFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksS0FBSztBQUUzRSxVQUFNLFNBQTZDO0FBQUEsTUFDakQsR0FBRztBQUFBLE1BQ0gsR0FBRztBQUFBLE1BQ0gsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1A7QUFFQSxXQUFPLFFBQVEsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQy9DLFVBQUksT0FBTztBQUNULHVCQUFlLElBQUksR0FBRyxJQUFJLEtBQUs7QUFBQSxNQUNqQztBQUFBLElBQ0YsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3hETyxJQUFNLGtCQUFOLE1BQWtEO0FBQUEsRUFDdkQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBNkI7QUFDdkMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQ2hFLFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWTtBQUMxRCxRQUFJLE9BQU87QUFDVCxxQkFBZSxJQUFJLEtBQUs7QUFBQSxJQUMxQjtBQUNBLG1CQUFlLElBQUksS0FBSztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNuQk8sSUFBTSx3QkFBTixNQUF3RDtBQUFBLEVBQzdELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQW1DO0FBQzdDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxPQUFPLGVBQWUsSUFBSSxLQUFLO0FBQzdDLFdBQU8sSUFBSSxJQUFJLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLGNBQWM7QUFBQSxFQUN0RDtBQUNGOzs7QUNOTyxJQUFNLDBCQUFOLE1BQTBEO0FBQUEsRUFDL0QsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBcUM7QUFDL0MsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUksS0FBSztBQUNULFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLE9BQU8sU0FBUztBQUM5RixRQUFJLE9BQU87QUFDVCxxQkFBZSxPQUFPLEtBQUs7QUFBQSxJQUM3QixXQUFXLFdBQVc7QUFDcEIscUJBQWUsTUFBTSxTQUFTO0FBQzlCLFVBQUksa0JBQWtCO0FBQ3BCLHVCQUFlLE9BQU8sZ0JBQWdCO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDbENPLElBQU0saUNBQU4sTUFBaUU7QUFBQSxFQUN0RSxjQUFjO0FBQUEsRUFDZDtBQUFBLEVBRUEsWUFBWSxPQUE0QztBQUN0RCxTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSSxLQUFLO0FBQ1QsV0FBTyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLGVBQWUsSUFBSSxlQUFlLElBQUksS0FBSztBQUFBLEVBQ2hHO0FBQ0Y7OztBQ25CTyxJQUFNLHVCQUFOLE1BQXVEO0FBQUEsRUFDNUQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBa0M7QUFDNUMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLGFBQWEsUUFBUSxJQUNwRSxLQUFLO0FBQ1AsUUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxZQUFZO0FBQzFELFFBQUksT0FBTztBQUNULHFCQUFlLElBQUksS0FBSztBQUFBLElBQzFCO0FBQ0EsUUFBSSxhQUFhO0FBQ2YscUJBQWUsT0FBTyxXQUFXO0FBQ2pDLFVBQUksU0FBUztBQUNYLHVCQUFlLElBQUksT0FBTztBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ2hDTyxTQUFTLGlCQUFpQixZQUE0QjtBQUMzRCxNQUFJLGNBQWMsSUFBSyxRQUFPLEdBQUcsYUFBYSxHQUFHO0FBQ2pELE1BQUksY0FBYyxJQUFLLFFBQU8sR0FBRyxhQUFhLEdBQUc7QUFDakQsU0FBTyxXQUFXLFNBQVM7QUFDN0I7QUFFTyxTQUFTLGtCQUFrQixhQUE2QjtBQUM3RCxNQUFJLGVBQWUsS0FBTSxRQUFPLEdBQUcsY0FBYyxHQUFHO0FBQ3BELE1BQUksZUFBZSxLQUFNLFFBQU8sR0FBRyxjQUFjLEdBQUc7QUFDcEQsTUFBSSxlQUFlLEtBQU0sUUFBTyxHQUFHLGNBQWMsR0FBRztBQUNwRCxNQUFJLGVBQWUsTUFBTyxRQUFPLEdBQUcsY0FBYyxJQUFJO0FBQ3RELFNBQU8sWUFBWSxTQUFTO0FBQzlCO0FBRU8sU0FBUyxpQkFBaUIsWUFBNEI7QUFDM0QsTUFBSSxjQUFjLEVBQUcsUUFBTyxXQUFXLFNBQVM7QUFDaEQsTUFBSSxjQUFjLEtBQU0sUUFBTyxHQUFHLGFBQWEsR0FBRztBQUNsRCxNQUFJLGNBQWMsS0FBTSxRQUFPLEdBQUcsYUFBYSxHQUFHO0FBQ2xELE1BQUksY0FBYyxLQUFNLFFBQU8sR0FBRyxhQUFhLEdBQUc7QUFDbEQsTUFBSSxjQUFjLE1BQU8sUUFBTyxHQUFHLGFBQWEsSUFBSTtBQUNwRCxTQUFPLFdBQVcsU0FBUztBQUM3QjtBQUVPLFNBQVMsbUJBQW1CLE9BQTJCLFFBQWdCO0FBQzVFLE1BQUksQ0FBQyxNQUFPLFFBQU87QUFDbkIsUUFBTSxZQUFZLE1BQU0sUUFBUSxrQkFBa0IsR0FBRztBQUNyRCxNQUFJLENBQUMsVUFBVyxRQUFPO0FBQ3ZCLE1BQUksU0FBUyxLQUFLLFNBQVMsR0FBRztBQUM1QixXQUFPLEdBQUcsTUFBTSxJQUFJLFNBQVM7QUFBQSxFQUMvQjtBQUNBLFNBQU87QUFDVDtBQUVPLFNBQVMsa0NBQ2Qsa0JBQ0E7QUFDQSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhO0FBQ25CLFFBQU0sV0FBVztBQUNqQixRQUFNLFdBQVc7QUFFakIsTUFBSSxDQUFDLGtCQUFrQjtBQUNyQixXQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3pCO0FBRUEsUUFBTSxlQUFlLGlCQUFpQixpQkFBaUI7QUFDdkQsUUFBTSxXQUFXLGlCQUFpQixhQUFhO0FBQy9DLFFBQU0sVUFBVSxpQkFBaUI7QUFDakMsUUFBTSxxQkFBcUIsaUJBQWlCO0FBRTVDLFFBQU0sQ0FBQyxnQkFBZ0IsYUFBYSxJQUFJLGVBQ3BDLENBQUMsYUFBYSxVQUFVLElBQ3hCLENBQUMsWUFBWSxXQUFXO0FBRTVCLE1BQUksc0JBQXNCLHFCQUFxQixHQUFHO0FBQ2hELFVBQU0sU0FBUyxJQUFJO0FBQ25CLFVBQU0scUJBQ0osV0FBVyxVQUFVLFdBQVcsS0FBSyxJQUFJLFVBQVUsVUFBVSxNQUFNLElBQUk7QUFDekUsVUFBTSxhQUNKLHFCQUFxQixJQUFJLHFCQUFxQixLQUFLLElBQUksU0FBUyxHQUFHLElBQUk7QUFFekUsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLE1BQUksWUFBWSxVQUFhLFVBQVUsVUFBVTtBQUMvQyxVQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsVUFBVSxJQUFJO0FBQ3BELFVBQU0sU0FBUyxXQUFXLGFBQWE7QUFFdkMsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLE1BQUksV0FBVyxHQUFHO0FBQ2hCLFVBQU0sU0FBUyxXQUFXO0FBQzFCLFVBQU0sYUFBYSxLQUFLLElBQUksU0FBUyxHQUFHLElBQUk7QUFDNUMsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLFNBQU8sTUFBTSxlQUFlLGNBQWMsVUFBVTtBQUN0RDtBQUVPLFNBQVMscUJBQXFCLE9BQWU7QUFDbEQsTUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLEVBQUcsUUFBTyxHQUFHLEtBQUs7QUFDNUMsTUFBSSxVQUFVLEVBQUcsUUFBTztBQUV4QixRQUFNLFdBQVcsS0FBSyxJQUFJLEtBQUs7QUFFL0IsTUFBSSxZQUFZLE9BQU8sWUFBWSxNQUFNO0FBQ3ZDLFdBQU8sT0FBTyxNQUFNLGNBQWMsQ0FBQyxDQUFDLEVBQUUsU0FBUztBQUFBLEVBQ2pEO0FBRUEsU0FBTyxPQUFPLE1BQU0sWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTO0FBQy9DO0FBRU8sU0FBUyxzQkFBc0IsT0FBZTtBQUNuRCxNQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssRUFBRyxRQUFPLEdBQUcsS0FBSztBQUM1QyxNQUFJLFVBQVUsRUFBRyxRQUFPO0FBRXhCLFFBQU0sUUFBUTtBQUFBLElBQ1osQ0FBQyxLQUFLLElBQUk7QUFBQSxJQUNWLENBQUMsS0FBSyxHQUFHO0FBQUEsSUFDVCxDQUFDLE9BQU8sR0FBRztBQUFBLElBQ1gsQ0FBQyxLQUFLLEdBQUc7QUFBQSxJQUNULENBQUMsS0FBSyxJQUFJO0FBQUEsSUFDVixDQUFDLEtBQUssSUFBSTtBQUFBLElBQ1YsQ0FBQyxLQUFLLElBQUk7QUFBQSxJQUNWLENBQUMsS0FBSyxLQUFLO0FBQUEsRUFDYjtBQUVBLGFBQVcsQ0FBQyxRQUFRLFVBQVUsS0FBSyxPQUFPO0FBQ3hDLFVBQU0sU0FBUyxRQUFRO0FBQ3ZCLFFBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksWUFBWTtBQUNqRSxZQUFNLFVBQVUsT0FBTyxPQUFPLFlBQVksQ0FBQyxDQUFDO0FBQzVDLFVBQUksS0FBSyxJQUFJLFVBQVUsYUFBYSxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNO0FBQ3BFLGVBQU8sR0FBRyxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLHFCQUFxQixLQUFLO0FBQ25DOzs7QUNwSE8sSUFBTSx3QkFBd0IsQ0FBQztBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUNGLE1BRzZCO0FBQzNCLE1BQUksZ0JBQWdCLGFBQWEsVUFBVSxXQUFXO0FBQ3BELFVBQU0sY0FBYyxJQUFJLGdCQUFnQjtBQUFBLE1BQ3RDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLGNBQWMsTUFBTSxDQUFDLEtBQUs7QUFBQSxNQUMxQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsT0FBTyxpQkFBaUIsVUFBVSxVQUFvQjtBQUFBLElBQ3hELENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLGFBQWEsS0FBSztBQUFBLEVBQ3hFO0FBQ0EsU0FBTztBQUNUOzs7QUNWTyxJQUFNLHNCQUFzQixDQUFDO0FBQUEsRUFDbEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUs2QjtBQUMzQixRQUFNLGdCQUFnQjtBQUFBLElBQ3BCLFVBQVUsUUFBUSxVQUFVO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQ0EsUUFBTSxlQUFlLE1BQU0sQ0FBQyxLQUFLO0FBQ2pDLFFBQU0sZUFBZSxNQUFNLENBQUMsS0FBSztBQUNqQyxRQUFNLGNBQWMsU0FBUyxhQUFhO0FBQzFDLFFBQU0sWUFBWSxNQUFNLGFBQWE7QUFFckMsUUFBTSw2QkFBNkIsb0JBQW9CO0FBQUEsSUFDckQsVUFBVTtBQUFBLEVBQ1o7QUFFQSxRQUFNLGVBQWU7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQVksSUFBSSwrQkFBK0I7QUFBQSxJQUNuRCxNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLElBQ2pCLGlCQUFpQjtBQUFBLElBQ2pCLE9BQU87QUFBQSxFQUNULENBQUM7QUFFRCxNQUFJLENBQUMsUUFBUSxPQUFPLElBQUksU0FBUyxHQUFHO0FBQ2xDLFlBQVEsT0FBTztBQUFBLE1BQ2I7QUFBQSxNQUNBLFVBQVUsU0FBUztBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUVBLFFBQU0sb0JBQW9CLFFBQVEsYUFBYTtBQUMvQyxRQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLElBQ2hELE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLGNBQWM7QUFBQSxJQUNkLE9BQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQSxDQUFDLGFBQWEsR0FBRztBQUFBLEVBQ25CO0FBRUEsVUFBUSxhQUFhLGdCQUFnQjtBQUVyQyxTQUFPLElBQUksZUFBZSxlQUFlLFdBQVc7QUFBQSxJQUNsRDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNIOzs7QUN6RU8sSUFBTSx5QkFBeUIsQ0FBQztBQUFBLEVBQ3JDO0FBQUEsRUFDQTtBQUNGLE1BRzZCO0FBQzNCLE1BQUksaUJBQWlCLGFBQWEsVUFBVSxXQUFXO0FBQ3JELFVBQU0sZUFBZSxJQUFJLGlCQUFpQjtBQUFBLE1BQ3hDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLGNBQWMsTUFBTSxDQUFDLEtBQUs7QUFBQSxNQUMxQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsT0FBTyxrQkFBa0IsVUFBVSxXQUFxQjtBQUFBLElBQzFELENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLGNBQWMsS0FBSztBQUFBLEVBQ3pFO0FBQ0EsU0FBTztBQUNUOzs7QUNiQSxJQUFNLGdCQUFnQixDQUNwQixnQkFDQSxZQUNHO0FBQ0gsUUFBTSxZQUFZLGVBQWU7QUFBQSxJQUMvQixDQUFDLE1BQU0sRUFBRSxNQUFNLFlBQVksTUFBTSxXQUFXLEVBQUUsWUFBWSxTQUFTLE9BQU87QUFBQSxFQUM1RTtBQUNBLFFBQU0sY0FBYyxlQUFlO0FBQUEsSUFDakMsQ0FBQyxNQUNDLEVBQUUsTUFBTSxZQUFZLE1BQU0sYUFBYSxFQUFFLFlBQVksU0FBUyxTQUFTO0FBQUEsRUFDM0U7QUFFQSxTQUFPO0FBQUEsSUFDTCxjQUFjLFFBQVEsSUFBSSxXQUFXLGtCQUFrQixFQUFFLEtBQUs7QUFBQSxJQUM5RCxjQUFjLFFBQVEsSUFBSSxhQUFhLGtCQUFrQixFQUFFLEtBQUs7QUFBQSxFQUNsRTtBQUNGO0FBRUEsSUFBTSw0QkFBNEIsQ0FBQztBQUFBLEVBQ2pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQU82QjtBQUMzQixNQUFJLFVBQVUsV0FBVztBQUN2QixVQUFNLEVBQUUsY0FBYyxhQUFhLElBQUk7QUFBQSxNQUNyQztBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLElBQUksYUFBYTtBQUFBLE1BQ2hDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUNELFlBQVEsT0FBTyxJQUFJLFdBQVcsZUFBZTtBQUM3QyxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLFVBQVU7QUFBQSxNQUM1RDtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUO0FBRU8sSUFBTSxxQkFBcUIsQ0FBQztBQUFBLEVBQ2pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsU0FBTywwQkFBMEI7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsaUJBQWlCO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBRU8sSUFBTSxtQkFBbUIsQ0FBQztBQUFBLEVBQy9CO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsU0FBTywwQkFBMEI7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsaUJBQ0U7QUFBQSxFQUNKLENBQUM7QUFDSDs7O0FDbkdPLElBQU0sd0JBQXdCLENBQUM7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFDRixNQUc2QjtBQUMzQixNQUFJLGdCQUFnQixhQUFhLFVBQVUsV0FBVztBQUNwRCxVQUFNLGNBQWMsSUFBSSxnQkFBZ0I7QUFBQSxNQUN0QyxNQUFNLFVBQVU7QUFBQSxNQUNoQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsY0FBYyxNQUFNLENBQUMsS0FBSztBQUFBLE1BQzFCLE9BQU8saUJBQWlCLFVBQVUsVUFBb0I7QUFBQSxJQUN4RCxDQUFDO0FBQ0QsV0FBTyxJQUFJLGVBQWUsVUFBVSxNQUFnQixhQUFhLEtBQUs7QUFBQSxFQUN4RTtBQUNBLFNBQU87QUFDVDs7O0FDakJPLElBQU0sc0JBQXNCLENBQUM7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLE1BSzZCO0FBQzNCLE1BQUksVUFBVSxXQUFXO0FBQ3ZCLFVBQU0sWUFBWSxlQUFlO0FBQUEsTUFDL0IsQ0FBQyxNQUNDLEVBQUUsTUFBTSxZQUFZLE1BQU0sV0FBVyxFQUFFLFlBQVksU0FBUyxPQUFPO0FBQUEsSUFDdkU7QUFDQSxVQUFNLFdBQVcsZUFBZTtBQUFBLE1BQzlCLENBQUMsTUFBTSxFQUFFLE1BQU0sWUFBWSxNQUFNLFVBQVUsRUFBRSxZQUFZLFNBQVMsTUFBTTtBQUFBLElBQzFFO0FBQ0EsVUFBTSxhQUFhLGVBQWU7QUFBQSxNQUNoQyxDQUFDLE1BQ0MsRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLEVBQUUsWUFBWSxTQUFTLFFBQVE7QUFBQSxJQUN6RTtBQUVBLFVBQU0sWUFBWSxRQUFRLElBQUksV0FBVyxrQkFBa0IsRUFBRSxLQUFLO0FBQ2xFLFVBQU0sV0FBVyxRQUFRLElBQUksVUFBVSxrQkFBa0IsRUFBRSxLQUFLO0FBQ2hFLFVBQU0sYUFBYSxRQUFRLElBQUksWUFBWSxrQkFBa0IsRUFBRSxLQUFLO0FBR3BFLFVBQU0sZ0JBQWdCO0FBRXRCLFVBQU0sZUFBZSxVQUFVLGdCQUFnQjtBQUMvQyxVQUFNLGNBQWMsVUFBVSxlQUFlO0FBRTdDLFVBQU0sWUFBWSxHQUFHLGFBQWEsWUFBWSxDQUFDO0FBQy9DLFVBQU0sWUFBWSxHQUFHLFNBQVMsSUFBSSxZQUFZLFlBQVksQ0FBQztBQUUzRCxRQUFJLENBQUMsUUFBUSxPQUFPLElBQUksU0FBUyxHQUFHO0FBQ2xDLFVBQUksZ0JBQWdCLGVBQWU7QUFDakMsY0FBTSxNQUFNLGlCQUFpQixNQUFNLEtBQUs7QUFDeEMsZ0JBQVEsT0FBTztBQUFBLFVBQ2I7QUFBQSxVQUNBLFVBQVUsU0FBUyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQUEsUUFDOUM7QUFBQSxNQUNGLE9BQU87QUFDTCxnQkFBUSxPQUFPO0FBQUEsVUFDYjtBQUFBLFVBQ0EsVUFBVSxTQUFTLElBQUksU0FBUztBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQVksSUFBSSxjQUFjO0FBQUEsTUFDbEMsTUFBTSxVQUFVO0FBQUEsTUFDaEIsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUVELFdBQU8sSUFBSSxlQUFlLFVBQVUsTUFBZ0IsV0FBVztBQUFBLE1BQzdEO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUOzs7QUNwRU8sSUFBTSwwQkFBMEIsQ0FBQztBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsTUFBSSxVQUFVLFdBQVc7QUFDdkIsVUFBTSxnQkFBZ0IsZUFBZTtBQUFBLE1BQ25DLENBQUMsTUFDQyxFQUFFLE1BQU0sWUFBWSxNQUFNLGVBQzFCLEVBQUUsWUFBWSxTQUFTLFdBQVc7QUFBQSxJQUN0QztBQUNBLFVBQU0sV0FBVyxlQUFlO0FBQUEsTUFDOUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxZQUFZLE1BQU0sVUFBVSxFQUFFLFlBQVksU0FBUyxNQUFNO0FBQUEsSUFDMUU7QUFDQSxVQUFNLGNBQWMsZUFBZTtBQUFBLE1BQ2pDLENBQUMsTUFDQyxFQUFFLE1BQU0sWUFBWSxNQUFNLGFBQzFCLEVBQUUsWUFBWSxTQUFTLFNBQVM7QUFBQSxJQUNwQztBQUVBLFFBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsYUFBYTtBQUMvQyxZQUFNLElBQUk7QUFBQSxRQUNSLGNBQWMsVUFBVSxJQUFJO0FBQUEsTUFDOUI7QUFBQSxJQUNGO0FBRUEsVUFBTSxnQkFBZ0IsUUFBUSxJQUFJLGNBQWMsY0FBYyxLQUFLO0FBQ25FLFVBQU0sV0FBVyxRQUFRLElBQUksU0FBUyxjQUFjLEtBQUs7QUFDekQsVUFBTSxjQUFjLFFBQVEsSUFBSSxZQUFZLGNBQWMsS0FBSztBQUUvRCxVQUFNLGtCQUFrQixVQUFVLG1CQUFtQjtBQUNyRCxVQUFNLFlBQVksZ0JBQWdCLFlBQVk7QUFDOUMsUUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLFNBQVMsR0FBRztBQUNsQyxjQUFRLE9BQU87QUFBQSxRQUNiO0FBQUEsUUFDQSxVQUFVLFNBQVMsSUFBSSxnQkFBZ0IsWUFBWSxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxTQUFTLElBQUksV0FBVztBQUFBLE1BQzVCLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLFdBQVc7QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULE9BQU87QUFBQSxJQUNULENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLFFBQVE7QUFBQSxNQUMxRDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU87QUFDVDs7O0FDMURPLElBQU0sa0NBQWtDLENBQzdDLFNBQ0EsMEJBQ0EsWUFDRztBQUNILGFBQVcsYUFBYSwwQkFBMEI7QUFDaEQsUUFBSSxVQUFVLFNBQVMsNEJBQTZCO0FBRXBELFFBQUksVUFBVSxpQkFBaUIsT0FBTztBQUVwQyxVQUNFLDhCQUE4QixhQUM5Qiw4QkFBOEIsYUFDOUIsVUFBVSw0QkFDVixVQUFVLDBCQUNWO0FBQ0EsY0FBTSxlQUNKLFFBQVEsSUFBSSxVQUFVLHdCQUF3QixLQUFLO0FBQ3JELGNBQU0sZUFDSixRQUFRLElBQUksVUFBVSx3QkFBd0IsS0FBSztBQUVyRCxZQUFJLFFBQVE7QUFDWixjQUFNLGFBQWEsVUFBVTtBQUM3QixZQUFJLGVBQWUsWUFBWTtBQUM3QixnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFNBQVMsVUFBVSxXQUFXO0FBQ3BDLGdCQUFNLE9BQU8sVUFBVSxhQUFhO0FBQ3BDLGdCQUFNLFFBQVE7QUFDZCxnQkFBTSxpQkFBaUI7QUFDdkIsZ0JBQU0sUUFBUSxVQUFVLFNBQVM7QUFDakMsY0FBSSxPQUFPLEdBQUc7QUFDWixvQkFBUSxPQUFPLFFBQVEsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxjQUFjLElBQUksS0FBSztBQUFBLFVBQy9FLE9BQU87QUFDTCxvQkFBUSxNQUFNLFVBQVUsV0FBVyxDQUFDO0FBQUEsVUFDdEM7QUFBQSxRQUNGLFdBQVcsZUFBZSxVQUFVO0FBQ2xDLGdCQUFNLFlBQVk7QUFDbEIsZ0JBQU0sV0FBVyxVQUFVLFdBQVc7QUFDdEMsZ0JBQU0sT0FBTyxVQUFVLGFBQWE7QUFDcEMsZ0JBQU0sbUJBQW1CLFNBQVMsSUFBSSxXQUFXLElBQUk7QUFDckQsZ0JBQU0sb0JBQW9CLFVBQVUsV0FBVztBQUMvQyxnQkFBTSx3QkFBd0IsVUFBVSxnQkFBZ0I7QUFDeEQsZ0JBQU0sU0FBUyxvQkFDWCxVQUFVLFNBQVUsTUFDcEI7QUFDSixnQkFBTSxhQUFhLFVBQVUsY0FBYztBQUMzQyxnQkFBTSxjQUFjLFNBQVM7QUFDN0IsZ0JBQU0sUUFDSixVQUFVLGdCQUFnQixTQUN0QixVQUFVLGNBQWMsTUFDeEI7QUFDTixnQkFBTSxZQUNKLFVBQVUsY0FBYyxTQUNwQixzQkFBc0IsVUFBVSxZQUFZLEdBQUksSUFDaEQ7QUFDTixnQkFBTSxZQUNKLFVBQVUsY0FBYyxTQUNwQixzQkFBc0IsVUFBVSxZQUFZLEdBQUksSUFDaEQ7QUFDTixnQkFBTSxpQkFBaUIsd0JBQ25CLHNCQUFzQixVQUFVLGNBQWUsR0FBSSxJQUNuRCxzQkFBc0IsV0FBVztBQUNyQyxnQkFBTSxhQUFhLHNCQUFzQixNQUFNO0FBQy9DLGtCQUFRLFNBQVMsU0FBUyxJQUFJLFFBQVEsSUFBSSxzQkFBc0IsS0FBSyxDQUFDLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxjQUFjLElBQUksVUFBVTtBQUFBLFFBQ2xJLFdBQVcsVUFBVSxZQUFZLFFBQVc7QUFDMUMsa0JBQVEsTUFBTSxVQUFVLE9BQU87QUFBQSxRQUNqQztBQUVBLFlBQUksT0FBTztBQUNULGdCQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLFlBQ2hELE1BQU0sVUFBVTtBQUFBLFlBQ2hCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFFRCxnQkFBTSxpQkFBaUIsSUFBSTtBQUFBLFlBQ3pCLFVBQVU7QUFBQSxZQUNWO0FBQUEsWUFDQSxDQUFDLGNBQWMsWUFBWTtBQUFBLFVBQzdCO0FBQ0Esa0JBQVEsYUFBYSxjQUFjO0FBQUEsUUFDckM7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUFPO0FBRUwsWUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxZQUFNLGlCQUFpQixVQUFVO0FBRWpDLFVBQ0Usa0JBQ0Esa0JBQ0EsYUFBYSxhQUNiLFVBQVUsWUFBWSxRQUN0QjtBQUNBLGNBQU0sZUFBZSxRQUFRLElBQUksY0FBYyxLQUFLO0FBQ3BELGNBQU0sZUFBZSxRQUFRLElBQUksY0FBYyxLQUFLO0FBRXBELGNBQU0sbUJBQW1CLElBQUkscUJBQXFCO0FBQUEsVUFDaEQsTUFBTSxVQUFVO0FBQUEsVUFDaEI7QUFBQSxVQUNBO0FBQUEsVUFDQSxPQUFPLE1BQU8sVUFBa0IsT0FBTztBQUFBLFFBQ3pDLENBQUM7QUFFRCxjQUFNLGlCQUFpQixJQUFJO0FBQUEsVUFDekIsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBLENBQUMsY0FBYyxZQUFZO0FBQUEsUUFDN0I7QUFDQSxnQkFBUSxhQUFhLGNBQWM7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQ25ITyxJQUFNLGtDQUFrQyxDQUM3QyxTQUNBLDBCQUNBLFlBQ0c7QUFDSCxhQUFXLGFBQWEsMEJBQTBCO0FBQ2hELFFBQUksVUFBVSxTQUFTLDRCQUE2QjtBQUVwRCxRQUFJLFVBQVUsaUJBQWlCLE9BQU87QUFFcEMsWUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxZQUFNLGlCQUFpQixVQUFVO0FBRWpDLFVBQUksa0JBQWtCLGdCQUFnQjtBQUNwQyxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUNwRCxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUVwRCxZQUFJLFFBQVE7QUFDWixjQUFNLGFBQWEsVUFBVTtBQUM3QixZQUFJLGVBQWUsWUFBWTtBQUM3QixnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFVBQVUsVUFBVSx3QkFBd0IsS0FBSztBQUN2RCxnQkFBTSxPQUFPLFVBQVUsYUFBYTtBQUNwQyxnQkFBTSxRQUFRO0FBQ2QsZ0JBQU0saUJBQWlCO0FBQ3ZCLGdCQUFNLFFBQVEsVUFBVSxTQUFTO0FBQ2pDLGNBQUksT0FBTyxHQUFHO0FBQ1osb0JBQVEsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksY0FBYyxJQUFJLEtBQUs7QUFBQSxVQUMvRSxPQUFPO0FBQ0wsb0JBQVEsTUFBTSxNQUFNO0FBQUEsVUFDdEI7QUFBQSxRQUNGLFdBQVcsZUFBZSxVQUFVO0FBQ2xDLGdCQUFNLFlBQVk7QUFDbEIsZ0JBQU0sV0FBVyxVQUFVLHdCQUF3QjtBQUNuRCxnQkFBTSxPQUFPLFVBQVUsYUFBYTtBQUNwQyxnQkFBTSxtQkFBbUIsU0FBUyxJQUFJLFdBQVcsSUFBSTtBQUNyRCxnQkFBTSxTQUFTO0FBQ2YsZ0JBQU0sYUFBYSxVQUFVLGNBQWM7QUFDM0MsZ0JBQU0sY0FBYyxTQUFTO0FBQzdCLGdCQUFNLFFBQVE7QUFDZCxnQkFBTSxZQUFZO0FBQ2xCLGdCQUFNLFlBQVk7QUFDbEIsa0JBQVEsU0FBUyxTQUFTLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFdBQVcsSUFBSSxNQUFNO0FBQUEsUUFDcEc7QUFFQSxZQUFJLE9BQU87QUFDVCxnQkFBTSxtQkFBbUIsSUFBSSxxQkFBcUI7QUFBQSxZQUNoRCxNQUFNLFVBQVU7QUFBQSxZQUNoQjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBRUQsZ0JBQU0saUJBQWlCLElBQUk7QUFBQSxZQUN6QixVQUFVO0FBQUEsWUFDVjtBQUFBLFlBQ0EsQ0FBQyxjQUFjLFlBQVk7QUFBQSxVQUM3QjtBQUNBLGtCQUFRLGFBQWEsY0FBYztBQUFBLFFBQ3JDO0FBQUEsTUFDRjtBQUFBLElBQ0YsT0FBTztBQUVMLFlBQU0saUJBQWlCLFVBQVU7QUFDakMsWUFBTSxpQkFBaUIsVUFBVTtBQUVqQyxVQUNFLGtCQUNBLGtCQUNBLGFBQWEsYUFDYixVQUFVLFlBQVksUUFDdEI7QUFDQSxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUNwRCxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUVwRCxjQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLFVBQ2hELE1BQU0sVUFBVTtBQUFBLFVBQ2hCO0FBQUEsVUFDQTtBQUFBLFVBQ0EsT0FBTyxNQUFNLFVBQVUsT0FBTztBQUFBLFFBQ2hDLENBQUM7QUFFRCxjQUFNLGlCQUFpQixJQUFJO0FBQUEsVUFDekIsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBLENBQUMsY0FBYyxZQUFZO0FBQUEsUUFDN0I7QUFDQSxnQkFBUSxhQUFhLGNBQWM7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQ3hGQSxJQUFNLG1CQUFtQixDQUFDLFVBQVUsVUFBVSxVQUFVLE9BQU87QUFVeEQsSUFBTSw4QkFBOEIsQ0FDekMsU0FDQSxlQUNBLGtCQUNBLGNBQ0EsWUFDRztBQUNILE1BQUksQ0FBQyxjQUFlO0FBRXBCLFFBQU0sZUFBZSxjQUFjO0FBQ25DLE1BQUksY0FBYztBQUNoQixVQUFNLGNBQWMsaUJBQ2pCLElBQUksQ0FBQyxRQUFRO0FBQ1osWUFBTSxRQUFRLGFBQWEsR0FBRztBQUM5QixhQUFPLFVBQVUsU0FBWSxPQUFPLEdBQUcsR0FBRyxJQUFJLEtBQUs7QUFBQSxJQUNyRCxDQUFDLEVBQ0EsT0FBTyxDQUFDLFNBQXlCLFNBQVMsSUFBSTtBQUVqRCxRQUFJLFlBQVksU0FBUyxHQUFHO0FBQzFCLGNBQVEsaUJBQWlCLEtBQUssWUFBWSxZQUFZLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFBQSxJQUNuRTtBQUFBLEVBQ0Y7QUFHQSxNQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFDL0IsVUFBTSxlQUFlLG9CQUFJLElBQVk7QUFDckMsVUFBTSxzQkFBNEMsQ0FBQztBQUVuRCxVQUFNLHFCQUFxQixDQUFDLFVBQWtCO0FBQzVDLFlBQU0sUUFBUSxhQUFhO0FBQUEsUUFBSyxDQUFDLE1BQy9CLEVBQUUseUJBQXlCLFNBQVMsS0FBSztBQUFBLE1BQzNDO0FBQ0EsYUFBTyxPQUFPLDBCQUEwQixDQUFDO0FBQUEsSUFDM0M7QUFFQSxlQUFXLFNBQVMsa0JBQWtCO0FBQ3BDLFVBQUksZUFBZSxNQUFNO0FBQ3pCLFVBQUksQ0FBQyxjQUFjO0FBQ2pCLGNBQU0sY0FBYyxNQUFNO0FBQzFCLFlBQUksYUFBYTtBQUNmLHlCQUFlLG1CQUFtQixXQUFXO0FBQUEsUUFDL0M7QUFBQSxNQUNGO0FBRUEsVUFBSSxDQUFDLGFBQWM7QUFFbkIsWUFBTSxpQkFBaUIsUUFBUSxJQUFJLFlBQVk7QUFDL0MsVUFBSSxDQUFDLGVBQWdCO0FBRXJCLFVBQUksa0JBQWtCLE1BQU07QUFDNUIsVUFBSSxDQUFDLG1CQUFtQixNQUFNLCtCQUErQjtBQUMzRCwwQkFBa0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLGlCQUFpQjtBQUNuQixjQUFNLG9CQUFvQixRQUFRLElBQUksZUFBZTtBQUNyRCxZQUFJLHFCQUFxQixzQkFBc0IsS0FBSztBQUNsRCxnQkFBTSxjQUFjLEtBQUssY0FBYyxJQUFJLGlCQUFpQjtBQUM1RCx1QkFBYSxJQUFJLFdBQVc7QUFDNUIsOEJBQW9CLEtBQUs7QUFBQSxZQUN2Qiw2QkFBNkIsTUFBTTtBQUFBLFlBQ25DLE1BQU0sTUFBTTtBQUFBLFlBQ1osY0FBYztBQUFBLFlBQ2Qsa0JBQWtCO0FBQUEsWUFDbEIscUJBQXFCO0FBQUEsVUFDdkIsQ0FBQztBQUFBLFFBQ0gsV0FBVyxtQkFBbUIsS0FBSztBQUNqQyxnQkFBTSxjQUFjLEtBQUssY0FBYztBQUN2Qyx1QkFBYSxJQUFJLFdBQVc7QUFDNUIsOEJBQW9CLEtBQUs7QUFBQSxZQUN2Qiw2QkFBNkIsTUFBTTtBQUFBLFlBQ25DLE1BQU0sTUFBTTtBQUFBLFlBQ1osY0FBYztBQUFBLFlBQ2Qsa0JBQWtCO0FBQUEsWUFDbEIscUJBQXFCO0FBQUEsVUFDdkIsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGLE9BQU87QUFFTCxZQUFJLG1CQUFtQixLQUFLO0FBQzFCLGdCQUFNLGNBQWMsS0FBSyxjQUFjO0FBQ3ZDLHVCQUFhLElBQUksV0FBVztBQUM1Qiw4QkFBb0IsS0FBSztBQUFBLFlBQ3ZCLDZCQUE2QixNQUFNO0FBQUEsWUFDbkMsTUFBTSxNQUFNO0FBQUEsWUFDWixjQUFjO0FBQUEsWUFDZCxrQkFBa0I7QUFBQSxVQUNwQixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsUUFDRSxhQUFhLE9BQU8sS0FDcEIsY0FBYyxpQkFBaUIsU0FBUyxXQUFXLEdBQ25EO0FBQ0EsaUJBQVcsV0FBVyxxQkFBcUI7QUFDekMsZ0JBQVEsaUJBQWlCO0FBQUEsVUFDdkIscUJBQXFCLEtBQUssVUFBVSxPQUFPLENBQUM7QUFBQSxRQUM5QztBQUFBLE1BQ0Y7QUFDQSxZQUFNLGVBQWUsQ0FBQyxHQUFHLFlBQVksRUFBRSxLQUFLLEdBQUc7QUFDL0MsY0FBUSxnQkFBZ0IsS0FBSyxlQUFlLFlBQVksRUFBRTtBQUMxRCxjQUFRLGVBQWUsS0FBSyxTQUFTLFlBQVksRUFBRTtBQUFBLElBQ3JEO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxjQUFjO0FBQ2xDLFFBQU0sVUFBVSxjQUFjO0FBQzlCLFFBQU0sY0FBYyxjQUFjO0FBRWxDLE1BQUksZUFBZSxTQUFTO0FBRTFCLFVBQU0sYUFBYSxlQUFlLEtBQUs7QUFFdkMsUUFBSSxVQUFVLFNBQVM7QUFBQSxNQUNyQixjQUFjO0FBQUEsSUFDaEIsQ0FBQyxJQUFJLHFCQUFxQixVQUFVLEdBQUksQ0FBQztBQUN6QyxRQUFJLFlBQVksR0FBRztBQUNqQixpQkFBVyxJQUFJLHFCQUFxQixTQUFTLENBQUM7QUFBQSxJQUNoRDtBQUNBLGVBQVc7QUFDWCxZQUFRLGNBQWM7QUFBQSxFQUN4QjtBQUNGOzs7QUMzSUEsSUFBTSx3QkFBd0I7QUFDOUIsSUFBTSw4QkFBOEI7QUFBQSxVQUMxQixxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBUXZCLHFCQUFxQjtBQUFBLEVBQzNCLEtBQUs7QUFFQSxJQUFNLDBCQUEwQixDQUNyQyxTQUNBLGtCQUNBLFlBQ0c7QUFDSCxNQUFJLGlCQUFpQixXQUFXLEVBQUc7QUFFbkMsTUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLHFCQUFxQixHQUFHO0FBQzlDLFlBQVEsT0FBTyxJQUFJLHVCQUF1QiwyQkFBMkI7QUFBQSxFQUN2RTtBQUVBLGFBQVcsWUFBWSxrQkFBa0I7QUFDdkMsUUFBSSxTQUFTLFNBQVMsb0JBQXFCO0FBRTNDLFVBQU0sd0JBQ0osUUFBUSxJQUFJLFNBQVMsa0NBQWtDLEtBQUs7QUFDOUQsVUFBTSxxQkFDSixRQUFRLElBQUksU0FBUyw4QkFBOEIsS0FBSztBQUMxRCxVQUFNLGFBQWEsUUFBUSxJQUFJLFNBQVMscUJBQXFCLEtBQUs7QUFDbEUsVUFBTSxxQkFDSixRQUFRLElBQUksU0FBUyw4QkFBOEIsS0FBSztBQUMxRCxVQUFNLHFCQUNKLFFBQVEsSUFBSSxTQUFTLDhCQUE4QixLQUFLO0FBRTFELFVBQU0sUUFBUTtBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVBLFVBQU0sV0FBVyxJQUFJLHNCQUFzQjtBQUFBLE1BQ3pDLE1BQU0sU0FBUztBQUFBLE1BQ2Y7QUFBQSxNQUNBLGdCQUFnQjtBQUFBLElBQ2xCLENBQUM7QUFFRCxVQUFNLGlCQUFpQixJQUFJO0FBQUEsTUFDekIsU0FBUztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUNBLFlBQVEsYUFBYSxjQUFjO0FBQUEsRUFDckM7QUFDRjs7O0FDMURPLFNBQVMsaUJBQ2QsUUFDa0Q7QUFDbEQsUUFBTSxPQUFPLE9BQ1YsTUFBTSxPQUFPLEVBQ2IsSUFBSSxDQUFDQSxVQUFTQSxNQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLENBQUNBLFVBQVMsZ0JBQWdCLEtBQUtBLEtBQUksQ0FBQztBQUU1QyxNQUFJLENBQUMsS0FBTSxRQUFPO0FBRWxCLFFBQU0sU0FBUyxLQUFLLE1BQU0sS0FBSztBQUMvQixRQUFNLFlBQVksT0FBTyxDQUFDO0FBQzFCLFFBQU0sV0FBVyxPQUFPLE1BQU0sQ0FBQztBQUUvQixNQUFJLENBQUMsYUFBYSxTQUFTLFdBQVcsRUFBRyxRQUFPO0FBQ2hELFNBQU8sRUFBRSxXQUFXLFNBQVM7QUFDL0I7QUFFTyxTQUFTLGtDQUNkLFNBQ0EsNEJBQ0EsU0FDQTtBQUNBLE1BQUksMkJBQTJCLFdBQVcsRUFBRztBQUU3QyxhQUFXLDZCQUE2Qiw0QkFBNEI7QUFDbEUsVUFBTSxlQUFlO0FBQUEsTUFDbkIsMEJBQTBCO0FBQUEsSUFDNUI7QUFFQSxRQUFJLENBQUMsYUFBYztBQUVuQixVQUFNLEVBQUUsV0FBVyxTQUFTLElBQUk7QUFFaEMsUUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLFNBQVMsR0FBRztBQUNsQyxjQUFRLE9BQU8sSUFBSSxXQUFXLDBCQUEwQixpQkFBaUI7QUFBQSxJQUMzRTtBQUVBLFVBQU0sUUFBUSxTQUFTLElBQUksQ0FBQyxpQkFBaUI7QUFDM0MsWUFBTSxlQUNKLDBCQUEwQiw2QkFBNkIsWUFBWTtBQUNyRSxhQUFPLFFBQVEsSUFBSSxZQUFZLEtBQUs7QUFBQSxJQUN0QyxDQUFDO0FBRUQsVUFBTSx3QkFBd0IsSUFBSSxzQkFBc0I7QUFBQSxNQUN0RCxNQUFNLDBCQUEwQjtBQUFBLE1BQ2hDO0FBQUEsTUFDQSxnQkFBZ0I7QUFBQSxJQUNsQixDQUFDO0FBRUQsWUFBUTtBQUFBLE1BQ04sSUFBSTtBQUFBLFFBQ0YsMEJBQTBCO0FBQUEsUUFDMUI7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBMUJsQ08sU0FBUyxtQkFDZCxhQUNjO0FBQ2QsUUFBTSxVQUFVLElBQUksYUFBYSxpQ0FBaUM7QUFDbEUsUUFBTSxtQkFBbUIsR0FBRyxXQUFXLEVBQUUsaUJBQWlCLEtBQUs7QUFDL0QsUUFBTSxjQUFjLEdBQUcsV0FBVyxFQUFFLFlBQVksS0FBSztBQUNyRCxRQUFNLGVBQWUsR0FBRyxXQUFXLEVBQUUsYUFBYSxLQUFLO0FBQ3ZELFFBQU0sbUJBQW1CLFlBQVk7QUFBQSxJQUNuQyxDQUFDLFFBQVEsSUFBSSxTQUFTO0FBQUEsRUFDeEI7QUFDQSxRQUFNLHFCQUFxQixZQUN4QjtBQUFBLElBQ0MsQ0FBQyxZQUFhLFFBQThCLFNBQVM7QUFBQSxFQUN2RCxFQUNDLElBQUksQ0FBQyxZQUFZLE9BQXNDO0FBQzFELFFBQU0sbUJBQW1CLFlBQVk7QUFBQSxJQUNuQyxDQUFDLFFBQVEsSUFBSSxTQUFTO0FBQUEsRUFDeEI7QUFDQSxRQUFNLDZCQUE2QixZQUFZO0FBQUEsSUFDN0MsQ0FBQyxRQUFRLElBQUksU0FBUztBQUFBLEVBQ3hCO0FBQ0EsUUFBTSxzQkFBc0Isb0JBQUksSUFBOEI7QUFFOUQsYUFBVyxhQUFhLG9CQUFvQjtBQUMxQyxRQUFJLFVBQVUscUJBQXFCO0FBQ2pDLDBCQUFvQixJQUFJLFVBQVUscUJBQXFCLFNBQVM7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsNENBQTRDLFdBQVc7QUFHdkUsUUFBTSxVQUFVLG9CQUFJLElBQW9CO0FBQ3hDLFFBQU0sZ0JBQWdCLG9CQUFJLElBQW9CO0FBQzlDLE1BQUksY0FBYztBQUVsQixRQUFNLGFBQWEsb0JBQUksSUFBWTtBQUNuQyxNQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFDL0IsZUFBVyxTQUFTLGtCQUFrQjtBQUNwQyxVQUFJLE1BQU0sTUFBTTtBQUNkLG1CQUFXLElBQUksTUFBTSxJQUFJO0FBQUEsTUFDM0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUdBLFFBQU0sb0JBQW9CLENBQUMsR0FBRyxVQUFVLEVBQ3JDLElBQUksQ0FBQyxTQUFTLFlBQVksS0FBSyxJQUFJLENBQUMsRUFDcEMsT0FBTyxDQUFDLE1BQTRCLE1BQU0sSUFBSSxFQUM5QyxJQUFJLENBQUMsTUFBTSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUVoQyxNQUFJLGtCQUFrQixTQUFTLEdBQUc7QUFDaEMsa0JBQWMsS0FBSyxJQUFJLEdBQUcsaUJBQWlCLElBQUk7QUFBQSxFQUNqRDtBQUVBLFFBQU0sYUFBYSxvQkFBSSxJQUFZO0FBR25DLFFBQU0sa0JBQWtCLElBQUk7QUFBQSxJQUMxQixHQUFHLFdBQVcsRUFDWCxXQUFXLEtBQUssRUFDaEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLFlBQVksRUFBRSxTQUFTLEtBQUssQ0FBQyxFQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWE7QUFBQSxFQUNqQztBQUVBLE1BQUksZ0JBQWdCLE9BQU8sR0FBRztBQUM1QixlQUFXLFNBQVMsR0FBRyxXQUFXLEVBQUUsYUFBYSxLQUFLLEdBQUc7QUFDdkQsVUFBSSxNQUFNLDBCQUEwQixTQUFTLEdBQUc7QUFDOUMsY0FBTSxhQUFhLE1BQU0seUJBQXlCO0FBQUEsVUFBSyxDQUFDLFVBQ3RELGdCQUFnQixJQUFJLEtBQUs7QUFBQSxRQUMzQjtBQUNBLFlBQUksWUFBWTtBQUNkLGdCQUFNLGFBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxnQkFBTSxTQUFTLFFBQVEsb0JBQW9CLFVBQVU7QUFDckQsY0FBSSxRQUFRO0FBQ1YsdUJBQVcsSUFBSSxNQUFNO0FBQUEsVUFDdkI7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBR0EsUUFBTSxjQUFjLFlBQVksT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLFlBQVksTUFBTSxLQUFLO0FBQzdFLGFBQVcsY0FBYyxhQUFhO0FBQ3BDLFVBQU0sWUFBWSxRQUFRLG9CQUFvQixXQUFXLGNBQWM7QUFDdkUsUUFBSSxXQUFXO0FBQ2IsaUJBQVcsSUFBSSxTQUFTO0FBQUEsSUFDMUI7QUFBQSxFQUNGO0FBRUEsYUFBVyxhQUFhLEdBQUcsV0FBVyxFQUFFLDBCQUEwQixLQUFLLEdBQUc7QUFDeEUsVUFBTSxjQUNILFVBQWtCLDJCQUNsQixVQUFrQjtBQUNyQixRQUFJLGFBQWE7QUFDZixZQUFNLFVBQVUsUUFBUSxvQkFBb0IsV0FBVztBQUN2RCxVQUFJLFNBQVM7QUFDWCxtQkFBVyxJQUFJLE9BQU87QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxhQUFhLFlBQVk7QUFDbEMsa0JBQWMsSUFBSSxXQUFXLEdBQUc7QUFBQSxFQUNsQztBQUdBLE1BQUksaUJBQWlCLFNBQVMsR0FBRztBQUMvQixlQUFXLFNBQVMsa0JBQWtCO0FBQ3BDLFVBQUksQ0FBQyxNQUFNLEtBQU07QUFFakIsVUFDRSxNQUFNLGtDQUNOLE1BQU0sK0JBQ047QUFDQTtBQUFBLE1BQ0Y7QUFFQSxVQUFJO0FBQ0osWUFBTSxpQkFBaUIsTUFBTTtBQUM3QixZQUFNLGdCQUFnQixNQUFNO0FBRTVCLFVBQUksZ0JBQWdCO0FBQ2xCLGNBQU0sUUFBUSxvQkFBb0IsY0FBYztBQUFBLE1BQ2xELFdBQVcsZUFBZTtBQUN4QixjQUFNLFFBQVEsYUFBYTtBQUFBLFVBQUssQ0FBQyxNQUMvQixFQUFFLHlCQUF5QixTQUFTLGFBQWM7QUFBQSxRQUNwRDtBQUNBLFlBQUksU0FBUyxNQUFNLDBCQUEwQixTQUFTLEdBQUc7QUFDdkQsZ0JBQU0sU0FBUyxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELGdCQUFNLFFBQVEsb0JBQW9CLE1BQU07QUFBQSxRQUMxQztBQUFBLE1BQ0Y7QUFFQSxVQUFJLEtBQUs7QUFDUCxZQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsR0FBRztBQUMzQix3QkFBYyxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQUEsUUFDbkM7QUFBQSxNQUNGLFdBQVcsa0JBQWtCLE1BQU0sTUFBTTtBQUd2QyxnQkFBUSxJQUFJLGdCQUFnQixNQUFNLElBQUk7QUFBQSxNQUN4QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBR0EsYUFBVyxRQUFRLGFBQWE7QUFDOUIsVUFBTSxTQUFTLEtBQUs7QUFDcEIsVUFBTSxNQUFNLFFBQVEsb0JBQW9CLE1BQU07QUFDOUMsUUFBSSxLQUFLO0FBQ1AsVUFBSSxDQUFDLGNBQWMsSUFBSSxHQUFHLEdBQUc7QUFDM0Isc0JBQWMsSUFBSSxLQUFLLElBQUksYUFBYSxFQUFFO0FBQUEsTUFDNUM7QUFDQSxjQUFRLElBQUksUUFBUSxjQUFjLElBQUksR0FBRyxDQUFFO0FBQUEsSUFDN0M7QUFBQSxFQUNGO0FBR0EsYUFBVyxRQUFRLGFBQWE7QUFDOUIsVUFBTSxTQUFTLEtBQUs7QUFFcEIsUUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLEdBQUc7QUFFeEIsY0FBUSxJQUFJLFFBQVEsSUFBSSxhQUFhLEVBQUU7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFHQSxhQUFXLGFBQWEsa0JBQWtCO0FBQ3hDLFFBQUksVUFBVSxTQUFTLG1CQUFvQjtBQUUzQyxVQUFNLGlCQUFpQixHQUFHLFdBQVcsRUFDbEMsWUFBWSxLQUFLO0FBQUEsTUFDaEIscUJBQXFCLFVBQVU7QUFBQSxJQUNqQyxDQUFDLEVBQ0EsS0FBSyxDQUFDLEdBQUcsT0FBTyxFQUFFLGNBQWMsTUFBTSxFQUFFLGNBQWMsRUFBRTtBQUczRCxVQUFNLFFBQVEsZUFBZSxJQUFJLENBQUMsU0FBUztBQUN6QyxhQUFPLFFBQVEsSUFBSSxLQUFLLGNBQWMsS0FBSztBQUFBLElBQzdDLENBQUM7QUFHRCxRQUFJLFdBQVcsV0FBVztBQUN4QixVQUFJLGlCQUF3QztBQUU1QyxjQUFTLFVBQWdDLE9BQU87QUFBQSxRQUM5QyxLQUFLLG1CQUFtQjtBQUN0QiwyQkFBaUIsc0JBQXNCLEVBQUUsV0FBVyxNQUFNLENBQUM7QUFDM0Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLGlCQUFpQjtBQUNwQiwyQkFBaUIsb0JBQW9CO0FBQUEsWUFDbkM7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFDRDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssb0JBQW9CO0FBQ3ZCLDJCQUFpQix1QkFBdUIsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUM1RDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssZ0JBQWdCO0FBQ25CLDJCQUFpQixtQkFBbUI7QUFBQSxZQUNsQztBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUNEO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxjQUFjO0FBQ2pCLDJCQUFpQixpQkFBaUI7QUFBQSxZQUNoQztBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUNEO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxtQkFBbUI7QUFDdEIsMkJBQWlCLHNCQUFzQixFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQzNEO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxpQkFBaUI7QUFDcEIsMkJBQWlCLG9CQUFvQjtBQUFBLFlBQ25DO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBQ0Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLHFCQUFxQjtBQUN4QiwyQkFBaUIsd0JBQXdCO0FBQUEsWUFDdkM7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFDRDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxnQkFBZ0I7QUFDbEIsZ0JBQVEsYUFBYSxjQUFjO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBO0FBQUEsSUFDRTtBQUFBLElBQ0EsR0FBRyxXQUFXLEVBQUUsMEJBQTBCLEtBQUs7QUFBQSxJQUMvQztBQUFBLEVBQ0Y7QUFFQTtBQUFBLElBQ0U7QUFBQSxJQUNBLEdBQUcsV0FBVyxFQUFFLDBCQUEwQixLQUFLO0FBQUEsSUFDL0M7QUFBQSxFQUNGO0FBRUEsMEJBQXdCLFNBQVMsa0JBQWtCLE9BQU87QUFFMUQ7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSx1QkFBdUIsWUFBWTtBQUFBLElBQ3ZDLENBQUMsUUFBUSxJQUFJLFNBQVM7QUFBQSxFQUN4QjtBQUNBLE1BQUk7QUFDRjtBQUFBLE1BQ0U7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVGLFNBQU87QUFDVDs7O0EyQjVUTyxJQUFNLGtCQUFOLE1BQXNCO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsRUFFQSxZQUFZLE1BQWMsTUFBZ0I7QUFDeEMsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0FBQUEsRUFDZDtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sWUFBWSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQ3BDLFVBQU0sU0FBUyxXQUFXLEtBQUssSUFBSSxJQUFJLFNBQVM7QUFDaEQsVUFBTSxTQUFTLFNBQVMsS0FBSyxJQUFJO0FBRWpDLFVBQU0sT0FBTyxxQkFBcUIsS0FBSyxJQUFJO0FBRTNDLFdBQU8sQ0FBQyxJQUFJLFFBQVEsTUFBTSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUEsRUFDN0M7QUFDRjsiLAogICJuYW1lcyI6IFsibGluZSJdCn0K
@@ -92,3 +92,31 @@ export function formatNumberForSpice(value: number) {
92
92
 
93
93
  return Number(value.toPrecision(6)).toString()
94
94
  }
95
+
96
+ export function formatSecondsForSpice(value: number) {
97
+ if (!Number.isFinite(value)) return `${value}`
98
+ if (value === 0) return "0"
99
+
100
+ const units = [
101
+ ["T", 1e12],
102
+ ["G", 1e9],
103
+ ["MEG", 1e6],
104
+ ["k", 1e3],
105
+ ["m", 1e-3],
106
+ ["u", 1e-6],
107
+ ["n", 1e-9],
108
+ ["p", 1e-12],
109
+ ] as const
110
+
111
+ for (const [suffix, multiplier] of units) {
112
+ const scaled = value / multiplier
113
+ if (Math.abs(scaled) >= 0.999999 && Math.abs(scaled) < 999.999999) {
114
+ const rounded = Number(scaled.toPrecision(6))
115
+ if (Math.abs(rounded * multiplier - value) <= Math.abs(value) * 1e-9) {
116
+ return `${rounded}${suffix}`
117
+ }
118
+ }
119
+ }
120
+
121
+ return formatNumberForSpice(value)
122
+ }
@@ -6,6 +6,16 @@ import type {
6
6
  import type { SpiceNetlist } from "lib/spice-classes/SpiceNetlist"
7
7
  import { formatNumberForSpice } from "./helpers"
8
8
 
9
+ const spiceOptionOrder = ["method", "reltol", "abstol", "vntol"] as const
10
+
11
+ interface ProbeVectorMapping {
12
+ simulation_voltage_probe_id: string
13
+ name?: string
14
+ spice_vector: string
15
+ source_node_name: string
16
+ reference_node_name?: string
17
+ }
18
+
9
19
  export const processSimulationExperiment = (
10
20
  netlist: SpiceNetlist,
11
21
  simExperiment: SimulationExperiment,
@@ -15,9 +25,24 @@ export const processSimulationExperiment = (
15
25
  ) => {
16
26
  if (!simExperiment) return
17
27
 
28
+ const spiceOptions = simExperiment.spice_options
29
+ if (spiceOptions) {
30
+ const optionParts = spiceOptionOrder
31
+ .map((key) => {
32
+ const value = spiceOptions[key]
33
+ return value === undefined ? null : `${key}=${value}`
34
+ })
35
+ .filter((part): part is string => part !== null)
36
+
37
+ if (optionParts.length > 0) {
38
+ netlist.optionStatements.push(`.options ${optionParts.join(" ")}`)
39
+ }
40
+ }
41
+
18
42
  // Process simulation voltage probes
19
43
  if (simulationProbes.length > 0) {
20
44
  const nodesToProbe = new Set<string>()
45
+ const probeVectorMappings: ProbeVectorMapping[] = []
21
46
 
22
47
  const getPortIdFromNetId = (netId: string) => {
23
48
  const trace = sourceTraces.find((t) =>
@@ -50,14 +75,37 @@ export const processSimulationExperiment = (
50
75
  if (referencePortId) {
51
76
  const referenceNodeName = nodeMap.get(referencePortId)
52
77
  if (referenceNodeName && referenceNodeName !== "0") {
53
- nodesToProbe.add(`V(${signalNodeName},${referenceNodeName})`)
78
+ const spiceVector = `V(${signalNodeName},${referenceNodeName})`
79
+ nodesToProbe.add(spiceVector)
80
+ probeVectorMappings.push({
81
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
82
+ name: probe.name,
83
+ spice_vector: spiceVector,
84
+ source_node_name: signalNodeName,
85
+ reference_node_name: referenceNodeName,
86
+ })
54
87
  } else if (signalNodeName !== "0") {
55
- nodesToProbe.add(`V(${signalNodeName})`)
88
+ const spiceVector = `V(${signalNodeName})`
89
+ nodesToProbe.add(spiceVector)
90
+ probeVectorMappings.push({
91
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
92
+ name: probe.name,
93
+ spice_vector: spiceVector,
94
+ source_node_name: signalNodeName,
95
+ reference_node_name: referenceNodeName,
96
+ })
56
97
  }
57
98
  } else {
58
99
  // Single-ended probe
59
100
  if (signalNodeName !== "0") {
60
- nodesToProbe.add(`V(${signalNodeName})`)
101
+ const spiceVector = `V(${signalNodeName})`
102
+ nodesToProbe.add(spiceVector)
103
+ probeVectorMappings.push({
104
+ simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
105
+ name: probe.name,
106
+ spice_vector: spiceVector,
107
+ source_node_name: signalNodeName,
108
+ })
61
109
  }
62
110
  }
63
111
  }
@@ -66,7 +114,14 @@ export const processSimulationExperiment = (
66
114
  nodesToProbe.size > 0 &&
67
115
  simExperiment.experiment_type?.includes("transient")
68
116
  ) {
69
- netlist.printStatements.push(`.PRINT TRAN ${[...nodesToProbe].join(" ")}`)
117
+ for (const mapping of probeVectorMappings) {
118
+ netlist.metadataComments.push(
119
+ `* tscircuit_probe ${JSON.stringify(mapping)}`,
120
+ )
121
+ }
122
+ const probeVectors = [...nodesToProbe].join(" ")
123
+ netlist.printStatements.push(`.PRINT TRAN ${probeVectors}`)
124
+ netlist.saveStatements.push(`.SAVE ${probeVectors}`)
70
125
  }
71
126
  }
72
127
 
@@ -2,6 +2,7 @@ import type { AnyCircuitElement, SimulationVoltageSource } from "circuit-json"
2
2
  import { SpiceComponent } from "lib/spice-classes/SpiceComponent"
3
3
  import type { SpiceNetlist } from "lib/spice-classes/SpiceNetlist"
4
4
  import { VoltageSourceCommand } from "lib/spice-commands"
5
+ import { formatSecondsForSpice } from "./helpers"
5
6
 
6
7
  export const processSimulationVoltageSources = (
7
8
  netlist: SpiceNetlist,
@@ -43,13 +44,30 @@ export const processSimulationVoltageSources = (
43
44
  const v_pulsed = simSource.voltage ?? 0
44
45
  const freq = simSource.frequency ?? 0
45
46
  const period_from_freq = freq === 0 ? Infinity : 1 / freq
46
- const period = period_from_freq
47
+ const hasExplicitPeriod = simSource.period !== undefined
48
+ const hasExplicitPulseWidth = simSource.pulse_width !== undefined
49
+ const period = hasExplicitPeriod
50
+ ? simSource.period! / 1000
51
+ : period_from_freq
47
52
  const duty_cycle = simSource.duty_cycle ?? 0.5
48
53
  const pulse_width = period * duty_cycle
49
- const delay = 0
50
- const rise_time = "1n"
51
- const fall_time = "1n"
52
- value = `PULSE(${v_initial} ${v_pulsed} ${delay} ${rise_time} ${fall_time} ${pulse_width} ${period})`
54
+ const delay =
55
+ simSource.pulse_delay !== undefined
56
+ ? simSource.pulse_delay / 1000
57
+ : 0
58
+ const rise_time =
59
+ simSource.rise_time !== undefined
60
+ ? formatSecondsForSpice(simSource.rise_time / 1000)
61
+ : "1n"
62
+ const fall_time =
63
+ simSource.fall_time !== undefined
64
+ ? formatSecondsForSpice(simSource.fall_time / 1000)
65
+ : "1n"
66
+ const pulseWidthText = hasExplicitPulseWidth
67
+ ? formatSecondsForSpice(simSource.pulse_width! / 1000)
68
+ : formatSecondsForSpice(pulse_width)
69
+ const periodText = formatSecondsForSpice(period)
70
+ value = `PULSE(${v_initial} ${v_pulsed} ${formatSecondsForSpice(delay)} ${rise_time} ${fall_time} ${pulseWidthText} ${periodText})`
53
71
  } else if (simSource.voltage !== undefined) {
54
72
  value = `DC ${simSource.voltage}`
55
73
  }
@@ -9,8 +9,11 @@ export class SpiceNetlist {
9
9
  controls: string[]
10
10
  subcircuits: SpiceSubcircuit[]
11
11
  models: Map<string, string>
12
+ optionStatements: string[]
13
+ metadataComments: string[]
12
14
  tranCommand: string | null
13
15
  printStatements: string[]
16
+ saveStatements: string[]
14
17
 
15
18
  constructor(title = "Circuit Netlist") {
16
19
  this.title = title
@@ -19,8 +22,11 @@ export class SpiceNetlist {
19
22
  this.controls = []
20
23
  this.subcircuits = []
21
24
  this.models = new Map()
25
+ this.optionStatements = []
26
+ this.metadataComments = []
22
27
  this.tranCommand = null
23
28
  this.printStatements = []
29
+ this.saveStatements = []
24
30
  }
25
31
 
26
32
  addComponent(component: SpiceComponent) {
@@ -16,6 +16,14 @@ export const convertSpiceNetlistToString = (netlist: SpiceNetlist): string => {
16
16
  lines.push(component.toSpiceString())
17
17
  }
18
18
 
19
+ if (netlist.optionStatements.length > 0) {
20
+ lines.push(...netlist.optionStatements)
21
+ }
22
+
23
+ if (netlist.metadataComments.length > 0) {
24
+ lines.push(...netlist.metadataComments)
25
+ }
26
+
19
27
  // Add subcircuit definitions
20
28
  for (const subcircuit of netlist.subcircuits) {
21
29
  lines.push(subcircuit.toSpiceString())
@@ -25,6 +33,10 @@ export const convertSpiceNetlistToString = (netlist: SpiceNetlist): string => {
25
33
  lines.push(...netlist.printStatements)
26
34
  }
27
35
 
36
+ if (netlist.saveStatements.length > 0) {
37
+ lines.push(...netlist.saveStatements)
38
+ }
39
+
28
40
  // Add control block if present
29
41
  if (netlist.controls.length > 0) {
30
42
  lines.push(".control")
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "circuit-json-to-spice",
3
3
  "main": "dist/index.js",
4
- "version": "0.0.36",
4
+ "version": "0.0.38",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "build": "tsup-node ./lib/index.ts --dts --format esm --sourcemap inline -d dist",
@@ -16,7 +16,8 @@
16
16
  "@tscircuit/circuit-json-util": "^0.0.72",
17
17
  "@types/bun": "^1.2.15",
18
18
  "bun-match-svg": "^0.0.13",
19
- "circuit-json": "^0.0.430",
19
+ "circuit-json": "^0.0.435",
20
+ "format-si-unit": "^0.0.7",
20
21
  "eecircuit-engine": "^1.5.2",
21
22
  "tscircuit": "^0.0.936",
22
23
  "tsup": "^8.4.0"
@@ -24,7 +24,7 @@ test(
24
24
  RR1 N3 0 1K
25
25
  MM1 N2 N4 0 0 NMOS_ENHANCEMENT
26
26
  Vsimulation_voltage_source_0 N1 0 DC 5
27
- Vsimulation_voltage_source_1 N4 0 PULSE(0 10 0 1n 1n 0.00068 0.001)
27
+ Vsimulation_voltage_source_1 N4 0 PULSE(0 10 0 1n 1n 680u 1m)
28
28
  .END"
29
29
  `)
30
30
 
@@ -20,8 +20,11 @@ test(
20
20
  CC1 VP_OUT 0 10U
21
21
  RR1 VP_OUT 0 1K
22
22
  Vsimulation_voltage_source_0 VP_IN 0 DC 5
23
- Vsimulation_voltage_source_1 N1 0 PULSE(0 10 0 1n 1n 0.0005 0.001)
23
+ Vsimulation_voltage_source_1 N1 0 PULSE(0 10 0 1n 1n 500u 1m)
24
+ * tscircuit_probe {"simulation_voltage_probe_id":"simulation_voltage_probe_0","name":"VP_IN","spice_vector":"V(VP_IN)","source_node_name":"VP_IN"}
25
+ * tscircuit_probe {"simulation_voltage_probe_id":"simulation_voltage_probe_1","name":"VP_OUT","spice_vector":"V(VP_OUT)","source_node_name":"VP_OUT"}
24
26
  .PRINT TRAN V(VP_IN) V(VP_OUT)
27
+ .SAVE V(VP_IN) V(VP_OUT)
25
28
  .tran 0.00001 0.05 UIC
26
29
  .END"
27
30
  `)
@@ -20,7 +20,10 @@ test(
20
20
  QQ1 VP_COLLECTOR N2 0 NPN
21
21
  RR_collector N1 VP_COLLECTOR 300
22
22
  Vsimulation_voltage_source_0 N1 0 DC 5
23
+ * tscircuit_probe {"simulation_voltage_probe_id":"simulation_voltage_probe_0","name":"VP_BASE","spice_vector":"V(VP_BASE)","source_node_name":"VP_BASE"}
24
+ * tscircuit_probe {"simulation_voltage_probe_id":"simulation_voltage_probe_1","name":"VP_COLLECTOR","spice_vector":"V(VP_COLLECTOR)","source_node_name":"VP_COLLECTOR"}
23
25
  .PRINT TRAN V(VP_BASE) V(VP_COLLECTOR)
26
+ .SAVE V(VP_BASE) V(VP_COLLECTOR)
24
27
  .tran 0.00005 0.004 UIC
25
28
  .END"
26
29
  `)
@@ -54,6 +54,131 @@ test("circuit with simulation voltage source", async () => {
54
54
  `)
55
55
  })
56
56
 
57
+ test("square simulation voltage source uses explicit pulse timing controls", () => {
58
+ const circuitJson: AnyCircuitElement[] = [
59
+ {
60
+ type: "source_net",
61
+ source_net_id: "net_en",
62
+ name: "EN",
63
+ member_source_group_ids: [],
64
+ } as AnyCircuitElement,
65
+ {
66
+ type: "source_net",
67
+ source_net_id: "net_gnd",
68
+ name: "GND",
69
+ member_source_group_ids: [],
70
+ } as AnyCircuitElement,
71
+ {
72
+ type: "source_port",
73
+ source_port_id: "V_EN_pos",
74
+ name: "pos",
75
+ source_component_id: "V_EN",
76
+ } as AnyCircuitElement,
77
+ {
78
+ type: "source_port",
79
+ source_port_id: "V_EN_neg",
80
+ name: "neg",
81
+ source_component_id: "V_EN",
82
+ } as AnyCircuitElement,
83
+ {
84
+ type: "source_trace",
85
+ source_trace_id: "trace_en",
86
+ connected_source_port_ids: ["V_EN_pos"],
87
+ connected_source_net_ids: ["net_en"],
88
+ } as AnyCircuitElement,
89
+ {
90
+ type: "source_trace",
91
+ source_trace_id: "trace_gnd",
92
+ connected_source_port_ids: ["V_EN_neg"],
93
+ connected_source_net_ids: ["net_gnd"],
94
+ } as AnyCircuitElement,
95
+ {
96
+ type: "simulation_voltage_source",
97
+ simulation_voltage_source_id: "simulation_voltage_source_en",
98
+ is_dc_source: false,
99
+ terminal1_source_port_id: "V_EN_pos",
100
+ terminal2_source_port_id: "V_EN_neg",
101
+ voltage: 4.2,
102
+ wave_shape: "square",
103
+ pulse_delay: 0.001,
104
+ rise_time: 0.000001,
105
+ fall_time: 0.000001,
106
+ pulse_width: 2,
107
+ period: 4,
108
+ } as AnyCircuitElement,
109
+ ]
110
+
111
+ const netlist = circuitJsonToSpice(circuitJson)
112
+
113
+ expect(netlist.toSpiceString()).toMatchInlineSnapshot(`
114
+ "* Circuit JSON to SPICE Netlist
115
+ Vsimulation_voltage_source_en N1 0 PULSE(0 4.2 1u 1n 1n 2m 4m)
116
+ .END"
117
+ `)
118
+ })
119
+
120
+ test("square simulation voltage source preserves explicit zero pulse timing controls", () => {
121
+ const circuitJson: AnyCircuitElement[] = [
122
+ {
123
+ type: "source_net",
124
+ source_net_id: "net_en",
125
+ name: "EN",
126
+ member_source_group_ids: [],
127
+ } as AnyCircuitElement,
128
+ {
129
+ type: "source_net",
130
+ source_net_id: "net_gnd",
131
+ name: "GND",
132
+ member_source_group_ids: [],
133
+ } as AnyCircuitElement,
134
+ {
135
+ type: "source_port",
136
+ source_port_id: "V_EN_pos",
137
+ name: "pos",
138
+ source_component_id: "V_EN",
139
+ } as AnyCircuitElement,
140
+ {
141
+ type: "source_port",
142
+ source_port_id: "V_EN_neg",
143
+ name: "neg",
144
+ source_component_id: "V_EN",
145
+ } as AnyCircuitElement,
146
+ {
147
+ type: "source_trace",
148
+ source_trace_id: "trace_en",
149
+ connected_source_port_ids: ["V_EN_pos"],
150
+ connected_source_net_ids: ["net_en"],
151
+ } as AnyCircuitElement,
152
+ {
153
+ type: "source_trace",
154
+ source_trace_id: "trace_gnd",
155
+ connected_source_port_ids: ["V_EN_neg"],
156
+ connected_source_net_ids: ["net_gnd"],
157
+ } as AnyCircuitElement,
158
+ {
159
+ type: "simulation_voltage_source",
160
+ simulation_voltage_source_id: "simulation_voltage_source_en",
161
+ is_dc_source: false,
162
+ terminal1_source_port_id: "V_EN_pos",
163
+ terminal2_source_port_id: "V_EN_neg",
164
+ voltage: 4.2,
165
+ wave_shape: "square",
166
+ frequency: 1000,
167
+ pulse_delay: 0,
168
+ rise_time: 0,
169
+ fall_time: 0,
170
+ } as AnyCircuitElement,
171
+ ]
172
+
173
+ const netlist = circuitJsonToSpice(circuitJson)
174
+
175
+ expect(netlist.toSpiceString()).toMatchInlineSnapshot(`
176
+ "* Circuit JSON to SPICE Netlist
177
+ Vsimulation_voltage_source_en N1 0 PULSE(0 4.2 0 0 0 500u 1m)
178
+ .END"
179
+ `)
180
+ })
181
+
57
182
  test("simple led emits diode element and LED model", () => {
58
183
  const circuitJson: AnyCircuitElement[] = [
59
184
  {
@@ -0,0 +1,15 @@
1
+ import { expect, test } from "bun:test"
2
+ import { formatSecondsForSpice } from "lib/processors/helpers"
3
+
4
+ test("formatSecondsForSpice formats common transient timing values", () => {
5
+ expect(formatSecondsForSpice(0)).toBe("0")
6
+ expect(formatSecondsForSpice(1e-9)).toBe("1n")
7
+ expect(formatSecondsForSpice(1e-6)).toBe("1u")
8
+ expect(formatSecondsForSpice(0.0005)).toBe("500u")
9
+ expect(formatSecondsForSpice(0.001)).toBe("1m")
10
+ expect(formatSecondsForSpice(0.002)).toBe("2m")
11
+ })
12
+
13
+ test("formatSecondsForSpice formats fractional engineering values when exact", () => {
14
+ expect(formatSecondsForSpice(0.00071556)).toBe("715.56u")
15
+ })
@@ -150,3 +150,36 @@ test("circuit with simulation experiment and 0 start time adds .tran command", (
150
150
  .END"
151
151
  `)
152
152
  })
153
+
154
+ test("circuit with simulation experiment adds spice options before transient command", () => {
155
+ const circuitJson: AnyCircuitElement[] = [
156
+ {
157
+ type: "simulation_experiment",
158
+ simulation_experiment_id: "se1",
159
+ name: "TPS63802 Figure 10-17 transient",
160
+ experiment_type: "spice_transient_analysis",
161
+ time_per_step: 0.000005,
162
+ start_time_ms: 0.69758,
163
+ end_time_ms: 0.71556,
164
+ spice_options: {
165
+ method: "gear",
166
+ reltol: 0.01,
167
+ abstol: "1n",
168
+ vntol: "1u",
169
+ },
170
+ } as AnyCircuitElement,
171
+ ]
172
+
173
+ const netlist = circuitJsonToSpice(circuitJson)
174
+ const spiceString = netlist.toSpiceString()
175
+
176
+ expect(spiceString).toContain(
177
+ ".options method=gear reltol=0.01 abstol=1n vntol=1u\n.tran 5e-9 0.00071556 0.00069758 UIC",
178
+ )
179
+ expect(spiceString).toMatchInlineSnapshot(`
180
+ "* Circuit JSON to SPICE Netlist
181
+ .options method=gear reltol=0.01 abstol=1n vntol=1u
182
+ .tran 5e-9 0.00071556 0.00069758 UIC
183
+ .END"
184
+ `)
185
+ })
@@ -83,6 +83,10 @@ test("voltage probe with signal_input_source_port_id creates .PRINT statement",
83
83
  const spiceString = netlist.toSpiceString()
84
84
 
85
85
  expect(spiceString).toContain(`.PRINT TRAN V(VOUT)`)
86
+ expect(spiceString).toContain(`.SAVE V(VOUT)`)
87
+ expect(spiceString).toContain(
88
+ `* tscircuit_probe {"simulation_voltage_probe_id":"probe1","name":"VOUT","spice_vector":"V(VOUT)","source_node_name":"VOUT"}`,
89
+ )
86
90
  expect(spiceString).toContain(`RR1 N1 VOUT 1K`)
87
91
  expect(spiceString).toContain(`RR2 VOUT N2 1K`)
88
92
  })
@@ -102,6 +106,7 @@ test("voltage probe with signal_input_source_net_id creates .PRINT statement", (
102
106
  const spiceString = netlist.toSpiceString()
103
107
 
104
108
  expect(spiceString).toContain(`.PRINT TRAN V(VOUT)`)
109
+ expect(spiceString).toContain(`.SAVE V(VOUT)`)
105
110
  expect(spiceString).toContain(`RR1 N1 VOUT 1K`)
106
111
  expect(spiceString).toContain(`RR2 VOUT N2 1K`)
107
112
  })
@@ -121,6 +126,7 @@ test("voltage probe without transient analysis does not create .PRINT statement"
121
126
  const spiceString = netlist.toSpiceString()
122
127
 
123
128
  expect(spiceString).not.toContain(".PRINT")
129
+ expect(spiceString).not.toContain(".SAVE")
124
130
  expect(spiceString).toContain("RR1 N1 VOUT 1K")
125
131
  })
126
132
 
@@ -159,6 +165,7 @@ test("voltage probe on ground node is ignored, but other probes are not", () =>
159
165
  // `R2_p2` is now connected to GND, so it's node 0 and should be ignored
160
166
  // `R1_p2` is a non-gnd node and should be printed.
161
167
  expect(spiceString).toContain(`.PRINT TRAN V(VOUT)`)
168
+ expect(spiceString).toContain(`.SAVE V(VOUT)`)
162
169
  expect(spiceString).not.toContain("V(0)")
163
170
  expect(spiceString).toContain("RR1 N1 VOUT 1K")
164
171
  expect(spiceString).toContain("RR2 VOUT 0 1K")
@@ -190,6 +197,7 @@ test("multiple voltage probes create single .PRINT statement", () => {
190
197
 
191
198
  // The order of probes in the .PRINT statement is not guaranteed
192
199
  expect(spiceString).toContain(".PRINT TRAN")
200
+ expect(spiceString).toContain(".SAVE")
193
201
  expect(spiceString).toContain("V(N1)")
194
202
  expect(spiceString).toContain("V(VOUT)")
195
203
  })
@@ -377,6 +385,7 @@ test("probes with N-style names don't conflict with auto-generated names", () =>
377
385
 
378
386
  // The order of probes in the .PRINT statement is not guaranteed
379
387
  expect(spiceString).toContain(".PRINT TRAN")
388
+ expect(spiceString).toContain(".SAVE")
380
389
  expect(spiceString).toContain("V(N1)")
381
390
  expect(spiceString).toContain("V(N2)")
382
391
  expect(spiceString).toContain("V(N4)")
@@ -401,7 +410,11 @@ test("differential voltage probe creates .PRINT statement", () => {
401
410
 
402
411
  expect(spiceString).toContain("RR1 N2 N1 1K")
403
412
  expect(spiceString).toContain("RR2 N1 N3 1K")
413
+ expect(spiceString).toContain(
414
+ `* tscircuit_probe {"simulation_voltage_probe_id":"probe_diff","name":"VR1","spice_vector":"V(N2,N1)","source_node_name":"N2","reference_node_name":"N1"}`,
415
+ )
404
416
  expect(spiceString).toContain(".PRINT TRAN V(N2,N1)")
417
+ expect(spiceString).toContain(".SAVE V(N2,N1)")
405
418
  })
406
419
 
407
420
  test("differential voltage probe without a name creates .PRINT statement", () => {
@@ -425,4 +438,5 @@ test("differential voltage probe without a name creates .PRINT statement", () =>
425
438
  expect(spiceString).toContain("RR1 N2 N1 1K")
426
439
  expect(spiceString).toContain("RR2 N1 N3 1K")
427
440
  expect(spiceString).toContain(".PRINT TRAN V(N2,N1)")
441
+ expect(spiceString).toContain(".SAVE V(N2,N1)")
428
442
  })