circuit-json-to-spice 0.0.38 → 0.0.39
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.js
CHANGED
|
@@ -919,8 +919,34 @@ var processSimulationCurrentSources = (netlist, simulationCurrentSources, nodeMa
|
|
|
919
919
|
|
|
920
920
|
// lib/processors/process-simulation-experiment.ts
|
|
921
921
|
var spiceOptionOrder = ["method", "reltol", "abstol", "vntol"];
|
|
922
|
-
var
|
|
922
|
+
var getPortIdFromNetId = (sourceTraces, netId) => {
|
|
923
|
+
const trace = sourceTraces.find(
|
|
924
|
+
(t) => t.connected_source_net_ids.includes(netId)
|
|
925
|
+
);
|
|
926
|
+
return trace?.connected_source_port_ids[0];
|
|
927
|
+
};
|
|
928
|
+
var resolveNodeNameFromSourcePortOrNet = ({
|
|
929
|
+
sourcePortId,
|
|
930
|
+
sourceNetId,
|
|
931
|
+
sourceTraces,
|
|
932
|
+
nodeMap
|
|
933
|
+
}) => {
|
|
934
|
+
if (sourcePortId) {
|
|
935
|
+
return nodeMap.get(sourcePortId);
|
|
936
|
+
}
|
|
937
|
+
if (!sourceNetId) return void 0;
|
|
938
|
+
const sourcePortIdFromNet = getPortIdFromNetId(sourceTraces, sourceNetId);
|
|
939
|
+
if (!sourcePortIdFromNet) return void 0;
|
|
940
|
+
return nodeMap.get(sourcePortIdFromNet);
|
|
941
|
+
};
|
|
942
|
+
var getSenseVoltageSourceName = (probe) => sanitizeIdentifier(
|
|
943
|
+
`sense_${probe.simulation_current_probe_id}`,
|
|
944
|
+
"sense_current_probe"
|
|
945
|
+
);
|
|
946
|
+
var processSimulationExperiment = (netlist, simExperiment, simulationProbes, simulationCurrentProbes, sourceTraces, nodeMap) => {
|
|
923
947
|
if (!simExperiment) return;
|
|
948
|
+
const isTransientExperiment = simExperiment.experiment_type?.includes("transient") ?? false;
|
|
949
|
+
const transientProbeVectors = /* @__PURE__ */ new Set();
|
|
924
950
|
const spiceOptions = simExperiment.spice_options;
|
|
925
951
|
if (spiceOptions) {
|
|
926
952
|
const optionParts = spiceOptionOrder.map((key) => {
|
|
@@ -932,36 +958,26 @@ var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sou
|
|
|
932
958
|
}
|
|
933
959
|
}
|
|
934
960
|
if (simulationProbes.length > 0) {
|
|
935
|
-
const nodesToProbe = /* @__PURE__ */ new Set();
|
|
936
961
|
const probeVectorMappings = [];
|
|
937
|
-
const getPortIdFromNetId = (netId) => {
|
|
938
|
-
const trace = sourceTraces.find(
|
|
939
|
-
(t) => t.connected_source_net_ids.includes(netId)
|
|
940
|
-
);
|
|
941
|
-
return trace?.connected_source_port_ids[0];
|
|
942
|
-
};
|
|
943
962
|
for (const probe of simulationProbes) {
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
}
|
|
951
|
-
if (!signalPortId) continue;
|
|
952
|
-
const signalNodeName = nodeMap.get(signalPortId);
|
|
963
|
+
const signalNodeName = resolveNodeNameFromSourcePortOrNet({
|
|
964
|
+
sourcePortId: probe.signal_input_source_port_id,
|
|
965
|
+
sourceNetId: probe.signal_input_source_net_id,
|
|
966
|
+
sourceTraces,
|
|
967
|
+
nodeMap
|
|
968
|
+
});
|
|
953
969
|
if (!signalNodeName) continue;
|
|
954
|
-
|
|
955
|
-
if (
|
|
956
|
-
|
|
957
|
-
probe.
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
970
|
+
const hasReference = probe.reference_input_source_port_id || probe.reference_input_source_net_id;
|
|
971
|
+
if (hasReference) {
|
|
972
|
+
const referenceNodeName = resolveNodeNameFromSourcePortOrNet({
|
|
973
|
+
sourcePortId: probe.reference_input_source_port_id,
|
|
974
|
+
sourceNetId: probe.reference_input_source_net_id,
|
|
975
|
+
sourceTraces,
|
|
976
|
+
nodeMap
|
|
977
|
+
});
|
|
962
978
|
if (referenceNodeName && referenceNodeName !== "0") {
|
|
963
979
|
const spiceVector = `V(${signalNodeName},${referenceNodeName})`;
|
|
964
|
-
|
|
980
|
+
transientProbeVectors.add(spiceVector);
|
|
965
981
|
probeVectorMappings.push({
|
|
966
982
|
simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
|
|
967
983
|
name: probe.name,
|
|
@@ -971,7 +987,7 @@ var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sou
|
|
|
971
987
|
});
|
|
972
988
|
} else if (signalNodeName !== "0") {
|
|
973
989
|
const spiceVector = `V(${signalNodeName})`;
|
|
974
|
-
|
|
990
|
+
transientProbeVectors.add(spiceVector);
|
|
975
991
|
probeVectorMappings.push({
|
|
976
992
|
simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
|
|
977
993
|
name: probe.name,
|
|
@@ -983,7 +999,7 @@ var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sou
|
|
|
983
999
|
} else {
|
|
984
1000
|
if (signalNodeName !== "0") {
|
|
985
1001
|
const spiceVector = `V(${signalNodeName})`;
|
|
986
|
-
|
|
1002
|
+
transientProbeVectors.add(spiceVector);
|
|
987
1003
|
probeVectorMappings.push({
|
|
988
1004
|
simulation_voltage_probe_id: probe.simulation_voltage_probe_id,
|
|
989
1005
|
name: probe.name,
|
|
@@ -993,17 +1009,77 @@ var processSimulationExperiment = (netlist, simExperiment, simulationProbes, sou
|
|
|
993
1009
|
}
|
|
994
1010
|
}
|
|
995
1011
|
}
|
|
996
|
-
if (
|
|
1012
|
+
if (probeVectorMappings.length > 0 && isTransientExperiment) {
|
|
997
1013
|
for (const mapping of probeVectorMappings) {
|
|
998
1014
|
netlist.metadataComments.push(
|
|
999
1015
|
`* tscircuit_probe ${JSON.stringify(mapping)}`
|
|
1000
1016
|
);
|
|
1001
1017
|
}
|
|
1002
|
-
const probeVectors = [...nodesToProbe].join(" ");
|
|
1003
|
-
netlist.printStatements.push(`.PRINT TRAN ${probeVectors}`);
|
|
1004
|
-
netlist.saveStatements.push(`.SAVE ${probeVectors}`);
|
|
1005
1018
|
}
|
|
1006
1019
|
}
|
|
1020
|
+
if (simulationCurrentProbes.length > 0) {
|
|
1021
|
+
const senseVoltageSourceNames = /* @__PURE__ */ new Set();
|
|
1022
|
+
const currentProbeVectorMappings = [];
|
|
1023
|
+
for (const probe of simulationCurrentProbes) {
|
|
1024
|
+
const positiveNodeName = resolveNodeNameFromSourcePortOrNet({
|
|
1025
|
+
sourcePortId: probe.positive_source_port_id,
|
|
1026
|
+
sourceNetId: probe.positive_source_net_id,
|
|
1027
|
+
sourceTraces,
|
|
1028
|
+
nodeMap
|
|
1029
|
+
});
|
|
1030
|
+
const negativeNodeName = resolveNodeNameFromSourcePortOrNet({
|
|
1031
|
+
sourcePortId: probe.negative_source_port_id,
|
|
1032
|
+
sourceNetId: probe.negative_source_net_id,
|
|
1033
|
+
sourceTraces,
|
|
1034
|
+
nodeMap
|
|
1035
|
+
});
|
|
1036
|
+
if (!positiveNodeName || !negativeNodeName) continue;
|
|
1037
|
+
const senseVoltageSourceBaseName = getSenseVoltageSourceName(probe);
|
|
1038
|
+
let senseVoltageSourceName = senseVoltageSourceBaseName;
|
|
1039
|
+
let duplicateIndex = 2;
|
|
1040
|
+
while (senseVoltageSourceNames.has(senseVoltageSourceName)) {
|
|
1041
|
+
senseVoltageSourceName = `${senseVoltageSourceBaseName}_${duplicateIndex++}`;
|
|
1042
|
+
}
|
|
1043
|
+
senseVoltageSourceNames.add(senseVoltageSourceName);
|
|
1044
|
+
const spiceSenseVoltageSourceName = `V${senseVoltageSourceName}`;
|
|
1045
|
+
const spiceVector = `I(${spiceSenseVoltageSourceName})`;
|
|
1046
|
+
const voltageSourceCmd = new VoltageSourceCommand({
|
|
1047
|
+
name: senseVoltageSourceName,
|
|
1048
|
+
positiveNode: positiveNodeName,
|
|
1049
|
+
negativeNode: negativeNodeName,
|
|
1050
|
+
value: "DC 0"
|
|
1051
|
+
});
|
|
1052
|
+
netlist.addComponent(
|
|
1053
|
+
new SpiceComponent(senseVoltageSourceName, voltageSourceCmd, [
|
|
1054
|
+
positiveNodeName,
|
|
1055
|
+
negativeNodeName
|
|
1056
|
+
])
|
|
1057
|
+
);
|
|
1058
|
+
if (isTransientExperiment) {
|
|
1059
|
+
transientProbeVectors.add(spiceVector);
|
|
1060
|
+
}
|
|
1061
|
+
currentProbeVectorMappings.push({
|
|
1062
|
+
simulation_current_probe_id: probe.simulation_current_probe_id,
|
|
1063
|
+
name: probe.name,
|
|
1064
|
+
spice_vector: spiceVector,
|
|
1065
|
+
sense_voltage_source_name: spiceSenseVoltageSourceName,
|
|
1066
|
+
positive_node_name: positiveNodeName,
|
|
1067
|
+
negative_node_name: negativeNodeName
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
if (currentProbeVectorMappings.length > 0) {
|
|
1071
|
+
for (const mapping of currentProbeVectorMappings) {
|
|
1072
|
+
netlist.metadataComments.push(
|
|
1073
|
+
`* tscircuit_current_probe ${JSON.stringify(mapping)}`
|
|
1074
|
+
);
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
if (transientProbeVectors.size > 0 && isTransientExperiment) {
|
|
1079
|
+
const probeVectors = [...transientProbeVectors].join(" ");
|
|
1080
|
+
netlist.printStatements.push(`.PRINT TRAN ${probeVectors}`);
|
|
1081
|
+
netlist.saveStatements.push(`.SAVE ${probeVectors}`);
|
|
1082
|
+
}
|
|
1007
1083
|
const timePerStep = simExperiment.time_per_step;
|
|
1008
1084
|
const endTime = simExperiment.end_time_ms;
|
|
1009
1085
|
const startTimeMs = simExperiment.start_time_ms;
|
|
@@ -1115,6 +1191,9 @@ function circuitJsonToSpice(circuitJson) {
|
|
|
1115
1191
|
const simulationProbes = circuitJson.filter(
|
|
1116
1192
|
(elm) => elm.type === "simulation_voltage_probe"
|
|
1117
1193
|
);
|
|
1194
|
+
const simulationCurrentProbes = circuitJson.filter(
|
|
1195
|
+
(elm) => elm.type === "simulation_current_probe"
|
|
1196
|
+
);
|
|
1118
1197
|
const simulationSwitches = circuitJson.filter(
|
|
1119
1198
|
(element) => element.type === "simulation_switch"
|
|
1120
1199
|
).map((element) => element);
|
|
@@ -1328,6 +1407,7 @@ function circuitJsonToSpice(circuitJson) {
|
|
|
1328
1407
|
netlist,
|
|
1329
1408
|
simulationExperiment,
|
|
1330
1409
|
simulationProbes,
|
|
1410
|
+
simulationCurrentProbes,
|
|
1331
1411
|
sourceTraces,
|
|
1332
1412
|
nodeMap
|
|
1333
1413
|
);
|
|
@@ -1370,4 +1450,4 @@ export {
|
|
|
1370
1450
|
circuitJsonToSpice,
|
|
1371
1451
|
convertSpiceNetlistToString
|
|
1372
1452
|
};
|
|
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/IFwiMFwiXG4gICAgfSlcblxuICAgIGNvbnN0IHN1YmNpcmN1aXRDYWxsQ29tbWFuZCA9IG5ldyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQoe1xuICAgICAgbmFtZTogc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICBub2RlcyxcbiAgICAgIHN1YmNpcmN1aXROYW1lOiBtb2RlbE5hbWUsXG4gICAgfSlcblxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnNpbXVsYXRpb25fc3BpY2Vfc3ViY2lyY3VpdF9pZCxcbiAgICAgICAgc3ViY2lyY3VpdENhbGxDb21tYW5kLFxuICAgICAgICBub2RlcyxcbiAgICAgICksXG4gICAgKVxuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNwaWNlU3ViY2lyY3VpdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBwaW5zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcGluczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5waW5zID0gcGluc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBpblN0cmluZyA9IHRoaXMucGlucy5qb2luKFwiIFwiKVxuICAgIGNvbnN0IGhlYWRlciA9IGAuU1VCQ0tUICR7dGhpcy5uYW1lfSAke3BpblN0cmluZ31gXG4gICAgY29uc3QgZm9vdGVyID0gYC5FTkRTICR7dGhpcy5uYW1lfWBcblxuICAgIGNvbnN0IGJvZHkgPSBgKiBQbGFjZWhvbGRlciBmb3IgJHt0aGlzLm5hbWV9LiBObyBkZWZpbml0aW9uIGZvdW5kIGluIGNpcmN1aXQgSlNPTi5gXG5cbiAgICByZXR1cm4gW1wiXCIsIGhlYWRlciwgYm9keSwgZm9vdGVyXS5qb2luKFwiXFxuXCIpXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLDhCQUE4QixDQUFDLFlBQWtDO0FBQzVFLFFBQU0sUUFBa0IsQ0FBQztBQUd6QixRQUFNLEtBQUssUUFBUSxLQUFLO0FBR3hCLE1BQUksUUFBUSxPQUFPLE9BQU8sR0FBRztBQUMzQixVQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDbkQ7QUFHQSxhQUFXLGFBQWEsUUFBUSxZQUFZO0FBQzFDLFVBQU0sS0FBSyxVQUFVLGNBQWMsQ0FBQztBQUFBLEVBQ3RDO0FBRUEsTUFBSSxR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
|
|
1453
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQkpUQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ3VycmVudFNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvU3ViY2lyY3VpdENhbGxDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9UcmFuc21pc3Npb25MaW5lQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9oZWxwZXJzLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3IudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvc2ltcGxlLWRpb2RlLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0LnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS10cmFuc2lzdG9yLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi12b2x0YWdlLXNvdXJjZXMudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWN1cnJlbnQtc291cmNlcy50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tb3AtYW1wLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0cy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3Qub3B0aW9uU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMpXG4gIH1cblxuICBpZiAobmV0bGlzdC5tZXRhZGF0YUNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QubWV0YWRhdGFDb21tZW50cylcbiAgfVxuXG4gIC8vIEFkZCBzdWJjaXJjdWl0IGRlZmluaXRpb25zXG4gIGZvciAoY29uc3Qgc3ViY2lyY3VpdCBvZiBuZXRsaXN0LnN1YmNpcmN1aXRzKSB7XG4gICAgbGluZXMucHVzaChzdWJjaXJjdWl0LnRvU3BpY2VTdHJpbmcoKSlcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnByaW50U3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LnByaW50U3RhdGVtZW50cylcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3Quc2F2ZVN0YXRlbWVudHMpXG4gIH1cblxuICAvLyBBZGQgY29udHJvbCBibG9jayBpZiBwcmVzZW50XG4gIGlmIChuZXRsaXN0LmNvbnRyb2xzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKFwiLmNvbnRyb2xcIilcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QuY29udHJvbHMpXG4gICAgbGluZXMucHVzaChcIi5lbmRjXCIpXG4gIH1cblxuICBpZiAoXG4gICAgbmV0bGlzdC50cmFuQ29tbWFuZCAmJlxuICAgICFsaW5lcy5zb21lKChsKSA9PiBsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCIudHJhblwiKSlcbiAgKSB7XG4gICAgbGluZXMucHVzaChuZXRsaXN0LnRyYW5Db21tYW5kKVxuICB9XG5cbiAgLy8gRW5kIHdpdGggLkVORFxuICBsaW5lcy5wdXNoKFwiLkVORFwiKVxuXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpXG59XG4iLCAiaW1wb3J0IHsgY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nIH0gZnJvbSBcIi4uL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZ1wiXG5pbXBvcnQgdHlwZSB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZVN1YmNpcmN1aXQgfSBmcm9tIFwiLi9TcGljZVN1YmNpcmN1aXRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VOZXRsaXN0IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBjb21wb25lbnRzOiBTcGljZUNvbXBvbmVudFtdXG4gIG5vZGVzOiBTZXQ8c3RyaW5nPlxuICBjb250cm9sczogc3RyaW5nW11cbiAgc3ViY2lyY3VpdHM6IFNwaWNlU3ViY2lyY3VpdFtdXG4gIG1vZGVsczogTWFwPHN0cmluZywgc3RyaW5nPlxuICBvcHRpb25TdGF0ZW1lbnRzOiBzdHJpbmdbXVxuICBtZXRhZGF0YUNvbW1lbnRzOiBzdHJpbmdbXVxuICB0cmFuQ29tbWFuZDogc3RyaW5nIHwgbnVsbFxuICBwcmludFN0YXRlbWVudHM6IHN0cmluZ1tdXG4gIHNhdmVTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5vcHRpb25TdGF0ZW1lbnRzID0gW11cbiAgICB0aGlzLm1ldGFkYXRhQ29tbWVudHMgPSBbXVxuICAgIHRoaXMudHJhbkNvbW1hbmQgPSBudWxsXG4gICAgdGhpcy5wcmludFN0YXRlbWVudHMgPSBbXVxuICAgIHRoaXMuc2F2ZVN0YXRlbWVudHMgPSBbXVxuICB9XG5cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogU3BpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgLy8gQWRkIG5vZGVzIHRvIHRoZSBzZXRcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY29tcG9uZW50Lm5vZGVzKSB7XG4gICAgICB0aGlzLm5vZGVzLmFkZChub2RlKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN1YmNpcmN1aXQoc3ViY2lyY3VpdDogU3BpY2VTdWJjaXJjdWl0KSB7XG4gICAgaWYgKHRoaXMuc3ViY2lyY3VpdHMuZmluZCgocykgPT4gcy5uYW1lID09PSBzdWJjaXJjdWl0Lm5hbWUpKSByZXR1cm5cbiAgICB0aGlzLnN1YmNpcmN1aXRzLnB1c2goc3ViY2lyY3VpdClcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyh0aGlzKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4uL3NwaWNlLWNvbW1hbmRzL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VDb21wb25lbnQge1xuICBuYW1lOiBzdHJpbmdcbiAgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZFxuICBub2Rlczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IEJhc2VTcGljZUNvbW1hbmQsIG5vZGVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZC50b1NwaWNlU3RyaW5nKClcbiAgfVxufVxuIiwgImltcG9ydCB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7XG4gIEFueUNpcmN1aXRFbGVtZW50LFxuICBTaW11bGF0aW9uQ3VycmVudFByb2JlLFxuICBTaW11bGF0aW9uT3BBbXAsXG4gIFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQsXG4gIFNpbXVsYXRpb25Td2l0Y2gsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG4gIFNvdXJjZVNpbXBsZU1vc2ZldCxcbiAgU291cmNlU2ltcGxlU3dpdGNoLFxuICBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24gfSBmcm9tIFwiY2lyY3VpdC1qc29uLXRvLWNvbm5lY3Rpdml0eS1tYXBcIlxuaW1wb3J0IHsgc3UgfSBmcm9tIFwiQHRzY2lyY3VpdC9jaXJjdWl0LWpzb24tdXRpbFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlUmVzaXN0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlU3dpdGNoIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZURpb2RlLCBwcm9jZXNzU2ltcGxlTGVkIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtZGlvZGVcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZUluZHVjdG9yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtaW5kdWN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZU1vc2ZldCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLW1vc2ZldFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlVHJhbnNpc3RvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLXRyYW5zaXN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25Wb2x0YWdlU291cmNlcyB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLXZvbHRhZ2Utc291cmNlc1wiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tY3VycmVudC1zb3VyY2VzXCJcbmltcG9ydCB7IHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWV4cGVyaW1lbnRcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1vcC1hbXBcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tc3BpY2Utc3ViY2lyY3VpdHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uQ3VycmVudFByb2JlcyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVcIixcbiAgKSBhcyBTaW11bGF0aW9uQ3VycmVudFByb2JlW11cbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaGVzID0gY2lyY3VpdEpzb25cbiAgICAuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+IChlbGVtZW50IGFzIHsgdHlwZT86IHN0cmluZyB9KS50eXBlID09PSBcInNpbXVsYXRpb25fc3dpdGNoXCIsXG4gICAgKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQgYXMgdW5rbm93biBhcyBTaW11bGF0aW9uU3dpdGNoKVxuICBjb25zdCBzaW11bGF0aW9uT3BBbXBzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fb3BfYW1wXCIsXG4gICkgYXMgU2ltdWxhdGlvbk9wQW1wW11cbiAgY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zcGljZV9zdWJjaXJjdWl0XCIsXG4gICkgYXMgU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hNYXAgPSBuZXcgTWFwPHN0cmluZywgU2ltdWxhdGlvblN3aXRjaD4oKVxuXG4gIGZvciAoY29uc3Qgc2ltU3dpdGNoIG9mIHNpbXVsYXRpb25Td2l0Y2hlcykge1xuICAgIGlmIChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCkge1xuICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcC5zZXQoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQsIHNpbVN3aXRjaClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25uTWFwID0gZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbihjaXJjdWl0SnNvbilcblxuICAvLyBDcmVhdGUgbm9kZSBtYXBwaW5nIGZyb20gcG9ydCBjb25uZWN0aW9uc1xuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBjb25zdCBuZXRUb05vZGVOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBsZXQgbm9kZUNvdW50ZXIgPSAxXG5cbiAgY29uc3QgcHJvYmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmIChwcm9iZS5uYW1lKSB7XG4gICAgICAgIHByb2JlTmFtZXMuYWRkKHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHByb2JlIG5hbWVzIGxpa2UgTjEsIE4yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBjb25mbGljdHNcbiAgY29uc3QgbnVtZXJpY1Byb2JlTmFtZXMgPSBbLi4ucHJvYmVOYW1lc11cbiAgICAubWFwKChuYW1lKSA9PiAvXk4oXFxkKykkL2kuZXhlYyhuYW1lKSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBSZWdFeHBFeGVjQXJyYXkgPT4gbSAhPT0gbnVsbClcbiAgICAubWFwKChtKSA9PiBwYXJzZUludChtWzFdLCAxMCkpXG5cbiAgaWYgKG51bWVyaWNQcm9iZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBub2RlQ291bnRlciA9IE1hdGgubWF4KC4uLm51bWVyaWNQcm9iZU5hbWVzKSArIDFcbiAgfVxuXG4gIGNvbnN0IGdyb3VuZE5ldHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIEZpbmQgZ3JvdW5kIGZyb20gc291cmNlIG5ldHMgdGhhdCBpbmNsdWRlIFwiZ25kXCIgaW4gdGhlIG5hbWVcbiAgY29uc3QgZ25kU291cmNlTmV0SWRzID0gbmV3IFNldChcbiAgICBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfbmV0Lmxpc3QoKVxuICAgICAgLmZpbHRlcigoc24pID0+IHNuLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJnbmRcIikpXG4gICAgICAubWFwKChzbikgPT4gc24uc291cmNlX25ldF9pZCksXG4gIClcblxuICBpZiAoZ25kU291cmNlTmV0SWRzLnNpemUgPiAwKSB7XG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKSkge1xuICAgICAgaWYgKHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBpc09uR25kTmV0ID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLnNvbWUoKG5ldElkKSA9PlxuICAgICAgICAgIGduZFNvdXJjZU5ldElkcy5oYXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIGlmIChpc09uR25kTmV0KSB7XG4gICAgICAgICAgY29uc3QgYVBvcnRPbkduZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBjb25zdCBnbmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoYVBvcnRPbkduZClcbiAgICAgICAgICBpZiAoZ25kTmV0KSB7XG4gICAgICAgICAgICBncm91bmROZXRzLmFkZChnbmROZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBncm91bmQgbm9kZSBmcm9tIHBvcnRzIG5hbWVkIFwiR05EXCJcbiAgY29uc3QgZ3JvdW5kUG9ydHMgPSBzb3VyY2VQb3J0cy5maWx0ZXIoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnbmRcIilcbiAgZm9yIChjb25zdCBncm91bmRQb3J0IG9mIGdyb3VuZFBvcnRzKSB7XG4gICAgY29uc3QgZ3JvdW5kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGdyb3VuZFBvcnQuc291cmNlX3BvcnRfaWQpXG4gICAgaWYgKGdyb3VuZE5ldCkge1xuICAgICAgZ3JvdW5kTmV0cy5hZGQoZ3JvdW5kTmV0KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSkge1xuICAgIGNvbnN0IG5lZ19wb3J0X2lkID1cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgIGlmIChuZWdfcG9ydF9pZCkge1xuICAgICAgY29uc3QgZ25kX25ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChuZWdfcG9ydF9pZClcbiAgICAgIGlmIChnbmRfbmV0KSB7XG4gICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZF9uZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBncm91bmROZXQgb2YgZ3JvdW5kTmV0cykge1xuICAgIG5ldFRvTm9kZU5hbWUuc2V0KGdyb3VuZE5ldCwgXCIwXCIpXG4gIH1cblxuICAvLyBQcmUtYXNzaWduIG5vZGUgbmFtZXMgZnJvbSB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAoIXByb2JlLm5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkIHx8XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IG5ldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgY29uc3Qgc2lnbmFsX3BvcnRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IHNpZ25hbF9uZXRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoc2lnbmFsX3BvcnRfaWQpIHtcbiAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHNpZ25hbF9wb3J0X2lkKVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfbmV0X2lkKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMoc2lnbmFsX25ldF9pZCEpLFxuICAgICAgICApXG4gICAgICAgIGlmICh0cmFjZSAmJiB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0SWQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV0KSB7XG4gICAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgcHJvYmUubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfcG9ydF9pZCAmJiBwcm9iZS5uYW1lKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZyBwb3J0IHdpdGggYSBwcm9iZSwgc28gd2UgbWFwIGl0IGRpcmVjdGx5LiBUaGlzIHBvcnRcbiAgICAgICAgLy8gd2lsbCBub3cgYmUgc2tpcHBlZCBpbiB0aGUgc2Vjb25kLXBhc3MgZm9yIHVuY29ubmVjdGVkIHBvcnRzLlxuICAgICAgICBub2RlTWFwLnNldChzaWduYWxfcG9ydF9pZCwgcHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIGFsbCBjb25uZWN0ZWQgbmV0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgY29uc3QgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICBpZiAobmV0KSB7XG4gICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgICAgfVxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBuZXRUb05vZGVOYW1lLmdldChuZXQpISlcbiAgICB9XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byB1bmNvbm5lY3RlZCBwb3J0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgLy8gSWYgYSBwb3J0IHdhc24ndCBpbiBhIG5ldCwgaXQgd29uJ3QgYmUgaW4gdGhlIG5vZGVNYXAgeWV0XG4gICAgaWYgKCFub2RlTWFwLmhhcyhwb3J0SWQpKSB7XG4gICAgICAvLyBVbmNvbm5lY3RlZCBwb3J0LCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgbm9kZSBmb3IgaXRcbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGVhY2ggY29tcG9uZW50XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNvdXJjZUNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09IFwic291cmNlX2NvbXBvbmVudFwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydHMgPSBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfcG9ydC5saXN0KHtcbiAgICAgICAgc291cmNlX2NvbXBvbmVudF9pZDogY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnBpbl9udW1iZXIgPz8gMCkgLSAoYi5waW5fbnVtYmVyID8/IDApKVxuXG4gICAgLy8gR2V0IG5vZGUgbmFtZXMgZm9yIGNvbXBvbmVudCBwb3J0c1xuICAgIGNvbnN0IG5vZGVzID0gY29tcG9uZW50UG9ydHMubWFwKChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQocG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIFNQSUNFIGNvbXBvbmVudCBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKFwiZnR5cGVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgIGxldCBzcGljZUNvbXBvbmVudDogU3BpY2VDb21wb25lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgICBzd2l0Y2ggKChjb21wb25lbnQgYXMgeyBmdHlwZTogc3RyaW5nIH0pLmZ0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfcmVzaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVJlc2lzdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9zd2l0Y2hcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVN3aXRjaCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlU3dpdGNoLFxuICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICBzaW11bGF0aW9uU3dpdGNoTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2NhcGFjaXRvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlQ2FwYWNpdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9kaW9kZVwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlRGlvZGUoe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZURpb2RlLFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2xlZFwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlTGVkKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVMZWQsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfaW5kdWN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZUluZHVjdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9tb3NmZXRcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZU1vc2ZldCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlTW9zZmV0LFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3RyYW5zaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVRyYW5zaXN0b3Ioe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGljZUNvbXBvbmVudCkge1xuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbk9wQW1wcyhuZXRsaXN0LCBzaW11bGF0aW9uT3BBbXBzLCBub2RlTWFwKVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgICBuZXRsaXN0LFxuICAgIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBjb25zdCBzaW11bGF0aW9uRXhwZXJpbWVudCA9IGNpcmN1aXRKc29uLmZpbmQoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9leHBlcmltZW50XCIsXG4gIClcbiAgaWYgKHNpbXVsYXRpb25FeHBlcmltZW50KVxuICAgIHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudChcbiAgICAgIG5ldGxpc3QsXG4gICAgICBzaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgICAgIHNpbXVsYXRpb25Qcm9iZXMsXG4gICAgICBzaW11bGF0aW9uQ3VycmVudFByb2JlcyxcbiAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgIG5vZGVNYXAsXG4gICAgKVxuXG4gIHJldHVybiBuZXRsaXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/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/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IHBlcmlvZF9mcm9tX2ZyZXEgPSBmcmVxID09PSAwID8gSW5maW5pdHkgOiAxIC8gZnJlcVxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IHBlcmlvZF9mcm9tX2ZyZXFcbiAgICAgICAgICBjb25zdCBkdXR5X2N5Y2xlID0gc2ltU291cmNlLmR1dHlfY3ljbGUgPz8gMC41XG4gICAgICAgICAgY29uc3QgcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgcmlzZV90aW1lID0gXCIxblwiXG4gICAgICAgICAgY29uc3QgZmFsbF90aW1lID0gXCIxblwiXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHtpX2luaXRpYWx9ICR7aV9wdWxzZWR9ICR7ZGVsYXl9ICR7cmlzZV90aW1lfSAke2ZhbGxfdGltZX0gJHtwdWxzZV93aWR0aH0gJHtwZXJpb2R9KWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2VDbWQsXG4gICAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICAgIClcbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEQyBTb3VyY2VcbiAgICAgIGNvbnN0IHBvc2l0aXZlUG9ydElkID0gc2ltU291cmNlLnBvc2l0aXZlX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwiY3VycmVudFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBzaW1Tb3VyY2UuY3VycmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAke3NpbVNvdXJjZS5jdXJyZW50fWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgY3VycmVudFNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgU2ltdWxhdGlvbkN1cnJlbnRQcm9iZSxcbiAgU2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVRyYWNlLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHsgZm9ybWF0TnVtYmVyRm9yU3BpY2UsIHNhbml0aXplSWRlbnRpZmllciB9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5jb25zdCBzcGljZU9wdGlvbk9yZGVyID0gW1wibWV0aG9kXCIsIFwicmVsdG9sXCIsIFwiYWJzdG9sXCIsIFwidm50b2xcIl0gYXMgY29uc3RcblxuaW50ZXJmYWNlIFZvbHRhZ2VQcm9iZVZlY3Rvck1hcHBpbmcge1xuICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHNwaWNlX3ZlY3Rvcjogc3RyaW5nXG4gIHNvdXJjZV9ub2RlX25hbWU6IHN0cmluZ1xuICByZWZlcmVuY2Vfbm9kZV9uYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDdXJyZW50UHJvYmVWZWN0b3JNYXBwaW5nIHtcbiAgc2ltdWxhdGlvbl9jdXJyZW50X3Byb2JlX2lkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBzcGljZV92ZWN0b3I6IHN0cmluZ1xuICBzZW5zZV92b2x0YWdlX3NvdXJjZV9uYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVfbm9kZV9uYW1lOiBzdHJpbmdcbiAgbmVnYXRpdmVfbm9kZV9uYW1lOiBzdHJpbmdcbn1cblxuY29uc3QgZ2V0UG9ydElkRnJvbU5ldElkID0gKHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXSwgbmV0SWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFjZSA9IHNvdXJjZVRyYWNlcy5maW5kKCh0KSA9PlxuICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKG5ldElkKSxcbiAgKVxuICByZXR1cm4gdHJhY2U/LmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbn1cblxuY29uc3QgcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCA9ICh7XG4gIHNvdXJjZVBvcnRJZCxcbiAgc291cmNlTmV0SWQsXG4gIHNvdXJjZVRyYWNlcyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgc291cmNlUG9ydElkPzogc3RyaW5nXG4gIHNvdXJjZU5ldElkPzogc3RyaW5nXG4gIHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KSA9PiB7XG4gIGlmIChzb3VyY2VQb3J0SWQpIHtcbiAgICByZXR1cm4gbm9kZU1hcC5nZXQoc291cmNlUG9ydElkKVxuICB9XG5cbiAgaWYgKCFzb3VyY2VOZXRJZCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNvdXJjZVBvcnRJZEZyb21OZXQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoc291cmNlVHJhY2VzLCBzb3VyY2VOZXRJZClcbiAgaWYgKCFzb3VyY2VQb3J0SWRGcm9tTmV0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnRJZEZyb21OZXQpXG59XG5cbmNvbnN0IGdldFNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSAocHJvYmU6IFNpbXVsYXRpb25DdXJyZW50UHJvYmUpID0+XG4gIHNhbml0aXplSWRlbnRpZmllcihcbiAgICBgc2Vuc2VfJHtwcm9iZS5zaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVfaWR9YCxcbiAgICBcInNlbnNlX2N1cnJlbnRfcHJvYmVcIixcbiAgKVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXVsYXRpb25FeHBlcmltZW50ID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbUV4cGVyaW1lbnQ6IFNpbXVsYXRpb25FeHBlcmltZW50LFxuICBzaW11bGF0aW9uUHJvYmVzOiBTaW11bGF0aW9uVm9sdGFnZVByb2JlW10sXG4gIHNpbXVsYXRpb25DdXJyZW50UHJvYmVzOiBTaW11bGF0aW9uQ3VycmVudFByb2JlW10sXG4gIHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBpZiAoIXNpbUV4cGVyaW1lbnQpIHJldHVyblxuXG4gIGNvbnN0IGlzVHJhbnNpZW50RXhwZXJpbWVudCA9XG4gICAgc2ltRXhwZXJpbWVudC5leHBlcmltZW50X3R5cGU/LmluY2x1ZGVzKFwidHJhbnNpZW50XCIpID8/IGZhbHNlXG4gIGNvbnN0IHRyYW5zaWVudFByb2JlVmVjdG9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgY29uc3Qgc3BpY2VPcHRpb25zID0gc2ltRXhwZXJpbWVudC5zcGljZV9vcHRpb25zXG4gIGlmIChzcGljZU9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRpb25QYXJ0cyA9IHNwaWNlT3B0aW9uT3JkZXJcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNwaWNlT3B0aW9uc1trZXldXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9KVxuICAgICAgLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHBhcnQgIT09IG51bGwpXG5cbiAgICBpZiAob3B0aW9uUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgbmV0bGlzdC5vcHRpb25TdGF0ZW1lbnRzLnB1c2goYC5vcHRpb25zICR7b3B0aW9uUGFydHMuam9pbihcIiBcIil9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIHNpbXVsYXRpb24gdm9sdGFnZSBwcm9iZXNcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHByb2JlVmVjdG9yTWFwcGluZ3M6IFZvbHRhZ2VQcm9iZVZlY3Rvck1hcHBpbmdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGNvbnN0IHNpZ25hbE5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICBzb3VyY2VOZXRJZDogcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWQsXG4gICAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgICAgbm9kZU1hcCxcbiAgICAgIH0pXG4gICAgICBpZiAoIXNpZ25hbE5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBoYXNSZWZlcmVuY2UgPVxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWQgfHxcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWRcblxuICAgICAgaWYgKGhhc1JlZmVyZW5jZSkge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlTmFtZSA9IHJlc29sdmVOb2RlTmFtZUZyb21Tb3VyY2VQb3J0T3JOZXQoe1xuICAgICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZCxcbiAgICAgICAgICBzb3VyY2VUcmFjZXMsXG4gICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGVOYW1lICYmIHJlZmVyZW5jZU5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgIGNvbnN0IHNwaWNlVmVjdG9yID0gYFYoJHtzaWduYWxOb2RlTmFtZX0sJHtyZWZlcmVuY2VOb2RlTmFtZX0pYFxuICAgICAgICAgIHRyYW5zaWVudFByb2JlVmVjdG9ycy5hZGQoc3BpY2VWZWN0b3IpXG4gICAgICAgICAgcHJvYmVWZWN0b3JNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogcHJvYmUuc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkLFxuICAgICAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgICAgIHNwaWNlX3ZlY3Rvcjogc3BpY2VWZWN0b3IsXG4gICAgICAgICAgICBzb3VyY2Vfbm9kZV9uYW1lOiBzaWduYWxOb2RlTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZV9ub2RlX25hbWU6IHJlZmVyZW5jZU5vZGVOYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgY29uc3Qgc3BpY2VWZWN0b3IgPSBgVigke3NpZ25hbE5vZGVOYW1lfSlgXG4gICAgICAgICAgdHJhbnNpZW50UHJvYmVWZWN0b3JzLmFkZChzcGljZVZlY3RvcilcbiAgICAgICAgICBwcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkOiBwcm9iZS5zaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQsXG4gICAgICAgICAgICBuYW1lOiBwcm9iZS5uYW1lLFxuICAgICAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgICAgIHNvdXJjZV9ub2RlX25hbWU6IHNpZ25hbE5vZGVOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlX25vZGVfbmFtZTogcmVmZXJlbmNlTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luZ2xlLWVuZGVkIHByb2JlXG4gICAgICAgIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBWKCR7c2lnbmFsTm9kZU5hbWV9KWBcbiAgICAgICAgICB0cmFuc2llbnRQcm9iZVZlY3RvcnMuYWRkKHNwaWNlVmVjdG9yKVxuICAgICAgICAgIHByb2JlVmVjdG9yTWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZCxcbiAgICAgICAgICAgIG5hbWU6IHByb2JlLm5hbWUsXG4gICAgICAgICAgICBzcGljZV92ZWN0b3I6IHNwaWNlVmVjdG9yLFxuICAgICAgICAgICAgc291cmNlX25vZGVfbmFtZTogc2lnbmFsTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9iZVZlY3Rvck1hcHBpbmdzLmxlbmd0aCA+IDAgJiYgaXNUcmFuc2llbnRFeHBlcmltZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgcHJvYmVWZWN0b3JNYXBwaW5ncykge1xuICAgICAgICBuZXRsaXN0Lm1ldGFkYXRhQ29tbWVudHMucHVzaChcbiAgICAgICAgICBgKiB0c2NpcmN1aXRfcHJvYmUgJHtKU09OLnN0cmluZ2lmeShtYXBwaW5nKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ3VycmVudCBwcm9iZXMgYXJlIGlubGluZSBhbW1ldGVyIGVsZW1lbnRzLCBzbyB0aGUgMFYgc2Vuc2Ugc291cmNlIGlzIHBhcnRcbiAgLy8gb2YgdGhlIHNpbXVsYXRlZCB0b3BvbG9neSBldmVuIHdoZW4gdGhlIGV4cGVyaW1lbnQgZG9lcyBub3QgcHJpbnQgY3VycmVudC5cbiAgaWYgKHNpbXVsYXRpb25DdXJyZW50UHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgY29uc3QgY3VycmVudFByb2JlVmVjdG9yTWFwcGluZ3M6IEN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25DdXJyZW50UHJvYmVzKSB7XG4gICAgICBjb25zdCBwb3NpdGl2ZU5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUucG9zaXRpdmVfc291cmNlX3BvcnRfaWQsXG4gICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5wb3NpdGl2ZV9zb3VyY2VfbmV0X2lkLFxuICAgICAgICBzb3VyY2VUcmFjZXMsXG4gICAgICAgIG5vZGVNYXAsXG4gICAgICB9KVxuICAgICAgY29uc3QgbmVnYXRpdmVOb2RlTmFtZSA9IHJlc29sdmVOb2RlTmFtZUZyb21Tb3VyY2VQb3J0T3JOZXQoe1xuICAgICAgICBzb3VyY2VQb3J0SWQ6IHByb2JlLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICBzb3VyY2VOZXRJZDogcHJvYmUubmVnYXRpdmVfc291cmNlX25ldF9pZCxcbiAgICAgICAgc291cmNlVHJhY2VzLFxuICAgICAgICBub2RlTWFwLFxuICAgICAgfSlcblxuICAgICAgaWYgKCFwb3NpdGl2ZU5vZGVOYW1lIHx8ICFuZWdhdGl2ZU5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBzZW5zZVZvbHRhZ2VTb3VyY2VCYXNlTmFtZSA9IGdldFNlbnNlVm9sdGFnZVNvdXJjZU5hbWUocHJvYmUpXG4gICAgICBsZXQgc2Vuc2VWb2x0YWdlU291cmNlTmFtZSA9IHNlbnNlVm9sdGFnZVNvdXJjZUJhc2VOYW1lXG4gICAgICBsZXQgZHVwbGljYXRlSW5kZXggPSAyXG4gICAgICB3aGlsZSAoc2Vuc2VWb2x0YWdlU291cmNlTmFtZXMuaGFzKHNlbnNlVm9sdGFnZVNvdXJjZU5hbWUpKSB7XG4gICAgICAgIHNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSBgJHtzZW5zZVZvbHRhZ2VTb3VyY2VCYXNlTmFtZX1fJHtkdXBsaWNhdGVJbmRleCsrfWBcbiAgICAgIH1cbiAgICAgIHNlbnNlVm9sdGFnZVNvdXJjZU5hbWVzLmFkZChzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lKVxuXG4gICAgICBjb25zdCBzcGljZVNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSBgViR7c2Vuc2VWb2x0YWdlU291cmNlTmFtZX1gXG4gICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBJKCR7c3BpY2VTZW5zZVZvbHRhZ2VTb3VyY2VOYW1lfSlgXG4gICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgbmFtZTogc2Vuc2VWb2x0YWdlU291cmNlTmFtZSxcbiAgICAgICAgcG9zaXRpdmVOb2RlOiBwb3NpdGl2ZU5vZGVOYW1lLFxuICAgICAgICBuZWdhdGl2ZU5vZGU6IG5lZ2F0aXZlTm9kZU5hbWUsXG4gICAgICAgIHZhbHVlOiBcIkRDIDBcIixcbiAgICAgIH0pXG5cbiAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgICBuZXcgU3BpY2VDb21wb25lbnQoc2Vuc2VWb2x0YWdlU291cmNlTmFtZSwgdm9sdGFnZVNvdXJjZUNtZCwgW1xuICAgICAgICAgIHBvc2l0aXZlTm9kZU5hbWUsXG4gICAgICAgICAgbmVnYXRpdmVOb2RlTmFtZSxcbiAgICAgICAgXSksXG4gICAgICApXG5cbiAgICAgIGlmIChpc1RyYW5zaWVudEV4cGVyaW1lbnQpIHtcbiAgICAgICAgdHJhbnNpZW50UHJvYmVWZWN0b3JzLmFkZChzcGljZVZlY3RvcilcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICBzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fY3VycmVudF9wcm9iZV9pZCxcbiAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgc2Vuc2Vfdm9sdGFnZV9zb3VyY2VfbmFtZTogc3BpY2VTZW5zZVZvbHRhZ2VTb3VyY2VOYW1lLFxuICAgICAgICBwb3NpdGl2ZV9ub2RlX25hbWU6IHBvc2l0aXZlTm9kZU5hbWUsXG4gICAgICAgIG5lZ2F0aXZlX25vZGVfbmFtZTogbmVnYXRpdmVOb2RlTmFtZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjdXJyZW50UHJvYmVWZWN0b3JNYXBwaW5ncykge1xuICAgICAgICBuZXRsaXN0Lm1ldGFkYXRhQ29tbWVudHMucHVzaChcbiAgICAgICAgICBgKiB0c2NpcmN1aXRfY3VycmVudF9wcm9iZSAke0pTT04uc3RyaW5naWZ5KG1hcHBpbmcpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHJhbnNpZW50UHJvYmVWZWN0b3JzLnNpemUgPiAwICYmIGlzVHJhbnNpZW50RXhwZXJpbWVudCkge1xuICAgIGNvbnN0IHByb2JlVmVjdG9ycyA9IFsuLi50cmFuc2llbnRQcm9iZVZlY3RvcnNdLmpvaW4oXCIgXCIpXG4gICAgbmV0bGlzdC5wcmludFN0YXRlbWVudHMucHVzaChgLlBSSU5UIFRSQU4gJHtwcm9iZVZlY3RvcnN9YClcbiAgICBuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLnB1c2goYC5TQVZFICR7cHJvYmVWZWN0b3JzfWApXG4gIH1cblxuICBjb25zdCB0aW1lUGVyU3RlcCA9IHNpbUV4cGVyaW1lbnQudGltZV9wZXJfc3RlcFxuICBjb25zdCBlbmRUaW1lID0gc2ltRXhwZXJpbWVudC5lbmRfdGltZV9tc1xuICBjb25zdCBzdGFydFRpbWVNcyA9IHNpbUV4cGVyaW1lbnQuc3RhcnRfdGltZV9tc1xuXG4gIGlmICh0aW1lUGVyU3RlcCAmJiBlbmRUaW1lKSB7XG4gICAgLy8gY2lyY3VpdC1qc29uIHZhbHVlcyBhcmUgaW4gbXMsIFNQSUNFIHJlcXVpcmVzIHNlY29uZHNcbiAgICBjb25zdCBzdGFydFRpbWUgPSAoc3RhcnRUaW1lTXMgPz8gMCkgLyAxMDAwXG5cbiAgICBsZXQgdHJhbkNtZCA9IGAudHJhbiAke2Zvcm1hdE51bWJlckZvclNwaWNlKFxuICAgICAgdGltZVBlclN0ZXAgLyAxMDAwLFxuICAgICl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoZW5kVGltZSAvIDEwMDApfWBcbiAgICBpZiAoc3RhcnRUaW1lID4gMCkge1xuICAgICAgdHJhbkNtZCArPSBgICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2Uoc3RhcnRUaW1lKX1gXG4gICAgfVxuICAgIHRyYW5DbWQgKz0gXCIgVUlDXCJcbiAgICBuZXRsaXN0LnRyYW5Db21tYW5kID0gdHJhbkNtZFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uT3BBbXAgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuY29uc3QgT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FID0gXCJHRU5FUklDX09QQU1QXCJcbmNvbnN0IE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTiA9IGBcbi5TVUJDS1QgJHtPUEFNUF9TVUJDSVJDVUlUX05BTUV9IG5vbl9pbnZlcnRpbmdfaW5wdXQgaW52ZXJ0aW5nX2lucHV0IHBvc2l0aXZlX3N1cHBseSBuZWdhdGl2ZV9zdXBwbHkgb3V0cHV0XG4qIEdlbmVyaWMgT3AtQW1wIE1vZGVsXG5FMSBpbnRlcm5hbF9vdXRwdXQgMCBub25faW52ZXJ0aW5nX2lucHV0IGludmVydGluZ19pbnB1dCAxMDBrXG5SaW4gbm9uX2ludmVydGluZ19pbnB1dCBpbnZlcnRpbmdfaW5wdXQgMTBNZWdcblJvdXQgaW50ZXJuYWxfb3V0cHV0IG91dHB1dCA3NVxuRDEgb3V0cHV0IHBvc2l0aXZlX3N1cHBseSBvcGFtcF9kaW9kZVxuRDIgbmVnYXRpdmVfc3VwcGx5IG91dHB1dCBvcGFtcF9kaW9kZVxuLm1vZGVsIG9wYW1wX2Rpb2RlIERcbi5FTkRTICR7T1BBTVBfU1VCQ0lSQ1VJVF9OQU1FfVxuYC50cmltKClcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uT3BBbXBzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25PcEFtcHM6IFNpbXVsYXRpb25PcEFtcFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGlmIChzaW11bGF0aW9uT3BBbXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMoT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChPUEFNUF9TVUJDSVJDVUlUX05BTUUsIE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTilcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltT3BBbXAgb2Ygc2ltdWxhdGlvbk9wQW1wcykge1xuICAgIGlmIChzaW1PcEFtcC50eXBlICE9PSBcInNpbXVsYXRpb25fb3BfYW1wXCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBub25JbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubm9uX2ludmVydGluZ19pbnB1dF9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBpbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAuaW52ZXJ0aW5nX2lucHV0X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IG91dHB1dE5vZGUgPSBub2RlTWFwLmdldChzaW1PcEFtcC5vdXRwdXRfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3QgcG9zaXRpdmVTdXBwbHlOb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLnBvc2l0aXZlX3N1cHBseV9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBuZWdhdGl2ZVN1cHBseU5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubmVnYXRpdmVfc3VwcGx5X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuXG4gICAgY29uc3Qgbm9kZXMgPSBbXG4gICAgICBub25JbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBpbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBwb3NpdGl2ZVN1cHBseU5vZGUsXG4gICAgICBuZWdhdGl2ZVN1cHBseU5vZGUsXG4gICAgICBvdXRwdXROb2RlLFxuICAgIF1cblxuICAgIGNvbnN0IG9wQW1wQ21kID0gbmV3IFN1YmNpcmN1aXRDYWxsQ29tbWFuZCh7XG4gICAgICBuYW1lOiBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG5vZGVzLFxuICAgICAgc3ViY2lyY3VpdE5hbWU6IE9QQU1QX1NVQkNJUkNVSVRfTkFNRSxcbiAgICB9KVxuXG4gICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG9wQW1wQ21kLFxuICAgICAgbm9kZXMsXG4gICAgKVxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3ViY2lyY3VpdENhbGxDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNwaWNlU3ViY2t0KFxuICBzb3VyY2U6IHN0cmluZyxcbik6IHsgbW9kZWxOYW1lOiBzdHJpbmc7IHBpbk5hbWVzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gIGNvbnN0IGxpbmUgPSBzb3VyY2VcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maW5kKChsaW5lKSA9PiAvXlxcLnN1YmNrdFxccysvaS50ZXN0KGxpbmUpKVxuXG4gIGlmICghbGluZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCB0b2tlbnMgPSBsaW5lLnNwbGl0KC9cXHMrLylcbiAgY29uc3QgbW9kZWxOYW1lID0gdG9rZW5zWzFdXG4gIGNvbnN0IHBpbk5hbWVzID0gdG9rZW5zLnNsaWNlKDIpXG5cbiAgaWYgKCFtb2RlbE5hbWUgfHwgcGluTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICByZXR1cm4geyBtb2RlbE5hbWUsIHBpbk5hbWVzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0czogU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSB7XG4gIGlmIChzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGZvciAoY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdCBvZiBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cykge1xuICAgIGNvbnN0IHBhcnNlZFN1YmNrdCA9IHBhcnNlU3BpY2VTdWJja3QoXG4gICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnN1YmNpcmN1aXRfc291cmNlLFxuICAgIClcblxuICAgIGlmICghcGFyc2VkU3ViY2t0KSBjb250aW51ZVxuXG4gICAgY29uc3QgeyBtb2RlbE5hbWUsIHBpbk5hbWVzIH0gPSBwYXJzZWRTdWJja3RcblxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc3ViY2lyY3VpdF9zb3VyY2UpXG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBwaW5OYW1lcy5tYXAoKHNwaWNlUGluTmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUG9ydElkID1cbiAgICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zcGljZV9waW5fdG9fc291cmNlX3BvcnRfbWFwW3NwaWNlUGluTmFtZV1cbiAgICAgIHJldHVybiBub2RlTWFwLmdldChzb3VyY2VQb3J0SWQpID8/IFwiMFwiXG4gICAgfSlcblxuICAgIGNvbnN0IHN1YmNpcmN1aXRDYWxsQ29tbWFuZCA9IG5ldyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQoe1xuICAgICAgbmFtZTogc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICBub2RlcyxcbiAgICAgIHN1YmNpcmN1aXROYW1lOiBtb2RlbE5hbWUsXG4gICAgfSlcblxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnNpbXVsYXRpb25fc3BpY2Vfc3ViY2lyY3VpdF9pZCxcbiAgICAgICAgc3ViY2lyY3VpdENhbGxDb21tYW5kLFxuICAgICAgICBub2RlcyxcbiAgICAgICksXG4gICAgKVxuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNwaWNlU3ViY2lyY3VpdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBwaW5zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcGluczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5waW5zID0gcGluc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBpblN0cmluZyA9IHRoaXMucGlucy5qb2luKFwiIFwiKVxuICAgIGNvbnN0IGhlYWRlciA9IGAuU1VCQ0tUICR7dGhpcy5uYW1lfSAke3BpblN0cmluZ31gXG4gICAgY29uc3QgZm9vdGVyID0gYC5FTkRTICR7dGhpcy5uYW1lfWBcblxuICAgIGNvbnN0IGJvZHkgPSBgKiBQbGFjZWhvbGRlciBmb3IgJHt0aGlzLm5hbWV9LiBObyBkZWZpbml0aW9uIGZvdW5kIGluIGNpcmN1aXQgSlNPTi5gXG5cbiAgICByZXR1cm4gW1wiXCIsIGhlYWRlciwgYm9keSwgZm9vdGVyXS5qb2luKFwiXFxuXCIpXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLDhCQUE4QixDQUFDLFlBQWtDO0FBQzVFLFFBQU0sUUFBa0IsQ0FBQztBQUd6QixRQUFNLEtBQUssUUFBUSxLQUFLO0FBR3hCLE1BQUksUUFBUSxPQUFPLE9BQU8sR0FBRztBQUMzQixVQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssUUFBUSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDbkQ7QUFHQSxhQUFXLGFBQWEsUUFBUSxZQUFZO0FBQzFDLFVBQU0sS0FBSyxVQUFVLGNBQWMsQ0FBQztBQUFBLEVBQ3RDO0FBRUEsTUFBSSxRQUFRLGlCQUFpQixTQUFTLEdBQUc7QUFDdkMsVUFBTSxLQUFLLEdBQUcsUUFBUSxnQkFBZ0I7QUFBQSxFQUN4QztBQUVBLE1BQUksUUFBUSxpQkFBaUIsU0FBUyxHQUFHO0FBQ3ZDLFVBQU0sS0FBSyxHQUFHLFFBQVEsZ0JBQWdCO0FBQUEsRUFDeEM7QUFHQSxhQUFXLGNBQWMsUUFBUSxhQUFhO0FBQzVDLFVBQU0sS0FBSyxXQUFXLGNBQWMsQ0FBQztBQUFBLEVBQ3ZDO0FBRUEsTUFBSSxRQUFRLGdCQUFnQixTQUFTLEdBQUc7QUFDdEMsVUFBTSxLQUFLLEdBQUcsUUFBUSxlQUFlO0FBQUEsRUFDdkM7QUFFQSxNQUFJLFFBQVEsZUFBZSxTQUFTLEdBQUc7QUFDckMsVUFBTSxLQUFLLEdBQUcsUUFBUSxjQUFjO0FBQUEsRUFDdEM7QUFHQSxNQUFJLFFBQVEsU0FBUyxTQUFTLEdBQUc7QUFDL0IsVUFBTSxLQUFLLFVBQVU7QUFDckIsVUFBTSxLQUFLLEdBQUcsUUFBUSxRQUFRO0FBQzlCLFVBQU0sS0FBSyxPQUFPO0FBQUEsRUFDcEI7QUFFQSxNQUNFLFFBQVEsZUFDUixDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsT0FBTyxDQUFDLEdBQzdEO0FBQ0EsVUFBTSxLQUFLLFFBQVEsV0FBVztBQUFBLEVBQ2hDO0FBR0EsUUFBTSxLQUFLLE1BQU07QUFFakIsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4Qjs7O0FDckRPLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRUEsWUFBWSxRQUFRLG1CQUFtQjtBQUNyQyxTQUFLLFFBQVE7QUFDYixTQUFLLGFBQWEsQ0FBQztBQUNuQixTQUFLLFFBQVEsb0JBQUksSUFBSTtBQUNyQixTQUFLLFdBQVcsQ0FBQztBQUNqQixTQUFLLGNBQWMsQ0FBQztBQUNwQixTQUFLLFNBQVMsb0JBQUksSUFBSTtBQUN0QixTQUFLLG1CQUFtQixDQUFDO0FBQ3pCLFNBQUssbUJBQW1CLENBQUM7QUFDekIsU0FBSyxjQUFjO0FBQ25CLFNBQUssa0JBQWtCLENBQUM7QUFDeEIsU0FBSyxpQkFBaUIsQ0FBQztBQUFBLEVBQ3pCO0FBQUEsRUFFQSxhQUFhLFdBQTJCO0FBQ3RDLFNBQUssV0FBVyxLQUFLLFNBQVM7QUFFOUIsZUFBVyxRQUFRLFVBQVUsT0FBTztBQUNsQyxXQUFLLE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQUEsRUFFQSxjQUFjLFlBQTZCO0FBQ3pDLFFBQUksS0FBSyxZQUFZLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxXQUFXLElBQUksRUFBRztBQUM5RCxTQUFLLFlBQVksS0FBSyxVQUFVO0FBQUEsRUFDbEM7QUFBQSxFQUVBLGdCQUFnQjtBQUNkLFdBQU8sNEJBQTRCLElBQUk7QUFBQSxFQUN6QztBQUNGOzs7QUM3Q08sSUFBTSxpQkFBTixNQUFxQjtBQUFBLEVBQzFCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVBLFlBQVksTUFBYyxTQUEyQixPQUFpQjtBQUNwRSxTQUFLLE9BQU87QUFDWixTQUFLLFVBQVU7QUFDZixTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsV0FBTyxLQUFLLFFBQVEsY0FBYztBQUFBLEVBQ3BDO0FBQ0Y7OztBQ0RBLFNBQVMsbURBQW1EO0FBQzVELFNBQVMsVUFBVTs7O0FDSlosSUFBTSxhQUFOLE1BQTZDO0FBQUEsRUFDbEQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBd0I7QUFDbEMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLFdBQVcsTUFBTSxTQUFTLFdBQVcsT0FBTyxLQUFLLElBQzdELEtBQUs7QUFDUCxRQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxPQUFPO0FBQzFELFFBQUksV0FBVztBQUNiLHFCQUFlLElBQUksU0FBUztBQUFBLElBQzlCO0FBQ0EsbUJBQWUsSUFBSSxLQUFLO0FBQ3hCLFFBQUksTUFBTTtBQUNSLHFCQUFlLElBQUksSUFBSTtBQUFBLElBQ3pCO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDdEJPLElBQU0sbUJBQU4sTUFBbUQ7QUFBQSxFQUN4RCxjQUFjO0FBQUEsRUFFZDtBQUFBLEVBRUEsWUFBWSxPQUE4QjtBQUN4QyxTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSSxLQUFLO0FBRVQsUUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxZQUFZO0FBQzFELFFBQUksV0FBVztBQUNiLHFCQUFlLElBQUksU0FBUztBQUFBLElBQzlCO0FBQ0EsbUJBQWUsSUFBSSxLQUFLO0FBQ3hCLFFBQUksa0JBQWtCO0FBQ3BCLHFCQUFlLE9BQU8sZ0JBQWdCO0FBQUEsSUFDeEM7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUM3Qk8sSUFBTSx1QkFBTixNQUF1RDtBQUFBLEVBQzVELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQWtDO0FBQzVDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxjQUFjLGNBQWMsT0FBTyxhQUFhLFFBQVEsSUFDcEUsS0FBSztBQUNQLFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWTtBQUMxRCxRQUFJLE9BQU87QUFDVCxxQkFBZSxJQUFJLEtBQUs7QUFBQSxJQUMxQjtBQUNBLFFBQUksYUFBYTtBQUNmLHFCQUFlLE9BQU8sV0FBVztBQUNqQyxVQUFJLFNBQVM7QUFDWCx1QkFBZSxJQUFJLE9BQU87QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUN4Qk8sSUFBTSxlQUFOLE1BQStDO0FBQUEsRUFDcEQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBMEI7QUFDcEMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLEtBQUssSUFBSSxLQUFLO0FBQy9ELFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLEtBQUs7QUFDbkUsUUFBSSxNQUFNO0FBQ1IscUJBQWUsSUFBSSxJQUFJO0FBQUEsSUFDekI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNmTyxJQUFNLGtCQUFOLE1BQWtEO0FBQUEsRUFDdkQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBNkI7QUFDdkMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLE9BQU8saUJBQWlCLElBQ3ZFLEtBQUs7QUFDUCxRQUFJLGNBQWMsSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLFlBQVk7QUFDMUQsUUFBSSxPQUFPO0FBQ1QscUJBQWUsSUFBSSxLQUFLO0FBQUEsSUFDMUI7QUFDQSxtQkFBZSxJQUFJLEtBQUs7QUFDeEIsUUFBSSxrQkFBa0I7QUFDcEIscUJBQWUsT0FBTyxnQkFBZ0I7QUFBQSxJQUN4QztBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3hCTyxJQUFNLDBCQUFOLE1BQTBEO0FBQUEsRUFDL0QsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBcUM7QUFDL0MsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLFdBQVcsU0FBUyxJQUFJLEtBQUs7QUFDM0MsV0FBTyxJQUFJLElBQUksSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUTtBQUFBLEVBQ3BEO0FBQ0Y7OztBQ1RPLElBQU0sY0FBTixNQUE4QztBQUFBLEVBQ25ELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQXlCO0FBQ25DLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxPQUFPLE1BQU0sUUFBUSxPQUFPLEtBQUssSUFBSSxLQUFLO0FBQ3hELFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLO0FBQzlELFFBQUksTUFBTTtBQUNSLHFCQUFlLElBQUksSUFBSTtBQUFBLElBQ3pCO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDUk8sSUFBTSxnQkFBTixNQUFnRDtBQUFBLEVBQ3JELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQTJCO0FBQ3JDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUksS0FBSztBQUVULFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksS0FBSztBQUUzRSxVQUFNLFNBQTZDO0FBQUEsTUFDakQsR0FBRztBQUFBLE1BQ0gsR0FBRztBQUFBLE1BQ0gsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1A7QUFFQSxXQUFPLFFBQVEsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQy9DLFVBQUksT0FBTztBQUNULHVCQUFlLElBQUksR0FBRyxJQUFJLEtBQUs7QUFBQSxNQUNqQztBQUFBLElBQ0YsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3hETyxJQUFNLGtCQUFOLE1BQWtEO0FBQUEsRUFDdkQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBNkI7QUFDdkMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQ2hFLFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWTtBQUMxRCxRQUFJLE9BQU87QUFDVCxxQkFBZSxJQUFJLEtBQUs7QUFBQSxJQUMxQjtBQUNBLG1CQUFlLElBQUksS0FBSztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNuQk8sSUFBTSx3QkFBTixNQUF3RDtBQUFBLEVBQzdELGNBQWM7QUFBQSxFQUNkO0FBQUEsRUFFQSxZQUFZLE9BQW1DO0FBQzdDLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUF3QjtBQUN0QixVQUFNLEVBQUUsTUFBTSxPQUFPLGVBQWUsSUFBSSxLQUFLO0FBQzdDLFdBQU8sSUFBSSxJQUFJLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLGNBQWM7QUFBQSxFQUN0RDtBQUNGOzs7QUNOTyxJQUFNLDBCQUFOLE1BQTBEO0FBQUEsRUFDL0QsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBcUM7QUFDL0MsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUksS0FBSztBQUNULFFBQUksY0FBYyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLE9BQU8sU0FBUztBQUM5RixRQUFJLE9BQU87QUFDVCxxQkFBZSxPQUFPLEtBQUs7QUFBQSxJQUM3QixXQUFXLFdBQVc7QUFDcEIscUJBQWUsTUFBTSxTQUFTO0FBQzlCLFVBQUksa0JBQWtCO0FBQ3BCLHVCQUFlLE9BQU8sZ0JBQWdCO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjs7O0FDbENPLElBQU0saUNBQU4sTUFBaUU7QUFBQSxFQUN0RSxjQUFjO0FBQUEsRUFDZDtBQUFBLEVBRUEsWUFBWSxPQUE0QztBQUN0RCxTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBd0I7QUFDdEIsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSSxLQUFLO0FBQ1QsV0FBTyxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLGVBQWUsSUFBSSxlQUFlLElBQUksS0FBSztBQUFBLEVBQ2hHO0FBQ0Y7OztBQ25CTyxJQUFNLHVCQUFOLE1BQXVEO0FBQUEsRUFDNUQsY0FBYztBQUFBLEVBQ2Q7QUFBQSxFQUVBLFlBQVksT0FBa0M7QUFDNUMsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sRUFBRSxNQUFNLGNBQWMsY0FBYyxPQUFPLGFBQWEsUUFBUSxJQUNwRSxLQUFLO0FBQ1AsUUFBSSxjQUFjLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxZQUFZO0FBQzFELFFBQUksT0FBTztBQUNULHFCQUFlLElBQUksS0FBSztBQUFBLElBQzFCO0FBQ0EsUUFBSSxhQUFhO0FBQ2YscUJBQWUsT0FBTyxXQUFXO0FBQ2pDLFVBQUksU0FBUztBQUNYLHVCQUFlLElBQUksT0FBTztBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ2hDTyxTQUFTLGlCQUFpQixZQUE0QjtBQUMzRCxNQUFJLGNBQWMsSUFBSyxRQUFPLEdBQUcsYUFBYSxHQUFHO0FBQ2pELE1BQUksY0FBYyxJQUFLLFFBQU8sR0FBRyxhQUFhLEdBQUc7QUFDakQsU0FBTyxXQUFXLFNBQVM7QUFDN0I7QUFFTyxTQUFTLGtCQUFrQixhQUE2QjtBQUM3RCxNQUFJLGVBQWUsS0FBTSxRQUFPLEdBQUcsY0FBYyxHQUFHO0FBQ3BELE1BQUksZUFBZSxLQUFNLFFBQU8sR0FBRyxjQUFjLEdBQUc7QUFDcEQsTUFBSSxlQUFlLEtBQU0sUUFBTyxHQUFHLGNBQWMsR0FBRztBQUNwRCxNQUFJLGVBQWUsTUFBTyxRQUFPLEdBQUcsY0FBYyxJQUFJO0FBQ3RELFNBQU8sWUFBWSxTQUFTO0FBQzlCO0FBRU8sU0FBUyxpQkFBaUIsWUFBNEI7QUFDM0QsTUFBSSxjQUFjLEVBQUcsUUFBTyxXQUFXLFNBQVM7QUFDaEQsTUFBSSxjQUFjLEtBQU0sUUFBTyxHQUFHLGFBQWEsR0FBRztBQUNsRCxNQUFJLGNBQWMsS0FBTSxRQUFPLEdBQUcsYUFBYSxHQUFHO0FBQ2xELE1BQUksY0FBYyxLQUFNLFFBQU8sR0FBRyxhQUFhLEdBQUc7QUFDbEQsTUFBSSxjQUFjLE1BQU8sUUFBTyxHQUFHLGFBQWEsSUFBSTtBQUNwRCxTQUFPLFdBQVcsU0FBUztBQUM3QjtBQUVPLFNBQVMsbUJBQW1CLE9BQTJCLFFBQWdCO0FBQzVFLE1BQUksQ0FBQyxNQUFPLFFBQU87QUFDbkIsUUFBTSxZQUFZLE1BQU0sUUFBUSxrQkFBa0IsR0FBRztBQUNyRCxNQUFJLENBQUMsVUFBVyxRQUFPO0FBQ3ZCLE1BQUksU0FBUyxLQUFLLFNBQVMsR0FBRztBQUM1QixXQUFPLEdBQUcsTUFBTSxJQUFJLFNBQVM7QUFBQSxFQUMvQjtBQUNBLFNBQU87QUFDVDtBQUVPLFNBQVMsa0NBQ2Qsa0JBQ0E7QUFDQSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxhQUFhO0FBQ25CLFFBQU0sV0FBVztBQUNqQixRQUFNLFdBQVc7QUFFakIsTUFBSSxDQUFDLGtCQUFrQjtBQUNyQixXQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3pCO0FBRUEsUUFBTSxlQUFlLGlCQUFpQixpQkFBaUI7QUFDdkQsUUFBTSxXQUFXLGlCQUFpQixhQUFhO0FBQy9DLFFBQU0sVUFBVSxpQkFBaUI7QUFDakMsUUFBTSxxQkFBcUIsaUJBQWlCO0FBRTVDLFFBQU0sQ0FBQyxnQkFBZ0IsYUFBYSxJQUFJLGVBQ3BDLENBQUMsYUFBYSxVQUFVLElBQ3hCLENBQUMsWUFBWSxXQUFXO0FBRTVCLE1BQUksc0JBQXNCLHFCQUFxQixHQUFHO0FBQ2hELFVBQU0sU0FBUyxJQUFJO0FBQ25CLFVBQU0scUJBQ0osV0FBVyxVQUFVLFdBQVcsS0FBSyxJQUFJLFVBQVUsVUFBVSxNQUFNLElBQUk7QUFDekUsVUFBTSxhQUNKLHFCQUFxQixJQUFJLHFCQUFxQixLQUFLLElBQUksU0FBUyxHQUFHLElBQUk7QUFFekUsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLE1BQUksWUFBWSxVQUFhLFVBQVUsVUFBVTtBQUMvQyxVQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsVUFBVSxJQUFJO0FBQ3BELFVBQU0sU0FBUyxXQUFXLGFBQWE7QUFFdkMsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLE1BQUksV0FBVyxHQUFHO0FBQ2hCLFVBQU0sU0FBUyxXQUFXO0FBQzFCLFVBQU0sYUFBYSxLQUFLLElBQUksU0FBUyxHQUFHLElBQUk7QUFDNUMsV0FBTyxTQUFTLHFCQUFxQixjQUFjLENBQUMsSUFBSSxxQkFBcUIsYUFBYSxDQUFDLElBQUkscUJBQXFCLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUkscUJBQXFCLFVBQVUsQ0FBQyxJQUFJLHFCQUFxQixNQUFNLENBQUM7QUFBQSxFQUMzTjtBQUVBLFNBQU8sTUFBTSxlQUFlLGNBQWMsVUFBVTtBQUN0RDtBQUVPLFNBQVMscUJBQXFCLE9BQWU7QUFDbEQsTUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLEVBQUcsUUFBTyxHQUFHLEtBQUs7QUFDNUMsTUFBSSxVQUFVLEVBQUcsUUFBTztBQUV4QixRQUFNLFdBQVcsS0FBSyxJQUFJLEtBQUs7QUFFL0IsTUFBSSxZQUFZLE9BQU8sWUFBWSxNQUFNO0FBQ3ZDLFdBQU8sT0FBTyxNQUFNLGNBQWMsQ0FBQyxDQUFDLEVBQUUsU0FBUztBQUFBLEVBQ2pEO0FBRUEsU0FBTyxPQUFPLE1BQU0sWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTO0FBQy9DO0FBRU8sU0FBUyxzQkFBc0IsT0FBZTtBQUNuRCxNQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssRUFBRyxRQUFPLEdBQUcsS0FBSztBQUM1QyxNQUFJLFVBQVUsRUFBRyxRQUFPO0FBRXhCLFFBQU0sUUFBUTtBQUFBLElBQ1osQ0FBQyxLQUFLLElBQUk7QUFBQSxJQUNWLENBQUMsS0FBSyxHQUFHO0FBQUEsSUFDVCxDQUFDLE9BQU8sR0FBRztBQUFBLElBQ1gsQ0FBQyxLQUFLLEdBQUc7QUFBQSxJQUNULENBQUMsS0FBSyxJQUFJO0FBQUEsSUFDVixDQUFDLEtBQUssSUFBSTtBQUFBLElBQ1YsQ0FBQyxLQUFLLElBQUk7QUFBQSxJQUNWLENBQUMsS0FBSyxLQUFLO0FBQUEsRUFDYjtBQUVBLGFBQVcsQ0FBQyxRQUFRLFVBQVUsS0FBSyxPQUFPO0FBQ3hDLFVBQU0sU0FBUyxRQUFRO0FBQ3ZCLFFBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksWUFBWTtBQUNqRSxZQUFNLFVBQVUsT0FBTyxPQUFPLFlBQVksQ0FBQyxDQUFDO0FBQzVDLFVBQUksS0FBSyxJQUFJLFVBQVUsYUFBYSxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNO0FBQ3BFLGVBQU8sR0FBRyxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLHFCQUFxQixLQUFLO0FBQ25DOzs7QUNwSE8sSUFBTSx3QkFBd0IsQ0FBQztBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUNGLE1BRzZCO0FBQzNCLE1BQUksZ0JBQWdCLGFBQWEsVUFBVSxXQUFXO0FBQ3BELFVBQU0sY0FBYyxJQUFJLGdCQUFnQjtBQUFBLE1BQ3RDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLGNBQWMsTUFBTSxDQUFDLEtBQUs7QUFBQSxNQUMxQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsT0FBTyxpQkFBaUIsVUFBVSxVQUFvQjtBQUFBLElBQ3hELENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLGFBQWEsS0FBSztBQUFBLEVBQ3hFO0FBQ0EsU0FBTztBQUNUOzs7QUNWTyxJQUFNLHNCQUFzQixDQUFDO0FBQUEsRUFDbEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUs2QjtBQUMzQixRQUFNLGdCQUFnQjtBQUFBLElBQ3BCLFVBQVUsUUFBUSxVQUFVO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQ0EsUUFBTSxlQUFlLE1BQU0sQ0FBQyxLQUFLO0FBQ2pDLFFBQU0sZUFBZSxNQUFNLENBQUMsS0FBSztBQUNqQyxRQUFNLGNBQWMsU0FBUyxhQUFhO0FBQzFDLFFBQU0sWUFBWSxNQUFNLGFBQWE7QUFFckMsUUFBTSw2QkFBNkIsb0JBQW9CO0FBQUEsSUFDckQsVUFBVTtBQUFBLEVBQ1o7QUFFQSxRQUFNLGVBQWU7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQVksSUFBSSwrQkFBK0I7QUFBQSxJQUNuRCxNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLElBQ2pCLGlCQUFpQjtBQUFBLElBQ2pCLE9BQU87QUFBQSxFQUNULENBQUM7QUFFRCxNQUFJLENBQUMsUUFBUSxPQUFPLElBQUksU0FBUyxHQUFHO0FBQ2xDLFlBQVEsT0FBTztBQUFBLE1BQ2I7QUFBQSxNQUNBLFVBQVUsU0FBUztBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUVBLFFBQU0sb0JBQW9CLFFBQVEsYUFBYTtBQUMvQyxRQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLElBQ2hELE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLGNBQWM7QUFBQSxJQUNkLE9BQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQSxDQUFDLGFBQWEsR0FBRztBQUFBLEVBQ25CO0FBRUEsVUFBUSxhQUFhLGdCQUFnQjtBQUVyQyxTQUFPLElBQUksZUFBZSxlQUFlLFdBQVc7QUFBQSxJQUNsRDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNIOzs7QUN6RU8sSUFBTSx5QkFBeUIsQ0FBQztBQUFBLEVBQ3JDO0FBQUEsRUFDQTtBQUNGLE1BRzZCO0FBQzNCLE1BQUksaUJBQWlCLGFBQWEsVUFBVSxXQUFXO0FBQ3JELFVBQU0sZUFBZSxJQUFJLGlCQUFpQjtBQUFBLE1BQ3hDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLGNBQWMsTUFBTSxDQUFDLEtBQUs7QUFBQSxNQUMxQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsT0FBTyxrQkFBa0IsVUFBVSxXQUFxQjtBQUFBLElBQzFELENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLGNBQWMsS0FBSztBQUFBLEVBQ3pFO0FBQ0EsU0FBTztBQUNUOzs7QUNiQSxJQUFNLGdCQUFnQixDQUNwQixnQkFDQSxZQUNHO0FBQ0gsUUFBTSxZQUFZLGVBQWU7QUFBQSxJQUMvQixDQUFDLE1BQU0sRUFBRSxNQUFNLFlBQVksTUFBTSxXQUFXLEVBQUUsWUFBWSxTQUFTLE9BQU87QUFBQSxFQUM1RTtBQUNBLFFBQU0sY0FBYyxlQUFlO0FBQUEsSUFDakMsQ0FBQyxNQUNDLEVBQUUsTUFBTSxZQUFZLE1BQU0sYUFBYSxFQUFFLFlBQVksU0FBUyxTQUFTO0FBQUEsRUFDM0U7QUFFQSxTQUFPO0FBQUEsSUFDTCxjQUFjLFFBQVEsSUFBSSxXQUFXLGtCQUFrQixFQUFFLEtBQUs7QUFBQSxJQUM5RCxjQUFjLFFBQVEsSUFBSSxhQUFhLGtCQUFrQixFQUFFLEtBQUs7QUFBQSxFQUNsRTtBQUNGO0FBRUEsSUFBTSw0QkFBNEIsQ0FBQztBQUFBLEVBQ2pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQU82QjtBQUMzQixNQUFJLFVBQVUsV0FBVztBQUN2QixVQUFNLEVBQUUsY0FBYyxhQUFhLElBQUk7QUFBQSxNQUNyQztBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLElBQUksYUFBYTtBQUFBLE1BQ2hDLE1BQU0sVUFBVTtBQUFBLE1BQ2hCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUNELFlBQVEsT0FBTyxJQUFJLFdBQVcsZUFBZTtBQUM3QyxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLFVBQVU7QUFBQSxNQUM1RDtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUO0FBRU8sSUFBTSxxQkFBcUIsQ0FBQztBQUFBLEVBQ2pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsU0FBTywwQkFBMEI7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsaUJBQWlCO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBRU8sSUFBTSxtQkFBbUIsQ0FBQztBQUFBLEVBQy9CO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsU0FBTywwQkFBMEI7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsaUJBQ0U7QUFBQSxFQUNKLENBQUM7QUFDSDs7O0FDbkdPLElBQU0sd0JBQXdCLENBQUM7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFDRixNQUc2QjtBQUMzQixNQUFJLGdCQUFnQixhQUFhLFVBQVUsV0FBVztBQUNwRCxVQUFNLGNBQWMsSUFBSSxnQkFBZ0I7QUFBQSxNQUN0QyxNQUFNLFVBQVU7QUFBQSxNQUNoQixjQUFjLE1BQU0sQ0FBQyxLQUFLO0FBQUEsTUFDMUIsY0FBYyxNQUFNLENBQUMsS0FBSztBQUFBLE1BQzFCLE9BQU8saUJBQWlCLFVBQVUsVUFBb0I7QUFBQSxJQUN4RCxDQUFDO0FBQ0QsV0FBTyxJQUFJLGVBQWUsVUFBVSxNQUFnQixhQUFhLEtBQUs7QUFBQSxFQUN4RTtBQUNBLFNBQU87QUFDVDs7O0FDakJPLElBQU0sc0JBQXNCLENBQUM7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLE1BSzZCO0FBQzNCLE1BQUksVUFBVSxXQUFXO0FBQ3ZCLFVBQU0sWUFBWSxlQUFlO0FBQUEsTUFDL0IsQ0FBQyxNQUNDLEVBQUUsTUFBTSxZQUFZLE1BQU0sV0FBVyxFQUFFLFlBQVksU0FBUyxPQUFPO0FBQUEsSUFDdkU7QUFDQSxVQUFNLFdBQVcsZUFBZTtBQUFBLE1BQzlCLENBQUMsTUFBTSxFQUFFLE1BQU0sWUFBWSxNQUFNLFVBQVUsRUFBRSxZQUFZLFNBQVMsTUFBTTtBQUFBLElBQzFFO0FBQ0EsVUFBTSxhQUFhLGVBQWU7QUFBQSxNQUNoQyxDQUFDLE1BQ0MsRUFBRSxNQUFNLFlBQVksTUFBTSxZQUFZLEVBQUUsWUFBWSxTQUFTLFFBQVE7QUFBQSxJQUN6RTtBQUVBLFVBQU0sWUFBWSxRQUFRLElBQUksV0FBVyxrQkFBa0IsRUFBRSxLQUFLO0FBQ2xFLFVBQU0sV0FBVyxRQUFRLElBQUksVUFBVSxrQkFBa0IsRUFBRSxLQUFLO0FBQ2hFLFVBQU0sYUFBYSxRQUFRLElBQUksWUFBWSxrQkFBa0IsRUFBRSxLQUFLO0FBR3BFLFVBQU0sZ0JBQWdCO0FBRXRCLFVBQU0sZUFBZSxVQUFVLGdCQUFnQjtBQUMvQyxVQUFNLGNBQWMsVUFBVSxlQUFlO0FBRTdDLFVBQU0sWUFBWSxHQUFHLGFBQWEsWUFBWSxDQUFDO0FBQy9DLFVBQU0sWUFBWSxHQUFHLFNBQVMsSUFBSSxZQUFZLFlBQVksQ0FBQztBQUUzRCxRQUFJLENBQUMsUUFBUSxPQUFPLElBQUksU0FBUyxHQUFHO0FBQ2xDLFVBQUksZ0JBQWdCLGVBQWU7QUFDakMsY0FBTSxNQUFNLGlCQUFpQixNQUFNLEtBQUs7QUFDeEMsZ0JBQVEsT0FBTztBQUFBLFVBQ2I7QUFBQSxVQUNBLFVBQVUsU0FBUyxJQUFJLFNBQVMsU0FBUyxHQUFHO0FBQUEsUUFDOUM7QUFBQSxNQUNGLE9BQU87QUFDTCxnQkFBUSxPQUFPO0FBQUEsVUFDYjtBQUFBLFVBQ0EsVUFBVSxTQUFTLElBQUksU0FBUztBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQVksSUFBSSxjQUFjO0FBQUEsTUFDbEMsTUFBTSxVQUFVO0FBQUEsTUFDaEIsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUVELFdBQU8sSUFBSSxlQUFlLFVBQVUsTUFBZ0IsV0FBVztBQUFBLE1BQzdEO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUOzs7QUNwRU8sSUFBTSwwQkFBMEIsQ0FBQztBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsTUFLNkI7QUFDM0IsTUFBSSxVQUFVLFdBQVc7QUFDdkIsVUFBTSxnQkFBZ0IsZUFBZTtBQUFBLE1BQ25DLENBQUMsTUFDQyxFQUFFLE1BQU0sWUFBWSxNQUFNLGVBQzFCLEVBQUUsWUFBWSxTQUFTLFdBQVc7QUFBQSxJQUN0QztBQUNBLFVBQU0sV0FBVyxlQUFlO0FBQUEsTUFDOUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxZQUFZLE1BQU0sVUFBVSxFQUFFLFlBQVksU0FBUyxNQUFNO0FBQUEsSUFDMUU7QUFDQSxVQUFNLGNBQWMsZUFBZTtBQUFBLE1BQ2pDLENBQUMsTUFDQyxFQUFFLE1BQU0sWUFBWSxNQUFNLGFBQzFCLEVBQUUsWUFBWSxTQUFTLFNBQVM7QUFBQSxJQUNwQztBQUVBLFFBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsYUFBYTtBQUMvQyxZQUFNLElBQUk7QUFBQSxRQUNSLGNBQWMsVUFBVSxJQUFJO0FBQUEsTUFDOUI7QUFBQSxJQUNGO0FBRUEsVUFBTSxnQkFBZ0IsUUFBUSxJQUFJLGNBQWMsY0FBYyxLQUFLO0FBQ25FLFVBQU0sV0FBVyxRQUFRLElBQUksU0FBUyxjQUFjLEtBQUs7QUFDekQsVUFBTSxjQUFjLFFBQVEsSUFBSSxZQUFZLGNBQWMsS0FBSztBQUUvRCxVQUFNLGtCQUFrQixVQUFVLG1CQUFtQjtBQUNyRCxVQUFNLFlBQVksZ0JBQWdCLFlBQVk7QUFDOUMsUUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLFNBQVMsR0FBRztBQUNsQyxjQUFRLE9BQU87QUFBQSxRQUNiO0FBQUEsUUFDQSxVQUFVLFNBQVMsSUFBSSxnQkFBZ0IsWUFBWSxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxTQUFTLElBQUksV0FBVztBQUFBLE1BQzVCLE1BQU0sVUFBVTtBQUFBLE1BQ2hCLFdBQVc7QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULE9BQU87QUFBQSxJQUNULENBQUM7QUFDRCxXQUFPLElBQUksZUFBZSxVQUFVLE1BQWdCLFFBQVE7QUFBQSxNQUMxRDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU87QUFDVDs7O0FDMURPLElBQU0sa0NBQWtDLENBQzdDLFNBQ0EsMEJBQ0EsWUFDRztBQUNILGFBQVcsYUFBYSwwQkFBMEI7QUFDaEQsUUFBSSxVQUFVLFNBQVMsNEJBQTZCO0FBRXBELFFBQUksVUFBVSxpQkFBaUIsT0FBTztBQUVwQyxVQUNFLDhCQUE4QixhQUM5Qiw4QkFBOEIsYUFDOUIsVUFBVSw0QkFDVixVQUFVLDBCQUNWO0FBQ0EsY0FBTSxlQUNKLFFBQVEsSUFBSSxVQUFVLHdCQUF3QixLQUFLO0FBQ3JELGNBQU0sZUFDSixRQUFRLElBQUksVUFBVSx3QkFBd0IsS0FBSztBQUVyRCxZQUFJLFFBQVE7QUFDWixjQUFNLGFBQWEsVUFBVTtBQUM3QixZQUFJLGVBQWUsWUFBWTtBQUM3QixnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFNBQVMsVUFBVSxXQUFXO0FBQ3BDLGdCQUFNLE9BQU8sVUFBVSxhQUFhO0FBQ3BDLGdCQUFNLFFBQVE7QUFDZCxnQkFBTSxpQkFBaUI7QUFDdkIsZ0JBQU0sUUFBUSxVQUFVLFNBQVM7QUFDakMsY0FBSSxPQUFPLEdBQUc7QUFDWixvQkFBUSxPQUFPLFFBQVEsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxjQUFjLElBQUksS0FBSztBQUFBLFVBQy9FLE9BQU87QUFDTCxvQkFBUSxNQUFNLFVBQVUsV0FBVyxDQUFDO0FBQUEsVUFDdEM7QUFBQSxRQUNGLFdBQVcsZUFBZSxVQUFVO0FBQ2xDLGdCQUFNLFlBQVk7QUFDbEIsZ0JBQU0sV0FBVyxVQUFVLFdBQVc7QUFDdEMsZ0JBQU0sT0FBTyxVQUFVLGFBQWE7QUFDcEMsZ0JBQU0sbUJBQW1CLFNBQVMsSUFBSSxXQUFXLElBQUk7QUFDckQsZ0JBQU0sb0JBQW9CLFVBQVUsV0FBVztBQUMvQyxnQkFBTSx3QkFBd0IsVUFBVSxnQkFBZ0I7QUFDeEQsZ0JBQU0sU0FBUyxvQkFDWCxVQUFVLFNBQVUsTUFDcEI7QUFDSixnQkFBTSxhQUFhLFVBQVUsY0FBYztBQUMzQyxnQkFBTSxjQUFjLFNBQVM7QUFDN0IsZ0JBQU0sUUFDSixVQUFVLGdCQUFnQixTQUN0QixVQUFVLGNBQWMsTUFDeEI7QUFDTixnQkFBTSxZQUNKLFVBQVUsY0FBYyxTQUNwQixzQkFBc0IsVUFBVSxZQUFZLEdBQUksSUFDaEQ7QUFDTixnQkFBTSxZQUNKLFVBQVUsY0FBYyxTQUNwQixzQkFBc0IsVUFBVSxZQUFZLEdBQUksSUFDaEQ7QUFDTixnQkFBTSxpQkFBaUIsd0JBQ25CLHNCQUFzQixVQUFVLGNBQWUsR0FBSSxJQUNuRCxzQkFBc0IsV0FBVztBQUNyQyxnQkFBTSxhQUFhLHNCQUFzQixNQUFNO0FBQy9DLGtCQUFRLFNBQVMsU0FBUyxJQUFJLFFBQVEsSUFBSSxzQkFBc0IsS0FBSyxDQUFDLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxjQUFjLElBQUksVUFBVTtBQUFBLFFBQ2xJLFdBQVcsVUFBVSxZQUFZLFFBQVc7QUFDMUMsa0JBQVEsTUFBTSxVQUFVLE9BQU87QUFBQSxRQUNqQztBQUVBLFlBQUksT0FBTztBQUNULGdCQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLFlBQ2hELE1BQU0sVUFBVTtBQUFBLFlBQ2hCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFFRCxnQkFBTSxpQkFBaUIsSUFBSTtBQUFBLFlBQ3pCLFVBQVU7QUFBQSxZQUNWO0FBQUEsWUFDQSxDQUFDLGNBQWMsWUFBWTtBQUFBLFVBQzdCO0FBQ0Esa0JBQVEsYUFBYSxjQUFjO0FBQUEsUUFDckM7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUFPO0FBRUwsWUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxZQUFNLGlCQUFpQixVQUFVO0FBRWpDLFVBQ0Usa0JBQ0Esa0JBQ0EsYUFBYSxhQUNiLFVBQVUsWUFBWSxRQUN0QjtBQUNBLGNBQU0sZUFBZSxRQUFRLElBQUksY0FBYyxLQUFLO0FBQ3BELGNBQU0sZUFBZSxRQUFRLElBQUksY0FBYyxLQUFLO0FBRXBELGNBQU0sbUJBQW1CLElBQUkscUJBQXFCO0FBQUEsVUFDaEQsTUFBTSxVQUFVO0FBQUEsVUFDaEI7QUFBQSxVQUNBO0FBQUEsVUFDQSxPQUFPLE1BQU8sVUFBa0IsT0FBTztBQUFBLFFBQ3pDLENBQUM7QUFFRCxjQUFNLGlCQUFpQixJQUFJO0FBQUEsVUFDekIsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBLENBQUMsY0FBYyxZQUFZO0FBQUEsUUFDN0I7QUFDQSxnQkFBUSxhQUFhLGNBQWM7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQ25ITyxJQUFNLGtDQUFrQyxDQUM3QyxTQUNBLDBCQUNBLFlBQ0c7QUFDSCxhQUFXLGFBQWEsMEJBQTBCO0FBQ2hELFFBQUksVUFBVSxTQUFTLDRCQUE2QjtBQUVwRCxRQUFJLFVBQVUsaUJBQWlCLE9BQU87QUFFcEMsWUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxZQUFNLGlCQUFpQixVQUFVO0FBRWpDLFVBQUksa0JBQWtCLGdCQUFnQjtBQUNwQyxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUNwRCxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUVwRCxZQUFJLFFBQVE7QUFDWixjQUFNLGFBQWEsVUFBVTtBQUM3QixZQUFJLGVBQWUsWUFBWTtBQUM3QixnQkFBTSxXQUFXO0FBQ2pCLGdCQUFNLFVBQVUsVUFBVSx3QkFBd0IsS0FBSztBQUN2RCxnQkFBTSxPQUFPLFVBQVUsYUFBYTtBQUNwQyxnQkFBTSxRQUFRO0FBQ2QsZ0JBQU0saUJBQWlCO0FBQ3ZCLGdCQUFNLFFBQVEsVUFBVSxTQUFTO0FBQ2pDLGNBQUksT0FBTyxHQUFHO0FBQ1osb0JBQVEsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksY0FBYyxJQUFJLEtBQUs7QUFBQSxVQUMvRSxPQUFPO0FBQ0wsb0JBQVEsTUFBTSxNQUFNO0FBQUEsVUFDdEI7QUFBQSxRQUNGLFdBQVcsZUFBZSxVQUFVO0FBQ2xDLGdCQUFNLFlBQVk7QUFDbEIsZ0JBQU0sV0FBVyxVQUFVLHdCQUF3QjtBQUNuRCxnQkFBTSxPQUFPLFVBQVUsYUFBYTtBQUNwQyxnQkFBTSxtQkFBbUIsU0FBUyxJQUFJLFdBQVcsSUFBSTtBQUNyRCxnQkFBTSxTQUFTO0FBQ2YsZ0JBQU0sYUFBYSxVQUFVLGNBQWM7QUFDM0MsZ0JBQU0sY0FBYyxTQUFTO0FBQzdCLGdCQUFNLFFBQVE7QUFDZCxnQkFBTSxZQUFZO0FBQ2xCLGdCQUFNLFlBQVk7QUFDbEIsa0JBQVEsU0FBUyxTQUFTLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFdBQVcsSUFBSSxNQUFNO0FBQUEsUUFDcEc7QUFFQSxZQUFJLE9BQU87QUFDVCxnQkFBTSxtQkFBbUIsSUFBSSxxQkFBcUI7QUFBQSxZQUNoRCxNQUFNLFVBQVU7QUFBQSxZQUNoQjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBRUQsZ0JBQU0saUJBQWlCLElBQUk7QUFBQSxZQUN6QixVQUFVO0FBQUEsWUFDVjtBQUFBLFlBQ0EsQ0FBQyxjQUFjLFlBQVk7QUFBQSxVQUM3QjtBQUNBLGtCQUFRLGFBQWEsY0FBYztBQUFBLFFBQ3JDO0FBQUEsTUFDRjtBQUFBLElBQ0YsT0FBTztBQUVMLFlBQU0saUJBQWlCLFVBQVU7QUFDakMsWUFBTSxpQkFBaUIsVUFBVTtBQUVqQyxVQUNFLGtCQUNBLGtCQUNBLGFBQWEsYUFDYixVQUFVLFlBQVksUUFDdEI7QUFDQSxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUNwRCxjQUFNLGVBQWUsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUVwRCxjQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLFVBQ2hELE1BQU0sVUFBVTtBQUFBLFVBQ2hCO0FBQUEsVUFDQTtBQUFBLFVBQ0EsT0FBTyxNQUFNLFVBQVUsT0FBTztBQUFBLFFBQ2hDLENBQUM7QUFFRCxjQUFNLGlCQUFpQixJQUFJO0FBQUEsVUFDekIsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBLENBQUMsY0FBYyxZQUFZO0FBQUEsUUFDN0I7QUFDQSxnQkFBUSxhQUFhLGNBQWM7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQ3JGQSxJQUFNLG1CQUFtQixDQUFDLFVBQVUsVUFBVSxVQUFVLE9BQU87QUFtQi9ELElBQU0scUJBQXFCLENBQUMsY0FBNkIsVUFBa0I7QUFDekUsUUFBTSxRQUFRLGFBQWE7QUFBQSxJQUFLLENBQUMsTUFDL0IsRUFBRSx5QkFBeUIsU0FBUyxLQUFLO0FBQUEsRUFDM0M7QUFDQSxTQUFPLE9BQU8sMEJBQTBCLENBQUM7QUFDM0M7QUFFQSxJQUFNLHFDQUFxQyxDQUFDO0FBQUEsRUFDMUM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUtNO0FBQ0osTUFBSSxjQUFjO0FBQ2hCLFdBQU8sUUFBUSxJQUFJLFlBQVk7QUFBQSxFQUNqQztBQUVBLE1BQUksQ0FBQyxZQUFhLFFBQU87QUFFekIsUUFBTSxzQkFBc0IsbUJBQW1CLGNBQWMsV0FBVztBQUN4RSxNQUFJLENBQUMsb0JBQXFCLFFBQU87QUFFakMsU0FBTyxRQUFRLElBQUksbUJBQW1CO0FBQ3hDO0FBRUEsSUFBTSw0QkFBNEIsQ0FBQyxVQUNqQztBQUFBLEVBQ0UsU0FBUyxNQUFNLDJCQUEyQjtBQUFBLEVBQzFDO0FBQ0Y7QUFFSyxJQUFNLDhCQUE4QixDQUN6QyxTQUNBLGVBQ0Esa0JBQ0EseUJBQ0EsY0FDQSxZQUNHO0FBQ0gsTUFBSSxDQUFDLGNBQWU7QUFFcEIsUUFBTSx3QkFDSixjQUFjLGlCQUFpQixTQUFTLFdBQVcsS0FBSztBQUMxRCxRQUFNLHdCQUF3QixvQkFBSSxJQUFZO0FBRTlDLFFBQU0sZUFBZSxjQUFjO0FBQ25DLE1BQUksY0FBYztBQUNoQixVQUFNLGNBQWMsaUJBQ2pCLElBQUksQ0FBQyxRQUFRO0FBQ1osWUFBTSxRQUFRLGFBQWEsR0FBRztBQUM5QixhQUFPLFVBQVUsU0FBWSxPQUFPLEdBQUcsR0FBRyxJQUFJLEtBQUs7QUFBQSxJQUNyRCxDQUFDLEVBQ0EsT0FBTyxDQUFDLFNBQXlCLFNBQVMsSUFBSTtBQUVqRCxRQUFJLFlBQVksU0FBUyxHQUFHO0FBQzFCLGNBQVEsaUJBQWlCLEtBQUssWUFBWSxZQUFZLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFBQSxJQUNuRTtBQUFBLEVBQ0Y7QUFHQSxNQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFDL0IsVUFBTSxzQkFBbUQsQ0FBQztBQUUxRCxlQUFXLFNBQVMsa0JBQWtCO0FBQ3BDLFlBQU0saUJBQWlCLG1DQUFtQztBQUFBLFFBQ3hELGNBQWMsTUFBTTtBQUFBLFFBQ3BCLGFBQWEsTUFBTTtBQUFBLFFBQ25CO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksQ0FBQyxlQUFnQjtBQUVyQixZQUFNLGVBQ0osTUFBTSxrQ0FDTixNQUFNO0FBRVIsVUFBSSxjQUFjO0FBQ2hCLGNBQU0sb0JBQW9CLG1DQUFtQztBQUFBLFVBQzNELGNBQWMsTUFBTTtBQUFBLFVBQ3BCLGFBQWEsTUFBTTtBQUFBLFVBQ25CO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUNELFlBQUkscUJBQXFCLHNCQUFzQixLQUFLO0FBQ2xELGdCQUFNLGNBQWMsS0FBSyxjQUFjLElBQUksaUJBQWlCO0FBQzVELGdDQUFzQixJQUFJLFdBQVc7QUFDckMsOEJBQW9CLEtBQUs7QUFBQSxZQUN2Qiw2QkFBNkIsTUFBTTtBQUFBLFlBQ25DLE1BQU0sTUFBTTtBQUFBLFlBQ1osY0FBYztBQUFBLFlBQ2Qsa0JBQWtCO0FBQUEsWUFDbEIscUJBQXFCO0FBQUEsVUFDdkIsQ0FBQztBQUFBLFFBQ0gsV0FBVyxtQkFBbUIsS0FBSztBQUNqQyxnQkFBTSxjQUFjLEtBQUssY0FBYztBQUN2QyxnQ0FBc0IsSUFBSSxXQUFXO0FBQ3JDLDhCQUFvQixLQUFLO0FBQUEsWUFDdkIsNkJBQTZCLE1BQU07QUFBQSxZQUNuQyxNQUFNLE1BQU07QUFBQSxZQUNaLGNBQWM7QUFBQSxZQUNkLGtCQUFrQjtBQUFBLFlBQ2xCLHFCQUFxQjtBQUFBLFVBQ3ZCLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRixPQUFPO0FBRUwsWUFBSSxtQkFBbUIsS0FBSztBQUMxQixnQkFBTSxjQUFjLEtBQUssY0FBYztBQUN2QyxnQ0FBc0IsSUFBSSxXQUFXO0FBQ3JDLDhCQUFvQixLQUFLO0FBQUEsWUFDdkIsNkJBQTZCLE1BQU07QUFBQSxZQUNuQyxNQUFNLE1BQU07QUFBQSxZQUNaLGNBQWM7QUFBQSxZQUNkLGtCQUFrQjtBQUFBLFVBQ3BCLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxRQUFJLG9CQUFvQixTQUFTLEtBQUssdUJBQXVCO0FBQzNELGlCQUFXLFdBQVcscUJBQXFCO0FBQ3pDLGdCQUFRLGlCQUFpQjtBQUFBLFVBQ3ZCLHFCQUFxQixLQUFLLFVBQVUsT0FBTyxDQUFDO0FBQUEsUUFDOUM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFJQSxNQUFJLHdCQUF3QixTQUFTLEdBQUc7QUFDdEMsVUFBTSwwQkFBMEIsb0JBQUksSUFBWTtBQUNoRCxVQUFNLDZCQUEwRCxDQUFDO0FBRWpFLGVBQVcsU0FBUyx5QkFBeUI7QUFDM0MsWUFBTSxtQkFBbUIsbUNBQW1DO0FBQUEsUUFDMUQsY0FBYyxNQUFNO0FBQUEsUUFDcEIsYUFBYSxNQUFNO0FBQUEsUUFDbkI7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQ0QsWUFBTSxtQkFBbUIsbUNBQW1DO0FBQUEsUUFDMUQsY0FBYyxNQUFNO0FBQUEsUUFDcEIsYUFBYSxNQUFNO0FBQUEsUUFDbkI7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBRUQsVUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFrQjtBQUU1QyxZQUFNLDZCQUE2QiwwQkFBMEIsS0FBSztBQUNsRSxVQUFJLHlCQUF5QjtBQUM3QixVQUFJLGlCQUFpQjtBQUNyQixhQUFPLHdCQUF3QixJQUFJLHNCQUFzQixHQUFHO0FBQzFELGlDQUF5QixHQUFHLDBCQUEwQixJQUFJLGdCQUFnQjtBQUFBLE1BQzVFO0FBQ0EsOEJBQXdCLElBQUksc0JBQXNCO0FBRWxELFlBQU0sOEJBQThCLElBQUksc0JBQXNCO0FBQzlELFlBQU0sY0FBYyxLQUFLLDJCQUEyQjtBQUNwRCxZQUFNLG1CQUFtQixJQUFJLHFCQUFxQjtBQUFBLFFBQ2hELE1BQU07QUFBQSxRQUNOLGNBQWM7QUFBQSxRQUNkLGNBQWM7QUFBQSxRQUNkLE9BQU87QUFBQSxNQUNULENBQUM7QUFFRCxjQUFRO0FBQUEsUUFDTixJQUFJLGVBQWUsd0JBQXdCLGtCQUFrQjtBQUFBLFVBQzNEO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFFQSxVQUFJLHVCQUF1QjtBQUN6Qiw4QkFBc0IsSUFBSSxXQUFXO0FBQUEsTUFDdkM7QUFDQSxpQ0FBMkIsS0FBSztBQUFBLFFBQzlCLDZCQUE2QixNQUFNO0FBQUEsUUFDbkMsTUFBTSxNQUFNO0FBQUEsUUFDWixjQUFjO0FBQUEsUUFDZCwyQkFBMkI7QUFBQSxRQUMzQixvQkFBb0I7QUFBQSxRQUNwQixvQkFBb0I7QUFBQSxNQUN0QixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksMkJBQTJCLFNBQVMsR0FBRztBQUN6QyxpQkFBVyxXQUFXLDRCQUE0QjtBQUNoRCxnQkFBUSxpQkFBaUI7QUFBQSxVQUN2Qiw2QkFBNkIsS0FBSyxVQUFVLE9BQU8sQ0FBQztBQUFBLFFBQ3REO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxzQkFBc0IsT0FBTyxLQUFLLHVCQUF1QjtBQUMzRCxVQUFNLGVBQWUsQ0FBQyxHQUFHLHFCQUFxQixFQUFFLEtBQUssR0FBRztBQUN4RCxZQUFRLGdCQUFnQixLQUFLLGVBQWUsWUFBWSxFQUFFO0FBQzFELFlBQVEsZUFBZSxLQUFLLFNBQVMsWUFBWSxFQUFFO0FBQUEsRUFDckQ7QUFFQSxRQUFNLGNBQWMsY0FBYztBQUNsQyxRQUFNLFVBQVUsY0FBYztBQUM5QixRQUFNLGNBQWMsY0FBYztBQUVsQyxNQUFJLGVBQWUsU0FBUztBQUUxQixVQUFNLGFBQWEsZUFBZSxLQUFLO0FBRXZDLFFBQUksVUFBVSxTQUFTO0FBQUEsTUFDckIsY0FBYztBQUFBLElBQ2hCLENBQUMsSUFBSSxxQkFBcUIsVUFBVSxHQUFJLENBQUM7QUFDekMsUUFBSSxZQUFZLEdBQUc7QUFDakIsaUJBQVcsSUFBSSxxQkFBcUIsU0FBUyxDQUFDO0FBQUEsSUFDaEQ7QUFDQSxlQUFXO0FBQ1gsWUFBUSxjQUFjO0FBQUEsRUFDeEI7QUFDRjs7O0FDelBBLElBQU0sd0JBQXdCO0FBQzlCLElBQU0sOEJBQThCO0FBQUEsVUFDMUIscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVF2QixxQkFBcUI7QUFBQSxFQUMzQixLQUFLO0FBRUEsSUFBTSwwQkFBMEIsQ0FDckMsU0FDQSxrQkFDQSxZQUNHO0FBQ0gsTUFBSSxpQkFBaUIsV0FBVyxFQUFHO0FBRW5DLE1BQUksQ0FBQyxRQUFRLE9BQU8sSUFBSSxxQkFBcUIsR0FBRztBQUM5QyxZQUFRLE9BQU8sSUFBSSx1QkFBdUIsMkJBQTJCO0FBQUEsRUFDdkU7QUFFQSxhQUFXLFlBQVksa0JBQWtCO0FBQ3ZDLFFBQUksU0FBUyxTQUFTLG9CQUFxQjtBQUUzQyxVQUFNLHdCQUNKLFFBQVEsSUFBSSxTQUFTLGtDQUFrQyxLQUFLO0FBQzlELFVBQU0scUJBQ0osUUFBUSxJQUFJLFNBQVMsOEJBQThCLEtBQUs7QUFDMUQsVUFBTSxhQUFhLFFBQVEsSUFBSSxTQUFTLHFCQUFxQixLQUFLO0FBQ2xFLFVBQU0scUJBQ0osUUFBUSxJQUFJLFNBQVMsOEJBQThCLEtBQUs7QUFDMUQsVUFBTSxxQkFDSixRQUFRLElBQUksU0FBUyw4QkFBOEIsS0FBSztBQUUxRCxVQUFNLFFBQVE7QUFBQSxNQUNaO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsSUFBSSxzQkFBc0I7QUFBQSxNQUN6QyxNQUFNLFNBQVM7QUFBQSxNQUNmO0FBQUEsTUFDQSxnQkFBZ0I7QUFBQSxJQUNsQixDQUFDO0FBRUQsVUFBTSxpQkFBaUIsSUFBSTtBQUFBLE1BQ3pCLFNBQVM7QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxZQUFRLGFBQWEsY0FBYztBQUFBLEVBQ3JDO0FBQ0Y7OztBQzFETyxTQUFTLGlCQUNkLFFBQ2tEO0FBQ2xELFFBQU0sT0FBTyxPQUNWLE1BQU0sT0FBTyxFQUNiLElBQUksQ0FBQ0EsVUFBU0EsTUFBSyxLQUFLLENBQUMsRUFDekIsS0FBSyxDQUFDQSxVQUFTLGdCQUFnQixLQUFLQSxLQUFJLENBQUM7QUFFNUMsTUFBSSxDQUFDLEtBQU0sUUFBTztBQUVsQixRQUFNLFNBQVMsS0FBSyxNQUFNLEtBQUs7QUFDL0IsUUFBTSxZQUFZLE9BQU8sQ0FBQztBQUMxQixRQUFNLFdBQVcsT0FBTyxNQUFNLENBQUM7QUFFL0IsTUFBSSxDQUFDLGFBQWEsU0FBUyxXQUFXLEVBQUcsUUFBTztBQUNoRCxTQUFPLEVBQUUsV0FBVyxTQUFTO0FBQy9CO0FBRU8sU0FBUyxrQ0FDZCxTQUNBLDRCQUNBLFNBQ0E7QUFDQSxNQUFJLDJCQUEyQixXQUFXLEVBQUc7QUFFN0MsYUFBVyw2QkFBNkIsNEJBQTRCO0FBQ2xFLFVBQU0sZUFBZTtBQUFBLE1BQ25CLDBCQUEwQjtBQUFBLElBQzVCO0FBRUEsUUFBSSxDQUFDLGFBQWM7QUFFbkIsVUFBTSxFQUFFLFdBQVcsU0FBUyxJQUFJO0FBRWhDLFFBQUksQ0FBQyxRQUFRLE9BQU8sSUFBSSxTQUFTLEdBQUc7QUFDbEMsY0FBUSxPQUFPLElBQUksV0FBVywwQkFBMEIsaUJBQWlCO0FBQUEsSUFDM0U7QUFFQSxVQUFNLFFBQVEsU0FBUyxJQUFJLENBQUMsaUJBQWlCO0FBQzNDLFlBQU0sZUFDSiwwQkFBMEIsNkJBQTZCLFlBQVk7QUFDckUsYUFBTyxRQUFRLElBQUksWUFBWSxLQUFLO0FBQUEsSUFDdEMsQ0FBQztBQUVELFVBQU0sd0JBQXdCLElBQUksc0JBQXNCO0FBQUEsTUFDdEQsTUFBTSwwQkFBMEI7QUFBQSxNQUNoQztBQUFBLE1BQ0EsZ0JBQWdCO0FBQUEsSUFDbEIsQ0FBQztBQUVELFlBQVE7QUFBQSxNQUNOLElBQUk7QUFBQSxRQUNGLDBCQUEwQjtBQUFBLFFBQzFCO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QTFCakNPLFNBQVMsbUJBQ2QsYUFDYztBQUNkLFFBQU0sVUFBVSxJQUFJLGFBQWEsaUNBQWlDO0FBQ2xFLFFBQU0sbUJBQW1CLEdBQUcsV0FBVyxFQUFFLGlCQUFpQixLQUFLO0FBQy9ELFFBQU0sY0FBYyxHQUFHLFdBQVcsRUFBRSxZQUFZLEtBQUs7QUFDckQsUUFBTSxlQUFlLEdBQUcsV0FBVyxFQUFFLGFBQWEsS0FBSztBQUN2RCxRQUFNLG1CQUFtQixZQUFZO0FBQUEsSUFDbkMsQ0FBQyxRQUFRLElBQUksU0FBUztBQUFBLEVBQ3hCO0FBQ0EsUUFBTSwwQkFBMEIsWUFBWTtBQUFBLElBQzFDLENBQUMsUUFBUSxJQUFJLFNBQVM7QUFBQSxFQUN4QjtBQUNBLFFBQU0scUJBQXFCLFlBQ3hCO0FBQUEsSUFDQyxDQUFDLFlBQWEsUUFBOEIsU0FBUztBQUFBLEVBQ3ZELEVBQ0MsSUFBSSxDQUFDLFlBQVksT0FBc0M7QUFDMUQsUUFBTSxtQkFBbUIsWUFBWTtBQUFBLElBQ25DLENBQUMsUUFBUSxJQUFJLFNBQVM7QUFBQSxFQUN4QjtBQUNBLFFBQU0sNkJBQTZCLFlBQVk7QUFBQSxJQUM3QyxDQUFDLFFBQVEsSUFBSSxTQUFTO0FBQUEsRUFDeEI7QUFDQSxRQUFNLHNCQUFzQixvQkFBSSxJQUE4QjtBQUU5RCxhQUFXLGFBQWEsb0JBQW9CO0FBQzFDLFFBQUksVUFBVSxxQkFBcUI7QUFDakMsMEJBQW9CLElBQUksVUFBVSxxQkFBcUIsU0FBUztBQUFBLElBQ2xFO0FBQUEsRUFDRjtBQUVBLFFBQU0sVUFBVSw0Q0FBNEMsV0FBVztBQUd2RSxRQUFNLFVBQVUsb0JBQUksSUFBb0I7QUFDeEMsUUFBTSxnQkFBZ0Isb0JBQUksSUFBb0I7QUFDOUMsTUFBSSxjQUFjO0FBRWxCLFFBQU0sYUFBYSxvQkFBSSxJQUFZO0FBQ25DLE1BQUksaUJBQWlCLFNBQVMsR0FBRztBQUMvQixlQUFXLFNBQVMsa0JBQWtCO0FBQ3BDLFVBQUksTUFBTSxNQUFNO0FBQ2QsbUJBQVcsSUFBSSxNQUFNLElBQUk7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBR0EsUUFBTSxvQkFBb0IsQ0FBQyxHQUFHLFVBQVUsRUFDckMsSUFBSSxDQUFDLFNBQVMsWUFBWSxLQUFLLElBQUksQ0FBQyxFQUNwQyxPQUFPLENBQUMsTUFBNEIsTUFBTSxJQUFJLEVBQzlDLElBQUksQ0FBQyxNQUFNLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRWhDLE1BQUksa0JBQWtCLFNBQVMsR0FBRztBQUNoQyxrQkFBYyxLQUFLLElBQUksR0FBRyxpQkFBaUIsSUFBSTtBQUFBLEVBQ2pEO0FBRUEsUUFBTSxhQUFhLG9CQUFJLElBQVk7QUFHbkMsUUFBTSxrQkFBa0IsSUFBSTtBQUFBLElBQzFCLEdBQUcsV0FBVyxFQUNYLFdBQVcsS0FBSyxFQUNoQixPQUFPLENBQUMsT0FBTyxHQUFHLE1BQU0sWUFBWSxFQUFFLFNBQVMsS0FBSyxDQUFDLEVBQ3JELElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYTtBQUFBLEVBQ2pDO0FBRUEsTUFBSSxnQkFBZ0IsT0FBTyxHQUFHO0FBQzVCLGVBQVcsU0FBUyxHQUFHLFdBQVcsRUFBRSxhQUFhLEtBQUssR0FBRztBQUN2RCxVQUFJLE1BQU0sMEJBQTBCLFNBQVMsR0FBRztBQUM5QyxjQUFNLGFBQWEsTUFBTSx5QkFBeUI7QUFBQSxVQUFLLENBQUMsVUFDdEQsZ0JBQWdCLElBQUksS0FBSztBQUFBLFFBQzNCO0FBQ0EsWUFBSSxZQUFZO0FBQ2QsZ0JBQU0sYUFBYSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELGdCQUFNLFNBQVMsUUFBUSxvQkFBb0IsVUFBVTtBQUNyRCxjQUFJLFFBQVE7QUFDVix1QkFBVyxJQUFJLE1BQU07QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFHQSxRQUFNLGNBQWMsWUFBWSxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sWUFBWSxNQUFNLEtBQUs7QUFDN0UsYUFBVyxjQUFjLGFBQWE7QUFDcEMsVUFBTSxZQUFZLFFBQVEsb0JBQW9CLFdBQVcsY0FBYztBQUN2RSxRQUFJLFdBQVc7QUFDYixpQkFBVyxJQUFJLFNBQVM7QUFBQSxJQUMxQjtBQUFBLEVBQ0Y7QUFFQSxhQUFXLGFBQWEsR0FBRyxXQUFXLEVBQUUsMEJBQTBCLEtBQUssR0FBRztBQUN4RSxVQUFNLGNBQ0gsVUFBa0IsMkJBQ2xCLFVBQWtCO0FBQ3JCLFFBQUksYUFBYTtBQUNmLFlBQU0sVUFBVSxRQUFRLG9CQUFvQixXQUFXO0FBQ3ZELFVBQUksU0FBUztBQUNYLG1CQUFXLElBQUksT0FBTztBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxhQUFXLGFBQWEsWUFBWTtBQUNsQyxrQkFBYyxJQUFJLFdBQVcsR0FBRztBQUFBLEVBQ2xDO0FBR0EsTUFBSSxpQkFBaUIsU0FBUyxHQUFHO0FBQy9CLGVBQVcsU0FBUyxrQkFBa0I7QUFDcEMsVUFBSSxDQUFDLE1BQU0sS0FBTTtBQUVqQixVQUNFLE1BQU0sa0NBQ04sTUFBTSwrQkFDTjtBQUNBO0FBQUEsTUFDRjtBQUVBLFVBQUk7QUFDSixZQUFNLGlCQUFpQixNQUFNO0FBQzdCLFlBQU0sZ0JBQWdCLE1BQU07QUFFNUIsVUFBSSxnQkFBZ0I7QUFDbEIsY0FBTSxRQUFRLG9CQUFvQixjQUFjO0FBQUEsTUFDbEQsV0FBVyxlQUFlO0FBQ3hCLGNBQU0sUUFBUSxhQUFhO0FBQUEsVUFBSyxDQUFDLE1BQy9CLEVBQUUseUJBQXlCLFNBQVMsYUFBYztBQUFBLFFBQ3BEO0FBQ0EsWUFBSSxTQUFTLE1BQU0sMEJBQTBCLFNBQVMsR0FBRztBQUN2RCxnQkFBTSxTQUFTLE1BQU0sMEJBQTBCLENBQUM7QUFDaEQsZ0JBQU0sUUFBUSxvQkFBb0IsTUFBTTtBQUFBLFFBQzFDO0FBQUEsTUFDRjtBQUVBLFVBQUksS0FBSztBQUNQLFlBQUksQ0FBQyxjQUFjLElBQUksR0FBRyxHQUFHO0FBQzNCLHdCQUFjLElBQUksS0FBSyxNQUFNLElBQUk7QUFBQSxRQUNuQztBQUFBLE1BQ0YsV0FBVyxrQkFBa0IsTUFBTSxNQUFNO0FBR3ZDLGdCQUFRLElBQUksZ0JBQWdCLE1BQU0sSUFBSTtBQUFBLE1BQ3hDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFHQSxhQUFXLFFBQVEsYUFBYTtBQUM5QixVQUFNLFNBQVMsS0FBSztBQUNwQixVQUFNLE1BQU0sUUFBUSxvQkFBb0IsTUFBTTtBQUM5QyxRQUFJLEtBQUs7QUFDUCxVQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsR0FBRztBQUMzQixzQkFBYyxJQUFJLEtBQUssSUFBSSxhQUFhLEVBQUU7QUFBQSxNQUM1QztBQUNBLGNBQVEsSUFBSSxRQUFRLGNBQWMsSUFBSSxHQUFHLENBQUU7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFHQSxhQUFXLFFBQVEsYUFBYTtBQUM5QixVQUFNLFNBQVMsS0FBSztBQUVwQixRQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sR0FBRztBQUV4QixjQUFRLElBQUksUUFBUSxJQUFJLGFBQWEsRUFBRTtBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUdBLGFBQVcsYUFBYSxrQkFBa0I7QUFDeEMsUUFBSSxVQUFVLFNBQVMsbUJBQW9CO0FBRTNDLFVBQU0saUJBQWlCLEdBQUcsV0FBVyxFQUNsQyxZQUFZLEtBQUs7QUFBQSxNQUNoQixxQkFBcUIsVUFBVTtBQUFBLElBQ2pDLENBQUMsRUFDQSxLQUFLLENBQUMsR0FBRyxPQUFPLEVBQUUsY0FBYyxNQUFNLEVBQUUsY0FBYyxFQUFFO0FBRzNELFVBQU0sUUFBUSxlQUFlLElBQUksQ0FBQyxTQUFTO0FBQ3pDLGFBQU8sUUFBUSxJQUFJLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFDN0MsQ0FBQztBQUdELFFBQUksV0FBVyxXQUFXO0FBQ3hCLFVBQUksaUJBQXdDO0FBRTVDLGNBQVMsVUFBZ0MsT0FBTztBQUFBLFFBQzlDLEtBQUssbUJBQW1CO0FBQ3RCLDJCQUFpQixzQkFBc0IsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUMzRDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssaUJBQWlCO0FBQ3BCLDJCQUFpQixvQkFBb0I7QUFBQSxZQUNuQztBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUNEO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxvQkFBb0I7QUFDdkIsMkJBQWlCLHVCQUF1QixFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQzVEO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxnQkFBZ0I7QUFDbkIsMkJBQWlCLG1CQUFtQjtBQUFBLFlBQ2xDO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBQ0Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLGNBQWM7QUFDakIsMkJBQWlCLGlCQUFpQjtBQUFBLFlBQ2hDO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBQ0Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLG1CQUFtQjtBQUN0QiwyQkFBaUIsc0JBQXNCLEVBQUUsV0FBVyxNQUFNLENBQUM7QUFDM0Q7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLGlCQUFpQjtBQUNwQiwyQkFBaUIsb0JBQW9CO0FBQUEsWUFDbkM7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFDRDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUsscUJBQXFCO0FBQ3hCLDJCQUFpQix3QkFBd0I7QUFBQSxZQUN2QztBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUNEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLGdCQUFnQjtBQUNsQixnQkFBUSxhQUFhLGNBQWM7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUE7QUFBQSxJQUNFO0FBQUEsSUFDQSxHQUFHLFdBQVcsRUFBRSwwQkFBMEIsS0FBSztBQUFBLElBQy9DO0FBQUEsRUFDRjtBQUVBO0FBQUEsSUFDRTtBQUFBLElBQ0EsR0FBRyxXQUFXLEVBQUUsMEJBQTBCLEtBQUs7QUFBQSxJQUMvQztBQUFBLEVBQ0Y7QUFFQSwwQkFBd0IsU0FBUyxrQkFBa0IsT0FBTztBQUUxRDtBQUFBLElBQ0U7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLHVCQUF1QixZQUFZO0FBQUEsSUFDdkMsQ0FBQyxRQUFRLElBQUksU0FBUztBQUFBLEVBQ3hCO0FBQ0EsTUFBSTtBQUNGO0FBQUEsTUFDRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUVGLFNBQU87QUFDVDs7O0EyQmpVTyxJQUFNLGtCQUFOLE1BQXNCO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsRUFFQSxZQUFZLE1BQWMsTUFBZ0I7QUFDeEMsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0FBQUEsRUFDZDtBQUFBLEVBRUEsZ0JBQXdCO0FBQ3RCLFVBQU0sWUFBWSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQ3BDLFVBQU0sU0FBUyxXQUFXLEtBQUssSUFBSSxJQUFJLFNBQVM7QUFDaEQsVUFBTSxTQUFTLFNBQVMsS0FBSyxJQUFJO0FBRWpDLFVBQU0sT0FBTyxxQkFBcUIsS0FBSyxJQUFJO0FBRTNDLFdBQU8sQ0FBQyxJQUFJLFFBQVEsTUFBTSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUEsRUFDN0M7QUFDRjsiLAogICJuYW1lcyI6IFsibGluZSJdCn0K
|