nextlove 2.20.0 → 3.0.1
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/chunk-YXLCP6YR.mjs +241 -0
- package/dist/generators/index.js +426 -159
- package/dist/generators/index.mjs +241 -156
- package/dist/index.d.ts +4 -4
- package/dist/index.js +107 -30
- package/dist/index.mjs +40 -30
- package/package.json +3 -5
package/dist/generators/index.js
CHANGED
|
@@ -3824,7 +3824,7 @@ var require_stream = __commonJS({
|
|
|
3824
3824
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3825
3825
|
exports.merge = void 0;
|
|
3826
3826
|
var merge22 = require_merge2();
|
|
3827
|
-
function
|
|
3827
|
+
function merge(streams) {
|
|
3828
3828
|
const mergedStream = merge22(streams);
|
|
3829
3829
|
streams.forEach((stream) => {
|
|
3830
3830
|
stream.once("error", (error) => mergedStream.emit("error", error));
|
|
@@ -3833,7 +3833,7 @@ var require_stream = __commonJS({
|
|
|
3833
3833
|
mergedStream.once("end", () => propagateCloseEventToSources(streams));
|
|
3834
3834
|
return mergedStream;
|
|
3835
3835
|
}
|
|
3836
|
-
exports.merge =
|
|
3836
|
+
exports.merge = merge;
|
|
3837
3837
|
function propagateCloseEventToSources(streams) {
|
|
3838
3838
|
streams.forEach((stream) => stream.emit("close"));
|
|
3839
3839
|
}
|
|
@@ -6748,7 +6748,6 @@ var parseRoutesInPackage = async (opts) => {
|
|
|
6748
6748
|
|
|
6749
6749
|
// src/generators/lib/zod-openapi.ts
|
|
6750
6750
|
init_cjs_shims();
|
|
6751
|
-
var import_ts_deepmerge = __toESM(require("ts-deepmerge"));
|
|
6752
6751
|
var import_zod = require("zod");
|
|
6753
6752
|
|
|
6754
6753
|
// src/generators/lib/front-matter.ts
|
|
@@ -6829,16 +6828,235 @@ function dashifyObjectKeys(obj) {
|
|
|
6829
6828
|
);
|
|
6830
6829
|
}
|
|
6831
6830
|
|
|
6831
|
+
// src/lib/zod-compat.ts
|
|
6832
|
+
init_cjs_shims();
|
|
6833
|
+
function getDef(schema) {
|
|
6834
|
+
if ("_zod" in schema) {
|
|
6835
|
+
return schema._zod.def;
|
|
6836
|
+
}
|
|
6837
|
+
return schema._def;
|
|
6838
|
+
}
|
|
6839
|
+
function getTypeName(schema) {
|
|
6840
|
+
var _a;
|
|
6841
|
+
if ("_zod" in schema) {
|
|
6842
|
+
const zod = schema._zod;
|
|
6843
|
+
const constructorName = schema.constructor.name;
|
|
6844
|
+
if (constructorName && constructorName.startsWith("$Zod")) {
|
|
6845
|
+
return constructorName.slice(1);
|
|
6846
|
+
}
|
|
6847
|
+
if (zod.def && zod.def.type) {
|
|
6848
|
+
return normalizeZodV4Type(zod.def.type);
|
|
6849
|
+
}
|
|
6850
|
+
return constructorName || "Unknown";
|
|
6851
|
+
}
|
|
6852
|
+
return ((_a = schema._def) == null ? void 0 : _a.typeName) || "Unknown";
|
|
6853
|
+
}
|
|
6854
|
+
function normalizeZodV4Type(type) {
|
|
6855
|
+
const typeMap = {
|
|
6856
|
+
string: "ZodString",
|
|
6857
|
+
number: "ZodNumber",
|
|
6858
|
+
bigint: "ZodBigInt",
|
|
6859
|
+
boolean: "ZodBoolean",
|
|
6860
|
+
date: "ZodDate",
|
|
6861
|
+
undefined: "ZodUndefined",
|
|
6862
|
+
null: "ZodNull",
|
|
6863
|
+
void: "ZodVoid",
|
|
6864
|
+
any: "ZodAny",
|
|
6865
|
+
unknown: "ZodUnknown",
|
|
6866
|
+
never: "ZodNever",
|
|
6867
|
+
literal: "ZodLiteral",
|
|
6868
|
+
enum: "ZodEnum",
|
|
6869
|
+
nativeEnum: "ZodNativeEnum",
|
|
6870
|
+
object: "ZodObject",
|
|
6871
|
+
array: "ZodArray",
|
|
6872
|
+
tuple: "ZodTuple",
|
|
6873
|
+
union: "ZodUnion",
|
|
6874
|
+
discriminatedUnion: "ZodDiscriminatedUnion",
|
|
6875
|
+
intersection: "ZodIntersection",
|
|
6876
|
+
record: "ZodRecord",
|
|
6877
|
+
map: "ZodMap",
|
|
6878
|
+
set: "ZodSet",
|
|
6879
|
+
function: "ZodFunction",
|
|
6880
|
+
lazy: "ZodLazy",
|
|
6881
|
+
promise: "ZodPromise",
|
|
6882
|
+
optional: "ZodOptional",
|
|
6883
|
+
nullable: "ZodNullable",
|
|
6884
|
+
default: "ZodDefault",
|
|
6885
|
+
effects: "ZodEffects",
|
|
6886
|
+
transformer: "ZodTransformer",
|
|
6887
|
+
branded: "ZodBranded",
|
|
6888
|
+
pipeline: "ZodPipeline",
|
|
6889
|
+
readonly: "ZodReadonly"
|
|
6890
|
+
};
|
|
6891
|
+
return typeMap[type] || `Zod${type.charAt(0).toUpperCase() + type.slice(1)}`;
|
|
6892
|
+
}
|
|
6893
|
+
function getEffectsSchema(schema) {
|
|
6894
|
+
const def = getDef(schema);
|
|
6895
|
+
return def == null ? void 0 : def.schema;
|
|
6896
|
+
}
|
|
6897
|
+
function getInnerType(schema) {
|
|
6898
|
+
const def = getDef(schema);
|
|
6899
|
+
return def == null ? void 0 : def.innerType;
|
|
6900
|
+
}
|
|
6901
|
+
function getShape(schema) {
|
|
6902
|
+
const def = getDef(schema);
|
|
6903
|
+
if (typeof (def == null ? void 0 : def.shape) === "function") {
|
|
6904
|
+
return def.shape();
|
|
6905
|
+
}
|
|
6906
|
+
return def == null ? void 0 : def.shape;
|
|
6907
|
+
}
|
|
6908
|
+
function getChecks(schema) {
|
|
6909
|
+
const def = getDef(schema);
|
|
6910
|
+
const checks = (def == null ? void 0 : def.checks) || [];
|
|
6911
|
+
return checks.map((check) => {
|
|
6912
|
+
var _a;
|
|
6913
|
+
if ((_a = check._zod) == null ? void 0 : _a.def) {
|
|
6914
|
+
return { ...check._zod.def };
|
|
6915
|
+
}
|
|
6916
|
+
return check;
|
|
6917
|
+
});
|
|
6918
|
+
}
|
|
6919
|
+
function getEnumValues(schema) {
|
|
6920
|
+
if ("options" in schema && Array.isArray(schema.options)) {
|
|
6921
|
+
return schema.options;
|
|
6922
|
+
}
|
|
6923
|
+
if ("enum" in schema && schema.enum) {
|
|
6924
|
+
return schema.enum;
|
|
6925
|
+
}
|
|
6926
|
+
const def = getDef(schema);
|
|
6927
|
+
return (def == null ? void 0 : def.values) || (def == null ? void 0 : def.entries);
|
|
6928
|
+
}
|
|
6929
|
+
function getLiteralValue(schema) {
|
|
6930
|
+
if ("value" in schema) {
|
|
6931
|
+
return schema.value;
|
|
6932
|
+
}
|
|
6933
|
+
const def = getDef(schema);
|
|
6934
|
+
if (Array.isArray(def == null ? void 0 : def.values)) {
|
|
6935
|
+
return def.values[0];
|
|
6936
|
+
}
|
|
6937
|
+
return def == null ? void 0 : def.value;
|
|
6938
|
+
}
|
|
6939
|
+
function getDefaultValue(schema) {
|
|
6940
|
+
const def = getDef(schema);
|
|
6941
|
+
if (typeof (def == null ? void 0 : def.defaultValue) === "function") {
|
|
6942
|
+
return def.defaultValue();
|
|
6943
|
+
}
|
|
6944
|
+
return def == null ? void 0 : def.defaultValue;
|
|
6945
|
+
}
|
|
6946
|
+
function getArrayConstraints(schema) {
|
|
6947
|
+
const def = getDef(schema);
|
|
6948
|
+
return {
|
|
6949
|
+
exactLength: def == null ? void 0 : def.exactLength,
|
|
6950
|
+
minLength: def == null ? void 0 : def.minLength,
|
|
6951
|
+
maxLength: def == null ? void 0 : def.maxLength
|
|
6952
|
+
};
|
|
6953
|
+
}
|
|
6954
|
+
function getArrayType(schema) {
|
|
6955
|
+
var _a;
|
|
6956
|
+
const def = getDef(schema);
|
|
6957
|
+
return (_a = def == null ? void 0 : def.element) != null ? _a : def == null ? void 0 : def.type;
|
|
6958
|
+
}
|
|
6959
|
+
function getRecordValueType(schema) {
|
|
6960
|
+
const def = getDef(schema);
|
|
6961
|
+
return def == null ? void 0 : def.valueType;
|
|
6962
|
+
}
|
|
6963
|
+
function getCatchall(schema) {
|
|
6964
|
+
const def = getDef(schema);
|
|
6965
|
+
return def == null ? void 0 : def.catchall;
|
|
6966
|
+
}
|
|
6967
|
+
function getUnknownKeys(schema) {
|
|
6968
|
+
const def = getDef(schema);
|
|
6969
|
+
return def == null ? void 0 : def.unknownKeys;
|
|
6970
|
+
}
|
|
6971
|
+
function getIntersectionParts(schema) {
|
|
6972
|
+
const def = getDef(schema);
|
|
6973
|
+
return {
|
|
6974
|
+
left: def == null ? void 0 : def.left,
|
|
6975
|
+
right: def == null ? void 0 : def.right
|
|
6976
|
+
};
|
|
6977
|
+
}
|
|
6978
|
+
function getUnionOptions(schema) {
|
|
6979
|
+
const def = getDef(schema);
|
|
6980
|
+
const options = def == null ? void 0 : def.options;
|
|
6981
|
+
if (options instanceof Map) {
|
|
6982
|
+
return Array.from(options.values());
|
|
6983
|
+
}
|
|
6984
|
+
if (Array.isArray(options)) {
|
|
6985
|
+
return options;
|
|
6986
|
+
}
|
|
6987
|
+
return [];
|
|
6988
|
+
}
|
|
6989
|
+
function getDiscriminator(schema) {
|
|
6990
|
+
const def = getDef(schema);
|
|
6991
|
+
return def == null ? void 0 : def.discriminator;
|
|
6992
|
+
}
|
|
6993
|
+
function getEffect(schema) {
|
|
6994
|
+
const def = getDef(schema);
|
|
6995
|
+
return def == null ? void 0 : def.effect;
|
|
6996
|
+
}
|
|
6997
|
+
function getPipelineParts(schema) {
|
|
6998
|
+
const def = getDef(schema);
|
|
6999
|
+
return {
|
|
7000
|
+
in: def == null ? void 0 : def.in,
|
|
7001
|
+
out: def == null ? void 0 : def.out
|
|
7002
|
+
};
|
|
7003
|
+
}
|
|
7004
|
+
function getBrandedType(schema) {
|
|
7005
|
+
const def = getDef(schema);
|
|
7006
|
+
return def == null ? void 0 : def.type;
|
|
7007
|
+
}
|
|
7008
|
+
function getTupleItems(schema) {
|
|
7009
|
+
const def = getDef(schema);
|
|
7010
|
+
return (def == null ? void 0 : def.items) || [];
|
|
7011
|
+
}
|
|
7012
|
+
function getFunctionParts(schema) {
|
|
7013
|
+
const def = getDef(schema);
|
|
7014
|
+
return {
|
|
7015
|
+
args: def == null ? void 0 : def.args,
|
|
7016
|
+
returns: def == null ? void 0 : def.returns
|
|
7017
|
+
};
|
|
7018
|
+
}
|
|
7019
|
+
function getMapTypes(schema) {
|
|
7020
|
+
const def = getDef(schema);
|
|
7021
|
+
return {
|
|
7022
|
+
keyType: def == null ? void 0 : def.keyType,
|
|
7023
|
+
valueType: def == null ? void 0 : def.valueType
|
|
7024
|
+
};
|
|
7025
|
+
}
|
|
7026
|
+
function getSetValueType(schema) {
|
|
7027
|
+
const def = getDef(schema);
|
|
7028
|
+
return def == null ? void 0 : def.valueType;
|
|
7029
|
+
}
|
|
7030
|
+
function getPromiseType(schema) {
|
|
7031
|
+
var _a;
|
|
7032
|
+
const def = getDef(schema);
|
|
7033
|
+
return (_a = def == null ? void 0 : def.innerType) != null ? _a : def == null ? void 0 : def.type;
|
|
7034
|
+
}
|
|
7035
|
+
function getCustomTypeGetter(schema) {
|
|
7036
|
+
const def = getDef(schema);
|
|
7037
|
+
return def == null ? void 0 : def.getType;
|
|
7038
|
+
}
|
|
7039
|
+
|
|
6832
7040
|
// src/generators/lib/zod-openapi.ts
|
|
7041
|
+
function mergeSchemas(...schemas) {
|
|
7042
|
+
const result = {};
|
|
7043
|
+
for (const schema of schemas) {
|
|
7044
|
+
if (schema) {
|
|
7045
|
+
Object.assign(result, schema);
|
|
7046
|
+
}
|
|
7047
|
+
}
|
|
7048
|
+
return result;
|
|
7049
|
+
}
|
|
6833
7050
|
function iterateZodObject({
|
|
6834
7051
|
zodRef,
|
|
6835
7052
|
useOutput,
|
|
6836
7053
|
hideDefinitions
|
|
6837
7054
|
}) {
|
|
6838
|
-
const
|
|
7055
|
+
const shape = getShape(zodRef) || {};
|
|
7056
|
+
const reduced = Object.keys(shape).filter((key) => (hideDefinitions == null ? void 0 : hideDefinitions.includes(key)) === false).reduce(
|
|
6839
7057
|
(carry, key) => ({
|
|
6840
7058
|
...carry,
|
|
6841
|
-
[key]: generateSchema(
|
|
7059
|
+
[key]: generateSchema(shape[key], useOutput)
|
|
6842
7060
|
}),
|
|
6843
7061
|
{}
|
|
6844
7062
|
);
|
|
@@ -6871,13 +7089,15 @@ function parseTransformation({
|
|
|
6871
7089
|
schemas,
|
|
6872
7090
|
useOutput
|
|
6873
7091
|
}) {
|
|
6874
|
-
const
|
|
7092
|
+
const innerSchema = getEffectsSchema(zodRef);
|
|
7093
|
+
const input = innerSchema ? generateSchema(innerSchema, useOutput) : {};
|
|
6875
7094
|
let output = "undefined";
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
7095
|
+
const effect = getEffect(zodRef);
|
|
7096
|
+
if (useOutput && effect) {
|
|
7097
|
+
const transformEffect = effect.type === "transform" ? effect : null;
|
|
7098
|
+
if (transformEffect && "transform" in transformEffect) {
|
|
6879
7099
|
try {
|
|
6880
|
-
output = typeof
|
|
7100
|
+
output = typeof transformEffect.transform(
|
|
6881
7101
|
["integer", "number"].includes(`${input.type}`) ? 0 : "string" === input.type ? "" : "boolean" === input.type ? false : "object" === input.type ? {} : "null" === input.type ? null : "array" === input.type ? [] : void 0,
|
|
6882
7102
|
{ addIssue: () => void 0, path: [] }
|
|
6883
7103
|
);
|
|
@@ -6885,7 +7105,7 @@ function parseTransformation({
|
|
|
6885
7105
|
}
|
|
6886
7106
|
}
|
|
6887
7107
|
}
|
|
6888
|
-
return (
|
|
7108
|
+
return mergeSchemas(
|
|
6889
7109
|
{
|
|
6890
7110
|
...zodRef.description ? { description: zodRef.description } : {},
|
|
6891
7111
|
...input,
|
|
@@ -6903,9 +7123,12 @@ function parseString({
|
|
|
6903
7123
|
const baseSchema = {
|
|
6904
7124
|
type: "string"
|
|
6905
7125
|
};
|
|
6906
|
-
const
|
|
7126
|
+
const checks = getChecks(zodRef);
|
|
6907
7127
|
checks.forEach((item) => {
|
|
6908
|
-
|
|
7128
|
+
var _a, _b, _c, _d, _e;
|
|
7129
|
+
const kind = item.kind || item.check;
|
|
7130
|
+
const format = item.format;
|
|
7131
|
+
switch (kind) {
|
|
6909
7132
|
case "email":
|
|
6910
7133
|
baseSchema.format = "email";
|
|
6911
7134
|
break;
|
|
@@ -6921,22 +7144,36 @@ function parseString({
|
|
|
6921
7144
|
case "datetime":
|
|
6922
7145
|
baseSchema.format = "date-time";
|
|
6923
7146
|
break;
|
|
7147
|
+
case "string_format":
|
|
7148
|
+
if (format === "email")
|
|
7149
|
+
baseSchema.format = "email";
|
|
7150
|
+
else if (format === "uuid")
|
|
7151
|
+
baseSchema.format = "uuid";
|
|
7152
|
+
else if (format === "cuid")
|
|
7153
|
+
baseSchema.format = "cuid";
|
|
7154
|
+
else if (format === "url")
|
|
7155
|
+
baseSchema.format = "uri";
|
|
7156
|
+
else if (format === "datetime")
|
|
7157
|
+
baseSchema.format = "date-time";
|
|
7158
|
+
break;
|
|
6924
7159
|
case "length":
|
|
6925
7160
|
baseSchema.minLength = item.value;
|
|
6926
7161
|
baseSchema.maxLength = item.value;
|
|
6927
7162
|
break;
|
|
6928
7163
|
case "max":
|
|
6929
|
-
|
|
7164
|
+
case "max_length":
|
|
7165
|
+
baseSchema.maxLength = (_a = item.value) != null ? _a : item.maximum;
|
|
6930
7166
|
break;
|
|
6931
7167
|
case "min":
|
|
6932
|
-
|
|
7168
|
+
case "min_length":
|
|
7169
|
+
baseSchema.minLength = (_b = item.value) != null ? _b : item.minimum;
|
|
6933
7170
|
break;
|
|
6934
7171
|
case "regex":
|
|
6935
|
-
baseSchema.pattern = item.regex.source;
|
|
7172
|
+
baseSchema.pattern = (_e = (_c = item.regex) == null ? void 0 : _c.source) != null ? _e : (_d = item.pattern) == null ? void 0 : _d.source;
|
|
6936
7173
|
break;
|
|
6937
7174
|
}
|
|
6938
7175
|
});
|
|
6939
|
-
return (
|
|
7176
|
+
return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
|
|
6940
7177
|
}
|
|
6941
7178
|
function parseNumber({
|
|
6942
7179
|
zodRef,
|
|
@@ -6946,7 +7183,7 @@ function parseNumber({
|
|
|
6946
7183
|
type: "number",
|
|
6947
7184
|
format: "float"
|
|
6948
7185
|
};
|
|
6949
|
-
const
|
|
7186
|
+
const checks = getChecks(zodRef);
|
|
6950
7187
|
checks.forEach((item) => {
|
|
6951
7188
|
switch (item.kind) {
|
|
6952
7189
|
case "max":
|
|
@@ -6967,7 +7204,7 @@ function parseNumber({
|
|
|
6967
7204
|
baseSchema.multipleOf = item.value;
|
|
6968
7205
|
}
|
|
6969
7206
|
});
|
|
6970
|
-
return (
|
|
7207
|
+
return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
|
|
6971
7208
|
}
|
|
6972
7209
|
function getExcludedDefinitionsFromSchema(schemas) {
|
|
6973
7210
|
const excludedDefinitions = [];
|
|
@@ -6984,23 +7221,27 @@ function parseObject({
|
|
|
6984
7221
|
useOutput,
|
|
6985
7222
|
hideDefinitions
|
|
6986
7223
|
}) {
|
|
6987
|
-
var _a;
|
|
6988
7224
|
let additionalProperties;
|
|
6989
|
-
|
|
6990
|
-
|
|
6991
|
-
|
|
7225
|
+
const catchall = getCatchall(zodRef);
|
|
7226
|
+
const unknownKeys = getUnknownKeys(zodRef);
|
|
7227
|
+
if (!(catchall instanceof import_zod.z.ZodNever || catchall && getTypeName(catchall) === "ZodNever")) {
|
|
7228
|
+
if (catchall) {
|
|
7229
|
+
additionalProperties = generateSchema(catchall, useOutput);
|
|
7230
|
+
}
|
|
7231
|
+
} else if (unknownKeys === "passthrough") {
|
|
6992
7232
|
additionalProperties = true;
|
|
6993
|
-
else if (
|
|
7233
|
+
} else if (unknownKeys === "strict") {
|
|
6994
7234
|
additionalProperties = false;
|
|
7235
|
+
}
|
|
6995
7236
|
additionalProperties = additionalProperties != null ? { additionalProperties } : {};
|
|
6996
|
-
const
|
|
6997
|
-
|
|
6998
|
-
|
|
6999
|
-
const
|
|
7000
|
-
return !(item.isOptional() || item instanceof import_zod.z.ZodDefault ||
|
|
7237
|
+
const objectShape = getShape(zodRef) || {};
|
|
7238
|
+
const requiredProperties = Object.keys(objectShape).filter((key) => {
|
|
7239
|
+
const item = objectShape[key];
|
|
7240
|
+
const itemTypeName = getTypeName(item);
|
|
7241
|
+
return !(item.isOptional() || item instanceof import_zod.z.ZodDefault || itemTypeName === "ZodDefault") && !(item instanceof import_zod.z.ZodNever || itemTypeName === "ZodDefault");
|
|
7001
7242
|
});
|
|
7002
7243
|
const required = requiredProperties.length > 0 ? { required: requiredProperties } : {};
|
|
7003
|
-
return (
|
|
7244
|
+
return mergeSchemas(
|
|
7004
7245
|
{
|
|
7005
7246
|
type: "object",
|
|
7006
7247
|
properties: iterateZodObject({
|
|
@@ -7022,10 +7263,11 @@ function parseRecord({
|
|
|
7022
7263
|
schemas,
|
|
7023
7264
|
useOutput
|
|
7024
7265
|
}) {
|
|
7025
|
-
|
|
7266
|
+
const valueType = getRecordValueType(zodRef);
|
|
7267
|
+
return mergeSchemas(
|
|
7026
7268
|
{
|
|
7027
7269
|
type: "object",
|
|
7028
|
-
additionalProperties:
|
|
7270
|
+
additionalProperties: valueType instanceof import_zod.z.ZodUnknown ? {} : valueType ? generateSchema(valueType, useOutput) : {}
|
|
7029
7271
|
},
|
|
7030
7272
|
parseDescription(zodRef),
|
|
7031
7273
|
...schemas
|
|
@@ -7035,7 +7277,7 @@ function parseBigInt({
|
|
|
7035
7277
|
zodRef,
|
|
7036
7278
|
schemas
|
|
7037
7279
|
}) {
|
|
7038
|
-
return (
|
|
7280
|
+
return mergeSchemas(
|
|
7039
7281
|
{ type: "integer", format: "int64" },
|
|
7040
7282
|
parseDescription(zodRef),
|
|
7041
7283
|
...schemas
|
|
@@ -7045,21 +7287,21 @@ function parseBoolean({
|
|
|
7045
7287
|
zodRef,
|
|
7046
7288
|
schemas
|
|
7047
7289
|
}) {
|
|
7048
|
-
return (
|
|
7290
|
+
return mergeSchemas(
|
|
7049
7291
|
{ type: "boolean" },
|
|
7050
7292
|
parseDescription(zodRef),
|
|
7051
7293
|
...schemas
|
|
7052
7294
|
);
|
|
7053
7295
|
}
|
|
7054
7296
|
function parseDate({ zodRef, schemas }) {
|
|
7055
|
-
return (
|
|
7297
|
+
return mergeSchemas(
|
|
7056
7298
|
{ type: "string", format: "date-time" },
|
|
7057
7299
|
parseDescription(zodRef),
|
|
7058
7300
|
...schemas
|
|
7059
7301
|
);
|
|
7060
7302
|
}
|
|
7061
7303
|
function parseNull({ zodRef, schemas }) {
|
|
7062
|
-
return (
|
|
7304
|
+
return mergeSchemas(
|
|
7063
7305
|
{
|
|
7064
7306
|
nullable: true
|
|
7065
7307
|
},
|
|
@@ -7072,7 +7314,7 @@ function parseOptional({
|
|
|
7072
7314
|
zodRef,
|
|
7073
7315
|
useOutput
|
|
7074
7316
|
}) {
|
|
7075
|
-
return (
|
|
7317
|
+
return mergeSchemas(
|
|
7076
7318
|
generateSchema(zodRef.unwrap(), useOutput),
|
|
7077
7319
|
parseDescription(zodRef),
|
|
7078
7320
|
...schemas
|
|
@@ -7084,7 +7326,7 @@ function parseNullable({
|
|
|
7084
7326
|
useOutput
|
|
7085
7327
|
}) {
|
|
7086
7328
|
const schema = generateSchema(zodRef.unwrap(), useOutput);
|
|
7087
|
-
return (
|
|
7329
|
+
return mergeSchemas(
|
|
7088
7330
|
{ ...schema, type: schema.type, nullable: true },
|
|
7089
7331
|
parseDescription(zodRef),
|
|
7090
7332
|
...schemas
|
|
@@ -7095,10 +7337,11 @@ function parseDefault({
|
|
|
7095
7337
|
zodRef,
|
|
7096
7338
|
useOutput
|
|
7097
7339
|
}) {
|
|
7098
|
-
|
|
7340
|
+
const innerType = getInnerType(zodRef);
|
|
7341
|
+
return mergeSchemas(
|
|
7099
7342
|
{
|
|
7100
|
-
default: zodRef
|
|
7101
|
-
...generateSchema(
|
|
7343
|
+
default: getDefaultValue(zodRef),
|
|
7344
|
+
...innerType ? generateSchema(innerType, useOutput) : {}
|
|
7102
7345
|
},
|
|
7103
7346
|
parseDescription(zodRef),
|
|
7104
7347
|
...schemas
|
|
@@ -7110,15 +7353,16 @@ function parseArray({
|
|
|
7110
7353
|
useOutput
|
|
7111
7354
|
}) {
|
|
7112
7355
|
const constraints = {};
|
|
7113
|
-
|
|
7114
|
-
|
|
7115
|
-
constraints.
|
|
7116
|
-
|
|
7117
|
-
|
|
7118
|
-
|
|
7119
|
-
|
|
7120
|
-
|
|
7121
|
-
|
|
7356
|
+
const { exactLength, minLength, maxLength } = getArrayConstraints(zodRef);
|
|
7357
|
+
if (exactLength != null) {
|
|
7358
|
+
constraints.minItems = exactLength.value;
|
|
7359
|
+
constraints.maxItems = exactLength.value;
|
|
7360
|
+
}
|
|
7361
|
+
if (minLength != null)
|
|
7362
|
+
constraints.minItems = minLength.value;
|
|
7363
|
+
if (maxLength != null)
|
|
7364
|
+
constraints.maxItems = maxLength.value;
|
|
7365
|
+
return mergeSchemas(
|
|
7122
7366
|
{
|
|
7123
7367
|
type: "array",
|
|
7124
7368
|
items: generateSchema(zodRef.element, useOutput),
|
|
@@ -7128,27 +7372,31 @@ function parseArray({
|
|
|
7128
7372
|
...schemas
|
|
7129
7373
|
);
|
|
7130
7374
|
}
|
|
7131
|
-
function parseLiteral({
|
|
7132
|
-
|
|
7133
|
-
|
|
7134
|
-
}) {
|
|
7135
|
-
return (0, import_ts_deepmerge.default)(
|
|
7375
|
+
function parseLiteral({ schemas, zodRef }) {
|
|
7376
|
+
const value = getLiteralValue(zodRef);
|
|
7377
|
+
return mergeSchemas(
|
|
7136
7378
|
{
|
|
7137
|
-
type: typeof
|
|
7138
|
-
enum: [
|
|
7379
|
+
type: typeof value,
|
|
7380
|
+
enum: [value]
|
|
7139
7381
|
},
|
|
7140
7382
|
parseDescription(zodRef),
|
|
7141
7383
|
...schemas
|
|
7142
7384
|
);
|
|
7143
7385
|
}
|
|
7144
|
-
function parseEnum({
|
|
7145
|
-
|
|
7146
|
-
|
|
7147
|
-
|
|
7148
|
-
|
|
7386
|
+
function parseEnum({ schemas, zodRef }) {
|
|
7387
|
+
const values = getEnumValues(zodRef);
|
|
7388
|
+
if (!values) {
|
|
7389
|
+
return mergeSchemas(
|
|
7390
|
+
{ type: "string" },
|
|
7391
|
+
parseDescription(zodRef),
|
|
7392
|
+
...schemas
|
|
7393
|
+
);
|
|
7394
|
+
}
|
|
7395
|
+
const valuesArray = Array.isArray(values) ? values : Object.values(values);
|
|
7396
|
+
return mergeSchemas(
|
|
7149
7397
|
{
|
|
7150
|
-
type: typeof
|
|
7151
|
-
enum:
|
|
7398
|
+
type: typeof valuesArray[0],
|
|
7399
|
+
enum: valuesArray
|
|
7152
7400
|
},
|
|
7153
7401
|
parseDescription(zodRef),
|
|
7154
7402
|
...schemas
|
|
@@ -7159,11 +7407,12 @@ function parseIntersection({
|
|
|
7159
7407
|
zodRef,
|
|
7160
7408
|
useOutput
|
|
7161
7409
|
}) {
|
|
7162
|
-
|
|
7410
|
+
const { left, right } = getIntersectionParts(zodRef);
|
|
7411
|
+
return mergeSchemas(
|
|
7163
7412
|
{
|
|
7164
7413
|
allOf: [
|
|
7165
|
-
generateSchema(
|
|
7166
|
-
generateSchema(
|
|
7414
|
+
left ? generateSchema(left, useOutput) : {},
|
|
7415
|
+
right ? generateSchema(right, useOutput) : {}
|
|
7167
7416
|
]
|
|
7168
7417
|
},
|
|
7169
7418
|
parseDescription(zodRef),
|
|
@@ -7175,21 +7424,21 @@ function parseUnion({
|
|
|
7175
7424
|
zodRef,
|
|
7176
7425
|
useOutput
|
|
7177
7426
|
}) {
|
|
7178
|
-
const contents = zodRef
|
|
7427
|
+
const contents = getUnionOptions(zodRef);
|
|
7179
7428
|
if (contents.reduce(
|
|
7180
|
-
(prev, content) => prev && content
|
|
7429
|
+
(prev, content) => prev && getTypeName(content) === "ZodLiteral",
|
|
7181
7430
|
true
|
|
7182
7431
|
)) {
|
|
7183
7432
|
const literals = contents;
|
|
7184
|
-
const type = literals.reduce(
|
|
7185
|
-
|
|
7186
|
-
null
|
|
7187
|
-
);
|
|
7433
|
+
const type = literals.reduce((prev, content) => {
|
|
7434
|
+
const value = getLiteralValue(content);
|
|
7435
|
+
return !prev || prev === typeof value ? typeof value : null;
|
|
7436
|
+
}, null);
|
|
7188
7437
|
if (type) {
|
|
7189
|
-
return (
|
|
7438
|
+
return mergeSchemas(
|
|
7190
7439
|
{
|
|
7191
7440
|
type,
|
|
7192
|
-
enum: literals.map((literal) => literal
|
|
7441
|
+
enum: literals.map((literal) => getLiteralValue(literal))
|
|
7193
7442
|
},
|
|
7194
7443
|
parseDescription(zodRef),
|
|
7195
7444
|
...schemas
|
|
@@ -7197,12 +7446,12 @@ function parseUnion({
|
|
|
7197
7446
|
}
|
|
7198
7447
|
}
|
|
7199
7448
|
const isNullable = contents.some(
|
|
7200
|
-
(content) => content
|
|
7449
|
+
(content) => getTypeName(content) === "ZodNull"
|
|
7201
7450
|
);
|
|
7202
7451
|
const nonNullContents = contents.filter(
|
|
7203
|
-
(content) => content
|
|
7452
|
+
(content) => getTypeName(content) !== "ZodNull"
|
|
7204
7453
|
);
|
|
7205
|
-
return (
|
|
7454
|
+
return mergeSchemas(
|
|
7206
7455
|
{
|
|
7207
7456
|
oneOf: nonNullContents.map((schema) => generateSchema(schema, useOutput)),
|
|
7208
7457
|
...isNullable ? { nullable: true } : {}
|
|
@@ -7216,14 +7465,12 @@ function parseDiscriminatedUnion({
|
|
|
7216
7465
|
zodRef,
|
|
7217
7466
|
useOutput
|
|
7218
7467
|
}) {
|
|
7219
|
-
|
|
7468
|
+
const discriminator = getDiscriminator(zodRef);
|
|
7469
|
+
const options = getUnionOptions(zodRef);
|
|
7470
|
+
return mergeSchemas(
|
|
7220
7471
|
{
|
|
7221
|
-
discriminator: {
|
|
7222
|
-
|
|
7223
|
-
},
|
|
7224
|
-
oneOf: Array.from(
|
|
7225
|
-
zodRef._def.options.values()
|
|
7226
|
-
).map((schema) => generateSchema(schema, useOutput))
|
|
7472
|
+
...discriminator ? { discriminator: { propertyName: discriminator } } : {},
|
|
7473
|
+
oneOf: options.map((schema) => generateSchema(schema, useOutput))
|
|
7227
7474
|
},
|
|
7228
7475
|
parseDescription(zodRef),
|
|
7229
7476
|
...schemas
|
|
@@ -7233,36 +7480,33 @@ function parseNever({
|
|
|
7233
7480
|
zodRef,
|
|
7234
7481
|
schemas
|
|
7235
7482
|
}) {
|
|
7236
|
-
return (
|
|
7483
|
+
return mergeSchemas({ readOnly: true }, parseDescription(zodRef), ...schemas);
|
|
7237
7484
|
}
|
|
7238
|
-
function parseBranded({
|
|
7239
|
-
|
|
7240
|
-
|
|
7241
|
-
}) {
|
|
7242
|
-
return (0, import_ts_deepmerge.default)(generateSchema(zodRef._def.type), ...schemas);
|
|
7485
|
+
function parseBranded({ schemas, zodRef }) {
|
|
7486
|
+
const type = getBrandedType(zodRef);
|
|
7487
|
+
return mergeSchemas(type ? generateSchema(type) : {}, ...schemas);
|
|
7243
7488
|
}
|
|
7244
7489
|
function catchAllParser({
|
|
7245
7490
|
zodRef,
|
|
7246
7491
|
schemas
|
|
7247
7492
|
}) {
|
|
7248
|
-
return (
|
|
7493
|
+
return mergeSchemas(parseDescription(zodRef), ...schemas);
|
|
7249
7494
|
}
|
|
7250
|
-
function parsePipeline({
|
|
7251
|
-
zodRef
|
|
7252
|
-
useOutput
|
|
7253
|
-
|
|
7254
|
-
if (useOutput) {
|
|
7255
|
-
return generateSchema(zodRef._def.out, useOutput);
|
|
7495
|
+
function parsePipeline({ zodRef, useOutput }) {
|
|
7496
|
+
const { in: inSchema, out: outSchema } = getPipelineParts(zodRef);
|
|
7497
|
+
if (useOutput && outSchema) {
|
|
7498
|
+
return generateSchema(outSchema, useOutput);
|
|
7256
7499
|
}
|
|
7257
|
-
return generateSchema(
|
|
7500
|
+
return inSchema ? generateSchema(inSchema, useOutput) : {};
|
|
7258
7501
|
}
|
|
7259
7502
|
function parseReadonly({
|
|
7260
7503
|
zodRef,
|
|
7261
7504
|
useOutput,
|
|
7262
7505
|
schemas
|
|
7263
7506
|
}) {
|
|
7264
|
-
|
|
7265
|
-
|
|
7507
|
+
const innerType = getInnerType(zodRef);
|
|
7508
|
+
return mergeSchemas(
|
|
7509
|
+
innerType ? generateSchema(innerType, useOutput) : {},
|
|
7266
7510
|
parseDescription(zodRef),
|
|
7267
7511
|
...schemas
|
|
7268
7512
|
);
|
|
@@ -7308,7 +7552,7 @@ function generateSchema(zodRef, useOutput) {
|
|
|
7308
7552
|
...Array.isArray(metaOpenApi) ? metaOpenApi : [metaOpenApi]
|
|
7309
7553
|
];
|
|
7310
7554
|
try {
|
|
7311
|
-
const typeName = zodRef
|
|
7555
|
+
const typeName = getTypeName(zodRef);
|
|
7312
7556
|
if (typeName in workerMap) {
|
|
7313
7557
|
return workerMap[typeName]({
|
|
7314
7558
|
zodRef,
|
|
@@ -7542,9 +7786,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
7542
7786
|
if (isPostOrPutOrPatch) {
|
|
7543
7787
|
body_to_generate_schema = (_c = routeSpec.jsonBody) != null ? _c : routeSpec.commonParams;
|
|
7544
7788
|
if (routeSpec.jsonBody && routeSpec.commonParams) {
|
|
7545
|
-
body_to_generate_schema = routeSpec.jsonBody.merge(
|
|
7546
|
-
routeSpec.commonParams
|
|
7547
|
-
);
|
|
7789
|
+
body_to_generate_schema = routeSpec.jsonBody.merge(routeSpec.commonParams);
|
|
7548
7790
|
}
|
|
7549
7791
|
} else {
|
|
7550
7792
|
body_to_generate_schema = routeSpec.jsonBody;
|
|
@@ -7555,9 +7797,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
7555
7797
|
} else {
|
|
7556
7798
|
query_to_generate_schema = (_d = routeSpec.queryParams) != null ? _d : routeSpec.commonParams;
|
|
7557
7799
|
if (routeSpec.queryParams && routeSpec.commonParams) {
|
|
7558
|
-
query_to_generate_schema = routeSpec.queryParams.merge(
|
|
7559
|
-
routeSpec.commonParams
|
|
7560
|
-
);
|
|
7800
|
+
query_to_generate_schema = routeSpec.queryParams.merge(routeSpec.commonParams);
|
|
7561
7801
|
}
|
|
7562
7802
|
}
|
|
7563
7803
|
const route = {
|
|
@@ -7610,7 +7850,8 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
7610
7850
|
const { jsonResponse } = routeSpec;
|
|
7611
7851
|
const { addOkStatus = true } = setupParams;
|
|
7612
7852
|
if (jsonResponse) {
|
|
7613
|
-
|
|
7853
|
+
const jsonResponseTypeName = getTypeName(jsonResponse);
|
|
7854
|
+
if (jsonResponseTypeName !== "ZodObject") {
|
|
7614
7855
|
console.warn(
|
|
7615
7856
|
chalk2.yellow(
|
|
7616
7857
|
`Skipping route ${routePath} because the response is not a ZodObject.`
|
|
@@ -7743,9 +7984,9 @@ var resolveOptions = (raw) => {
|
|
|
7743
7984
|
};
|
|
7744
7985
|
var callGetType = (zod, identifier, options) => {
|
|
7745
7986
|
let type;
|
|
7746
|
-
const
|
|
7747
|
-
if (
|
|
7748
|
-
type =
|
|
7987
|
+
const getType = getCustomTypeGetter(zod);
|
|
7988
|
+
if (getType)
|
|
7989
|
+
type = getType(import_typescript.default, identifier, options);
|
|
7749
7990
|
return type;
|
|
7750
7991
|
};
|
|
7751
7992
|
var zodToTs = (zod, identifier, options) => {
|
|
@@ -7762,7 +8003,7 @@ var zodToTs = (zod, identifier, options) => {
|
|
|
7762
8003
|
return { node, store };
|
|
7763
8004
|
};
|
|
7764
8005
|
var zodToTsNode = (zod, identifier, store, options) => {
|
|
7765
|
-
const typeName = zod
|
|
8006
|
+
const typeName = getTypeName(zod);
|
|
7766
8007
|
const getTypeType = callGetType(zod, identifier, options);
|
|
7767
8008
|
if (getTypeType && typeName !== "ZodNativeEnum") {
|
|
7768
8009
|
return maybeIdentifierToTypeReference(getTypeType);
|
|
@@ -7812,7 +8053,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7812
8053
|
}
|
|
7813
8054
|
case "ZodLiteral": {
|
|
7814
8055
|
let literal;
|
|
7815
|
-
const literalValue = zod
|
|
8056
|
+
const literalValue = getLiteralValue(zod);
|
|
7816
8057
|
switch (typeof literalValue) {
|
|
7817
8058
|
case "number": {
|
|
7818
8059
|
literal = f.createNumericLiteral(literalValue);
|
|
@@ -7830,11 +8071,12 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7830
8071
|
return f.createLiteralTypeNode(literal);
|
|
7831
8072
|
}
|
|
7832
8073
|
case "ZodObject": {
|
|
7833
|
-
const
|
|
8074
|
+
const shape = getShape(zod) || {};
|
|
8075
|
+
const properties = Object.entries(shape);
|
|
7834
8076
|
const members = properties.map(([key, value]) => {
|
|
7835
8077
|
const nextZodNode = value;
|
|
7836
8078
|
const type = zodToTsNode(nextZodNode, ...otherArguments);
|
|
7837
|
-
const
|
|
8079
|
+
const nextZodNodeTypeName = getTypeName(nextZodNode);
|
|
7838
8080
|
const isOptional = nextZodNodeTypeName === "ZodOptional" || nextZodNode.isOptional();
|
|
7839
8081
|
const propertySignature = f.createPropertySignature(
|
|
7840
8082
|
void 0,
|
|
@@ -7850,43 +8092,48 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7850
8092
|
return f.createTypeLiteralNode(members);
|
|
7851
8093
|
}
|
|
7852
8094
|
case "ZodArray": {
|
|
7853
|
-
const
|
|
8095
|
+
const arrayType = getArrayType(zod);
|
|
8096
|
+
const type = arrayType ? zodToTsNode(arrayType, ...otherArguments) : createUnknownKeywordNode();
|
|
7854
8097
|
const node = f.createArrayTypeNode(type);
|
|
7855
8098
|
return node;
|
|
7856
8099
|
}
|
|
7857
8100
|
case "ZodEnum": {
|
|
7858
|
-
const
|
|
8101
|
+
const values = getEnumValues(zod);
|
|
8102
|
+
const valuesArray = Array.isArray(values) ? values : Object.values(values);
|
|
8103
|
+
const types = valuesArray.map(
|
|
7859
8104
|
(value) => f.createLiteralTypeNode(f.createStringLiteral(value))
|
|
7860
8105
|
);
|
|
7861
8106
|
return f.createUnionTypeNode(types);
|
|
7862
8107
|
}
|
|
7863
8108
|
case "ZodUnion": {
|
|
7864
|
-
const
|
|
7865
|
-
const types =
|
|
8109
|
+
const unionOptions = getUnionOptions(zod);
|
|
8110
|
+
const types = unionOptions.map(
|
|
7866
8111
|
(option) => zodToTsNode(option, ...otherArguments)
|
|
7867
8112
|
);
|
|
7868
8113
|
return f.createUnionTypeNode(types);
|
|
7869
8114
|
}
|
|
7870
8115
|
case "ZodDiscriminatedUnion": {
|
|
7871
|
-
const
|
|
7872
|
-
const types =
|
|
8116
|
+
const unionOptions = getUnionOptions(zod);
|
|
8117
|
+
const types = unionOptions.map(
|
|
7873
8118
|
(option) => zodToTsNode(option, ...otherArguments)
|
|
7874
8119
|
);
|
|
7875
8120
|
return f.createUnionTypeNode(types);
|
|
7876
8121
|
}
|
|
7877
8122
|
case "ZodEffects": {
|
|
7878
|
-
const
|
|
7879
|
-
|
|
7880
|
-
|
|
7881
|
-
);
|
|
8123
|
+
const effectsSchema = getEffectsSchema(zod);
|
|
8124
|
+
if (!effectsSchema)
|
|
8125
|
+
return createUnknownKeywordNode();
|
|
8126
|
+
const node = zodToTsNode(effectsSchema, ...otherArguments);
|
|
7882
8127
|
return node;
|
|
7883
8128
|
}
|
|
7884
8129
|
case "ZodNativeEnum": {
|
|
7885
8130
|
const type = getTypeType;
|
|
8131
|
+
const enumValues = getEnumValues(zod);
|
|
8132
|
+
const enumValuesObj = typeof enumValues === "object" && !Array.isArray(enumValues) ? enumValues : {};
|
|
7886
8133
|
if (options.nativeEnums === "union") {
|
|
7887
8134
|
if (type)
|
|
7888
8135
|
return maybeIdentifierToTypeReference(type);
|
|
7889
|
-
const types = Object.values(
|
|
8136
|
+
const types = Object.values(enumValuesObj).map((value) => {
|
|
7890
8137
|
if (typeof value === "number") {
|
|
7891
8138
|
return f.createLiteralTypeNode(f.createNumericLiteral(value));
|
|
7892
8139
|
}
|
|
@@ -7898,7 +8145,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7898
8145
|
return createUnknownKeywordNode();
|
|
7899
8146
|
if (options.nativeEnums === "resolve") {
|
|
7900
8147
|
const enumMembers = Object.entries(
|
|
7901
|
-
|
|
8148
|
+
enumValuesObj
|
|
7902
8149
|
).map(([key, value]) => {
|
|
7903
8150
|
const literal = typeof value === "number" ? f.createNumericLiteral(value) : f.createStringLiteral(value);
|
|
7904
8151
|
return f.createEnumMember(getIdentifierOrStringLiteral(key), literal);
|
|
@@ -7916,33 +8163,35 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7916
8163
|
return maybeIdentifierToTypeReference(type);
|
|
7917
8164
|
}
|
|
7918
8165
|
case "ZodOptional": {
|
|
7919
|
-
const
|
|
7920
|
-
|
|
7921
|
-
|
|
7922
|
-
);
|
|
8166
|
+
const inner = getInnerType(zod);
|
|
8167
|
+
if (!inner)
|
|
8168
|
+
return createUnknownKeywordNode();
|
|
8169
|
+
const innerType = zodToTsNode(inner, ...otherArguments);
|
|
7923
8170
|
return f.createUnionTypeNode([
|
|
7924
8171
|
innerType,
|
|
7925
8172
|
f.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)
|
|
7926
8173
|
]);
|
|
7927
8174
|
}
|
|
7928
8175
|
case "ZodNullable": {
|
|
7929
|
-
const
|
|
7930
|
-
|
|
7931
|
-
|
|
7932
|
-
);
|
|
8176
|
+
const inner = getInnerType(zod);
|
|
8177
|
+
if (!inner)
|
|
8178
|
+
return createUnknownKeywordNode();
|
|
8179
|
+
const innerType = zodToTsNode(inner, ...otherArguments);
|
|
7933
8180
|
return f.createUnionTypeNode([
|
|
7934
8181
|
innerType,
|
|
7935
8182
|
f.createLiteralTypeNode(f.createNull())
|
|
7936
8183
|
]);
|
|
7937
8184
|
}
|
|
7938
8185
|
case "ZodTuple": {
|
|
7939
|
-
const
|
|
8186
|
+
const items = getTupleItems(zod);
|
|
8187
|
+
const types = items.map(
|
|
7940
8188
|
(option) => zodToTsNode(option, ...otherArguments)
|
|
7941
8189
|
);
|
|
7942
8190
|
return f.createTupleTypeNode(types);
|
|
7943
8191
|
}
|
|
7944
8192
|
case "ZodRecord": {
|
|
7945
|
-
const
|
|
8193
|
+
const recordValueType = getRecordValueType(zod);
|
|
8194
|
+
const valueType = recordValueType ? zodToTsNode(recordValueType, ...otherArguments) : createUnknownKeywordNode();
|
|
7946
8195
|
const node = f.createTypeLiteralNode([
|
|
7947
8196
|
f.createIndexSignature(
|
|
7948
8197
|
void 0,
|
|
@@ -7961,8 +8210,9 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7961
8210
|
return node;
|
|
7962
8211
|
}
|
|
7963
8212
|
case "ZodMap": {
|
|
7964
|
-
const valueType =
|
|
7965
|
-
const
|
|
8213
|
+
const { keyType: mapKeyType, valueType: mapValueType } = getMapTypes(zod);
|
|
8214
|
+
const valueType = mapValueType ? zodToTsNode(mapValueType, ...otherArguments) : createUnknownKeywordNode();
|
|
8215
|
+
const keyType = mapKeyType ? zodToTsNode(mapKeyType, ...otherArguments) : createUnknownKeywordNode();
|
|
7966
8216
|
const node = f.createTypeReferenceNode(f.createIdentifier("Map"), [
|
|
7967
8217
|
keyType,
|
|
7968
8218
|
valueType
|
|
@@ -7970,25 +8220,30 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
7970
8220
|
return node;
|
|
7971
8221
|
}
|
|
7972
8222
|
case "ZodSet": {
|
|
7973
|
-
const
|
|
8223
|
+
const setValueType = getSetValueType(zod);
|
|
8224
|
+
const type = setValueType ? zodToTsNode(setValueType, ...otherArguments) : createUnknownKeywordNode();
|
|
7974
8225
|
const node = f.createTypeReferenceNode(f.createIdentifier("Set"), [type]);
|
|
7975
8226
|
return node;
|
|
7976
8227
|
}
|
|
7977
8228
|
case "ZodIntersection": {
|
|
7978
|
-
const left =
|
|
7979
|
-
const
|
|
8229
|
+
const { left: intersectLeft, right: intersectRight } = getIntersectionParts(zod);
|
|
8230
|
+
const left = intersectLeft ? zodToTsNode(intersectLeft, ...otherArguments) : createUnknownKeywordNode();
|
|
8231
|
+
const right = intersectRight ? zodToTsNode(intersectRight, ...otherArguments) : createUnknownKeywordNode();
|
|
7980
8232
|
const node = f.createIntersectionTypeNode([left, right]);
|
|
7981
8233
|
return node;
|
|
7982
8234
|
}
|
|
7983
8235
|
case "ZodPromise": {
|
|
7984
|
-
const
|
|
8236
|
+
const promiseType = getPromiseType(zod);
|
|
8237
|
+
const type = promiseType ? zodToTsNode(promiseType, ...otherArguments) : createUnknownKeywordNode();
|
|
7985
8238
|
const node = f.createTypeReferenceNode(f.createIdentifier("Promise"), [
|
|
7986
8239
|
type
|
|
7987
8240
|
]);
|
|
7988
8241
|
return node;
|
|
7989
8242
|
}
|
|
7990
8243
|
case "ZodFunction": {
|
|
7991
|
-
const
|
|
8244
|
+
const { args: funcArgs, returns: funcReturns } = getFunctionParts(zod);
|
|
8245
|
+
const argsItems = funcArgs ? getTupleItems(funcArgs) : [];
|
|
8246
|
+
const argumentTypes = argsItems.map(
|
|
7992
8247
|
(argument, index) => {
|
|
7993
8248
|
const argumentType = zodToTsNode(argument, ...otherArguments);
|
|
7994
8249
|
return f.createParameterDeclaration(
|
|
@@ -8009,7 +8264,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
8009
8264
|
f.createArrayTypeNode(createUnknownKeywordNode())
|
|
8010
8265
|
)
|
|
8011
8266
|
);
|
|
8012
|
-
const returnType = zodToTsNode(
|
|
8267
|
+
const returnType = funcReturns ? zodToTsNode(funcReturns, ...otherArguments) : createUnknownKeywordNode();
|
|
8013
8268
|
const node = f.createFunctionTypeNode(
|
|
8014
8269
|
void 0,
|
|
8015
8270
|
argumentTypes,
|
|
@@ -8018,10 +8273,10 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
8018
8273
|
return node;
|
|
8019
8274
|
}
|
|
8020
8275
|
case "ZodDefault": {
|
|
8021
|
-
const
|
|
8022
|
-
|
|
8023
|
-
|
|
8024
|
-
);
|
|
8276
|
+
const defaultInner = getInnerType(zod);
|
|
8277
|
+
if (!defaultInner)
|
|
8278
|
+
return createUnknownKeywordNode();
|
|
8279
|
+
const type = zodToTsNode(defaultInner, ...otherArguments);
|
|
8025
8280
|
const filteredNodes = [];
|
|
8026
8281
|
type.forEachChild((node) => {
|
|
8027
8282
|
if (![SyntaxKind.UndefinedKeyword].includes(node.kind)) {
|
|
@@ -8039,7 +8294,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
|
|
|
8039
8294
|
var import_prettier = __toESM(require("prettier"));
|
|
8040
8295
|
var import_zod4 = require("zod");
|
|
8041
8296
|
var generateRouteTypes = async (opts) => {
|
|
8042
|
-
var _a, _b
|
|
8297
|
+
var _a, _b;
|
|
8043
8298
|
const filepathToRoute = await parseRoutesInPackage(opts);
|
|
8044
8299
|
const sortedRoutes = Array.from(filepathToRoute.entries()).sort(
|
|
8045
8300
|
(a, b) => a[1].route.localeCompare(b[1].route)
|
|
@@ -8050,17 +8305,29 @@ var generateRouteTypes = async (opts) => {
|
|
|
8050
8305
|
const routeDefs = [];
|
|
8051
8306
|
for (const [_2, { route, routeSpec, setupParams }] of filteredRoutes) {
|
|
8052
8307
|
const maxDuration = (_a = routeSpec.maxDuration) != null ? _a : setupParams.maxDuration;
|
|
8053
|
-
const queryKeys = Object.keys(
|
|
8308
|
+
const queryKeys = Object.keys(
|
|
8309
|
+
routeSpec.queryParams ? (_b = getShape(routeSpec.queryParams)) != null ? _b : {} : {}
|
|
8310
|
+
);
|
|
8054
8311
|
const pathParameters = queryKeys.filter((key) => route.includes(`[${key}]`));
|
|
8055
8312
|
let queryParams = routeSpec.queryParams;
|
|
8056
|
-
while (queryParams
|
|
8057
|
-
|
|
8058
|
-
|
|
8059
|
-
|
|
8060
|
-
|
|
8313
|
+
while (queryParams) {
|
|
8314
|
+
const typeName = getTypeName(queryParams);
|
|
8315
|
+
if (typeName === "ZodEffects") {
|
|
8316
|
+
const inner = getEffectsSchema(queryParams);
|
|
8317
|
+
if (inner) {
|
|
8318
|
+
queryParams = inner;
|
|
8319
|
+
continue;
|
|
8320
|
+
}
|
|
8321
|
+
} else if (typeName === "ZodOptional") {
|
|
8322
|
+
const inner = getInnerType(queryParams);
|
|
8323
|
+
if (inner) {
|
|
8324
|
+
queryParams = inner;
|
|
8325
|
+
continue;
|
|
8326
|
+
}
|
|
8061
8327
|
}
|
|
8328
|
+
break;
|
|
8062
8329
|
}
|
|
8063
|
-
if (queryParams && "omit" in queryParams) {
|
|
8330
|
+
if (queryParams && "omit" in queryParams && typeof queryParams.omit === "function") {
|
|
8064
8331
|
queryParams = queryParams.omit(
|
|
8065
8332
|
Object.fromEntries(pathParameters.map((param) => [param, true]))
|
|
8066
8333
|
);
|
|
@@ -8271,4 +8538,4 @@ var extractRouteSpecs = async (opts) => {
|
|
|
8271
8538
|
*/
|
|
8272
8539
|
/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
8273
8540
|
/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
8274
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tZXJnZTIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvYXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZXJybm8uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0aC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL25vZGVfbW9kdWxlcy9nbG9iLXBhcmVudC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9zdHJpbmdpZnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdG8tcmVnZXgtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGwtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29tcGlsZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9leHBhbmQuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3BhcnNlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3NjYW4uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGljb21hdGNoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pY3JvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0dGVybi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L21hbmFnZXJzL3Rhc2tzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9hZGFwdGVycy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWV1ZS1taWNyb3Rhc2svaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JldXNpZnkvcmV1c2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdHEvcXVldWUuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvY29tbW9uLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9yZWFkZXIuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvbWF0Y2hlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvcGFydGlhbC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvZmlsdGVycy9kZWVwLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2VudHJ5LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2Vycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy90cmFuc2Zvcm1lcnMvZW50cnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3Byb3ZpZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aC10eXBlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kaXItZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaWdub3JlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zbGFzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2lnbm9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2luZGV4LmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLW9wZW5hcGkudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2Zyb250LW1hdHRlci50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlcy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2Zlcm4tc2RrLXV0aWxzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLXJvdXRlLXR5cGVzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2QtdG8tdHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZXh0cmFjdC1yb3V0ZS1zcGVjLXNjaGVtYXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIFNoaW0gZ2xvYmFscyBpbiBjanMgYnVuZGxlXG4vLyBUaGVyZSdzIGEgd2VpcmQgYnVnIHRoYXQgZXNidWlsZCB3aWxsIGFsd2F5cyBpbmplY3QgaW1wb3J0TWV0YVVybFxuLy8gaWYgd2UgZXhwb3J0IGl0IGFzIGBjb25zdCBpbXBvcnRNZXRhVXJsID0gLi4uIF9fZmlsZW5hbWUgLi4uYFxuLy8gQnV0IHVzaW5nIGEgZnVuY3Rpb24gd2lsbCBub3QgY2F1c2UgdGhpcyBpc3N1ZVxuXG5jb25zdCBnZXRJbXBvcnRNZXRhVXJsID0gKCkgPT5cbiAgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJ1xuICAgID8gbmV3IFVSTCgnZmlsZTonICsgX19maWxlbmFtZSkuaHJlZlxuICAgIDogKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpIHx8XG4gICAgICBuZXcgVVJMKCdtYWluLmpzJywgZG9jdW1lbnQuYmFzZVVSSSkuaHJlZlxuXG5leHBvcnQgY29uc3QgaW1wb3J0TWV0YVVybCA9IC8qIEBfX1BVUkVfXyAqLyBnZXRJbXBvcnRNZXRhVXJsKClcbiIsICJjb25zdCBBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUID0gMTA7XG5cbmNvbnN0IHdyYXBBbnNpMTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07NTske2NvZGV9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKG9mZnNldCA9IDApID0+IChyZWQsIGdyZWVuLCBibHVlKSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmVkfTske2dyZWVufTske2JsdWV9bWA7XG5cbmNvbnN0IHN0eWxlcyA9IHtcblx0bW9kaWZpZXI6IHtcblx0XHRyZXNldDogWzAsIDBdLFxuXHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdGRpbTogWzIsIDIyXSxcblx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdG92ZXJsaW5lOiBbNTMsIDU1XSxcblx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldLFxuXHR9LFxuXHRjb2xvcjoge1xuXHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdGN5YW46IFszNiwgMzldLFxuXHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRncmF5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdGdyZXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcblx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcblx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV0sXG5cdH0sXG5cdGJnQ29sb3I6IHtcblx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdGJnR3JheTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ0dyZXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0YmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcblx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV0sXG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3QgbW9kaWZpZXJOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5tb2RpZmllcik7XG5leHBvcnQgY29uc3QgZm9yZWdyb3VuZENvbG9yTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMuY29sb3IpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmJnQ29sb3IpO1xuZXhwb3J0IGNvbnN0IGNvbG9yTmFtZXMgPSBbLi4uZm9yZWdyb3VuZENvbG9yTmFtZXMsIC4uLmJhY2tncm91bmRDb2xvck5hbWVzXTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYCxcblx0XHRcdH07XG5cblx0XHRcdGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuXHRcdFx0Y29kZXMuc2V0KHN0eWxlWzBdLCBzdHlsZVsxXSk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgZ3JvdXBOYW1lLCB7XG5cdFx0XHR2YWx1ZTogZ3JvdXAsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bShBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblxuXHQvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9RaXgtL2NvbG9yLWNvbnZlcnQvYmxvYi8zZjBlMGQ0ZTkyZTIzNTc5NmNjYjE3ZjZlODVjNzIwOTRhNjUxZjQ5L2NvbnZlcnNpb25zLmpzXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0eWxlcywge1xuXHRcdHJnYlRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWUocmVkLCBncmVlbiwgYmx1ZSkge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTZcblx0XHRcdFx0XHQrICgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyAoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSlcblx0XHRcdFx0XHQrIE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9SZ2I6IHtcblx0XHRcdHZhbHVlKGhleCkge1xuXHRcdFx0XHRjb25zdCBtYXRjaGVzID0gL1thLWZcXGRdezZ9fFthLWZcXGRdezN9L2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBbY29sb3JTdHJpbmddID0gbWF0Y2hlcztcblxuXHRcdFx0XHRpZiAoY29sb3JTdHJpbmcubGVuZ3RoID09PSAzKSB7XG5cdFx0XHRcdFx0Y29sb3JTdHJpbmcgPSBbLi4uY29sb3JTdHJpbmddLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XHQoaW50ZWdlciA+PiAxNikgJiAweEZGLFxuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDgpICYgMHhGRixcblx0XHRcdFx0XHRpbnRlZ2VyICYgMHhGRixcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0YW5zaTI1NlRvQW5zaToge1xuXHRcdFx0dmFsdWUoY29kZSkge1xuXHRcdFx0XHRpZiAoY29kZSA8IDgpIHtcblx0XHRcdFx0XHRyZXR1cm4gMzAgKyBjb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvZGUgPCAxNikge1xuXHRcdFx0XHRcdHJldHVybiA5MCArIChjb2RlIC0gOCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgcmVkO1xuXHRcdFx0XHRsZXQgZ3JlZW47XG5cdFx0XHRcdGxldCBibHVlO1xuXG5cdFx0XHRcdGlmIChjb2RlID49IDIzMikge1xuXHRcdFx0XHRcdHJlZCA9ICgoKGNvZGUgLSAyMzIpICogMTApICsgOCkgLyAyNTU7XG5cdFx0XHRcdFx0Z3JlZW4gPSByZWQ7XG5cdFx0XHRcdFx0Ymx1ZSA9IHJlZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb2RlIC09IDE2O1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVtYWluZGVyID0gY29kZSAlIDM2O1xuXG5cdFx0XHRcdFx0cmVkID0gTWF0aC5mbG9vcihjb2RlIC8gMzYpIC8gNTtcblx0XHRcdFx0XHRncmVlbiA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gNikgLyA1O1xuXHRcdFx0XHRcdGJsdWUgPSAocmVtYWluZGVyICUgNikgLyA1O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBNYXRoLm1heChyZWQsIGdyZWVuLCBibHVlKSAqIDI7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2Vcblx0XHRcdFx0bGV0IHJlc3VsdCA9IDMwICsgKChNYXRoLnJvdW5kKGJsdWUpIDw8IDIpIHwgKE1hdGgucm91bmQoZ3JlZW4pIDw8IDEpIHwgTWF0aC5yb3VuZChyZWQpKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gNjA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0cmdiVG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogKHJlZCwgZ3JlZW4sIGJsdWUpID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5yZ2JUb0Fuc2kyNTYocmVkLCBncmVlbiwgYmx1ZSkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLmhleFRvQW5zaTI1NihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdH0pO1xuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmNvbnN0IGFuc2lTdHlsZXMgPSBhc3NlbWJsZVN0eWxlcygpO1xuXG5leHBvcnQgZGVmYXVsdCBhbnNpU3R5bGVzO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgdHR5IGZyb20gJ25vZGU6dHR5JztcblxuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9oYXMtZmxhZy9ibG9iL21haW4vaW5kZXguanNcbi8vLyBmdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8/LmFyZ3MgPz8gcHJvY2Vzcy5hcmd2KSB7XG5mdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8gPyBnbG9iYWxUaGlzLkRlbm8uYXJncyA6IHByb2Nlc3MuYXJndikge1xuXHRjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogKGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJyk7XG5cdGNvbnN0IHBvc2l0aW9uID0gYXJndi5pbmRleE9mKHByZWZpeCArIGZsYWcpO1xuXHRjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG5cdHJldHVybiBwb3NpdGlvbiAhPT0gLTEgJiYgKHRlcm1pbmF0b3JQb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPCB0ZXJtaW5hdG9yUG9zaXRpb24pO1xufVxuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmbGFnRm9yY2VDb2xvcjtcbmlmIChcblx0aGFzRmxhZygnbm8tY29sb3InKVxuXHR8fCBoYXNGbGFnKCduby1jb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1mYWxzZScpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKFxuXHRoYXNGbGFnKCdjb2xvcicpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9ycycpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWUnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1hbHdheXMnKVxuKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMTtcbn1cblxuZnVuY3Rpb24gZW52Rm9yY2VDb2xvcigpIHtcblx0aWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihOdW1iZXIucGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gMyxcblx0fTtcbn1cblxuZnVuY3Rpb24gX3N1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwge3N0cmVhbUlzVFRZLCBzbmlmZkZsYWdzID0gdHJ1ZX0gPSB7fSkge1xuXHRjb25zdCBub0ZsYWdGb3JjZUNvbG9yID0gZW52Rm9yY2VDb2xvcigpO1xuXHRpZiAobm9GbGFnRm9yY2VDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZmxhZ0ZvcmNlQ29sb3IgPSBub0ZsYWdGb3JjZUNvbG9yO1xuXHR9XG5cblx0Y29uc3QgZm9yY2VDb2xvciA9IHNuaWZmRmxhZ3MgPyBmbGFnRm9yY2VDb2xvciA6IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChzbmlmZkZsYWdzKSB7XG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj1mdWxsJylcblx0XHRcdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0XHRyZXR1cm4gMztcblx0XHR9XG5cblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRcdHJldHVybiAyO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGZvciBBenVyZSBEZXZPcHMgcGlwZWxpbmVzLlxuXHQvLyBIYXMgdG8gYmUgYWJvdmUgdGhlIGAhc3RyZWFtSXNUVFlgIGNoZWNrLlxuXHRpZiAoJ1RGX0JVSUxEJyBpbiBlbnYgJiYgJ0FHRU5UX05BTUUnIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMFxuXHRcdFx0JiYgTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTBfNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTRfOTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoJ0dJVEhVQl9BQ1RJT05TJyBpbiBlbnYgfHwgJ0dJVEVBX0FDVElPTlMnIGluIGVudikge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ3h0ZXJtLWtpdHR5Jykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOiB7XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOiB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbGV2ZWwgPSBfc3VwcG9ydHNDb2xvcihzdHJlYW0sIHtcblx0XHRzdHJlYW1Jc1RUWTogc3RyZWFtICYmIHN0cmVhbS5pc1RUWSxcblx0XHQuLi5vcHRpb25zLFxuXHR9KTtcblxuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5jb25zdCBzdXBwb3J0c0NvbG9yID0ge1xuXHRzdGRvdXQ6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDEpfSksXG5cdHN0ZGVycjogY3JlYXRlU3VwcG9ydHNDb2xvcih7aXNUVFk6IHR0eS5pc2F0dHkoMil9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN1cHBvcnRzQ29sb3I7XG4iLCAiLy8gVE9ETzogV2hlbiB0YXJnZXRpbmcgTm9kZS5qcyAxNiwgdXNlIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdWJzdHJpbmcsIHJlcGxhY2VyKSB7XG5cdGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG5cdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qgc3Vic3RyaW5nTGVuZ3RoID0gc3Vic3RyaW5nLmxlbmd0aDtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgsIGluZGV4KSArIHN1YnN0cmluZyArIHJlcGxhY2VyO1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyBzdWJzdHJpbmdMZW5ndGg7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBwcmVmaXgsIHBvc3RmaXgsIGluZGV4KSB7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0Y29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyAxO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG4iLCAiaW1wb3J0IGFuc2lTdHlsZXMgZnJvbSAnI2Fuc2ktc3R5bGVzJztcbmltcG9ydCBzdXBwb3J0c0NvbG9yIGZyb20gJyNzdXBwb3J0cy1jb2xvcic7XG5pbXBvcnQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9vcmRlclxuXHRzdHJpbmdSZXBsYWNlQWxsLFxuXHRzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgsXG59IGZyb20gJy4vdXRpbGl0aWVzLmpzJztcblxuY29uc3Qge3N0ZG91dDogc3Rkb3V0Q29sb3IsIHN0ZGVycjogc3RkZXJyQ29sb3J9ID0gc3VwcG9ydHNDb2xvcjtcblxuY29uc3QgR0VORVJBVE9SID0gU3ltYm9sKCdHRU5FUkFUT1InKTtcbmNvbnN0IFNUWUxFUiA9IFN5bWJvbCgnU1RZTEVSJyk7XG5jb25zdCBJU19FTVBUWSA9IFN5bWJvbCgnSVNfRU1QVFknKTtcblxuLy8gYHN1cHBvcnRzQ29sb3IubGV2ZWxgIFx1MjE5MiBgYW5zaVN0eWxlcy5jb2xvcltuYW1lXWAgbWFwcGluZ1xuY29uc3QgbGV2ZWxNYXBwaW5nID0gW1xuXHQnYW5zaScsXG5cdCdhbnNpJyxcblx0J2Fuc2kyNTYnLFxuXHQnYW5zaTE2bScsXG5dO1xuXG5jb25zdCBzdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5jb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKG9wdGlvbnMubGV2ZWwgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMubGV2ZWwpICYmIG9wdGlvbnMubGV2ZWwgPj0gMCAmJiBvcHRpb25zLmxldmVsIDw9IDMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGxldmVsYCBvcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAwIHRvIDMnKTtcblx0fVxuXG5cdC8vIERldGVjdCBsZXZlbCBpZiBub3Qgc2V0IG1hbnVhbGx5XG5cdGNvbnN0IGNvbG9yTGV2ZWwgPSBzdGRvdXRDb2xvciA/IHN0ZG91dENvbG9yLmxldmVsIDogMDtcblx0b2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhbGsge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuXHRcdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG5cdH1cbn1cblxuY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGNoYWxrID0gKC4uLnN0cmluZ3MpID0+IHN0cmluZ3Muam9pbignICcpO1xuXHRhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgY3JlYXRlQ2hhbGsucHJvdG90eXBlKTtcblxuXHRyZXR1cm4gY2hhbGs7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFsayhvcHRpb25zKSB7XG5cdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG59XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihjcmVhdGVDaGFsay5wcm90b3R5cGUsIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG5cbmZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMpKSB7XG5cdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIGNyZWF0ZVN0eWxlcihzdHlsZS5vcGVuLCBzdHlsZS5jbG9zZSwgdGhpc1tTVFlMRVJdKSwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0XHRyZXR1cm4gYnVpbGRlcjtcblx0XHR9LFxuXHR9O1xufVxuXG5zdHlsZXMudmlzaWJsZSA9IHtcblx0Z2V0KCkge1xuXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXNbU1RZTEVSXSwgdHJ1ZSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdH0sXG59O1xuXG5jb25zdCBnZXRNb2RlbEFuc2kgPSAobW9kZWwsIGxldmVsLCB0eXBlLCAuLi5hcmd1bWVudHNfKSA9PiB7XG5cdGlmIChtb2RlbCA9PT0gJ3JnYicpIHtcblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMTZtJykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTE2bSguLi5hcmd1bWVudHNfKTtcblx0XHR9XG5cblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMjU2Jykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTI1NihhbnNpU3R5bGVzLnJnYlRvQW5zaTI1NiguLi5hcmd1bWVudHNfKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaShhbnNpU3R5bGVzLnJnYlRvQW5zaSguLi5hcmd1bWVudHNfKSk7XG5cdH1cblxuXHRpZiAobW9kZWwgPT09ICdoZXgnKSB7XG5cdFx0cmV0dXJuIGdldE1vZGVsQW5zaSgncmdiJywgbGV2ZWwsIHR5cGUsIC4uLmFuc2lTdHlsZXMuaGV4VG9SZ2IoLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pO1xufTtcblxuY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdhbnNpMjU2J107XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRzdHlsZXNbbW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdjb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlLCB0aGlzW1NUWUxFUl0pO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcblxuXHRjb25zdCBiZ01vZGVsID0gJ2JnJyArIG1vZGVsWzBdLnRvVXBwZXJDYXNlKCkgKyBtb2RlbC5zbGljZSgxKTtcblx0c3R5bGVzW2JnTW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdiZ0NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcblx0Li4uc3R5bGVzLFxuXHRsZXZlbDoge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbR0VORVJBVE9SXS5sZXZlbDtcblx0XHR9LFxuXHRcdHNldChsZXZlbCkge1xuXHRcdFx0dGhpc1tHRU5FUkFUT1JdLmxldmVsID0gbGV2ZWw7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuXHRsZXQgb3BlbkFsbDtcblx0bGV0IGNsb3NlQWxsO1xuXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRvcGVuQWxsID0gb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlO1xuXHR9IGVsc2Uge1xuXHRcdG9wZW5BbGwgPSBwYXJlbnQub3BlbkFsbCArIG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRvcGVuQWxsLFxuXHRcdGNsb3NlQWxsLFxuXHRcdHBhcmVudCxcblx0fTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcblx0Ly8gU2luZ2xlIGFyZ3VtZW50IGlzIGhvdCBwYXRoLCBpbXBsaWNpdCBjb2VyY2lvbiBpcyBmYXN0ZXIgdGhhbiBhbnl0aGluZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblxuXHQvLyBXZSBhbHRlciB0aGUgcHJvdG90eXBlIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG5cdC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG5cdGJ1aWxkZXJbR0VORVJBVE9SXSA9IHNlbGY7XG5cdGJ1aWxkZXJbU1RZTEVSXSA9IF9zdHlsZXI7XG5cdGJ1aWxkZXJbSVNfRU1QVFldID0gX2lzRW1wdHk7XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59O1xuXG5jb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZi5sZXZlbCA8PSAwIHx8ICFzdHJpbmcpIHtcblx0XHRyZXR1cm4gc2VsZltJU19FTVBUWV0gPyAnJyA6IHN0cmluZztcblx0fVxuXG5cdGxldCBzdHlsZXIgPSBzZWxmW1NUWUxFUl07XG5cblx0aWYgKHN0eWxlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHtvcGVuQWxsLCBjbG9zZUFsbH0gPSBzdHlsZXI7XG5cdGlmIChzdHJpbmcuaW5jbHVkZXMoJ1xcdTAwMUInKSkge1xuXHRcdHdoaWxlIChzdHlsZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gUmVwbGFjZSBhbnkgaW5zdGFuY2VzIGFscmVhZHkgcHJlc2VudCB3aXRoIGEgcmUtb3BlbmluZyBjb2RlXG5cdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG5cdFx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuXG5cdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuXHQvLyBhbnkvdmlzaWJsZSBlZmZlY3Qgb24gcGFydHMgd2UgYWRkIGhlcmUuIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG5cdC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblx0aWYgKGxmSW5kZXggIT09IC0xKSB7XG5cdFx0c3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgY2xvc2VBbGwsIG9wZW5BbGwsIGxmSW5kZXgpO1xuXHR9XG5cblx0cmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuY29uc3QgY2hhbGsgPSBjcmVhdGVDaGFsaygpO1xuZXhwb3J0IGNvbnN0IGNoYWxrU3RkZXJyID0gY3JlYXRlQ2hhbGsoe2xldmVsOiBzdGRlcnJDb2xvciA/IHN0ZGVyckNvbG9yLmxldmVsIDogMH0pO1xuXG5leHBvcnQge1xuXHRtb2RpZmllck5hbWVzLFxuXHRmb3JlZ3JvdW5kQ29sb3JOYW1lcyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMsXG5cdGNvbG9yTmFtZXMsXG5cblx0Ly8gVE9ETzogUmVtb3ZlIHRoZXNlIGFsaWFzZXMgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxuXHRtb2RpZmllck5hbWVzIGFzIG1vZGlmaWVycyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMgYXMgZm9yZWdyb3VuZENvbG9ycyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMgYXMgYmFja2dyb3VuZENvbG9ycyxcblx0Y29sb3JOYW1lcyBhcyBjb2xvcnMsXG59IGZyb20gJy4vdmVuZG9yL2Fuc2ktc3R5bGVzL2luZGV4LmpzJztcblxuZXhwb3J0IHtcblx0c3Rkb3V0Q29sb3IgYXMgc3VwcG9ydHNDb2xvcixcblx0c3RkZXJyQ29sb3IgYXMgc3VwcG9ydHNDb2xvclN0ZGVycixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNoYWxrO1xuIiwgIid1c2Ugc3RyaWN0J1xuLypcbiAqIG1lcmdlMlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlYW1iaXRpb24vbWVyZ2UyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgVGVhbWJpdGlvblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbmNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2UyXG5cbmZ1bmN0aW9uIG1lcmdlMiAoKSB7XG4gIGNvbnN0IHN0cmVhbXNRdWV1ZSA9IFtdXG4gIGNvbnN0IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgbGV0IG1lcmdpbmcgPSBmYWxzZVxuICBsZXQgb3B0aW9ucyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gIGlmIChvcHRpb25zICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMucGlwZSA9PSBudWxsKSB7XG4gICAgYXJncy5wb3AoKVxuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgY29uc3QgZG9FbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2VcbiAgY29uc3QgZG9QaXBlRXJyb3IgPSBvcHRpb25zLnBpcGVFcnJvciA9PT0gdHJ1ZVxuICBpZiAob3B0aW9ucy5vYmplY3RNb2RlID09IG51bGwpIHtcbiAgICBvcHRpb25zLm9iamVjdE1vZGUgPSB0cnVlXG4gIH1cbiAgaWYgKG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5oaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0XG4gIH1cbiAgY29uc3QgbWVyZ2VkU3RyZWFtID0gUGFzc1Rocm91Z2gob3B0aW9ucylcblxuICBmdW5jdGlvbiBhZGRTdHJlYW0gKCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHN0cmVhbXNRdWV1ZS5wdXNoKHBhdXNlU3RyZWFtcyhhcmd1bWVudHNbaV0sIG9wdGlvbnMpKVxuICAgIH1cbiAgICBtZXJnZVN0cmVhbSgpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlU3RyZWFtICgpIHtcbiAgICBpZiAobWVyZ2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG1lcmdpbmcgPSB0cnVlXG5cbiAgICBsZXQgc3RyZWFtcyA9IHN0cmVhbXNRdWV1ZS5zaGlmdCgpXG4gICAgaWYgKCFzdHJlYW1zKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFN0cmVhbSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc11cbiAgICB9XG5cbiAgICBsZXQgcGlwZXNDb3VudCA9IHN0cmVhbXMubGVuZ3RoICsgMVxuXG4gICAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICBpZiAoLS1waXBlc0NvdW50ID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1lcmdpbmcgPSBmYWxzZVxuICAgICAgbWVyZ2VTdHJlYW0oKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBpcGUgKHN0cmVhbSkge1xuICAgICAgZnVuY3Rpb24gb25lbmQgKCkge1xuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ21lcmdlMlVucGlwZUVuZCcsIG9uZW5kKVxuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgICAgICBpZiAoZG9QaXBlRXJyb3IpIHtcbiAgICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICAgICAgfVxuICAgICAgICBuZXh0KClcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uZXJyb3IgKGVycikge1xuICAgICAgICBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICAvLyBza2lwIGVuZGVkIHN0cmVhbVxuICAgICAgaWYgKHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLm9uKCdtZXJnZTJVbnBpcGVFbmQnLCBvbmVuZClcbiAgICAgIHN0cmVhbS5vbignZW5kJywgb25lbmQpXG5cbiAgICAgIGlmIChkb1BpcGVFcnJvcikge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLnBpcGUobWVyZ2VkU3RyZWFtLCB7IGVuZDogZmFsc2UgfSlcbiAgICAgIC8vIGNvbXBhdGlibGUgZm9yIG9sZCBzdHJlYW1cbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGlwZShzdHJlYW1zW2ldKVxuICAgIH1cblxuICAgIG5leHQoKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kU3RyZWFtICgpIHtcbiAgICBtZXJnaW5nID0gZmFsc2VcbiAgICAvLyBlbWl0ICdxdWV1ZURyYWluJyB3aGVuIGFsbCBzdHJlYW1zIG1lcmdlZC5cbiAgICBtZXJnZWRTdHJlYW0uZW1pdCgncXVldWVEcmFpbicpXG4gICAgaWYgKGRvRW5kKSB7XG4gICAgICBtZXJnZWRTdHJlYW0uZW5kKClcbiAgICB9XG4gIH1cblxuICBtZXJnZWRTdHJlYW0uc2V0TWF4TGlzdGVuZXJzKDApXG4gIG1lcmdlZFN0cmVhbS5hZGQgPSBhZGRTdHJlYW1cbiAgbWVyZ2VkU3RyZWFtLm9uKCd1bnBpcGUnLCBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgc3RyZWFtLmVtaXQoJ21lcmdlMlVucGlwZUVuZCcpXG4gIH0pXG5cbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgYWRkU3RyZWFtLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH1cbiAgcmV0dXJuIG1lcmdlZFN0cmVhbVxufVxuXG4vLyBjaGVjayBhbmQgcGF1c2Ugc3RyZWFtcyBmb3IgcGlwZS5cbmZ1bmN0aW9uIHBhdXNlU3RyZWFtcyAoc3RyZWFtcywgb3B0aW9ucykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggb2xkLXN0eWxlIHN0cmVhbXNcbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgJiYgc3RyZWFtcy5waXBlKSB7XG4gICAgICBzdHJlYW1zID0gc3RyZWFtcy5waXBlKFBhc3NUaHJvdWdoKG9wdGlvbnMpKVxuICAgIH1cbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgfHwgIXN0cmVhbXMucGF1c2UgfHwgIXN0cmVhbXMucGlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IHJlYWRhYmxlIHN0cmVhbSBjYW4gYmUgbWVyZ2VkLicpXG4gICAgfVxuICAgIHN0cmVhbXMucGF1c2UoKVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJlYW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zW2ldID0gcGF1c2VTdHJlYW1zKHN0cmVhbXNbaV0sIG9wdGlvbnMpXG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJlYW1zXG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNwbGl0V2hlbiA9IGV4cG9ydHMuZmxhdHRlbiA9IHZvaWQgMDtcbmZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChjb2xsZWN0aW9uLCBpdGVtKSA9PiBbXS5jb25jYXQoY29sbGVjdGlvbiwgaXRlbSksIFtdKTtcbn1cbmV4cG9ydHMuZmxhdHRlbiA9IGZsYXR0ZW47XG5mdW5jdGlvbiBzcGxpdFdoZW4oaXRlbXMsIHByZWRpY2F0ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtbXV07XG4gICAgbGV0IGdyb3VwSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICBncm91cEluZGV4Kys7XG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFtncm91cEluZGV4XS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLnNwbGl0V2hlbiA9IHNwbGl0V2hlbjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0Vub2VudENvZGVFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5jb2RlID09PSAnRU5PRU5UJztcbn1cbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSBpc0Vub2VudENvZGVFcnJvcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gdm9pZCAwO1xuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBzdGF0cy5pc0RpcmVjdG9yeS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gc3RhdHMuaXNTb2NrZXQuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cyk7XG59XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydFBvc2l4UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGV4cG9ydHMuZXNjYXBlID0gZXhwb3J0cy5yZW1vdmVMZWFkaW5nRG90U2VnbWVudCA9IGV4cG9ydHMubWFrZUFic29sdXRlID0gZXhwb3J0cy51bml4aWZ5ID0gdm9pZCAwO1xuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBJU19XSU5ET1dTX1BMQVRGT1JNID0gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcbmNvbnN0IExFQURJTkdfRE9UX1NFR01FTlRfQ0hBUkFDVEVSU19DT1VOVCA9IDI7IC8vIC4vIG9yIC5cXFxcXG4vKipcbiAqIEFsbCBub24tZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBQb3NpeDogKCkqP1tde3x9LCAhK0AgYmVmb3JlICgsICEgYXQgdGhlIGJlZ2lubmluZywgXFxcXCBiZWZvcmUgbm9uLXNwZWNpYWwgY2hhcmFjdGVycy5cbiAqIFdpbmRvd3M6ICgpe31bXSwgIStAIGJlZm9yZSAoLCAhIGF0IHRoZSBiZWdpbm5pbmcuXG4gKi9cbmNvbnN0IFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCkqP1tcXF17fH1dfF4hfFshK0BdKD89XFwoKXxcXFxcKD8hWyEoKSorP0BbXFxde3x9XSkpL2c7XG5jb25zdCBXSU5ET1dTX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKClbXFxde31dfF4hfFshK0BdKD89XFwoKSkvZztcbi8qKlxuICogVGhlIGRldmljZSBwYXRoIChcXFxcLlxcIG9yIFxcXFw/XFwpLlxuICogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9zdGFuZGFyZC9pby9maWxlLXBhdGgtZm9ybWF0cyNkb3MtZGV2aWNlLXBhdGhzXG4gKi9cbmNvbnN0IERPU19ERVZJQ0VfUEFUSF9SRSA9IC9eXFxcXFxcXFwoWy4/XSkvO1xuLyoqXG4gKiBBbGwgYmFja3NsYXNoZXMgZXhjZXB0IHRob3NlIGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqIFdpbmRvd3M6ICEoKStAe31cbiAqIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2ZpbGVpby9uYW1pbmctYS1maWxlI25hbWluZy1jb252ZW50aW9uc1xuICovXG5jb25zdCBXSU5ET1dTX0JBQ0tTTEFTSEVTX1JFID0gL1xcXFwoPyFbISgpK0BbXFxde31dKS9nO1xuLyoqXG4gKiBEZXNpZ25lZCB0byB3b3JrIG9ubHkgd2l0aCBzaW1wbGUgcGF0aHM6IGBkaXJcXFxcZmlsZWAuXG4gKi9cbmZ1bmN0aW9uIHVuaXhpZnkoZmlsZXBhdGgpIHtcbiAgICByZXR1cm4gZmlsZXBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuZXhwb3J0cy51bml4aWZ5ID0gdW5peGlmeTtcbmZ1bmN0aW9uIG1ha2VBYnNvbHV0ZShjd2QsIGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIGZpbGVwYXRoKTtcbn1cbmV4cG9ydHMubWFrZUFic29sdXRlID0gbWFrZUFic29sdXRlO1xuZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkpIHtcbiAgICAvLyBXZSBkbyBub3QgdXNlIGBzdGFydHNXaXRoYCBiZWNhdXNlIHRoaXMgaXMgMTB4IHNsb3dlciB0aGFuIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgY2FzZXMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItc3RyaW5nLXN0YXJ0cy1lbmRzLXdpdGhcbiAgICBpZiAoZW50cnkuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kQ2hhcmFjdGVyeSA9IGVudHJ5LmNoYXJBdCgxKTtcbiAgICAgICAgaWYgKHNlY29uZENoYXJhY3RlcnkgPT09ICcvJyB8fCBzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbGljZShMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbn1cbmV4cG9ydHMucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSByZW1vdmVMZWFkaW5nRG90U2VnbWVudDtcbmV4cG9ydHMuZXNjYXBlID0gSVNfV0lORE9XU19QTEFURk9STSA/IGVzY2FwZVdpbmRvd3NQYXRoIDogZXNjYXBlUG9zaXhQYXRoO1xuZnVuY3Rpb24gZXNjYXBlV2luZG93c1BhdGgocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoV0lORE9XU19VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFLCAnXFxcXCQyJyk7XG59XG5leHBvcnRzLmVzY2FwZVdpbmRvd3NQYXRoID0gZXNjYXBlV2luZG93c1BhdGg7XG5mdW5jdGlvbiBlc2NhcGVQb3NpeFBhdGgocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoUE9TSVhfVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xufVxuZXhwb3J0cy5lc2NhcGVQb3NpeFBhdGggPSBlc2NhcGVQb3NpeFBhdGg7XG5leHBvcnRzLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gSVNfV0lORE9XU19QTEFURk9STSA/IGNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybiA6IGNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4oZmlsZXBhdGgpIHtcbiAgICByZXR1cm4gZXNjYXBlV2luZG93c1BhdGgoZmlsZXBhdGgpXG4gICAgICAgIC5yZXBsYWNlKERPU19ERVZJQ0VfUEFUSF9SRSwgJy8vJDEnKVxuICAgICAgICAucmVwbGFjZShXSU5ET1dTX0JBQ0tTTEFTSEVTX1JFLCAnLycpO1xufVxuZXhwb3J0cy5jb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4gPSBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuKGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGVzY2FwZVBvc2l4UGF0aChmaWxlcGF0aCk7XG59XG5leHBvcnRzLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuO1xuIiwgIi8qIVxuICogaXMtZXh0Z2xvYiA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0V4dGdsb2Ioc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gLyhcXFxcKS58KFtAPyErKl1cXCguKlxcKSkvZy5leGVjKHN0cikpKSB7XG4gICAgaWYgKG1hdGNoWzJdKSByZXR1cm4gdHJ1ZTtcbiAgICBzdHIgPSBzdHIuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsICIvKiFcbiAqIGlzLWdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc0V4dGdsb2IgPSByZXF1aXJlKCdpcy1leHRnbG9iJyk7XG52YXIgY2hhcnMgPSB7ICd7JzogJ30nLCAnKCc6ICcpJywgJ1snOiAnXSd9O1xudmFyIHN0cmljdENoZWNrID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHJbMF0gPT09ICchJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBwaXBlSW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlU3F1YXJlSW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlQ3VybHlJbmRleCA9IC0yO1xuICB2YXIgY2xvc2VQYXJlbkluZGV4ID0gLTI7XG4gIHZhciBiYWNrU2xhc2hJbmRleCA9IC0yO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKHN0cltpbmRleF0gPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleCArIDFdID09PSAnPycgJiYgL1tcXF0uKyldLy50ZXN0KHN0cltpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ1snICYmIHN0cltpbmRleCArIDFdICE9PSAnXScpIHtcbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4IDwgaW5kZXgpIHtcbiAgICAgICAgY2xvc2VTcXVhcmVJbmRleCA9IHN0ci5pbmRleE9mKCddJywgaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggPiBpbmRleCkge1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVNxdWFyZUluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xvc2VDdXJseUluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAneycgJiYgc3RyW2luZGV4ICsgMV0gIT09ICd9Jykge1xuICAgICAgY2xvc2VDdXJseUluZGV4ID0gc3RyLmluZGV4T2YoJ30nLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VDdXJseUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlQ3VybHlJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlUGFyZW5JbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdID09PSAnPycgJiYgL1s6IT1dLy50ZXN0KHN0cltpbmRleCArIDJdKSAmJiBzdHJbaW5kZXggKyAzXSAhPT0gJyknKSB7XG4gICAgICBjbG9zZVBhcmVuSW5kZXggPSBzdHIuaW5kZXhPZignKScsIGluZGV4KTtcbiAgICAgIGlmIChjbG9zZVBhcmVuSW5kZXggPiBpbmRleCkge1xuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VQYXJlbkluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGlwZUluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAnKCcgJiYgc3RyW2luZGV4ICsgMV0gIT09ICd8Jykge1xuICAgICAgaWYgKHBpcGVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIHBpcGVJbmRleCA9IHN0ci5pbmRleE9mKCd8JywgaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW3BpcGVJbmRleCArIDFdICE9PSAnKScpIHtcbiAgICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBwaXBlSW5kZXgpO1xuICAgICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gcGlwZUluZGV4KSB7XG4gICAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIHBpcGVJbmRleCk7XG4gICAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgdmFyIG9wZW4gPSBzdHJbaW5kZXggKyAxXTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB2YXIgY2xvc2UgPSBjaGFyc1tvcGVuXTtcblxuICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgIHZhciBuID0gc3RyLmluZGV4T2YoY2xvc2UsIGluZGV4KTtcbiAgICAgICAgaWYgKG4gIT09IC0xKSB7XG4gICAgICAgICAgaW5kZXggPSBuICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyW2luZGV4XSA9PT0gJyEnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgcmVsYXhlZENoZWNrID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHJbMF0gPT09ICchJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICBpZiAoL1sqP3t9KClbXFxdXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgdmFyIG9wZW4gPSBzdHJbaW5kZXggKyAxXTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB2YXIgY2xvc2UgPSBjaGFyc1tvcGVuXTtcblxuICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgIHZhciBuID0gc3RyLmluZGV4T2YoY2xvc2UsIGluZGV4KTtcbiAgICAgICAgaWYgKG4gIT09IC0xKSB7XG4gICAgICAgICAgaW5kZXggPSBuICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyW2luZGV4XSA9PT0gJyEnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzR2xvYihzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNFeHRnbG9iKHN0cikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjaGVjayA9IHN0cmljdENoZWNrO1xuXG4gIC8vIG9wdGlvbmFsbHkgcmVsYXggY2hlY2tcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QgPT09IGZhbHNlKSB7XG4gICAgY2hlY2sgPSByZWxheGVkQ2hlY2s7XG4gIH1cblxuICByZXR1cm4gY2hlY2soc3RyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNHbG9iID0gcmVxdWlyZSgnaXMtZ2xvYicpO1xudmFyIHBhdGhQb3NpeERpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykucG9zaXguZGlybmFtZTtcbnZhciBpc1dpbjMyID0gcmVxdWlyZSgnb3MnKS5wbGF0Zm9ybSgpID09PSAnd2luMzInO1xuXG52YXIgc2xhc2ggPSAnLyc7XG52YXIgYmFja3NsYXNoID0gL1xcXFwvZztcbnZhciBlbmNsb3N1cmUgPSAvW1xce1xcW10uKltcXH1cXF1dJC87XG52YXIgZ2xvYmJ5ID0gLyhefFteXFxcXF0pKFtcXHtcXFtdfFxcKFteXFwpXSskKS87XG52YXIgZXNjYXBlZCA9IC9cXFxcKFtcXCFcXCpcXD9cXHxcXFtcXF1cXChcXClcXHtcXH1dKS9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsaXBCYWNrc2xhc2hlcz10cnVlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnbG9iUGFyZW50KHN0ciwgb3B0cykge1xuICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBmbGlwQmFja3NsYXNoZXM6IHRydWUgfSwgb3B0cyk7XG5cbiAgLy8gZmxpcCB3aW5kb3dzIHBhdGggc2VwYXJhdG9yc1xuICBpZiAob3B0aW9ucy5mbGlwQmFja3NsYXNoZXMgJiYgaXNXaW4zMiAmJiBzdHIuaW5kZXhPZihzbGFzaCkgPCAwKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoYmFja3NsYXNoLCBzbGFzaCk7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2UgZm9yIHN0cmluZ3MgZW5kaW5nIGluIGVuY2xvc3VyZSBjb250YWluaW5nIHBhdGggc2VwYXJhdG9yXG4gIGlmIChlbmNsb3N1cmUudGVzdChzdHIpKSB7XG4gICAgc3RyICs9IHNsYXNoO1xuICB9XG5cbiAgLy8gcHJlc2VydmVzIGZ1bGwgcGF0aCBpbiBjYXNlIG9mIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yXG4gIHN0ciArPSAnYSc7XG5cbiAgLy8gcmVtb3ZlIHBhdGggcGFydHMgdGhhdCBhcmUgZ2xvYmJ5XG4gIGRvIHtcbiAgICBzdHIgPSBwYXRoUG9zaXhEaXJuYW1lKHN0cik7XG4gIH0gd2hpbGUgKGlzR2xvYihzdHIpIHx8IGdsb2JieS50ZXN0KHN0cikpO1xuXG4gIC8vIHJlbW92ZSBlc2NhcGUgY2hhcnMgYW5kIHJldHVybiByZXN1bHRcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGVzY2FwZWQsICckMScpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuaXNJbnRlZ2VyID0gbnVtID0+IHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobnVtKTtcbiAgfVxuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycgJiYgbnVtLnRyaW0oKSAhPT0gJycpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIobnVtKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZmluZCA9IChub2RlLCB0eXBlKSA9PiBub2RlLm5vZGVzLmZpbmQobm9kZSA9PiBub2RlLnR5cGUgPT09IHR5cGUpO1xuXG4vKipcbiAqIEZpbmQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG4gKi9cblxuZXhwb3J0cy5leGNlZWRzTGltaXQgPSAobWluLCBtYXgsIHN0ZXAgPSAxLCBsaW1pdCkgPT4ge1xuICBpZiAobGltaXQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghZXhwb3J0cy5pc0ludGVnZXIobWluKSB8fCAhZXhwb3J0cy5pc0ludGVnZXIobWF4KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKChOdW1iZXIobWF4KSAtIE51bWJlcihtaW4pKSAvIE51bWJlcihzdGVwKSkgPj0gbGltaXQ7XG59O1xuXG4vKipcbiAqIEVzY2FwZSB0aGUgZ2l2ZW4gbm9kZSB3aXRoICdcXFxcJyBiZWZvcmUgbm9kZS52YWx1ZVxuICovXG5cbmV4cG9ydHMuZXNjYXBlTm9kZSA9IChibG9jaywgbiA9IDAsIHR5cGUpID0+IHtcbiAgbGV0IG5vZGUgPSBibG9jay5ub2Rlc1tuXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgaWYgKCh0eXBlICYmIG5vZGUudHlwZSA9PT0gdHlwZSkgfHwgbm9kZS50eXBlID09PSAnb3BlbicgfHwgbm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgaWYgKG5vZGUuZXNjYXBlZCAhPT0gdHJ1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9ICdcXFxcJyArIG5vZGUudmFsdWU7XG4gICAgICBub2RlLmVzY2FwZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGJyYWNlIG5vZGUgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGxpdGVyYWwgYnJhY2VzXG4gKi9cblxuZXhwb3J0cy5lbmNsb3NlQnJhY2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ2JyYWNlJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoKG5vZGUuY29tbWFzID4+IDAgKyBub2RlLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuICAgIG5vZGUuaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBicmFjZSBub2RlIGlzIGludmFsaWQuXG4gKi9cblxuZXhwb3J0cy5pc0ludmFsaWRCcmFjZSA9IGJsb2NrID0+IHtcbiAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKGJsb2NrLmludmFsaWQgPT09IHRydWUgfHwgYmxvY2suZG9sbGFyKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChibG9jay5jb21tYXMgPj4gMCArIGJsb2NrLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChibG9jay5vcGVuICE9PSB0cnVlIHx8IGJsb2NrLmNsb3NlICE9PSB0cnVlKSB7XG4gICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBub2RlIGlzIGFuIG9wZW4gb3IgY2xvc2Ugbm9kZVxuICovXG5cbmV4cG9ydHMuaXNPcGVuT3JDbG9zZSA9IG5vZGUgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAnb3BlbicgfHwgbm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG5vZGUub3BlbiA9PT0gdHJ1ZSB8fCBub2RlLmNsb3NlID09PSB0cnVlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2UgYW4gYXJyYXkgb2YgdGV4dCBub2Rlcy5cbiAqL1xuXG5leHBvcnRzLnJlZHVjZSA9IG5vZGVzID0+IG5vZGVzLnJlZHVjZSgoYWNjLCBub2RlKSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JykgYWNjLnB1c2gobm9kZS52YWx1ZSk7XG4gIGlmIChub2RlLnR5cGUgPT09ICdyYW5nZScpIG5vZGUudHlwZSA9ICd0ZXh0JztcbiAgcmV0dXJuIGFjYztcbn0sIFtdKTtcblxuLyoqXG4gKiBGbGF0dGVuIGFuIGFycmF5XG4gKi9cblxuZXhwb3J0cy5mbGF0dGVuID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGZsYXQgPSBhcnIgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgZWxlID0gYXJyW2ldO1xuICAgICAgQXJyYXkuaXNBcnJheShlbGUpID8gZmxhdChlbGUsIHJlc3VsdCkgOiBlbGUgIT09IHZvaWQgMCAmJiByZXN1bHQucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBmbGF0KGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgc3RyaW5naWZ5ID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbGV0IGludmFsaWRCbG9jayA9IG9wdGlvbnMuZXNjYXBlSW52YWxpZCAmJiB1dGlscy5pc0ludmFsaWRCcmFjZShwYXJlbnQpO1xuICAgIGxldCBpbnZhbGlkTm9kZSA9IG5vZGUuaW52YWxpZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWU7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIGlmICgoaW52YWxpZEJsb2NrIHx8IGludmFsaWROb2RlKSAmJiB1dGlscy5pc09wZW5PckNsb3NlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSBzdHJpbmdpZnkoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiBzdHJpbmdpZnkoYXN0KTtcbn07XG5cbiIsICIvKiFcbiAqIGlzLW51bWJlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtbnVtYmVyPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBudW0gLSBudW0gPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSA/IE51bWJlci5pc0Zpbml0ZSgrbnVtKSA6IGlzRmluaXRlKCtudW0pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiB0by1yZWdleC1yYW5nZSA8aHR0cHM6Ly9naXRodWIuY29tL21pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2U+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXNOdW1iZXIgPSByZXF1aXJlKCdpcy1udW1iZXInKTtcblxuY29uc3QgdG9SZWdleFJhbmdlID0gKG1pbiwgbWF4LCBvcHRpb25zKSA9PiB7XG4gIGlmIChpc051bWJlcihtaW4pID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvUmVnZXhSYW5nZTogZXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAobWF4ID09PSB2b2lkIDAgfHwgbWluID09PSBtYXgpIHtcbiAgICByZXR1cm4gU3RyaW5nKG1pbik7XG4gIH1cblxuICBpZiAoaXNOdW1iZXIobWF4KSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBudW1iZXIuJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IHsgcmVsYXhaZXJvczogdHJ1ZSwgLi4ub3B0aW9ucyB9O1xuICBpZiAodHlwZW9mIG9wdHMuc3RyaWN0WmVyb3MgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMucmVsYXhaZXJvcyA9IG9wdHMuc3RyaWN0WmVyb3MgPT09IGZhbHNlO1xuICB9XG5cbiAgbGV0IHJlbGF4ID0gU3RyaW5nKG9wdHMucmVsYXhaZXJvcyk7XG4gIGxldCBzaG9ydGhhbmQgPSBTdHJpbmcob3B0cy5zaG9ydGhhbmQpO1xuICBsZXQgY2FwdHVyZSA9IFN0cmluZyhvcHRzLmNhcHR1cmUpO1xuICBsZXQgd3JhcCA9IFN0cmluZyhvcHRzLndyYXApO1xuICBsZXQgY2FjaGVLZXkgPSBtaW4gKyAnOicgKyBtYXggKyAnPScgKyByZWxheCArIHNob3J0aGFuZCArIGNhcHR1cmUgKyB3cmFwO1xuXG4gIGlmICh0b1JlZ2V4UmFuZ2UuY2FjaGUuaGFzT3duUHJvcGVydHkoY2FjaGVLZXkpKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZS5jYWNoZVtjYWNoZUtleV0ucmVzdWx0O1xuICB9XG5cbiAgbGV0IGEgPSBNYXRoLm1pbihtaW4sIG1heCk7XG4gIGxldCBiID0gTWF0aC5tYXgobWluLCBtYXgpO1xuXG4gIGlmIChNYXRoLmFicyhhIC0gYikgPT09IDEpIHtcbiAgICBsZXQgcmVzdWx0ID0gbWluICsgJ3wnICsgbWF4O1xuICAgIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICAgIHJldHVybiBgKCR7cmVzdWx0fSlgO1xuICAgIH1cbiAgICBpZiAob3B0cy53cmFwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGAoPzoke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIGxldCBpc1BhZGRlZCA9IGhhc1BhZGRpbmcobWluKSB8fCBoYXNQYWRkaW5nKG1heCk7XG4gIGxldCBzdGF0ZSA9IHsgbWluLCBtYXgsIGEsIGIgfTtcbiAgbGV0IHBvc2l0aXZlcyA9IFtdO1xuICBsZXQgbmVnYXRpdmVzID0gW107XG5cbiAgaWYgKGlzUGFkZGVkKSB7XG4gICAgc3RhdGUuaXNQYWRkZWQgPSBpc1BhZGRlZDtcbiAgICBzdGF0ZS5tYXhMZW4gPSBTdHJpbmcoc3RhdGUubWF4KS5sZW5ndGg7XG4gIH1cblxuICBpZiAoYSA8IDApIHtcbiAgICBsZXQgbmV3TWluID0gYiA8IDAgPyBNYXRoLmFicyhiKSA6IDE7XG4gICAgbmVnYXRpdmVzID0gc3BsaXRUb1BhdHRlcm5zKG5ld01pbiwgTWF0aC5hYnMoYSksIHN0YXRlLCBvcHRzKTtcbiAgICBhID0gc3RhdGUuYSA9IDA7XG4gIH1cblxuICBpZiAoYiA+PSAwKSB7XG4gICAgcG9zaXRpdmVzID0gc3BsaXRUb1BhdHRlcm5zKGEsIGIsIHN0YXRlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRlLm5lZ2F0aXZlcyA9IG5lZ2F0aXZlcztcbiAgc3RhdGUucG9zaXRpdmVzID0gcG9zaXRpdmVzO1xuICBzdGF0ZS5yZXN1bHQgPSBjb2xsYXRlUGF0dGVybnMobmVnYXRpdmVzLCBwb3NpdGl2ZXMsIG9wdHMpO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5yZXN1bHQgPSBgKCR7c3RhdGUucmVzdWx0fSlgO1xuICB9IGVsc2UgaWYgKG9wdHMud3JhcCAhPT0gZmFsc2UgJiYgKHBvc2l0aXZlcy5sZW5ndGggKyBuZWdhdGl2ZXMubGVuZ3RoKSA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgPSBgKD86JHtzdGF0ZS5yZXN1bHR9KWA7XG4gIH1cblxuICB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldID0gc3RhdGU7XG4gIHJldHVybiBzdGF0ZS5yZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBjb2xsYXRlUGF0dGVybnMobmVnLCBwb3MsIG9wdGlvbnMpIHtcbiAgbGV0IG9ubHlOZWdhdGl2ZSA9IGZpbHRlclBhdHRlcm5zKG5lZywgcG9zLCAnLScsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IG9ubHlQb3NpdGl2ZSA9IGZpbHRlclBhdHRlcm5zKHBvcywgbmVnLCAnJywgZmFsc2UsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgaW50ZXJzZWN0ZWQgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0/JywgdHJ1ZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBzdWJwYXR0ZXJucyA9IG9ubHlOZWdhdGl2ZS5jb25jYXQoaW50ZXJzZWN0ZWQpLmNvbmNhdChvbmx5UG9zaXRpdmUpO1xuICByZXR1cm4gc3VicGF0dGVybnMuam9pbignfCcpO1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUmFuZ2VzKG1pbiwgbWF4KSB7XG4gIGxldCBuaW5lcyA9IDE7XG4gIGxldCB6ZXJvcyA9IDE7XG5cbiAgbGV0IHN0b3AgPSBjb3VudE5pbmVzKG1pbiwgbmluZXMpO1xuICBsZXQgc3RvcHMgPSBuZXcgU2V0KFttYXhdKTtcblxuICB3aGlsZSAobWluIDw9IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgbmluZXMgKz0gMTtcbiAgICBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgfVxuXG4gIHN0b3AgPSBjb3VudFplcm9zKG1heCArIDEsIHplcm9zKSAtIDE7XG5cbiAgd2hpbGUgKG1pbiA8IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgemVyb3MgKz0gMTtcbiAgICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuICB9XG5cbiAgc3RvcHMgPSBbLi4uc3RvcHNdO1xuICBzdG9wcy5zb3J0KGNvbXBhcmUpO1xuICByZXR1cm4gc3RvcHM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhbmdlIHRvIGEgcmVnZXggcGF0dGVyblxuICogQHBhcmFtIHtOdW1iZXJ9IGBzdGFydGBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RvcGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiByYW5nZVRvUGF0dGVybihzdGFydCwgc3RvcCwgb3B0aW9ucykge1xuICBpZiAoc3RhcnQgPT09IHN0b3ApIHtcbiAgICByZXR1cm4geyBwYXR0ZXJuOiBzdGFydCwgY291bnQ6IFtdLCBkaWdpdHM6IDAgfTtcbiAgfVxuXG4gIGxldCB6aXBwZWQgPSB6aXAoc3RhcnQsIHN0b3ApO1xuICBsZXQgZGlnaXRzID0gemlwcGVkLmxlbmd0aDtcbiAgbGV0IHBhdHRlcm4gPSAnJztcbiAgbGV0IGNvdW50ID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0czsgaSsrKSB7XG4gICAgbGV0IFtzdGFydERpZ2l0LCBzdG9wRGlnaXRdID0gemlwcGVkW2ldO1xuXG4gICAgaWYgKHN0YXJ0RGlnaXQgPT09IHN0b3BEaWdpdCkge1xuICAgICAgcGF0dGVybiArPSBzdGFydERpZ2l0O1xuXG4gICAgfSBlbHNlIGlmIChzdGFydERpZ2l0ICE9PSAnMCcgfHwgc3RvcERpZ2l0ICE9PSAnOScpIHtcbiAgICAgIHBhdHRlcm4gKz0gdG9DaGFyYWN0ZXJDbGFzcyhzdGFydERpZ2l0LCBzdG9wRGlnaXQsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgcGF0dGVybiArPSBvcHRpb25zLnNob3J0aGFuZCA9PT0gdHJ1ZSA/ICdcXFxcZCcgOiAnWzAtOV0nO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0dGVybiwgY291bnQ6IFtjb3VudF0sIGRpZ2l0cyB9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUGF0dGVybnMobWluLCBtYXgsIHRvaywgb3B0aW9ucykge1xuICBsZXQgcmFuZ2VzID0gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCk7XG4gIGxldCB0b2tlbnMgPSBbXTtcbiAgbGV0IHN0YXJ0ID0gbWluO1xuICBsZXQgcHJldjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBtYXggPSByYW5nZXNbaV07XG4gICAgbGV0IG9iaiA9IHJhbmdlVG9QYXR0ZXJuKFN0cmluZyhzdGFydCksIFN0cmluZyhtYXgpLCBvcHRpb25zKTtcbiAgICBsZXQgemVyb3MgPSAnJztcblxuICAgIGlmICghdG9rLmlzUGFkZGVkICYmIHByZXYgJiYgcHJldi5wYXR0ZXJuID09PSBvYmoucGF0dGVybikge1xuICAgICAgaWYgKHByZXYuY291bnQubGVuZ3RoID4gMSkge1xuICAgICAgICBwcmV2LmNvdW50LnBvcCgpO1xuICAgICAgfVxuXG4gICAgICBwcmV2LmNvdW50LnB1c2gob2JqLmNvdW50WzBdKTtcbiAgICAgIHByZXYuc3RyaW5nID0gcHJldi5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKHByZXYuY291bnQpO1xuICAgICAgc3RhcnQgPSBtYXggKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay5pc1BhZGRlZCkge1xuICAgICAgemVyb3MgPSBwYWRaZXJvcyhtYXgsIHRvaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb2JqLnN0cmluZyA9IHplcm9zICsgb2JqLnBhdHRlcm4gKyB0b1F1YW50aWZpZXIob2JqLmNvdW50KTtcbiAgICB0b2tlbnMucHVzaChvYmopO1xuICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICBwcmV2ID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZmlsdGVyUGF0dGVybnMoYXJyLCBjb21wYXJpc29uLCBwcmVmaXgsIGludGVyc2VjdGlvbiwgb3B0aW9ucykge1xuICBsZXQgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgZWxlIG9mIGFycikge1xuICAgIGxldCB7IHN0cmluZyB9ID0gZWxlO1xuXG4gICAgLy8gb25seSBwdXNoIGlmIF9ib3RoXyBhcmUgbmVnYXRpdmUuLi5cbiAgICBpZiAoIWludGVyc2VjdGlvbiAmJiAhY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLy8gb3IgX2JvdGhfIGFyZSBwb3NpdGl2ZVxuICAgIGlmIChpbnRlcnNlY3Rpb24gJiYgY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogWmlwIHN0cmluZ3NcbiAqL1xuXG5mdW5jdGlvbiB6aXAoYSwgYikge1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgYXJyLnB1c2goW2FbaV0sIGJbaV1dKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIHJldHVybiBhID4gYiA/IDEgOiBiID4gYSA/IC0xIDogMDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMoYXJyLCBrZXksIHZhbCkge1xuICByZXR1cm4gYXJyLnNvbWUoZWxlID0+IGVsZVtrZXldID09PSB2YWwpO1xufVxuXG5mdW5jdGlvbiBjb3VudE5pbmVzKG1pbiwgbGVuKSB7XG4gIHJldHVybiBOdW1iZXIoU3RyaW5nKG1pbikuc2xpY2UoMCwgLWxlbikgKyAnOScucmVwZWF0KGxlbikpO1xufVxuXG5mdW5jdGlvbiBjb3VudFplcm9zKGludGVnZXIsIHplcm9zKSB7XG4gIHJldHVybiBpbnRlZ2VyIC0gKGludGVnZXIgJSBNYXRoLnBvdygxMCwgemVyb3MpKTtcbn1cblxuZnVuY3Rpb24gdG9RdWFudGlmaWVyKGRpZ2l0cykge1xuICBsZXQgW3N0YXJ0ID0gMCwgc3RvcCA9ICcnXSA9IGRpZ2l0cztcbiAgaWYgKHN0b3AgfHwgc3RhcnQgPiAxKSB7XG4gICAgcmV0dXJuIGB7JHtzdGFydCArIChzdG9wID8gJywnICsgc3RvcCA6ICcnKX19YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHRvQ2hhcmFjdGVyQ2xhc3MoYSwgYiwgb3B0aW9ucykge1xuICByZXR1cm4gYFske2F9JHsoYiAtIGEgPT09IDEpID8gJycgOiAnLSd9JHtifV1gO1xufVxuXG5mdW5jdGlvbiBoYXNQYWRkaW5nKHN0cikge1xuICByZXR1cm4gL14tPygwKylcXGQvLnRlc3Qoc3RyKTtcbn1cblxuZnVuY3Rpb24gcGFkWmVyb3ModmFsdWUsIHRvaywgb3B0aW9ucykge1xuICBpZiAoIXRvay5pc1BhZGRlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCBkaWZmID0gTWF0aC5hYnModG9rLm1heExlbiAtIFN0cmluZyh2YWx1ZSkubGVuZ3RoKTtcbiAgbGV0IHJlbGF4ID0gb3B0aW9ucy5yZWxheFplcm9zICE9PSBmYWxzZTtcblxuICBzd2l0Y2ggKGRpZmYpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJyc7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzA/JyA6ICcwJztcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcmVsYXggPyAnMHswLDJ9JyA6ICcwMCc7XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHJlbGF4ID8gYDB7MCwke2RpZmZ9fWAgOiBgMHske2RpZmZ9fWA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FjaGVcbiAqL1xuXG50b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fTtcbnRvUmVnZXhSYW5nZS5jbGVhckNhY2hlID0gKCkgPT4gKHRvUmVnZXhSYW5nZS5jYWNoZSA9IHt9KTtcblxuLyoqXG4gKiBFeHBvc2UgYHRvUmVnZXhSYW5nZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvUmVnZXhSYW5nZTtcbiIsICIvKiFcbiAqIGZpbGwtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2ZpbGwtcmFuZ2U+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IHRvUmVnZXhSYW5nZSA9IHJlcXVpcmUoJ3RvLXJlZ2V4LXJhbmdlJyk7XG5cbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG5jb25zdCB0cmFuc2Zvcm0gPSB0b051bWJlciA9PiB7XG4gIHJldHVybiB2YWx1ZSA9PiB0b051bWJlciA9PT0gdHJ1ZSA/IE51bWJlcih2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgaXNWYWxpZFZhbHVlID0gdmFsdWUgPT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycpO1xufTtcblxuY29uc3QgaXNOdW1iZXIgPSBudW0gPT4gTnVtYmVyLmlzSW50ZWdlcigrbnVtKTtcblxuY29uc3QgemVyb3MgPSBpbnB1dCA9PiB7XG4gIGxldCB2YWx1ZSA9IGAke2lucHV0fWA7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVbMF0gPT09ICctJykgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgaWYgKHZhbHVlID09PSAnMCcpIHJldHVybiBmYWxzZTtcbiAgd2hpbGUgKHZhbHVlWysraW5kZXhdID09PSAnMCcpO1xuICByZXR1cm4gaW5kZXggPiAwO1xufTtcblxuY29uc3Qgc3RyaW5naWZ5ID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHJpbmdpZnkgPT09IHRydWU7XG59O1xuXG5jb25zdCBwYWQgPSAoaW5wdXQsIG1heExlbmd0aCwgdG9OdW1iZXIpID0+IHtcbiAgaWYgKG1heExlbmd0aCA+IDApIHtcbiAgICBsZXQgZGFzaCA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgICBpZiAoZGFzaCkgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBpbnB1dCA9IChkYXNoICsgaW5wdXQucGFkU3RhcnQoZGFzaCA/IG1heExlbmd0aCAtIDEgOiBtYXhMZW5ndGgsICcwJykpO1xuICB9XG4gIGlmICh0b051bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gU3RyaW5nKGlucHV0KTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCB0b01heExlbiA9IChpbnB1dCwgbWF4TGVuZ3RoKSA9PiB7XG4gIGxldCBuZWdhdGl2ZSA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBtYXhMZW5ndGgtLTtcbiAgfVxuICB3aGlsZSAoaW5wdXQubGVuZ3RoIDwgbWF4TGVuZ3RoKSBpbnB1dCA9ICcwJyArIGlucHV0O1xuICByZXR1cm4gbmVnYXRpdmUgPyAoJy0nICsgaW5wdXQpIDogaW5wdXQ7XG59O1xuXG5jb25zdCB0b1NlcXVlbmNlID0gKHBhcnRzLCBvcHRpb25zKSA9PiB7XG4gIHBhcnRzLm5lZ2F0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG4gIHBhcnRzLnBvc2l0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG5cbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgbGV0IHBvc2l0aXZlcyA9ICcnO1xuICBsZXQgbmVnYXRpdmVzID0gJyc7XG4gIGxldCByZXN1bHQ7XG5cbiAgaWYgKHBhcnRzLnBvc2l0aXZlcy5sZW5ndGgpIHtcbiAgICBwb3NpdGl2ZXMgPSBwYXJ0cy5wb3NpdGl2ZXMuam9pbignfCcpO1xuICB9XG5cbiAgaWYgKHBhcnRzLm5lZ2F0aXZlcy5sZW5ndGgpIHtcbiAgICBuZWdhdGl2ZXMgPSBgLSgke3ByZWZpeH0ke3BhcnRzLm5lZ2F0aXZlcy5qb2luKCd8Jyl9KWA7XG4gIH1cblxuICBpZiAocG9zaXRpdmVzICYmIG5lZ2F0aXZlcykge1xuICAgIHJlc3VsdCA9IGAke3Bvc2l0aXZlc318JHtuZWdhdGl2ZXN9YDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBwb3NpdGl2ZXMgfHwgbmVnYXRpdmVzO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgIHJldHVybiBgKCR7cHJlZml4fSR7cmVzdWx0fSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRvUmFuZ2UgPSAoYSwgYiwgaXNOdW1iZXJzLCBvcHRpb25zKSA9PiB7XG4gIGlmIChpc051bWJlcnMpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlKGEsIGIsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHN0YXJ0O1xuXG4gIGxldCBzdG9wID0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTtcbiAgcmV0dXJuIGBbJHtzdGFydH0tJHtzdG9wfV1gO1xufTtcblxuY29uc3QgdG9SZWdleCA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIGxldCB3cmFwID0gb3B0aW9ucy53cmFwID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gICAgcmV0dXJuIHdyYXAgPyBgKCR7cHJlZml4fSR7c3RhcnQuam9pbignfCcpfSlgIDogc3RhcnQuam9pbignfCcpO1xuICB9XG4gIHJldHVybiB0b1JlZ2V4UmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCByYW5nZUVycm9yID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJhbmdlIGFyZ3VtZW50czogJyArIHV0aWwuaW5zcGVjdCguLi5hcmdzKSk7XG59O1xuXG5jb25zdCBpbnZhbGlkUmFuZ2UgPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHRocm93IHJhbmdlRXJyb3IoW3N0YXJ0LCBlbmRdKTtcbiAgcmV0dXJuIFtdO1xufTtcblxuY29uc3QgaW52YWxpZFN0ZXAgPSAoc3RlcCwgb3B0aW9ucykgPT4ge1xuICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBzdGVwIFwiJHtzdGVwfVwiIHRvIGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufTtcblxuY29uc3QgZmlsbE51bWJlcnMgPSAoc3RhcnQsIGVuZCwgc3RlcCA9IDEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgYSA9IE51bWJlcihzdGFydCk7XG4gIGxldCBiID0gTnVtYmVyKGVuZCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGEpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGIpKSB7XG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gZml4IG5lZ2F0aXZlIHplcm9cbiAgaWYgKGEgPT09IDApIGEgPSAwO1xuICBpZiAoYiA9PT0gMCkgYiA9IDA7XG5cbiAgbGV0IGRlc2NlbmRpbmcgPSBhID4gYjtcbiAgbGV0IHN0YXJ0U3RyaW5nID0gU3RyaW5nKHN0YXJ0KTtcbiAgbGV0IGVuZFN0cmluZyA9IFN0cmluZyhlbmQpO1xuICBsZXQgc3RlcFN0cmluZyA9IFN0cmluZyhzdGVwKTtcbiAgc3RlcCA9IE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKTtcblxuICBsZXQgcGFkZGVkID0gemVyb3Moc3RhcnRTdHJpbmcpIHx8IHplcm9zKGVuZFN0cmluZykgfHwgemVyb3Moc3RlcFN0cmluZyk7XG4gIGxldCBtYXhMZW4gPSBwYWRkZWQgPyBNYXRoLm1heChzdGFydFN0cmluZy5sZW5ndGgsIGVuZFN0cmluZy5sZW5ndGgsIHN0ZXBTdHJpbmcubGVuZ3RoKSA6IDA7XG4gIGxldCB0b051bWJlciA9IHBhZGRlZCA9PT0gZmFsc2UgJiYgc3RyaW5naWZ5KHN0YXJ0LCBlbmQsIG9wdGlvbnMpID09PSBmYWxzZTtcbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8IHRyYW5zZm9ybSh0b051bWJlcik7XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCAmJiBzdGVwID09PSAxKSB7XG4gICAgcmV0dXJuIHRvUmFuZ2UodG9NYXhMZW4oc3RhcnQsIG1heExlbiksIHRvTWF4TGVuKGVuZCwgbWF4TGVuKSwgdHJ1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcGFydHMgPSB7IG5lZ2F0aXZlczogW10sIHBvc2l0aXZlczogW10gfTtcbiAgbGV0IHB1c2ggPSBudW0gPT4gcGFydHNbbnVtIDwgMCA/ICduZWdhdGl2ZXMnIDogJ3Bvc2l0aXZlcyddLnB1c2goTWF0aC5hYnMobnVtKSk7XG4gIGxldCByYW5nZSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChkZXNjZW5kaW5nID8gYSA+PSBiIDogYSA8PSBiKSB7XG4gICAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSAmJiBzdGVwID4gMSkge1xuICAgICAgcHVzaChhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UucHVzaChwYWQoZm9ybWF0KGEsIGluZGV4KSwgbWF4TGVuLCB0b051bWJlcikpO1xuICAgIH1cbiAgICBhID0gZGVzY2VuZGluZyA/IGEgLSBzdGVwIDogYSArIHN0ZXA7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RlcCA+IDFcbiAgICAgID8gdG9TZXF1ZW5jZShwYXJ0cywgb3B0aW9ucylcbiAgICAgIDogdG9SZWdleChyYW5nZSwgbnVsbCwgeyB3cmFwOiBmYWxzZSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn07XG5cbmNvbnN0IGZpbGxMZXR0ZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCghaXNOdW1iZXIoc3RhcnQpICYmIHN0YXJ0Lmxlbmd0aCA+IDEpIHx8ICghaXNOdW1iZXIoZW5kKSAmJiBlbmQubGVuZ3RoID4gMSkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cblxuICBsZXQgZm9ybWF0ID0gb3B0aW9ucy50cmFuc2Zvcm0gfHwgKHZhbCA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbCkpO1xuICBsZXQgYSA9IGAke3N0YXJ0fWAuY2hhckNvZGVBdCgwKTtcbiAgbGV0IGIgPSBgJHtlbmR9YC5jaGFyQ29kZUF0KDApO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBtaW4gPSBNYXRoLm1pbihhLCBiKTtcbiAgbGV0IG1heCA9IE1hdGgubWF4KGEsIGIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKG1pbiwgbWF4LCBmYWxzZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIHJhbmdlLnB1c2goZm9ybWF0KGEsIGluZGV4KSk7XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIG9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsID0gKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoZW5kID09IG51bGwgJiYgaXNWYWxpZFZhbHVlKHN0YXJ0KSkge1xuICAgIHJldHVybiBbc3RhcnRdO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkVmFsdWUoc3RhcnQpIHx8ICFpc1ZhbGlkVmFsdWUoZW5kKSkge1xuICAgIHJldHVybiBpbnZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAxLCB7IHRyYW5zZm9ybTogc3RlcCB9KTtcbiAgfVxuXG4gIGlmIChpc09iamVjdChzdGVwKSkge1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDAsIHN0ZXApO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgaWYgKG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkgb3B0cy53cmFwID0gdHJ1ZTtcbiAgc3RlcCA9IHN0ZXAgfHwgb3B0cy5zdGVwIHx8IDE7XG5cbiAgaWYgKCFpc051bWJlcihzdGVwKSkge1xuICAgIGlmIChzdGVwICE9IG51bGwgJiYgIWlzT2JqZWN0KHN0ZXApKSByZXR1cm4gaW52YWxpZFN0ZXAoc3RlcCwgb3B0cyk7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgc3RlcCk7XG4gIH1cblxuICBpZiAoaXNOdW1iZXIoc3RhcnQpICYmIGlzTnVtYmVyKGVuZCkpIHtcbiAgICByZXR1cm4gZmlsbE51bWJlcnMoc3RhcnQsIGVuZCwgc3RlcCwgb3B0cyk7XG4gIH1cblxuICByZXR1cm4gZmlsbExldHRlcnMoc3RhcnQsIGVuZCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RlcCksIDEpLCBvcHRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuY29uc3QgY29tcGlsZSA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSB1dGlscy5pc0ludmFsaWRCcmFjZShwYXJlbnQpO1xuICAgIGxldCBpbnZhbGlkTm9kZSA9IG5vZGUuaW52YWxpZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWU7XG4gICAgbGV0IGludmFsaWQgPSBpbnZhbGlkQmxvY2sgPT09IHRydWUgfHwgaW52YWxpZE5vZGUgPT09IHRydWU7XG4gICAgbGV0IHByZWZpeCA9IG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZSA/ICdcXFxcJyA6ICcnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLmlzT3BlbiA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHByZWZpeCArIG5vZGUudmFsdWU7XG4gICAgfVxuICAgIGlmIChub2RlLmlzQ2xvc2UgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgcmV0dXJuIGludmFsaWQgPyAocHJlZml4ICsgbm9kZS52YWx1ZSkgOiAnKCc7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgcmV0dXJuIGludmFsaWQgPyAocHJlZml4ICsgbm9kZS52YWx1ZSkgOiAnKSc7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2NvbW1hJykge1xuICAgICAgcmV0dXJuIG5vZGUucHJldi50eXBlID09PSAnY29tbWEnID8gJycgOiAoaW52YWxpZCA/IG5vZGUudmFsdWUgOiAnfCcpO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuICAgICAgbGV0IHJhbmdlID0gZmlsbCguLi5hcmdzLCB7IC4uLm9wdGlvbnMsIHdyYXA6IGZhbHNlLCB0b1JlZ2V4OiB0cnVlIH0pO1xuXG4gICAgICBpZiAocmFuZ2UubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA+IDEgJiYgcmFuZ2UubGVuZ3RoID4gMSA/IGAoJHtyYW5nZX0pYCA6IHJhbmdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gd2Fsayhhc3QpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21waWxlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZmlsbCA9IHJlcXVpcmUoJ2ZpbGwtcmFuZ2UnKTtcbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuY29uc3QgYXBwZW5kID0gKHF1ZXVlID0gJycsIHN0YXNoID0gJycsIGVuY2xvc2UgPSBmYWxzZSkgPT4ge1xuICBsZXQgcmVzdWx0ID0gW107XG5cbiAgcXVldWUgPSBbXS5jb25jYXQocXVldWUpO1xuICBzdGFzaCA9IFtdLmNvbmNhdChzdGFzaCk7XG5cbiAgaWYgKCFzdGFzaC5sZW5ndGgpIHJldHVybiBxdWV1ZTtcbiAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZW5jbG9zZSA/IHV0aWxzLmZsYXR0ZW4oc3Rhc2gpLm1hcChlbGUgPT4gYHske2VsZX19YCkgOiBzdGFzaDtcbiAgfVxuXG4gIGZvciAobGV0IGl0ZW0gb2YgcXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgZm9yIChsZXQgdmFsdWUgb2YgaXRlbSkge1xuICAgICAgICByZXN1bHQucHVzaChhcHBlbmQodmFsdWUsIHN0YXNoLCBlbmNsb3NlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGVsZSBvZiBzdGFzaCkge1xuICAgICAgICBpZiAoZW5jbG9zZSA9PT0gdHJ1ZSAmJiB0eXBlb2YgZWxlID09PSAnc3RyaW5nJykgZWxlID0gYHske2VsZX19YDtcbiAgICAgICAgcmVzdWx0LnB1c2goQXJyYXkuaXNBcnJheShlbGUpID8gYXBwZW5kKGl0ZW0sIGVsZSwgZW5jbG9zZSkgOiAoaXRlbSArIGVsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdXRpbHMuZmxhdHRlbihyZXN1bHQpO1xufTtcblxuY29uc3QgZXhwYW5kID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCByYW5nZUxpbWl0ID0gb3B0aW9ucy5yYW5nZUxpbWl0ID09PSB2b2lkIDAgPyAxMDAwIDogb3B0aW9ucy5yYW5nZUxpbWl0O1xuXG4gIGxldCB3YWxrID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbm9kZS5xdWV1ZSA9IFtdO1xuXG4gICAgbGV0IHAgPSBwYXJlbnQ7XG4gICAgbGV0IHEgPSBwYXJlbnQucXVldWU7XG5cbiAgICB3aGlsZSAocC50eXBlICE9PSAnYnJhY2UnICYmIHAudHlwZSAhPT0gJ3Jvb3QnICYmIHAucGFyZW50KSB7XG4gICAgICBwID0gcC5wYXJlbnQ7XG4gICAgICBxID0gcC5xdWV1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pbnZhbGlkIHx8IG5vZGUuZG9sbGFyKSB7XG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHN0cmluZ2lmeShub2RlLCBvcHRpb25zKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdicmFjZScgJiYgbm9kZS5pbnZhbGlkICE9PSB0cnVlICYmIG5vZGUubm9kZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIFsne30nXSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscy5yZWR1Y2Uobm9kZS5ub2Rlcyk7XG5cbiAgICAgIGlmICh1dGlscy5leGNlZWRzTGltaXQoLi4uYXJncywgb3B0aW9ucy5zdGVwLCByYW5nZUxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZXhwYW5kZWQgYXJyYXkgbGVuZ3RoIGV4Y2VlZHMgcmFuZ2UgbGltaXQuIFVzZSBvcHRpb25zLnJhbmdlTGltaXQgdG8gaW5jcmVhc2Ugb3IgZGlzYWJsZSB0aGUgbGltaXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgb3B0aW9ucyk7XG4gICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJhbmdlID0gc3RyaW5naWZ5KG5vZGUsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHJhbmdlKSk7XG4gICAgICBub2RlLm5vZGVzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVuY2xvc2UgPSB1dGlscy5lbmNsb3NlQnJhY2Uobm9kZSk7XG4gICAgbGV0IHF1ZXVlID0gbm9kZS5xdWV1ZTtcbiAgICBsZXQgYmxvY2sgPSBub2RlO1xuXG4gICAgd2hpbGUgKGJsb2NrLnR5cGUgIT09ICdicmFjZScgJiYgYmxvY2sudHlwZSAhPT0gJ3Jvb3QnICYmIGJsb2NrLnBhcmVudCkge1xuICAgICAgYmxvY2sgPSBibG9jay5wYXJlbnQ7XG4gICAgICBxdWV1ZSA9IGJsb2NrLnF1ZXVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNoaWxkID0gbm9kZS5ub2Rlc1tpXTtcblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjb21tYScgJiYgbm9kZS50eXBlID09PSAnYnJhY2UnKSB7XG4gICAgICAgIGlmIChpID09PSAxKSBxdWV1ZS5wdXNoKCcnKTtcbiAgICAgICAgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHF1ZXVlLCBlbmNsb3NlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQudmFsdWUgJiYgY2hpbGQudHlwZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goYXBwZW5kKHF1ZXVlLnBvcCgpLCBjaGlsZC52YWx1ZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLm5vZGVzKSB7XG4gICAgICAgIHdhbGsoY2hpbGQsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfTtcblxuICByZXR1cm4gdXRpbHMuZmxhdHRlbih3YWxrKGFzdCkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBhbmQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSDogMTAyNCAqIDY0LFxuXG4gIC8vIERpZ2l0c1xuICBDSEFSXzA6ICcwJywgLyogMCAqL1xuICBDSEFSXzk6ICc5JywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiAnQScsIC8qIEEgKi9cbiAgQ0hBUl9MT1dFUkNBU0VfQTogJ2EnLCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6ICdaJywgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAneicsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6ICcoJywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiAnKScsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiAnKicsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6ICcmJywgLyogJiAqL1xuICBDSEFSX0FUOiAnQCcsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLU0xBU0g6ICdcXFxcJywgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSzogJ2AnLCAvKiBgICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAnXFxyJywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6ICdeJywgLyogXiAqL1xuICBDSEFSX0NPTE9OOiAnOicsIC8qIDogKi9cbiAgQ0hBUl9DT01NQTogJywnLCAvKiAsICovXG4gIENIQVJfRE9MTEFSOiAnJCcsIC8qIC4gKi9cbiAgQ0hBUl9ET1Q6ICcuJywgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogJ1wiJywgLyogXCIgKi9cbiAgQ0hBUl9FUVVBTDogJz0nLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogJyEnLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAnXFxmJywgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogJy8nLCAvKiAvICovXG4gIENIQVJfSEFTSDogJyMnLCAvKiAjICovXG4gIENIQVJfSFlQSEVOX01JTlVTOiAnLScsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6ICc8JywgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6ICd7JywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6ICdbJywgLyogWyAqL1xuICBDSEFSX0xJTkVfRkVFRDogJ1xcbicsIC8qIFxcbiAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFOiAnXFx1MDBBMCcsIC8qIFxcdTAwQTAgKi9cbiAgQ0hBUl9QRVJDRU5UOiAnJScsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiAnKycsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiAnPycsIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9BTkdMRV9CUkFDS0VUOiAnPicsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogJ30nLCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6ICddJywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogJzsnLCAvKiA7ICovXG4gIENIQVJfU0lOR0xFX1FVT1RFOiAnXFwnJywgLyogJyAqL1xuICBDSEFSX1NQQUNFOiAnICcsIC8qICAgKi9cbiAgQ0hBUl9UQUI6ICdcXHQnLCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiAnXycsIC8qIF8gKi9cbiAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAnfCcsIC8qIHwgKi9cbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6ICdcXHVGRUZGJyAvKiBcXHVGRUZGICovXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCB7XG4gIE1BWF9MRU5HVEgsXG4gIENIQVJfQkFDS1NMQVNILCAvKiBcXCAqL1xuICBDSEFSX0JBQ0tUSUNLLCAvKiBgICovXG4gIENIQVJfQ09NTUEsIC8qICwgKi9cbiAgQ0hBUl9ET1QsIC8qIC4gKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsIC8qICkgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFLCAvKiB7ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UsIC8qIH0gKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VULCAvKiBbICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQsIC8qIF0gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEUsIC8qIFwiICovXG4gIENIQVJfU0lOR0xFX1FVT1RFLCAvKiAnICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0UsXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuLyoqXG4gKiBwYXJzZVxuICovXG5cbmNvbnN0IHBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG4gIGlmIChpbnB1dC5sZW5ndGggPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aCAoJHtpbnB1dC5sZW5ndGh9KSwgZXhjZWVkcyBtYXggY2hhcmFjdGVycyAoJHttYXh9KWApO1xuICB9XG5cbiAgbGV0IGFzdCA9IHsgdHlwZTogJ3Jvb3QnLCBpbnB1dCwgbm9kZXM6IFtdIH07XG4gIGxldCBzdGFjayA9IFthc3RdO1xuICBsZXQgYmxvY2sgPSBhc3Q7XG4gIGxldCBwcmV2ID0gYXN0O1xuICBsZXQgYnJhY2tldHMgPSAwO1xuICBsZXQgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgdmFsdWU7XG4gIGxldCBtZW1vID0ge307XG5cbiAgLyoqXG4gICAqIEhlbHBlcnNcbiAgICovXG5cbiAgY29uc3QgYWR2YW5jZSA9ICgpID0+IGlucHV0W2luZGV4KytdO1xuICBjb25zdCBwdXNoID0gbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIHByZXYudHlwZSA9ICd0ZXh0JztcbiAgICB9XG5cbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiBub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcHJldi52YWx1ZSArPSBub2RlLnZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGJsb2NrLm5vZGVzLnB1c2gobm9kZSk7XG4gICAgbm9kZS5wYXJlbnQgPSBibG9jaztcbiAgICBub2RlLnByZXYgPSBwcmV2O1xuICAgIHByZXYgPSBub2RlO1xuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHB1c2goeyB0eXBlOiAnYm9zJyB9KTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuXG4gICAgLyoqXG4gICAgICogSW52YWxpZCBjaGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRSB8fCB2YWx1ZSA9PT0gQ0hBUl9OT19CUkVBS19TUEFDRSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IChvcHRpb25zLmtlZXBFc2NhcGluZyA/IHZhbHVlIDogJycpICsgYWR2YW5jZSgpIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmlnaHQgc3F1YXJlIGJyYWNrZXQgKGxpdGVyYWwpOiAnXSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6ICdcXFxcJyArIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVmdCBzcXVhcmUgYnJhY2tldDogJ1snXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgYnJhY2tldHMrKztcblxuICAgICAgbGV0IGNsb3NlZCA9IHRydWU7XG4gICAgICBsZXQgbmV4dDtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICB2YWx1ZSArPSBuZXh0O1xuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBicmFja2V0cysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBicmFja2V0cy0tO1xuXG4gICAgICAgICAgaWYgKGJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJlbnRoZXNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGJsb2NrID0gcHVzaCh7IHR5cGU6ICdwYXJlbicsIG5vZGVzOiBbXSB9KTtcbiAgICAgIHN0YWNrLnB1c2goYmxvY2spO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGlmIChibG9jay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdW90ZXM6ICd8XCJ8YFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0RPVUJMRV9RVU9URSB8fCB2YWx1ZSA9PT0gQ0hBUl9TSU5HTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfQkFDS1RJQ0spIHtcbiAgICAgIGxldCBvcGVuID0gdmFsdWU7XG4gICAgICBsZXQgbmV4dDtcblxuICAgICAgaWYgKG9wdGlvbnMua2VlcFF1b3RlcyAhPT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IG5leHQgKyBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gb3Blbikge1xuICAgICAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgPT09IHRydWUpIHZhbHVlICs9IG5leHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBuZXh0O1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgY3VybHkgYnJhY2U6ICd7J1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGRlcHRoKys7XG5cbiAgICAgIGxldCBkb2xsYXIgPSBwcmV2LnZhbHVlICYmIHByZXYudmFsdWUuc2xpY2UoLTEpID09PSAnJCcgfHwgYmxvY2suZG9sbGFyID09PSB0cnVlO1xuICAgICAgbGV0IGJyYWNlID0ge1xuICAgICAgICB0eXBlOiAnYnJhY2UnLFxuICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICBjbG9zZTogZmFsc2UsXG4gICAgICAgIGRvbGxhcixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGNvbW1hczogMCxcbiAgICAgICAgcmFuZ2VzOiAwLFxuICAgICAgICBub2RlczogW11cbiAgICAgIH07XG5cbiAgICAgIGJsb2NrID0gcHVzaChicmFjZSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAnb3BlbicsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmlnaHQgY3VybHkgYnJhY2U6ICd9J1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCB0eXBlID0gJ2Nsb3NlJztcbiAgICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG4gICAgICBibG9jay5jbG9zZSA9IHRydWU7XG5cbiAgICAgIHB1c2goeyB0eXBlLCB2YWx1ZSB9KTtcbiAgICAgIGRlcHRoLS07XG5cbiAgICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21tYTogJywnXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfQ09NTUEgJiYgZGVwdGggPiAwKSB7XG4gICAgICBpZiAoYmxvY2sucmFuZ2VzID4gMCkge1xuICAgICAgICBibG9jay5yYW5nZXMgPSAwO1xuICAgICAgICBsZXQgb3BlbiA9IGJsb2NrLm5vZGVzLnNoaWZ0KCk7XG4gICAgICAgIGJsb2NrLm5vZGVzID0gW29wZW4sIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogc3RyaW5naWZ5KGJsb2NrKSB9XTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdjb21tYScsIHZhbHVlIH0pO1xuICAgICAgYmxvY2suY29tbWFzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3Q6ICcuJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0RPVCAmJiBkZXB0aCA+IDAgJiYgYmxvY2suY29tbWFzID09PSAwKSB7XG4gICAgICBsZXQgc2libGluZ3MgPSBibG9jay5ub2RlcztcblxuICAgICAgaWYgKGRlcHRoID09PSAwIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIGJsb2NrLnJhbmdlID0gW107XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudHlwZSA9ICdyYW5nZSc7XG5cbiAgICAgICAgaWYgKGJsb2NrLm5vZGVzLmxlbmd0aCAhPT0gMyAmJiBibG9jay5ub2Rlcy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBibG9jay5yYW5nZXMgPSAwO1xuICAgICAgICAgIHByZXYudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJsb2NrLnJhbmdlcysrO1xuICAgICAgICBibG9jay5hcmdzID0gW107XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIHNpYmxpbmdzLnBvcCgpO1xuXG4gICAgICAgIGxldCBiZWZvcmUgPSBzaWJsaW5nc1tzaWJsaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgYmVmb3JlLnZhbHVlICs9IHByZXYudmFsdWUgKyB2YWx1ZTtcbiAgICAgICAgcHJldiA9IGJlZm9yZTtcbiAgICAgICAgYmxvY2sucmFuZ2VzLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2RvdCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGV4dFxuICAgICAqL1xuXG4gICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gIH1cblxuICAvLyBNYXJrIGltYmFsYW5jZWQgYnJhY2VzIGFuZCBicmFja2V0cyBhcyBpbnZhbGlkXG4gIGRvIHtcbiAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGJsb2NrLnR5cGUgIT09ICdyb290Jykge1xuICAgICAgYmxvY2subm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYgKCFub2RlLm5vZGVzKSB7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSBub2RlLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykgbm9kZS5pc0Nsb3NlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUubm9kZXMpIG5vZGUudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYmxvY2sgb24gcGFyZW50Lm5vZGVzIChibG9jaydzIHNpYmxpbmdzKVxuICAgICAgbGV0IHBhcmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IGluZGV4ID0gcGFyZW50Lm5vZGVzLmluZGV4T2YoYmxvY2spO1xuICAgICAgLy8gcmVwbGFjZSB0aGUgKGludmFsaWQpIGJsb2NrIHdpdGggaXQncyBub2Rlc1xuICAgICAgcGFyZW50Lm5vZGVzLnNwbGljZShpbmRleCwgMSwgLi4uYmxvY2subm9kZXMpO1xuICAgIH1cbiAgfSB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCk7XG5cbiAgcHVzaCh7IHR5cGU6ICdlb3MnIH0pO1xuICByZXR1cm4gYXN0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vbGliL3N0cmluZ2lmeScpO1xuY29uc3QgY29tcGlsZSA9IHJlcXVpcmUoJy4vbGliL2NvbXBpbGUnKTtcbmNvbnN0IGV4cGFuZCA9IHJlcXVpcmUoJy4vbGliL2V4cGFuZCcpO1xuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL2xpYi9wYXJzZScpO1xuXG4vKipcbiAqIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0dGVybiBvciBjcmVhdGUgYSByZWdleC1jb21wYXRpYmxlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ3thLGIsY30nLCB7IGNvbXBpbGU6IHRydWUgfSkpOyAvLz0+IFsnKGF8YnxjKSddXG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ3thLGIsY30nKSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBicmFjZXMgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgb3V0cHV0ID0gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgZm9yIChsZXQgcGF0dGVybiBvZiBpbnB1dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IGJyYWNlcy5jcmVhdGUocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBbXS5jb25jYXQoYnJhY2VzLmNyZWF0ZShpbnB1dCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5leHBhbmQgPT09IHRydWUgJiYgb3B0aW9ucy5ub2R1cGVzID09PSB0cnVlKSB7XG4gICAgb3V0cHV0ID0gWy4uLm5ldyBTZXQob3V0cHV0KV07XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gYnJhY2VzLnBhcnNlKHBhdHRlcm4sIFssIG9wdGlvbnNdKTtcbiAqIGNvbnN0IGFzdCA9IGJyYWNlcy5wYXJzZSgnYS97YixjfS9kJyk7XG4gKiBjb25zb2xlLmxvZyhhc3QpO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBCcmFjZSBwYXR0ZXJuIHRvIHBhcnNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIEFTVFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMucGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4gcGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBicmFjZXMgc3RyaW5nIGZyb20gYW4gQVNULCBvciBhbiBBU1Qgbm9kZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBsZXQgYXN0ID0gYnJhY2VzLnBhcnNlKCdmb28ve2EsYn0vYmFyJyk7XG4gKiBjb25zb2xlLmxvZyhzdHJpbmdpZnkoYXN0Lm5vZGVzWzJdKSk7IC8vPT4gJ3thLGJ9J1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBCcmFjZSBwYXR0ZXJuIG9yIEFTVC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnN0cmluZ2lmeSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZ5KGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZXMgYSBicmFjZSBwYXR0ZXJuIGludG8gYSByZWdleC1jb21wYXRpYmxlLCBvcHRpbWl6ZWQgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIGJ5IGRlZmF1bHQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmNvbXBpbGUoJ2Eve2IsY30vZCcpKTtcbiAqIC8vPT4gWydhLyhifGMpL2QnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBCcmFjZSBwYXR0ZXJuIG9yIEFTVC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNvbXBpbGUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gY29tcGlsZShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBicmFjZSBwYXR0ZXJuIGludG8gYW4gYXJyYXkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGVcbiAqIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24gd2hlbiBgb3B0aW9ucy5leHBhbmRgIGlzIHRydWUuIEJlZm9yZVxuICogdXNpbmcgdGhpcyBtZXRob2QgaXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSByZWFkIHRoZSBbcGVyZm9ybWFuY2Ugbm90ZXNdKCNwZXJmb3JtYW5jZSkpXG4gKiBhbmQgYWR2YW50YWdlcyBvZiB1c2luZyBbLmNvbXBpbGVdKCNjb21waWxlKSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5leHBhbmQoJ2Eve2IsY30vZCcpKTtcbiAqIC8vPT4gWydhL2IvZCcsICdhL2MvZCddO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmV4cGFuZCA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaW5wdXQgPSBicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IGV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG5cbiAgLy8gZmlsdGVyIG91dCBlbXB0eSBzdHJpbmdzIGlmIHNwZWNpZmllZFxuICBpZiAob3B0aW9ucy5ub2VtcHR5ID09PSB0cnVlKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlcyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IFsuLi5uZXcgU2V0KHJlc3VsdCldO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUHJvY2Vzc2VzIGEgYnJhY2UgcGF0dGVybiBhbmQgcmV0dXJucyBlaXRoZXIgYW4gZXhwYW5kZWQgYXJyYXlcbiAqIChpZiBgb3B0aW9ucy5leHBhbmRgIGlzIHRydWUpLCBhIGhpZ2hseSBvcHRpbWl6ZWQgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmNyZWF0ZSgndXNlci17MjAwLi4zMDB9L3Byb2plY3Qte2EsYixjfS17MS4uMTB9JykpXG4gKiAvLz0+ICd1c2VyLSgyMFswLTldfDJbMS05XVswLTldfDMwMCkvcHJvamVjdC0oYXxifGMpLShbMS05XXwxMCknXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQnJhY2UgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuY3JlYXRlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGlucHV0ID09PSAnJyB8fCBpbnB1dC5sZW5ndGggPCAzKSB7XG4gICAgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuIHJldHVybiBvcHRpb25zLmV4cGFuZCAhPT0gdHJ1ZVxuICAgID8gYnJhY2VzLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpXG4gICAgOiBicmFjZXMuZXhwYW5kKGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwb3NlIFwiYnJhY2VzXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJyYWNlcztcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBXSU5fU0xBU0ggPSAnXFxcXFxcXFwvJztcbmNvbnN0IFdJTl9OT19TTEFTSCA9IGBbXiR7V0lOX1NMQVNIfV1gO1xuXG4vKipcbiAqIFBvc2l4IGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBET1RfTElURVJBTCA9ICdcXFxcLic7XG5jb25zdCBQTFVTX0xJVEVSQUwgPSAnXFxcXCsnO1xuY29uc3QgUU1BUktfTElURVJBTCA9ICdcXFxcPyc7XG5jb25zdCBTTEFTSF9MSVRFUkFMID0gJ1xcXFwvJztcbmNvbnN0IE9ORV9DSEFSID0gJyg/PS4pJztcbmNvbnN0IFFNQVJLID0gJ1teL10nO1xuY29uc3QgRU5EX0FOQ0hPUiA9IGAoPzoke1NMQVNIX0xJVEVSQUx9fCQpYDtcbmNvbnN0IFNUQVJUX0FOQ0hPUiA9IGAoPzpefCR7U0xBU0hfTElURVJBTH0pYDtcbmNvbnN0IERPVFNfU0xBU0ggPSBgJHtET1RfTElURVJBTH17MSwyfSR7RU5EX0FOQ0hPUn1gO1xuY29uc3QgTk9fRE9UID0gYCg/ISR7RE9UX0xJVEVSQUx9KWA7XG5jb25zdCBOT19ET1RTID0gYCg/ISR7U1RBUlRfQU5DSE9SfSR7RE9UU19TTEFTSH0pYDtcbmNvbnN0IE5PX0RPVF9TTEFTSCA9IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9JHtFTkRfQU5DSE9SfSlgO1xuY29uc3QgTk9fRE9UU19TTEFTSCA9IGAoPyEke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBRTUFSS19OT19ET1QgPSBgW14uJHtTTEFTSF9MSVRFUkFMfV1gO1xuY29uc3QgU1RBUiA9IGAke1FNQVJLfSo/YDtcblxuY29uc3QgUE9TSVhfQ0hBUlMgPSB7XG4gIERPVF9MSVRFUkFMLFxuICBQTFVTX0xJVEVSQUwsXG4gIFFNQVJLX0xJVEVSQUwsXG4gIFNMQVNIX0xJVEVSQUwsXG4gIE9ORV9DSEFSLFxuICBRTUFSSyxcbiAgRU5EX0FOQ0hPUixcbiAgRE9UU19TTEFTSCxcbiAgTk9fRE9ULFxuICBOT19ET1RTLFxuICBOT19ET1RfU0xBU0gsXG4gIE5PX0RPVFNfU0xBU0gsXG4gIFFNQVJLX05PX0RPVCxcbiAgU1RBUixcbiAgU1RBUlRfQU5DSE9SXG59O1xuXG4vKipcbiAqIFdpbmRvd3MgZ2xvYiByZWdleFxuICovXG5cbmNvbnN0IFdJTkRPV1NfQ0hBUlMgPSB7XG4gIC4uLlBPU0lYX0NIQVJTLFxuXG4gIFNMQVNIX0xJVEVSQUw6IGBbJHtXSU5fU0xBU0h9XWAsXG4gIFFNQVJLOiBXSU5fTk9fU0xBU0gsXG4gIFNUQVI6IGAke1dJTl9OT19TTEFTSH0qP2AsXG4gIERPVFNfU0xBU0g6IGAke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JClgLFxuICBOT19ET1Q6IGAoPyEke0RPVF9MSVRFUkFMfSlgLFxuICBOT19ET1RTOiBgKD8hKD86XnxbJHtXSU5fU0xBU0h9XSkke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgTk9fRE9UX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MCwxfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVFNfU0xBU0g6IGAoPyEke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgUU1BUktfTk9fRE9UOiBgW14uJHtXSU5fU0xBU0h9XWAsXG4gIFNUQVJUX0FOQ0hPUjogYCg/Ol58WyR7V0lOX1NMQVNIfV0pYCxcbiAgRU5EX0FOQ0hPUjogYCg/Olske1dJTl9TTEFTSH1dfCQpYFxufTtcblxuLyoqXG4gKiBQT1NJWCBCcmFja2V0IFJlZ2V4XG4gKi9cblxuY29uc3QgUE9TSVhfUkVHRVhfU09VUkNFID0ge1xuICBhbG51bTogJ2EtekEtWjAtOScsXG4gIGFscGhhOiAnYS16QS1aJyxcbiAgYXNjaWk6ICdcXFxceDAwLVxcXFx4N0YnLFxuICBibGFuazogJyBcXFxcdCcsXG4gIGNudHJsOiAnXFxcXHgwMC1cXFxceDFGXFxcXHg3RicsXG4gIGRpZ2l0OiAnMC05JyxcbiAgZ3JhcGg6ICdcXFxceDIxLVxcXFx4N0UnLFxuICBsb3dlcjogJ2EteicsXG4gIHByaW50OiAnXFxcXHgyMC1cXFxceDdFICcsXG4gIHB1bmN0OiAnXFxcXC0hXCIjJCUmXFwnKClcXFxcKissLi86Ozw9Pj9AW1xcXFxdXl9ge3x9ficsXG4gIHNwYWNlOiAnIFxcXFx0XFxcXHJcXFxcblxcXFx2XFxcXGYnLFxuICB1cHBlcjogJ0EtWicsXG4gIHdvcmQ6ICdBLVphLXowLTlfJyxcbiAgeGRpZ2l0OiAnQS1GYS1mMC05J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuXG4gIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgUkVHRVhfQkFDS1NMQVNIOiAvXFxcXCg/IVsqKz9eJHt9KHwpW1xcXV0pL2csXG4gIFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTOiAvXlteQCFbXFxdLiwkKis/Xnt9KCl8XFxcXC9dKy8sXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlM6IC9bLSorPy5eJHt9KHwpW1xcXV0vLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUY6IC8oXFxcXD8pKChcXFcpKFxcMyopKS9nLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTDogLyhbLSorPy5eJHt9KHwpW1xcXV0pL2csXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0g6IC8oPzpcXFsuKj9bXlxcXFxdXFxdfFxcXFwoPz0uKSkvZyxcblxuICAvLyBSZXBsYWNlIGdsb2JzIHdpdGggZXF1aXZhbGVudCBwYXR0ZXJucyB0byByZWR1Y2UgcGFyc2luZyB0aW1lLlxuICBSRVBMQUNFTUVOVFM6IHtcbiAgICAnKioqJzogJyonLFxuICAgICcqKi8qKic6ICcqKicsXG4gICAgJyoqLyoqLyoqJzogJyoqJ1xuICB9LFxuXG4gIC8vIERpZ2l0c1xuICBDSEFSXzA6IDQ4LCAvKiAwICovXG4gIENIQVJfOTogNTcsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogNjUsIC8qIEEgKi9cbiAgQ0hBUl9MT1dFUkNBU0VfQTogOTcsIC8qIGEgKi9cbiAgQ0hBUl9VUFBFUkNBU0VfWjogOTAsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogMTIyLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiA0MCwgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiA0MSwgLyogKSAqL1xuXG4gIENIQVJfQVNURVJJU0s6IDQyLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAzOCwgLyogJiAqL1xuICBDSEFSX0FUOiA2NCwgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNIOiA5MiwgLyogXFwgKi9cbiAgQ0hBUl9DQVJSSUFHRV9SRVRVUk46IDEzLCAvKiBcXHIgKi9cbiAgQ0hBUl9DSVJDVU1GTEVYX0FDQ0VOVDogOTQsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogNTgsIC8qIDogKi9cbiAgQ0hBUl9DT01NQTogNDQsIC8qICwgKi9cbiAgQ0hBUl9ET1Q6IDQ2LCAvKiAuICovXG4gIENIQVJfRE9VQkxFX1FVT1RFOiAzNCwgLyogXCIgKi9cbiAgQ0hBUl9FUVVBTDogNjEsIC8qID0gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLOiAzMywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogMTIsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6IDQ3LCAvKiAvICovXG4gIENIQVJfR1JBVkVfQUNDRU5UOiA5NiwgLyogYCAqL1xuICBDSEFSX0hBU0g6IDM1LCAvKiAjICovXG4gIENIQVJfSFlQSEVOX01JTlVTOiA0NSwgLyogLSAqL1xuICBDSEFSX0xFRlRfQU5HTEVfQlJBQ0tFVDogNjAsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAxMjMsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiA5MSwgLyogWyAqL1xuICBDSEFSX0xJTkVfRkVFRDogMTAsIC8qIFxcbiAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFOiAxNjAsIC8qIFxcdTAwQTAgKi9cbiAgQ0hBUl9QRVJDRU5UOiAzNywgLyogJSAqL1xuICBDSEFSX1BMVVM6IDQzLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogNjMsIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9BTkdMRV9CUkFDS0VUOiA2MiwgLyogPiAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFOiAxMjUsIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVDogOTMsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046IDU5LCAvKiA7ICovXG4gIENIQVJfU0lOR0xFX1FVT1RFOiAzOSwgLyogJyAqL1xuICBDSEFSX1NQQUNFOiAzMiwgLyogICAqL1xuICBDSEFSX1RBQjogOSwgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogOTUsIC8qIF8gKi9cbiAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAxMjQsIC8qIHwgKi9cbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6IDY1Mjc5LCAvKiBcXHVGRUZGICovXG5cbiAgU0VQOiBwYXRoLnNlcCxcblxuICAvKipcbiAgICogQ3JlYXRlIEVYVEdMT0JfQ0hBUlNcbiAgICovXG5cbiAgZXh0Z2xvYkNoYXJzKGNoYXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICchJzogeyB0eXBlOiAnbmVnYXRlJywgb3BlbjogJyg/Oig/ISg/OicsIGNsb3NlOiBgKSkke2NoYXJzLlNUQVJ9KWAgfSxcbiAgICAgICc/JzogeyB0eXBlOiAncW1hcmsnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpPycgfSxcbiAgICAgICcrJzogeyB0eXBlOiAncGx1cycsIG9wZW46ICcoPzonLCBjbG9zZTogJykrJyB9LFxuICAgICAgJyonOiB7IHR5cGU6ICdzdGFyJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKSonIH0sXG4gICAgICAnQCc6IHsgdHlwZTogJ2F0Jywgb3BlbjogJyg/OicsIGNsb3NlOiAnKScgfVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGdsb2JDaGFycyh3aW4zMikge1xuICAgIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSA/IFdJTkRPV1NfQ0hBUlMgOiBQT1NJWF9DSEFSUztcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB3aW4zMiA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5jb25zdCB7XG4gIFJFR0VYX0JBQ0tTTEFTSCxcbiAgUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSCxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5leHBvcnRzLmlzT2JqZWN0ID0gdmFsID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuZXhwb3J0cy5oYXNSZWdleENoYXJzID0gc3RyID0+IFJFR0VYX1NQRUNJQUxfQ0hBUlMudGVzdChzdHIpO1xuZXhwb3J0cy5pc1JlZ2V4Q2hhciA9IHN0ciA9PiBzdHIubGVuZ3RoID09PSAxICYmIGV4cG9ydHMuaGFzUmVnZXhDaGFycyhzdHIpO1xuZXhwb3J0cy5lc2NhcGVSZWdleCA9IHN0ciA9PiBzdHIucmVwbGFjZShSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTCwgJ1xcXFwkMScpO1xuZXhwb3J0cy50b1Bvc2l4U2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZShSRUdFWF9CQUNLU0xBU0gsICcvJyk7XG5cbmV4cG9ydHMucmVtb3ZlQmFja3NsYXNoZXMgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSCwgbWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaCA9PT0gJ1xcXFwnID8gJycgOiBtYXRjaDtcbiAgfSk7XG59O1xuXG5leHBvcnRzLnN1cHBvcnRzTG9va2JlaGluZHMgPSAoKSA9PiB7XG4gIGNvbnN0IHNlZ3MgPSBwcm9jZXNzLnZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgaWYgKHNlZ3MubGVuZ3RoID09PSAzICYmIHNlZ3NbMF0gPj0gOSB8fCAoc2Vnc1swXSA9PT0gOCAmJiBzZWdzWzFdID49IDEwKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydHMuaXNXaW5kb3dzID0gb3B0aW9ucyA9PiB7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLndpbmRvd3MgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBvcHRpb25zLndpbmRvd3M7XG4gIH1cbiAgcmV0dXJuIHdpbjMyID09PSB0cnVlIHx8IHBhdGguc2VwID09PSAnXFxcXCc7XG59O1xuXG5leHBvcnRzLmVzY2FwZUxhc3QgPSAoaW5wdXQsIGNoYXIsIGxhc3RJZHgpID0+IHtcbiAgY29uc3QgaWR4ID0gaW5wdXQubGFzdEluZGV4T2YoY2hhciwgbGFzdElkeCk7XG4gIGlmIChpZHggPT09IC0xKSByZXR1cm4gaW5wdXQ7XG4gIGlmIChpbnB1dFtpZHggLSAxXSA9PT0gJ1xcXFwnKSByZXR1cm4gZXhwb3J0cy5lc2NhcGVMYXN0KGlucHV0LCBjaGFyLCBpZHggLSAxKTtcbiAgcmV0dXJuIGAke2lucHV0LnNsaWNlKDAsIGlkeCl9XFxcXCR7aW5wdXQuc2xpY2UoaWR4KX1gO1xufTtcblxuZXhwb3J0cy5yZW1vdmVQcmVmaXggPSAoaW5wdXQsIHN0YXRlID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IGlucHV0O1xuICBpZiAob3V0cHV0LnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMik7XG4gICAgc3RhdGUucHJlZml4ID0gJy4vJztcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuZXhwb3J0cy53cmFwT3V0cHV0ID0gKGlucHV0LCBzdGF0ZSA9IHt9LCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgcHJlcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICdeJztcbiAgY29uc3QgYXBwZW5kID0gb3B0aW9ucy5jb250YWlucyA/ICcnIDogJyQnO1xuXG4gIGxldCBvdXRwdXQgPSBgJHtwcmVwZW5kfSg/OiR7aW5wdXR9KSR7YXBwZW5kfWA7XG4gIGlmIChzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7XG4gICAgb3V0cHV0ID0gYCg/Ol4oPyEke291dHB1dH0pLiokKWA7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IHtcbiAgQ0hBUl9BU1RFUklTSywgICAgICAgICAgICAgLyogKiAqL1xuICBDSEFSX0FULCAgICAgICAgICAgICAgICAgICAvKiBAICovXG4gIENIQVJfQkFDS1dBUkRfU0xBU0gsICAgICAgIC8qIFxcICovXG4gIENIQVJfQ09NTUEsICAgICAgICAgICAgICAgIC8qICwgKi9cbiAgQ0hBUl9ET1QsICAgICAgICAgICAgICAgICAgLyogLiAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUkssICAgICAvKiAhICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSCwgICAgICAgIC8qIC8gKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFLCAgICAgLyogeyAqL1xuICBDSEFSX0xFRlRfUEFSRU5USEVTRVMsICAgICAvKiAoICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgIC8qIFsgKi9cbiAgQ0hBUl9QTFVTLCAgICAgICAgICAgICAgICAgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUkssICAgICAgICAvKiA/ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UsICAgIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUywgICAgLyogKSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICAvKiBdICovXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3QgaXNQYXRoU2VwYXJhdG9yID0gY29kZSA9PiB7XG4gIHJldHVybiBjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0ggfHwgY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSDtcbn07XG5cbmNvbnN0IGRlcHRoID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4uaXNQcmVmaXggIT09IHRydWUpIHtcbiAgICB0b2tlbi5kZXB0aCA9IHRva2VuLmlzR2xvYnN0YXIgPyBJbmZpbml0eSA6IDE7XG4gIH1cbn07XG5cbi8qKlxuICogUXVpY2tseSBzY2FucyBhIGdsb2IgcGF0dGVybiBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGhhbmRmdWwgb2ZcbiAqIHVzZWZ1bCBwcm9wZXJ0aWVzLCBsaWtlIGBpc0dsb2JgLCBgcGF0aGAgKHRoZSBsZWFkaW5nIG5vbi1nbG9iLCBpZiBpdCBleGlzdHMpLFxuICogYGdsb2JgICh0aGUgYWN0dWFsIHBhdHRlcm4pLCBgbmVnYXRlZGAgKHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYCFgIGJ1dCBub3RcbiAqIHdpdGggYCEoYCkgYW5kIGBuZWdhdGVkRXh0Z2xvYmAgKHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYCEoYCkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBtID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zb2xlLmxvZyhwbS5zY2FuKCdmb28vYmFyLyouanMnKSk7XG4gKiB7IGlzR2xvYjogdHJ1ZSwgaW5wdXQ6ICdmb28vYmFyLyouanMnLCBiYXNlOiAnZm9vL2JhcicsIGdsb2I6ICcqLmpzJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRva2VucyBhbmQgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3Qgc2NhbiA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSAxO1xuICBjb25zdCBzY2FuVG9FbmQgPSBvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMuc2NhblRvRW5kID09PSB0cnVlO1xuICBjb25zdCBzbGFzaGVzID0gW107XG4gIGNvbnN0IHRva2VucyA9IFtdO1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gIGxldCBzdHIgPSBpbnB1dDtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgaXNCcmFjZSA9IGZhbHNlO1xuICBsZXQgaXNCcmFja2V0ID0gZmFsc2U7XG4gIGxldCBpc0dsb2IgPSBmYWxzZTtcbiAgbGV0IGlzRXh0Z2xvYiA9IGZhbHNlO1xuICBsZXQgaXNHbG9ic3RhciA9IGZhbHNlO1xuICBsZXQgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZCA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZEV4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGxldCBicmFjZXMgPSAwO1xuICBsZXQgcHJldjtcbiAgbGV0IGNvZGU7XG4gIGxldCB0b2tlbiA9IHsgdmFsdWU6ICcnLCBkZXB0aDogMCwgaXNHbG9iOiBmYWxzZSB9O1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IGluZGV4ID49IGxlbmd0aDtcbiAgY29uc3QgcGVlayA9ICgpID0+IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiB7XG4gICAgcHJldiA9IGNvZGU7XG4gICAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgpO1xuICB9O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgbGV0IG5leHQ7XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICBjb2RlID0gYWR2YW5jZSgpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgIGJyYWNlRXNjYXBlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYnJhY2VFc2NhcGVkID09PSB0cnVlIHx8IGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgYnJhY2VzKys7XG5cbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRE9UICYmIChjb2RlID0gYWR2YW5jZSgpKSA9PT0gQ0hBUl9ET1QpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChicmFjZUVzY2FwZWQgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9DT01NQSkge1xuICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgICBicmFjZXMtLTtcblxuICAgICAgICAgIGlmIChicmFjZXMgPT09IDApIHtcbiAgICAgICAgICAgIGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHtcbiAgICAgIHNsYXNoZXMucHVzaChpbmRleCk7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB0b2tlbiA9IHsgdmFsdWU6ICcnLCBkZXB0aDogMCwgaXNHbG9iOiBmYWxzZSB9O1xuXG4gICAgICBpZiAoZmluaXNoZWQgPT09IHRydWUpIGNvbnRpbnVlO1xuICAgICAgaWYgKHByZXYgPT09IENIQVJfRE9UICYmIGluZGV4ID09PSAoc3RhcnQgKyAxKSkge1xuICAgICAgICBzdGFydCArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9leHQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYkNoYXIgPSBjb2RlID09PSBDSEFSX1BMVVNcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BVFxuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0FTVEVSSVNLXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUks7XG5cbiAgICAgIGlmIChpc0V4dGdsb2JDaGFyID09PSB0cnVlICYmIHBlZWsoKSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgIGlzRXh0Z2xvYiA9IHRva2VuLmlzRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHtcbiAgICAgICAgICBuZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9BU1RFUklTSykge1xuICAgICAgaWYgKHByZXYgPT09IENIQVJfQVNURVJJU0spIGlzR2xvYnN0YXIgPSB0b2tlbi5pc0dsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9RVUVTVElPTl9NQVJLKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgaXNCcmFja2V0ID0gdG9rZW4uaXNCcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICBuZWdhdGVkID0gdG9rZW4ubmVnYXRlZCA9IHRydWU7XG4gICAgICBzdGFydCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9wYXJlbiAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaXNHbG9iID09PSB0cnVlKSB7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLm5vZXh0ID09PSB0cnVlKSB7XG4gICAgaXNFeHRnbG9iID0gZmFsc2U7XG4gICAgaXNHbG9iID0gZmFsc2U7XG4gIH1cblxuICBsZXQgYmFzZSA9IHN0cjtcbiAgbGV0IHByZWZpeCA9ICcnO1xuICBsZXQgZ2xvYiA9ICcnO1xuXG4gIGlmIChzdGFydCA+IDApIHtcbiAgICBwcmVmaXggPSBzdHIuc2xpY2UoMCwgc3RhcnQpO1xuICAgIHN0ciA9IHN0ci5zbGljZShzdGFydCk7XG4gICAgbGFzdEluZGV4IC09IHN0YXJ0O1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgaXNHbG9iID09PSB0cnVlICYmIGxhc3RJbmRleCA+IDApIHtcbiAgICBiYXNlID0gc3RyLnNsaWNlKDAsIGxhc3RJbmRleCk7XG4gICAgZ2xvYiA9IHN0ci5zbGljZShsYXN0SW5kZXgpO1xuICB9IGVsc2UgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgIGJhc2UgPSAnJztcbiAgICBnbG9iID0gc3RyO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBzdHI7XG4gIH1cblxuICBpZiAoYmFzZSAmJiBiYXNlICE9PSAnJyAmJiBiYXNlICE9PSAnLycgJiYgYmFzZSAhPT0gc3RyKSB7XG4gICAgaWYgKGlzUGF0aFNlcGFyYXRvcihiYXNlLmNoYXJDb2RlQXQoYmFzZS5sZW5ndGggLSAxKSkpIHtcbiAgICAgIGJhc2UgPSBiYXNlLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChnbG9iKSBnbG9iID0gdXRpbHMucmVtb3ZlQmFja3NsYXNoZXMoZ2xvYik7XG5cbiAgICBpZiAoYmFzZSAmJiBiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkge1xuICAgICAgYmFzZSA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGJhc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIHByZWZpeCxcbiAgICBpbnB1dCxcbiAgICBzdGFydCxcbiAgICBiYXNlLFxuICAgIGdsb2IsXG4gICAgaXNCcmFjZSxcbiAgICBpc0JyYWNrZXQsXG4gICAgaXNHbG9iLFxuICAgIGlzRXh0Z2xvYixcbiAgICBpc0dsb2JzdGFyLFxuICAgIG5lZ2F0ZWQsXG4gICAgbmVnYXRlZEV4dGdsb2JcbiAgfTtcblxuICBpZiAob3B0cy50b2tlbnMgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5tYXhEZXB0aCA9IDA7XG4gICAgaWYgKCFpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgc3RhdGUudG9rZW5zID0gdG9rZW5zO1xuICB9XG5cbiAgaWYgKG9wdHMucGFydHMgPT09IHRydWUgfHwgb3B0cy50b2tlbnMgPT09IHRydWUpIHtcbiAgICBsZXQgcHJldkluZGV4O1xuXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgc2xhc2hlcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCBuID0gcHJldkluZGV4ID8gcHJldkluZGV4ICsgMSA6IHN0YXJ0O1xuICAgICAgY29uc3QgaSA9IHNsYXNoZXNbaWR4XTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuc2xpY2UobiwgaSk7XG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgaWYgKGlkeCA9PT0gMCAmJiBzdGFydCAhPT0gMCkge1xuICAgICAgICAgIHRva2Vuc1tpZHhdLmlzUHJlZml4ID0gdHJ1ZTtcbiAgICAgICAgICB0b2tlbnNbaWR4XS52YWx1ZSA9IHByZWZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGRlcHRoKHRva2Vuc1tpZHhdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW2lkeF0uZGVwdGg7XG4gICAgICB9XG4gICAgICBpZiAoaWR4ICE9PSAwIHx8IHZhbHVlICE9PSAnJykge1xuICAgICAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHByZXZJbmRleCA9IGk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZJbmRleCAmJiBwcmV2SW5kZXggKyAxIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKHByZXZJbmRleCArIDEpO1xuICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRzLnRva2Vucykge1xuICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGRlcHRoKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0pO1xuICAgICAgICBzdGF0ZS5tYXhEZXB0aCArPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmRlcHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLnNsYXNoZXMgPSBzbGFzaGVzO1xuICAgIHN0YXRlLnBhcnRzID0gcGFydHM7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNjYW47XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBQT1NJWF9SRUdFWF9TT1VSQ0UsXG4gIFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUYsXG4gIFJFUExBQ0VNRU5UU1xufSA9IGNvbnN0YW50cztcblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cblxuY29uc3QgZXhwYW5kUmFuZ2UgPSAoYXJncywgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwYW5kUmFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5leHBhbmRSYW5nZSguLi5hcmdzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFyZ3Muc29ydCgpO1xuICBjb25zdCB2YWx1ZSA9IGBbJHthcmdzLmpvaW4oJy0nKX1dYDtcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXcgKi9cbiAgICBuZXcgUmVnRXhwKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICByZXR1cm4gYXJncy5tYXAodiA9PiB1dGlscy5lc2NhcGVSZWdleCh2KSkuam9pbignLi4nKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBtZXNzYWdlIGZvciBhIHN5bnRheCBlcnJvclxuICovXG5cbmNvbnN0IHN5bnRheEVycm9yID0gKHR5cGUsIGNoYXIpID0+IHtcbiAgcmV0dXJuIGBNaXNzaW5nICR7dHlwZX06IFwiJHtjaGFyfVwiIC0gdXNlIFwiXFxcXFxcXFwke2NoYXJ9XCIgdG8gbWF0Y2ggbGl0ZXJhbCBjaGFyYWN0ZXJzYDtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGlucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7XG5cbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcblxuICBsZXQgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGNvbnN0IGJvcyA9IHsgdHlwZTogJ2JvcycsIHZhbHVlOiAnJywgb3V0cHV0OiBvcHRzLnByZXBlbmQgfHwgJycgfTtcbiAgY29uc3QgdG9rZW5zID0gW2Jvc107XG5cbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3QgUExBVEZPUk1fQ0hBUlMgPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcbiAgY29uc3QgRVhUR0xPQl9DSEFSUyA9IGNvbnN0YW50cy5leHRnbG9iQ2hhcnMoUExBVEZPUk1fQ0hBUlMpO1xuXG4gIGNvbnN0IHtcbiAgICBET1RfTElURVJBTCxcbiAgICBQTFVTX0xJVEVSQUwsXG4gICAgU0xBU0hfTElURVJBTCxcbiAgICBPTkVfQ0hBUixcbiAgICBET1RTX1NMQVNILFxuICAgIE5PX0RPVCxcbiAgICBOT19ET1RfU0xBU0gsXG4gICAgTk9fRE9UU19TTEFTSCxcbiAgICBRTUFSSyxcbiAgICBRTUFSS19OT19ET1QsXG4gICAgU1RBUixcbiAgICBTVEFSVF9BTkNIT1JcbiAgfSA9IFBMQVRGT1JNX0NIQVJTO1xuXG4gIGNvbnN0IGdsb2JzdGFyID0gb3B0cyA9PiB7XG4gICAgcmV0dXJuIGAoJHtjYXB0dXJlfSg/Oig/ISR7U1RBUlRfQU5DSE9SfSR7b3B0cy5kb3QgPyBET1RTX1NMQVNIIDogRE9UX0xJVEVSQUx9KS4pKj8pYDtcbiAgfTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gJycgOiBOT19ET1Q7XG4gIGNvbnN0IHFtYXJrTm9Eb3QgPSBvcHRzLmRvdCA/IFFNQVJLIDogUU1BUktfTk9fRE9UO1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/IGdsb2JzdGFyKG9wdHMpIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgLy8gbWluaW1hdGNoIG9wdGlvbnMgc3VwcG9ydFxuICBpZiAodHlwZW9mIG9wdHMubm9leHQgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMubm9leHRnbG9iID0gb3B0cy5ub2V4dDtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIGlucHV0LFxuICAgIGluZGV4OiAtMSxcbiAgICBzdGFydDogMCxcbiAgICBkb3Q6IG9wdHMuZG90ID09PSB0cnVlLFxuICAgIGNvbnN1bWVkOiAnJyxcbiAgICBvdXRwdXQ6ICcnLFxuICAgIHByZWZpeDogJycsXG4gICAgYmFja3RyYWNrOiBmYWxzZSxcbiAgICBuZWdhdGVkOiBmYWxzZSxcbiAgICBicmFja2V0czogMCxcbiAgICBicmFjZXM6IDAsXG4gICAgcGFyZW5zOiAwLFxuICAgIHF1b3RlczogMCxcbiAgICBnbG9ic3RhcjogZmFsc2UsXG4gICAgdG9rZW5zXG4gIH07XG5cbiAgaW5wdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGVuID0gaW5wdXQubGVuZ3RoO1xuXG4gIGNvbnN0IGV4dGdsb2JzID0gW107XG4gIGNvbnN0IGJyYWNlcyA9IFtdO1xuICBjb25zdCBzdGFjayA9IFtdO1xuICBsZXQgcHJldiA9IGJvcztcbiAgbGV0IHZhbHVlO1xuXG4gIC8qKlxuICAgKiBUb2tlbml6aW5nIGhlbHBlcnNcbiAgICovXG5cbiAgY29uc3QgZW9zID0gKCkgPT4gc3RhdGUuaW5kZXggPT09IGxlbiAtIDE7XG4gIGNvbnN0IHBlZWsgPSBzdGF0ZS5wZWVrID0gKG4gPSAxKSA9PiBpbnB1dFtzdGF0ZS5pbmRleCArIG5dO1xuICBjb25zdCBhZHZhbmNlID0gc3RhdGUuYWR2YW5jZSA9ICgpID0+IGlucHV0Wysrc3RhdGUuaW5kZXhdIHx8ICcnO1xuICBjb25zdCByZW1haW5pbmcgPSAoKSA9PiBpbnB1dC5zbGljZShzdGF0ZS5pbmRleCArIDEpO1xuICBjb25zdCBjb25zdW1lID0gKHZhbHVlID0gJycsIG51bSA9IDApID0+IHtcbiAgICBzdGF0ZS5jb25zdW1lZCArPSB2YWx1ZTtcbiAgICBzdGF0ZS5pbmRleCArPSBudW07XG4gIH07XG5cbiAgY29uc3QgYXBwZW5kID0gdG9rZW4gPT4ge1xuICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5vdXRwdXQgIT0gbnVsbCA/IHRva2VuLm91dHB1dCA6IHRva2VuLnZhbHVlO1xuICAgIGNvbnN1bWUodG9rZW4udmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IG5lZ2F0ZSA9ICgpID0+IHtcbiAgICBsZXQgY291bnQgPSAxO1xuXG4gICAgd2hpbGUgKHBlZWsoKSA9PT0gJyEnICYmIChwZWVrKDIpICE9PSAnKCcgfHwgcGVlaygzKSA9PT0gJz8nKSkge1xuICAgICAgYWR2YW5jZSgpO1xuICAgICAgc3RhdGUuc3RhcnQrKztcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50ICUgMiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRlLm5lZ2F0ZWQgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgaW5jcmVtZW50ID0gdHlwZSA9PiB7XG4gICAgc3RhdGVbdHlwZV0rKztcbiAgICBzdGFjay5wdXNoKHR5cGUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdLS07XG4gICAgc3RhY2sucG9wKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1c2ggdG9rZW5zIG9udG8gdGhlIHRva2VucyBhcnJheS4gVGhpcyBoZWxwZXIgc3BlZWRzIHVwXG4gICAqIHRva2VuaXppbmcgYnkgMSkgaGVscGluZyB1cyBhdm9pZCBiYWNrdHJhY2tpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSxcbiAgICogYW5kIDIpIGhlbHBpbmcgdXMgYXZvaWQgY3JlYXRpbmcgZXh0cmEgdG9rZW5zIHdoZW4gY29uc2VjdXRpdmVcbiAgICogY2hhcmFjdGVycyBhcmUgcGxhaW4gdGV4dC4gVGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgc2ltcGxpZmllc1xuICAgKiBsb29rYmVoaW5kcy5cbiAgICovXG5cbiAgY29uc3QgcHVzaCA9IHRvayA9PiB7XG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ2dsb2JzdGFyJykge1xuICAgICAgY29uc3QgaXNCcmFjZSA9IHN0YXRlLmJyYWNlcyA+IDAgJiYgKHRvay50eXBlID09PSAnY29tbWEnIHx8IHRvay50eXBlID09PSAnYnJhY2UnKTtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYiA9IHRvay5leHRnbG9iID09PSB0cnVlIHx8IChleHRnbG9icy5sZW5ndGggJiYgKHRvay50eXBlID09PSAncGlwZScgfHwgdG9rLnR5cGUgPT09ICdwYXJlbicpKTtcblxuICAgICAgaWYgKHRvay50eXBlICE9PSAnc2xhc2gnICYmIHRvay50eXBlICE9PSAncGFyZW4nICYmICFpc0JyYWNlICYmICFpc0V4dGdsb2IpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuICAgICAgICBwcmV2LnR5cGUgPSAnc3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgPSAnKic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gc3RhcjtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRnbG9icy5sZW5ndGggJiYgdG9rLnR5cGUgIT09ICdwYXJlbicpIHtcbiAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmlubmVyICs9IHRvay52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rLnZhbHVlIHx8IHRvay5vdXRwdXQpIGFwcGVuZCh0b2spO1xuICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3RleHQnICYmIHRvay50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gdG9rLnZhbHVlO1xuICAgICAgcHJldi5vdXRwdXQgPSAocHJldi5vdXRwdXQgfHwgJycpICsgdG9rLnZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRvay5wcmV2ID0gcHJldjtcbiAgICB0b2tlbnMucHVzaCh0b2spO1xuICAgIHByZXYgPSB0b2s7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYk9wZW4gPSAodHlwZSwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IHsgLi4uRVhUR0xPQl9DSEFSU1t2YWx1ZV0sIGNvbmRpdGlvbnM6IDEsIGlubmVyOiAnJyB9O1xuXG4gICAgdG9rZW4ucHJldiA9IHByZXY7XG4gICAgdG9rZW4ucGFyZW5zID0gc3RhdGUucGFyZW5zO1xuICAgIHRva2VuLm91dHB1dCA9IHN0YXRlLm91dHB1dDtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5jYXB0dXJlID8gJygnIDogJycpICsgdG9rZW4ub3BlbjtcblxuICAgIGluY3JlbWVudCgncGFyZW5zJyk7XG4gICAgcHVzaCh7IHR5cGUsIHZhbHVlLCBvdXRwdXQ6IHN0YXRlLm91dHB1dCA/ICcnIDogT05FX0NIQVIgfSk7XG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlOiBhZHZhbmNlKCksIG91dHB1dCB9KTtcbiAgICBleHRnbG9icy5wdXNoKHRva2VuKTtcbiAgfTtcblxuICBjb25zdCBleHRnbG9iQ2xvc2UgPSB0b2tlbiA9PiB7XG4gICAgbGV0IG91dHB1dCA9IHRva2VuLmNsb3NlICsgKG9wdHMuY2FwdHVyZSA/ICcpJyA6ICcnKTtcbiAgICBsZXQgcmVzdDtcblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbmVnYXRlJykge1xuICAgICAgbGV0IGV4dGdsb2JTdGFyID0gc3RhcjtcblxuICAgICAgaWYgKHRva2VuLmlubmVyICYmIHRva2VuLmlubmVyLmxlbmd0aCA+IDEgJiYgdG9rZW4uaW5uZXIuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBleHRnbG9iU3RhciA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXh0Z2xvYlN0YXIgIT09IHN0YXIgfHwgZW9zKCkgfHwgL15cXCkrJC8udGVzdChyZW1haW5pbmcoKSkpIHtcbiAgICAgICAgb3V0cHV0ID0gdG9rZW4uY2xvc2UgPSBgKSQpKSR7ZXh0Z2xvYlN0YXJ9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLmlubmVyLmluY2x1ZGVzKCcqJykgJiYgKHJlc3QgPSByZW1haW5pbmcoKSkgJiYgL15cXC5bXlxcXFwvLl0rJC8udGVzdChyZXN0KSkge1xuICAgICAgICAvLyBBbnkgbm9uLW1hZ2ljYWwgc3RyaW5nIChgLnRzYCkgb3IgZXZlbiBuZXN0ZWQgZXhwcmVzc2lvbiAoYC57dHMsdHN4fWApIGNhbiBmb2xsb3cgYWZ0ZXIgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBwYXJzZSB0aGUgc3RyaW5nIGFuZCB1c2UgaXQgaW4gdGhlIG91dHB1dCBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybi5cbiAgICAgICAgLy8gU3VpdGFibGUgcGF0dGVybnM6IGAvISgqLmQpLnRzYCwgYC8hKCouZCkue3RzLHRzeH1gLCBgKiovISgqLWRiZykuQChqcylgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEaXNhYmxpbmcgdGhlIGBmYXN0cGF0aHNgIG9wdGlvbiBkdWUgdG8gYSBwcm9ibGVtIHdpdGggcGFyc2luZyBzdHJpbmdzIGFzIGAudHNgIGluIHRoZSBwYXR0ZXJuIGxpa2UgYCoqLyEoKi5kKS50c2AuXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBwYXJzZShyZXN0LCB7IC4uLm9wdGlvbnMsIGZhc3RwYXRoczogZmFsc2UgfSkub3V0cHV0O1xuXG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkke2V4cHJlc3Npb259KSR7ZXh0Z2xvYlN0YXJ9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5wcmV2LnR5cGUgPT09ICdib3MnKSB7XG4gICAgICAgIHN0YXRlLm5lZ2F0ZWRFeHRnbG9iID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWUsIG91dHB1dCB9KTtcbiAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGYXN0IHBhdGhzXG4gICAqL1xuXG4gIGlmIChvcHRzLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgIS8oXlsqIV18Wy8oKVtcXF17fVwiXSkvLnRlc3QoaW5wdXQpKSB7XG4gICAgbGV0IGJhY2tzbGFzaGVzID0gZmFsc2U7XG5cbiAgICBsZXQgb3V0cHV0ID0gaW5wdXQucmVwbGFjZShSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUYsIChtLCBlc2MsIGNoYXJzLCBmaXJzdCwgcmVzdCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChmaXJzdCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJz8nKSB7XG4gICAgICAgIGlmIChlc2MpIHtcbiAgICAgICAgICByZXR1cm4gZXNjICsgZmlyc3QgKyAocmVzdCA/IFFNQVJLLnJlcGVhdChyZXN0Lmxlbmd0aCkgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHFtYXJrTm9Eb3QgKyAocmVzdCA/IFFNQVJLLnJlcGVhdChyZXN0Lmxlbmd0aCkgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFFNQVJLLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcuJykge1xuICAgICAgICByZXR1cm4gRE9UX0xJVEVSQUwucmVwZWF0KGNoYXJzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJyonKSB7XG4gICAgICAgIGlmIChlc2MpIHtcbiAgICAgICAgICByZXR1cm4gZXNjICsgZmlyc3QgKyAocmVzdCA/IHN0YXIgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXNjID8gbSA6IGBcXFxcJHttfWA7XG4gICAgfSk7XG5cbiAgICBpZiAoYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC9cXFxcKy9nLCBtID0+IHtcbiAgICAgICAgICByZXR1cm4gbS5sZW5ndGggJSAyID09PSAwID8gJ1xcXFxcXFxcJyA6IChtID8gJ1xcXFwnIDogJycpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0cHV0ID09PSBpbnB1dCAmJiBvcHRzLmNvbnRhaW5zID09PSB0cnVlKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBpbnB1dDtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy53cmFwT3V0cHV0KG91dHB1dCwgc3RhdGUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2tlbml6ZSBpbnB1dCB1bnRpbCB3ZSByZWFjaCBlbmQtb2Ytc3RyaW5nXG4gICAqL1xuXG4gIHdoaWxlICghZW9zKCkpIHtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcXFwnKSB7XG4gICAgICBjb25zdCBuZXh0ID0gcGVlaygpO1xuXG4gICAgICBpZiAobmV4dCA9PT0gJy8nICYmIG9wdHMuYmFzaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHQgPT09ICcuJyB8fCBuZXh0ID09PSAnOycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB2YWx1ZSArPSAnXFxcXCc7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29sbGFwc2Ugc2xhc2hlcyB0byByZWR1Y2UgcG90ZW50aWFsIGZvciBleHBsb2l0c1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxcXFwrLy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGxldCBzbGFzaGVzID0gMDtcblxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgc2xhc2hlcyA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gc2xhc2hlcztcbiAgICAgICAgaWYgKHNsYXNoZXMgJSAyICE9PSAwKSB7XG4gICAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHJlZ2V4IGNoYXJhY3RlciBjbGFzcywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBicmFja2V0LlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLmJyYWNrZXRzID4gMCAmJiAodmFsdWUgIT09ICddJyB8fCBwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgIGlmIChvcHRzLnBvc2l4ICE9PSBmYWxzZSAmJiB2YWx1ZSA9PT0gJzonKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCdbJykpIHtcbiAgICAgICAgICBwcmV2LnBvc2l4ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBwcmV2LnZhbHVlLmxhc3RJbmRleE9mKCdbJyk7XG4gICAgICAgICAgICBjb25zdCBwcmUgPSBwcmV2LnZhbHVlLnNsaWNlKDAsIGlkeCk7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gcHJldi52YWx1ZS5zbGljZShpZHggKyAyKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l4ID0gUE9TSVhfUkVHRVhfU09VUkNFW3Jlc3RdO1xuICAgICAgICAgICAgaWYgKHBvc2l4KSB7XG4gICAgICAgICAgICAgIHByZXYudmFsdWUgPSBwcmUgKyBwb3NpeDtcbiAgICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuXG4gICAgICAgICAgICAgIGlmICghYm9zLm91dHB1dCAmJiB0b2tlbnMuaW5kZXhPZihwcmV2KSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGJvcy5vdXRwdXQgPSBPTkVfQ0hBUjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCh2YWx1ZSA9PT0gJ1snICYmIHBlZWsoKSAhPT0gJzonKSB8fCAodmFsdWUgPT09ICctJyAmJiBwZWVrKCkgPT09ICddJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSAnXScgJiYgKHByZXYudmFsdWUgPT09ICdbJyB8fCBwcmV2LnZhbHVlID09PSAnW14nKSkge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5wb3NpeCA9PT0gdHJ1ZSAmJiB2YWx1ZSA9PT0gJyEnICYmIHByZXYudmFsdWUgPT09ICdbJykge1xuICAgICAgICB2YWx1ZSA9ICdeJztcbiAgICAgIH1cblxuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UncmUgaW5zaWRlIGEgcXVvdGVkIHN0cmluZywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBkb3VibGUgcXVvdGUuXG4gICAgICovXG5cbiAgICBpZiAoc3RhdGUucXVvdGVzID09PSAxICYmIHZhbHVlICE9PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHV0aWxzLmVzY2FwZVJlZ2V4KHZhbHVlKTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdWJsZSBxdW90ZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1wiJykge1xuICAgICAgc3RhdGUucXVvdGVzID0gc3RhdGUucXVvdGVzID09PSAxID8gMCA6IDE7XG4gICAgICBpZiAob3B0cy5rZWVwUXVvdGVzID09PSB0cnVlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJygnKSB7XG4gICAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnKScpIHtcbiAgICAgIGlmIChzdGF0ZS5wYXJlbnMgPT09IDAgJiYgb3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnKCcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0Z2xvYiA9IGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGV4dGdsb2IgJiYgc3RhdGUucGFyZW5zID09PSBleHRnbG9iLnBhcmVucyArIDEpIHtcbiAgICAgICAgZXh0Z2xvYkNsb3NlKGV4dGdsb2JzLnBvcCgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5wYXJlbnMgPyAnKScgOiAnXFxcXCknIH0pO1xuICAgICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNxdWFyZSBicmFja2V0c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnWycpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAhcmVtYWluaW5nKCkuaW5jbHVkZXMoJ10nKSkge1xuICAgICAgICBpZiAob3B0cy5ub2JyYWNrZXQgIT09IHRydWUgJiYgb3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdicmFja2V0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICddJykge1xuICAgICAgaWYgKG9wdHMubm9icmFja2V0ID09PSB0cnVlIHx8IChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnICYmIHByZXYudmFsdWUubGVuZ3RoID09PSAxKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBgXFxcXCR7dmFsdWV9YCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5icmFja2V0cyA9PT0gMCkge1xuICAgICAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignb3BlbmluZycsICdbJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkZWNyZW1lbnQoJ2JyYWNrZXRzJyk7XG5cbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICBpZiAocHJldi5wb3NpeCAhPT0gdHJ1ZSAmJiBwcmV2VmFsdWVbMF0gPT09ICdeJyAmJiAhcHJldlZhbHVlLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgdmFsdWUgPSBgLyR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuXG4gICAgICAvLyB3aGVuIGxpdGVyYWwgYnJhY2tldHMgYXJlIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgbWF0Y2ggd2l0aCBhIHJlZ2V4IGNoYXJhY3RlciBjbGFzc1xuICAgICAgaWYgKG9wdHMubGl0ZXJhbEJyYWNrZXRzID09PSBmYWxzZSB8fCB1dGlscy5oYXNSZWdleENoYXJzKHByZXZWYWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVzY2FwZWQgPSB1dGlscy5lc2NhcGVSZWdleChwcmV2LnZhbHVlKTtcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAvLyB3aGVuIGxpdGVyYWwgYnJhY2tldHMgYXJlIGV4cGxpY2l0bHkgZW5hYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBlc2NhcGUgdGhlIGJyYWNrZXRzIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc1xuICAgICAgaWYgKG9wdHMubGl0ZXJhbEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBlc2NhcGVkO1xuICAgICAgICBwcmV2LnZhbHVlID0gZXNjYXBlZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHdoZW4gdGhlIHVzZXIgc3BlY2lmaWVzIG5vdGhpbmcsIHRyeSB0byBtYXRjaCBib3RoXG4gICAgICBwcmV2LnZhbHVlID0gYCgke2NhcHR1cmV9JHtlc2NhcGVkfXwke3ByZXYudmFsdWV9KWA7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi52YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyYWNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAneycgJiYgb3B0cy5ub2JyYWNlICE9PSB0cnVlKSB7XG4gICAgICBpbmNyZW1lbnQoJ2JyYWNlcycpO1xuXG4gICAgICBjb25zdCBvcGVuID0ge1xuICAgICAgICB0eXBlOiAnYnJhY2UnLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3V0cHV0OiAnKCcsXG4gICAgICAgIG91dHB1dEluZGV4OiBzdGF0ZS5vdXRwdXQubGVuZ3RoLFxuICAgICAgICB0b2tlbnNJbmRleDogc3RhdGUudG9rZW5zLmxlbmd0aFxuICAgICAgfTtcblxuICAgICAgYnJhY2VzLnB1c2gob3Blbik7XG4gICAgICBwdXNoKG9wZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnfScpIHtcbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKG9wdHMubm9icmFjZSA9PT0gdHJ1ZSB8fCAhYnJhY2UpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3V0cHV0ID0gJyknO1xuXG4gICAgICBpZiAoYnJhY2UuZG90cyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBhcnIgPSB0b2tlbnMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSAhPT0gJ2RvdHMnKSB7XG4gICAgICAgICAgICByYW5nZS51bnNoaWZ0KGFycltpXS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gZXhwYW5kUmFuZ2UocmFuZ2UsIG9wdHMpO1xuICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhY2UuY29tbWEgIT09IHRydWUgJiYgYnJhY2UuZG90cyAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgYnJhY2Uub3V0cHV0SW5kZXgpO1xuICAgICAgICBjb25zdCB0b2tzID0gc3RhdGUudG9rZW5zLnNsaWNlKGJyYWNlLnRva2Vuc0luZGV4KTtcbiAgICAgICAgYnJhY2UudmFsdWUgPSBicmFjZS5vdXRwdXQgPSAnXFxcXHsnO1xuICAgICAgICB2YWx1ZSA9IG91dHB1dCA9ICdcXFxcfSc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IG91dDtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRva3MpIHtcbiAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gKHQub3V0cHV0IHx8IHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2UnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgICAgIGJyYWNlcy5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpcGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICd8Jykge1xuICAgICAgaWYgKGV4dGdsb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uY29uZGl0aW9ucysrO1xuICAgICAgfVxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21tYXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJywnKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gdmFsdWU7XG5cbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChicmFjZSAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ2JyYWNlcycpIHtcbiAgICAgICAgYnJhY2UuY29tbWEgPSB0cnVlO1xuICAgICAgICBvdXRwdXQgPSAnfCc7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2xhc2hlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLycpIHtcbiAgICAgIC8vIGlmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdsb2IgaXMgXCIuL1wiLCBhZHZhbmNlIHRoZSBzdGFydFxuICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCBkb24ndCBhZGQgdGhlIFwiLi9cIiBjaGFyYWN0ZXJzXG4gICAgICAvLyB0byB0aGUgc3RhdGUuIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIGxvb2tiZWhpbmRzIHdoZW5cbiAgICAgIC8vIGNoZWNraW5nIGZvciBCT1MgY2hhcmFjdGVycyBsaWtlIFwiIVwiIGFuZCBcIi5cIiAobm90IFwiLi9cIilcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnICYmIHN0YXRlLmluZGV4ID09PSBzdGF0ZS5zdGFydCArIDEpIHtcbiAgICAgICAgc3RhdGUuc3RhcnQgPSBzdGF0ZS5pbmRleCArIDE7XG4gICAgICAgIHN0YXRlLmNvbnN1bWVkID0gJyc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9ICcnO1xuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgIHByZXYgPSBib3M7IC8vIHJlc2V0IFwicHJldlwiIHRvIHRoZSBmaXJzdCB0b2tlblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlLCBvdXRwdXQ6IFNMQVNIX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3RzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcuJykge1xuICAgICAgaWYgKHN0YXRlLmJyYWNlcyA+IDAgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBpZiAocHJldi52YWx1ZSA9PT0gJy4nKSBwcmV2Lm91dHB1dCA9IERPVF9MSVRFUkFMO1xuICAgICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHByZXYudHlwZSA9ICdkb3RzJztcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIGJyYWNlLmRvdHMgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChzdGF0ZS5icmFjZXMgKyBzdGF0ZS5wYXJlbnMpID09PSAwICYmIHByZXYudHlwZSAhPT0gJ2JvcycgJiYgcHJldi50eXBlICE9PSAnc2xhc2gnKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXN0aW9uIG1hcmtzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICc/Jykge1xuICAgICAgY29uc3QgaXNHcm91cCA9IHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnO1xuICAgICAgaWYgKCFpc0dyb3VwICYmIG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncW1hcmsnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdwYXJlbicpIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChuZXh0ID09PSAnPCcgJiYgIXV0aWxzLnN1cHBvcnRzTG9va2JlaGluZHMoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZS5qcyB2MTAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkIGZvciByZWdleCBsb29rYmVoaW5kcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChwcmV2LnZhbHVlID09PSAnKCcgJiYgIS9bIT08Ol0vLnRlc3QobmV4dCkpIHx8IChuZXh0ID09PSAnPCcgJiYgIS88KFshPV18XFx3Kz4pLy50ZXN0KHJlbWFpbmluZygpKSkpIHtcbiAgICAgICAgICBvdXRwdXQgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5kb3QgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmV2LnR5cGUgPT09ICdib3MnKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3FtYXJrJywgdmFsdWUsIG91dHB1dDogUU1BUktfTk9fRE9UIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjbGFtYXRpb25cbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJyEnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcpIHtcbiAgICAgICAgaWYgKHBlZWsoMikgIT09ICc/JyB8fCAhL1shPTw6XS8udGVzdChwZWVrKDMpKSkge1xuICAgICAgICAgIGV4dGdsb2JPcGVuKCduZWdhdGUnLCB2YWx1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgc3RhdGUuaW5kZXggPT09IDApIHtcbiAgICAgICAgbmVnYXRlKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJysnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIGV4dGdsb2JPcGVuKCdwbHVzJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJykgfHwgb3B0cy5yZWdleCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUsIG91dHB1dDogUExVU19MSVRFUkFMIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdicmFja2V0JyB8fCBwcmV2LnR5cGUgPT09ICdwYXJlbicgfHwgcHJldi50eXBlID09PSAnYnJhY2UnKSkgfHwgc3RhdGUucGFyZW5zID4gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlOiBQTFVTX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdAJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ2F0JywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHRcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSAhPT0gJyonKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICckJyB8fCB2YWx1ZSA9PT0gJ14nKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlMuZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdmFsdWUgKz0gbWF0Y2hbMF07XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2dsb2JzdGFyJyB8fCBwcmV2LnN0YXIgPT09IHRydWUpKSB7XG4gICAgICBwcmV2LnR5cGUgPSAnc3Rhcic7XG4gICAgICBwcmV2LnN0YXIgPSB0cnVlO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gc3RhcjtcbiAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCByZXN0ID0gcmVtYWluaW5nKCk7XG4gICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIC9eXFwoW14/XS8udGVzdChyZXN0KSkge1xuICAgICAgZXh0Z2xvYk9wZW4oJ3N0YXInLCB2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJldi50eXBlID09PSAnc3RhcicpIHtcbiAgICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmlvciA9IHByZXYucHJldjtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHByaW9yLnByZXY7XG4gICAgICBjb25zdCBpc1N0YXJ0ID0gcHJpb3IudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmlvci50eXBlID09PSAnYm9zJztcbiAgICAgIGNvbnN0IGFmdGVyU3RhciA9IGJlZm9yZSAmJiAoYmVmb3JlLnR5cGUgPT09ICdzdGFyJyB8fCBiZWZvcmUudHlwZSA9PT0gJ2dsb2JzdGFyJyk7XG5cbiAgICAgIGlmIChvcHRzLmJhc2ggPT09IHRydWUgJiYgKCFpc1N0YXJ0IHx8IChyZXN0WzBdICYmIHJlc3RbMF0gIT09ICcvJykpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNCcmFjZSA9IHN0YXRlLmJyYWNlcyA+IDAgJiYgKHByaW9yLnR5cGUgPT09ICdjb21tYScgfHwgcHJpb3IudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSBleHRnbG9icy5sZW5ndGggJiYgKHByaW9yLnR5cGUgPT09ICdwaXBlJyB8fCBwcmlvci50eXBlID09PSAncGFyZW4nKTtcbiAgICAgIGlmICghaXNTdGFydCAmJiBwcmlvci50eXBlICE9PSAncGFyZW4nICYmICFpc0JyYWNlICYmICFpc0V4dGdsb2IpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBzdHJpcCBjb25zZWN1dGl2ZSBgLyoqL2BcbiAgICAgIHdoaWxlIChyZXN0LnNsaWNlKDAsIDMpID09PSAnLyoqJykge1xuICAgICAgICBjb25zdCBhZnRlciA9IGlucHV0W3N0YXRlLmluZGV4ICsgNF07XG4gICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gJy8nKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoMyk7XG4gICAgICAgIGNvbnN1bWUoJy8qKicsIDMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ2JvcycgJiYgZW9zKCkpIHtcbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ3NsYXNoJyAmJiBwcmlvci5wcmV2LnR5cGUgIT09ICdib3MnICYmICFhZnRlclN0YXIgJiYgZW9zKCkpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC0ocHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQpLmxlbmd0aCk7XG4gICAgICAgIHByaW9yLm91dHB1dCA9IGAoPzoke3ByaW9yLm91dHB1dH1gO1xuXG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cykgKyAob3B0cy5zdHJpY3RTbGFzaGVzID8gJyknIDogJ3wkKScpO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ3NsYXNoJyAmJiBwcmlvci5wcmV2LnR5cGUgIT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBjb25zdCBlbmQgPSByZXN0WzFdICE9PSB2b2lkIDAgPyAnfCQnIDogJyc7XG5cbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC0ocHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQpLmxlbmd0aCk7XG4gICAgICAgIHByaW9yLm91dHB1dCA9IGAoPzoke3ByaW9yLm91dHB1dH1gO1xuXG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gYCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfXwke1NMQVNIX0xJVEVSQUx9JHtlbmR9KWA7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG5cbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG5cbiAgICAgICAgY29uc3VtZSh2YWx1ZSArIGFkdmFuY2UoKSk7XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlOiAnLycsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ2JvcycgJiYgcmVzdFswXSA9PT0gJy8nKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gYCg/Ol58JHtTTEFTSF9MSVRFUkFMfXwke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pYDtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSArIGFkdmFuY2UoKSk7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVtb3ZlIHNpbmdsZSBzdGFyIGZyb20gb3V0cHV0XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7XG5cbiAgICAgIC8vIHJlc2V0IHByZXZpb3VzIHRva2VuIHRvIGdsb2JzdGFyXG4gICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG5cbiAgICAgIC8vIHJlc2V0IG91dHB1dCB3aXRoIGdsb2JzdGFyXG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7XG4gICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0geyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6IHN0YXIgfTtcblxuICAgIGlmIChvcHRzLmJhc2ggPT09IHRydWUpIHtcbiAgICAgIHRva2VuLm91dHB1dCA9ICcuKj8nO1xuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2JvcycgfHwgcHJldi50eXBlID09PSAnc2xhc2gnKSB7XG4gICAgICAgIHRva2VuLm91dHB1dCA9IG5vZG90ICsgdG9rZW4ub3V0cHV0O1xuICAgICAgfVxuICAgICAgcHVzaCh0b2tlbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nKSAmJiBvcHRzLnJlZ2V4ID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSB2YWx1ZTtcbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmluZGV4ID09PSBzdGF0ZS5zdGFydCB8fCBwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UX1NMQVNIO1xuXG4gICAgICB9IGVsc2UgaWYgKG9wdHMuZG90ID09PSB0cnVlKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RTX1NMQVNIO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBOT19ET1RTX1NMQVNIO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gbm9kb3Q7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IG5vZG90O1xuICAgICAgfVxuXG4gICAgICBpZiAocGVlaygpICE9PSAnKicpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE9ORV9DSEFSO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKHRva2VuKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5icmFja2V0cyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ10nKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICdbJyk7XG4gICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJyknKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICcoJyk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5icmFjZXMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICd9JykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAneycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gIH1cblxuICBpZiAob3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzdGFyJyB8fCBwcmV2LnR5cGUgPT09ICdicmFja2V0JykpIHtcbiAgICBwdXNoKHsgdHlwZTogJ21heWJlX3NsYXNoJywgdmFsdWU6ICcnLCBvdXRwdXQ6IGAke1NMQVNIX0xJVEVSQUx9P2AgfSk7XG4gIH1cblxuICAvLyByZWJ1aWxkIHRoZSBvdXRwdXQgaWYgd2UgaGFkIHRvIGJhY2t0cmFjayBhdCBhbnkgcG9pbnRcbiAgaWYgKHN0YXRlLmJhY2t0cmFjayA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLm91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBzdGF0ZS50b2tlbnMpIHtcbiAgICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5vdXRwdXQgIT0gbnVsbCA/IHRva2VuLm91dHB1dCA6IHRva2VuLnZhbHVlO1xuXG4gICAgICBpZiAodG9rZW4uc3VmZml4KSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5zdWZmaXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBGYXN0IHBhdGhzIGZvciBjcmVhdGluZyByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBjb21tb24gZ2xvYiBwYXR0ZXJucy5cbiAqIFRoaXMgY2FuIHNpZ25pZmljYW50bHkgc3BlZWQgdXAgcHJvY2Vzc2luZyBhbmQgaGFzIHZlcnkgbGl0dGxlIGRvd25zaWRlXG4gKiBpbXBhY3Qgd2hlbiBub25lIG9mIHRoZSBmYXN0IHBhdGhzIG1hdGNoLlxuICovXG5cbnBhcnNlLmZhc3RwYXRocyA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBjb25zdCBsZW4gPSBpbnB1dC5sZW5ndGg7XG4gIGlmIChsZW4gPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuICBjb25zdCB3aW4zMiA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcblxuICAvLyBjcmVhdGUgY29uc3RhbnRzIGJhc2VkIG9uIHBsYXRmb3JtLCBmb3Igd2luZG93cyBvciBwb3NpeFxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgU0xBU0hfTElURVJBTCxcbiAgICBPTkVfQ0hBUixcbiAgICBET1RTX1NMQVNILFxuICAgIE5PX0RPVCxcbiAgICBOT19ET1RTLFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgU1RBUixcbiAgICBTVEFSVF9BTkNIT1JcbiAgfSA9IGNvbnN0YW50cy5nbG9iQ2hhcnMod2luMzIpO1xuXG4gIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyBOT19ET1RTIDogTk9fRE9UO1xuICBjb25zdCBzbGFzaERvdCA9IG9wdHMuZG90ID8gTk9fRE9UU19TTEFTSCA6IE5PX0RPVDtcbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgc3RhdGUgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBwcmVmaXg6ICcnIH07XG4gIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gJy4qPycgOiBTVEFSO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICBzdGFyID0gYCgke3N0YXJ9KWA7XG4gIH1cblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHJldHVybiBzdGFyO1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlID0gc3RyID0+IHtcbiAgICBzd2l0Y2ggKHN0cikge1xuICAgICAgY2FzZSAnKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcuKic6XG4gICAgICAgIHJldHVybiBgJHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqLionOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi8qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke1NMQVNIX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3NsYXNoRG90fSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKic6XG4gICAgICAgIHJldHVybiBub2RvdCArIGdsb2JzdGFyKG9wdHMpO1xuXG4gICAgICBjYXNlICcqKi8qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8qLionOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke3NsYXNoRG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqLy4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL14oLio/KVxcLihcXHcrKSQvLmV4ZWMoc3RyKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZShtYXRjaFsxXSk7XG4gICAgICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZSArIERPVF9MSVRFUkFMICsgbWF0Y2hbMl07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG91dHB1dCA9IHV0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpO1xuICBsZXQgc291cmNlID0gY3JlYXRlKG91dHB1dCk7XG5cbiAgaWYgKHNvdXJjZSAmJiBvcHRzLnN0cmljdFNsYXNoZXMgIT09IHRydWUpIHtcbiAgICBzb3VyY2UgKz0gYCR7U0xBU0hfTElURVJBTH0/YDtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHNjYW4gPSByZXF1aXJlKCcuL3NjYW4nKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdGNoZXIgZnVuY3Rpb24gZnJvbSBvbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLiBUaGVcbiAqIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG1hdGNoLiBUaGUgcmV0dXJuZWQgbWF0Y2hlclxuICogZnVuY3Rpb24gYWxzbyB0YWtlcyBhIGJvb2xlYW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0LCB3aGVuIHRydWUsXG4gKiByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoKGdsb2JbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IHBpY29tYXRjaCgnKi4hKCphKScpO1xuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5hJykpOyAvLz0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmInKSk7IC8vPT4gdHJ1ZVxuICogYGBgXG4gKiBAbmFtZSBwaWNvbWF0Y2hcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgZ2xvYnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuXG4gKiBAcGFyYW0ge09iamVjdD19IGBvcHRpb25zYFxuICogQHJldHVybiB7RnVuY3Rpb249fSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgcGljb21hdGNoID0gKGdsb2IsIG9wdGlvbnMsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZ2xvYikpIHtcbiAgICBjb25zdCBmbnMgPSBnbG9iLm1hcChpbnB1dCA9PiBwaWNvbWF0Y2goaW5wdXQsIG9wdGlvbnMsIHJldHVyblN0YXRlKSk7XG4gICAgY29uc3QgYXJyYXlNYXRjaGVyID0gc3RyID0+IHtcbiAgICAgIGZvciAoY29uc3QgaXNNYXRjaCBvZiBmbnMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc01hdGNoKHN0cik7XG4gICAgICAgIGlmIChzdGF0ZSkgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5TWF0Y2hlcjtcbiAgfVxuXG4gIGNvbnN0IGlzU3RhdGUgPSBpc09iamVjdChnbG9iKSAmJiBnbG9iLnRva2VucyAmJiBnbG9iLmlucHV0O1xuXG4gIGlmIChnbG9iID09PSAnJyB8fCAodHlwZW9mIGdsb2IgIT09ICdzdHJpbmcnICYmICFpc1N0YXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHBhdHRlcm4gdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG4gIGNvbnN0IHJlZ2V4ID0gaXNTdGF0ZVxuICAgID8gcGljb21hdGNoLmNvbXBpbGVSZShnbG9iLCBvcHRpb25zKVxuICAgIDogcGljb21hdGNoLm1ha2VSZShnbG9iLCBvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgY29uc3Qgc3RhdGUgPSByZWdleC5zdGF0ZTtcbiAgZGVsZXRlIHJlZ2V4LnN0YXRlO1xuXG4gIGxldCBpc0lnbm9yZWQgPSAoKSA9PiBmYWxzZTtcbiAgaWYgKG9wdHMuaWdub3JlKSB7XG4gICAgY29uc3QgaWdub3JlT3B0cyA9IHsgLi4ub3B0aW9ucywgaWdub3JlOiBudWxsLCBvbk1hdGNoOiBudWxsLCBvblJlc3VsdDogbnVsbCB9O1xuICAgIGlzSWdub3JlZCA9IHBpY29tYXRjaChvcHRzLmlnbm9yZSwgaWdub3JlT3B0cywgcmV0dXJuU3RhdGUpO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlciA9IChpbnB1dCwgcmV0dXJuT2JqZWN0ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7IGlzTWF0Y2gsIG1hdGNoLCBvdXRwdXQgfSA9IHBpY29tYXRjaC50ZXN0KGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSB7IGdsb2IsIHN0YXRlLCByZWdleCwgcG9zaXgsIGlucHV0LCBvdXRwdXQsIG1hdGNoLCBpc01hdGNoIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25SZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdHMub25SZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzSWdub3JlZChpbnB1dCkpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbklnbm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRzLm9uSWdub3JlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5vbk1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uTWF0Y2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IHRydWU7XG4gIH07XG5cbiAgaWYgKHJldHVyblN0YXRlKSB7XG4gICAgbWF0Y2hlci5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXI7XG59O1xuXG4vKipcbiAqIFRlc3QgYGlucHV0YCB3aXRoIHRoZSBnaXZlbiBgcmVnZXhgLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG1haW5cbiAqIGBwaWNvbWF0Y2goKWAgZnVuY3Rpb24gdG8gdGVzdCB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50ZXN0KGlucHV0LCByZWdleFssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudGVzdCgnZm9vL2JhcicsIC9eKD86KFteL10qPylcXC8oW14vXSo/KSkkLykpO1xuICogLy8geyBpc01hdGNoOiB0cnVlLCBtYXRjaDogWyAnZm9vLycsICdmb28nLCAnYmFyJyBdLCBvdXRwdXQ6ICdmb28vYmFyJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB9IGByZWdleGBcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtYXRjaGluZyBpbmZvLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gudGVzdCA9IChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICByZXR1cm4geyBpc01hdGNoOiBmYWxzZSwgb3V0cHV0OiAnJyB9O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGZvcm1hdCA9IG9wdHMuZm9ybWF0IHx8IChwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzIDogbnVsbCk7XG4gIGxldCBtYXRjaCA9IGlucHV0ID09PSBnbG9iO1xuICBsZXQgb3V0cHV0ID0gKG1hdGNoICYmIGZvcm1hdCkgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG5cbiAgaWYgKG1hdGNoID09PSBmYWxzZSkge1xuICAgIG91dHB1dCA9IGZvcm1hdCA/IGZvcm1hdChpbnB1dCkgOiBpbnB1dDtcbiAgICBtYXRjaCA9IG91dHB1dCA9PT0gZ2xvYjtcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UgfHwgb3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgaWYgKG9wdHMubWF0Y2hCYXNlID09PSB0cnVlIHx8IG9wdHMuYmFzZW5hbWUgPT09IHRydWUpIHtcbiAgICAgIG1hdGNoID0gcGljb21hdGNoLm1hdGNoQmFzZShpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHBvc2l4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0Y2ggPSByZWdleC5leGVjKG91dHB1dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaXNNYXRjaDogQm9vbGVhbihtYXRjaCksIG1hdGNoLCBvdXRwdXQgfTtcbn07XG5cbi8qKlxuICogTWF0Y2ggdGhlIGJhc2VuYW1lIG9mIGEgZmlsZXBhdGguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLm1hdGNoQmFzZShpbnB1dCwgZ2xvYlssIG9wdGlvbnNdKTtcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5tYXRjaEJhc2UoJ2Zvby9iYXIuanMnLCAnKi5qcycpOyAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBgZ2xvYmAgR2xvYiBwYXR0ZXJuIG9yIHJlZ2V4IGNyZWF0ZWQgYnkgWy5tYWtlUmVdKCNtYWtlUmUpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLm1hdGNoQmFzZSA9IChpbnB1dCwgZ2xvYiwgb3B0aW9ucywgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucykpID0+IHtcbiAgY29uc3QgcmVnZXggPSBnbG9iIGluc3RhbmNlb2YgUmVnRXhwID8gZ2xvYiA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucyk7XG4gIHJldHVybiByZWdleC50ZXN0KHBhdGguYmFzZW5hbWUoaW5wdXQpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYW55Kiogb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYCBtYXRjaCB0aGUgc3BlY2lmaWVkIGBzdHJpbmdgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5pc01hdGNoKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cocGljb21hdGNoLmlzTWF0Y2goJ2EuYScsICdiLionKSk7IC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHN0ciBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gcGF0dGVybnMgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBQYXJzZSBhIGdsb2IgcGF0dGVybiB0byBjcmVhdGUgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIGEgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zdCByZXN1bHQgPSBwaWNvbWF0Y2gucGFyc2UocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBvdXRwdXQgdG8gYmUgdXNlZCBhcyBhIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5wYXJzZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSByZXR1cm4gcGF0dGVybi5tYXAocCA9PiBwaWNvbWF0Y2gucGFyc2UocCwgb3B0aW9ucykpO1xuICByZXR1cm4gcGFyc2UocGF0dGVybiwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pO1xufTtcblxuLyoqXG4gKiBTY2FuIGEgZ2xvYiBwYXR0ZXJuIHRvIHNlcGFyYXRlIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnNjYW4oaW5wdXRbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnNjYW4oJyEuL2Zvby8qLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICogeyBwcmVmaXg6ICchLi8nLFxuICogICBpbnB1dDogJyEuL2Zvby8qLmpzJyxcbiAqICAgc3RhcnQ6IDMsXG4gKiAgIGJhc2U6ICdmb28nLFxuICogICBnbG9iOiAnKi5qcycsXG4gKiAgIGlzQnJhY2U6IGZhbHNlLFxuICogICBpc0JyYWNrZXQ6IGZhbHNlLFxuICogICBpc0dsb2I6IHRydWUsXG4gKiAgIGlzRXh0Z2xvYjogZmFsc2UsXG4gKiAgIGlzR2xvYnN0YXI6IGZhbHNlLFxuICogICBuZWdhdGVkOiB0cnVlIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgR2xvYiBwYXR0ZXJuIHRvIHNjYW4uXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHNjYW4oaW5wdXQsIG9wdGlvbnMpO1xuXG4vKipcbiAqIENvbXBpbGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgYHN0YXRlYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlXG4gKiBbcGFyc2UoKV0oI3BhcnNlKSBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBzdGF0ZWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVybk91dHB1dGAgSW50ZW5kZWQgZm9yIGltcGxlbWVudG9ycywgdGhpcyBhcmd1bWVudCBhbGxvd3MgeW91IHRvIHJldHVybiB0aGUgcmF3IG91dHB1dCBmcm9tIHRoZSBwYXJzZXIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5TdGF0ZWAgQWRkcyB0aGUgc3RhdGUgdG8gYSBgc3RhdGVgIHByb3BlcnR5IG9uIHRoZSByZXR1cm5lZCByZWdleC4gVXNlZnVsIGZvciBpbXBsZW1lbnRvcnMgYW5kIGRlYnVnZ2luZy5cbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLmNvbXBpbGVSZSA9IChzdGF0ZSwgb3B0aW9ucywgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKHJldHVybk91dHB1dCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vdXRwdXQ7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgcHJlcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICdeJztcbiAgY29uc3QgYXBwZW5kID0gb3B0cy5jb250YWlucyA/ICcnIDogJyQnO1xuXG4gIGxldCBzb3VyY2UgPSBgJHtwcmVwZW5kfSg/OiR7c3RhdGUub3V0cHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUgJiYgc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIHNvdXJjZSA9IGBeKD8hJHtzb3VyY2V9KS4qJGA7XG4gIH1cblxuICBjb25zdCByZWdleCA9IHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZSwgb3B0aW9ucyk7XG4gIGlmIChyZXR1cm5TdGF0ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZ2V4LnN0YXRlID0gc3RhdGU7XG4gIH1cblxuICByZXR1cm4gcmVnZXg7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIGEgcGFyc2VkIGdsb2IgcGF0dGVybi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IHBpY29tYXRjaC5wYXJzZSgnKi5qcycpO1xuICogLy8gcGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guY29tcGlsZVJlKHN0YXRlKSk7XG4gKiAvLz0+IC9eKD86KD8hXFwuKSg/PS4pW14vXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdGF0ZWAgVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBgLnBhcnNlYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEltcGxlbWVudG9ycyBtYXkgdXNlIHRoaXMgYXJndW1lbnQgdG8gcmV0dXJuIHRoZSBjb21waWxlZCBvdXRwdXQsIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uIFRoaXMgaXMgbm90IGV4cG9zZWQgb24gdGhlIG9wdGlvbnMgdG8gcHJldmVudCBlbmQtdXNlcnMgZnJvbSBtdXRhdGluZyB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEltcGxlbWVudG9ycyBtYXkgdXNlIHRoaXMgYXJndW1lbnQgdG8gcmV0dXJuIHRoZSBzdGF0ZSBmcm9tIHRoZSBwYXJzZWQgZ2xvYiB3aXRoIHRoZSByZXR1cm5lZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJuIHtSZWdFeHB9IFJldHVybnMgYSByZWdleCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHBhdHRlcm4uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYWtlUmUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSwgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBsZXQgcGFyc2VkID0geyBuZWdhdGVkOiBmYWxzZSwgZmFzdHBhdGhzOiB0cnVlIH07XG5cbiAgaWYgKG9wdGlvbnMuZmFzdHBhdGhzICE9PSBmYWxzZSAmJiAoaW5wdXRbMF0gPT09ICcuJyB8fCBpbnB1dFswXSA9PT0gJyonKSkge1xuICAgIHBhcnNlZC5vdXRwdXQgPSBwYXJzZS5mYXN0cGF0aHMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFwYXJzZWQub3V0cHV0KSB7XG4gICAgcGFyc2VkID0gcGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHBpY29tYXRjaC5jb21waWxlUmUocGFyc2VkLCBvcHRpb25zLCByZXR1cm5PdXRwdXQsIHJldHVyblN0YXRlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnRvUmVnZXgoc291cmNlWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHsgb3V0cHV0IH0gPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC50b1JlZ2V4KG91dHB1dCkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc291cmNlYCBSZWd1bGFyIGV4cHJlc3Npb24gc291cmNlIHN0cmluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRvUmVnZXggPSAoc291cmNlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCBvcHRzLmZsYWdzIHx8IChvcHRzLm5vY2FzZSA/ICdpJyA6ICcnKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHRocm93IGVycjtcbiAgICByZXR1cm4gLyReLztcbiAgfVxufTtcblxuLyoqXG4gKiBQaWNvbWF0Y2ggY29uc3RhbnRzLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbnBpY29tYXRjaC5jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbi8qKlxuICogRXhwb3NlIFwicGljb21hdGNoXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY29tYXRjaDtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvcGljb21hdGNoJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG5jb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgncGljb21hdGNoL2xpYi91dGlscycpO1xuY29uc3QgaXNFbXB0eVN0cmluZyA9IHZhbCA9PiB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJy4vJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBtYXRjaCBvbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tKFsnYS5qcycsICdhLnR4dCddLCBbJyouanMnXSkpO1xuICogLy89PiBbICdhLmpzJyBdXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PHN0cmluZz59IGBsaXN0YCBMaXN0IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzXG4gKiBAc3VtbWFyeSBmYWxzZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBtaWNyb21hdGNoID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIHBhdHRlcm5zID0gW10uY29uY2F0KHBhdHRlcm5zKTtcbiAgbGlzdCA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBsZXQgb21pdCA9IG5ldyBTZXQoKTtcbiAgbGV0IGtlZXAgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IG5ldyBTZXQoKTtcbiAgbGV0IG5lZ2F0aXZlcyA9IDA7XG5cbiAgbGV0IG9uUmVzdWx0ID0gc3RhdGUgPT4ge1xuICAgIGl0ZW1zLmFkZChzdGF0ZS5vdXRwdXQpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMub25SZXN1bHQpIHtcbiAgICAgIG9wdGlvbnMub25SZXN1bHQoc3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm5zW2ldKSwgeyAuLi5vcHRpb25zLCBvblJlc3VsdCB9LCB0cnVlKTtcbiAgICBsZXQgbmVnYXRlZCA9IGlzTWF0Y2guc3RhdGUubmVnYXRlZCB8fCBpc01hdGNoLnN0YXRlLm5lZ2F0ZWRFeHRnbG9iO1xuICAgIGlmIChuZWdhdGVkKSBuZWdhdGl2ZXMrKztcblxuICAgIGZvciAobGV0IGl0ZW0gb2YgbGlzdCkge1xuICAgICAgbGV0IG1hdGNoZWQgPSBpc01hdGNoKGl0ZW0sIHRydWUpO1xuXG4gICAgICBsZXQgbWF0Y2ggPSBuZWdhdGVkID8gIW1hdGNoZWQuaXNNYXRjaCA6IG1hdGNoZWQuaXNNYXRjaDtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAobmVnYXRlZCkge1xuICAgICAgICBvbWl0LmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbWl0LmRlbGV0ZShtYXRjaGVkLm91dHB1dCk7XG4gICAgICAgIGtlZXAuYWRkKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gbmVnYXRpdmVzID09PSBwYXR0ZXJucy5sZW5ndGggPyBbLi4uaXRlbXNdIDogWy4uLmtlZXBdO1xuICBsZXQgbWF0Y2hlcyA9IHJlc3VsdC5maWx0ZXIoaXRlbSA9PiAhb21pdC5oYXMoaXRlbSkpO1xuXG4gIGlmIChvcHRpb25zICYmIG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKG9wdGlvbnMuZmFpbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWF0Y2hlcyBmb3VuZCBmb3IgXCIke3BhdHRlcm5zLmpvaW4oJywgJyl9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5ub251bGwgPT09IHRydWUgfHwgb3B0aW9ucy5udWxsZ2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudW5lc2NhcGUgPyBwYXR0ZXJucy5tYXAocCA9PiBwLnJlcGxhY2UoL1xcXFwvZywgJycpKSA6IHBhdHRlcm5zO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaGVzO1xufTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2ggPSBtaWNyb21hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5gIGFuZCBgb3B0aW9uc2AuXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgdG8gbWF0Y2ggYXMgaXRzIG9ubHkgYXJndW1lbnQgYW5kIHJldHVybnNcbiAqIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG1hdGNoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoZXIocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBpc01hdGNoID0gbW0ubWF0Y2hlcignKi4hKCphKScpO1xuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5hJykpOyAvLz0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmInKSk7IC8vPT4gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEdsb2IgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7RnVuY3Rpb259IFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoZXIgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm4sIG9wdGlvbnMpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5pc01hdGNoKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYFtvcHRpb25zXWAgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmlzTWF0Y2ggPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm5zLCBvcHRpb25zKShzdHIpO1xuXG4vKipcbiAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKi9cblxubWljcm9tYXRjaC5hbnkgPSBtaWNyb21hdGNoLmlzTWF0Y2g7XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IF8qKmRvIG5vdCBtYXRjaCBhbnkqKl8gb2YgdGhlIGdpdmVuIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubm90KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLm5vdChbJ2EuYScsICdiLmInLCAnYy5jJ10sICcqLmEnKSk7XG4gKiAvLz0+IFsnYi5iJywgJ2MuYyddXG4gKiBgYGBcbiAqIEBwYXJhbSB7QXJyYXl9IGBsaXN0YCBBcnJheSBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0ICoqZG8gbm90IG1hdGNoKiogdGhlIGdpdmVuIHBhdHRlcm5zLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm5vdCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIHBhdHRlcm5zID0gW10uY29uY2F0KHBhdHRlcm5zKS5tYXAoU3RyaW5nKTtcbiAgbGV0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgbGV0IGl0ZW1zID0gW107XG5cbiAgbGV0IG9uUmVzdWx0ID0gc3RhdGUgPT4ge1xuICAgIGlmIChvcHRpb25zLm9uUmVzdWx0KSBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICBpdGVtcy5wdXNoKHN0YXRlLm91dHB1dCk7XG4gIH07XG5cbiAgbGV0IG1hdGNoZXMgPSBuZXcgU2V0KG1pY3JvbWF0Y2gobGlzdCwgcGF0dGVybnMsIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSkpO1xuXG4gIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoIW1hdGNoZXMuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnJlc3VsdF07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYHN0cmluZ2AgY29udGFpbnMgdGhlIGdpdmVuIHBhdHRlcm4uIFNpbWlsYXJcbiAqIHRvIFsuaXNNYXRjaF0oI2lzTWF0Y2gpIGJ1dCB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYW55IHBhcnQgb2YgdGhlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogdmFyIG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY29udGFpbnMoc3RyaW5nLCBwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqYicpKTtcbiAqIC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uY29udGFpbnMoJ2FhL2JiL2NjJywgJypkJykpO1xuICogLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIHBhdHRlcm5zIG1hdGNoZXMgYW55IHBhcnQgb2YgYHN0cmAuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guY29udGFpbnMgPSAoc3RyLCBwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nOiBcIiR7dXRpbC5pbnNwZWN0KHN0cil9XCJgKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc29tZShwID0+IG1pY3JvbWF0Y2guY29udGFpbnMoc3RyLCBwLCBvcHRpb25zKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlzRW1wdHlTdHJpbmcoc3RyKSB8fCBpc0VtcHR5U3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0ci5pbmNsdWRlcyhwYXR0ZXJuKSB8fCAoc3RyLnN0YXJ0c1dpdGgoJy4vJykgJiYgc3RyLnNsaWNlKDIpLmluY2x1ZGVzKHBhdHRlcm4pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pY3JvbWF0Y2guaXNNYXRjaChzdHIsIHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgY29udGFpbnM6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEZpbHRlciB0aGUga2V5cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBnbG9iYCBwYXR0ZXJuXG4gKiBhbmQgYG9wdGlvbnNgLiBEb2VzIG5vdCBhdHRlbXB0IHRvIG1hdGNoIG5lc3RlZCBrZXlzLiBJZiB5b3UgbmVlZCB0aGlzIGZlYXR1cmUsXG4gKiB1c2UgW2dsb2Itb2JqZWN0XVtdIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hLZXlzKG9iamVjdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3Qgb2JqID0geyBhYTogJ2EnLCBhYjogJ2InLCBhYzogJ2MnIH07XG4gKiBjb25zb2xlLmxvZyhtbS5tYXRjaEtleXMob2JqLCAnKmInKSk7XG4gKiAvLz0+IHsgYWI6ICdiJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb2JqZWN0YCBUaGUgb2JqZWN0IHdpdGgga2V5cyB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG9ubHkga2V5cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaEtleXMgPSAob2JqLCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgbGV0IGtleXMgPSBtaWNyb21hdGNoKE9iamVjdC5rZXlzKG9iaiksIHBhdHRlcm5zLCBvcHRpb25zKTtcbiAgbGV0IHJlcyA9IHt9O1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHNvbWUgb2YgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGBsaXN0YCBtYXRjaCBhbnkgb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5zb21lKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC4gUmV0dXJucyBhcyBzb29uIGFzIHRoZSBmaXJzdCBtYXRjaCBpcyBmb3VuZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbnkgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guc29tZSA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgaXRlbXMgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMpKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKTtcbiAgICBpZiAoaXRlbXMuc29tZShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZXZlcnkgc3RyaW5nIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2hlc1xuICogYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uZXZlcnkobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uZXZlcnkoJ2Zvby5qcycsIFsnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGxpc3RgIFRoZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbGwgYHBhdHRlcm5zYCBtYXRjaGVzIGFsbCBvZiB0aGUgc3RyaW5ncyBpbiBgbGlzdGBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ldmVyeSA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgaXRlbXMgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMpKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKTtcbiAgICBpZiAoIWl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXNNYXRjaChpdGVtKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFsbCoqIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgIG1hdGNoXG4gKiB0aGUgc3BlY2lmaWVkIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5hbGwoc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICdmKicsICcqbyonLCAnKm8uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5hbGwgPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICByZXR1cm4gW10uY29uY2F0KHBhdHRlcm5zKS5ldmVyeShwID0+IHBpY29tYXRjaChwLCBvcHRpb25zKShzdHIpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGNhcHR1cmVkIGJ5IGBwYXR0ZXJuYCBpbiBgc3RyaW5nLCBvciBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZGlkIG5vdCBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5jYXB0dXJlKHBhdHRlcm4sIHN0cmluZ1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAndGVzdC9mb28uanMnKSk7XG4gKiAvLz0+IFsnZm9vJ11cbiAqIGNvbnNvbGUubG9nKG1tLmNhcHR1cmUoJ3Rlc3QvKi5qcycsICdmb28vYmFyLmNzcycpKTtcbiAqIC8vPT4gbnVsbFxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIG1hdGNoXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7QXJyYXl8bnVsbH0gUmV0dXJucyBhbiBhcnJheSBvZiBjYXB0dXJlcyBpZiB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZ2xvYiBwYXR0ZXJuLCBvdGhlcndpc2UgYG51bGxgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNhcHR1cmUgPSAoZ2xvYiwgaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBsZXQgcmVnZXggPSBwaWNvbWF0Y2gubWFrZVJlKFN0cmluZyhnbG9iKSwgeyAuLi5vcHRpb25zLCBjYXB0dXJlOiB0cnVlIH0pO1xuICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHBvc2l4ID8gdXRpbHMudG9Qb3NpeFNsYXNoZXMoaW5wdXQpIDogaW5wdXQpO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaC5zbGljZSgxKS5tYXAodiA9PiB2ID09PSB2b2lkIDAgPyAnJyA6IHYpO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYWtlUmUocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5tYWtlUmUoJyouanMnKSk7XG4gKiAvLz0+IC9eKD86KFxcLltcXFxcXFwvXSk/KD8hXFwuKSg/PS4pW15cXC9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEEgZ2xvYiBwYXR0ZXJuIHRvIGNvbnZlcnQgdG8gcmVnZXguXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9IFJldHVybnMgYSByZWdleCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHBhdHRlcm4uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWFrZVJlID0gKC4uLmFyZ3MpID0+IHBpY29tYXRjaC5tYWtlUmUoLi4uYXJncyk7XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLiBVc2VkXG4gKiBieSB0aGUgW3NwbGl0XSgjc3BsaXQpIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IG1tLnNjYW4ocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guc2NhbiA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2guc2NhbiguLi5hcmdzKTtcblxuLyoqXG4gKiBQYXJzZSBhIGdsb2IgcGF0dGVybiB0byBjcmVhdGUgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIGEgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IG1tLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZ2xvYmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5wYXJzZSA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzID0gW107XG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zIHx8IFtdKSkge1xuICAgIGZvciAobGV0IHN0ciBvZiBicmFjZXMoU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKSkge1xuICAgICAgcmVzLnB1c2gocGljb21hdGNoLnBhcnNlKHN0ciwgb3B0aW9ucykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSBnaXZlbiBicmFjZSBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHsgYnJhY2VzIH0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ2Zvby97YSxiLGN9L2JhcicpKTtcbiAqIC8vPT4gWyAnZm9vLyhhfGJ8YykvYmFyJyBdXG4gKlxuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInLCB7IGV4cGFuZDogdHJ1ZSB9KSk7XG4gKiAvLz0+IFsgJ2Zvby9hL2JhcicsICdmb28vYi9iYXInLCAnZm9vL2MvYmFyJyBdXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgU3RyaW5nIHdpdGggYnJhY2UgcGF0dGVybiB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBBbnkgW29wdGlvbnNdKCNvcHRpb25zKSB0byBjaGFuZ2UgaG93IGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQuIFNlZSB0aGUgW2JyYWNlc11bXSBsaWJyYXJ5IGZvciBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5icmFjZXMgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICBpZiAoKG9wdGlvbnMgJiYgb3B0aW9ucy5ub2JyYWNlID09PSB0cnVlKSB8fCAhL1xcey4qXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIFtwYXR0ZXJuXTtcbiAgfVxuICByZXR1cm4gYnJhY2VzKHBhdHRlcm4sIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmQgYnJhY2VzXG4gKi9cblxubWljcm9tYXRjaC5icmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIHJldHVybiBtaWNyb21hdGNoLmJyYWNlcyhwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGV4cGFuZDogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogRXhwb3NlIG1pY3JvbWF0Y2hcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvbWF0Y2g7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMgPSBleHBvcnRzLm1hdGNoQW55ID0gZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1JlID0gZXhwb3J0cy5tYWtlUmUgPSBleHBvcnRzLmdldFBhdHRlcm5QYXJ0cyA9IGV4cG9ydHMuZXhwYW5kQnJhY2VFeHBhbnNpb24gPSBleHBvcnRzLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uID0gZXhwb3J0cy5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybiA9IGV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZXhwb3J0cy5oYXNHbG9iU3RhciA9IGV4cG9ydHMuZ2V0QmFzZURpcmVjdG9yeSA9IGV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkgPSBleHBvcnRzLmdldFBvc2l0aXZlUGF0dGVybnMgPSBleHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnMgPSBleHBvcnRzLmlzUG9zaXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5pc05lZ2F0aXZlUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmlzRHluYW1pY1BhdHRlcm4gPSBleHBvcnRzLmlzU3RhdGljUGF0dGVybiA9IHZvaWQgMDtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGdsb2JQYXJlbnQgPSByZXF1aXJlKFwiZ2xvYi1wYXJlbnRcIik7XG5jb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZShcIm1pY3JvbWF0Y2hcIik7XG5jb25zdCBHTE9CU1RBUiA9ICcqKic7XG5jb25zdCBFU0NBUEVfU1lNQk9MID0gJ1xcXFwnO1xuY29uc3QgQ09NTU9OX0dMT0JfU1lNQk9MU19SRSA9IC9bKj9dfF4hLztcbmNvbnN0IFJFR0VYX0NIQVJBQ1RFUl9DTEFTU19TWU1CT0xTX1JFID0gL1xcW1teW10qXS87XG5jb25zdCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFID0gLyg/Ol58W14hKis/QF0pXFwoW14oXSpcXHxbXnxdKlxcKS87XG5jb25zdCBHTE9CX0VYVEVOU0lPTl9TWU1CT0xTX1JFID0gL1shKis/QF1cXChbXihdKlxcKS87XG5jb25zdCBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRSA9IC8sfFxcLlxcLi87XG4vKipcbiAqIE1hdGNoZXMgYSBzZXF1ZW5jZSBvZiB0d28gb3IgbW9yZSBjb25zZWN1dGl2ZSBzbGFzaGVzLCBleGNsdWRpbmcgdGhlIGZpcnN0IHR3byBzbGFzaGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy5cbiAqIFRoZSBsYXR0ZXIgaXMgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiB0aGUgZGV2aWNlIHBhdGggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgVU5DIHBhdGguXG4gKi9cbmNvbnN0IERPVUJMRV9TTEFTSF9SRSA9IC8oPyFeKVxcL3syLH0vZztcbmZ1bmN0aW9uIGlzU3RhdGljUGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gIWlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyk7XG59XG5leHBvcnRzLmlzU3RhdGljUGF0dGVybiA9IGlzU3RhdGljUGF0dGVybjtcbmZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsIGNhc2Ugd2l0aCBhbiBlbXB0eSBzdHJpbmcgaXMgbmVjZXNzYXJ5IGZvciBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoLlxuICAgICAqIEFuIGVtcHR5IHN0cmluZyBjYW5ub3QgYmUgYSBkeW5hbWljIHBhdHRlcm4uXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuIGAvbGliLypgIHdpbGwgYmUgc3ByZWFkIGludG8gcGFydHM6ICcnLCAnbGliJywgJyonLlxuICAgICAqL1xuICAgIGlmIChwYXR0ZXJuID09PSAnJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGBjYXNlU2Vuc2l0aXZlTWF0Y2hgIG9wdGlvbiBpcyBkaXNhYmxlZCwgYWxsIHBhdHRlcm5zIG11c3QgYmUgbWFya2VkIGFzIGR5bmFtaWMsIGJlY2F1c2Ugd2UgY2Fubm90IGNoZWNrXG4gICAgICogZmlsZXBhdGggZGlyZWN0bHkgKHdpdGhvdXQgcmVhZCBkaXJlY3RvcnkpLlxuICAgICAqL1xuICAgIGlmIChvcHRpb25zLmNhc2VTZW5zaXRpdmVNYXRjaCA9PT0gZmFsc2UgfHwgcGF0dGVybi5pbmNsdWRlcyhFU0NBUEVfU1lNQk9MKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENPTU1PTl9HTE9CX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSB8fCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pIHx8IFJFR0VYX0dST1VQX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXh0Z2xvYiAhPT0gZmFsc2UgJiYgR0xPQl9FWFRFTlNJT05fU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5icmFjZUV4cGFuc2lvbiAhPT0gZmFsc2UgJiYgaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XG5mdW5jdGlvbiBoYXNCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XG4gICAgY29uc3Qgb3BlbmluZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snKTtcbiAgICBpZiAob3BlbmluZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xvc2luZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ30nLCBvcGVuaW5nQnJhY2VJbmRleCArIDEpO1xuICAgIGlmIChjbG9zaW5nQnJhY2VJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBicmFjZUNvbnRlbnQgPSBwYXR0ZXJuLnNsaWNlKG9wZW5pbmdCcmFjZUluZGV4LCBjbG9zaW5nQnJhY2VJbmRleCk7XG4gICAgcmV0dXJuIEJSQUNFX0VYUEFOU0lPTl9TRVBBUkFUT1JTX1JFLnRlc3QoYnJhY2VDb250ZW50KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pID8gcGF0dGVybi5zbGljZSgxKSA6IHBhdHRlcm47XG59XG5leHBvcnRzLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybiA9IGNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuICchJyArIHBhdHRlcm47XG59XG5leHBvcnRzLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IGNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgcGF0dGVyblsxXSAhPT0gJygnO1xufVxuZXhwb3J0cy5pc05lZ2F0aXZlUGF0dGVybiA9IGlzTmVnYXRpdmVQYXR0ZXJuO1xuZnVuY3Rpb24gaXNQb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiAhaXNOZWdhdGl2ZVBhdHRlcm4ocGF0dGVybik7XG59XG5leHBvcnRzLmlzUG9zaXRpdmVQYXR0ZXJuID0gaXNQb3NpdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBnZXROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc05lZ2F0aXZlUGF0dGVybik7XG59XG5leHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnMgPSBnZXROZWdhdGl2ZVBhdHRlcm5zO1xuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNQb3NpdGl2ZVBhdHRlcm4pO1xufVxuZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucztcbi8qKlxuICogUmV0dXJucyBwYXR0ZXJucyB0aGF0IGNhbiBiZSBhcHBsaWVkIGluc2lkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFsnLi8qJywgJyonLCAnYS8qJ11cbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxuICovXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiAhaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pKTtcbn1cbmV4cG9ydHMuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5O1xuLyoqXG4gKiBSZXR1cm5zIHBhdHRlcm5zIHRvIGJlIGV4cGFuZGVkIHJlbGF0aXZlIHRvIChvdXRzaWRlKSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFsnLi4vKicsICcuLy4uLyonXVxuICogZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KFsnLi8qJywgJyonLCAnYS8qJywgJy4uLyonLCAnLi8uLi8qJ10pXG4gKi9cbmZ1bmN0aW9uIGdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSk7XG59XG5leHBvcnRzLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5O1xuZnVuY3Rpb24gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5zdGFydHNXaXRoKCcuLicpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnLi8uLicpO1xufVxuZXhwb3J0cy5pc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkgPSBpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3Rvcnk7XG5mdW5jdGlvbiBnZXRCYXNlRGlyZWN0b3J5KHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2xvYlBhcmVudChwYXR0ZXJuLCB7IGZsaXBCYWNrc2xhc2hlczogZmFsc2UgfSk7XG59XG5leHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBnZXRCYXNlRGlyZWN0b3J5O1xuZnVuY3Rpb24gaGFzR2xvYlN0YXIocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLmluY2x1ZGVzKEdMT0JTVEFSKTtcbn1cbmV4cG9ydHMuaGFzR2xvYlN0YXIgPSBoYXNHbG9iU3RhcjtcbmZ1bmN0aW9uIGVuZHNXaXRoU2xhc2hHbG9iU3RhcihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uZW5kc1dpdGgoJy8nICsgR0xPQlNUQVIpO1xufVxuZXhwb3J0cy5lbmRzV2l0aFNsYXNoR2xvYlN0YXIgPSBlbmRzV2l0aFNsYXNoR2xvYlN0YXI7XG5mdW5jdGlvbiBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhdHRlcm4pO1xuICAgIHJldHVybiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikgfHwgaXNTdGF0aWNQYXR0ZXJuKGJhc2VuYW1lKTtcbn1cbmV4cG9ydHMuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybjtcbmZ1bmN0aW9uIGV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uKHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLnJlZHVjZSgoY29sbGVjdGlvbiwgcGF0dGVybikgPT4ge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5jb25jYXQoZXhwYW5kQnJhY2VFeHBhbnNpb24ocGF0dGVybikpO1xuICAgIH0sIFtdKTtcbn1cbmV4cG9ydHMuZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24gPSBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbjtcbmZ1bmN0aW9uIGV4cGFuZEJyYWNlRXhwYW5zaW9uKHBhdHRlcm4pIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IG1pY3JvbWF0Y2guYnJhY2VzKHBhdHRlcm4sIHsgZXhwYW5kOiB0cnVlLCBub2R1cGVzOiB0cnVlLCBrZWVwRXNjYXBpbmc6IHRydWUgfSk7XG4gICAgLyoqXG4gICAgICogU29ydCB0aGUgcGF0dGVybnMgYnkgbGVuZ3RoIHNvIHRoYXQgdGhlIHNhbWUgZGVwdGggcGF0dGVybnMgYXJlIHByb2Nlc3NlZCBzaWRlIGJ5IHNpZGUuXG4gICAgICogYGEve2IsfS97Yyx9LypgIFx1MjAxMyBgWydhLy8vKicsICdhL2IvLyonLCAnYS8vYy8qJywgJ2EvYi9jLyonXWBcbiAgICAgKi9cbiAgICBwYXR0ZXJucy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcbiAgICAvKipcbiAgICAgKiBNaWNyb21hdGNoIGNhbiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBjYXNlIG9mIHBhdHRlcm5zIGxpa2UgYHthLH1gLlxuICAgICAqL1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4gIT09ICcnKTtcbn1cbmV4cG9ydHMuZXhwYW5kQnJhY2VFeHBhbnNpb24gPSBleHBhbmRCcmFjZUV4cGFuc2lvbjtcbmZ1bmN0aW9uIGdldFBhdHRlcm5QYXJ0cyhwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgbGV0IHsgcGFydHMgfSA9IG1pY3JvbWF0Y2guc2NhbihwYXR0ZXJuLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHBhcnRzOiB0cnVlIH0pKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpbiBzb21lIGNhc2VzLlxuICAgICAqIFNlZSBtaWNyb21hdGNoL3BpY29tYXRjaCM1OCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGFydHMgPSBbcGF0dGVybl07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzY2FuIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYW4gZW1wdHkgcGFydCBmb3IgdGhlIHBhdHRlcm4gd2l0aCBhIGZvcndhcmQgc2xhc2guXG4gICAgICogVGhpcyBpcyBhbm90aGVyIHBhcnQgb2YgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTguXG4gICAgICovXG4gICAgaWYgKHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwYXJ0c1swXSA9IHBhcnRzWzBdLnNsaWNlKDEpO1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuZXhwb3J0cy5nZXRQYXR0ZXJuUGFydHMgPSBnZXRQYXR0ZXJuUGFydHM7XG5mdW5jdGlvbiBtYWtlUmUocGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBtaWNyb21hdGNoLm1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMubWFrZVJlID0gbWFrZVJlO1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9SZShwYXR0ZXJucywgb3B0aW9ucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IG1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKSk7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvUmUgPSBjb252ZXJ0UGF0dGVybnNUb1JlO1xuZnVuY3Rpb24gbWF0Y2hBbnkoZW50cnksIHBhdHRlcm5zUmUpIHtcbiAgICByZXR1cm4gcGF0dGVybnNSZS5zb21lKChwYXR0ZXJuUmUpID0+IHBhdHRlcm5SZS50ZXN0KGVudHJ5KSk7XG59XG5leHBvcnRzLm1hdGNoQW55ID0gbWF0Y2hBbnk7XG4vKipcbiAqIFRoaXMgcGFja2FnZSBvbmx5IHdvcmtzIHdpdGggZm9yd2FyZCBzbGFzaGVzIGFzIGEgcGF0aCBzZXBhcmF0b3IuXG4gKiBCZWNhdXNlIG9mIHRoaXMsIHdlIGNhbm5vdCB1c2UgdGhlIHN0YW5kYXJkIGBwYXRoLm5vcm1hbGl6ZWAgbWV0aG9kLCBiZWNhdXNlIG9uIFdpbmRvd3MgcGxhdGZvcm0gaXQgd2lsbCB1c2Ugb2YgYmFja3NsYXNoZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoRE9VQkxFX1NMQVNIX1JFLCAnLycpO1xufVxuZXhwb3J0cy5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzID0gcmVtb3ZlRHVwbGljYXRlU2xhc2hlcztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2UgPSB2b2lkIDA7XG5jb25zdCBtZXJnZTIgPSByZXF1aXJlKFwibWVyZ2UyXCIpO1xuZnVuY3Rpb24gbWVyZ2Uoc3RyZWFtcykge1xuICAgIGNvbnN0IG1lcmdlZFN0cmVhbSA9IG1lcmdlMihzdHJlYW1zKTtcbiAgICBzdHJlYW1zLmZvckVhY2goKHN0cmVhbSkgPT4ge1xuICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IG1lcmdlZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG4gICAgfSk7XG4gICAgbWVyZ2VkU3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4gcHJvcGFnYXRlQ2xvc2VFdmVudFRvU291cmNlcyhzdHJlYW1zKSk7XG4gICAgbWVyZ2VkU3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xuICAgIHJldHVybiBtZXJnZWRTdHJlYW07XG59XG5leHBvcnRzLm1lcmdlID0gbWVyZ2U7XG5mdW5jdGlvbiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpIHtcbiAgICBzdHJlYW1zLmZvckVhY2goKHN0cmVhbSkgPT4gc3RyZWFtLmVtaXQoJ2Nsb3NlJykpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0VtcHR5ID0gZXhwb3J0cy5pc1N0cmluZyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5mdW5jdGlvbiBpc0VtcHR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ID09PSAnJztcbn1cbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0cmluZyA9IGV4cG9ydHMuc3RyZWFtID0gZXhwb3J0cy5wYXR0ZXJuID0gZXhwb3J0cy5wYXRoID0gZXhwb3J0cy5mcyA9IGV4cG9ydHMuZXJybm8gPSBleHBvcnRzLmFycmF5ID0gdm9pZCAwO1xuY29uc3QgYXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheVwiKTtcbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmNvbnN0IGVycm5vID0gcmVxdWlyZShcIi4vZXJybm9cIik7XG5leHBvcnRzLmVycm5vID0gZXJybm87XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2ZzXCIpO1xuZXhwb3J0cy5mcyA9IGZzO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCIuL3BhdGhcIik7XG5leHBvcnRzLnBhdGggPSBwYXRoO1xuY29uc3QgcGF0dGVybiA9IHJlcXVpcmUoXCIuL3BhdHRlcm5cIik7XG5leHBvcnRzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xuZXhwb3J0cy5zdHJlYW0gPSBzdHJlYW07XG5jb25zdCBzdHJpbmcgPSByZXF1aXJlKFwiLi9zdHJpbmdcIik7XG5leHBvcnRzLnN0cmluZyA9IHN0cmluZztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gZXhwb3J0cy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZSA9IGV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGV4cG9ydHMuZ2VuZXJhdGUgPSB2b2lkIDA7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGdlbmVyYXRlKGlucHV0LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcHJvY2Vzc1BhdHRlcm5zKGlucHV0LCBzZXR0aW5ncyk7XG4gICAgY29uc3QgaWdub3JlID0gcHJvY2Vzc1BhdHRlcm5zKHNldHRpbmdzLmlnbm9yZSwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKTtcbiAgICBjb25zdCBuZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUocGF0dGVybnMsIGlnbm9yZSk7XG4gICAgY29uc3Qgc3RhdGljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5pc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgc2V0dGluZ3MpKTtcbiAgICBjb25zdCBkeW5hbWljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3Qgc3RhdGljVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzKHN0YXRpY1BhdHRlcm5zLCBuZWdhdGl2ZVBhdHRlcm5zLCAvKiBkeW5hbWljICovIGZhbHNlKTtcbiAgICBjb25zdCBkeW5hbWljVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzKGR5bmFtaWNQYXR0ZXJucywgbmVnYXRpdmVQYXR0ZXJucywgLyogZHluYW1pYyAqLyB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGljVGFza3MuY29uY2F0KGR5bmFtaWNUYXNrcyk7XG59XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5mdW5jdGlvbiBwcm9jZXNzUGF0dGVybnMoaW5wdXQsIHNldHRpbmdzKSB7XG4gICAgbGV0IHBhdHRlcm5zID0gaW5wdXQ7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHBhdHRlcm4gbGlrZSBgeywqLCoqLGEvKn1gIGNhbiBsZWFkIHRvIHByb2JsZW1zIGNoZWNraW5nIHRoZSBkZXB0aCB3aGVuIG1hdGNoaW5nIGVudHJ5XG4gICAgICogYW5kIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgbWljcm9tYXRjaCBwYWNrYWdlIChzZWUgZmFzdC1nbG9iIGlzc3VlczogIzM2NSwgIzM5NCkuXG4gICAgICpcbiAgICAgKiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHdlIGV4cGFuZCBhbGwgcGF0dGVybnMgY29udGFpbmluZyBicmFjZSBleHBhbnNpb24uIFRoaXMgY2FuIGxlYWQgdG8gYSBzbGlnaHQgc2xvd2Rvd25cbiAgICAgKiBpbiBtYXRjaGluZyBpbiB0aGUgY2FzZSBvZiBhIGxhcmdlIHNldCBvZiBwYXR0ZXJucyBhZnRlciBleHBhbnNpb24uXG4gICAgICovXG4gICAgaWYgKHNldHRpbmdzLmJyYWNlRXhwYW5zaW9uKSB7XG4gICAgICAgIHBhdHRlcm5zID0gdXRpbHMucGF0dGVybi5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBgYmFzZU5hbWVNYXRjaGAgb3B0aW9uIGlzIGVuYWJsZWQsIHdlIG11c3QgYWRkIGdsb2JzdGFyIHRvIHBhdHRlcm5zLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWRcbiAgICAgKiBhdCBhbnkgbmVzdGluZyBsZXZlbC5cbiAgICAgKlxuICAgICAqIFdlIGRvIHRoaXMgaGVyZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb21wbGljYXRlIHRoZSBmaWx0ZXJpbmcgbG9naWMuIEZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAqIHRoZSBwYXR0ZXJuIGluIHRoZSBmaWx0ZXIgYmVmb3JlIGNyZWF0aW5nIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSB0aGUgcGF0dGVybnNcbiAgICAgKiBpbiB0aGUgYXBwbGljYXRpb24uIE9ubHkgb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIGlmIChzZXR0aW5ncy5iYXNlTmFtZU1hdGNoKSB7XG4gICAgICAgIHBhdHRlcm5zID0gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCcvJykgPyBwYXR0ZXJuIDogYCoqLyR7cGF0dGVybn1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYWxzbyByZW1vdmVzIGR1cGxpY2F0ZSBzbGFzaGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbiB0aGUgcGF0dGVybiBvciBmb3JtZWQgYXMgYSByZXN1bHQgb2YgZXhwYW5zaW9uLlxuICAgICAqL1xuICAgIHJldHVybiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4ucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyhwYXR0ZXJuKSk7XG59XG4vKipcbiAqIFJldHVybnMgdGFza3MgZ3JvdXBlZCBieSBiYXNpYyBwYXR0ZXJuIGRpcmVjdG9yaWVzLlxuICpcbiAqIFBhdHRlcm5zIHRoYXQgY2FuIGJlIGZvdW5kIGluc2lkZSAoYC4vYCkgYW5kIG91dHNpZGUgKGAuLi9gKSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS5cbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZGlyZWN0b3J5IHRyYXZlcnNhbCBzdGFydHMgYXQgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBnb2VzIGRlZXBlci5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcbiAgICBjb25zdCB0YXNrcyA9IFtdO1xuICAgIGNvbnN0IHBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkocG9zaXRpdmUpO1xuICAgIGNvbnN0IHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcbiAgICBjb25zdCBvdXRzaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KTtcbiAgICBjb25zdCBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSk7XG4gICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3Mob3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICAvKlxuICAgICAqIEZvciB0aGUgc2FrZSBvZiByZWR1Y2luZyBmdXR1cmUgYWNjZXNzZXMgdG8gdGhlIGZpbGUgc3lzdGVtLCB3ZSBtZXJnZSBhbGwgdGFza3Mgd2l0aGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuICAgICAqIGludG8gYSBnbG9iYWwgdGFzaywgaWYgYXQgbGVhc3Qgb25lIHBhdHRlcm4gcmVmZXJzIHRvIHRoZSByb290IChgLmApLiBJbiB0aGlzIGNhc2UsIHRoZSBnbG9iYWwgdGFzayBjb3ZlcnMgdGhlIHJlc3QuXG4gICAgICovXG4gICAgaWYgKCcuJyBpbiBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXApIHtcbiAgICAgICAgdGFza3MucHVzaChjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKCcuJywgcGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5LCBuZWdhdGl2ZSwgZHluYW1pYykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MoaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwLCBuZWdhdGl2ZSwgZHluYW1pYykpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza3M7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzO1xuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpO1xufVxuZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucztcbmZ1bmN0aW9uIGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpIHtcbiAgICBjb25zdCBuZWdhdGl2ZSA9IHV0aWxzLnBhdHRlcm4uZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykuY29uY2F0KGlnbm9yZSk7XG4gICAgY29uc3QgcG9zaXRpdmUgPSBuZWdhdGl2ZS5tYXAodXRpbHMucGF0dGVybi5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4pO1xuICAgIHJldHVybiBwb3NpdGl2ZTtcbn1cbmV4cG9ydHMuZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUgPSBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZTtcbmZ1bmN0aW9uIGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICBjb25zdCBncm91cCA9IHt9O1xuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHV0aWxzLnBhdHRlcm4uZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGJhc2UgaW4gY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29sbGVjdGlvbltiYXNlXS5wdXNoKHBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29sbGVjdGlvbltiYXNlXSA9IFtwYXR0ZXJuXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9LCBncm91cCk7XG59XG5leHBvcnRzLmdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5O1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwb3NpdGl2ZSkubWFwKChiYXNlKSA9PiB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlW2Jhc2VdLCBuZWdhdGl2ZSwgZHluYW1pYyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyA9IGNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcztcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soYmFzZSwgcG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZHluYW1pYyxcbiAgICAgICAgcG9zaXRpdmUsXG4gICAgICAgIG5lZ2F0aXZlLFxuICAgICAgICBiYXNlLFxuICAgICAgICBwYXR0ZXJuczogW10uY29uY2F0KHBvc2l0aXZlLCBuZWdhdGl2ZS5tYXAodXRpbHMucGF0dGVybi5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4pKVxuICAgIH07XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2sgPSBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuZnVuY3Rpb24gcmVhZChwYXRoLCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5sc3RhdChwYXRoLCAobHN0YXRFcnJvciwgbHN0YXQpID0+IHtcbiAgICAgICAgaWYgKGxzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0RXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCAhc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MuZnMuc3RhdChwYXRoLCAoc3RhdEVycm9yLCBzdGF0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MubWFya1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgIHN0YXQuaXNTeW1ib2xpY0xpbmsgPSAoKSA9PiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgc3RhdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcmVzdWx0KSB7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQocGF0aCwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBsc3RhdCA9IHNldHRpbmdzLmZzLmxzdGF0U3luYyhwYXRoKTtcbiAgICBpZiAoIWxzdGF0LmlzU3ltYm9saWNMaW5rKCkgfHwgIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGluaykge1xuICAgICAgICByZXR1cm4gbHN0YXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXQgPSBzZXR0aW5ncy5mcy5zdGF0U3luYyhwYXRoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLm1hcmtTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIHN0YXQuaXNTeW1ib2xpY0xpbmsgPSAoKSA9PiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIHJldHVybiBsc3RhdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luY1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKGZzTWV0aG9kcykge1xuICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xufVxuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9hZGFwdGVycy9mc1wiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnMgPSBmcy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlcih0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5tYXJrU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5tYXJrU3ltYm9saWNMaW5rLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIHRydWUpO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0YXRTeW5jID0gZXhwb3J0cy5zdGF0ID0gZXhwb3J0cy5TZXR0aW5ncyA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHN0YXQocGF0aCwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MoKSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayksIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMuc3RhdCA9IHN0YXQ7XG5mdW5jdGlvbiBzdGF0U3luYyhwYXRoLCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIHJldHVybiBzeW5jLnJlYWQocGF0aCwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5zdGF0U3luYyA9IHN0YXRTeW5jO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICIvKiEgcXVldWUtbWljcm90YXNrLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5sZXQgcHJvbWlzZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHF1ZXVlTWljcm90YXNrLmJpbmQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpXG4gIC8vIHJldXNlIHJlc29sdmVkIHByb21pc2UsIGFuZCBhbGxvY2F0ZSBpdCBsYXppbHlcbiAgOiBjYiA9PiAocHJvbWlzZSB8fCAocHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpKSlcbiAgICAudGhlbihjYilcbiAgICAuY2F0Y2goZXJyID0+IHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlcnIgfSwgMCkpXG4iLCAiLyohIHJ1bi1wYXJhbGxlbC4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xubW9kdWxlLmV4cG9ydHMgPSBydW5QYXJhbGxlbFxuXG5jb25zdCBxdWV1ZU1pY3JvdGFzayA9IHJlcXVpcmUoJ3F1ZXVlLW1pY3JvdGFzaycpXG5cbmZ1bmN0aW9uIHJ1blBhcmFsbGVsICh0YXNrcywgY2IpIHtcbiAgbGV0IHJlc3VsdHMsIHBlbmRpbmcsIGtleXNcbiAgbGV0IGlzU3luYyA9IHRydWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXNrcykpIHtcbiAgICByZXN1bHRzID0gW11cbiAgICBwZW5kaW5nID0gdGFza3MubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHRhc2tzKVxuICAgIHJlc3VsdHMgPSB7fVxuICAgIHBlbmRpbmcgPSBrZXlzLmxlbmd0aFxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZSAoZXJyKSB7XG4gICAgZnVuY3Rpb24gZW5kICgpIHtcbiAgICAgIGlmIChjYikgY2IoZXJyLCByZXN1bHRzKVxuICAgICAgY2IgPSBudWxsXG4gICAgfVxuICAgIGlmIChpc1N5bmMpIHF1ZXVlTWljcm90YXNrKGVuZClcbiAgICBlbHNlIGVuZCgpXG4gIH1cblxuICBmdW5jdGlvbiBlYWNoIChpLCBlcnIsIHJlc3VsdCkge1xuICAgIHJlc3VsdHNbaV0gPSByZXN1bHRcbiAgICBpZiAoLS1wZW5kaW5nID09PSAwIHx8IGVycikge1xuICAgICAgZG9uZShlcnIpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgLy8gZW1wdHlcbiAgICBkb25lKG51bGwpXG4gIH0gZWxzZSBpZiAoa2V5cykge1xuICAgIC8vIG9iamVjdFxuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB0YXNrc1trZXldKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyBlYWNoKGtleSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBhcnJheVxuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2ssIGkpIHtcbiAgICAgIHRhc2soZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goaSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlzU3luYyA9IGZhbHNlXG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMgPSB2b2lkIDA7XG5jb25zdCBOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUUyA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdCgnLicpO1xuaWYgKE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzBdID09PSB1bmRlZmluZWQgfHwgTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMV0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBiZWhhdmlvci4gVGhlICdwcm9jZXNzLnZlcnNpb25zLm5vZGUnIHZhcmlhYmxlIGhhcyBpbnZhbGlkIHZhbHVlOiAke3Byb2Nlc3MudmVyc2lvbnMubm9kZX1gKTtcbn1cbmNvbnN0IE1BSk9SX1ZFUlNJT04gPSBOdW1iZXIucGFyc2VJbnQoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMF0sIDEwKTtcbmNvbnN0IE1JTk9SX1ZFUlNJT04gPSBOdW1iZXIucGFyc2VJbnQoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMV0sIDEwKTtcbmNvbnN0IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OID0gMTA7XG5jb25zdCBTVVBQT1JURURfTUlOT1JfVkVSU0lPTiA9IDEwO1xuY29uc3QgSVNfTUFUQ0hFRF9CWV9NQUpPUiA9IE1BSk9SX1ZFUlNJT04gPiBTVVBQT1JURURfTUFKT1JfVkVSU0lPTjtcbmNvbnN0IElTX01BVENIRURfQllfTUFKT1JfQU5EX01JTk9SID0gTUFKT1JfVkVSU0lPTiA9PT0gU1VQUE9SVEVEX01BSk9SX1ZFUlNJT04gJiYgTUlOT1JfVkVSU0lPTiA+PSBTVVBQT1JURURfTUlOT1JfVkVSU0lPTjtcbi8qKlxuICogSVMgYHRydWVgIGZvciBOb2RlLmpzIDEwLjEwIGFuZCBncmVhdGVyLlxuICovXG5leHBvcnRzLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMgPSBJU19NQVRDSEVEX0JZX01BSk9SIHx8IElTX01BVENIRURfQllfTUFKT1JfQU5EX01JTk9SO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSB2b2lkIDA7XG5jbGFzcyBEaXJlbnRGcm9tU3RhdHMge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHN0YXRzKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuaXNCbG9ja0RldmljZSA9IHN0YXRzLmlzQmxvY2tEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNDaGFyYWN0ZXJEZXZpY2UgPSBzdGF0cy5pc0NoYXJhY3RlckRldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0RpcmVjdG9yeSA9IHN0YXRzLmlzRGlyZWN0b3J5LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRklGTyA9IHN0YXRzLmlzRklGTy5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZpbGUgPSBzdGF0cy5pc0ZpbGUuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTb2NrZXQgPSBzdGF0cy5pc1NvY2tldC5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1N5bWJvbGljTGluayA9IHN0YXRzLmlzU3ltYm9saWNMaW5rLmJpbmQoc3RhdHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cykge1xuICAgIHJldHVybiBuZXcgRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gY3JlYXRlRGlyZW50RnJvbVN0YXRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mcyA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vZnNcIik7XG5leHBvcnRzLmZzID0gZnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSB2b2lkIDA7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzKGEsIGIsIHNlcGFyYXRvcikge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNhc2VzIHdoZW4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSByb290IChgL2AsIGBDOi9gKSBvciBVTkMgcGF0aCAoYC8vPy9DOi9gKS5cbiAgICAgKi9cbiAgICBpZiAoYS5lbmRzV2l0aChzZXBhcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyBzZXBhcmF0b3IgKyBiO1xufVxuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZGRpciA9IGV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSBleHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IHJwbCA9IHJlcXVpcmUoXCJydW4tcGFyYWxsZWxcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIHJlYWQoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXNldHRpbmdzLnN0YXRzICYmIGNvbnN0YW50c18xLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMpIHtcbiAgICAgICAgcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMucmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9LCAocmVhZGRpckVycm9yLCBkaXJlbnRzKSA9PiB7XG4gICAgICAgIGlmIChyZWFkZGlyRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGRpcmVudHMubWFwKChkaXJlbnQpID0+ICh7XG4gICAgICAgICAgICBkaXJlbnQsXG4gICAgICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKVxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICghc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcykge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFza3MgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IG1ha2VScGxUYXNrRW50cnkoZW50cnksIHNldHRpbmdzKSk7XG4gICAgICAgIHJwbCh0YXNrcywgKHJwbEVycm9yLCBycGxFbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocnBsRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBycGxFcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcnBsRW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IHJlYWRkaXJXaXRoRmlsZVR5cGVzO1xuZnVuY3Rpb24gbWFrZVJwbFRhc2tFbnRyeShlbnRyeSwgc2V0dGluZ3MpIHtcbiAgICByZXR1cm4gKGRvbmUpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MuZnMuc3RhdChlbnRyeS5wYXRoLCAoc3RhdEVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJ5LmRpcmVudCA9IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhlbnRyeS5uYW1lLCBzdGF0cyk7XG4gICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5yZWFkZGlyKGRpcmVjdG9yeSwgKHJlYWRkaXJFcnJvciwgbmFtZXMpID0+IHtcbiAgICAgICAgaWYgKHJlYWRkaXJFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcmVhZGRpckVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgZnNTdGF0LnN0YXQocGF0aCwgc2V0dGluZ3MuZnNTdGF0U2V0dGluZ3MsIChlcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBycGwodGFza3MsIChycGxFcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJwbEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcnBsRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpciA9IHJlYWRkaXI7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJlc3VsdCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIHJlYWQoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGlmICghc2V0dGluZ3Muc3RhdHMgJiYgY29uc3RhbnRzXzEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZXR1cm4gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIHJldHVybiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gc2V0dGluZ3MuZnMucmVhZGRpclN5bmMoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMubWFwKChkaXJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBkaXJlbnQsXG4gICAgICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkgJiYgc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKGVudHJ5LnBhdGgpO1xuICAgICAgICAgICAgICAgIGVudHJ5LmRpcmVudCA9IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhlbnRyeS5uYW1lLCBzdGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gcmVhZGRpcldpdGhGaWxlVHlwZXM7XG5mdW5jdGlvbiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBuYW1lcyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIG5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBmc1N0YXQuc3RhdFN5bmMoZW50cnlQYXRoLCBzZXR0aW5ncy5mc1N0YXRTZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGVudHJ5UGF0aCxcbiAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyID0gcmVhZGRpcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmMsXG4gICAgcmVhZGRpcjogZnMucmVhZGRpcixcbiAgICByZWFkZGlyU3luYzogZnMucmVhZGRpclN5bmNcbn07XG5mdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcbiAgICBpZiAoZnNNZXRob2RzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSKSwgZnNNZXRob2RzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9hZGFwdGVycy9mc1wiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZnMgPSBmcy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlcih0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGguc2VwKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3RhdHMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnNTdGF0U2V0dGluZ3MgPSBuZXcgZnNTdGF0LlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGluazogdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuZnMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNldHRpbmdzID0gZXhwb3J0cy5zY2FuZGlyU3luYyA9IGV4cG9ydHMuc2NhbmRpciA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHNjYW5kaXIocGF0aCwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MoKSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayksIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMuc2NhbmRpciA9IHNjYW5kaXI7XG5mdW5jdGlvbiBzY2FuZGlyU3luYyhwYXRoLCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIHJldHVybiBzeW5jLnJlYWQocGF0aCwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5zY2FuZGlyU3luYyA9IHNjYW5kaXJTeW5jO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gcmV1c2lmeSAoQ29uc3RydWN0b3IpIHtcbiAgdmFyIGhlYWQgPSBuZXcgQ29uc3RydWN0b3IoKVxuICB2YXIgdGFpbCA9IGhlYWRcblxuICBmdW5jdGlvbiBnZXQgKCkge1xuICAgIHZhciBjdXJyZW50ID0gaGVhZFxuXG4gICAgaWYgKGN1cnJlbnQubmV4dCkge1xuICAgICAgaGVhZCA9IGN1cnJlbnQubmV4dFxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkID0gbmV3IENvbnN0cnVjdG9yKClcbiAgICAgIHRhaWwgPSBoZWFkXG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0ID0gbnVsbFxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2UgKG9iaikge1xuICAgIHRhaWwubmV4dCA9IG9ialxuICAgIHRhaWwgPSBvYmpcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0OiBnZXQsXG4gICAgcmVsZWFzZTogcmVsZWFzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmV1c2lmeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIHJldXNpZnkgPSByZXF1aXJlKCdyZXVzaWZ5JylcblxuZnVuY3Rpb24gZmFzdHF1ZXVlIChjb250ZXh0LCB3b3JrZXIsIGNvbmN1cnJlbmN5KSB7XG4gIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbmN1cnJlbmN5ID0gd29ya2VyXG4gICAgd29ya2VyID0gY29udGV4dFxuICAgIGNvbnRleHQgPSBudWxsXG4gIH1cblxuICBpZiAoY29uY3VycmVuY3kgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmYXN0cXVldWUgY29uY3VycmVuY3kgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpXG4gIH1cblxuICB2YXIgY2FjaGUgPSByZXVzaWZ5KFRhc2spXG4gIHZhciBxdWV1ZUhlYWQgPSBudWxsXG4gIHZhciBxdWV1ZVRhaWwgPSBudWxsXG4gIHZhciBfcnVubmluZyA9IDBcbiAgdmFyIGVycm9ySGFuZGxlciA9IG51bGxcblxuICB2YXIgc2VsZiA9IHtcbiAgICBwdXNoOiBwdXNoLFxuICAgIGRyYWluOiBub29wLFxuICAgIHNhdHVyYXRlZDogbm9vcCxcbiAgICBwYXVzZTogcGF1c2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBjb25jdXJyZW5jeTogY29uY3VycmVuY3ksXG4gICAgcnVubmluZzogcnVubmluZyxcbiAgICByZXN1bWU6IHJlc3VtZSxcbiAgICBpZGxlOiBpZGxlLFxuICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgIGdldFF1ZXVlOiBnZXRRdWV1ZSxcbiAgICB1bnNoaWZ0OiB1bnNoaWZ0LFxuICAgIGVtcHR5OiBub29wLFxuICAgIGtpbGw6IGtpbGwsXG4gICAga2lsbEFuZERyYWluOiBraWxsQW5kRHJhaW4sXG4gICAgZXJyb3I6IGVycm9yXG4gIH1cblxuICByZXR1cm4gc2VsZlxuXG4gIGZ1bmN0aW9uIHJ1bm5pbmcgKCkge1xuICAgIHJldHVybiBfcnVubmluZ1xuICB9XG5cbiAgZnVuY3Rpb24gcGF1c2UgKCkge1xuICAgIHNlbGYucGF1c2VkID0gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gbGVuZ3RoICgpIHtcbiAgICB2YXIgY3VycmVudCA9IHF1ZXVlSGVhZFxuICAgIHZhciBjb3VudGVyID0gMFxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcbiAgICAgIGNvdW50ZXIrK1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudGVyXG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBxdWV1ZUhlYWRcbiAgICB2YXIgdGFza3MgPSBbXVxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHRhc2tzLnB1c2goY3VycmVudC52YWx1ZSlcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcbiAgICB9XG5cbiAgICByZXR1cm4gdGFza3NcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZSAoKSB7XG4gICAgaWYgKCFzZWxmLnBhdXNlZCkgcmV0dXJuXG4gICAgc2VsZi5wYXVzZWQgPSBmYWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5jb25jdXJyZW5jeTsgaSsrKSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICByZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpZGxlICgpIHtcbiAgICByZXR1cm4gX3J1bm5pbmcgPT09IDAgJiYgc2VsZi5sZW5ndGgoKSA9PT0gMFxuICB9XG5cbiAgZnVuY3Rpb24gcHVzaCAodmFsdWUsIGRvbmUpIHtcbiAgICB2YXIgY3VycmVudCA9IGNhY2hlLmdldCgpXG5cbiAgICBjdXJyZW50LmNvbnRleHQgPSBjb250ZXh0XG4gICAgY3VycmVudC5yZWxlYXNlID0gcmVsZWFzZVxuICAgIGN1cnJlbnQudmFsdWUgPSB2YWx1ZVxuICAgIGN1cnJlbnQuY2FsbGJhY2sgPSBkb25lIHx8IG5vb3BcbiAgICBjdXJyZW50LmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlclxuXG4gICAgaWYgKF9ydW5uaW5nID09PSBzZWxmLmNvbmN1cnJlbmN5IHx8IHNlbGYucGF1c2VkKSB7XG4gICAgICBpZiAocXVldWVUYWlsKSB7XG4gICAgICAgIHF1ZXVlVGFpbC5uZXh0ID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgICAgc2VsZi5zYXR1cmF0ZWQoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LndvcmtlZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1bnNoaWZ0ICh2YWx1ZSwgZG9uZSkge1xuICAgIHZhciBjdXJyZW50ID0gY2FjaGUuZ2V0KClcblxuICAgIGN1cnJlbnQuY29udGV4dCA9IGNvbnRleHRcbiAgICBjdXJyZW50LnJlbGVhc2UgPSByZWxlYXNlXG4gICAgY3VycmVudC52YWx1ZSA9IHZhbHVlXG4gICAgY3VycmVudC5jYWxsYmFjayA9IGRvbmUgfHwgbm9vcFxuXG4gICAgaWYgKF9ydW5uaW5nID09PSBzZWxmLmNvbmN1cnJlbmN5IHx8IHNlbGYucGF1c2VkKSB7XG4gICAgICBpZiAocXVldWVIZWFkKSB7XG4gICAgICAgIGN1cnJlbnQubmV4dCA9IHF1ZXVlSGVhZFxuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgICAgc2VsZi5zYXR1cmF0ZWQoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LndvcmtlZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChob2xkZXIpIHtcbiAgICBpZiAoaG9sZGVyKSB7XG4gICAgICBjYWNoZS5yZWxlYXNlKGhvbGRlcilcbiAgICB9XG4gICAgdmFyIG5leHQgPSBxdWV1ZUhlYWRcbiAgICBpZiAobmV4dCkge1xuICAgICAgaWYgKCFzZWxmLnBhdXNlZCkge1xuICAgICAgICBpZiAocXVldWVUYWlsID09PSBxdWV1ZUhlYWQpIHtcbiAgICAgICAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcXVldWVIZWFkID0gbmV4dC5uZXh0XG4gICAgICAgIG5leHQubmV4dCA9IG51bGxcbiAgICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgbmV4dC52YWx1ZSwgbmV4dC53b3JrZWQpXG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmVtcHR5KClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3J1bm5pbmctLVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoLS1fcnVubmluZyA9PT0gMCkge1xuICAgICAgc2VsZi5kcmFpbigpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24ga2lsbCAoKSB7XG4gICAgcXVldWVIZWFkID0gbnVsbFxuICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICBzZWxmLmRyYWluID0gbm9vcFxuICB9XG5cbiAgZnVuY3Rpb24ga2lsbEFuZERyYWluICgpIHtcbiAgICBxdWV1ZUhlYWQgPSBudWxsXG4gICAgcXVldWVUYWlsID0gbnVsbFxuICAgIHNlbGYuZHJhaW4oKVxuICAgIHNlbGYuZHJhaW4gPSBub29wXG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciAoaGFuZGxlcikge1xuICAgIGVycm9ySGFuZGxlciA9IGhhbmRsZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIFRhc2sgKCkge1xuICB0aGlzLnZhbHVlID0gbnVsbFxuICB0aGlzLmNhbGxiYWNrID0gbm9vcFxuICB0aGlzLm5leHQgPSBudWxsXG4gIHRoaXMucmVsZWFzZSA9IG5vb3BcbiAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcblxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB0aGlzLndvcmtlZCA9IGZ1bmN0aW9uIHdvcmtlZCAoZXJyLCByZXN1bHQpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzZWxmLmNhbGxiYWNrXG4gICAgdmFyIGVycm9ySGFuZGxlciA9IHNlbGYuZXJyb3JIYW5kbGVyXG4gICAgdmFyIHZhbCA9IHNlbGYudmFsdWVcbiAgICBzZWxmLnZhbHVlID0gbnVsbFxuICAgIHNlbGYuY2FsbGJhY2sgPSBub29wXG4gICAgaWYgKHNlbGYuZXJyb3JIYW5kbGVyKSB7XG4gICAgICBlcnJvckhhbmRsZXIoZXJyLCB2YWwpXG4gICAgfVxuICAgIGNhbGxiYWNrLmNhbGwoc2VsZi5jb250ZXh0LCBlcnIsIHJlc3VsdClcbiAgICBzZWxmLnJlbGVhc2Uoc2VsZilcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZUFzUHJvbWlzZWQgKGNvbnRleHQsIHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uY3VycmVuY3kgPSB3b3JrZXJcbiAgICB3b3JrZXIgPSBjb250ZXh0XG4gICAgY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jV3JhcHBlciAoYXJnLCBjYikge1xuICAgIHdvcmtlci5jYWxsKHRoaXMsIGFyZylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgY2IobnVsbCwgcmVzKVxuICAgICAgfSwgY2IpXG4gIH1cblxuICB2YXIgcXVldWUgPSBmYXN0cXVldWUoY29udGV4dCwgYXN5bmNXcmFwcGVyLCBjb25jdXJyZW5jeSlcblxuICB2YXIgcHVzaENiID0gcXVldWUucHVzaFxuICB2YXIgdW5zaGlmdENiID0gcXVldWUudW5zaGlmdFxuXG4gIHF1ZXVlLnB1c2ggPSBwdXNoXG4gIHF1ZXVlLnVuc2hpZnQgPSB1bnNoaWZ0XG4gIHF1ZXVlLmRyYWluZWQgPSBkcmFpbmVkXG5cbiAgcmV0dXJuIHF1ZXVlXG5cbiAgZnVuY3Rpb24gcHVzaCAodmFsdWUpIHtcbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHB1c2hDYih2YWx1ZSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcClcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiB1bnNoaWZ0ICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdW5zaGlmdENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBMZXQncyBmb3JrIHRoZSBwcm9taXNlIGNoYWluIHRvXG4gICAgLy8gbWFrZSB0aGUgZXJyb3IgYnViYmxlIHVwIHRvIHRoZSB1c2VyIGJ1dFxuICAgIC8vIG5vdCBsZWFkIHRvIGEgdW5oYW5kbGVkUmVqZWN0aW9uXG4gICAgcC5jYXRjaChub29wKVxuXG4gICAgcmV0dXJuIHBcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWluZWQgKCkge1xuICAgIGlmIChxdWV1ZS5pZGxlKCkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRHJhaW4gPSBxdWV1ZS5kcmFpblxuXG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcXVldWUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZpb3VzRHJhaW4oKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHBcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhc3RxdWV1ZVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZSA9IHF1ZXVlQXNQcm9taXNlZFxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gZXhwb3J0cy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSBleHBvcnRzLmlzQXBwbGllZEZpbHRlciA9IGV4cG9ydHMuaXNGYXRhbEVycm9yID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNGYXRhbEVycm9yKHNldHRpbmdzLCBlcnJvcikge1xuICAgIGlmIChzZXR0aW5ncy5lcnJvckZpbHRlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICFzZXR0aW5ncy5lcnJvckZpbHRlcihlcnJvcik7XG59XG5leHBvcnRzLmlzRmF0YWxFcnJvciA9IGlzRmF0YWxFcnJvcjtcbmZ1bmN0aW9uIGlzQXBwbGllZEZpbHRlcihmaWx0ZXIsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIodmFsdWUpO1xufVxuZXhwb3J0cy5pc0FwcGxpZWRGaWx0ZXIgPSBpc0FwcGxpZWRGaWx0ZXI7XG5mdW5jdGlvbiByZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IoZmlsZXBhdGgsIHNlcGFyYXRvcikge1xuICAgIHJldHVybiBmaWxlcGF0aC5zcGxpdCgvWy9cXFxcXS8pLmpvaW4oc2VwYXJhdG9yKTtcbn1cbmV4cG9ydHMucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yID0gcmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yO1xuZnVuY3Rpb24gam9pblBhdGhTZWdtZW50cyhhLCBiLCBzZXBhcmF0b3IpIHtcbiAgICBpZiAoYSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNhc2VzIHdoZW4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSByb290IChgL2AsIGBDOi9gKSBvciBVTkMgcGF0aCAoYC8vPy9DOi9gKS5cbiAgICAgKi9cbiAgICBpZiAoYS5lbmRzV2l0aChzZXBhcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyBzZXBhcmF0b3IgKyBiO1xufVxuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNsYXNzIFJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yb290ID0gY29tbW9uLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcihfcm9vdCwgX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNvbnN0IGZhc3RxID0gcmVxdWlyZShcImZhc3RxXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBBc3luY1JlYWRlciBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoX3Jvb3QsIF9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9zY2FuZGlyID0gZnNTY2FuZGlyLnNjYW5kaXI7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gZmFzdHEodGhpcy5fd29ya2VyLmJpbmQodGhpcyksIHRoaXMuX3NldHRpbmdzLmNvbmN1cnJlbmN5KTtcbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmRyYWluID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0ZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzLmJhc2VQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbWl0dGVyO1xuICAgIH1cbiAgICBnZXQgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Rlc3Ryb3llZDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZWFkZXIgaXMgYWxyZWFkeSBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmtpbGxBbmREcmFpbigpO1xuICAgIH1cbiAgICBvbkVudHJ5KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub24oJ2VudHJ5JywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub25jZSgnZXJyb3InLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIG9uRW5kKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub25jZSgnZW5kJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBfcHVzaFRvUXVldWUoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IHsgZGlyZWN0b3J5LCBiYXNlIH07XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocXVldWVJdGVtLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF93b3JrZXIoaXRlbSwgZG9uZSkge1xuICAgICAgICB0aGlzLl9zY2FuZGlyKGl0ZW0uZGlyZWN0b3J5LCB0aGlzLl9zZXR0aW5ncy5mc1NjYW5kaXJTZXR0aW5ncywgKGVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb25lKGVycm9yLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVudHJ5KGVudHJ5LCBpdGVtLmJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZShudWxsLCB1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2hhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhY29tbW9uLmlzRmF0YWxFcnJvcih0aGlzLl9zZXR0aW5ncywgZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgICBfaGFuZGxlRW50cnkoZW50cnksIGJhc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2lzRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGJhc2UsIGVudHJ5Lm5hbWUsIHRoaXMuX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5lbnRyeUZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RW50cnkoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmRlZXBGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUoZnVsbHBhdGgsIGJhc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGVudHJ5LnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9lbWl0RW50cnkoZW50cnkpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlbnRyeScsIGVudHJ5KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBc3luY1JlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNsYXNzIEFzeW5jUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICB9XG4gICAgcmVhZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVuZCgoKSA9PiB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCB0aGlzLl9zdG9yYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXN5bmNQcm92aWRlcjtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcykge1xuICAgIGNhbGxiYWNrKG51bGwsIGVudHJpZXMpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL2FzeW5jXCIpO1xuY2xhc3MgU3RyZWFtUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3N0cmVhbSA9IG5ldyBzdHJlYW1fMS5SZWFkYWJsZSh7XG4gICAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgcmVhZDogKCkgPT4geyB9LFxuICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcmVhZGVyLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbnRyeSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVuZCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0ucHVzaChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJlYW07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3RyZWFtUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgU3luY1JlYWRlciBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9zY2FuZGlyID0gZnNTY2FuZGlyLnNjYW5kaXJTeW5jO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZSh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZVF1ZXVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICAgIH1cbiAgICBfcHVzaFRvUXVldWUoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmFkZCh7IGRpcmVjdG9yeSwgYmFzZSB9KTtcbiAgICB9XG4gICAgX2hhbmRsZVF1ZXVlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fcXVldWUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZURpcmVjdG9yeShpdGVtLmRpcmVjdG9yeSwgaXRlbS5iYXNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRGlyZWN0b3J5KGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuX3NjYW5kaXIoZGlyZWN0b3J5LCB0aGlzLl9zZXR0aW5ncy5mc1NjYW5kaXJTZXR0aW5ncyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICghY29tbW9uLmlzRmF0YWxFcnJvcih0aGlzLl9zZXR0aW5ncywgZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIF9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSkge1xuICAgICAgICBjb25zdCBmdWxscGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhiYXNlLCBlbnRyeS5uYW1lLCB0aGlzLl9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZW50cnlGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvU3RvcmFnZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZGVlcEZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZShmdWxscGF0aCwgYmFzZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZW50cnkucGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3B1c2hUb1N0b3JhZ2UoZW50cnkpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKGVudHJ5KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTeW5jUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3luY1wiKTtcbmNsYXNzIFN5bmNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTeW5jUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYmFzZVBhdGgsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRlZXBGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLmVudHJ5RmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5lbnRyeUZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMuZXJyb3JGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmVycm9yRmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGguc2VwKTtcbiAgICAgICAgdGhpcy5mc1NjYW5kaXJTZXR0aW5ncyA9IG5ldyBmc1NjYW5kaXIuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuX29wdGlvbnMuZnMsXG4gICAgICAgICAgICBwYXRoU2VnbWVudFNlcGFyYXRvcjogdGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvcixcbiAgICAgICAgICAgIHN0YXRzOiB0aGlzLl9vcHRpb25zLnN0YXRzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGlua1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXR0aW5ncyA9IGV4cG9ydHMud2Fsa1N0cmVhbSA9IGV4cG9ydHMud2Fsa1N5bmMgPSBleHBvcnRzLndhbGsgPSB2b2lkIDA7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3RyZWFtXCIpO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gd2FsayhkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuZXcgYXN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgZ2V0U2V0dGluZ3MoKSkucmVhZChvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBhc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spKS5yZWFkKGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMud2FsayA9IHdhbGs7XG5mdW5jdGlvbiB3YWxrU3luYyhkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbmV4cG9ydHMud2Fsa1N5bmMgPSB3YWxrU3luYztcbmZ1bmN0aW9uIHdhbGtTdHJlYW0oZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHN0cmVhbV8xLmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbmV4cG9ydHMud2Fsa1N0cmVhbSA9IHdhbGtTdHJlYW07XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIFJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuX3NldHRpbmdzLmZzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0RnVsbEVudHJ5UGF0aChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgZmlsZXBhdGgpO1xuICAgIH1cbiAgICBfbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgbmFtZTogcGF0dGVybixcbiAgICAgICAgICAgIHBhdGg6IHBhdHRlcm4sXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhwYXR0ZXJuLCBzdGF0cylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gICAgX2lzRmF0YWxFcnJvcihlcnJvcikge1xuICAgICAgICByZXR1cm4gIXV0aWxzLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSAmJiAhdGhpcy5fc2V0dGluZ3Muc3VwcHJlc3NFcnJvcnM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgUmVhZGVyU3RyZWFtIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtTdHJlYW0gPSBmc1dhbGsud2Fsa1N0cmVhbTtcbiAgICAgICAgdGhpcy5fc3RhdCA9IGZzU3RhdC5zdGF0O1xuICAgIH1cbiAgICBkeW5hbWljKHJvb3QsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtTdHJlYW0ocm9vdCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBmaWxlcGF0aHMgPSBwYXR0ZXJucy5tYXAodGhpcy5fZ2V0RnVsbEVudHJ5UGF0aCwgdGhpcyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgICAgIHN0cmVhbS5fd3JpdGUgPSAoaW5kZXgsIF9lbmMsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyeShmaWxlcGF0aHNbaW5kZXhdLCBwYXR0ZXJuc1tpbmRleF0sIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9PSBudWxsICYmIG9wdGlvbnMuZW50cnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBmaWxlcGF0aHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGRvbmUpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuICAgIF9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3RhdChmaWxlcGF0aClcbiAgICAgICAgICAgIC50aGVuKChzdGF0cykgPT4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0U3RhdChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdChmaWxlcGF0aCwgdGhpcy5fZnNTdGF0U2V0dGluZ3MsIChlcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgPT09IG51bGwgPyByZXNvbHZlKHN0YXRzKSA6IHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyU3RyZWFtO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xuY2xhc3MgUmVhZGVyQXN5bmMgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fd2Fsa0FzeW5jID0gZnNXYWxrLndhbGs7XG4gICAgICAgIHRoaXMuX3JlYWRlclN0cmVhbSA9IG5ldyBzdHJlYW1fMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93YWxrQXN5bmMocm9vdCwgb3B0aW9ucywgKGVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fcmVhZGVyU3RyZWFtLnN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEFmdGVyICMyMzUsIHJlcGxhY2UgaXQgd2l0aCBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgICAgICAgc3RyZWFtLm9uKCdkYXRhJywgKGVudHJ5KSA9PiBlbnRyaWVzLnB1c2goZW50cnkpKTtcbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiByZXNvbHZlKGVudHJpZXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyQXN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIE1hdGNoZXIge1xuICAgIGNvbnN0cnVjdG9yKF9wYXR0ZXJucywgX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fcGF0dGVybnMgPSBfcGF0dGVybnM7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgICAgICB0aGlzLl9maWxsU3RvcmFnZSgpO1xuICAgIH1cbiAgICBfZmlsbFN0b3JhZ2UoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLl9wYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLl9nZXRQYXR0ZXJuU2VnbWVudHMocGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpO1xuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogc2VjdGlvbnMubGVuZ3RoIDw9IDEsXG4gICAgICAgICAgICAgICAgcGF0dGVybixcbiAgICAgICAgICAgICAgICBzZWdtZW50cyxcbiAgICAgICAgICAgICAgICBzZWN0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFBhdHRlcm5TZWdtZW50cyhwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuUGFydHMocGF0dGVybiwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljID0gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhcnQsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgICAgIGlmICghZHluYW1pYykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0LFxuICAgICAgICAgICAgICAgIHBhdHRlcm5SZTogdXRpbHMucGF0dGVybi5tYWtlUmUocGFydCwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmFycmF5LnNwbGl0V2hlbihzZWdtZW50cywgKHNlZ21lbnQpID0+IHNlZ21lbnQuZHluYW1pYyAmJiB1dGlscy5wYXR0ZXJuLmhhc0dsb2JTdGFyKHNlZ21lbnQucGF0dGVybikpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE1hdGNoZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBtYXRjaGVyXzEgPSByZXF1aXJlKFwiLi9tYXRjaGVyXCIpO1xuY2xhc3MgUGFydGlhbE1hdGNoZXIgZXh0ZW5kcyBtYXRjaGVyXzEuZGVmYXVsdCB7XG4gICAgbWF0Y2goZmlsZXBhdGgpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWxlcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBsZXZlbHMgPSBwYXJ0cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5fc3RvcmFnZS5maWx0ZXIoKGluZm8pID0+ICFpbmZvLmNvbXBsZXRlIHx8IGluZm8uc2VnbWVudHMubGVuZ3RoID4gbGV2ZWxzKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gcGF0dGVybi5zZWN0aW9uc1swXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBoYXMgYSBnbG9ic3RhciBhbmQgd2UgbXVzdCByZWFkIGFsbCBkaXJlY3RvcmllcyB1bmNvbmRpdGlvbmFsbHksXG4gICAgICAgICAgICAgKiBidXQgb25seSBpZiB0aGUgbGV2ZWwgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgZ3JvdXAuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogZml4dHVyZXMve2EsYn0vKipcbiAgICAgICAgICAgICAqICBeIHRydWUvZmFsc2UgIF4gYWx3YXlzIHRydWVcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4uY29tcGxldGUgJiYgbGV2ZWxzID4gc2VjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcGFydHMuZXZlcnkoKHBhcnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHBhdHRlcm4uc2VnbWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuUmUudGVzdChwYXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuID09PSBwYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQYXJ0aWFsTWF0Y2hlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY29uc3QgcGFydGlhbF8xID0gcmVxdWlyZShcIi4uL21hdGNoZXJzL3BhcnRpYWxcIik7XG5jbGFzcyBEZWVwRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XG4gICAgfVxuICAgIGdldEZpbHRlcihiYXNlUGF0aCwgcG9zaXRpdmUsIG5lZ2F0aXZlKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXIgPSB0aGlzLl9nZXRNYXRjaGVyKHBvc2l0aXZlKTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHRoaXMuX2dldE5lZ2F0aXZlUGF0dGVybnNSZShuZWdhdGl2ZSk7XG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX2ZpbHRlcihiYXNlUGF0aCwgZW50cnksIG1hdGNoZXIsIG5lZ2F0aXZlUmUpO1xuICAgIH1cbiAgICBfZ2V0TWF0Y2hlcihwYXR0ZXJucykge1xuICAgICAgICByZXR1cm4gbmV3IHBhcnRpYWxfMS5kZWZhdWx0KHBhdHRlcm5zLCB0aGlzLl9zZXR0aW5ncywgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgIH1cbiAgICBfZ2V0TmVnYXRpdmVQYXR0ZXJuc1JlKHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IGFmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIodXRpbHMucGF0dGVybi5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybik7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUoYWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJucywgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgIH1cbiAgICBfZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSkge1xuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlEZWVwKGJhc2VQYXRoLCBlbnRyeS5wYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRTeW1ib2xpY0xpbmsoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSB1dGlscy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5LnBhdGgpO1xuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlQb3NpdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1NraXBwZWRCeU5lZ2F0aXZlUGF0dGVybnMoZmlsZXBhdGgsIG5lZ2F0aXZlUmUpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlEZWVwKGJhc2VQYXRoLCBlbnRyeVBhdGgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF2b2lkIHVubmVjZXNzYXJ5IGRlcHRoIGNhbGN1bGF0aW9ucyB3aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmRlZXAgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJ5TGV2ZWwoYmFzZVBhdGgsIGVudHJ5UGF0aCkgPj0gdGhpcy5fc2V0dGluZ3MuZGVlcDtcbiAgICB9XG4gICAgX2dldEVudHJ5TGV2ZWwoYmFzZVBhdGgsIGVudHJ5UGF0aCkge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGhEZXB0aCA9IGVudHJ5UGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5UGF0aERlcHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoRGVwdGggPSBiYXNlUGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGVudHJ5UGF0aERlcHRoIC0gYmFzZVBhdGhEZXB0aDtcbiAgICB9XG4gICAgX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MgJiYgZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeVBvc2l0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBtYXRjaGVyKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCAmJiAhbWF0Y2hlci5tYXRjaChlbnRyeVBhdGgpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgcGF0dGVybnNSZSkge1xuICAgICAgICByZXR1cm4gIXV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEZWVwRmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFbnRyeUZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIocG9zaXRpdmUsIG5lZ2F0aXZlKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlUmUgPSB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUocG9zaXRpdmUsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHV0aWxzLnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShuZWdhdGl2ZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyksIHsgZG90OiB0cnVlIH0pKTtcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGVudHJ5LCBwb3NpdGl2ZVJlLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2ZpbHRlcihlbnRyeSwgcG9zaXRpdmVSZSwgbmVnYXRpdmVSZSkge1xuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHV0aWxzLnBhdGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkucGF0aCk7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgdGhpcy5faXNEdXBsaWNhdGVFbnRyeShmaWxlcGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb25seUZpbGVGaWx0ZXIoZW50cnkpIHx8IHRoaXMuX29ubHlEaXJlY3RvcnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5QWJzb2x1dGVOZWdhdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGlzTWF0Y2hlZCA9IHRoaXMuX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBwb3NpdGl2ZVJlLCBpc0RpcmVjdG9yeSkgJiYgIXRoaXMuX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlLCBpc0RpcmVjdG9yeSk7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgaXNNYXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVJbmRleFJlY29yZChmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDtcbiAgICB9XG4gICAgX2lzRHVwbGljYXRlRW50cnkoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaGFzKGZpbGVwYXRoKTtcbiAgICB9XG4gICAgX2NyZWF0ZUluZGV4UmVjb3JkKGZpbGVwYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXguc2V0KGZpbGVwYXRoLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBfb25seUZpbGVGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlGaWxlcyAmJiAhZW50cnkuZGlyZW50LmlzRmlsZSgpO1xuICAgIH1cbiAgICBfb25seURpcmVjdG9yeUZpbHRlcihlbnRyeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Mub25seURpcmVjdG9yaWVzICYmICFlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5QWJzb2x1dGVOZWdhdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgcGF0dGVybnNSZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzLmFic29sdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB1dGlscy5wYXRoLm1ha2VBYnNvbHV0ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGVudHJ5UGF0aCk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZ1bGxwYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICB9XG4gICAgX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBwYXR0ZXJuc1JlLCBpc0RpcmVjdG9yeSkge1xuICAgICAgICAvLyBUcnlpbmcgdG8gbWF0Y2ggZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGJ5IHBhdHRlcm5zLlxuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZpbGVwYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICAgICAgLy8gQSBwYXR0ZXJuIHdpdGggYSB0cmFpbGxpbmcgc2xhc2ggY2FuIGJlIHVzZWQgZm9yIGRpcmVjdG9yeSBtYXRjaGluZy5cbiAgICAgICAgLy8gVG8gYXBwbHkgc3VjaCBwYXR0ZXJuLCB3ZSBuZWVkIHRvIGFkZCBhIHRyYWxsaW5nIHNsYXNoIHRvIHRoZSBwYXRoLlxuICAgICAgICBpZiAoIWlzTWF0Y2hlZCAmJiBpc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZmlsZXBhdGggKyAnLycsIHBhdHRlcm5zUmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc01hdGNoZWQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRW50cnlGaWx0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIEVycm9yRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIChlcnJvcikgPT4gdGhpcy5faXNOb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgX2lzTm9uRmF0YWxFcnJvcihlcnJvcikge1xuICAgICAgICByZXR1cm4gdXRpbHMuZXJybm8uaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHx8IHRoaXMuX3NldHRpbmdzLnN1cHByZXNzRXJyb3JzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVycm9yRmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFbnRyeVRyYW5zZm9ybWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldFRyYW5zZm9ybWVyKCkge1xuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl90cmFuc2Zvcm0oZW50cnkpO1xuICAgIH1cbiAgICBfdHJhbnNmb3JtKGVudHJ5KSB7XG4gICAgICAgIGxldCBmaWxlcGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgZmlsZXBhdGggPSB1dGlscy5wYXRoLm1ha2VBYnNvbHV0ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC51bml4aWZ5KGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWFya0RpcmVjdG9yaWVzICYmIGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBmaWxlcGF0aCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5vYmplY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpLCB7IHBhdGg6IGZpbGVwYXRoIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVudHJ5VHJhbnNmb3JtZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBkZWVwXzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2RlZXBcIik7XG5jb25zdCBlbnRyeV8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9lbnRyeVwiKTtcbmNvbnN0IGVycm9yXzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2Vycm9yXCIpO1xuY29uc3QgZW50cnlfMiA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybWVycy9lbnRyeVwiKTtcbmNsYXNzIFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuZXJyb3JGaWx0ZXIgPSBuZXcgZXJyb3JfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5lbnRyeUZpbHRlciA9IG5ldyBlbnRyeV8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSBuZXcgZGVlcF8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLmVudHJ5VHJhbnNmb3JtZXIgPSBuZXcgZW50cnlfMi5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgX2dldFJvb3REaXJlY3RvcnkodGFzaykge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgdGFzay5iYXNlKTtcbiAgICB9XG4gICAgX2dldFJlYWRlck9wdGlvbnModGFzaykge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHRhc2suYmFzZSA9PT0gJy4nID8gJycgOiB0YXNrLmJhc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiAnLycsXG4gICAgICAgICAgICBjb25jdXJyZW5jeTogdGhpcy5fc2V0dGluZ3MuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBkZWVwRmlsdGVyOiB0aGlzLmRlZXBGaWx0ZXIuZ2V0RmlsdGVyKGJhc2VQYXRoLCB0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcbiAgICAgICAgICAgIGVudHJ5RmlsdGVyOiB0aGlzLmVudHJ5RmlsdGVyLmdldEZpbHRlcih0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcbiAgICAgICAgICAgIGVycm9yRmlsdGVyOiB0aGlzLmVycm9yRmlsdGVyLmdldEZpbHRlcigpLFxuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcbiAgICAgICAgICAgIHN0YXRzOiB0aGlzLl9zZXR0aW5ncy5zdGF0cyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLmVudHJ5VHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXIoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBfZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb3Q6IHRoaXMuX3NldHRpbmdzLmRvdCxcbiAgICAgICAgICAgIG1hdGNoQmFzZTogdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCxcbiAgICAgICAgICAgIG5vYnJhY2U6ICF0aGlzLl9zZXR0aW5ncy5icmFjZUV4cGFuc2lvbixcbiAgICAgICAgICAgIG5vY2FzZTogIXRoaXMuX3NldHRpbmdzLmNhc2VTZW5zaXRpdmVNYXRjaCxcbiAgICAgICAgICAgIG5vZXh0OiAhdGhpcy5fc2V0dGluZ3MuZXh0Z2xvYixcbiAgICAgICAgICAgIG5vZ2xvYnN0YXI6ICF0aGlzLl9zZXR0aW5ncy5nbG9ic3RhcixcbiAgICAgICAgICAgIHBvc2l4OiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0U2xhc2hlczogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyQXN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpO1xuICAgIH1cbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXJBc3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IHN0cmVhbV8yID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3RyZWFtXCIpO1xuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xuY2xhc3MgUHJvdmlkZXJTdHJlYW0gZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3RyZWFtXzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBzdHJlYW1fMS5SZWFkYWJsZSh7IG9iamVjdE1vZGU6IHRydWUsIHJlYWQ6ICgpID0+IHsgfSB9KTtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2Vycm9yJywgZXJyb3IpKVxuICAgICAgICAgICAgLm9uKCdkYXRhJywgKGVudHJ5KSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdkYXRhJywgb3B0aW9ucy50cmFuc2Zvcm0oZW50cnkpKSlcbiAgICAgICAgICAgIC5vbmNlKCdlbmQnLCAoKSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdlbmQnKSk7XG4gICAgICAgIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICAub25jZSgnY2xvc2UnLCAoKSA9PiBzb3VyY2UuZGVzdHJveSgpKTtcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgIH1cbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXJTdHJlYW07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBSZWFkZXJTeW5jIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtTeW5jID0gZnNXYWxrLndhbGtTeW5jO1xuICAgICAgICB0aGlzLl9zdGF0U3luYyA9IGZzU3RhdC5zdGF0U3luYztcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3luYyhyb290LCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHRoaXMuX2dldEZ1bGxFbnRyeVBhdGgocGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gbnVsbCB8fCAhb3B0aW9ucy5lbnRyeUZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIF9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLl9nZXRTdGF0KGZpbGVwYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYWtlRW50cnkoc3RhdHMsIHBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3JGaWx0ZXIoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0U3RhdChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdFN5bmMoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJTeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3luY1wiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyU3luYyBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKG9wdGlvbnMudHJhbnNmb3JtKTtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyU3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBvcyA9IHJlcXVpcmUoXCJvc1wiKTtcbi8qKlxuICogVGhlIGBvcy5jcHVzYCBtZXRob2QgY2FuIHJldHVybiB6ZXJvLiBXZSBleHBlY3QgdGhlIG51bWJlciBvZiBjb3JlcyB0byBiZSBncmVhdGVyIHRoYW4gemVyby5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzdmYWVkZGYyM2E5OGM1Mzg5NmY4YjU3NGE2ZTY2NTg5ZThmYjFlYjgvbGliL29zLmpzI0wxMDYtTDEwN1xuICovXG5jb25zdCBDUFVfQ09VTlQgPSBNYXRoLm1heChvcy5jcHVzKCkubGVuZ3RoLCAxKTtcbmV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luYyxcbiAgICByZWFkZGlyOiBmcy5yZWFkZGlyLFxuICAgIHJlYWRkaXJTeW5jOiBmcy5yZWFkZGlyU3luY1xufTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYWJzb2x1dGUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYXNlTmFtZU1hdGNoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5iYXNlTmFtZU1hdGNoLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuYnJhY2VFeHBhbnNpb24gPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJyYWNlRXhwYW5zaW9uLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNhc2VTZW5zaXRpdmVNYXRjaCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5LCBDUFVfQ09VTlQpO1xuICAgICAgICB0aGlzLmN3ZCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY3dkLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICAgICAgdGhpcy5kZWVwID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kZWVwLCBJbmZpbml0eSk7XG4gICAgICAgIHRoaXMuZG90ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kb3QsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5leHRnbG9iID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5leHRnbG9iLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mcyA9IHRoaXMuX2dldEZpbGVTeXN0ZW1NZXRob2RzKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLmdsb2JzdGFyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5nbG9ic3RhciwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuaWdub3JlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5pZ25vcmUsIFtdKTtcbiAgICAgICAgdGhpcy5tYXJrRGlyZWN0b3JpZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm1hcmtEaXJlY3RvcmllcywgZmFsc2UpO1xuICAgICAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9iamVjdE1vZGUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vbmx5RGlyZWN0b3JpZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9ubHlEaXJlY3RvcmllcywgZmFsc2UpO1xuICAgICAgICB0aGlzLm9ubHlGaWxlcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMub25seUZpbGVzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3RhdHMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0Vycm9ycyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3VwcHJlc3NFcnJvcnMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgZmFsc2UpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudW5pcXVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMub25seURpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm9ubHlGaWxlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRzKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdE1vZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2FzdCB0byB0aGUgYXJyYXkgaW4gdGhlIG5leHQgbWFqb3IgKCM0MDQpLlxuICAgICAgICB0aGlzLmlnbm9yZSA9IFtdLmNvbmNhdCh0aGlzLmlnbm9yZSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogb3B0aW9uO1xuICAgIH1cbiAgICBfZ2V0RmlsZVN5c3RlbU1ldGhvZHMobWV0aG9kcyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSKSwgbWV0aG9kcyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCB0YXNrTWFuYWdlciA9IHJlcXVpcmUoXCIuL21hbmFnZXJzL3Rhc2tzXCIpO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmFzeW5jIGZ1bmN0aW9uIEZhc3RHbG9iKHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgYXN5bmNfMS5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbCh3b3Jrcyk7XG4gICAgcmV0dXJuIHV0aWxzLmFycmF5LmZsYXR0ZW4ocmVzdWx0KTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzbGludC9pc3N1ZXMvNjBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbihmdW5jdGlvbiAoRmFzdEdsb2IpIHtcbiAgICBGYXN0R2xvYi5nbG9iID0gRmFzdEdsb2I7XG4gICAgRmFzdEdsb2IuZ2xvYlN5bmMgPSBzeW5jO1xuICAgIEZhc3RHbG9iLmdsb2JTdHJlYW0gPSBzdHJlYW07XG4gICAgRmFzdEdsb2IuYXN5bmMgPSBGYXN0R2xvYjtcbiAgICBmdW5jdGlvbiBzeW5jKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHdvcmtzKTtcbiAgICB9XG4gICAgRmFzdEdsb2Iuc3luYyA9IHN5bmM7XG4gICAgZnVuY3Rpb24gc3RyZWFtKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzdHJlYW1fMS5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzdHJlYW0gcmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyIGNhbm5vdCB3b3JrIHdpdGggYW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLlxuICAgICAgICAgKiBUbyBzdXBwb3J0IGFzeW5jaHJvbm91cyBpdGVyYXRvcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiB0YXNrcywgd2UgYWx3YXlzIG11bHRpcGxleCBzdHJlYW1zLlxuICAgICAgICAgKiBUaGlzIGFmZmVjdHMgcGVyZm9ybWFuY2UgKCsyNSUpLiBJIGRvbid0IHNlZSBiZXN0IHNvbHV0aW9uIHJpZ2h0IG5vdy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiB1dGlscy5zdHJlYW0ubWVyZ2Uod29ya3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5zdHJlYW0gPSBzdHJlYW07XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrcyhzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IFtdLmNvbmNhdChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0YXNrTWFuYWdlci5nZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5nZW5lcmF0ZVRhc2tzID0gZ2VuZXJhdGVUYXNrcztcbiAgICBmdW5jdGlvbiBpc0R5bmFtaWNQYXR0ZXJuKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihzb3VyY2UsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XG4gICAgZnVuY3Rpb24gZXNjYXBlUGF0aChzb3VyY2UpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGUoc291cmNlKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XG4gICAgZnVuY3Rpb24gY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuY29udmVydFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UGF0aFRvUGF0dGVybjtcbiAgICBsZXQgcG9zaXg7XG4gICAgKGZ1bmN0aW9uIChwb3NpeCkge1xuICAgICAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlUG9zaXhQYXRoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zaXguZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XG4gICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguY29udmVydFBvc2l4UGF0aFRvUGF0dGVybihzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHBvc2l4LmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgfSkocG9zaXggPSBGYXN0R2xvYi5wb3NpeCB8fCAoRmFzdEdsb2IucG9zaXggPSB7fSkpO1xuICAgIGxldCB3aW4zMjtcbiAgICAoZnVuY3Rpb24gKHdpbjMyKSB7XG4gICAgICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGVXaW5kb3dzUGF0aChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHdpbjMyLmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgICAgICBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybihzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHdpbjMyLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgfSkod2luMzIgPSBGYXN0R2xvYi53aW4zMiB8fCAoRmFzdEdsb2Iud2luMzIgPSB7fSkpO1xufSkoRmFzdEdsb2IgfHwgKEZhc3RHbG9iID0ge30pKTtcbmZ1bmN0aW9uIGdldFdvcmtzKHNvdXJjZSwgX1Byb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBbXS5jb25jYXQoc291cmNlKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgY29uc3QgdGFza3MgPSB0YXNrTWFuYWdlci5nZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IF9Qcm92aWRlcihzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHRhc2tzLm1hcChwcm92aWRlci5yZWFkLCBwcm92aWRlcik7XG59XG5mdW5jdGlvbiBhc3NlcnRQYXR0ZXJuc0lucHV0KGlucHV0KSB7XG4gICAgY29uc3Qgc291cmNlID0gW10uY29uY2F0KGlucHV0KTtcbiAgICBjb25zdCBpc1ZhbGlkU291cmNlID0gc291cmNlLmV2ZXJ5KChpdGVtKSA9PiB1dGlscy5zdHJpbmcuaXNTdHJpbmcoaXRlbSkgJiYgIXV0aWxzLnN0cmluZy5pc0VtcHR5KGl0ZW0pKTtcbiAgICBpZiAoIWlzVmFsaWRTb3VyY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0dGVybnMgbXVzdCBiZSBhIHN0cmluZyAobm9uIGVtcHR5KSBvciBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBGYXN0R2xvYjtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCB7cHJvbWlzaWZ5fSA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuYXN5bmMgZnVuY3Rpb24gaXNUeXBlKGZzU3RhdFR5cGUsIHN0YXRzTWV0aG9kTmFtZSwgZmlsZVBhdGgpIHtcblx0aWYgKHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZywgZ290ICR7dHlwZW9mIGZpbGVQYXRofWApO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb25zdCBzdGF0cyA9IGF3YWl0IHByb21pc2lmeShmc1tmc1N0YXRUeXBlXSkoZmlsZVBhdGgpO1xuXHRcdHJldHVybiBzdGF0c1tzdGF0c01ldGhvZE5hbWVdKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNUeXBlU3luYyhmc1N0YXRUeXBlLCBzdGF0c01ldGhvZE5hbWUsIGZpbGVQYXRoKSB7XG5cdGlmICh0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiBmaWxlUGF0aH1gKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0cmV0dXJuIGZzW2ZzU3RhdFR5cGVdKGZpbGVQYXRoKVtzdGF0c01ldGhvZE5hbWVdKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cbn1cblxuZXhwb3J0cy5pc0ZpbGUgPSBpc1R5cGUuYmluZChudWxsLCAnc3RhdCcsICdpc0ZpbGUnKTtcbmV4cG9ydHMuaXNEaXJlY3RvcnkgPSBpc1R5cGUuYmluZChudWxsLCAnc3RhdCcsICdpc0RpcmVjdG9yeScpO1xuZXhwb3J0cy5pc1N5bWxpbmsgPSBpc1R5cGUuYmluZChudWxsLCAnbHN0YXQnLCAnaXNTeW1ib2xpY0xpbmsnKTtcbmV4cG9ydHMuaXNGaWxlU3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnc3RhdFN5bmMnLCAnaXNGaWxlJyk7XG5leHBvcnRzLmlzRGlyZWN0b3J5U3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnc3RhdFN5bmMnLCAnaXNEaXJlY3RvcnknKTtcbmV4cG9ydHMuaXNTeW1saW5rU3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnbHN0YXRTeW5jJywgJ2lzU3ltYm9saWNMaW5rJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHBhdGhUeXBlID0gcmVxdWlyZSgncGF0aC10eXBlJyk7XG5cbmNvbnN0IGdldEV4dGVuc2lvbnMgPSBleHRlbnNpb25zID0+IGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGB7JHtleHRlbnNpb25zLmpvaW4oJywnKX19YCA6IGV4dGVuc2lvbnNbMF07XG5cbmNvbnN0IGdldFBhdGggPSAoZmlsZXBhdGgsIGN3ZCkgPT4ge1xuXHRjb25zdCBwdGggPSBmaWxlcGF0aFswXSA9PT0gJyEnID8gZmlsZXBhdGguc2xpY2UoMSkgOiBmaWxlcGF0aDtcblx0cmV0dXJuIHBhdGguaXNBYnNvbHV0ZShwdGgpID8gcHRoIDogcGF0aC5qb2luKGN3ZCwgcHRoKTtcbn07XG5cbmNvbnN0IGFkZEV4dGVuc2lvbnMgPSAoZmlsZSwgZXh0ZW5zaW9ucykgPT4ge1xuXHRpZiAocGF0aC5leHRuYW1lKGZpbGUpKSB7XG5cdFx0cmV0dXJuIGAqKi8ke2ZpbGV9YDtcblx0fVxuXG5cdHJldHVybiBgKiovJHtmaWxlfS4ke2dldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyl9YDtcbn07XG5cbmNvbnN0IGdldEdsb2IgPSAoZGlyZWN0b3J5LCBvcHRpb25zKSA9PiB7XG5cdGlmIChvcHRpb25zLmZpbGVzICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsZXMpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgZmlsZXNcXGAgdG8gYmUgb2YgdHlwZSBcXGBBcnJheVxcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmZpbGVzfVxcYGApO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZXh0ZW5zaW9ucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmV4dGVuc2lvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgZXh0ZW5zaW9uc1xcYCB0byBiZSBvZiB0eXBlIFxcYEFycmF5XFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuZXh0ZW5zaW9uc31cXGBgKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmZpbGVzICYmIG9wdGlvbnMuZXh0ZW5zaW9ucykge1xuXHRcdHJldHVybiBvcHRpb25zLmZpbGVzLm1hcCh4ID0+IHBhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGFkZEV4dGVuc2lvbnMoeCwgb3B0aW9ucy5leHRlbnNpb25zKSkpO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZmlsZXMpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5maWxlcy5tYXAoeCA9PiBwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBgKiovJHt4fWApKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gW3BhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGAqKi8qLiR7Z2V0RXh0ZW5zaW9ucyhvcHRpb25zLmV4dGVuc2lvbnMpfWApXTtcblx0fVxuXG5cdHJldHVybiBbcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgJyoqJyldO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoaW5wdXQsIG9wdGlvbnMpID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHRjd2Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5jd2QgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY3dkXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuY3dkfVxcYGApO1xuXHR9XG5cblx0Y29uc3QgZ2xvYnMgPSBhd2FpdCBQcm9taXNlLmFsbChbXS5jb25jYXQoaW5wdXQpLm1hcChhc3luYyB4ID0+IHtcblx0XHRjb25zdCBpc0RpcmVjdG9yeSA9IGF3YWl0IHBhdGhUeXBlLmlzRGlyZWN0b3J5KGdldFBhdGgoeCwgb3B0aW9ucy5jd2QpKTtcblx0XHRyZXR1cm4gaXNEaXJlY3RvcnkgPyBnZXRHbG9iKHgsIG9wdGlvbnMpIDogeDtcblx0fSkpO1xuXG5cdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGdsb2JzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zeW5jID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Y3dkOiBwcm9jZXNzLmN3ZCgpLFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRpZiAodHlwZW9mIG9wdGlvbnMuY3dkICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGN3ZFxcYCB0byBiZSBvZiB0eXBlIFxcYHN0cmluZ1xcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmN3ZH1cXGBgKTtcblx0fVxuXG5cdGNvbnN0IGdsb2JzID0gW10uY29uY2F0KGlucHV0KS5tYXAoeCA9PiBwYXRoVHlwZS5pc0RpcmVjdG9yeVN5bmMoZ2V0UGF0aCh4LCBvcHRpb25zLmN3ZCkpID8gZ2V0R2xvYih4LCBvcHRpb25zKSA6IHgpO1xuXG5cdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGdsb2JzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG59O1xuIiwgIi8vIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIG1ha2UtYXJyYXlcbmZ1bmN0aW9uIG1ha2VBcnJheSAoc3ViamVjdCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdWJqZWN0KVxuICAgID8gc3ViamVjdFxuICAgIDogW3N1YmplY3RdXG59XG5cbmNvbnN0IEVNUFRZID0gJydcbmNvbnN0IFNQQUNFID0gJyAnXG5jb25zdCBFU0NBUEUgPSAnXFxcXCdcbmNvbnN0IFJFR0VYX1RFU1RfQkxBTktfTElORSA9IC9eXFxzKyQvXG5jb25zdCBSRUdFWF9JTlZBTElEX1RSQUlMSU5HX0JBQ0tTTEFTSCA9IC8oPzpbXlxcXFxdfF4pXFxcXCQvXG5jb25zdCBSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9FWENMQU1BVElPTiA9IC9eXFxcXCEvXG5jb25zdCBSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9IQVNIID0gL15cXFxcIy9cbmNvbnN0IFJFR0VYX1NQTElUQUxMX0NSTEYgPSAvXFxyP1xcbi9nXG4vLyAvZm9vLFxuLy8gLi9mb28sXG4vLyAuLi9mb28sXG4vLyAuXG4vLyAuLlxuY29uc3QgUkVHRVhfVEVTVF9JTlZBTElEX1BBVEggPSAvXlxcLipcXC98XlxcLiskL1xuXG5jb25zdCBTTEFTSCA9ICcvJ1xuXG4vLyBEbyBub3QgdXNlIHRlcm5hcnkgZXhwcmVzc2lvbiBoZXJlLCBzaW5jZSBcImlzdGFuYnVsIGlnbm9yZSBuZXh0XCIgaXMgYnVnZ3lcbmxldCBUTVBfS0VZX0lHTk9SRSA9ICdub2RlLWlnbm9yZSdcbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgVE1QX0tFWV9JR05PUkUgPSBTeW1ib2wuZm9yKCdub2RlLWlnbm9yZScpXG59XG5jb25zdCBLRVlfSUdOT1JFID0gVE1QX0tFWV9JR05PUkVcblxuY29uc3QgZGVmaW5lID0gKG9iamVjdCwga2V5LCB2YWx1ZSkgPT5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7dmFsdWV9KVxuXG5jb25zdCBSRUdFWF9SRUdFWFBfUkFOR0UgPSAvKFswLXpdKS0oWzAtel0pL2dcblxuY29uc3QgUkVUVVJOX0ZBTFNFID0gKCkgPT4gZmFsc2VcblxuLy8gU2FuaXRpemUgdGhlIHJhbmdlIG9mIGEgcmVndWxhciBleHByZXNzaW9uXG4vLyBUaGUgY2FzZXMgYXJlIGNvbXBsaWNhdGVkLCBzZWUgdGVzdCBjYXNlcyBmb3IgZGV0YWlsc1xuY29uc3Qgc2FuaXRpemVSYW5nZSA9IHJhbmdlID0+IHJhbmdlLnJlcGxhY2UoXG4gIFJFR0VYX1JFR0VYUF9SQU5HRSxcbiAgKG1hdGNoLCBmcm9tLCB0bykgPT4gZnJvbS5jaGFyQ29kZUF0KDApIDw9IHRvLmNoYXJDb2RlQXQoMClcbiAgICA/IG1hdGNoXG4gICAgLy8gSW52YWxpZCByYW5nZSAob3V0IG9mIG9yZGVyKSB3aGljaCBpcyBvayBmb3IgZ2l0aWdub3JlIHJ1bGVzIGJ1dFxuICAgIC8vICAgZmF0YWwgZm9yIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9uLCBzbyBlbGltaW5hdGUgaXQuXG4gICAgOiBFTVBUWVxuKVxuXG4vLyBTZWUgZml4dHVyZXMgIzU5XG5jb25zdCBjbGVhblJhbmdlQmFja1NsYXNoID0gc2xhc2hlcyA9PiB7XG4gIGNvbnN0IHtsZW5ndGh9ID0gc2xhc2hlc1xuICByZXR1cm4gc2xhc2hlcy5zbGljZSgwLCBsZW5ndGggLSBsZW5ndGggJSAyKVxufVxuXG4vLyA+IElmIHRoZSBwYXR0ZXJuIGVuZHMgd2l0aCBhIHNsYXNoLFxuLy8gPiBpdCBpcyByZW1vdmVkIGZvciB0aGUgcHVycG9zZSBvZiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uLFxuLy8gPiBidXQgaXQgd291bGQgb25seSBmaW5kIGEgbWF0Y2ggd2l0aCBhIGRpcmVjdG9yeS5cbi8vID4gSW4gb3RoZXIgd29yZHMsIGZvby8gd2lsbCBtYXRjaCBhIGRpcmVjdG9yeSBmb28gYW5kIHBhdGhzIHVuZGVybmVhdGggaXQsXG4vLyA+IGJ1dCB3aWxsIG5vdCBtYXRjaCBhIHJlZ3VsYXIgZmlsZSBvciBhIHN5bWJvbGljIGxpbmsgZm9vXG4vLyA+ICAodGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBob3cgcGF0aHNwZWMgd29ya3MgaW4gZ2VuZXJhbCBpbiBHaXQpLlxuLy8gJ2Bmb28vYCcgd2lsbCBub3QgbWF0Y2ggcmVndWxhciBmaWxlICdgZm9vYCcgb3Igc3ltYm9saWMgbGluayAnYGZvb2AnXG4vLyAtPiBpZ25vcmUtcnVsZXMgd2lsbCBub3QgZGVhbCB3aXRoIGl0LCBiZWNhdXNlIGl0IGNvc3RzIGV4dHJhIGBmcy5zdGF0YCBjYWxsXG4vLyAgICAgIHlvdSBjb3VsZCB1c2Ugb3B0aW9uIGBtYXJrOiB0cnVlYCB3aXRoIGBnbG9iYFxuXG4vLyAnYGZvby9gJyBzaG91bGQgbm90IGNvbnRpbnVlIHdpdGggdGhlICdgLi5gJ1xuY29uc3QgUkVQTEFDRVJTID0gW1xuXG4gIC8vID4gVHJhaWxpbmcgc3BhY2VzIGFyZSBpZ25vcmVkIHVubGVzcyB0aGV5IGFyZSBxdW90ZWQgd2l0aCBiYWNrc2xhc2ggKFwiXFxcIilcbiAgW1xuICAgIC8vIChhXFwgKSAtPiAoYSApXG4gICAgLy8gKGEgICkgLT4gKGEpXG4gICAgLy8gKGEgXFwgKSAtPiAoYSAgKVxuICAgIC9cXFxcP1xccyskLyxcbiAgICBtYXRjaCA9PiBtYXRjaC5pbmRleE9mKCdcXFxcJykgPT09IDBcbiAgICAgID8gU1BBQ0VcbiAgICAgIDogRU1QVFlcbiAgXSxcblxuICAvLyByZXBsYWNlIChcXCApIHdpdGggJyAnXG4gIFtcbiAgICAvXFxcXFxccy9nLFxuICAgICgpID0+IFNQQUNFXG4gIF0sXG5cbiAgLy8gRXNjYXBlIG1ldGFjaGFyYWN0ZXJzXG4gIC8vIHdoaWNoIGlzIHdyaXR0ZW4gZG93biBieSB1c2VycyBidXQgbWVhbnMgc3BlY2lhbCBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cblxuICAvLyA+IFRoZXJlIGFyZSAxMiBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nczpcbiAgLy8gPiAtIHRoZSBiYWNrc2xhc2ggXFwsXG4gIC8vID4gLSB0aGUgY2FyZXQgXixcbiAgLy8gPiAtIHRoZSBkb2xsYXIgc2lnbiAkLFxuICAvLyA+IC0gdGhlIHBlcmlvZCBvciBkb3QgLixcbiAgLy8gPiAtIHRoZSB2ZXJ0aWNhbCBiYXIgb3IgcGlwZSBzeW1ib2wgfCxcbiAgLy8gPiAtIHRoZSBxdWVzdGlvbiBtYXJrID8sXG4gIC8vID4gLSB0aGUgYXN0ZXJpc2sgb3Igc3RhciAqLFxuICAvLyA+IC0gdGhlIHBsdXMgc2lnbiArLFxuICAvLyA+IC0gdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKCxcbiAgLy8gPiAtIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzICksXG4gIC8vID4gLSBhbmQgdGhlIG9wZW5pbmcgc3F1YXJlIGJyYWNrZXQgWyxcbiAgLy8gPiAtIHRoZSBvcGVuaW5nIGN1cmx5IGJyYWNlIHssXG4gIC8vID4gVGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBvZnRlbiBjYWxsZWQgXCJtZXRhY2hhcmFjdGVyc1wiLlxuICBbXG4gICAgL1tcXFxcJC58KisoKXteXS9nLFxuICAgIG1hdGNoID0+IGBcXFxcJHttYXRjaH1gXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gYSBxdWVzdGlvbiBtYXJrICg/KSBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlclxuICAgIC8oPyFcXFxcKVxcPy9nLFxuICAgICgpID0+ICdbXi9dJ1xuICBdLFxuXG4gIC8vIGxlYWRpbmcgc2xhc2hcbiAgW1xuXG4gICAgLy8gPiBBIGxlYWRpbmcgc2xhc2ggbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZS5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIi8qLmNcIiBtYXRjaGVzIFwiY2F0LWZpbGUuY1wiIGJ1dCBub3QgXCJtb3ppbGxhLXNoYTEvc2hhMS5jXCIuXG4gICAgLy8gQSBsZWFkaW5nIHNsYXNoIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aG5hbWVcbiAgICAvXlxcLy8sXG4gICAgKCkgPT4gJ14nXG4gIF0sXG5cbiAgLy8gcmVwbGFjZSBzcGVjaWFsIG1ldGFjaGFyYWN0ZXIgc2xhc2ggYWZ0ZXIgdGhlIGxlYWRpbmcgc2xhc2hcbiAgW1xuICAgIC9cXC8vZyxcbiAgICAoKSA9PiAnXFxcXC8nXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gQSBsZWFkaW5nIFwiKipcIiBmb2xsb3dlZCBieSBhIHNsYXNoIG1lYW5zIG1hdGNoIGluIGFsbCBkaXJlY3Rvcmllcy5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIioqL2Zvb1wiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJmb29cIiBhbnl3aGVyZSxcbiAgICAvLyA+IHRoZSBzYW1lIGFzIHBhdHRlcm4gXCJmb29cIi5cbiAgICAvLyA+IFwiKiovZm9vL2JhclwiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJiYXJcIiBhbnl3aGVyZSB0aGF0IGlzIGRpcmVjdGx5XG4gICAgLy8gPiAgIHVuZGVyIGRpcmVjdG9yeSBcImZvb1wiLlxuICAgIC8vIE5vdGljZSB0aGF0IHRoZSAnKidzIGhhdmUgYmVlbiByZXBsYWNlZCBhcyAnXFxcXConXG4gICAgL15cXF4qXFxcXFxcKlxcXFxcXCpcXFxcXFwvLyxcblxuICAgIC8vICcqKi9mb28nIDwtPiAnZm9vJ1xuICAgICgpID0+ICdeKD86LipcXFxcLyk/J1xuICBdLFxuXG4gIC8vIHN0YXJ0aW5nXG4gIFtcbiAgICAvLyB0aGVyZSB3aWxsIGJlIG5vIGxlYWRpbmcgJy8nXG4gICAgLy8gICAod2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQgYnkgc2VjdGlvbiBcImxlYWRpbmcgc2xhc2hcIilcbiAgICAvLyBJZiBzdGFydHMgd2l0aCAnKionLCBhZGRpbmcgYSAnXicgdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHNvIHdvcmtzXG4gICAgL14oPz1bXl5dKS8sXG4gICAgZnVuY3Rpb24gc3RhcnRpbmdSZXBsYWNlciAoKSB7XG4gICAgICAvLyBJZiBoYXMgYSBzbGFzaCBgL2AgYXQgdGhlIGJlZ2lubmluZyBvciBtaWRkbGVcbiAgICAgIHJldHVybiAhL1xcLyg/ISQpLy50ZXN0KHRoaXMpXG4gICAgICAgIC8vID4gUHJpb3IgdG8gMi4yMi4xXG4gICAgICAgIC8vID4gSWYgdGhlIHBhdHRlcm4gZG9lcyBub3QgY29udGFpbiBhIHNsYXNoIC8sXG4gICAgICAgIC8vID4gICBHaXQgdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG4gICAgICAgIC8vIEFjdHVhbGx5LCBpZiB0aGVyZSBpcyBvbmx5IGEgdHJhaWxpbmcgc2xhc2gsXG4gICAgICAgIC8vICAgZ2l0IGFsc28gdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG5cbiAgICAgICAgLy8gQWZ0ZXIgMi4yMi4xIChjb21wYXRpYmxlIGJ1dCBjbGVhcmVyKVxuICAgICAgICAvLyA+IElmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb3IgbWlkZGxlIChvciBib3RoKVxuICAgICAgICAvLyA+IG9mIHRoZSBwYXR0ZXJuLCB0aGVuIHRoZSBwYXR0ZXJuIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnlcbiAgICAgICAgLy8gPiBsZXZlbCBvZiB0aGUgcGFydGljdWxhciAuZ2l0aWdub3JlIGZpbGUgaXRzZWxmLlxuICAgICAgICAvLyA+IE90aGVyd2lzZSB0aGUgcGF0dGVybiBtYXkgYWxzbyBtYXRjaCBhdCBhbnkgbGV2ZWwgYmVsb3dcbiAgICAgICAgLy8gPiB0aGUgLmdpdGlnbm9yZSBsZXZlbC5cbiAgICAgICAgPyAnKD86XnxcXFxcLyknXG5cbiAgICAgICAgLy8gPiBPdGhlcndpc2UsIEdpdCB0cmVhdHMgdGhlIHBhdHRlcm4gYXMgYSBzaGVsbCBnbG9iIHN1aXRhYmxlIGZvclxuICAgICAgICAvLyA+ICAgY29uc3VtcHRpb24gYnkgZm5tYXRjaCgzKVxuICAgICAgICA6ICdeJ1xuICAgIH1cbiAgXSxcblxuICAvLyB0d28gZ2xvYnN0YXJzXG4gIFtcbiAgICAvLyBVc2UgbG9va2FoZWFkIGFzc2VydGlvbnMgc28gdGhhdCB3ZSBjb3VsZCBtYXRjaCBtb3JlIHRoYW4gb25lIGAnLyoqJ2BcbiAgICAvXFxcXFxcL1xcXFxcXCpcXFxcXFwqKD89XFxcXFxcL3wkKS9nLFxuXG4gICAgLy8gWmVybywgb25lIG9yIHNldmVyYWwgZGlyZWN0b3JpZXNcbiAgICAvLyBzaG91bGQgbm90IHVzZSAnKicsIG9yIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5leHQgcmVwbGFjZXJcblxuICAgIC8vIENoZWNrIGlmIGl0IGlzIG5vdCB0aGUgbGFzdCBgJy8qKidgXG4gICAgKF8sIGluZGV4LCBzdHIpID0+IGluZGV4ICsgNiA8IHN0ci5sZW5ndGhcblxuICAgICAgLy8gY2FzZTogLyoqL1xuICAgICAgLy8gPiBBIHNsYXNoIGZvbGxvd2VkIGJ5IHR3byBjb25zZWN1dGl2ZSBhc3Rlcmlza3MgdGhlbiBhIHNsYXNoIG1hdGNoZXNcbiAgICAgIC8vID4gICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMuXG4gICAgICAvLyA+IEZvciBleGFtcGxlLCBcImEvKiovYlwiIG1hdGNoZXMgXCJhL2JcIiwgXCJhL3gvYlwiLCBcImEveC95L2JcIiBhbmQgc28gb24uXG4gICAgICAvLyAnLyoqLydcbiAgICAgID8gJyg/OlxcXFwvW15cXFxcL10rKSonXG5cbiAgICAgIC8vIGNhc2U6IC8qKlxuICAgICAgLy8gPiBBIHRyYWlsaW5nIGBcIi8qKlwiYCBtYXRjaGVzIGV2ZXJ5dGhpbmcgaW5zaWRlLlxuXG4gICAgICAvLyAjMjE6IGV2ZXJ5dGhpbmcgaW5zaWRlIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgZm9sZGVyXG4gICAgICA6ICdcXFxcLy4rJ1xuICBdLFxuXG4gIC8vIG5vcm1hbCBpbnRlcm1lZGlhdGUgd2lsZGNhcmRzXG4gIFtcbiAgICAvLyBOZXZlciByZXBsYWNlIGVzY2FwZWQgJyonXG4gICAgLy8gaWdub3JlIHJ1bGUgJ1xcKicgd2lsbCBtYXRjaCB0aGUgcGF0aCAnKidcblxuICAgIC8vICdhYmMuKi8nIC0+IGdvXG4gICAgLy8gJ2FiYy4qJyAgLT4gc2tpcCB0aGlzIHJ1bGUsXG4gICAgLy8gICAgY296IHRyYWlsaW5nIHNpbmdsZSB3aWxkY2FyZCB3aWxsIGJlIGhhbmRlZCBieSBbdHJhaWxpbmcgd2lsZGNhcmRdXG4gICAgLyhefFteXFxcXF0rKShcXFxcXFwqKSsoPz0uKykvZyxcblxuICAgIC8vICcqLmpzJyBtYXRjaGVzICcuanMnXG4gICAgLy8gJyouanMnIGRvZXNuJ3QgbWF0Y2ggJ2FiYydcbiAgICAoXywgcDEsIHAyKSA9PiB7XG4gICAgICAvLyAxLlxuICAgICAgLy8gPiBBbiBhc3RlcmlzayBcIipcIiBtYXRjaGVzIGFueXRoaW5nIGV4Y2VwdCBhIHNsYXNoLlxuICAgICAgLy8gMi5cbiAgICAgIC8vID4gT3RoZXIgY29uc2VjdXRpdmUgYXN0ZXJpc2tzIGFyZSBjb25zaWRlcmVkIHJlZ3VsYXIgYXN0ZXJpc2tzXG4gICAgICAvLyA+IGFuZCB3aWxsIG1hdGNoIGFjY29yZGluZyB0byB0aGUgcHJldmlvdXMgcnVsZXMuXG4gICAgICBjb25zdCB1bmVzY2FwZWQgPSBwMi5yZXBsYWNlKC9cXFxcXFwqL2csICdbXlxcXFwvXSonKVxuICAgICAgcmV0dXJuIHAxICsgdW5lc2NhcGVkXG4gICAgfVxuICBdLFxuXG4gIFtcbiAgICAvLyB1bmVzY2FwZSwgcmV2ZXJ0IHN0ZXAgMyBleGNlcHQgZm9yIGJhY2sgc2xhc2hcbiAgICAvLyBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIGVzY2FwZSBhICdcXFxcKicsXG4gICAgLy8gYWZ0ZXIgc3RlcCAzLCB0aGUgcmVzdWx0IHdpbGwgYmUgJ1xcXFxcXFxcXFxcXConXG4gICAgL1xcXFxcXFxcXFxcXCg/PVskLnwqKygpe15dKS9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyAnXFxcXFxcXFwnIC0+ICdcXFxcJ1xuICAgIC9cXFxcXFxcXC9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyA+IFRoZSByYW5nZSBub3RhdGlvbiwgZS5nLiBbYS16QS1aXSxcbiAgICAvLyA+IGNhbiBiZSB1c2VkIHRvIG1hdGNoIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBhIHJhbmdlLlxuXG4gICAgLy8gYFxcYCBpcyBlc2NhcGVkIGJ5IHN0ZXAgM1xuICAgIC8oXFxcXCk/XFxbKFteXFxdL10qPykoXFxcXCopKCR8XFxdKS9nLFxuICAgIChtYXRjaCwgbGVhZEVzY2FwZSwgcmFuZ2UsIGVuZEVzY2FwZSwgY2xvc2UpID0+IGxlYWRFc2NhcGUgPT09IEVTQ0FQRVxuICAgICAgLy8gJ1xcXFxbYmFyXScgLT4gJ1xcXFxcXFxcW2JhclxcXFxdJ1xuICAgICAgPyBgXFxcXFske3JhbmdlfSR7Y2xlYW5SYW5nZUJhY2tTbGFzaChlbmRFc2NhcGUpfSR7Y2xvc2V9YFxuICAgICAgOiBjbG9zZSA9PT0gJ10nXG4gICAgICAgID8gZW5kRXNjYXBlLmxlbmd0aCAlIDIgPT09IDBcbiAgICAgICAgICAvLyBBIG5vcm1hbCBjYXNlLCBhbmQgaXQgaXMgYSByYW5nZSBub3RhdGlvblxuICAgICAgICAgIC8vICdbYmFyXSdcbiAgICAgICAgICAvLyAnW2JhclxcXFxcXFxcXSdcbiAgICAgICAgICA/IGBbJHtzYW5pdGl6ZVJhbmdlKHJhbmdlKX0ke2VuZEVzY2FwZX1dYFxuICAgICAgICAgIC8vIEludmFsaWQgcmFuZ2Ugbm90YXRvblxuICAgICAgICAgIC8vICdbYmFyXFxcXF0nIC0+ICdbYmFyXFxcXFxcXFxdJ1xuICAgICAgICAgIDogJ1tdJ1xuICAgICAgICA6ICdbXSdcbiAgXSxcblxuICAvLyBlbmRpbmdcbiAgW1xuICAgIC8vICdqcycgd2lsbCBub3QgbWF0Y2ggJ2pzLidcbiAgICAvLyAnYWInIHdpbGwgbm90IG1hdGNoICdhYmMnXG4gICAgLyg/OlteKl0pJC8sXG5cbiAgICAvLyBXVEYhXG4gICAgLy8gaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZVxuICAgIC8vIGNoYW5nZXMgaW4gWzIuMjIuMV0oaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZS8yLjIyLjEpXG4gICAgLy8gd2hpY2ggcmUtZml4ZXMgIzI0LCAjMzhcblxuICAgIC8vID4gSWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB0aGVuIHRoZSBwYXR0ZXJuXG4gICAgLy8gPiB3aWxsIG9ubHkgbWF0Y2ggZGlyZWN0b3JpZXMsIG90aGVyd2lzZSB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYm90aFxuICAgIC8vID4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuXG4gICAgLy8gJ2pzKicgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzLycgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzJyB3aWxsIG1hdGNoICdhLmpzJyBhbmQgJ2EuanMvJ1xuICAgIG1hdGNoID0+IC9cXC8kLy50ZXN0KG1hdGNoKVxuICAgICAgLy8gZm9vLyB3aWxsIG5vdCBtYXRjaCAnZm9vJ1xuICAgICAgPyBgJHttYXRjaH0kYFxuICAgICAgLy8gZm9vIG1hdGNoZXMgJ2ZvbycgYW5kICdmb28vJ1xuICAgICAgOiBgJHttYXRjaH0oPz0kfFxcXFwvJClgXG4gIF0sXG5cbiAgLy8gdHJhaWxpbmcgd2lsZGNhcmRcbiAgW1xuICAgIC8oXFxefFxcXFxcXC8pP1xcXFxcXCokLyxcbiAgICAoXywgcDEpID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHAxXG4gICAgICAgIC8vICdcXF4nOlxuICAgICAgICAvLyAnLyonIGRvZXMgbm90IG1hdGNoIEVNUFRZXG4gICAgICAgIC8vICcvKicgZG9lcyBub3QgbWF0Y2ggZXZlcnl0aGluZ1xuXG4gICAgICAgIC8vICdcXFxcXFwvJzpcbiAgICAgICAgLy8gJ2FiYy8qJyBkb2VzIG5vdCBtYXRjaCAnYWJjLydcbiAgICAgICAgPyBgJHtwMX1bXi9dK2BcblxuICAgICAgICAvLyAnYSonIG1hdGNoZXMgJ2EnXG4gICAgICAgIC8vICdhKicgbWF0Y2hlcyAnYWEnXG4gICAgICAgIDogJ1teL10qJ1xuXG4gICAgICByZXR1cm4gYCR7cHJlZml4fSg/PSR8XFxcXC8kKWBcbiAgICB9XG4gIF0sXG5dXG5cbi8vIEEgc2ltcGxlIGNhY2hlLCBiZWNhdXNlIGFuIGlnbm9yZSBydWxlIG9ubHkgaGFzIG9ubHkgb25lIGNlcnRhaW4gbWVhbmluZ1xuY29uc3QgcmVnZXhDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLy8gQHBhcmFtIHtwYXR0ZXJufVxuY29uc3QgbWFrZVJlZ2V4ID0gKHBhdHRlcm4sIGlnbm9yZUNhc2UpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHJlZ2V4Q2FjaGVbcGF0dGVybl1cblxuICBpZiAoIXNvdXJjZSkge1xuICAgIHNvdXJjZSA9IFJFUExBQ0VSUy5yZWR1Y2UoXG4gICAgICAocHJldiwgY3VycmVudCkgPT4gcHJldi5yZXBsYWNlKGN1cnJlbnRbMF0sIGN1cnJlbnRbMV0uYmluZChwYXR0ZXJuKSksXG4gICAgICBwYXR0ZXJuXG4gICAgKVxuICAgIHJlZ2V4Q2FjaGVbcGF0dGVybl0gPSBzb3VyY2VcbiAgfVxuXG4gIHJldHVybiBpZ25vcmVDYXNlXG4gICAgPyBuZXcgUmVnRXhwKHNvdXJjZSwgJ2knKVxuICAgIDogbmV3IFJlZ0V4cChzb3VyY2UpXG59XG5cbmNvbnN0IGlzU3RyaW5nID0gc3ViamVjdCA9PiB0eXBlb2Ygc3ViamVjdCA9PT0gJ3N0cmluZydcblxuLy8gPiBBIGJsYW5rIGxpbmUgbWF0Y2hlcyBubyBmaWxlcywgc28gaXQgY2FuIHNlcnZlIGFzIGEgc2VwYXJhdG9yIGZvciByZWFkYWJpbGl0eS5cbmNvbnN0IGNoZWNrUGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVyblxuICAmJiBpc1N0cmluZyhwYXR0ZXJuKVxuICAmJiAhUkVHRVhfVEVTVF9CTEFOS19MSU5FLnRlc3QocGF0dGVybilcbiAgJiYgIVJFR0VYX0lOVkFMSURfVFJBSUxJTkdfQkFDS1NMQVNILnRlc3QocGF0dGVybilcblxuICAvLyA+IEEgbGluZSBzdGFydGluZyB3aXRoICMgc2VydmVzIGFzIGEgY29tbWVudC5cbiAgJiYgcGF0dGVybi5pbmRleE9mKCcjJykgIT09IDBcblxuY29uc3Qgc3BsaXRQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuLnNwbGl0KFJFR0VYX1NQTElUQUxMX0NSTEYpXG5cbmNsYXNzIElnbm9yZVJ1bGUge1xuICBjb25zdHJ1Y3RvciAoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKSB7XG4gICAgdGhpcy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IG5lZ2F0aXZlXG4gICAgdGhpcy5yZWdleCA9IHJlZ2V4XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlUnVsZSA9IChwYXR0ZXJuLCBpZ25vcmVDYXNlKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IHBhdHRlcm5cbiAgbGV0IG5lZ2F0aXZlID0gZmFsc2VcblxuICAvLyA+IEFuIG9wdGlvbmFsIHByZWZpeCBcIiFcIiB3aGljaCBuZWdhdGVzIHRoZSBwYXR0ZXJuO1xuICBpZiAocGF0dGVybi5pbmRleE9mKCchJykgPT09IDApIHtcbiAgICBuZWdhdGl2ZSA9IHRydWVcbiAgICBwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHIoMSlcbiAgfVxuXG4gIHBhdHRlcm4gPSBwYXR0ZXJuXG4gIC8vID4gUHV0IGEgYmFja3NsYXNoIChcIlxcXCIpIGluIGZyb250IG9mIHRoZSBmaXJzdCBcIiFcIiBmb3IgcGF0dGVybnMgdGhhdFxuICAvLyA+ICAgYmVnaW4gd2l0aCBhIGxpdGVyYWwgXCIhXCIsIGZvciBleGFtcGxlLCBgXCJcXCFpbXBvcnRhbnQhLnR4dFwiYC5cbiAgLnJlcGxhY2UoUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04sICchJylcbiAgLy8gPiBQdXQgYSBiYWNrc2xhc2ggKFwiXFxcIikgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGhhc2ggZm9yIHBhdHRlcm5zIHRoYXRcbiAgLy8gPiAgIGJlZ2luIHdpdGggYSBoYXNoLlxuICAucmVwbGFjZShSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9IQVNILCAnIycpXG5cbiAgY29uc3QgcmVnZXggPSBtYWtlUmVnZXgocGF0dGVybiwgaWdub3JlQ2FzZSlcblxuICByZXR1cm4gbmV3IElnbm9yZVJ1bGUoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKVxufVxuXG5jb25zdCB0aHJvd0Vycm9yID0gKG1lc3NhZ2UsIEN0b3IpID0+IHtcbiAgdGhyb3cgbmV3IEN0b3IobWVzc2FnZSlcbn1cblxuY29uc3QgY2hlY2tQYXRoID0gKHBhdGgsIG9yaWdpbmFsUGF0aCwgZG9UaHJvdykgPT4ge1xuICBpZiAoIWlzU3RyaW5nKHBhdGgpKSB7XG4gICAgcmV0dXJuIGRvVGhyb3coXG4gICAgICBgcGF0aCBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZ290IFxcYCR7b3JpZ2luYWxQYXRofVxcYGAsXG4gICAgICBUeXBlRXJyb3JcbiAgICApXG4gIH1cblxuICAvLyBXZSBkb24ndCBrbm93IGlmIHdlIHNob3VsZCBpZ25vcmUgRU1QVFksIHNvIHRocm93XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBkb1Rocm93KGBwYXRoIG11c3Qgbm90IGJlIGVtcHR5YCwgVHlwZUVycm9yKVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQgaXMgYSByZWxhdGl2ZSBwYXRoXG4gIGlmIChjaGVja1BhdGguaXNOb3RSZWxhdGl2ZShwYXRoKSkge1xuICAgIGNvbnN0IHIgPSAnYHBhdGgucmVsYXRpdmUoKWBkJ1xuICAgIHJldHVybiBkb1Rocm93KFxuICAgICAgYHBhdGggc2hvdWxkIGJlIGEgJHtyfSBzdHJpbmcsIGJ1dCBnb3QgXCIke29yaWdpbmFsUGF0aH1cImAsXG4gICAgICBSYW5nZUVycm9yXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgaXNOb3RSZWxhdGl2ZSA9IHBhdGggPT4gUkVHRVhfVEVTVF9JTlZBTElEX1BBVEgudGVzdChwYXRoKVxuXG5jaGVja1BhdGguaXNOb3RSZWxhdGl2ZSA9IGlzTm90UmVsYXRpdmVcbmNoZWNrUGF0aC5jb252ZXJ0ID0gcCA9PiBwXG5cbmNsYXNzIElnbm9yZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgaWdub3JlY2FzZSA9IHRydWUsXG4gICAgaWdub3JlQ2FzZSA9IGlnbm9yZWNhc2UsXG4gICAgYWxsb3dSZWxhdGl2ZVBhdGhzID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgZGVmaW5lKHRoaXMsIEtFWV9JR05PUkUsIHRydWUpXG5cbiAgICB0aGlzLl9ydWxlcyA9IFtdXG4gICAgdGhpcy5faWdub3JlQ2FzZSA9IGlnbm9yZUNhc2VcbiAgICB0aGlzLl9hbGxvd1JlbGF0aXZlUGF0aHMgPSBhbGxvd1JlbGF0aXZlUGF0aHNcbiAgICB0aGlzLl9pbml0Q2FjaGUoKVxuICB9XG5cbiAgX2luaXRDYWNoZSAoKSB7XG4gICAgdGhpcy5faWdub3JlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5fdGVzdENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB9XG5cbiAgX2FkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICAvLyAjMzJcbiAgICBpZiAocGF0dGVybiAmJiBwYXR0ZXJuW0tFWV9JR05PUkVdKSB7XG4gICAgICB0aGlzLl9ydWxlcyA9IHRoaXMuX3J1bGVzLmNvbmNhdChwYXR0ZXJuLl9ydWxlcylcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrUGF0dGVybihwYXR0ZXJuKSkge1xuICAgICAgY29uc3QgcnVsZSA9IGNyZWF0ZVJ1bGUocGF0dGVybiwgdGhpcy5faWdub3JlQ2FzZSlcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcnVsZXMucHVzaChydWxlKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHN0cmluZyB8IElnbm9yZX0gcGF0dGVyblxuICBhZGQgKHBhdHRlcm4pIHtcbiAgICB0aGlzLl9hZGRlZCA9IGZhbHNlXG5cbiAgICBtYWtlQXJyYXkoXG4gICAgICBpc1N0cmluZyhwYXR0ZXJuKVxuICAgICAgICA/IHNwbGl0UGF0dGVybihwYXR0ZXJuKVxuICAgICAgICA6IHBhdHRlcm5cbiAgICApLmZvckVhY2godGhpcy5fYWRkUGF0dGVybiwgdGhpcylcblxuICAgIC8vIFNvbWUgcnVsZXMgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBpZ25vcmUsXG4gICAgLy8gbWFraW5nIHRoZSBiZWhhdmlvciBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLl9hZGRlZCkge1xuICAgICAgdGhpcy5faW5pdENhY2hlKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gbGVnYWN5XG4gIGFkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQocGF0dGVybilcbiAgfVxuXG4gIC8vICAgICAgICAgIHwgICAgICAgICAgIGlnbm9yZWQgOiB1bmlnbm9yZWRcbiAgLy8gbmVnYXRpdmUgfCAgIDA6MCAgIHwgICAwOjEgICB8ICAgMTowICAgfCAgIDE6MVxuICAvLyAtLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tXG4gIC8vICAgICAwICAgIHwgIFRFU1QgICB8ICBURVNUICAgfCAgU0tJUCAgIHwgICAgWFxuICAvLyAgICAgMSAgICB8ICBURVNUSUYgfCAgU0tJUCAgIHwgIFRFU1QgICB8ICAgIFhcblxuICAvLyAtIFNLSVA6IGFsd2F5cyBza2lwXG4gIC8vIC0gVEVTVDogYWx3YXlzIHRlc3RcbiAgLy8gLSBURVNUSUY6IG9ubHkgdGVzdCBpZiBjaGVja1VuaWdub3JlZFxuICAvLyAtIFg6IHRoYXQgbmV2ZXIgaGFwcGVuXG5cbiAgLy8gQHBhcmFtIHtib29sZWFufSB3aGV0aGVyIHNob3VsZCBjaGVjayBpZiB0aGUgcGF0aCBpcyB1bmlnbm9yZWQsXG4gIC8vICAgc2V0dGluZyBgY2hlY2tVbmlnbm9yZWRgIHRvIGBmYWxzZWAgY291bGQgcmVkdWNlIGFkZGl0aW9uYWxcbiAgLy8gICBwYXRoIG1hdGNoaW5nLlxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fSB0cnVlIGlmIGEgZmlsZSBpcyBpZ25vcmVkXG4gIF90ZXN0T25lIChwYXRoLCBjaGVja1VuaWdub3JlZCkge1xuICAgIGxldCBpZ25vcmVkID0gZmFsc2VcbiAgICBsZXQgdW5pZ25vcmVkID0gZmFsc2VcblxuICAgIHRoaXMuX3J1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICBjb25zdCB7bmVnYXRpdmV9ID0gcnVsZVxuICAgICAgaWYgKFxuICAgICAgICB1bmlnbm9yZWQgPT09IG5lZ2F0aXZlICYmIGlnbm9yZWQgIT09IHVuaWdub3JlZFxuICAgICAgICB8fCBuZWdhdGl2ZSAmJiAhaWdub3JlZCAmJiAhdW5pZ25vcmVkICYmICFjaGVja1VuaWdub3JlZFxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGVkID0gcnVsZS5yZWdleC50ZXN0KHBhdGgpXG5cbiAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIGlnbm9yZWQgPSAhbmVnYXRpdmVcbiAgICAgICAgdW5pZ25vcmVkID0gbmVnYXRpdmVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlnbm9yZWQsXG4gICAgICB1bmlnbm9yZWRcbiAgICB9XG4gIH1cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH1cbiAgX3Rlc3QgKG9yaWdpbmFsUGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpIHtcbiAgICBjb25zdCBwYXRoID0gb3JpZ2luYWxQYXRoXG4gICAgICAvLyBTdXBwb3J0cyBudWxsYWJsZSBwYXRoXG4gICAgICAmJiBjaGVja1BhdGguY29udmVydChvcmlnaW5hbFBhdGgpXG5cbiAgICBjaGVja1BhdGgoXG4gICAgICBwYXRoLFxuICAgICAgb3JpZ2luYWxQYXRoLFxuICAgICAgdGhpcy5fYWxsb3dSZWxhdGl2ZVBhdGhzXG4gICAgICAgID8gUkVUVVJOX0ZBTFNFXG4gICAgICAgIDogdGhyb3dFcnJvclxuICAgIClcblxuICAgIHJldHVybiB0aGlzLl90KHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKVxuICB9XG5cbiAgX3QgKHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKSB7XG4gICAgaWYgKHBhdGggaW4gY2FjaGUpIHtcbiAgICAgIHJldHVybiBjYWNoZVtwYXRoXVxuICAgIH1cblxuICAgIGlmICghc2xpY2VzKSB7XG4gICAgICAvLyBwYXRoL3RvL2EuanNcbiAgICAgIC8vIFsncGF0aCcsICd0bycsICdhLmpzJ11cbiAgICAgIHNsaWNlcyA9IHBhdGguc3BsaXQoU0xBU0gpXG4gICAgfVxuXG4gICAgc2xpY2VzLnBvcCgpXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBoYXMgbm8gcGFyZW50IGRpcmVjdG9yeSwganVzdCB0ZXN0IGl0XG4gICAgaWYgKCFzbGljZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSB0aGlzLl90ZXN0T25lKHBhdGgsIGNoZWNrVW5pZ25vcmVkKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3QoXG4gICAgICBzbGljZXMuam9pbihTTEFTSCkgKyBTTEFTSCxcbiAgICAgIGNhY2hlLFxuICAgICAgY2hlY2tVbmlnbm9yZWQsXG4gICAgICBzbGljZXNcbiAgICApXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBjb250YWlucyBhIHBhcmVudCBkaXJlY3RvcnksIGNoZWNrIHRoZSBwYXJlbnQgZmlyc3RcbiAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSBwYXJlbnQuaWdub3JlZFxuICAgICAgLy8gPiBJdCBpcyBub3QgcG9zc2libGUgdG8gcmUtaW5jbHVkZSBhIGZpbGUgaWYgYSBwYXJlbnQgZGlyZWN0b3J5IG9mXG4gICAgICAvLyA+ICAgdGhhdCBmaWxlIGlzIGV4Y2x1ZGVkLlxuICAgICAgPyBwYXJlbnRcbiAgICAgIDogdGhpcy5fdGVzdE9uZShwYXRoLCBjaGVja1VuaWdub3JlZClcbiAgfVxuXG4gIGlnbm9yZXMgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl9pZ25vcmVDYWNoZSwgZmFsc2UpLmlnbm9yZWRcbiAgfVxuXG4gIGNyZWF0ZUZpbHRlciAoKSB7XG4gICAgcmV0dXJuIHBhdGggPT4gIXRoaXMuaWdub3JlcyhwYXRoKVxuICB9XG5cbiAgZmlsdGVyIChwYXRocykge1xuICAgIHJldHVybiBtYWtlQXJyYXkocGF0aHMpLmZpbHRlcih0aGlzLmNyZWF0ZUZpbHRlcigpKVxuICB9XG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9XG4gIHRlc3QgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl90ZXN0Q2FjaGUsIHRydWUpXG4gIH1cbn1cblxuY29uc3QgZmFjdG9yeSA9IG9wdGlvbnMgPT4gbmV3IElnbm9yZShvcHRpb25zKVxuXG5jb25zdCBpc1BhdGhWYWxpZCA9IHBhdGggPT5cbiAgY2hlY2tQYXRoKHBhdGggJiYgY2hlY2tQYXRoLmNvbnZlcnQocGF0aCksIHBhdGgsIFJFVFVSTl9GQUxTRSlcblxuZmFjdG9yeS5pc1BhdGhWYWxpZCA9IGlzUGF0aFZhbGlkXG5cbi8vIEZpeGVzIHR5cGVzY3JpcHRcbmZhY3RvcnkuZGVmYXVsdCA9IGZhY3RvcnlcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5XG5cbi8vIFdpbmRvd3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChcbiAgLy8gRGV0ZWN0IGBwcm9jZXNzYCBzbyB0aGF0IGl0IGNhbiBydW4gaW4gYnJvd3NlcnMuXG4gIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJ1xuICAmJiAoXG4gICAgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuSUdOT1JFX1RFU1RfV0lOMzJcbiAgICB8fCBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gIClcbikge1xuICAvKiBlc2xpbnQgbm8tY29udHJvbC1yZWdleDogXCJvZmZcIiAqL1xuICBjb25zdCBtYWtlUG9zaXggPSBzdHIgPT4gL15cXFxcXFxcXFxcP1xcXFwvLnRlc3Qoc3RyKVxuICB8fCAvW1wiPD58XFx1MDAwMC1cXHUwMDFGXSsvdS50ZXN0KHN0cilcbiAgICA/IHN0clxuICAgIDogc3RyLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuXG4gIGNoZWNrUGF0aC5jb252ZXJ0ID0gbWFrZVBvc2l4XG5cbiAgLy8gJ0M6XFxcXGZvbycgICAgIDwtICdDOlxcXFxmb28nIGhhcyBiZWVuIGNvbnZlcnRlZCB0byAnQzovJ1xuICAvLyAnZDpcXFxcZm9vJ1xuICBjb25zdCBSRUdJWF9JU19XSU5ET1dTX1BBVEhfQUJTT0xVVEUgPSAvXlthLXpdOlxcLy9pXG4gIGNoZWNrUGF0aC5pc05vdFJlbGF0aXZlID0gcGF0aCA9PlxuICAgIFJFR0lYX0lTX1dJTkRPV1NfUEFUSF9BQlNPTFVURS50ZXN0KHBhdGgpXG4gICAgfHwgaXNOb3RSZWxhdGl2ZShwYXRoKVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNsYXNoKHBhdGgpIHtcblx0Y29uc3QgaXNFeHRlbmRlZExlbmd0aFBhdGggPSAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChwYXRoKTtcblx0Y29uc3QgaGFzTm9uQXNjaWkgPSAvW15cXHUwMDAwLVxcdTAwODBdKy8udGVzdChwYXRoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cblx0aWYgKGlzRXh0ZW5kZWRMZW5ndGhQYXRoIHx8IGhhc05vbkFzY2lpKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblxuXHRyZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG59XG4iLCAiaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG5leHBvcnQgY29uc3QgdG9QYXRoID0gdXJsT3JQYXRoID0+IHVybE9yUGF0aCBpbnN0YW5jZW9mIFVSTCA/IGZpbGVVUkxUb1BhdGgodXJsT3JQYXRoKSA6IHVybE9yUGF0aDtcblxuZXhwb3J0IGNsYXNzIEZpbHRlclN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG5cdGNvbnN0cnVjdG9yKGZpbHRlcikge1xuXHRcdHN1cGVyKHtcblx0XHRcdG9iamVjdE1vZGU6IHRydWUsXG5cdFx0XHR0cmFuc2Zvcm0oZGF0YSwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG5cdFx0XHRcdGNhbGxiYWNrKHVuZGVmaW5lZCwgZmlsdGVyKGRhdGEpID8gZGF0YSA6IHVuZGVmaW5lZCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBpc05lZ2F0aXZlUGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVyblswXSA9PT0gJyEnO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGZhc3RHbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZ2l0SWdub3JlIGZyb20gJ2lnbm9yZSc7XG5pbXBvcnQgc2xhc2ggZnJvbSAnc2xhc2gnO1xuaW1wb3J0IHt0b1BhdGgsIGlzTmVnYXRpdmVQYXR0ZXJufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IGlnbm9yZUZpbGVzR2xvYk9wdGlvbnMgPSB7XG5cdGlnbm9yZTogW1xuXHRcdCcqKi9ub2RlX21vZHVsZXMnLFxuXHRcdCcqKi9mbG93LXR5cGVkJyxcblx0XHQnKiovY292ZXJhZ2UnLFxuXHRcdCcqKi8uZ2l0Jyxcblx0XSxcblx0YWJzb2x1dGU6IHRydWUsXG5cdGRvdDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBHSVRJR05PUkVfRklMRVNfUEFUVEVSTiA9ICcqKi8uZ2l0aWdub3JlJztcblxuY29uc3QgYXBwbHlCYXNlVG9QYXR0ZXJuID0gKHBhdHRlcm4sIGJhc2UpID0+IGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pXG5cdD8gJyEnICsgcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4uc2xpY2UoMSkpXG5cdDogcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4pO1xuXG5jb25zdCBwYXJzZUlnbm9yZUZpbGUgPSAoZmlsZSwgY3dkKSA9PiB7XG5cdGNvbnN0IGJhc2UgPSBzbGFzaChwYXRoLnJlbGF0aXZlKGN3ZCwgcGF0aC5kaXJuYW1lKGZpbGUuZmlsZVBhdGgpKSk7XG5cblx0cmV0dXJuIGZpbGUuY29udGVudFxuXHRcdC5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0LmZpbHRlcihsaW5lID0+IGxpbmUgJiYgIWxpbmUuc3RhcnRzV2l0aCgnIycpKVxuXHRcdC5tYXAocGF0dGVybiA9PiBhcHBseUJhc2VUb1BhdHRlcm4ocGF0dGVybiwgYmFzZSkpO1xufTtcblxuY29uc3QgdG9SZWxhdGl2ZVBhdGggPSAoZmlsZU9yRGlyZWN0b3J5LCBjd2QpID0+IHtcblx0Y3dkID0gc2xhc2goY3dkKTtcblx0aWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlT3JEaXJlY3RvcnkpKSB7XG5cdFx0aWYgKHNsYXNoKGZpbGVPckRpcmVjdG9yeSkuc3RhcnRzV2l0aChjd2QpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aC5yZWxhdGl2ZShjd2QsIGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoICR7ZmlsZU9yRGlyZWN0b3J5fSBpcyBub3QgaW4gY3dkICR7Y3dkfWApO1xuXHR9XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeTtcbn07XG5cbmNvbnN0IGdldElzSWdub3JlZFByZWRpY2F0ZSA9IChmaWxlcywgY3dkKSA9PiB7XG5cdGNvbnN0IHBhdHRlcm5zID0gZmlsZXMuZmxhdE1hcChmaWxlID0+IHBhcnNlSWdub3JlRmlsZShmaWxlLCBjd2QpKTtcblx0Y29uc3QgaWdub3JlcyA9IGdpdElnbm9yZSgpLmFkZChwYXR0ZXJucyk7XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeSA9PiB7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9QYXRoKGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9SZWxhdGl2ZVBhdGgoZmlsZU9yRGlyZWN0b3J5LCBjd2QpO1xuXHRcdHJldHVybiBmaWxlT3JEaXJlY3RvcnkgPyBpZ25vcmVzLmlnbm9yZXMoc2xhc2goZmlsZU9yRGlyZWN0b3J5KSkgOiBmYWxzZTtcblx0fTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMgPSAob3B0aW9ucyA9IHt9KSA9PiAoe1xuXHRjd2Q6IHRvUGF0aChvcHRpb25zLmN3ZCkgfHwgcHJvY2Vzcy5jd2QoKSxcblx0c3VwcHJlc3NFcnJvcnM6IEJvb2xlYW4ob3B0aW9ucy5zdXBwcmVzc0Vycm9ycyksXG5cdGRlZXA6IHR5cGVvZiBvcHRpb25zLmRlZXAgPT09ICdudW1iZXInID8gb3B0aW9ucy5kZWVwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzID0gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwfSA9IG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucyk7XG5cblx0Y29uc3QgcGF0aHMgPSBhd2FpdCBmYXN0R2xvYihwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdHBhdGhzLm1hcChhc3luYyBmaWxlUGF0aCA9PiAoe1xuXHRcdFx0ZmlsZVBhdGgsXG5cdFx0XHRjb250ZW50OiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0XHR9KSksXG5cdCk7XG5cblx0cmV0dXJuIGdldElzSWdub3JlZFByZWRpY2F0ZShmaWxlcywgY3dkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB7Y3dkLCBzdXBwcmVzc0Vycm9ycywgZGVlcH0gPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gZmFzdEdsb2Iuc3luYyhwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IHBhdGhzLm1hcChmaWxlUGF0aCA9PiAoe1xuXHRcdGZpbGVQYXRoLFxuXHRcdGNvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0fSkpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkaWNhdGUoZmlsZXMsIGN3ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNHaXRJZ25vcmVkID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzKEdJVElHTk9SRV9GSUxFU19QQVRURVJOLCBvcHRpb25zKTtcbmV4cG9ydCBjb25zdCBpc0dpdElnbm9yZWRTeW5jID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyhHSVRJR05PUkVfRklMRVNfUEFUVEVSTiwgb3B0aW9ucyk7XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG5vZGVQYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgbWVyZ2UyIGZyb20gJ21lcmdlMic7XG5pbXBvcnQgZmFzdEdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBkaXJHbG9iIGZyb20gJ2Rpci1nbG9iJztcbmltcG9ydCB7XG5cdEdJVElHTk9SRV9GSUxFU19QQVRURVJOLFxuXHRpc0lnbm9yZWRCeUlnbm9yZUZpbGVzLFxuXHRpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyxcbn0gZnJvbSAnLi9pZ25vcmUuanMnO1xuaW1wb3J0IHtGaWx0ZXJTdHJlYW0sIHRvUGF0aCwgaXNOZWdhdGl2ZVBhdHRlcm59IGZyb20gJy4vdXRpbGl0aWVzLmpzJztcblxuY29uc3QgYXNzZXJ0UGF0dGVybnNJbnB1dCA9IHBhdHRlcm5zID0+IHtcblx0aWYgKHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiB0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUGF0dGVybnMgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG5cdH1cbn07XG5cbmNvbnN0IHRvUGF0dGVybnNBcnJheSA9IHBhdHRlcm5zID0+IHtcblx0cGF0dGVybnMgPSBbLi4ubmV3IFNldChbcGF0dGVybnNdLmZsYXQoKSldO1xuXHRhc3NlcnRQYXR0ZXJuc0lucHV0KHBhdHRlcm5zKTtcblx0cmV0dXJuIHBhdHRlcm5zO1xufTtcblxuY29uc3QgY2hlY2tDd2RPcHRpb24gPSBvcHRpb25zID0+IHtcblx0aWYgKCFvcHRpb25zLmN3ZCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBzdGF0O1xuXHR0cnkge1xuXHRcdHN0YXQgPSBmcy5zdGF0U3luYyhvcHRpb25zLmN3ZCk7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGN3ZGAgb3B0aW9uIG11c3QgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5Jyk7XG5cdH1cbn07XG5cbmNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRpZ25vcmU6IG9wdGlvbnMuaWdub3JlIHx8IFtdLFxuXHRcdGV4cGFuZERpcmVjdG9yaWVzOiBvcHRpb25zLmV4cGFuZERpcmVjdG9yaWVzID09PSB1bmRlZmluZWRcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBvcHRpb25zLmV4cGFuZERpcmVjdG9yaWVzLFxuXHRcdGN3ZDogdG9QYXRoKG9wdGlvbnMuY3dkKSxcblx0fTtcblxuXHRjaGVja0N3ZE9wdGlvbihvcHRpb25zKTtcblxuXHRyZXR1cm4gb3B0aW9ucztcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUFyZ3VtZW50cyA9IGZuID0+IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4gZm4odG9QYXR0ZXJuc0FycmF5KHBhdHRlcm5zKSwgbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKSk7XG5jb25zdCBub3JtYWxpemVBcmd1bWVudHNTeW5jID0gZm4gPT4gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiBmbih0b1BhdHRlcm5zQXJyYXkocGF0dGVybnMpLCBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcblxuY29uc3QgZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCB7aWdub3JlRmlsZXMsIGdpdGlnbm9yZX0gPSBvcHRpb25zO1xuXG5cdGNvbnN0IHBhdHRlcm5zID0gaWdub3JlRmlsZXMgPyB0b1BhdHRlcm5zQXJyYXkoaWdub3JlRmlsZXMpIDogW107XG5cdGlmIChnaXRpZ25vcmUpIHtcblx0XHRwYXR0ZXJucy5wdXNoKEdJVElHTk9SRV9GSUxFU19QQVRURVJOKTtcblx0fVxuXG5cdHJldHVybiBwYXR0ZXJucztcbn07XG5cbmNvbnN0IGdldEZpbHRlciA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuXHRjb25zdCBpZ25vcmVGaWxlc1BhdHRlcm5zID0gZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyhvcHRpb25zKTtcblx0cmV0dXJuIGNyZWF0ZUZpbHRlckZ1bmN0aW9uKFxuXHRcdGlnbm9yZUZpbGVzUGF0dGVybnMubGVuZ3RoID4gMCAmJiBhd2FpdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzKGlnbm9yZUZpbGVzUGF0dGVybnMsIG9wdGlvbnMpLFxuXHQpO1xufTtcblxuY29uc3QgZ2V0RmlsdGVyU3luYyA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBpZ25vcmVGaWxlc1BhdHRlcm5zID0gZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyhvcHRpb25zKTtcblx0cmV0dXJuIGNyZWF0ZUZpbHRlckZ1bmN0aW9uKFxuXHRcdGlnbm9yZUZpbGVzUGF0dGVybnMubGVuZ3RoID4gMCAmJiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyhpZ25vcmVGaWxlc1BhdHRlcm5zLCBvcHRpb25zKSxcblx0KTtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbHRlckZ1bmN0aW9uID0gaXNJZ25vcmVkID0+IHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcblxuXHRyZXR1cm4gZmFzdEdsb2JSZXN1bHQgPT4ge1xuXHRcdGNvbnN0IHBhdGggPSBmYXN0R2xvYlJlc3VsdC5wYXRoIHx8IGZhc3RHbG9iUmVzdWx0O1xuXHRcdGNvbnN0IHBhdGhLZXkgPSBub2RlUGF0aC5ub3JtYWxpemUocGF0aCk7XG5cdFx0Y29uc3Qgc2Vlbk9ySWdub3JlZCA9IHNlZW4uaGFzKHBhdGhLZXkpIHx8IChpc0lnbm9yZWQgJiYgaXNJZ25vcmVkKHBhdGgpKTtcblx0XHRzZWVuLmFkZChwYXRoS2V5KTtcblx0XHRyZXR1cm4gIXNlZW5Pcklnbm9yZWQ7XG5cdH07XG59O1xuXG5jb25zdCB1bmlvbkZhc3RHbG9iUmVzdWx0cyA9IChyZXN1bHRzLCBmaWx0ZXIpID0+IHJlc3VsdHMuZmxhdCgpLmZpbHRlcihmYXN0R2xvYlJlc3VsdCA9PiBmaWx0ZXIoZmFzdEdsb2JSZXN1bHQpKTtcbmNvbnN0IHVuaW9uRmFzdEdsb2JTdHJlYW1zID0gKHN0cmVhbXMsIGZpbHRlcikgPT4gbWVyZ2UyKHN0cmVhbXMpLnBpcGUobmV3IEZpbHRlclN0cmVhbShmYXN0R2xvYlJlc3VsdCA9PiBmaWx0ZXIoZmFzdEdsb2JSZXN1bHQpKSk7XG5cbmNvbnN0IGNvbnZlcnROZWdhdGl2ZVBhdHRlcm5zID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhc2tzID0gW107XG5cblx0d2hpbGUgKHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBpbmRleCA9IHBhdHRlcm5zLmZpbmRJbmRleChwYXR0ZXJuID0+IGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pKTtcblxuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRhc2tzLnB1c2goe3BhdHRlcm5zLCBvcHRpb25zfSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRjb25zdCBpZ25vcmVQYXR0ZXJuID0gcGF0dGVybnNbaW5kZXhdLnNsaWNlKDEpO1xuXG5cdFx0Zm9yIChjb25zdCB0YXNrIG9mIHRhc2tzKSB7XG5cdFx0XHR0YXNrLm9wdGlvbnMuaWdub3JlLnB1c2goaWdub3JlUGF0dGVybik7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHtcblx0XHRcdFx0cGF0dGVybnM6IHBhdHRlcm5zLnNsaWNlKDAsIGluZGV4KSxcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdFx0XHQuLi5vcHRpb25zLmlnbm9yZSxcblx0XHRcdFx0XHRcdGlnbm9yZVBhdHRlcm4sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHBhdHRlcm5zID0gcGF0dGVybnMuc2xpY2UoaW5kZXggKyAxKTtcblx0fVxuXG5cdHJldHVybiB0YXNrcztcbn07XG5cbmNvbnN0IGdldERpckdsb2JPcHRpb25zID0gKG9wdGlvbnMsIGN3ZCkgPT4gKHtcblx0Li4uKGN3ZCA/IHtjd2R9IDoge30pLFxuXHQuLi4oQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IHtmaWxlczogb3B0aW9uc30gOiBvcHRpb25zKSxcbn0pO1xuXG5jb25zdCBnZW5lcmF0ZVRhc2tzID0gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGdsb2JUYXNrcyA9IGNvbnZlcnROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zLCBvcHRpb25zKTtcblxuXHRjb25zdCB7Y3dkLCBleHBhbmREaXJlY3Rvcmllc30gPSBvcHRpb25zO1xuXG5cdGlmICghZXhwYW5kRGlyZWN0b3JpZXMpIHtcblx0XHRyZXR1cm4gZ2xvYlRhc2tzO1xuXHR9XG5cblx0Y29uc3QgcGF0dGVybkV4cGFuZE9wdGlvbnMgPSBnZXREaXJHbG9iT3B0aW9ucyhleHBhbmREaXJlY3RvcmllcywgY3dkKTtcblx0Y29uc3QgaWdub3JlRXhwYW5kT3B0aW9ucyA9IGN3ZCA/IHtjd2R9IDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRnbG9iVGFza3MubWFwKGFzeW5jIHRhc2sgPT4ge1xuXHRcdFx0bGV0IHtwYXR0ZXJucywgb3B0aW9uc30gPSB0YXNrO1xuXG5cdFx0XHRbXG5cdFx0XHRcdHBhdHRlcm5zLFxuXHRcdFx0XHRvcHRpb25zLmlnbm9yZSxcblx0XHRcdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRcdGRpckdsb2IocGF0dGVybnMsIHBhdHRlcm5FeHBhbmRPcHRpb25zKSxcblx0XHRcdFx0ZGlyR2xvYihvcHRpb25zLmlnbm9yZSwgaWdub3JlRXhwYW5kT3B0aW9ucyksXG5cdFx0XHRdKTtcblxuXHRcdFx0cmV0dXJuIHtwYXR0ZXJucywgb3B0aW9uc307XG5cdFx0fSksXG5cdCk7XG59O1xuXG5jb25zdCBnZW5lcmF0ZVRhc2tzU3luYyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBnbG9iVGFza3MgPSBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cblx0Y29uc3Qge2N3ZCwgZXhwYW5kRGlyZWN0b3JpZXN9ID0gb3B0aW9ucztcblxuXHRpZiAoIWV4cGFuZERpcmVjdG9yaWVzKSB7XG5cdFx0cmV0dXJuIGdsb2JUYXNrcztcblx0fVxuXG5cdGNvbnN0IHBhdHRlcm5FeHBhbmRPcHRpb25zID0gZ2V0RGlyR2xvYk9wdGlvbnMoZXhwYW5kRGlyZWN0b3JpZXMsIGN3ZCk7XG5cdGNvbnN0IGlnbm9yZUV4cGFuZE9wdGlvbnMgPSBjd2QgPyB7Y3dkfSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gZ2xvYlRhc2tzLm1hcCh0YXNrID0+IHtcblx0XHRsZXQge3BhdHRlcm5zLCBvcHRpb25zfSA9IHRhc2s7XG5cdFx0cGF0dGVybnMgPSBkaXJHbG9iLnN5bmMocGF0dGVybnMsIHBhdHRlcm5FeHBhbmRPcHRpb25zKTtcblx0XHRvcHRpb25zLmlnbm9yZSA9IGRpckdsb2Iuc3luYyhvcHRpb25zLmlnbm9yZSwgaWdub3JlRXhwYW5kT3B0aW9ucyk7XG5cdFx0cmV0dXJuIHtwYXR0ZXJucywgb3B0aW9uc307XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdsb2JieSA9IG5vcm1hbGl6ZUFyZ3VtZW50cyhhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgW1xuXHRcdHRhc2tzLFxuXHRcdGZpbHRlcixcblx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRnZW5lcmF0ZVRhc2tzKHBhdHRlcm5zLCBvcHRpb25zKSxcblx0XHRnZXRGaWx0ZXIob3B0aW9ucyksXG5cdF0pO1xuXHRjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2IodGFzay5wYXR0ZXJucywgdGFzay5vcHRpb25zKSkpO1xuXG5cdHJldHVybiB1bmlvbkZhc3RHbG9iUmVzdWx0cyhyZXN1bHRzLCBmaWx0ZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBnbG9iYnlTeW5jID0gbm9ybWFsaXplQXJndW1lbnRzU3luYygocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFza3MgPSBnZW5lcmF0ZVRhc2tzU3luYyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cdGNvbnN0IGZpbHRlciA9IGdldEZpbHRlclN5bmMob3B0aW9ucyk7XG5cdGNvbnN0IHJlc3VsdHMgPSB0YXNrcy5tYXAodGFzayA9PiBmYXN0R2xvYi5zeW5jKHRhc2sucGF0dGVybnMsIHRhc2sub3B0aW9ucykpO1xuXG5cdHJldHVybiB1bmlvbkZhc3RHbG9iUmVzdWx0cyhyZXN1bHRzLCBmaWx0ZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBnbG9iYnlTdHJlYW0gPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXNrcyA9IGdlbmVyYXRlVGFza3NTeW5jKHBhdHRlcm5zLCBvcHRpb25zKTtcblx0Y29uc3QgZmlsdGVyID0gZ2V0RmlsdGVyU3luYyhvcHRpb25zKTtcblx0Y29uc3Qgc3RyZWFtcyA9IHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iLnN0cmVhbSh0YXNrLnBhdHRlcm5zLCB0YXNrLm9wdGlvbnMpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlN0cmVhbXMoc3RyZWFtcywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNEeW5hbWljUGF0dGVybiA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoXG5cdChwYXR0ZXJucywgb3B0aW9ucykgPT4gcGF0dGVybnMuc29tZShwYXR0ZXJuID0+IGZhc3RHbG9iLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2xvYlRhc2tzID0gbm9ybWFsaXplQXJndW1lbnRzKGdlbmVyYXRlVGFza3MpO1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2xvYlRhc2tzU3luYyA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoZ2VuZXJhdGVUYXNrc1N5bmMpO1xuXG5leHBvcnQge1xuXHRpc0dpdElnbm9yZWQsXG5cdGlzR2l0SWdub3JlZFN5bmMsXG59IGZyb20gJy4vaWdub3JlLmpzJztcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1vcGVuYXBpXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRlLXJvdXRlLXR5cGVzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzXCJcbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHtcbiAgT3BlbkFwaUJ1aWxkZXIsXG4gIE9wZXJhdGlvbk9iamVjdCxcbiAgUGFyYW1ldGVyT2JqZWN0LFxufSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSBcIi4uL2xpYi96b2Qtb3BlbmFwaVwiXG5pbXBvcnQgeyBlbWJlZFNjaGVtYVJlZmVyZW5jZXMgfSBmcm9tIFwiLi9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlc1wiXG5pbXBvcnQgeyBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEgfSBmcm9tIFwiLi9mZXJuLXNkay11dGlsc1wiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi4vbGliL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbmZ1bmN0aW9uIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZShzdHI6IHN0cmluZykge1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIGNvbnN0IGZpcnN0Q2hhciA9IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKVxuICByZXR1cm4gZmlyc3RDaGFyICsgc3RyLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb09wZXJhdGlvbklkKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aFxuICAgIC5yZXBsYWNlKC8tL2csIFwiX1wiKVxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCB0cmFuc2Zvcm1lZFBhcnRzID0gcGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgaWYgKHBhcnQuc3RhcnRzV2l0aChcIltcIikgJiYgcGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBCeVBhcmFtXG4gICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHBhcnQuc2xpY2UoMSwgLTEpXG4gICAgICBjb25zdCB3b3JkcyA9IHNlcnZpY2VOYW1lLnNwbGl0KFwiX1wiKVxuICAgICAgY29uc3QgY2FwaXRhbGl6ZWRXb3JkcyA9IHdvcmRzLm1hcChcbiAgICAgICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXG4gICAgICApXG4gICAgICByZXR1cm4gYEJ5JHtjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIil9YFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IGFwaV9wYXRoIHRvIEFwaVBhdGhcbiAgICAgIGNvbnN0IHdvcmRzID0gcGFydC5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGNhcGl0YWxpemVkV29yZHMuam9pbihcIlwiKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcmVwbGFjZUZpcnN0Q2hhclRvTG93ZXJjYXNlKHRyYW5zZm9ybWVkUGFydHMuam9pbihcIlwiKSlcbn1cblxuZnVuY3Rpb24gcGFzY2FsQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5zcGxpdChcIiBcIilcbiAgY29uc3QgY2FwaXRhbGl6ZWRXb3JkcyA9IHdvcmRzLm1hcChcbiAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKVxuICApXG4gIGNvbnN0IHBhc2NhbENhc2VTdHJpbmcgPSBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgcmV0dXJuIHBhc2NhbENhc2VTdHJpbmdcbn1cblxuaW50ZXJmYWNlIFRhZ09wdGlvbiB7XG4gIG5hbWU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGRvZXNSb3V0ZUhhdmVUYWc/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVPcGVuQVBJT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIHRhZ3M/OiBBcnJheTxUYWdPcHRpb24+XG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbiBPcGVuQVBJIHNwZWMgZnJvbSB0aGUgTmV4dC5qcyBBUEkgcm91dGVzLlxuICpcbiAqIFlvdSBub3JtYWxseSBpbnZva2UgdGhpcyB3aXRoIGBuZXh0YXBpIGdlbmVyYXRlLW9wZW5hcGlgIGluIGFcbiAqIFwiYnVpbGQ6b3BlbmFwaVwiIHBhY2thZ2UuanNvbiBzY3JpcHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9wZW5BUEkob3B0czogR2VuZXJhdGVPcGVuQVBJT3B0cykge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCB7IG91dHB1dEZpbGUsIHRhZ3MgPSBbXSB9ID0gb3B0c1xuXG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICAvLyBUT0RPIGRldGVjdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2V0dXBzIGFuZCBvdXRwdXQgZGlmZmVyZW50IEFQSXNcbiAgY29uc3QgeyBzZXR1cFBhcmFtczogZ2xvYmFsU2V0dXBQYXJhbXMgfSA9IGZpbGVwYXRoVG9Sb3V0ZUZuLnZhbHVlcygpLm5leHQoKVxuICAgIC52YWx1ZSBhcyB7IHNldHVwUGFyYW1zOiBTZXR1cFBhcmFtcyB9XG5cbiAgY29uc3Qgc2VjdXJpdHlTY2hlbWVzID0gZ2xvYmFsU2V0dXBQYXJhbXMuc2VjdXJpdHlTY2hlbWFzID8/IHt9XG4gIGNvbnN0IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlID0ge31cbiAgZm9yIChjb25zdCBhdXRoTmFtZSBvZiBPYmplY3Qua2V5cyhnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcCkpIHtcbiAgICBjb25zdCBtdyA9IGdsb2JhbFNldHVwUGFyYW1zLmF1dGhNaWRkbGV3YXJlTWFwW2F1dGhOYW1lXVxuICAgIGlmIChtdy5zZWN1cml0eVNjaGVtYSkge1xuICAgICAgc2VjdXJpdHlTY2hlbWVzW2F1dGhOYW1lXSA9IChtdyBhcyBhbnkpLnNlY3VyaXR5U2NoZW1hXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGBBdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlIFwiJHthdXRoTmFtZX1cIiBoYXMgbm8gc2VjdXJpdHlTY2hlbWEuIFlvdSBjYW4gZGVmaW5lIHRoaXMgb24gdGhlIGZ1bmN0aW9uIChlLmcuIGFmdGVyIHRoZSBleHBvcnQgZG8uLi4gXFxuXFxubXlNaWRkbGV3YXJlLnNlY3VyaXR5U2NoZW1hID0ge1xcbiAgdHlwZTogXCJodHRwXCJcXG4gIHNjaGVtZTogXCJiZWFyZXJcIlxcbiAgYmVhcmVyRm9ybWF0OiBcIkpXVFwiXFxuIC8vIG9yIEFQSSBUb2tlbiBldGMuXFxufVxcblxcbllvdSBjYW4gYWxzbyBkZWZpbmUgXCJzZWN1cml0eU9iamVjdHNcIiB0aGlzIHdheSwgaWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgZW5kcG9pbnQgc3VwcG9ydCBtdWx0aXBsZSBtb2RlcyBvZiBhdXRoZW50aWNhdGlvbi5cXG5cXG5gXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eU9iamVjdHMgfHwgW1xuICAgICAge1xuICAgICAgICBbYXV0aE5hbWVdOiBbXSxcbiAgICAgIH0sXG4gICAgXVxuICB9XG5cbiAgY29uc3QgZ2xvYmFsU2NoZW1hcyA9IHt9XG4gIGZvciAoY29uc3QgW3NjaGVtYU5hbWUsIHpvZFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgZ2xvYmFsU2V0dXBQYXJhbXMuZ2xvYmFsU2NoZW1hcyA/PyB7fVxuICApKSB7XG4gICAgZ2xvYmFsU2NoZW1hc1tzY2hlbWFOYW1lXSA9IGdlbmVyYXRlU2NoZW1hKHpvZFNjaGVtYSlcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdsb2JhbFNjaGVtYXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJiYXRjaFwiKSB7XG4gICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgZ2xvYmFsU2NoZW1hcylcbiAgICAgIGdsb2JhbFNjaGVtYXNba2V5XSA9IHNjaGVtYVdpdGhSZWZlcmVuY2VzXG4gICAgfVxuICB9XG5cbiAgLy8gQnVpbGQgT3BlbkFQSSBzcGVjXG4gIGNvbnN0IGJ1aWxkZXIgPSBPcGVuQXBpQnVpbGRlci5jcmVhdGUoe1xuICAgIG9wZW5hcGk6IFwiMy4wLjBcIixcbiAgICBpbmZvOiB7XG4gICAgICB0aXRsZTogZ2xvYmFsU2V0dXBQYXJhbXMuYXBpTmFtZSxcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICB9LFxuICAgIHNlcnZlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgdXJsOiBnbG9iYWxTZXR1cFBhcmFtcy5wcm9kdWN0aW9uU2VydmVyVXJsIHx8IFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHRhZ3M6IHRhZ3MubWFwKCh0YWcpID0+ICh7IG5hbWU6IHRhZy5uYW1lLCBkZXNjcmlwdGlvbjogdGFnLmRlc2NyaXB0aW9uIH0pKSxcbiAgICBwYXRoczoge30sXG4gICAgY29tcG9uZW50czoge1xuICAgICAgc2VjdXJpdHlTY2hlbWVzLFxuICAgICAgc2NoZW1hczogZ2xvYmFsU2NoZW1hcyxcbiAgICB9LFxuICB9KVxuXG4gIGZvciAoY29uc3QgW1xuICAgIGZpbGVfcGF0aCxcbiAgICB7IHNldHVwUGFyYW1zLCByb3V0ZVNwZWMsIHJvdXRlOiByb3V0ZVBhdGggfSxcbiAgXSBvZiBmaWxlcGF0aFRvUm91dGVGbikge1xuICAgIGNvbnN0IG1ldGhvZHMgPSByb3V0ZVNwZWMubWV0aG9kc1xuICAgIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYFNraXBwaW5nIHJvdXRlICR7cm91dGVQYXRofSBiZWNhdXNlIGl0IGhhcyBubyBtZXRob2RzLmApXG4gICAgICApXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGxldCBkZXNjcmlwdGlvbiA9IHJvdXRlU3BlYy5kZXNjcmlwdGlvblxuICAgIGxldCBkZXNjcmlwdGlvbk1ldGFkYXRhOiB7XG4gICAgICByZXNwb25zZV9rZXk/OiBzdHJpbmdcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueVxuICAgIH0gPSB7fVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoZGVzY3JpcHRpb24pLnRyaW0oKVxuXG4gICAgICBpZiAodGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpIHtcbiAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgICAgICAgZGVzY3JpcHRpb25NZXRhZGF0YSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0cmltbWVkRGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhID0gcHJlZml4T2JqZWN0S2V5c1dpdGhYKFxuICAgICAgZGFzaGlmeU9iamVjdEtleXMoZGVzY3JpcHRpb25NZXRhZGF0YSlcbiAgICApXG5cbiAgICBjb25zdCBtZXRob2RSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbk9iamVjdD4gPSB7fVxuXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLmluY2x1ZGVzKG1ldGhvZClcblxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgICBsZXQgYm9keV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHkgPz8gcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuXG4gICAgICAgIGlmIChyb3V0ZVNwZWMuanNvbkJvZHkgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHlcbiAgICAgIH1cblxuICAgICAgbGV0IHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgICAgaWYgKGlzUG9zdE9yUHV0T3JQYXRjaCkge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9XG4gICAgICAgICAgcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgICBpZiAocm91dGVTcGVjLnF1ZXJ5UGFyYW1zICYmIHJvdXRlU3BlYy5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXMubWVyZ2UoXG4gICAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvdXRlOiBPcGVyYXRpb25PYmplY3QgPSB7XG4gICAgICAgIC4uLnJvdXRlU3BlYy5vcGVuQXBpTWV0YWRhdGEsXG4gICAgICAgIC4uLmZvcm1hdHRlZERlc2NyaXB0aW9uTWV0YWRhdGEsXG4gICAgICAgIHN1bW1hcnk6IHJvdXRlUGF0aCxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgIG9wZXJhdGlvbklkOiBgJHt0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChyb3V0ZVBhdGgpfSR7cGFzY2FsQ2FzZShcbiAgICAgICAgICBtZXRob2RcbiAgICAgICAgKX1gLFxuICAgICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9LXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICA0MDA6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICA0MDE6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3VyaXR5OiBBcnJheS5pc0FycmF5KHJvdXRlU3BlYy5hdXRoKVxuICAgICAgICAgID8gcm91dGVTcGVjLmF1dGhcbiAgICAgICAgICAgICAgLm1hcCgoYXV0aFR5cGUpID0+IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW2F1dGhUeXBlXSlcbiAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgIDogc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbcm91dGVTcGVjLmF1dGhdLFxuICAgICAgfVxuXG4gICAgICBpZiAoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgICAgcm91dGUucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBnZW5lcmF0ZVNjaGVtYShib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSlcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyT2JqZWN0W10gPSBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzIGFzIGFueVxuICAgICAgICAgICkubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBpbjogXCJxdWVyeVwiLFxuICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYS5wcm9wZXJ0aWVzIVtuYW1lXSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMobmFtZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJvdXRlLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBqc29uUmVzcG9uc2UgfSA9IHJvdXRlU3BlY1xuICAgICAgY29uc3QgeyBhZGRPa1N0YXR1cyA9IHRydWUgfSA9IHNldHVwUGFyYW1zXG5cbiAgICAgIGlmIChqc29uUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFqc29uUmVzcG9uc2UuX2RlZiB8fFxuICAgICAgICAgICFqc29uUmVzcG9uc2UuX2RlZi50eXBlTmFtZSB8fFxuICAgICAgICAgIGpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE9iamVjdFwiXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHJvdXRlICR7cm91dGVQYXRofSBiZWNhdXNlIHRoZSByZXNwb25zZSBpcyBub3QgYSBab2RPYmplY3QuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShcbiAgICAgICAgICBhZGRPa1N0YXR1cyAmJiBqc29uUmVzcG9uc2UgaW5zdGFuY2VvZiB6LlpvZE9iamVjdFxuICAgICAgICAgICAgPyBqc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pXG4gICAgICAgICAgICA6IGpzb25SZXNwb25zZVxuICAgICAgICApXG5cbiAgICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXMoXG4gICAgICAgICAgcmVzcG9uc2VTY2hlbWEsXG4gICAgICAgICAgZ2xvYmFsU2NoZW1hc1xuICAgICAgICApXG5cbiAgICAgICAgaWYgKHJvdXRlLnJlc3BvbnNlcyAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIG5vdCBoYXJkY29kZSAyMDAgaGVyZVxuICAgICAgICAgIHJvdXRlLnJlc3BvbnNlc1syMDBdLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYVdpdGhSZWZlcmVuY2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcm91dGUudGFncyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgIGlmICh0YWcuZG9lc1JvdXRlSGF2ZVRhZyAmJiB0YWcuZG9lc1JvdXRlSGF2ZVRhZyhyb3V0ZS5zdW1tYXJ5IHx8IFwiXCIpKSB7XG4gICAgICAgICAgcm91dGUudGFncy5wdXNoKHRhZy5uYW1lKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YSA9IGF3YWl0IG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YSh7XG4gICAgICAgIG1ldGhvZHM6IFttZXRob2RdLCAvLyBPbmx5IHBhc3MgdGhpcyBzcGVjaWZpYyBtZXRob2RcbiAgICAgICAgcGF0aDogcm91dGVQYXRoLFxuICAgICAgICBzZGtSZXR1cm5WYWx1ZTpcbiAgICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhPy5yZXNwb25zZV9rZXkgPz8gcm91dGVTcGVjLnNka1JldHVyblZhbHVlLFxuICAgICAgfSlcblxuICAgICAgT2JqZWN0LmFzc2lnbihyb3V0ZSwgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhW21ldGhvZF0pXG4gICAgICBtZXRob2RSb3V0ZXNbbWV0aG9kLnRvTG93ZXJDYXNlKCldID0gcm91dGVcbiAgICB9XG5cbiAgICBidWlsZGVyLmFkZFBhdGgocm91dGVQYXRoLCBtZXRob2RSb3V0ZXMpXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCBnbG9iYnkgPSAoYXdhaXQgaW1wb3J0KFwiZ2xvYmJ5XCIpKS5nbG9iYnlcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcm91dGVGbi5fcm91dGVTcGVjPy5leGNsdWRlRnJvbU9wZW5BcGkgJiZcbiAgICAgICAgICAhb3B0cy5pbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JheShcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZCBmcm9tIE9wZW5BUEkgZ2VuZXJhdGlvblwiYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgIi8qKlxuICogWm9kIE9wZW5BUEkgR2VuZXJhdG9yLlxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuYXRpbmUvem9kLXBsdWdpbnNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBCcmlhbiBNY0JyaWRlXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU9iamVjdCwgU2NoZW1hT2JqZWN0VHlwZSB9IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5pbXBvcnQgbWVyZ2UgZnJvbSBcInRzLWRlZXBtZXJnZVwiXG5pbXBvcnQgeyBBbnlab2RPYmplY3QsIHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW10gfVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BcGlab2RBbnkgZXh0ZW5kcyBab2RUeXBlQW55IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBPcGVuQXBpWm9kQW55T2JqZWN0IGV4dGVuZHMgQW55Wm9kT2JqZWN0IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBQYXJzaW5nQXJnczxUPiB7XG4gIHpvZFJlZjogVFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbiAgdXNlT3V0cHV0PzogYm9vbGVhblxuICBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kQXBpPFQgZXh0ZW5kcyBPcGVuQXBpWm9kQW55PihcbiAgc2NoZW1hOiBULFxuICBzY2hlbWFPYmplY3Q6IEFuYXRpbmVTY2hlbWFPYmplY3QgPSB7fVxuKTogVCB7XG4gIHNjaGVtYS5tZXRhT3BlbkFwaSA9IE9iamVjdC5hc3NpZ24oc2NoZW1hLm1ldGFPcGVuQXBpIHx8IHt9LCBzY2hlbWFPYmplY3QpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVpvZE9iamVjdCh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxPcGVuQXBpWm9kQW55T2JqZWN0Pikge1xuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoem9kUmVmLnNoYXBlKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gaGlkZURlZmluaXRpb25zPy5pbmNsdWRlcyhrZXkpID09PSBmYWxzZSlcbiAgICAucmVkdWNlKFxuICAgICAgKGNhcnJ5LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmNhcnJ5LFxuICAgICAgICBba2V5XTogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnNoYXBlW2tleV0sIHVzZU91dHB1dCksXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIFNjaGVtYU9iamVjdD5cbiAgICApXG5cbiAgcmV0dXJuIHJlZHVjZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbih6b2RSZWY6IE9wZW5BcGlab2RBbnkpOiBTY2hlbWFPYmplY3Qge1xuICBpZiAoIXpvZFJlZi5kZXNjcmlwdGlvbikgcmV0dXJuIHt9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudCh6b2RSZWYuZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpXG4gICAgcmV0dXJuIHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKGJvZHkudHJpbSgpKSBvdXRwdXQuZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBwcmVmaXhPYmplY3RLZXlzV2l0aFgoZGFzaGlmeU9iamVjdEtleXMoYXR0cmlidXRlcykpXG4gICAgKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybWF0aW9uKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFRyYW5zZm9ybWVyPG5ldmVyPiB8IHouWm9kRWZmZWN0czxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgaW5wdXQgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5zY2hlbWEsIHVzZU91dHB1dClcblxuICBsZXQgb3V0cHV0ID0gXCJ1bmRlZmluZWRcIlxuICBpZiAodXNlT3V0cHV0ICYmIHpvZFJlZi5fZGVmLmVmZmVjdCkge1xuICAgIGNvbnN0IGVmZmVjdCA9XG4gICAgICB6b2RSZWYuX2RlZi5lZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IHpvZFJlZi5fZGVmLmVmZmVjdCA6IG51bGxcbiAgICBpZiAoZWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gZWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgZWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICAuLi4oem9kUmVmLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi5pbnB1dCxcbiAgICAgIC4uLihbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJib29sZWFuXCIsIFwibnVsbFwiXS5pbmNsdWRlcyhvdXRwdXQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogb3V0cHV0IGFzIFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCIgfCBcIm51bGxcIixcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RTdHJpbmc+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXVpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiY3VpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJkYXRlLXRpbWVcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZWdleFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnBhdHRlcm4gPSBpdGVtLnJlZ2V4LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bWJlcj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBmb3JtYXQ6IFwiZmxvYXRcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4aW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUFNUUkVBTTogVGhlIG9wZW5hcGkzLXRzIHR5cGVzIGFyZSB3cm9uZzogZXhjbHVzaXZlTWF4aW11bSBpcyBhIGJvb2xlYW4gaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAvLyBodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL3YzXzAvZGF0YS1tb2RlbHMvZGF0YS10eXBlcy9cbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbmltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1pbmltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS50eXBlID0gXCJpbnRlZ2VyXCJcbiAgICAgICAgZGVsZXRlIGJhc2VTY2hlbWEuZm9ybWF0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICBiYXNlU2NoZW1hLm11bHRpcGxlT2YgPSBpdGVtLnZhbHVlXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4Y2x1ZGVkRGVmaW5pdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpKSB7XG4gICAgICBleGNsdWRlZERlZmluaXRpb25zLnB1c2goLi4uc2NoZW1hLmhpZGVEZWZpbml0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhjbHVkZWREZWZpbml0aW9uc1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2RPYmplY3Q8bmV2ZXIsIFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCI+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3RbXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbD8uX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROZXZlclwiXG4gICAgKVxuICApXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5jYXRjaGFsbCwgdXNlT3V0cHV0KVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuXG4gIC8vIFNvIHRoYXQgYHVuZGVmaW5lZGAgdmFsdWVzIGRvbid0IGVuZCB1cCBpbiB0aGUgc2NoZW1hIGFuZCBiZSB3ZWlyZFxuICBhZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCA/IHsgYWRkaXRpb25hbFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgY29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoXG4gICAgKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVcbiAgKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgcHJvcGVydGllczogaXRlcmF0ZVpvZE9iamVjdCh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIE9wZW5BcGlab2RBbnlPYmplY3QsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgICAgaGlkZURlZmluaXRpb25zOiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShzY2hlbWFzKSxcbiAgICAgIH0pLFxuICAgICAgLi4ucmVxdWlyZWQsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAgIC4uLmhpZGVEZWZpbml0aW9ucyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUmVjb3JkPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczpcbiAgICAgICAgem9kUmVmLl9kZWYudmFsdWVUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudmFsdWVUeXBlLCB1c2VPdXRwdXQpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJpZ0ludCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQmlnSW50Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJib29sZWFuXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kRGF0ZT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcInN0cmluZ1wiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJkYXRlLXRpbWVcIiB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kTnVsbD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVsbGFibGUoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVsbGFibGU8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpXG4gIHJldHVybiBtZXJnZShcbiAgICB7IC4uLnNjaGVtYSwgdHlwZTogc2NoZW1hLnR5cGUsIG51bGxhYmxlOiB0cnVlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURlZmF1bHQoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kRGVmYXVsdDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgZGVmYXVsdDogem9kUmVmLl9kZWYuZGVmYXVsdFZhbHVlKCksXG4gICAgICAuLi5nZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbm5lclR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJyYXkoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kQXJyYXk8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29uc3RyYWludHM6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmICh6b2RSZWYuX2RlZi5leGFjdExlbmd0aCAhPSBudWxsKSB7XG4gICAgY29uc3RyYWludHMubWluSXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICAgIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gem9kUmVmLl9kZWYuZXhhY3RMZW5ndGgudmFsdWVcbiAgfVxuXG4gIGlmICh6b2RSZWYuX2RlZi5taW5MZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLm1pbkxlbmd0aC52YWx1ZVxuICBpZiAoem9kUmVmLl9kZWYubWF4TGVuZ3RoICE9IG51bGwpXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5tYXhMZW5ndGgudmFsdWVcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJhcnJheVwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBpdGVtczogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLmVsZW1lbnQsIHVzZU91dHB1dCksXG4gICAgICAuLi5jb25zdHJhaW50cyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2Ygem9kUmVmLl9kZWYudmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt6b2RSZWYuX2RlZi52YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kRW51bTxuZXZlcj4gfCB6LlpvZE5hdGl2ZUVudW08bmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpWzBdIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiLFxuICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5sZWZ0LCB1c2VPdXRwdXQpLFxuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5yaWdodCwgdXNlT3V0cHV0KSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVW5pb248W3ouWm9kVHlwZUFueSwgLi4uei5ab2RUeXBlQW55W11dPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb250ZW50cyA9IHpvZFJlZi5fZGVmLm9wdGlvbnNcbiAgaWYgKFxuICAgIGNvbnRlbnRzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PiBwcmV2ICYmIGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2RMaXRlcmFsXCIsXG4gICAgICB0cnVlXG4gICAgKVxuICApIHtcbiAgICAvLyBzcGVjaWFsIGNhc2UgdG8gdHJhbnNmb3JtIHVuaW9ucyBvZiBsaXRlcmFscyBpbnRvIGVudW1zXG4gICAgY29uc3QgbGl0ZXJhbHMgPSBjb250ZW50cyBhcyB1bmtub3duIGFzIHouWm9kTGl0ZXJhbDxPcGVuQXBpWm9kQW55PltdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PlxuICAgICAgICAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgPyB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgbnVsbCBhcyBudWxsIHwgc3RyaW5nXG4gICAgKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgICAgICBlbnVtOiBsaXRlcmFscy5tYXAoKGxpdGVyYWwpID0+IGxpdGVyYWwuX2RlZi52YWx1ZSksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAgICAgLi4uc2NoZW1hc1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzTnVsbGFibGUgPSBjb250ZW50cy5zb21lKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgIT09IFwiWm9kTnVsbFwiXG4gIClcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8XG4gIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPHN0cmluZywgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdPlxuPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkaXNjcmltaW5hdG9yOiB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICB9LFxuICAgICAgb25lT2Y6IEFycmF5LmZyb20oXG4gICAgICAgIChcbiAgICAgICAgICB6b2RSZWYgYXMgei5ab2REaXNjcmltaW5hdGVkVW5pb248XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W11cbiAgICAgICAgICA+XG4gICAgICAgICkuX2RlZi5vcHRpb25zLnZhbHVlcygpXG4gICAgICApLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoeyByZWFkT25seTogdHJ1ZSB9LCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlQnJhbmRlZCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kQnJhbmRlZDx6LlpvZEFueSwgc3RyaW5nPj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudHlwZSksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UocGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBpcGVsaW5lKHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFBpcGVsaW5lPG5ldmVyLCBuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKHVzZU91dHB1dCkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5vdXQsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW4sIHVzZU91dHB1dClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWFkb25seSh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWFkb25seTx6LlpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmNvbnN0IHdvcmtlck1hcCA9IHtcbiAgWm9kT2JqZWN0OiBwYXJzZU9iamVjdCxcbiAgWm9kUmVjb3JkOiBwYXJzZVJlY29yZCxcbiAgWm9kU3RyaW5nOiBwYXJzZVN0cmluZyxcbiAgWm9kTnVtYmVyOiBwYXJzZU51bWJlcixcbiAgWm9kQmlnSW50OiBwYXJzZUJpZ0ludCxcbiAgWm9kQm9vbGVhbjogcGFyc2VCb29sZWFuLFxuICBab2REYXRlOiBwYXJzZURhdGUsXG4gIFpvZE51bGw6IHBhcnNlTnVsbCxcbiAgWm9kT3B0aW9uYWw6IHBhcnNlT3B0aW9uYWwsXG4gIFpvZE51bGxhYmxlOiBwYXJzZU51bGxhYmxlLFxuICBab2REZWZhdWx0OiBwYXJzZURlZmF1bHQsXG4gIFpvZEFycmF5OiBwYXJzZUFycmF5LFxuICBab2RMaXRlcmFsOiBwYXJzZUxpdGVyYWwsXG4gIFpvZEVudW06IHBhcnNlRW51bSxcbiAgWm9kTmF0aXZlRW51bTogcGFyc2VFbnVtLFxuICBab2RUcmFuc2Zvcm1lcjogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kRWZmZWN0czogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kSW50ZXJzZWN0aW9uOiBwYXJzZUludGVyc2VjdGlvbixcbiAgWm9kVW5pb246IHBhcnNlVW5pb24sXG4gIFpvZERpc2NyaW1pbmF0ZWRVbmlvbjogcGFyc2VEaXNjcmltaW5hdGVkVW5pb24sXG4gIFpvZE5ldmVyOiBwYXJzZU5ldmVyLFxuICBab2RCcmFuZGVkOiBwYXJzZUJyYW5kZWQsXG4gIC8vIFRPRE8gVHJhbnNmb3JtIHRoZSByZXN0IHRvIHNjaGVtYXNcbiAgWm9kVW5kZWZpbmVkOiBjYXRjaEFsbFBhcnNlcixcbiAgLy8gVE9ETzogYHByZWZpeEl0ZW1zYCBpcyBhbGxvd2VkIGluIE9wZW5BUEkgMy4xIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0dXBsZXNcbiAgWm9kVHVwbGU6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RNYXA6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RGdW5jdGlvbjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZExhenk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQcm9taXNlOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kQW55OiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVW5rbm93bjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFZvaWQ6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQaXBlbGluZTogcGFyc2VQaXBlbGluZSxcbiAgWm9kUmVhZG9ubHk6IHBhcnNlUmVhZG9ubHksXG59XG50eXBlIFdvcmtlcktleXMgPSBrZXlvZiB0eXBlb2Ygd29ya2VyTWFwXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYShcbiAgem9kUmVmOiBPcGVuQXBpWm9kQW55LFxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IG1ldGFPcGVuQXBpID0ge30gfSA9IHpvZFJlZlxuICBjb25zdCBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W10gPSBbXG4gICAgLi4uKEFycmF5LmlzQXJyYXkobWV0YU9wZW5BcGkpID8gbWV0YU9wZW5BcGkgOiBbbWV0YU9wZW5BcGldKSxcbiAgXVxuICB0cnkge1xuICAgIGNvbnN0IHR5cGVOYW1lID0gem9kUmVmLl9kZWYudHlwZU5hbWUgYXMgV29ya2VyS2V5c1xuICAgIGlmICh0eXBlTmFtZSBpbiB3b3JrZXJNYXApIHtcbiAgICAgIHJldHVybiB3b3JrZXJNYXBbdHlwZU5hbWVdKHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgbmV2ZXIsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9XG59XG4iLCAiLyoqXG4gKiBGcm9udC1NYXR0ZXJcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qeHNvbi9mcm9udC1tYXR0ZXJcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgSmFzb24gQ2FtcGJlbGwgKFwiQXV0aG9yXCIpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBsb2FkIH0gZnJvbSBcImpzLXlhbWxcIlxuY29uc3Qgb3B0aW9uYWxCeXRlT3JkZXJNYXJrID0gXCJcXFxcdWZlZmY/XCJcbmNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgPyBwcm9jZXNzLnBsYXRmb3JtIDogXCJcIlxuY29uc3QgcGF0dGVybiA9XG4gIFwiXihcIiArXG4gIG9wdGlvbmFsQnl0ZU9yZGVyTWFyayArXG4gIFwiKD0geWFtbCA9fC0tLSlcIiArXG4gIFwiJChbXFxcXHNcXFxcU10qPylcIiArXG4gIFwiXig/OlxcXFwyfFxcXFwuXFxcXC5cXFxcLilcXFxccypcIiArXG4gIFwiJFwiICtcbiAgKHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxyP1wiIDogXCJcIikgK1xuICBcIig/OlxcXFxuKT8pXCJcbi8vIE5PVEU6IElmIHRoaXMgcGF0dGVybiB1c2VzIHRoZSAnZycgZmxhZyB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBkZWZpbml0aW9uIHdpbGxcbi8vIG5lZWQgdG8gYmUgbW92ZWQgZG93biBpbnRvIHRoZSBmdW5jdGlvbnMgdGhhdCB1c2UgaXQuXG5jb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJtXCIpXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKFxuICBzdHJpbmc6IHN0cmluZyxcbiAgb3B0aW9ucyA9IHt9XG4pOiB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBib2R5OiBzdHJpbmc7IGJvZHlCZWdpbjogbnVtYmVyIH0ge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7IGFsbG93VW5zYWZlOiBmYWxzZSB9XG4gIG9wdGlvbnMgPVxuICAgIG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgID8geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9XG4gICAgICA6IGRlZmF1bHRPcHRpb25zXG4gIHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCgvKFxccj9cXG4pLylcbiAgaWYgKGxpbmVzWzBdICYmIC89IHlhbWwgPXwtLS0vLnRlc3QobGluZXNbMF0pKSB7XG4gICAgcmV0dXJuIHBhcnNlKHN0cmluZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMb2NhdGlvbihtYXRjaDogUmVnRXhwRXhlY0FycmF5LCBib2R5OiBzdHJpbmcpIHtcbiAgdmFyIGxpbmUgPSAxXG4gIHZhciBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIilcbiAgdmFyIG9mZnNldCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG5cbiAgd2hpbGUgKHBvcyAhPT0gLTEpIHtcbiAgICBpZiAocG9zID49IG9mZnNldCkge1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG4gICAgbGluZSsrXG4gICAgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIsIHBvcyArIDEpXG4gIH1cblxuICByZXR1cm4gbGluZVxufVxuXG5mdW5jdGlvbiBwYXJzZShzdHJpbmc6IHN0cmluZyk6IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgYm9keTogc3RyaW5nXG4gIGJvZHlCZWdpbjogbnVtYmVyXG59IHtcbiAgdmFyIG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG5cbiAgdmFyIHlhbWwgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBcIlwiKVxuICB2YXIgYXR0cmlidXRlcyA9IChsb2FkKHlhbWwpIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB2YXIgYm9keSA9IHN0cmluZy5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKVxuICB2YXIgbGluZSA9IGNvbXB1dGVMb2NhdGlvbihtYXRjaCwgc3RyaW5nKVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICBib2R5OiBib2R5LFxuICAgIGJvZHlCZWdpbjogbGluZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdEZyb250TWF0dGVyKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG5cbiAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyaW5nKVxufVxuIiwgInR5cGUgUHJlZml4ZWRPYmplY3Q8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgYHgtJHtzdHJpbmcgJiBLfWBdOiBUW0tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhPYmplY3RLZXlzV2l0aFg8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVFxuKTogUHJlZml4ZWRPYmplY3Q8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtgeC0ke2tleX1gLCB2YWx1ZV0pXG4gICkgYXMgUHJlZml4ZWRPYmplY3Q8VD5cbn1cbiIsICJ0eXBlIFNuYWtlVG9EYXNoPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBzdHJpbmcgPyBTbmFrZVRvRGFzaFN0cmluZzxLPiA6IEtdOiBUW0tdXG59XG5cbnR5cGUgU25ha2VUb0Rhc2hTdHJpbmc8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgVH1fJHtpbmZlciBVfWBcbiAgPyBgJHtUfS0ke1NuYWtlVG9EYXNoU3RyaW5nPFU+fWBcbiAgOiBTXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoaWZ5T2JqZWN0S2V5czxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBTbmFrZVRvRGFzaDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5yZXBsYWNlKC9fL2csIFwiLVwiKSwgdmFsdWVdKVxuICApIGFzIFNuYWtlVG9EYXNoPFQ+XG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kRWZmZWN0cywgWm9kT3B0aW9uYWwgfSBmcm9tIFwiem9kXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3V0ZVR5cGVzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBBcnJheS5mcm9tKGZpbGVwYXRoVG9Sb3V0ZS5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+XG4gICAgYVsxXS5yb3V0ZS5sb2NhbGVDb21wYXJlKGJbMV0ucm91dGUpXG4gIClcbiAgY29uc3QgZmlsdGVyZWRSb3V0ZXMgPSBzb3J0ZWRSb3V0ZXMuZmlsdGVyKFxuICAgIChbXywgeyByb3V0ZSB9XSkgPT4gIW9wdHMuZmlsdGVyUm91dGVzIHx8IG9wdHMuZmlsdGVyUm91dGVzKHJvdXRlKVxuICApXG5cbiAgLy8gVE9ETyB3aGVuIGxlc3MgbGF6eSwgdXNlIHRzLW1vcnBoIGZvciBiZXR0ZXIgZ2VuZXJhdGlvblxuICBjb25zdCByb3V0ZURlZnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBbXywgeyByb3V0ZSwgcm91dGVTcGVjLCBzZXR1cFBhcmFtcyB9XSBvZiBmaWx0ZXJlZFJvdXRlcykge1xuICAgIGNvbnN0IG1heER1cmF0aW9uID0gcm91dGVTcGVjLm1heER1cmF0aW9uID8/IHNldHVwUGFyYW1zLm1heER1cmF0aW9uXG4gICAgY29uc3QgcXVlcnlLZXlzID0gT2JqZWN0LmtleXMocm91dGVTcGVjLnF1ZXJ5UGFyYW1zPy5zaGFwZSA/PyB7fSlcbiAgICBjb25zdCBwYXRoUGFyYW1ldGVycyA9IHF1ZXJ5S2V5cy5maWx0ZXIoKGtleSkgPT4gcm91dGUuaW5jbHVkZXMoYFske2tleX1dYCkpXG5cbiAgICAvLyBxdWVyeVBhcmFtcyBtaWdodCBiZSBhIFpvZEVmZmVjdHMgb3IgWm9kT3B0aW9uYWwgaW4gc29tZSBjYXNlc1xuICAgIGxldCBxdWVyeVBhcmFtcyA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgIHdoaWxlIChcbiAgICAgIHF1ZXJ5UGFyYW1zICYmXG4gICAgICAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMgfHwgXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcylcbiAgICApIHtcbiAgICAgIGlmIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZEVmZmVjdHM8YW55Pikuc291cmNlVHlwZSgpXG4gICAgICB9IGVsc2UgaWYgKFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RPcHRpb25hbDxhbnk+KS51bndyYXAoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChxdWVyeVBhcmFtcyAmJiBcIm9taXRcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgcXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtcy5vbWl0KFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMocGF0aFBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gW3BhcmFtLCB0cnVlXSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgcm91dGVEZWZzLnB1c2goXG4gICAgICBgXG5cIiR7cm91dGV9XCI6IHtcbiAgcm91dGU6IFwiJHtyb3V0ZX1cIixcbiAgbWV0aG9kOiAke3JvdXRlU3BlYy5tZXRob2RzLm1hcCgobSkgPT4gYFwiJHttfVwiYCkuam9pbihcIiB8IFwiKX0sXG4gIHF1ZXJ5UGFyYW1zOiAke3F1ZXJ5UGFyYW1zID8gcHJpbnROb2RlKHpvZFRvVHMocXVlcnlQYXJhbXMpLm5vZGUpIDogXCJ7fVwifSxcbiAganNvbkJvZHk6ICR7XG4gICAgcm91dGVTcGVjLmpzb25Cb2R5ID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmpzb25Cb2R5KS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBjb21tb25QYXJhbXM6ICR7XG4gICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuY29tbW9uUGFyYW1zKS5ub2RlKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgZm9ybURhdGE6ICR7XG4gICAgcm91dGVTcGVjLmZvcm1EYXRhID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmZvcm1EYXRhKS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBqc29uUmVzcG9uc2U6ICR7XG4gICAgcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgPyBwcmludE5vZGUoXG4gICAgICAgICAgem9kVG9UcyhcbiAgICAgICAgICAgIHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzICYmXG4gICAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2UgaW5zdGFuY2VvZiB6LlpvZE9iamVjdFxuICAgICAgICAgICAgICA/IHJvdXRlU3BlYy5qc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pXG4gICAgICAgICAgICAgIDogcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgICAgICkubm9kZVxuICAgICAgICApXG4gICAgICA6IFwie31cIlxuICB9LFxuICBtYXhEdXJhdGlvbjogJHttYXhEdXJhdGlvbiA/PyBcInVuZGVmaW5lZFwifVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvKipcbiAqIFpvZCBUbyBUU1xuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhY2hpbnJhamEvem9kLXRvLXRzXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2FjaGluIFJhamFcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5pbXBvcnQgeyBab2RUeXBlLCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG50eXBlIEdldFR5cGUgPSB7IF9kZWY6IHsgZ2V0VHlwZT86IEdldFR5cGVGdW5jdGlvbiB9IH1cblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGVTY2hlbWEgPSB6b2QgYXMgR2V0VHlwZVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSlcbiAgICB0eXBlID0gZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSB6b2QuX2RlZi50eXBlTmFtZVxuXG4gIGNvbnN0IGdldFR5cGVUeXBlID0gY2FsbEdldFR5cGUoem9kLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICAvLyBzcGVjaWFsIGNhc2UgbmF0aXZlIGVudW0sIHdoaWNoIG5lZWRzIGFuIGlkZW50aWZpZXIgbm9kZVxuICBpZiAoZ2V0VHlwZVR5cGUgJiYgdHlwZU5hbWUgIT09IFwiWm9kTmF0aXZlRW51bVwiKSB7XG4gICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZShnZXRUeXBlVHlwZSlcbiAgfVxuXG4gIGNvbnN0IG90aGVyQXJndW1lbnRzID0gW2lkZW50aWZpZXIsIHN0b3JlLCBvcHRpb25zXSBhcyBjb25zdFxuXG4gIHN3aXRjaCAodHlwZU5hbWUpIHtcbiAgICBjYXNlIFwiWm9kU3RyaW5nXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdW1iZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJpZ0ludFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5CaWdJbnRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQm9vbGVhblwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZERhdGVcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiRGF0ZVwiKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVuZGVmaW5lZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVsbFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpXG4gICAgfVxuICAgIGNhc2UgXCJab2RWb2lkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlZvaWRLZXl3b3JkKSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuICAgIGNhc2UgXCJab2RBbnlcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVua25vd25cIjoge1xuICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROZXZlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OZXZlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RMYXp5XCI6IHtcbiAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxhenkgdmFsdWUgaXMgcmVmZXJyaW5nIHRvXG4gICAgICAvLyBzbyB3ZSBmb3JjZSB0aGUgdXNlciB0byBkZWNsYXJlIGl0XG4gICAgICBpZiAoIWdldFR5cGVUeXBlKSByZXR1cm4gY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcoaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgXCJab2RMaXRlcmFsXCI6IHtcbiAgICAgIC8vIHoubGl0ZXJhbCgnaGknKSAtPiAnaGknXG4gICAgICBsZXQgbGl0ZXJhbDogdHMuTGl0ZXJhbEV4cHJlc3Npb24gfCB0cy5Cb29sZWFuTGl0ZXJhbFxuXG4gICAgICBjb25zdCBsaXRlcmFsVmFsdWUgPSB6b2QuX2RlZi52YWx1ZSBhcyBMaXRlcmFsVHlwZVxuICAgICAgc3dpdGNoICh0eXBlb2YgbGl0ZXJhbFZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbFZhbHVlID09PSB0cnVlID8gZi5jcmVhdGVUcnVlKCkgOiBmLmNyZWF0ZUZhbHNlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShsaXRlcmFsKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kT2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyh6b2QuX2RlZi5zaGFwZSgpKVxuXG4gICAgICBjb25zdCBtZW1iZXJzOiB0cy5UeXBlRWxlbWVudFtdID0gcHJvcGVydGllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0Wm9kTm9kZSA9IHZhbHVlIGFzIFpvZFR5cGVBbnlcbiAgICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKG5leHRab2ROb2RlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICBjb25zdCB7IHR5cGVOYW1lOiBuZXh0Wm9kTm9kZVR5cGVOYW1lIH0gPSBuZXh0Wm9kTm9kZS5fZGVmXG4gICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPVxuICAgICAgICAgIG5leHRab2ROb2RlVHlwZU5hbWUgPT09IFwiWm9kT3B0aW9uYWxcIiB8fCBuZXh0Wm9kTm9kZS5pc09wdGlvbmFsKClcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eVNpZ25hdHVyZSA9IGYuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSxcbiAgICAgICAgICBpc09wdGlvbmFsID8gZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIGFkZEpzRG9jQ29tbWVudChwcm9wZXJ0eVNpZ25hdHVyZSwgbmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydHlTaWduYXR1cmVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUobWVtYmVycylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kQXJyYXlcIjoge1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYudmFsdWVzLm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IHpvZC5fZGVmLm9wdGlvbnNcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSBbLi4uem9kLl9kZWYub3B0aW9ucy52YWx1ZXMoKV1cbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5zY2hlbWEsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyh6b2QuX2RlZi52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB6b2QuX2RlZi52YWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuICAgICAgICApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKVxuICAgICAgICAgICAgICA6IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSlcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUVudW1NZW1iZXIoZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLCBsaXRlcmFsKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBzdG9yZS5uYXRpdmVFbnVtcy5wdXNoKFxuICAgICAgICAgICAgZi5jcmVhdGVFbnVtRGVjbGFyYXRpb24odW5kZWZpbmVkLCB0eXBlLCBlbnVtTWVtYmVycylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldFR5cGUgb24gbmF0aXZlRW51bSBtdXN0IHJldHVybiBhbiBpZGVudGlmaWVyIHdoZW4gbmF0aXZlRW51bXMgaXMgXCJyZXNvbHZlXCInXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kT3B0aW9uYWxcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYuaXRlbXMubWFwKChvcHRpb246IFpvZFR5cGVBbnkpID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVUdXBsZVR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RSZWNvcmRcIjoge1xuICAgICAgLy8gei5yZWNvcmQoei5udW1iZXIoKSkgLT4geyBbeDogc3RyaW5nXTogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShbXG4gICAgICAgIGYuY3JlYXRlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoXCJ4XCIpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZVR5cGVcbiAgICAgICAgKSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE1hcFwiOiB7XG4gICAgICAvLyB6Lm1hcCh6LnN0cmluZygpKSAtPiBNYXA8c3RyaW5nPlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5rZXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgbGVmdCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmxlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3QgcmlnaHQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSB6b2QuX2RlZi5hcmdzLl9kZWYuaXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVGdW5jdGlvblR5cGVOb2RlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3VtZW50VHlwZXMsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIClcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGVmYXVsdFwiOiB7XG4gICAgICAvLyB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdCgnaGknKSAtPiBzdHJpbmdcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFNLFlBQVdBLE1BQUEsUUFBUSxjQUFjLEtBQUssSUFBSSxNQUEvQixnQkFBQUEsSUFBa0M7QUFDbkQsZ0JBQUksQ0FBQyxVQUFVO0FBQ2IscUJBQU87QUFBQSxnQkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZLGtCQUFBRixRQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiLCAib3MiLCAidHR5IiwgInN0eWxlcyIsICJjaGFsayIsICJtb2R1bGUiLCAibWVyZ2UyIiwgIm9zIiwgInBhdGgiLCAicGF0dGVybiIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJzbGFzaCIsICJnbG9iYnkiLCAibm9kZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwYXR0ZXJuIiwgIm1heCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBhcnNlIiwgImluZGV4IiwgIm1vZHVsZSIsICJwYXJzZSIsICJwYXR0ZXJuIiwgInJlcXVpcmVfY29uc3RhbnRzIiwgIm1vZHVsZSIsICJwYXRoIiwgInJlcXVpcmVfdXRpbHMiLCAicGF0aCIsICJtb2R1bGUiLCAicmVxdWlyZV9wYXJzZSIsICJtb2R1bGUiLCAicGFyc2UiLCAib3B0cyIsICJ2YWx1ZSIsICJyZXN0IiwgInNvdXJjZSIsICJtb2R1bGUiLCAicGF0aCIsICJwYXJzZSIsICJzdGF0ZSIsICJyZWdleCIsICJwYXR0ZXJuIiwgInJlcXVpcmVfcGljb21hdGNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0dGVybiIsICJyZWdleCIsICJwYXRoIiwgInBhdHRlcm4iLCAiaXNEeW5hbWljUGF0dGVybiIsICJpc05lZ2F0aXZlUGF0dGVybiIsICJtZXJnZTIiLCAibWVyZ2UiLCAicmVxdWlyZV91dGlscyIsICJmcyIsICJwYXRoIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJwYXRoIiwgInBhdGgiLCAicmVxdWlyZV9mcyIsICJmcyIsICJmcyIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicXVldWVNaWNyb3Rhc2siLCAicmVxdWlyZV9jb25zdGFudHMiLCAicmVxdWlyZV9mcyIsICJyZXF1aXJlX3V0aWxzIiwgImZzIiwgInJlcXVpcmVfYXN5bmMiLCAicGF0aCIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9mcyIsICJmcyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAiZnMiLCAicmVxdWlyZV9vdXQiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJlcXVpcmVfY29tbW9uIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc2V0dGluZ3MiLCAicGF0aCIsICJyZXF1aXJlX291dCIsICJyZXF1aXJlX3JlYWRlciIsICJwYXRoIiwgInBhdHRlcm4iLCAicmVxdWlyZV9zdHJlYW0iLCAicGF0dGVybiIsICJyZXF1aXJlX2FzeW5jIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJyZXF1aXJlX2VudHJ5IiwgInBhdGgiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicGF0dGVybiIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJmcyIsICJvcyIsICJyZXF1aXJlX291dCIsICJtb2R1bGUiLCAiYXNzZXJ0UGF0dGVybnNJbnB1dCIsICJGYXN0R2xvYiIsICJnZW5lcmF0ZVRhc2tzIiwgImlzRHluYW1pY1BhdHRlcm4iLCAicG9zaXgiLCAiZXNjYXBlUGF0aCIsICJjb252ZXJ0UGF0aFRvUGF0dGVybiIsICJ3aW4zMiIsICJmcyIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAiXyIsICJwYXR0ZXJuIiwgInJlZ2V4IiwgInBhdGgiLCAicGF0aCIsICJpbml0X3V0aWxpdGllcyIsICJwYXR0ZXJuIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW5pdF91dGlsaXRpZXMiLCAicGF0dGVybiIsICJwYXRoIiwgImdpdElnbm9yZSIsICJwcm9jZXNzIiwgImZhc3RHbG9iIiwgImZzIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJub3JtYWxpemVPcHRpb25zIiwgImluaXRfdXRpbGl0aWVzIiwgInBhdHRlcm4iLCAiZnMiLCAicGF0aCIsICJub2RlUGF0aCIsICJtZXJnZTIiLCAicGF0dGVybnMiLCAib3B0aW9ucyIsICJkaXJHbG9iIiwgImZhc3RHbG9iIiwgImltcG9ydF96b2QiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIiwgImNoYWxrIiwgImdsb2JieSIsICJwYXRoIiwgImRlZGVudCIsICJtZXJnZSIsICJfIiwgInBhdGgiLCAiaW1wb3J0X2RlZGVudCIsICJwYXRoIiwgImNoYWxrIiwgImRlZGVudCIsICJfYSIsICJmcyIsICJmcyIsICJpbXBvcnRfem9kIiwgImltcG9ydF9kZWRlbnQiLCAidHMiLCAicGFyc2VEZXNjcmlwdGlvbiIsICJkZWRlbnQiLCAib3B0aW9ucyIsICJpbXBvcnRfem9kIiwgIl8iLCAicHJldHRpZXIiLCAiZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIiwgImNyeXB0byIsICJfYSIsICJidWlsZCJdCn0K
|
|
8541
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tZXJnZTIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvYXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZXJybm8uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0aC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL25vZGVfbW9kdWxlcy9nbG9iLXBhcmVudC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9zdHJpbmdpZnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdG8tcmVnZXgtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGwtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29tcGlsZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9leHBhbmQuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3BhcnNlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3NjYW4uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGljb21hdGNoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pY3JvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0dGVybi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L21hbmFnZXJzL3Rhc2tzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9hZGFwdGVycy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWV1ZS1taWNyb3Rhc2svaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JldXNpZnkvcmV1c2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdHEvcXVldWUuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvY29tbW9uLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9yZWFkZXIuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvbWF0Y2hlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvcGFydGlhbC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvZmlsdGVycy9kZWVwLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2VudHJ5LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2Vycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy90cmFuc2Zvcm1lcnMvZW50cnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3Byb3ZpZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aC10eXBlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kaXItZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaWdub3JlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zbGFzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2lnbm9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2luZGV4LmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLW9wZW5hcGkudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2Zyb250LW1hdHRlci50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXMudHMiLCAiLi4vLi4vc3JjL2xpYi96b2QtY29tcGF0LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9mZXJuLXNkay11dGlscy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1yb3V0ZS10eXBlcy9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLXRvLXRzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBTaGltIGdsb2JhbHMgaW4gY2pzIGJ1bmRsZVxuLy8gVGhlcmUncyBhIHdlaXJkIGJ1ZyB0aGF0IGVzYnVpbGQgd2lsbCBhbHdheXMgaW5qZWN0IGltcG9ydE1ldGFVcmxcbi8vIGlmIHdlIGV4cG9ydCBpdCBhcyBgY29uc3QgaW1wb3J0TWV0YVVybCA9IC4uLiBfX2ZpbGVuYW1lIC4uLmBcbi8vIEJ1dCB1c2luZyBhIGZ1bmN0aW9uIHdpbGwgbm90IGNhdXNlIHRoaXMgaXNzdWVcblxuY29uc3QgZ2V0SW1wb3J0TWV0YVVybCA9ICgpID0+XG4gIHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCdcbiAgICA/IG5ldyBVUkwoJ2ZpbGU6JyArIF9fZmlsZW5hbWUpLmhyZWZcbiAgICA6IChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSB8fFxuICAgICAgbmV3IFVSTCgnbWFpbi5qcycsIGRvY3VtZW50LmJhc2VVUkkpLmhyZWZcblxuZXhwb3J0IGNvbnN0IGltcG9ydE1ldGFVcmwgPSAvKiBAX19QVVJFX18gKi8gZ2V0SW1wb3J0TWV0YVVybCgpXG4iLCAiY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG5jb25zdCBzdHlsZXMgPSB7XG5cdG1vZGlmaWVyOiB7XG5cdFx0cmVzZXQ6IFswLCAwXSxcblx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0Ym9sZDogWzEsIDIyXSxcblx0XHRkaW06IFsyLCAyMl0sXG5cdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdHVuZGVybGluZTogWzQsIDI0XSxcblx0XHRvdmVybGluZTogWzUzLCA1NV0sXG5cdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRoaWRkZW46IFs4LCAyOF0sXG5cdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XSxcblx0fSxcblx0Y29sb3I6IHtcblx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0cmVkOiBbMzEsIDM5XSxcblx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRibHVlOiBbMzQsIDM5XSxcblx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHR3aGl0ZTogWzM3LCAzOV0sXG5cblx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0Z3JheTogWzkwLCAzOV0sIC8vIEFsaWFzIG9mIGBibGFja0JyaWdodGBcblx0XHRncmV5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG5cdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0Y3lhbkJyaWdodDogWzk2LCAzOV0sXG5cdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldLFxuXHR9LFxuXHRiZ0NvbG9yOiB7XG5cdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0YmdSZWQ6IFs0MSwgNDldLFxuXHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRiZ0JsdWU6IFs0NCwgNDldLFxuXHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRiZ1doaXRlOiBbNDcsIDQ5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRiZ0dyYXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdHcmV5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuXHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0YmdHcmVlbkJyaWdodDogWzEwMiwgNDldLFxuXHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0YmdNYWdlbnRhQnJpZ2h0OiBbMTA1LCA0OV0sXG5cdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldLFxuXHR9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1vZGlmaWVyTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMubW9kaWZpZXIpO1xuZXhwb3J0IGNvbnN0IGZvcmVncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmNvbG9yKTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5iZ0NvbG9yKTtcbmV4cG9ydCBjb25zdCBjb2xvck5hbWVzID0gWy4uLmZvcmVncm91bmRDb2xvck5hbWVzLCAuLi5iYWNrZ3JvdW5kQ29sb3JOYW1lc107XG5cbmZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuXHRjb25zdCBjb2RlcyA9IG5ldyBNYXAoKTtcblxuXHRmb3IgKGNvbnN0IFtncm91cE5hbWUsIGdyb3VwXSBvZiBPYmplY3QuZW50cmllcyhzdHlsZXMpKSB7XG5cdFx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG5cdFx0XHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcblx0XHRcdFx0Y2xvc2U6IGBcXHUwMDFCWyR7c3R5bGVbMV19bWAsXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHR9KTtcblxuXHRzdHlsZXMuY29sb3IuY2xvc2UgPSAnXFx1MDAxQlszOW0nO1xuXHRzdHlsZXMuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG5cblx0c3R5bGVzLmNvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bSgpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpID0gd3JhcEFuc2kxNihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlKHJlZCwgZ3JlZW4sIGJsdWUpIHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0XHRcdFx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdFx0XHRcdGlmIChyZWQgPT09IGdyZWVuICYmIGdyZWVuID09PSBibHVlKSB7XG5cdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAxNjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMjMxO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDE2XG5cdFx0XHRcdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgKDYgKiBNYXRoLnJvdW5kKGdyZWVuIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyBNYXRoLnJvdW5kKGJsdWUgLyAyNTUgKiA1KTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvUmdiOiB7XG5cdFx0XHR2YWx1ZShoZXgpIHtcblx0XHRcdFx0Y29uc3QgbWF0Y2hlcyA9IC9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWMoaGV4LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdHJldHVybiBbMCwgMCwgMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgW2NvbG9yU3RyaW5nXSA9IG1hdGNoZXM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gWy4uLmNvbG9yU3RyaW5nXS5tYXAoY2hhcmFjdGVyID0+IGNoYXJhY3RlciArIGNoYXJhY3Rlcikuam9pbignJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gMTYpICYgMHhGRixcblx0XHRcdFx0XHQoaW50ZWdlciA+PiA4KSAmIDB4RkYsXG5cdFx0XHRcdFx0aW50ZWdlciAmIDB4RkYsXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLnJnYlRvQW5zaTI1NiguLi5zdHlsZXMuaGV4VG9SZ2IoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGFuc2kyNTZUb0Fuc2k6IHtcblx0XHRcdHZhbHVlKGNvZGUpIHtcblx0XHRcdFx0aWYgKGNvZGUgPCA4KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwICsgY29kZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2RlIDwgMTYpIHtcblx0XHRcdFx0XHRyZXR1cm4gOTAgKyAoY29kZSAtIDgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHJlZDtcblx0XHRcdFx0bGV0IGdyZWVuO1xuXHRcdFx0XHRsZXQgYmx1ZTtcblxuXHRcdFx0XHRpZiAoY29kZSA+PSAyMzIpIHtcblx0XHRcdFx0XHRyZWQgPSAoKChjb2RlIC0gMjMyKSAqIDEwKSArIDgpIC8gMjU1O1xuXHRcdFx0XHRcdGdyZWVuID0gcmVkO1xuXHRcdFx0XHRcdGJsdWUgPSByZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29kZSAtPSAxNjtcblxuXHRcdFx0XHRcdGNvbnN0IHJlbWFpbmRlciA9IGNvZGUgJSAzNjtcblxuXHRcdFx0XHRcdHJlZCA9IE1hdGguZmxvb3IoY29kZSAvIDM2KSAvIDU7XG5cdFx0XHRcdFx0Z3JlZW4gPSBNYXRoLmZsb29yKHJlbWFpbmRlciAvIDYpIC8gNTtcblx0XHRcdFx0XHRibHVlID0gKHJlbWFpbmRlciAlIDYpIC8gNTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gTWF0aC5tYXgocmVkLCBncmVlbiwgYmx1ZSkgKiAyO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiAzMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG5cdFx0XHRcdGxldCByZXN1bHQgPSAzMCArICgoTWF0aC5yb3VuZChibHVlKSA8PCAyKSB8IChNYXRoLnJvdW5kKGdyZWVuKSA8PCAxKSB8IE1hdGgucm91bmQocmVkKSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IDYwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdHJnYlRvQW5zaToge1xuXHRcdFx0dmFsdWU6IChyZWQsIGdyZWVuLCBibHVlKSA9PiBzdHlsZXMuYW5zaTI1NlRvQW5zaShzdHlsZXMucmdiVG9BbnNpMjU2KHJlZCwgZ3JlZW4sIGJsdWUpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5oZXhUb0Fuc2kyNTYoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG5jb25zdCBhbnNpU3R5bGVzID0gYXNzZW1ibGVTdHlsZXMoKTtcblxuZXhwb3J0IGRlZmF1bHQgYW5zaVN0eWxlcztcbiIsICJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHR0eSBmcm9tICdub2RlOnR0eSc7XG5cbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvaGFzLWZsYWcvYmxvYi9tYWluL2luZGV4LmpzXG4vLy8gZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vPy5hcmdzID8/IHByb2Nlc3MuYXJndikge1xuZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vID8gZ2xvYmFsVGhpcy5EZW5vLmFyZ3MgOiBwcm9jZXNzLmFyZ3YpIHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn1cblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZmxhZ0ZvcmNlQ29sb3I7XG5pZiAoXG5cdGhhc0ZsYWcoJ25vLWNvbG9yJylcblx0fHwgaGFzRmxhZygnbm8tY29sb3JzJylcblx0fHwgaGFzRmxhZygnY29sb3I9ZmFsc2UnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1uZXZlcicpXG4pIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChcblx0aGFzRmxhZygnY29sb3InKVxuXHR8fCBoYXNGbGFnKCdjb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlJylcblx0fHwgaGFzRmxhZygnY29sb3I9YWx3YXlzJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDE7XG59XG5cbmZ1bmN0aW9uIGVudkZvcmNlQ29sb3IoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oTnVtYmVyLnBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDMsXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9zdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHtzdHJlYW1Jc1RUWSwgc25pZmZGbGFncyA9IHRydWV9ID0ge30pIHtcblx0Y29uc3Qgbm9GbGFnRm9yY2VDb2xvciA9IGVudkZvcmNlQ29sb3IoKTtcblx0aWYgKG5vRmxhZ0ZvcmNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZsYWdGb3JjZUNvbG9yID0gbm9GbGFnRm9yY2VDb2xvcjtcblx0fVxuXG5cdGNvbnN0IGZvcmNlQ29sb3IgPSBzbmlmZkZsYWdzID8gZmxhZ0ZvcmNlQ29sb3IgOiBub0ZsYWdGb3JjZUNvbG9yO1xuXG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoc25pZmZGbGFncykge1xuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKVxuXHRcdFx0fHwgaGFzRmxhZygnY29sb3I9ZnVsbCcpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgQXp1cmUgRGV2T3BzIHBpcGVsaW5lcy5cblx0Ly8gSGFzIHRvIGJlIGFib3ZlIHRoZSBgIXN0cmVhbUlzVFRZYCBjaGVjay5cblx0aWYgKCdURl9CVUlMRCcgaW4gZW52ICYmICdBR0VOVF9OQU1FJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTBcblx0XHRcdCYmIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwXzU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0XzkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKCdHSVRIVUJfQUNUSU9OUycgaW4gZW52IHx8ICdHSVRFQV9BQ1RJT05TJyBpbiBlbnYpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knLCAnQlVJTERLSVRFJywgJ0RST05FJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52KSB8fCBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52KSB7XG5cdFx0cmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudi5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuXHR9XG5cblx0aWYgKGVudi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoZW52LlRFUk0gPT09ICd4dGVybS1raXR0eScpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzoge1xuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHR9XG5cblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzoge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdXBwb3J0c0NvbG9yKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxldmVsID0gX3N1cHBvcnRzQ29sb3Ioc3RyZWFtLCB7XG5cdFx0c3RyZWFtSXNUVFk6IHN0cmVhbSAmJiBzdHJlYW0uaXNUVFksXG5cdFx0Li4ub3B0aW9ucyxcblx0fSk7XG5cblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxuY29uc3Qgc3VwcG9ydHNDb2xvciA9IHtcblx0c3Rkb3V0OiBjcmVhdGVTdXBwb3J0c0NvbG9yKHtpc1RUWTogdHR5LmlzYXR0eSgxKX0pLFxuXHRzdGRlcnI6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDIpfSksXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzdXBwb3J0c0NvbG9yO1xuIiwgIi8vIFRPRE86IFdoZW4gdGFyZ2V0aW5nIE5vZGUuanMgMTYsIHVzZSBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikge1xuXHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcpO1xuXHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCBpbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgcHJlZml4LCBwb3N0Zml4LCBpbmRleCkge1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdGNvbnN0IGdvdENSID0gc3RyaW5nW2luZGV4IC0gMV0gPT09ICdcXHInO1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCwgKGdvdENSID8gaW5kZXggLSAxIDogaW5kZXgpKSArIHByZWZpeCArIChnb3RDUiA/ICdcXHJcXG4nIDogJ1xcbicpICsgcG9zdGZpeDtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgMTtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuIiwgImltcG9ydCBhbnNpU3R5bGVzIGZyb20gJyNhbnNpLXN0eWxlcyc7XG5pbXBvcnQgc3VwcG9ydHNDb2xvciBmcm9tICcjc3VwcG9ydHMtY29sb3InO1xuaW1wb3J0IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvb3JkZXJcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4LFxufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHN1cHBvcnRzQ29sb3I7XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFN5bWJvbCgnR0VORVJBVE9SJyk7XG5jb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuY29uc3QgSVNfRU1QVFkgPSBTeW1ib2woJ0lTX0VNUFRZJyk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCBcdTIxOTIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nLFxuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuZXhwb3J0IGNsYXNzIENoYWxrIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xuXHR9XG59XG5cbmNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBjaGFsayA9ICguLi5zdHJpbmdzKSA9PiBzdHJpbmdzLmpvaW4oJyAnKTtcblx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIGNyZWF0ZUNoYWxrLnByb3RvdHlwZSk7XG5cblx0cmV0dXJuIGNoYWxrO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQ2hhbGsob3B0aW9ucykge1xuXHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xufVxuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoY3JlYXRlQ2hhbGsucHJvdG90eXBlLCBGdW5jdGlvbi5wcm90b3R5cGUpO1xuXG5mb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhhbnNpU3R5bGVzKSkge1xuXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCBjcmVhdGVTdHlsZXIoc3R5bGUub3Blbiwgc3R5bGUuY2xvc2UsIHRoaXNbU1RZTEVSXSksIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdFx0fSxcblx0fTtcbn1cblxuc3R5bGVzLnZpc2libGUgPSB7XG5cdGdldCgpIHtcblx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzW1NUWUxFUl0sIHRydWUpO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmlzaWJsZScsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdHJldHVybiBidWlsZGVyO1xuXHR9LFxufTtcblxuY29uc3QgZ2V0TW9kZWxBbnNpID0gKG1vZGVsLCBsZXZlbCwgdHlwZSwgLi4uYXJndW1lbnRzXykgPT4ge1xuXHRpZiAobW9kZWwgPT09ICdyZ2InKSB7XG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTE2bScpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kxNm0oLi4uYXJndW1lbnRzXyk7XG5cdFx0fVxuXG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTI1NicpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kyNTYoYW5zaVN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uYXJndW1lbnRzXykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2koYW5zaVN0eWxlcy5yZ2JUb0Fuc2koLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0aWYgKG1vZGVsID09PSAnaGV4Jykge1xuXHRcdHJldHVybiBnZXRNb2RlbEFuc2koJ3JnYicsIGxldmVsLCB0eXBlLCAuLi5hbnNpU3R5bGVzLmhleFRvUmdiKC4uLmFyZ3VtZW50c18pKTtcblx0fVxuXG5cdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdW21vZGVsXSguLi5hcmd1bWVudHNfKTtcbn07XG5cbmNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAnYW5zaTI1NiddO1xuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0c3R5bGVzW21vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnY29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG5cblx0Y29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG5cdHN0eWxlc1tiZ01vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnYmdDb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsIHRoaXNbU1RZTEVSXSk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHR9O1xufVxuXG5jb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCB7XG5cdC4uLnN0eWxlcyxcblx0bGV2ZWw6IHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB0aGlzW0dFTkVSQVRPUl0ubGV2ZWw7XG5cdFx0fSxcblx0XHRzZXQobGV2ZWwpIHtcblx0XHRcdHRoaXNbR0VORVJBVE9SXS5sZXZlbCA9IGxldmVsO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgY3JlYXRlU3R5bGVyID0gKG9wZW4sIGNsb3NlLCBwYXJlbnQpID0+IHtcblx0bGV0IG9wZW5BbGw7XG5cdGxldCBjbG9zZUFsbDtcblx0aWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0b3BlbkFsbCA9IG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZTtcblx0fSBlbHNlIHtcblx0XHRvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZW4sXG5cdFx0Y2xvc2UsXG5cdFx0b3BlbkFsbCxcblx0XHRjbG9zZUFsbCxcblx0XHRwYXJlbnQsXG5cdH07XG59O1xuXG5jb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG5cdC8vIFNpbmdsZSBhcmd1bWVudCBpcyBob3QgcGF0aCwgaW1wbGljaXQgY29lcmNpb24gaXMgZmFzdGVyIHRoYW4gYW55dGhpbmdcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdGNvbnN0IGJ1aWxkZXIgPSAoLi4uYXJndW1lbnRzXykgPT4gYXBwbHlTdHlsZShidWlsZGVyLCAoYXJndW1lbnRzXy5sZW5ndGggPT09IDEpID8gKCcnICsgYXJndW1lbnRzX1swXSkgOiBhcmd1bWVudHNfLmpvaW4oJyAnKSk7XG5cblx0Ly8gV2UgYWx0ZXIgdGhlIHByb3RvdHlwZSBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcblxuXHRidWlsZGVyW0dFTkVSQVRPUl0gPSBzZWxmO1xuXHRidWlsZGVyW1NUWUxFUl0gPSBfc3R5bGVyO1xuXHRidWlsZGVyW0lTX0VNUFRZXSA9IF9pc0VtcHR5O1xuXG5cdHJldHVybiBidWlsZGVyO1xufTtcblxuY29uc3QgYXBwbHlTdHlsZSA9IChzZWxmLCBzdHJpbmcpID0+IHtcblx0aWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNlbGZbSVNfRU1QVFldID8gJycgOiBzdHJpbmc7XG5cdH1cblxuXHRsZXQgc3R5bGVyID0gc2VsZltTVFlMRVJdO1xuXG5cdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuXHRpZiAoc3RyaW5nLmluY2x1ZGVzKCdcXHUwMDFCJykpIHtcblx0XHR3aGlsZSAoc3R5bGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdFx0Ly8gb3RoZXJ3aXNlIG9ubHkgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBzYWlkIGNsb3NpbmcgY29kZVxuXHRcdFx0Ly8gd2lsbCBiZSBjb2xvcmVkLCBhbmQgdGhlIHJlc3Qgd2lsbCBzaW1wbHkgYmUgJ3BsYWluJy5cblx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuXHRcdFx0c3R5bGVyID0gc3R5bGVyLnBhcmVudDtcblx0XHR9XG5cdH1cblxuXHQvLyBXZSBjYW4gbW92ZSBib3RoIG5leHQgYWN0aW9ucyBvdXQgb2YgbG9vcCwgYmVjYXVzZSByZW1haW5pbmcgYWN0aW9ucyBpbiBsb29wIHdvbid0IGhhdmVcblx0Ly8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG5cdGNvbnN0IGxmSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG5cdGlmIChsZkluZGV4ICE9PSAtMSkge1xuXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcblx0fVxuXG5cdHJldHVybiBvcGVuQWxsICsgc3RyaW5nICsgY2xvc2VBbGw7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjcmVhdGVDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG5cbmNvbnN0IGNoYWxrID0gY3JlYXRlQ2hhbGsoKTtcbmV4cG9ydCBjb25zdCBjaGFsa1N0ZGVyciA9IGNyZWF0ZUNoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTtcblxuZXhwb3J0IHtcblx0bW9kaWZpZXJOYW1lcyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzLFxuXHRjb2xvck5hbWVzLFxuXG5cdC8vIFRPRE86IFJlbW92ZSB0aGVzZSBhbGlhc2VzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0bW9kaWZpZXJOYW1lcyBhcyBtb2RpZmllcnMsXG5cdGZvcmVncm91bmRDb2xvck5hbWVzIGFzIGZvcmVncm91bmRDb2xvcnMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzIGFzIGJhY2tncm91bmRDb2xvcnMsXG5cdGNvbG9yTmFtZXMgYXMgY29sb3JzLFxufSBmcm9tICcuL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG5cdHN0ZG91dENvbG9yIGFzIHN1cHBvcnRzQ29sb3IsXG5cdHN0ZGVyckNvbG9yIGFzIHN1cHBvcnRzQ29sb3JTdGRlcnIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjaGFsaztcbiIsICIndXNlIHN0cmljdCdcbi8qXG4gKiBtZXJnZTJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZWFtYml0aW9uL21lcmdlMlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIFRlYW1iaXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IFBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoXG5jb25zdCBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlMlxuXG5mdW5jdGlvbiBtZXJnZTIgKCkge1xuICBjb25zdCBzdHJlYW1zUXVldWUgPSBbXVxuICBjb25zdCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGxldCBtZXJnaW5nID0gZmFsc2VcbiAgbGV0IG9wdGlvbnMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cblxuICBpZiAob3B0aW9ucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zKSAmJiBvcHRpb25zLnBpcGUgPT0gbnVsbCkge1xuICAgIGFyZ3MucG9wKClcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIGNvbnN0IGRvRW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlXG4gIGNvbnN0IGRvUGlwZUVycm9yID0gb3B0aW9ucy5waXBlRXJyb3IgPT09IHRydWVcbiAgaWYgKG9wdGlvbnMub2JqZWN0TW9kZSA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5vYmplY3RNb2RlID0gdHJ1ZVxuICB9XG4gIGlmIChvcHRpb25zLmhpZ2hXYXRlck1hcmsgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9IDY0ICogMTAyNFxuICB9XG4gIGNvbnN0IG1lcmdlZFN0cmVhbSA9IFBhc3NUaHJvdWdoKG9wdGlvbnMpXG5cbiAgZnVuY3Rpb24gYWRkU3RyZWFtICgpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zUXVldWUucHVzaChwYXVzZVN0cmVhbXMoYXJndW1lbnRzW2ldLCBvcHRpb25zKSlcbiAgICB9XG4gICAgbWVyZ2VTdHJlYW0oKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVN0cmVhbSAoKSB7XG4gICAgaWYgKG1lcmdpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBtZXJnaW5nID0gdHJ1ZVxuXG4gICAgbGV0IHN0cmVhbXMgPSBzdHJlYW1zUXVldWUuc2hpZnQoKVxuICAgIGlmICghc3RyZWFtcykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRTdHJlYW0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgICBzdHJlYW1zID0gW3N0cmVhbXNdXG4gICAgfVxuXG4gICAgbGV0IHBpcGVzQ291bnQgPSBzdHJlYW1zLmxlbmd0aCArIDFcblxuICAgIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgICAgaWYgKC0tcGlwZXNDb3VudCA+IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBtZXJnaW5nID0gZmFsc2VcbiAgICAgIG1lcmdlU3RyZWFtKClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwaXBlIChzdHJlYW0pIHtcbiAgICAgIGZ1bmN0aW9uIG9uZW5kICgpIHtcbiAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdtZXJnZTJVbnBpcGVFbmQnLCBvbmVuZClcbiAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICAgICAgaWYgKGRvUGlwZUVycm9yKSB7XG4gICAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAgICAgbWVyZ2VkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgLy8gc2tpcCBlbmRlZCBzdHJlYW1cbiAgICAgIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5vbignbWVyZ2UyVW5waXBlRW5kJywgb25lbmQpXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKVxuXG4gICAgICBpZiAoZG9QaXBlRXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5waXBlKG1lcmdlZFN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pXG4gICAgICAvLyBjb21wYXRpYmxlIGZvciBvbGQgc3RyZWFtXG4gICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmVhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBpcGUoc3RyZWFtc1tpXSlcbiAgICB9XG5cbiAgICBuZXh0KClcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZFN0cmVhbSAoKSB7XG4gICAgbWVyZ2luZyA9IGZhbHNlXG4gICAgLy8gZW1pdCAncXVldWVEcmFpbicgd2hlbiBhbGwgc3RyZWFtcyBtZXJnZWQuXG4gICAgbWVyZ2VkU3RyZWFtLmVtaXQoJ3F1ZXVlRHJhaW4nKVxuICAgIGlmIChkb0VuZCkge1xuICAgICAgbWVyZ2VkU3RyZWFtLmVuZCgpXG4gICAgfVxuICB9XG5cbiAgbWVyZ2VkU3RyZWFtLnNldE1heExpc3RlbmVycygwKVxuICBtZXJnZWRTdHJlYW0uYWRkID0gYWRkU3RyZWFtXG4gIG1lcmdlZFN0cmVhbS5vbigndW5waXBlJywgZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHN0cmVhbS5lbWl0KCdtZXJnZTJVbnBpcGVFbmQnKVxuICB9KVxuXG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIGFkZFN0cmVhbS5hcHBseShudWxsLCBhcmdzKVxuICB9XG4gIHJldHVybiBtZXJnZWRTdHJlYW1cbn1cblxuLy8gY2hlY2sgYW5kIHBhdXNlIHN0cmVhbXMgZm9yIHBpcGUuXG5mdW5jdGlvbiBwYXVzZVN0cmVhbXMgKHN0cmVhbXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG9sZC1zdHlsZSBzdHJlYW1zXG4gICAgaWYgKCFzdHJlYW1zLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbXMucGlwZSkge1xuICAgICAgc3RyZWFtcyA9IHN0cmVhbXMucGlwZShQYXNzVGhyb3VnaChvcHRpb25zKSlcbiAgICB9XG4gICAgaWYgKCFzdHJlYW1zLl9yZWFkYWJsZVN0YXRlIHx8ICFzdHJlYW1zLnBhdXNlIHx8ICFzdHJlYW1zLnBpcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSByZWFkYWJsZSBzdHJlYW0gY2FuIGJlIG1lcmdlZC4nKVxuICAgIH1cbiAgICBzdHJlYW1zLnBhdXNlKClcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyZWFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc3RyZWFtc1tpXSA9IHBhdXNlU3RyZWFtcyhzdHJlYW1zW2ldLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyZWFtc1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zcGxpdFdoZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoY29sbGVjdGlvbiwgaXRlbSkgPT4gW10uY29uY2F0KGNvbGxlY3Rpb24sIGl0ZW0pLCBbXSk7XG59XG5leHBvcnRzLmZsYXR0ZW4gPSBmbGF0dGVuO1xuZnVuY3Rpb24gc3BsaXRXaGVuKGl0ZW1zLCBwcmVkaWNhdGUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbW11dO1xuICAgIGxldCBncm91cEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgZ3JvdXBJbmRleCsrO1xuICAgICAgICAgICAgcmVzdWx0W2dyb3VwSW5kZXhdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5zcGxpdFdoZW4gPSBzcGxpdFdoZW47XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzRW5vZW50Q29kZUVycm9yID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCc7XG59XG5leHBvcnRzLmlzRW5vZW50Q29kZUVycm9yID0gaXNFbm9lbnRDb2RlRXJyb3I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcbmNsYXNzIERpcmVudEZyb21TdGF0cyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgc3RhdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0NoYXJhY3RlckRldmljZSA9IHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRmlsZSA9IHN0YXRzLmlzRmlsZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKSB7XG4gICAgcmV0dXJuIG5ldyBEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpO1xufVxuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSBjcmVhdGVEaXJlbnRGcm9tU3RhdHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFBhdGhUb1BhdHRlcm4gPSBleHBvcnRzLmVzY2FwZVBvc2l4UGF0aCA9IGV4cG9ydHMuZXNjYXBlV2luZG93c1BhdGggPSBleHBvcnRzLmVzY2FwZSA9IGV4cG9ydHMucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSBleHBvcnRzLm1ha2VBYnNvbHV0ZSA9IGV4cG9ydHMudW5peGlmeSA9IHZvaWQgMDtcbmNvbnN0IG9zID0gcmVxdWlyZShcIm9zXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgSVNfV0lORE9XU19QTEFURk9STSA9IG9zLnBsYXRmb3JtKCkgPT09ICd3aW4zMic7XG5jb25zdCBMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQgPSAyOyAvLyAuLyBvciAuXFxcXFxuLyoqXG4gKiBBbGwgbm9uLWVzY2FwZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogUG9zaXg6ICgpKj9bXXt8fSwgIStAIGJlZm9yZSAoLCAhIGF0IHRoZSBiZWdpbm5pbmcsIFxcXFwgYmVmb3JlIG5vbi1zcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBXaW5kb3dzOiAoKXt9W10sICErQCBiZWZvcmUgKCwgISBhdCB0aGUgYmVnaW5uaW5nLlxuICovXG5jb25zdCBQT1NJWF9VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFID0gLyhcXFxcPykoWygpKj9bXFxde3x9XXxeIXxbIStAXSg/PVxcKCl8XFxcXCg/IVshKCkqKz9AW1xcXXt8fV0pKS9nO1xuY29uc3QgV0lORE9XU19VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFID0gLyhcXFxcPykoWygpW1xcXXt9XXxeIXxbIStAXSg/PVxcKCkpL2c7XG4vKipcbiAqIFRoZSBkZXZpY2UgcGF0aCAoXFxcXC5cXCBvciBcXFxcP1xcKS5cbiAqIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvc3RhbmRhcmQvaW8vZmlsZS1wYXRoLWZvcm1hdHMjZG9zLWRldmljZS1wYXRoc1xuICovXG5jb25zdCBET1NfREVWSUNFX1BBVEhfUkUgPSAvXlxcXFxcXFxcKFsuP10pLztcbi8qKlxuICogQWxsIGJhY2tzbGFzaGVzIGV4Y2VwdCB0aG9zZSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBXaW5kb3dzOiAhKCkrQHt9XG4gKiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9maWxlaW8vbmFtaW5nLWEtZmlsZSNuYW1pbmctY29udmVudGlvbnNcbiAqL1xuY29uc3QgV0lORE9XU19CQUNLU0xBU0hFU19SRSA9IC9cXFxcKD8hWyEoKStAW1xcXXt9XSkvZztcbi8qKlxuICogRGVzaWduZWQgdG8gd29yayBvbmx5IHdpdGggc2ltcGxlIHBhdGhzOiBgZGlyXFxcXGZpbGVgLlxuICovXG5mdW5jdGlvbiB1bml4aWZ5KGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cbmV4cG9ydHMudW5peGlmeSA9IHVuaXhpZnk7XG5mdW5jdGlvbiBtYWtlQWJzb2x1dGUoY3dkLCBmaWxlcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBmaWxlcGF0aCk7XG59XG5leHBvcnRzLm1ha2VBYnNvbHV0ZSA9IG1ha2VBYnNvbHV0ZTtcbmZ1bmN0aW9uIHJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5KSB7XG4gICAgLy8gV2UgZG8gbm90IHVzZSBgc3RhcnRzV2l0aGAgYmVjYXVzZSB0aGlzIGlzIDEweCBzbG93ZXIgdGhhbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZvciBzb21lIGNhc2VzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXG4gICAgaWYgKGVudHJ5LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZENoYXJhY3RlcnkgPSBlbnRyeS5jaGFyQXQoMSk7XG4gICAgICAgIGlmIChzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnLycgfHwgc2Vjb25kQ2hhcmFjdGVyeSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuc2xpY2UoTEVBRElOR19ET1RfU0VHTUVOVF9DSEFSQUNURVJTX0NPVU5UKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG59XG5leHBvcnRzLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50ID0gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQ7XG5leHBvcnRzLmVzY2FwZSA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBlc2NhcGVXaW5kb3dzUGF0aCA6IGVzY2FwZVBvc2l4UGF0aDtcbmZ1bmN0aW9uIGVzY2FwZVdpbmRvd3NQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFdJTkRPV1NfVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xufVxuZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGVzY2FwZVdpbmRvd3NQYXRoO1xuZnVuY3Rpb24gZXNjYXBlUG9zaXhQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUsICdcXFxcJDInKTtcbn1cbmV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXNjYXBlUG9zaXhQYXRoO1xuZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4gOiBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuKGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGVzY2FwZVdpbmRvd3NQYXRoKGZpbGVwYXRoKVxuICAgICAgICAucmVwbGFjZShET1NfREVWSUNFX1BBVEhfUkUsICcvLyQxJylcbiAgICAgICAgLnJlcGxhY2UoV0lORE9XU19CQUNLU0xBU0hFU19SRSwgJy8nKTtcbn1cbmV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybihmaWxlcGF0aCkge1xuICAgIHJldHVybiBlc2NhcGVQb3NpeFBhdGgoZmlsZXBhdGgpO1xufVxuZXhwb3J0cy5jb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuID0gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybjtcbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzR2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcbnZhciBwYXRoUG9zaXhEaXJuYW1lID0gcmVxdWlyZSgncGF0aCcpLnBvc2l4LmRpcm5hbWU7XG52YXIgaXNXaW4zMiA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcblxudmFyIHNsYXNoID0gJy8nO1xudmFyIGJhY2tzbGFzaCA9IC9cXFxcL2c7XG52YXIgZW5jbG9zdXJlID0gL1tcXHtcXFtdLipbXFx9XFxdXSQvO1xudmFyIGdsb2JieSA9IC8oXnxbXlxcXFxdKShbXFx7XFxbXXxcXChbXlxcKV0rJCkvO1xudmFyIGVzY2FwZWQgPSAvXFxcXChbXFwhXFwqXFw/XFx8XFxbXFxdXFwoXFwpXFx7XFx9XSkvZztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5mbGlwQmFja3NsYXNoZXM9dHJ1ZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2xvYlBhcmVudChzdHIsIG9wdHMpIHtcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZmxpcEJhY2tzbGFzaGVzOiB0cnVlIH0sIG9wdHMpO1xuXG4gIC8vIGZsaXAgd2luZG93cyBwYXRoIHNlcGFyYXRvcnNcbiAgaWYgKG9wdGlvbnMuZmxpcEJhY2tzbGFzaGVzICYmIGlzV2luMzIgJiYgc3RyLmluZGV4T2Yoc2xhc2gpIDwgMCkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKGJhY2tzbGFzaCwgc2xhc2gpO1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjYXNlIGZvciBzdHJpbmdzIGVuZGluZyBpbiBlbmNsb3N1cmUgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvclxuICBpZiAoZW5jbG9zdXJlLnRlc3Qoc3RyKSkge1xuICAgIHN0ciArPSBzbGFzaDtcbiAgfVxuXG4gIC8vIHByZXNlcnZlcyBmdWxsIHBhdGggaW4gY2FzZSBvZiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvclxuICBzdHIgKz0gJ2EnO1xuXG4gIC8vIHJlbW92ZSBwYXRoIHBhcnRzIHRoYXQgYXJlIGdsb2JieVxuICBkbyB7XG4gICAgc3RyID0gcGF0aFBvc2l4RGlybmFtZShzdHIpO1xuICB9IHdoaWxlIChpc0dsb2Ioc3RyKSB8fCBnbG9iYnkudGVzdChzdHIpKTtcblxuICAvLyByZW1vdmUgZXNjYXBlIGNoYXJzIGFuZCByZXR1cm4gcmVzdWx0XG4gIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVkLCAnJDEnKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmlzSW50ZWdlciA9IG51bSA9PiB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKG51bSkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmZpbmQgPSAobm9kZSwgdHlwZSkgPT4gbm9kZS5ub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS50eXBlID09PSB0eXBlKTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZXhjZWVkc0xpbWl0ID0gKG1pbiwgbWF4LCBzdGVwID0gMSwgbGltaXQpID0+IHtcbiAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWV4cG9ydHMuaXNJbnRlZ2VyKG1pbikgfHwgIWV4cG9ydHMuaXNJbnRlZ2VyKG1heCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICgoTnVtYmVyKG1heCkgLSBOdW1iZXIobWluKSkgLyBOdW1iZXIoc3RlcCkpID49IGxpbWl0O1xufTtcblxuLyoqXG4gKiBFc2NhcGUgdGhlIGdpdmVuIG5vZGUgd2l0aCAnXFxcXCcgYmVmb3JlIG5vZGUudmFsdWVcbiAqL1xuXG5leHBvcnRzLmVzY2FwZU5vZGUgPSAoYmxvY2ssIG4gPSAwLCB0eXBlKSA9PiB7XG4gIGxldCBub2RlID0gYmxvY2subm9kZXNbbl07XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGlmICgodHlwZSAmJiBub2RlLnR5cGUgPT09IHR5cGUpIHx8IG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIGlmIChub2RlLmVzY2FwZWQgIT09IHRydWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgbm9kZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBicmFjZSBub2RlIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBsaXRlcmFsIGJyYWNlc1xuICovXG5cbmV4cG9ydHMuZW5jbG9zZUJyYWNlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKChub2RlLmNvbW1hcyA+PiAwICsgbm9kZS5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgYnJhY2Ugbm9kZSBpcyBpbnZhbGlkLlxuICovXG5cbmV4cG9ydHMuaXNJbnZhbGlkQnJhY2UgPSBibG9jayA9PiB7XG4gIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChibG9jay5pbnZhbGlkID09PSB0cnVlIHx8IGJsb2NrLmRvbGxhcikgcmV0dXJuIHRydWU7XG4gIGlmICgoYmxvY2suY29tbWFzID4+IDAgKyBibG9jay5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYmxvY2sub3BlbiAhPT0gdHJ1ZSB8fCBibG9jay5jbG9zZSAhPT0gdHJ1ZSkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgbm9kZSBpcyBhbiBvcGVuIG9yIGNsb3NlIG5vZGVcbiAqL1xuXG5leHBvcnRzLmlzT3Blbk9yQ2xvc2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBub2RlLm9wZW4gPT09IHRydWUgfHwgbm9kZS5jbG9zZSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlIGFuIGFycmF5IG9mIHRleHQgbm9kZXMuXG4gKi9cblxuZXhwb3J0cy5yZWR1Y2UgPSBub2RlcyA9PiBub2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIGFjYy5wdXNoKG5vZGUudmFsdWUpO1xuICBpZiAobm9kZS50eXBlID09PSAncmFuZ2UnKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gIHJldHVybiBhY2M7XG59LCBbXSk7XG5cbi8qKlxuICogRmxhdHRlbiBhbiBhcnJheVxuICovXG5cbmV4cG9ydHMuZmxhdHRlbiA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBmbGF0ID0gYXJyID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGVsZSA9IGFycltpXTtcbiAgICAgIEFycmF5LmlzQXJyYXkoZWxlKSA/IGZsYXQoZWxlLCByZXN1bHQpIDogZWxlICE9PSB2b2lkIDAgJiYgcmVzdWx0LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgZmxhdChhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHN0cmluZ2lmeSA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSBvcHRpb25zLmVzY2FwZUludmFsaWQgJiYgdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICBpZiAoKGludmFsaWRCbG9jayB8fCBpbnZhbGlkTm9kZSkgJiYgdXRpbHMuaXNPcGVuT3JDbG9zZShub2RlKSkge1xuICAgICAgICByZXR1cm4gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gc3RyaW5naWZ5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc3RyaW5naWZ5KGFzdCk7XG59O1xuXG4iLCAiLyohXG4gKiBpcy1udW1iZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLW51bWJlcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbnVtIC0gbnVtID09PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUgPyBOdW1iZXIuaXNGaW5pdGUoK251bSkgOiBpc0Zpbml0ZSgrbnVtKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwgIi8qIVxuICogdG8tcmVnZXgtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb21hdGNoL3RvLXJlZ2V4LXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG5cbmNvbnN0IHRvUmVnZXhSYW5nZSA9IChtaW4sIG1heCwgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXIobWluKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG1heCA9PT0gdm9pZCAwIHx8IG1pbiA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIFN0cmluZyhtaW4pO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKG1heCkgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyLicpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IHJlbGF4WmVyb3M6IHRydWUsIC4uLm9wdGlvbnMgfTtcbiAgaWYgKHR5cGVvZiBvcHRzLnN0cmljdFplcm9zID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLnJlbGF4WmVyb3MgPSBvcHRzLnN0cmljdFplcm9zID09PSBmYWxzZTtcbiAgfVxuXG4gIGxldCByZWxheCA9IFN0cmluZyhvcHRzLnJlbGF4WmVyb3MpO1xuICBsZXQgc2hvcnRoYW5kID0gU3RyaW5nKG9wdHMuc2hvcnRoYW5kKTtcbiAgbGV0IGNhcHR1cmUgPSBTdHJpbmcob3B0cy5jYXB0dXJlKTtcbiAgbGV0IHdyYXAgPSBTdHJpbmcob3B0cy53cmFwKTtcbiAgbGV0IGNhY2hlS2V5ID0gbWluICsgJzonICsgbWF4ICsgJz0nICsgcmVsYXggKyBzaG9ydGhhbmQgKyBjYXB0dXJlICsgd3JhcDtcblxuICBpZiAodG9SZWdleFJhbmdlLmNhY2hlLmhhc093blByb3BlcnR5KGNhY2hlS2V5KSkge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldLnJlc3VsdDtcbiAgfVxuXG4gIGxldCBhID0gTWF0aC5taW4obWluLCBtYXgpO1xuICBsZXQgYiA9IE1hdGgubWF4KG1pbiwgbWF4KTtcblxuICBpZiAoTWF0aC5hYnMoYSAtIGIpID09PSAxKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1pbiArICd8JyArIG1heDtcbiAgICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgICByZXR1cm4gYCgke3Jlc3VsdH0pYDtcbiAgICB9XG4gICAgaWYgKG9wdHMud3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBgKD86JHtyZXN1bHR9KWA7XG4gIH1cblxuICBsZXQgaXNQYWRkZWQgPSBoYXNQYWRkaW5nKG1pbikgfHwgaGFzUGFkZGluZyhtYXgpO1xuICBsZXQgc3RhdGUgPSB7IG1pbiwgbWF4LCBhLCBiIH07XG4gIGxldCBwb3NpdGl2ZXMgPSBbXTtcbiAgbGV0IG5lZ2F0aXZlcyA9IFtdO1xuXG4gIGlmIChpc1BhZGRlZCkge1xuICAgIHN0YXRlLmlzUGFkZGVkID0gaXNQYWRkZWQ7XG4gICAgc3RhdGUubWF4TGVuID0gU3RyaW5nKHN0YXRlLm1heCkubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGEgPCAwKSB7XG4gICAgbGV0IG5ld01pbiA9IGIgPCAwID8gTWF0aC5hYnMoYikgOiAxO1xuICAgIG5lZ2F0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhuZXdNaW4sIE1hdGguYWJzKGEpLCBzdGF0ZSwgb3B0cyk7XG4gICAgYSA9IHN0YXRlLmEgPSAwO1xuICB9XG5cbiAgaWYgKGIgPj0gMCkge1xuICAgIHBvc2l0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhhLCBiLCBzdGF0ZSwgb3B0cyk7XG4gIH1cblxuICBzdGF0ZS5uZWdhdGl2ZXMgPSBuZWdhdGl2ZXM7XG4gIHN0YXRlLnBvc2l0aXZlcyA9IHBvc2l0aXZlcztcbiAgc3RhdGUucmVzdWx0ID0gY29sbGF0ZVBhdHRlcm5zKG5lZ2F0aXZlcywgcG9zaXRpdmVzLCBvcHRzKTtcblxuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCgke3N0YXRlLnJlc3VsdH0pYDtcbiAgfSBlbHNlIGlmIChvcHRzLndyYXAgIT09IGZhbHNlICYmIChwb3NpdGl2ZXMubGVuZ3RoICsgbmVnYXRpdmVzLmxlbmd0aCkgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCg/OiR7c3RhdGUucmVzdWx0fSlgO1xuICB9XG5cbiAgdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XSA9IHN0YXRlO1xuICByZXR1cm4gc3RhdGUucmVzdWx0O1xufTtcblxuZnVuY3Rpb24gY29sbGF0ZVBhdHRlcm5zKG5lZywgcG9zLCBvcHRpb25zKSB7XG4gIGxldCBvbmx5TmVnYXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0nLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBvbmx5UG9zaXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhwb3MsIG5lZywgJycsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IGludGVyc2VjdGVkID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctPycsIHRydWUsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgc3VicGF0dGVybnMgPSBvbmx5TmVnYXRpdmUuY29uY2F0KGludGVyc2VjdGVkKS5jb25jYXQob25seVBvc2l0aXZlKTtcbiAgcmV0dXJuIHN1YnBhdHRlcm5zLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCkge1xuICBsZXQgbmluZXMgPSAxO1xuICBsZXQgemVyb3MgPSAxO1xuXG4gIGxldCBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgbGV0IHN0b3BzID0gbmV3IFNldChbbWF4XSk7XG5cbiAgd2hpbGUgKG1pbiA8PSBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIG5pbmVzICs9IDE7XG4gICAgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIH1cblxuICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuXG4gIHdoaWxlIChtaW4gPCBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIHplcm9zICs9IDE7XG4gICAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcbiAgfVxuXG4gIHN0b3BzID0gWy4uLnN0b3BzXTtcbiAgc3RvcHMuc29ydChjb21wYXJlKTtcbiAgcmV0dXJuIHN0b3BzO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYW5nZSB0byBhIHJlZ2V4IHBhdHRlcm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RhcnRgXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0b3BgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gcmFuZ2VUb1BhdHRlcm4oc3RhcnQsIHN0b3AsIG9wdGlvbnMpIHtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSB7XG4gICAgcmV0dXJuIHsgcGF0dGVybjogc3RhcnQsIGNvdW50OiBbXSwgZGlnaXRzOiAwIH07XG4gIH1cblxuICBsZXQgemlwcGVkID0gemlwKHN0YXJ0LCBzdG9wKTtcbiAgbGV0IGRpZ2l0cyA9IHppcHBlZC5sZW5ndGg7XG4gIGxldCBwYXR0ZXJuID0gJyc7XG4gIGxldCBjb3VudCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHM7IGkrKykge1xuICAgIGxldCBbc3RhcnREaWdpdCwgc3RvcERpZ2l0XSA9IHppcHBlZFtpXTtcblxuICAgIGlmIChzdGFydERpZ2l0ID09PSBzdG9wRGlnaXQpIHtcbiAgICAgIHBhdHRlcm4gKz0gc3RhcnREaWdpdDtcblxuICAgIH0gZWxzZSBpZiAoc3RhcnREaWdpdCAhPT0gJzAnIHx8IHN0b3BEaWdpdCAhPT0gJzknKSB7XG4gICAgICBwYXR0ZXJuICs9IHRvQ2hhcmFjdGVyQ2xhc3Moc3RhcnREaWdpdCwgc3RvcERpZ2l0LCBvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb3VudCkge1xuICAgIHBhdHRlcm4gKz0gb3B0aW9ucy5zaG9ydGhhbmQgPT09IHRydWUgPyAnXFxcXGQnIDogJ1swLTldJztcbiAgfVxuXG4gIHJldHVybiB7IHBhdHRlcm4sIGNvdW50OiBbY291bnRdLCBkaWdpdHMgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1BhdHRlcm5zKG1pbiwgbWF4LCB0b2ssIG9wdGlvbnMpIHtcbiAgbGV0IHJhbmdlcyA9IHNwbGl0VG9SYW5nZXMobWluLCBtYXgpO1xuICBsZXQgdG9rZW5zID0gW107XG4gIGxldCBzdGFydCA9IG1pbjtcbiAgbGV0IHByZXY7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbWF4ID0gcmFuZ2VzW2ldO1xuICAgIGxldCBvYmogPSByYW5nZVRvUGF0dGVybihTdHJpbmcoc3RhcnQpLCBTdHJpbmcobWF4KSwgb3B0aW9ucyk7XG4gICAgbGV0IHplcm9zID0gJyc7XG5cbiAgICBpZiAoIXRvay5pc1BhZGRlZCAmJiBwcmV2ICYmIHByZXYucGF0dGVybiA9PT0gb2JqLnBhdHRlcm4pIHtcbiAgICAgIGlmIChwcmV2LmNvdW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHJldi5jb3VudC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcHJldi5jb3VudC5wdXNoKG9iai5jb3VudFswXSk7XG4gICAgICBwcmV2LnN0cmluZyA9IHByZXYucGF0dGVybiArIHRvUXVhbnRpZmllcihwcmV2LmNvdW50KTtcbiAgICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0b2suaXNQYWRkZWQpIHtcbiAgICAgIHplcm9zID0gcGFkWmVyb3MobWF4LCB0b2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIG9iai5zdHJpbmcgPSB6ZXJvcyArIG9iai5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKG9iai5jb3VudCk7XG4gICAgdG9rZW5zLnB1c2gob2JqKTtcbiAgICBzdGFydCA9IG1heCArIDE7XG4gICAgcHJldiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclBhdHRlcm5zKGFyciwgY29tcGFyaXNvbiwgcHJlZml4LCBpbnRlcnNlY3Rpb24sIG9wdGlvbnMpIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGVsZSBvZiBhcnIpIHtcbiAgICBsZXQgeyBzdHJpbmcgfSA9IGVsZTtcblxuICAgIC8vIG9ubHkgcHVzaCBpZiBfYm90aF8gYXJlIG5lZ2F0aXZlLi4uXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24gJiYgIWNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIG9yIF9ib3RoXyBhcmUgcG9zaXRpdmVcbiAgICBpZiAoaW50ZXJzZWN0aW9uICYmIGNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFppcCBzdHJpbmdzXG4gKi9cblxuZnVuY3Rpb24gemlwKGEsIGIpIHtcbiAgbGV0IGFyciA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIGFyci5wdXNoKFthW2ldLCBiW2ldXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSA+IGIgPyAxIDogYiA+IGEgPyAtMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGFyciwga2V5LCB2YWwpIHtcbiAgcmV0dXJuIGFyci5zb21lKGVsZSA9PiBlbGVba2V5XSA9PT0gdmFsKTtcbn1cblxuZnVuY3Rpb24gY291bnROaW5lcyhtaW4sIGxlbikge1xuICByZXR1cm4gTnVtYmVyKFN0cmluZyhtaW4pLnNsaWNlKDAsIC1sZW4pICsgJzknLnJlcGVhdChsZW4pKTtcbn1cblxuZnVuY3Rpb24gY291bnRaZXJvcyhpbnRlZ2VyLCB6ZXJvcykge1xuICByZXR1cm4gaW50ZWdlciAtIChpbnRlZ2VyICUgTWF0aC5wb3coMTAsIHplcm9zKSk7XG59XG5cbmZ1bmN0aW9uIHRvUXVhbnRpZmllcihkaWdpdHMpIHtcbiAgbGV0IFtzdGFydCA9IDAsIHN0b3AgPSAnJ10gPSBkaWdpdHM7XG4gIGlmIChzdG9wIHx8IHN0YXJ0ID4gMSkge1xuICAgIHJldHVybiBgeyR7c3RhcnQgKyAoc3RvcCA/ICcsJyArIHN0b3AgOiAnJyl9fWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiB0b0NoYXJhY3RlckNsYXNzKGEsIGIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGBbJHthfSR7KGIgLSBhID09PSAxKSA/ICcnIDogJy0nfSR7Yn1dYDtcbn1cblxuZnVuY3Rpb24gaGFzUGFkZGluZyhzdHIpIHtcbiAgcmV0dXJuIC9eLT8oMCspXFxkLy50ZXN0KHN0cik7XG59XG5cbmZ1bmN0aW9uIHBhZFplcm9zKHZhbHVlLCB0b2ssIG9wdGlvbnMpIHtcbiAgaWYgKCF0b2suaXNQYWRkZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgZGlmZiA9IE1hdGguYWJzKHRvay5tYXhMZW4gLSBTdHJpbmcodmFsdWUpLmxlbmd0aCk7XG4gIGxldCByZWxheCA9IG9wdGlvbnMucmVsYXhaZXJvcyAhPT0gZmFsc2U7XG5cbiAgc3dpdGNoIChkaWZmKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiByZWxheCA/ICcwPycgOiAnMCc7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzB7MCwyfScgOiAnMDAnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZWxheCA/IGAwezAsJHtkaWZmfX1gIDogYDB7JHtkaWZmfX1gO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhY2hlXG4gKi9cblxudG9SZWdleFJhbmdlLmNhY2hlID0ge307XG50b1JlZ2V4UmFuZ2UuY2xlYXJDYWNoZSA9ICgpID0+ICh0b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fSk7XG5cbi8qKlxuICogRXhwb3NlIGB0b1JlZ2V4UmFuZ2VgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB0b1JlZ2V4UmFuZ2U7XG4iLCAiLyohXG4gKiBmaWxsLXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9maWxsLXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSByZXF1aXJlKCd0by1yZWdleC1yYW5nZScpO1xuXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuY29uc3QgdHJhbnNmb3JtID0gdG9OdW1iZXIgPT4ge1xuICByZXR1cm4gdmFsdWUgPT4gdG9OdW1iZXIgPT09IHRydWUgPyBOdW1iZXIodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnKTtcbn07XG5cbmNvbnN0IGlzTnVtYmVyID0gbnVtID0+IE51bWJlci5pc0ludGVnZXIoK251bSk7XG5cbmNvbnN0IHplcm9zID0gaW5wdXQgPT4ge1xuICBsZXQgdmFsdWUgPSBgJHtpbnB1dH1gO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlWzBdID09PSAnLScpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG4gIHdoaWxlICh2YWx1ZVsrK2luZGV4XSA9PT0gJzAnKTtcbiAgcmV0dXJuIGluZGV4ID4gMDtcbn07XG5cbmNvbnN0IHN0cmluZ2lmeSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3RyaW5naWZ5ID09PSB0cnVlO1xufTtcblxuY29uc3QgcGFkID0gKGlucHV0LCBtYXhMZW5ndGgsIHRvTnVtYmVyKSA9PiB7XG4gIGlmIChtYXhMZW5ndGggPiAwKSB7XG4gICAgbGV0IGRhc2ggPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gICAgaWYgKGRhc2gpIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgaW5wdXQgPSAoZGFzaCArIGlucHV0LnBhZFN0YXJ0KGRhc2ggPyBtYXhMZW5ndGggLSAxIDogbWF4TGVuZ3RoLCAnMCcpKTtcbiAgfVxuICBpZiAodG9OdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgdG9NYXhMZW4gPSAoaW5wdXQsIG1heExlbmd0aCkgPT4ge1xuICBsZXQgbmVnYXRpdmUgPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gIGlmIChuZWdhdGl2ZSkge1xuICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgbWF4TGVuZ3RoLS07XG4gIH1cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA8IG1heExlbmd0aCkgaW5wdXQgPSAnMCcgKyBpbnB1dDtcbiAgcmV0dXJuIG5lZ2F0aXZlID8gKCctJyArIGlucHV0KSA6IGlucHV0O1xufTtcblxuY29uc3QgdG9TZXF1ZW5jZSA9IChwYXJ0cywgb3B0aW9ucykgPT4ge1xuICBwYXJ0cy5uZWdhdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuICBwYXJ0cy5wb3NpdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuXG4gIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGxldCBwb3NpdGl2ZXMgPSAnJztcbiAgbGV0IG5lZ2F0aXZlcyA9ICcnO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChwYXJ0cy5wb3NpdGl2ZXMubGVuZ3RoKSB7XG4gICAgcG9zaXRpdmVzID0gcGFydHMucG9zaXRpdmVzLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5uZWdhdGl2ZXMubGVuZ3RoKSB7XG4gICAgbmVnYXRpdmVzID0gYC0oJHtwcmVmaXh9JHtwYXJ0cy5uZWdhdGl2ZXMuam9pbignfCcpfSlgO1xuICB9XG5cbiAgaWYgKHBvc2l0aXZlcyAmJiBuZWdhdGl2ZXMpIHtcbiAgICByZXN1bHQgPSBgJHtwb3NpdGl2ZXN9fCR7bmVnYXRpdmVzfWA7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gcG9zaXRpdmVzIHx8IG5lZ2F0aXZlcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLndyYXApIHtcbiAgICByZXR1cm4gYCgke3ByZWZpeH0ke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1JhbmdlID0gKGEsIGIsIGlzTnVtYmVycywgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXJzKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZShhLCBiLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgbGV0IHN0YXJ0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtcbiAgaWYgKGEgPT09IGIpIHJldHVybiBzdGFydDtcblxuICBsZXQgc3RvcCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYik7XG4gIHJldHVybiBgWyR7c3RhcnR9LSR7c3RvcH1dYDtcbn07XG5cbmNvbnN0IHRvUmVnZXggPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGFydCkpIHtcbiAgICBsZXQgd3JhcCA9IG9wdGlvbnMud3JhcCA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICAgIHJldHVybiB3cmFwID8gYCgke3ByZWZpeH0ke3N0YXJ0LmpvaW4oJ3wnKX0pYCA6IHN0YXJ0LmpvaW4oJ3wnKTtcbiAgfVxuICByZXR1cm4gdG9SZWdleFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xufTtcblxuY29uc3QgcmFuZ2VFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByYW5nZSBhcmd1bWVudHM6ICcgKyB1dGlsLmluc3BlY3QoLi4uYXJncykpO1xufTtcblxuY29uc3QgaW52YWxpZFJhbmdlID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGludmFsaWRTdGVwID0gKHN0ZXAsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgc3RlcCBcIiR7c3RlcH1cIiB0byBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGZpbGxOdW1iZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IGEgPSBOdW1iZXIoc3RhcnQpO1xuICBsZXQgYiA9IE51bWJlcihlbmQpO1xuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSkge1xuICAgIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGZpeCBuZWdhdGl2ZSB6ZXJvXG4gIGlmIChhID09PSAwKSBhID0gMDtcbiAgaWYgKGIgPT09IDApIGIgPSAwO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBzdGFydFN0cmluZyA9IFN0cmluZyhzdGFydCk7XG4gIGxldCBlbmRTdHJpbmcgPSBTdHJpbmcoZW5kKTtcbiAgbGV0IHN0ZXBTdHJpbmcgPSBTdHJpbmcoc3RlcCk7XG4gIHN0ZXAgPSBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSk7XG5cbiAgbGV0IHBhZGRlZCA9IHplcm9zKHN0YXJ0U3RyaW5nKSB8fCB6ZXJvcyhlbmRTdHJpbmcpIHx8IHplcm9zKHN0ZXBTdHJpbmcpO1xuICBsZXQgbWF4TGVuID0gcGFkZGVkID8gTWF0aC5tYXgoc3RhcnRTdHJpbmcubGVuZ3RoLCBlbmRTdHJpbmcubGVuZ3RoLCBzdGVwU3RyaW5nLmxlbmd0aCkgOiAwO1xuICBsZXQgdG9OdW1iZXIgPSBwYWRkZWQgPT09IGZhbHNlICYmIHN0cmluZ2lmeShzdGFydCwgZW5kLCBvcHRpb25zKSA9PT0gZmFsc2U7XG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0odG9OdW1iZXIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKHRvTWF4TGVuKHN0YXJ0LCBtYXhMZW4pLCB0b01heExlbihlbmQsIG1heExlbiksIHRydWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0geyBuZWdhdGl2ZXM6IFtdLCBwb3NpdGl2ZXM6IFtdIH07XG4gIGxldCBwdXNoID0gbnVtID0+IHBhcnRzW251bSA8IDAgPyAnbmVnYXRpdmVzJyA6ICdwb3NpdGl2ZXMnXS5wdXNoKE1hdGguYWJzKG51bSkpO1xuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUgJiYgc3RlcCA+IDEpIHtcbiAgICAgIHB1c2goYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnB1c2gocGFkKGZvcm1hdChhLCBpbmRleCksIG1heExlbiwgdG9OdW1iZXIpKTtcbiAgICB9XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0ZXAgPiAxXG4gICAgICA/IHRvU2VxdWVuY2UocGFydHMsIG9wdGlvbnMpXG4gICAgICA6IHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsTGV0dGVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICgoIWlzTnVtYmVyKHN0YXJ0KSAmJiBzdGFydC5sZW5ndGggPiAxKSB8fCAoIWlzTnVtYmVyKGVuZCkgJiYgZW5kLmxlbmd0aCA+IDEpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG5cbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8ICh2YWwgPT4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWwpKTtcbiAgbGV0IGEgPSBgJHtzdGFydH1gLmNoYXJDb2RlQXQoMCk7XG4gIGxldCBiID0gYCR7ZW5kfWAuY2hhckNvZGVBdCgwKTtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgbWluID0gTWF0aC5taW4oYSwgYik7XG4gIGxldCBtYXggPSBNYXRoLm1heChhLCBiKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZShtaW4sIG1heCwgZmFsc2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICByYW5nZS5wdXNoKGZvcm1hdChhLCBpbmRleCkpO1xuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbCA9IChzdGFydCwgZW5kLCBzdGVwLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGVuZCA9PSBudWxsICYmIGlzVmFsaWRWYWx1ZShzdGFydCkpIHtcbiAgICByZXR1cm4gW3N0YXJ0XTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZFZhbHVlKHN0YXJ0KSB8fCAhaXNWYWxpZFZhbHVlKGVuZCkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgeyB0cmFuc2Zvcm06IHN0ZXAgfSk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RlcCkpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAwLCBzdGVwKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIG9wdHMud3JhcCA9IHRydWU7XG4gIHN0ZXAgPSBzdGVwIHx8IG9wdHMuc3RlcCB8fCAxO1xuXG4gIGlmICghaXNOdW1iZXIoc3RlcCkpIHtcbiAgICBpZiAoc3RlcCAhPSBudWxsICYmICFpc09iamVjdChzdGVwKSkgcmV0dXJuIGludmFsaWRTdGVwKHN0ZXAsIG9wdHMpO1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHN0ZXApO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHN0YXJ0KSAmJiBpc051bWJlcihlbmQpKSB7XG4gICAgcmV0dXJuIGZpbGxOdW1iZXJzKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGxMZXR0ZXJzKHN0YXJ0LCBlbmQsIE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKSwgb3B0cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGNvbXBpbGUgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBpbnZhbGlkID0gaW52YWxpZEJsb2NrID09PSB0cnVlIHx8IGludmFsaWROb2RlID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWUgPyAnXFxcXCcgOiAnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc09wZW4gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc0Nsb3NlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJygnO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJyknO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjb21tYScpIHtcbiAgICAgIHJldHVybiBub2RlLnByZXYudHlwZSA9PT0gJ2NvbW1hJyA/ICcnIDogKGludmFsaWQgPyBub2RlLnZhbHVlIDogJ3wnKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgeyAuLi5vcHRpb25zLCB3cmFwOiBmYWxzZSwgdG9SZWdleDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPiAxICYmIHJhbmdlLmxlbmd0aCA+IDEgPyBgKCR7cmFuZ2V9KWAgOiByYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHdhbGsoYXN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGFwcGVuZCA9IChxdWV1ZSA9ICcnLCBzdGFzaCA9ICcnLCBlbmNsb3NlID0gZmFsc2UpID0+IHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIHF1ZXVlID0gW10uY29uY2F0KHF1ZXVlKTtcbiAgc3Rhc2ggPSBbXS5jb25jYXQoc3Rhc2gpO1xuXG4gIGlmICghc3Rhc2gubGVuZ3RoKSByZXR1cm4gcXVldWU7XG4gIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGVuY2xvc2UgPyB1dGlscy5mbGF0dGVuKHN0YXNoKS5tYXAoZWxlID0+IGB7JHtlbGV9fWApIDogc3Rhc2g7XG4gIH1cblxuICBmb3IgKGxldCBpdGVtIG9mIHF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXBwZW5kKHZhbHVlLCBzdGFzaCwgZW5jbG9zZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBlbGUgb2Ygc3Rhc2gpIHtcbiAgICAgICAgaWYgKGVuY2xvc2UgPT09IHRydWUgJiYgdHlwZW9mIGVsZSA9PT0gJ3N0cmluZycpIGVsZSA9IGB7JHtlbGV9fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKEFycmF5LmlzQXJyYXkoZWxlKSA/IGFwcGVuZChpdGVtLCBlbGUsIGVuY2xvc2UpIDogKGl0ZW0gKyBlbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4ocmVzdWx0KTtcbn07XG5cbmNvbnN0IGV4cGFuZCA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgcmFuZ2VMaW1pdCA9IG9wdGlvbnMucmFuZ2VMaW1pdCA9PT0gdm9pZCAwID8gMTAwMCA6IG9wdGlvbnMucmFuZ2VMaW1pdDtcblxuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIG5vZGUucXVldWUgPSBbXTtcblxuICAgIGxldCBwID0gcGFyZW50O1xuICAgIGxldCBxID0gcGFyZW50LnF1ZXVlO1xuXG4gICAgd2hpbGUgKHAudHlwZSAhPT0gJ2JyYWNlJyAmJiBwLnR5cGUgIT09ICdyb290JyAmJiBwLnBhcmVudCkge1xuICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgcSA9IHAucXVldWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaW52YWxpZCB8fCBub2RlLmRvbGxhcikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucykpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnYnJhY2UnICYmIG5vZGUuaW52YWxpZCAhPT0gdHJ1ZSAmJiBub2RlLm5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBbJ3t9J10pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuXG4gICAgICBpZiAodXRpbHMuZXhjZWVkc0xpbWl0KC4uLmFyZ3MsIG9wdGlvbnMuc3RlcCwgcmFuZ2VMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2V4cGFuZGVkIGFycmF5IGxlbmd0aCBleGNlZWRzIHJhbmdlIGxpbWl0LiBVc2Ugb3B0aW9ucy5yYW5nZUxpbWl0IHRvIGluY3JlYXNlIG9yIGRpc2FibGUgdGhlIGxpbWl0LicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShub2RlLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCByYW5nZSkpO1xuICAgICAgbm9kZS5ub2RlcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbmNsb3NlID0gdXRpbHMuZW5jbG9zZUJyYWNlKG5vZGUpO1xuICAgIGxldCBxdWV1ZSA9IG5vZGUucXVldWU7XG4gICAgbGV0IGJsb2NrID0gbm9kZTtcblxuICAgIHdoaWxlIChibG9jay50eXBlICE9PSAnYnJhY2UnICYmIGJsb2NrLnR5cGUgIT09ICdyb290JyAmJiBibG9jay5wYXJlbnQpIHtcbiAgICAgIGJsb2NrID0gYmxvY2sucGFyZW50O1xuICAgICAgcXVldWUgPSBibG9jay5xdWV1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY29tbWEnICYmIG5vZGUudHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICBpZiAoaSA9PT0gMSkgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBxdWV1ZSwgZW5jbG9zZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnZhbHVlICYmIGNoaWxkLnR5cGUgIT09ICdvcGVuJykge1xuICAgICAgICBxdWV1ZS5wdXNoKGFwcGVuZChxdWV1ZS5wb3AoKSwgY2hpbGQudmFsdWUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC5ub2Rlcykge1xuICAgICAgICB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH07XG5cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4od2Fsayhhc3QpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwYW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiAnMCcsIC8qIDAgKi9cbiAgQ0hBUl85OiAnOScsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogJ0EnLCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6ICdhJywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiAnWicsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogJ3onLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiAnKCcsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogJyknLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogJyonLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAnJicsIC8qICYgKi9cbiAgQ0hBUl9BVDogJ0AnLCAvKiBAICovXG4gIENIQVJfQkFDS1NMQVNIOiAnXFxcXCcsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0s6ICdgJywgLyogYCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogJ1xccicsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiAnXicsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogJzonLCAvKiA6ICovXG4gIENIQVJfQ09NTUE6ICcsJywgLyogLCAqL1xuICBDSEFSX0RPTExBUjogJyQnLCAvKiAuICovXG4gIENIQVJfRE9UOiAnLicsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6ICdcIicsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6ICc9JywgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6ICchJywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogJ1xcZicsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6ICcvJywgLyogLyAqL1xuICBDSEFSX0hBU0g6ICcjJywgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogJy0nLCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiAnPCcsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAneycsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiAnWycsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6ICdcXG4nLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogJ1xcdTAwQTAnLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogJyUnLCAvKiAlICovXG4gIENIQVJfUExVUzogJysnLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogJz8nLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogJz4nLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6ICd9JywgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiAnXScsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046ICc7JywgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogJ1xcJycsIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogJyAnLCAvKiAgICovXG4gIENIQVJfVEFCOiAnXFx0JywgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogJ18nLCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogJ3wnLCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiAnXFx1RkVGRicgLyogXFx1RkVGRiAqL1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBDSEFSX0JBQ0tTTEFTSCwgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSywgLyogYCAqL1xuICBDSEFSX0NPTU1BLCAvKiAsICovXG4gIENIQVJfRE9ULCAvKiAuICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAvKiApICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgLyogeyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAvKiB9ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgLyogWyAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VULCAvKiBdICovXG4gIENIQVJfRE9VQkxFX1FVT1RFLCAvKiBcIiAqL1xuICBDSEFSX1NJTkdMRV9RVU9URSwgLyogJyAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFLFxuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRVxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogcGFyc2VcbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBpZiAoaW5wdXQubGVuZ3RoID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGggKCR7aW5wdXQubGVuZ3RofSksIGV4Y2VlZHMgbWF4IGNoYXJhY3RlcnMgKCR7bWF4fSlgKTtcbiAgfVxuXG4gIGxldCBhc3QgPSB7IHR5cGU6ICdyb290JywgaW5wdXQsIG5vZGVzOiBbXSB9O1xuICBsZXQgc3RhY2sgPSBbYXN0XTtcbiAgbGV0IGJsb2NrID0gYXN0O1xuICBsZXQgcHJldiA9IGFzdDtcbiAgbGV0IGJyYWNrZXRzID0gMDtcbiAgbGV0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHZhbHVlO1xuICBsZXQgbWVtbyA9IHt9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiBpbnB1dFtpbmRleCsrXTtcbiAgY29uc3QgcHVzaCA9IG5vZGUgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JyAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgbm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gbm9kZS52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgIG5vZGUucGFyZW50ID0gYmxvY2s7XG4gICAgbm9kZS5wcmV2ID0gcHJldjtcbiAgICBwcmV2ID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcblxuICBwdXNoKHsgdHlwZTogJ2JvcycgfSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIC8qKlxuICAgICAqIEludmFsaWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0UgfHwgdmFsdWUgPT09IENIQVJfTk9fQlJFQUtfU1BBQ0UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAob3B0aW9ucy5rZWVwRXNjYXBpbmcgPyB2YWx1ZSA6ICcnKSArIGFkdmFuY2UoKSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IHNxdWFyZSBicmFja2V0IChsaXRlcmFsKTogJ10nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAnXFxcXCcgKyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgc3F1YXJlIGJyYWNrZXQ6ICdbJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIGJyYWNrZXRzKys7XG5cbiAgICAgIGxldCBjbG9zZWQgPSB0cnVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMtLTtcblxuICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBibG9jayA9IHB1c2goeyB0eXBlOiAncGFyZW4nLCBub2RlczogW10gfSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzOiAnfFwifGBcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1VCTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfU0lOR0xFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX0JBQ0tUSUNLKSB7XG4gICAgICBsZXQgb3BlbiA9IHZhbHVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgIT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBuZXh0ICsgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IG9wZW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzID09PSB0cnVlKSB2YWx1ZSArPSBuZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IGN1cmx5IGJyYWNlOiAneydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBkZXB0aCsrO1xuXG4gICAgICBsZXQgZG9sbGFyID0gcHJldi52YWx1ZSAmJiBwcmV2LnZhbHVlLnNsaWNlKC0xKSA9PT0gJyQnIHx8IGJsb2NrLmRvbGxhciA9PT0gdHJ1ZTtcbiAgICAgIGxldCBicmFjZSA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgY2xvc2U6IGZhbHNlLFxuICAgICAgICBkb2xsYXIsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBjb21tYXM6IDAsXG4gICAgICAgIHJhbmdlczogMCxcbiAgICAgICAgbm9kZXM6IFtdXG4gICAgICB9O1xuXG4gICAgICBibG9jayA9IHB1c2goYnJhY2UpO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ29wZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IGN1cmx5IGJyYWNlOiAnfSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZSA9ICdjbG9zZSc7XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgYmxvY2suY2xvc2UgPSB0cnVlO1xuXG4gICAgICBwdXNoKHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgICBkZXB0aC0tO1xuXG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWE6ICcsJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0NPTU1BICYmIGRlcHRoID4gMCkge1xuICAgICAgaWYgKGJsb2NrLnJhbmdlcyA+IDApIHtcbiAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgbGV0IG9wZW4gPSBibG9jay5ub2Rlcy5zaGlmdCgpO1xuICAgICAgICBibG9jay5ub2RlcyA9IFtvcGVuLCB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHN0cmluZ2lmeShibG9jaykgfV07XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrLmNvbW1hcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90OiAnLidcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1QgJiYgZGVwdGggPiAwICYmIGJsb2NrLmNvbW1hcyA9PT0gMCkge1xuICAgICAgbGV0IHNpYmxpbmdzID0gYmxvY2subm9kZXM7XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBibG9jay5yYW5nZSA9IFtdO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnR5cGUgPSAncmFuZ2UnO1xuXG4gICAgICAgIGlmIChibG9jay5ub2Rlcy5sZW5ndGggIT09IDMgJiYgYmxvY2subm9kZXMubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5yYW5nZXMrKztcbiAgICAgICAgYmxvY2suYXJncyA9IFtdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICBzaWJsaW5ncy5wb3AoKTtcblxuICAgICAgICBsZXQgYmVmb3JlID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGJlZm9yZS52YWx1ZSArPSBwcmV2LnZhbHVlICsgdmFsdWU7XG4gICAgICAgIHByZXYgPSBiZWZvcmU7XG4gICAgICAgIGJsb2NrLnJhbmdlcy0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRleHRcbiAgICAgKi9cblxuICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICB9XG5cbiAgLy8gTWFyayBpbWJhbGFuY2VkIGJyYWNlcyBhbmQgYnJhY2tldHMgYXMgaW52YWxpZFxuICBkbyB7XG4gICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChibG9jay50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGJsb2NrLm5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5ub2Rlcykge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykgbm9kZS5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIG5vZGUuaXNDbG9zZSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFub2RlLm5vZGVzKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGJsb2NrIG9uIHBhcmVudC5ub2RlcyAoYmxvY2sncyBzaWJsaW5ncylcbiAgICAgIGxldCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBpbmRleCA9IHBhcmVudC5ub2Rlcy5pbmRleE9mKGJsb2NrKTtcbiAgICAgIC8vIHJlcGxhY2UgdGhlIChpbnZhbGlkKSBibG9jayB3aXRoIGl0J3Mgbm9kZXNcbiAgICAgIHBhcmVudC5ub2Rlcy5zcGxpY2UoaW5kZXgsIDEsIC4uLmJsb2NrLm5vZGVzKTtcbiAgICB9XG4gIH0gd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApO1xuXG4gIHB1c2goeyB0eXBlOiAnZW9zJyB9KTtcbiAgcmV0dXJuIGFzdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKTtcbmNvbnN0IGNvbXBpbGUgPSByZXF1aXJlKCcuL2xpYi9jb21waWxlJyk7XG5jb25zdCBleHBhbmQgPSByZXF1aXJlKCcuL2xpYi9leHBhbmQnKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcblxuLyoqXG4gKiBFeHBhbmQgdGhlIGdpdmVuIHBhdHRlcm4gb3IgY3JlYXRlIGEgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JywgeyBjb21waWxlOiB0cnVlIH0pKTsgLy89PiBbJyhhfGJ8YyknXVxuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JykpOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgYnJhY2VzID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGZvciAobGV0IHBhdHRlcm4gb2YgaW5wdXQpIHtcbiAgICAgIGxldCByZXN1bHQgPSBicmFjZXMuY3JlYXRlKHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBvdXRwdXQucHVzaCguLi5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0gW10uY29uY2F0KGJyYWNlcy5jcmVhdGUoaW5wdXQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kID09PSB0cnVlICYmIG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IFsuLi5uZXcgU2V0KG91dHB1dCldO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogYGBganNcbiAqIC8vIGJyYWNlcy5wYXJzZShwYXR0ZXJuLCBbLCBvcHRpb25zXSk7XG4gKiBjb25zdCBhc3QgPSBicmFjZXMucGFyc2UoJ2Eve2IsY30vZCcpO1xuICogY29uc29sZS5sb2coYXN0KTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gQnJhY2UgcGF0dGVybiB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBBU1RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnJhY2VzIHN0cmluZyBmcm9tIGFuIEFTVCwgb3IgYW4gQVNUIG5vZGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogbGV0IGFzdCA9IGJyYWNlcy5wYXJzZSgnZm9vL3thLGJ9L2JhcicpO1xuICogY29uc29sZS5sb2coc3RyaW5naWZ5KGFzdC5ub2Rlc1syXSkpOyAvLz0+ICd7YSxifSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5zdHJpbmdpZnkgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdpZnkoYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmeShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGEgcmVnZXgtY29tcGF0aWJsZSwgb3B0aW1pemVkIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jb21waWxlKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS8oYnxjKS9kJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jb21waWxlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmRzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGFuIGFycmF5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlXG4gKiBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIHdoZW4gYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlLiBCZWZvcmVcbiAqIHVzaW5nIHRoaXMgbWV0aG9kIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVhZCB0aGUgW3BlcmZvcm1hbmNlIG5vdGVzXSgjcGVyZm9ybWFuY2UpKVxuICogYW5kIGFkdmFudGFnZXMgb2YgdXNpbmcgWy5jb21waWxlXSgjY29tcGlsZSkgaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuZXhwYW5kKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS9iL2QnLCAnYS9jL2QnXTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5leHBhbmQgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBleHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIGZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9lbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBbLi4ubmV3IFNldChyZXN1bHQpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGJyYWNlIHBhdHRlcm4gYW5kIHJldHVybnMgZWl0aGVyIGFuIGV4cGFuZGVkIGFycmF5XG4gKiAoaWYgYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlKSwgYSBoaWdobHkgb3B0aW1pemVkIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jcmVhdGUoJ3VzZXItezIwMC4uMzAwfS9wcm9qZWN0LXthLGIsY30tezEuLjEwfScpKVxuICogLy89PiAndXNlci0oMjBbMC05XXwyWzEtOV1bMC05XXwzMDApL3Byb2plY3QtKGF8YnxjKS0oWzEtOV18MTApJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNyZWF0ZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChpbnB1dCA9PT0gJycgfHwgaW5wdXQubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiByZXR1cm4gb3B0aW9ucy5leHBhbmQgIT09IHRydWVcbiAgICA/IGJyYWNlcy5jb21waWxlKGlucHV0LCBvcHRpb25zKVxuICAgIDogYnJhY2VzLmV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBcImJyYWNlc1wiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBicmFjZXM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgV0lOX1NMQVNIID0gJ1xcXFxcXFxcLyc7XG5jb25zdCBXSU5fTk9fU0xBU0ggPSBgW14ke1dJTl9TTEFTSH1dYDtcblxuLyoqXG4gKiBQb3NpeCBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgRE9UX0xJVEVSQUwgPSAnXFxcXC4nO1xuY29uc3QgUExVU19MSVRFUkFMID0gJ1xcXFwrJztcbmNvbnN0IFFNQVJLX0xJVEVSQUwgPSAnXFxcXD8nO1xuY29uc3QgU0xBU0hfTElURVJBTCA9ICdcXFxcLyc7XG5jb25zdCBPTkVfQ0hBUiA9ICcoPz0uKSc7XG5jb25zdCBRTUFSSyA9ICdbXi9dJztcbmNvbnN0IEVORF9BTkNIT1IgPSBgKD86JHtTTEFTSF9MSVRFUkFMfXwkKWA7XG5jb25zdCBTVEFSVF9BTkNIT1IgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9KWA7XG5jb25zdCBET1RTX1NMQVNIID0gYCR7RE9UX0xJVEVSQUx9ezEsMn0ke0VORF9BTkNIT1J9YDtcbmNvbnN0IE5PX0RPVCA9IGAoPyEke0RPVF9MSVRFUkFMfSlgO1xuY29uc3QgTk9fRE9UUyA9IGAoPyEke1NUQVJUX0FOQ0hPUn0ke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBOT19ET1RfU0xBU0ggPSBgKD8hJHtET1RfTElURVJBTH17MCwxfSR7RU5EX0FOQ0hPUn0pYDtcbmNvbnN0IE5PX0RPVFNfU0xBU0ggPSBgKD8hJHtET1RTX1NMQVNIfSlgO1xuY29uc3QgUU1BUktfTk9fRE9UID0gYFteLiR7U0xBU0hfTElURVJBTH1dYDtcbmNvbnN0IFNUQVIgPSBgJHtRTUFSS30qP2A7XG5cbmNvbnN0IFBPU0lYX0NIQVJTID0ge1xuICBET1RfTElURVJBTCxcbiAgUExVU19MSVRFUkFMLFxuICBRTUFSS19MSVRFUkFMLFxuICBTTEFTSF9MSVRFUkFMLFxuICBPTkVfQ0hBUixcbiAgUU1BUkssXG4gIEVORF9BTkNIT1IsXG4gIERPVFNfU0xBU0gsXG4gIE5PX0RPVCxcbiAgTk9fRE9UUyxcbiAgTk9fRE9UX1NMQVNILFxuICBOT19ET1RTX1NMQVNILFxuICBRTUFSS19OT19ET1QsXG4gIFNUQVIsXG4gIFNUQVJUX0FOQ0hPUlxufTtcblxuLyoqXG4gKiBXaW5kb3dzIGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBXSU5ET1dTX0NIQVJTID0ge1xuICAuLi5QT1NJWF9DSEFSUyxcblxuICBTTEFTSF9MSVRFUkFMOiBgWyR7V0lOX1NMQVNIfV1gLFxuICBRTUFSSzogV0lOX05PX1NMQVNILFxuICBTVEFSOiBgJHtXSU5fTk9fU0xBU0h9Kj9gLFxuICBET1RTX1NMQVNIOiBgJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpYCxcbiAgTk9fRE9UOiBgKD8hJHtET1RfTElURVJBTH0pYCxcbiAgTk9fRE9UUzogYCg/ISg/Ol58WyR7V0lOX1NMQVNIfV0pJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVF9TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RTX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIFFNQVJLX05PX0RPVDogYFteLiR7V0lOX1NMQVNIfV1gLFxuICBTVEFSVF9BTkNIT1I6IGAoPzpefFske1dJTl9TTEFTSH1dKWAsXG4gIEVORF9BTkNIT1I6IGAoPzpbJHtXSU5fU0xBU0h9XXwkKWBcbn07XG5cbi8qKlxuICogUE9TSVggQnJhY2tldCBSZWdleFxuICovXG5cbmNvbnN0IFBPU0lYX1JFR0VYX1NPVVJDRSA9IHtcbiAgYWxudW06ICdhLXpBLVowLTknLFxuICBhbHBoYTogJ2EtekEtWicsXG4gIGFzY2lpOiAnXFxcXHgwMC1cXFxceDdGJyxcbiAgYmxhbms6ICcgXFxcXHQnLFxuICBjbnRybDogJ1xcXFx4MDAtXFxcXHgxRlxcXFx4N0YnLFxuICBkaWdpdDogJzAtOScsXG4gIGdyYXBoOiAnXFxcXHgyMS1cXFxceDdFJyxcbiAgbG93ZXI6ICdhLXonLFxuICBwcmludDogJ1xcXFx4MjAtXFxcXHg3RSAnLFxuICBwdW5jdDogJ1xcXFwtIVwiIyQlJlxcJygpXFxcXCorLC4vOjs8PT4/QFtcXFxcXV5fYHt8fX4nLFxuICBzcGFjZTogJyBcXFxcdFxcXFxyXFxcXG5cXFxcdlxcXFxmJyxcbiAgdXBwZXI6ICdBLVonLFxuICB3b3JkOiAnQS1aYS16MC05XycsXG4gIHhkaWdpdDogJ0EtRmEtZjAtOSdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcblxuICAvLyByZWd1bGFyIGV4cHJlc3Npb25zXG4gIFJFR0VYX0JBQ0tTTEFTSDogL1xcXFwoPyFbKis/XiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUzogL15bXkAhW1xcXS4sJCorP157fSgpfFxcXFwvXSsvLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTOiAvWy0qKz8uXiR7fSh8KVtcXF1dLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGOiAvKFxcXFw/KSgoXFxXKShcXDMqKSkvZyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUw6IC8oWy0qKz8uXiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNIOiAvKD86XFxbLio/W15cXFxcXVxcXXxcXFxcKD89LikpL2csXG5cbiAgLy8gUmVwbGFjZSBnbG9icyB3aXRoIGVxdWl2YWxlbnQgcGF0dGVybnMgdG8gcmVkdWNlIHBhcnNpbmcgdGltZS5cbiAgUkVQTEFDRU1FTlRTOiB7XG4gICAgJyoqKic6ICcqJyxcbiAgICAnKiovKionOiAnKionLFxuICAgICcqKi8qKi8qKic6ICcqKidcbiAgfSxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiA0OCwgLyogMCAqL1xuICBDSEFSXzk6IDU3LCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6IDY1LCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6IDk3LCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6IDkwLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6IDEyMiwgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogNDAsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogNDEsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiA0MiwgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogMzgsIC8qICYgKi9cbiAgQ0hBUl9BVDogNjQsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSDogOTIsIC8qIFxcICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAxMywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6IDk0LCAvKiBeICovXG4gIENIQVJfQ09MT046IDU4LCAvKiA6ICovXG4gIENIQVJfQ09NTUE6IDQ0LCAvKiAsICovXG4gIENIQVJfRE9UOiA0NiwgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogMzQsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6IDYxLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogMzMsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6IDEyLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiA0NywgLyogLyAqL1xuICBDSEFSX0dSQVZFX0FDQ0VOVDogOTYsIC8qIGAgKi9cbiAgQ0hBUl9IQVNIOiAzNSwgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogNDUsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6IDYwLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogMTIzLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogOTEsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6IDEwLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogMTYwLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogMzcsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiA0MywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6IDYzLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogNjIsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogMTI1LCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6IDkzLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiA1OSwgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogMzksIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogMzIsIC8qICAgKi9cbiAgQ0hBUl9UQUI6IDksIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6IDk1LCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogMTI0LCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiA2NTI3OSwgLyogXFx1RkVGRiAqL1xuXG4gIFNFUDogcGF0aC5zZXAsXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGV4dGdsb2JDaGFycyhjaGFycykge1xuICAgIHJldHVybiB7XG4gICAgICAnISc6IHsgdHlwZTogJ25lZ2F0ZScsIG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogYCkpJHtjaGFycy5TVEFSfSlgIH0sXG4gICAgICAnPyc6IHsgdHlwZTogJ3FtYXJrJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICAgICAnKyc6IHsgdHlwZTogJ3BsdXMnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgICAgICcqJzogeyB0eXBlOiAnc3RhcicsIG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAgICAgJ0AnOiB7IHR5cGU6ICdhdCcsIG9wZW46ICcoPzonLCBjbG9zZTogJyknIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR0xPQl9DSEFSU1xuICAgKi9cblxuICBnbG9iQ2hhcnMod2luMzIpIHtcbiAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgd2luMzIgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3Qge1xuICBSRUdFWF9CQUNLU0xBU0gsXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuZXhwb3J0cy5pc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbmV4cG9ydHMuaGFzUmVnZXhDaGFycyA9IHN0ciA9PiBSRUdFWF9TUEVDSUFMX0NIQVJTLnRlc3Qoc3RyKTtcbmV4cG9ydHMuaXNSZWdleENoYXIgPSBzdHIgPT4gc3RyLmxlbmd0aCA9PT0gMSAmJiBleHBvcnRzLmhhc1JlZ2V4Q2hhcnMoc3RyKTtcbmV4cG9ydHMuZXNjYXBlUmVnZXggPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUwsICdcXFxcJDEnKTtcbmV4cG9ydHMudG9Qb3NpeFNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfQkFDS1NMQVNILCAnLycpO1xuXG5leHBvcnRzLnJlbW92ZUJhY2tzbGFzaGVzID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsIG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2ggPT09ICdcXFxcJyA/ICcnIDogbWF0Y2g7XG4gIH0pO1xufTtcblxuZXhwb3J0cy5zdXBwb3J0c0xvb2tiZWhpbmRzID0gKCkgPT4ge1xuICBjb25zdCBzZWdzID0gcHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIGlmIChzZWdzLmxlbmd0aCA9PT0gMyAmJiBzZWdzWzBdID49IDkgfHwgKHNlZ3NbMF0gPT09IDggJiYgc2Vnc1sxXSA+PSAxMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzV2luZG93cyA9IG9wdGlvbnMgPT4ge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy53aW5kb3dzID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aW5kb3dzO1xuICB9XG4gIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSB8fCBwYXRoLnNlcCA9PT0gJ1xcXFwnO1xufTtcblxuZXhwb3J0cy5lc2NhcGVMYXN0ID0gKGlucHV0LCBjaGFyLCBsYXN0SWR4KSA9PiB7XG4gIGNvbnN0IGlkeCA9IGlucHV0Lmxhc3RJbmRleE9mKGNoYXIsIGxhc3RJZHgpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXRbaWR4IC0gMV0gPT09ICdcXFxcJykgcmV0dXJuIGV4cG9ydHMuZXNjYXBlTGFzdChpbnB1dCwgY2hhciwgaWR4IC0gMSk7XG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBpZHgpfVxcXFwke2lucHV0LnNsaWNlKGlkeCl9YDtcbn07XG5cbmV4cG9ydHMucmVtb3ZlUHJlZml4ID0gKGlucHV0LCBzdGF0ZSA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBpbnB1dDtcbiAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDIpO1xuICAgIHN0YXRlLnByZWZpeCA9ICcuLyc7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydHMud3JhcE91dHB1dCA9IChpbnB1dCwgc3RhdGUgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IGAoPzpeKD8hJHtvdXRwdXR9KS4qJClgO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7XG4gIENIQVJfQVNURVJJU0ssICAgICAgICAgICAgIC8qICogKi9cbiAgQ0hBUl9BVCwgICAgICAgICAgICAgICAgICAgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNILCAgICAgICAvKiBcXCAqL1xuICBDSEFSX0NPTU1BLCAgICAgICAgICAgICAgICAvKiAsICovXG4gIENIQVJfRE9ULCAgICAgICAgICAgICAgICAgIC8qIC4gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLLCAgICAgLyogISAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0gsICAgICAgICAvKiAvICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgICAgIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAgICAgLyogKCAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsICAvKiBbICovXG4gIENIQVJfUExVUywgICAgICAgICAgICAgICAgIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLLCAgICAgICAgLyogPyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAgICAvKiB9ICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsICAgIC8qICkgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAgLyogXSAqL1xufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IGlzUGF0aFNlcGFyYXRvciA9IGNvZGUgPT4ge1xuICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59O1xuXG5jb25zdCBkZXB0aCA9IHRva2VuID0+IHtcbiAgaWYgKHRva2VuLmlzUHJlZml4ICE9PSB0cnVlKSB7XG4gICAgdG9rZW4uZGVwdGggPSB0b2tlbi5pc0dsb2JzdGFyID8gSW5maW5pdHkgOiAxO1xuICB9XG59O1xuXG4vKipcbiAqIFF1aWNrbHkgc2NhbnMgYSBnbG9iIHBhdHRlcm4gYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBoYW5kZnVsIG9mXG4gKiB1c2VmdWwgcHJvcGVydGllcywgbGlrZSBgaXNHbG9iYCwgYHBhdGhgICh0aGUgbGVhZGluZyBub24tZ2xvYiwgaWYgaXQgZXhpc3RzKSxcbiAqIGBnbG9iYCAodGhlIGFjdHVhbCBwYXR0ZXJuKSwgYG5lZ2F0ZWRgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhYCBidXQgbm90XG4gKiB3aXRoIGAhKGApIGFuZCBgbmVnYXRlZEV4dGdsb2JgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhKGApLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwbSA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc29sZS5sb2cocG0uc2NhbignZm9vL2Jhci8qLmpzJykpO1xuICogeyBpc0dsb2I6IHRydWUsIGlucHV0OiAnZm9vL2Jhci8qLmpzJywgYmFzZTogJ2Zvby9iYXInLCBnbG9iOiAnKi5qcycgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0b2tlbnMgYW5kIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoIC0gMTtcbiAgY29uc3Qgc2NhblRvRW5kID0gb3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnNjYW5Ub0VuZCA9PT0gdHJ1ZTtcbiAgY29uc3Qgc2xhc2hlcyA9IFtdO1xuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBsZXQgc3RyID0gaW5wdXQ7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGlzQnJhY2UgPSBmYWxzZTtcbiAgbGV0IGlzQnJhY2tldCA9IGZhbHNlO1xuICBsZXQgaXNHbG9iID0gZmFsc2U7XG4gIGxldCBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYnN0YXIgPSBmYWxzZTtcbiAgbGV0IGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWQgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWRFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYnJhY2VzID0gMDtcbiAgbGV0IHByZXY7XG4gIGxldCBjb2RlO1xuICBsZXQgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICBjb25zdCBlb3MgPSAoKSA9PiBpbmRleCA+PSBsZW5ndGg7XG4gIGNvbnN0IHBlZWsgPSAoKSA9PiBzdHIuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICBjb25zdCBhZHZhbmNlID0gKCkgPT4ge1xuICAgIHByZXYgPSBjb2RlO1xuICAgIHJldHVybiBzdHIuY2hhckNvZGVBdCgrK2luZGV4KTtcbiAgfTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgIGxldCBuZXh0O1xuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgY29kZSA9IGFkdmFuY2UoKTtcblxuICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICBicmFjZUVzY2FwZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGJyYWNlRXNjYXBlZCA9PT0gdHJ1ZSB8fCBjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGJyYWNlcysrO1xuXG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0RPVCAmJiAoY29kZSA9IGFkdmFuY2UoKSkgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2VzID09PSAwKSB7XG4gICAgICAgICAgICBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICBzbGFzaGVzLnB1c2goaW5kZXgpO1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICAgICAgaWYgKGZpbmlzaGVkID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0RPVCAmJiBpbmRleCA9PT0gKHN0YXJ0ICsgMSkpIHtcbiAgICAgICAgc3RhcnQgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vZXh0ICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBpc0V4dGdsb2JDaGFyID0gY29kZSA9PT0gQ0hBUl9QTFVTXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVRcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BU1RFUklTS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUktcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLO1xuXG4gICAgICBpZiAoaXNFeHRnbG9iQ2hhciA9PT0gdHJ1ZSAmJiBwZWVrKCkgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICBpc0V4dGdsb2IgPSB0b2tlbi5pc0V4dGdsb2IgPSB0cnVlO1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICAgICAgbmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQVNURVJJU0spIHtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0FTVEVSSVNLKSBpc0dsb2JzdGFyID0gdG9rZW4uaXNHbG9ic3RhciA9IHRydWU7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSSykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGlzQnJhY2tldCA9IHRva2VuLmlzQnJhY2tldCA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgbmVnYXRlZCA9IHRva2VuLm5lZ2F0ZWQgPSB0cnVlO1xuICAgICAgc3RhcnQrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vcGFyZW4gIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5ub2V4dCA9PT0gdHJ1ZSkge1xuICAgIGlzRXh0Z2xvYiA9IGZhbHNlO1xuICAgIGlzR2xvYiA9IGZhbHNlO1xuICB9XG5cbiAgbGV0IGJhc2UgPSBzdHI7XG4gIGxldCBwcmVmaXggPSAnJztcbiAgbGV0IGdsb2IgPSAnJztcblxuICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgcHJlZml4ID0gc3RyLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBzdHIgPSBzdHIuc2xpY2Uoc3RhcnQpO1xuICAgIGxhc3RJbmRleCAtPSBzdGFydDtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGlzR2xvYiA9PT0gdHJ1ZSAmJiBsYXN0SW5kZXggPiAwKSB7XG4gICAgYmFzZSA9IHN0ci5zbGljZSgwLCBsYXN0SW5kZXgpO1xuICAgIGdsb2IgPSBzdHIuc2xpY2UobGFzdEluZGV4KTtcbiAgfSBlbHNlIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICBiYXNlID0gJyc7XG4gICAgZ2xvYiA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0gc3RyO1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgYmFzZSAhPT0gJycgJiYgYmFzZSAhPT0gJy8nICYmIGJhc2UgIT09IHN0cikge1xuICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoYmFzZS5jaGFyQ29kZUF0KGJhc2UubGVuZ3RoIC0gMSkpKSB7XG4gICAgICBiYXNlID0gYmFzZS5zbGljZSgwLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICBpZiAoZ2xvYikgZ2xvYiA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGdsb2IpO1xuXG4gICAgaWYgKGJhc2UgJiYgYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGJhc2UgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhiYXNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBwcmVmaXgsXG4gICAgaW5wdXQsXG4gICAgc3RhcnQsXG4gICAgYmFzZSxcbiAgICBnbG9iLFxuICAgIGlzQnJhY2UsXG4gICAgaXNCcmFja2V0LFxuICAgIGlzR2xvYixcbiAgICBpc0V4dGdsb2IsXG4gICAgaXNHbG9ic3RhcixcbiAgICBuZWdhdGVkLFxuICAgIG5lZ2F0ZWRFeHRnbG9iXG4gIH07XG5cbiAgaWYgKG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgc3RhdGUubWF4RGVwdGggPSAwO1xuICAgIGlmICghaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIHN0YXRlLnRva2VucyA9IHRva2VucztcbiAgfVxuXG4gIGlmIChvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgbGV0IHByZXZJbmRleDtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDtcbiAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpO1xuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBwcmV2SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChwcmV2SW5kZXggJiYgcHJldkluZGV4ICsgMSA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShwcmV2SW5kZXggKyAxKTtcbiAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuXG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZXB0aCh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlcztcbiAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzY2FuO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLFxuICBSRVBMQUNFTUVOVFNcbn0gPSBjb25zdGFudHM7XG5cbi8qKlxuICogSGVscGVyc1xuICovXG5cbmNvbnN0IGV4cGFuZFJhbmdlID0gKGFyZ3MsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGFuZFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXhwYW5kUmFuZ2UoLi4uYXJncywgb3B0aW9ucyk7XG4gIH1cblxuICBhcmdzLnNvcnQoKTtcbiAgY29uc3QgdmFsdWUgPSBgWyR7YXJncy5qb2luKCctJyl9XWA7XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3ICovXG4gICAgbmV3IFJlZ0V4cCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgcmV0dXJuIGFyZ3MubWFwKHYgPT4gdXRpbHMuZXNjYXBlUmVnZXgodikpLmpvaW4oJy4uJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgbWVzc2FnZSBmb3IgYSBzeW50YXggZXJyb3JcbiAqL1xuXG5jb25zdCBzeW50YXhFcnJvciA9ICh0eXBlLCBjaGFyKSA9PiB7XG4gIHJldHVybiBgTWlzc2luZyAke3R5cGV9OiBcIiR7Y2hhcn1cIiAtIHVzZSBcIlxcXFxcXFxcJHtjaGFyfVwiIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc2A7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuXG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG5cbiAgbGV0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBjb25zdCBib3MgPSB7IHR5cGU6ICdib3MnLCB2YWx1ZTogJycsIG91dHB1dDogb3B0cy5wcmVwZW5kIHx8ICcnIH07XG4gIGNvbnN0IHRva2VucyA9IFtib3NdO1xuXG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IFBMQVRGT1JNX0NIQVJTID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG4gIGNvbnN0IEVYVEdMT0JfQ0hBUlMgPSBjb25zdGFudHMuZXh0Z2xvYkNoYXJzKFBMQVRGT1JNX0NIQVJTKTtcblxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgUExVU19MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UX1NMQVNILFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgUU1BUkssXG4gICAgUU1BUktfTk9fRE9ULFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBQTEFURk9STV9DSEFSUztcblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/ICcnIDogTk9fRE9UO1xuICBjb25zdCBxbWFya05vRG90ID0gb3B0cy5kb3QgPyBRTUFSSyA6IFFNQVJLX05PX0RPVDtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyBnbG9ic3RhcihvcHRzKSA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIC8vIG1pbmltYXRjaCBvcHRpb25zIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBvcHRzLm5vZXh0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLm5vZXh0Z2xvYiA9IG9wdHMubm9leHQ7XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpbnB1dCxcbiAgICBpbmRleDogLTEsXG4gICAgc3RhcnQ6IDAsXG4gICAgZG90OiBvcHRzLmRvdCA9PT0gdHJ1ZSxcbiAgICBjb25zdW1lZDogJycsXG4gICAgb3V0cHV0OiAnJyxcbiAgICBwcmVmaXg6ICcnLFxuICAgIGJhY2t0cmFjazogZmFsc2UsXG4gICAgbmVnYXRlZDogZmFsc2UsXG4gICAgYnJhY2tldHM6IDAsXG4gICAgYnJhY2VzOiAwLFxuICAgIHBhcmVuczogMCxcbiAgICBxdW90ZXM6IDAsXG4gICAgZ2xvYnN0YXI6IGZhbHNlLFxuICAgIHRva2Vuc1xuICB9O1xuXG4gIGlucHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxlbiA9IGlucHV0Lmxlbmd0aDtcblxuICBjb25zdCBleHRnbG9icyA9IFtdO1xuICBjb25zdCBicmFjZXMgPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgbGV0IHByZXYgPSBib3M7XG4gIGxldCB2YWx1ZTtcblxuICAvKipcbiAgICogVG9rZW5pemluZyBoZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IHN0YXRlLmluZGV4ID09PSBsZW4gLSAxO1xuICBjb25zdCBwZWVrID0gc3RhdGUucGVlayA9IChuID0gMSkgPT4gaW5wdXRbc3RhdGUuaW5kZXggKyBuXTtcbiAgY29uc3QgYWR2YW5jZSA9IHN0YXRlLmFkdmFuY2UgPSAoKSA9PiBpbnB1dFsrK3N0YXRlLmluZGV4XSB8fCAnJztcbiAgY29uc3QgcmVtYWluaW5nID0gKCkgPT4gaW5wdXQuc2xpY2Uoc3RhdGUuaW5kZXggKyAxKTtcbiAgY29uc3QgY29uc3VtZSA9ICh2YWx1ZSA9ICcnLCBudW0gPSAwKSA9PiB7XG4gICAgc3RhdGUuY29uc3VtZWQgKz0gdmFsdWU7XG4gICAgc3RhdGUuaW5kZXggKz0gbnVtO1xuICB9O1xuXG4gIGNvbnN0IGFwcGVuZCA9IHRva2VuID0+IHtcbiAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcbiAgICBjb25zdW1lKHRva2VuLnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBuZWdhdGUgPSAoKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMTtcblxuICAgIHdoaWxlIChwZWVrKCkgPT09ICchJyAmJiAocGVlaygyKSAhPT0gJygnIHx8IHBlZWsoMykgPT09ICc/JykpIHtcbiAgICAgIGFkdmFuY2UoKTtcbiAgICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgICBjb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5uZWdhdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydCsrO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGluY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdKys7XG4gICAgc3RhY2sucHVzaCh0eXBlKTtcbiAgfTtcblxuICBjb25zdCBkZWNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXS0tO1xuICAgIHN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdXNoIHRva2VucyBvbnRvIHRoZSB0b2tlbnMgYXJyYXkuIFRoaXMgaGVscGVyIHNwZWVkcyB1cFxuICAgKiB0b2tlbml6aW5nIGJ5IDEpIGhlbHBpbmcgdXMgYXZvaWQgYmFja3RyYWNraW5nIGFzIG11Y2ggYXMgcG9zc2libGUsXG4gICAqIGFuZCAyKSBoZWxwaW5nIHVzIGF2b2lkIGNyZWF0aW5nIGV4dHJhIHRva2VucyB3aGVuIGNvbnNlY3V0aXZlXG4gICAqIGNoYXJhY3RlcnMgYXJlIHBsYWluIHRleHQuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIHNpbXBsaWZpZXNcbiAgICogbG9va2JlaGluZHMuXG4gICAqL1xuXG4gIGNvbnN0IHB1c2ggPSB0b2sgPT4ge1xuICAgIGlmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicpIHtcbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmICh0b2sudHlwZSA9PT0gJ2NvbW1hJyB8fCB0b2sudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSB0b2suZXh0Z2xvYiA9PT0gdHJ1ZSB8fCAoZXh0Z2xvYnMubGVuZ3RoICYmICh0b2sudHlwZSA9PT0gJ3BpcGUnIHx8IHRvay50eXBlID09PSAncGFyZW4nKSk7XG5cbiAgICAgIGlmICh0b2sudHlwZSAhPT0gJ3NsYXNoJyAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcbiAgICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgICBwcmV2LnZhbHVlID0gJyonO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoICYmIHRvay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5pbm5lciArPSB0b2sudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay52YWx1ZSB8fCB0b2sub3V0cHV0KSBhcHBlbmQodG9rKTtcbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiB0b2sudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IHRvay52YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gKHByZXYub3V0cHV0IHx8ICcnKSArIHRvay52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2sucHJldiA9IHByZXY7XG4gICAgdG9rZW5zLnB1c2godG9rKTtcbiAgICBwcmV2ID0gdG9rO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JPcGVuID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IC4uLkVYVEdMT0JfQ0hBUlNbdmFsdWVdLCBjb25kaXRpb25zOiAxLCBpbm5lcjogJycgfTtcblxuICAgIHRva2VuLnByZXYgPSBwcmV2O1xuICAgIHRva2VuLnBhcmVucyA9IHN0YXRlLnBhcmVucztcbiAgICB0b2tlbi5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMuY2FwdHVyZSA/ICcoJyA6ICcnKSArIHRva2VuLm9wZW47XG5cbiAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgIHB1c2goeyB0eXBlLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5vdXRwdXQgPyAnJyA6IE9ORV9DSEFSIH0pO1xuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZTogYWR2YW5jZSgpLCBvdXRwdXQgfSk7XG4gICAgZXh0Z2xvYnMucHVzaCh0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYkNsb3NlID0gdG9rZW4gPT4ge1xuICAgIGxldCBvdXRwdXQgPSB0b2tlbi5jbG9zZSArIChvcHRzLmNhcHR1cmUgPyAnKScgOiAnJyk7XG4gICAgbGV0IHJlc3Q7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ25lZ2F0ZScpIHtcbiAgICAgIGxldCBleHRnbG9iU3RhciA9IHN0YXI7XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lciAmJiB0b2tlbi5pbm5lci5sZW5ndGggPiAxICYmIHRva2VuLmlubmVyLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgZXh0Z2xvYlN0YXIgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGdsb2JTdGFyICE9PSBzdGFyIHx8IGVvcygpIHx8IC9eXFwpKyQvLnRlc3QocmVtYWluaW5nKCkpKSB7XG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkkKSkke2V4dGdsb2JTdGFyfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lci5pbmNsdWRlcygnKicpICYmIChyZXN0ID0gcmVtYWluaW5nKCkpICYmIC9eXFwuW15cXFxcLy5dKyQvLnRlc3QocmVzdCkpIHtcbiAgICAgICAgLy8gQW55IG5vbi1tYWdpY2FsIHN0cmluZyAoYC50c2ApIG9yIGV2ZW4gbmVzdGVkIGV4cHJlc3Npb24gKGAue3RzLHRzeH1gKSBjYW4gZm9sbG93IGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHN0cmluZyBhbmQgdXNlIGl0IGluIHRoZSBvdXRwdXQgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4uXG4gICAgICAgIC8vIFN1aXRhYmxlIHBhdHRlcm5zOiBgLyEoKi5kKS50c2AsIGAvISgqLmQpLnt0cyx0c3h9YCwgYCoqLyEoKi1kYmcpLkAoanMpYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGlzYWJsaW5nIHRoZSBgZmFzdHBhdGhzYCBvcHRpb24gZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgc3RyaW5ncyBhcyBgLnRzYCBpbiB0aGUgcGF0dGVybiBsaWtlIGAqKi8hKCouZCkudHNgLlxuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFyc2UocmVzdCwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pLm91dHB1dDtcblxuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJHtleHByZXNzaW9ufSkke2V4dGdsb2JTdGFyfSlgO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAnYm9zJykge1xuICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmFzdCBwYXRoc1xuICAgKi9cblxuICBpZiAob3B0cy5mYXN0cGF0aHMgIT09IGZhbHNlICYmICEvKF5bKiFdfFsvKClbXFxde31cIl0pLy50ZXN0KGlucHV0KSkge1xuICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuXG4gICAgbGV0IG91dHB1dCA9IGlucHV0LnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLCAobSwgZXNjLCBjaGFycywgZmlyc3QsIHJlc3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlyc3QgPT09ICdcXFxcJykge1xuICAgICAgICBiYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICc/Jykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIERPVF9MSVRFUkFMLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcqJykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBzdGFyIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzYyA/IG0gOiBgXFxcXCR7bX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXCsvZywgbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoICUgMiA9PT0gMCA/ICdcXFxcXFxcXCcgOiAobSA/ICdcXFxcJyA6ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dCA9PT0gaW5wdXQgJiYgb3B0cy5jb250YWlucyA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdGUub3V0cHV0ID0gaW5wdXQ7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMud3JhcE91dHB1dChvdXRwdXQsIHN0YXRlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgaW5wdXQgdW50aWwgd2UgcmVhY2ggZW5kLW9mLXN0cmluZ1xuICAgKi9cblxuICB3aGlsZSAoIWVvcygpKSB7XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICBpZiAodmFsdWUgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcXFxcJykge1xuICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcblxuICAgICAgaWYgKG5leHQgPT09ICcvJyAmJiBvcHRzLmJhc2ggIT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLicgfHwgbmV4dCA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbGxhcHNlIHNsYXNoZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBmb3IgZXhwbG9pdHNcbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXFxcKy8uZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBsZXQgc2xhc2hlcyA9IDA7XG5cbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPiAyKSB7XG4gICAgICAgIHNsYXNoZXMgPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IHNsYXNoZXM7XG4gICAgICAgIGlmIChzbGFzaGVzICUgMiAhPT0gMCkge1xuICAgICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSByZWdleCBjaGFyYWN0ZXIgY2xhc3MsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgYnJhY2tldC5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5icmFja2V0cyA+IDAgJiYgKHZhbHVlICE9PSAnXScgfHwgcHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICBpZiAob3B0cy5wb3NpeCAhPT0gZmFsc2UgJiYgdmFsdWUgPT09ICc6Jykge1xuICAgICAgICBjb25zdCBpbm5lciA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgICAgcHJldi5wb3NpeCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gcHJldi52YWx1ZS5sYXN0SW5kZXhPZignWycpO1xuICAgICAgICAgICAgY29uc3QgcHJlID0gcHJldi52YWx1ZS5zbGljZSgwLCBpZHgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IHByZXYudmFsdWUuc2xpY2UoaWR4ICsgMik7XG4gICAgICAgICAgICBjb25zdCBwb3NpeCA9IFBPU0lYX1JFR0VYX1NPVVJDRVtyZXN0XTtcbiAgICAgICAgICAgIGlmIChwb3NpeCkge1xuICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gcHJlICsgcG9zaXg7XG4gICAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBpZiAoIWJvcy5vdXRwdXQgJiYgdG9rZW5zLmluZGV4T2YocHJldikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBib3Mub3V0cHV0ID0gT05FX0NIQVI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgodmFsdWUgPT09ICdbJyAmJiBwZWVrKCkgIT09ICc6JykgfHwgKHZhbHVlID09PSAnLScgJiYgcGVlaygpID09PSAnXScpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ10nICYmIChwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMucG9zaXggPT09IHRydWUgJiYgdmFsdWUgPT09ICchJyAmJiBwcmV2LnZhbHVlID09PSAnWycpIHtcbiAgICAgICAgdmFsdWUgPSAnXic7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgZG91YmxlIHF1b3RlLlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLnF1b3RlcyA9PT0gMSAmJiB2YWx1ZSAhPT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB1dGlscy5lc2NhcGVSZWdleCh2YWx1ZSk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3VibGUgcXVvdGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgIHN0YXRlLnF1b3RlcyA9IHN0YXRlLnF1b3RlcyA9PT0gMSA/IDAgOiAxO1xuICAgICAgaWYgKG9wdHMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcoJykge1xuICAgICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJyknKSB7XG4gICAgICBpZiAoc3RhdGUucGFyZW5zID09PSAwICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJygnKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGdsb2IgPSBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChleHRnbG9iICYmIHN0YXRlLnBhcmVucyA9PT0gZXh0Z2xvYi5wYXJlbnMgKyAxKSB7XG4gICAgICAgIGV4dGdsb2JDbG9zZShleHRnbG9icy5wb3AoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUsIG91dHB1dDogc3RhdGUucGFyZW5zID8gJyknIDogJ1xcXFwpJyB9KTtcbiAgICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmUgYnJhY2tldHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1snKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgIXJlbWFpbmluZygpLmluY2x1ZGVzKCddJykpIHtcbiAgICAgICAgaWYgKG9wdHMubm9icmFja2V0ICE9PSB0cnVlICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2tldCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnXScpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdicmFja2V0JyAmJiBwcmV2LnZhbHVlLmxlbmd0aCA9PT0gMSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnWycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuXG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgaWYgKHByZXYucG9zaXggIT09IHRydWUgJiYgcHJldlZhbHVlWzBdID09PSAnXicgJiYgIXByZXZWYWx1ZS5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIHZhbHVlID0gYC8ke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIG1hdGNoIHdpdGggYSByZWdleCBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gZmFsc2UgfHwgdXRpbHMuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc2NhcGVkID0gdXRpbHMuZXNjYXBlUmVnZXgocHJldi52YWx1ZSk7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYudmFsdWUubGVuZ3RoKTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgZXNjYXBlIHRoZSBicmFja2V0cyB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gZXNjYXBlZDtcbiAgICAgICAgcHJldi52YWx1ZSA9IGVzY2FwZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBub3RoaW5nLCB0cnkgdG8gbWF0Y2ggYm90aFxuICAgICAgcHJldi52YWx1ZSA9IGAoJHtjYXB0dXJlfSR7ZXNjYXBlZH18JHtwcmV2LnZhbHVlfSlgO1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYudmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcmFjZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3snICYmIG9wdHMubm9icmFjZSAhPT0gdHJ1ZSkge1xuICAgICAgaW5jcmVtZW50KCdicmFjZXMnKTtcblxuICAgICAgY29uc3Qgb3BlbiA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG91dHB1dDogJygnLFxuICAgICAgICBvdXRwdXRJbmRleDogc3RhdGUub3V0cHV0Lmxlbmd0aCxcbiAgICAgICAgdG9rZW5zSW5kZXg6IHN0YXRlLnRva2Vucy5sZW5ndGhcbiAgICAgIH07XG5cbiAgICAgIGJyYWNlcy5wdXNoKG9wZW4pO1xuICAgICAgcHVzaChvcGVuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ30nKSB7XG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChvcHRzLm5vYnJhY2UgPT09IHRydWUgfHwgIWJyYWNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG91dHB1dCA9ICcpJztcblxuICAgICAgaWYgKGJyYWNlLmRvdHMgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdG9rZW5zLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgIT09ICdkb3RzJykge1xuICAgICAgICAgICAgcmFuZ2UudW5zaGlmdChhcnJbaV0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dCA9IGV4cGFuZFJhbmdlKHJhbmdlLCBvcHRzKTtcbiAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYWNlLmNvbW1hICE9PSB0cnVlICYmIGJyYWNlLmRvdHMgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIGJyYWNlLm91dHB1dEluZGV4KTtcbiAgICAgICAgY29uc3QgdG9rcyA9IHN0YXRlLnRva2Vucy5zbGljZShicmFjZS50b2tlbnNJbmRleCk7XG4gICAgICAgIGJyYWNlLnZhbHVlID0gYnJhY2Uub3V0cHV0ID0gJ1xcXFx7JztcbiAgICAgICAgdmFsdWUgPSBvdXRwdXQgPSAnXFxcXH0nO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBvdXQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0b2tzKSB7XG4gICAgICAgICAgc3RhdGUub3V0cHV0ICs9ICh0Lm91dHB1dCB8fCB0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNlJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gICAgICBicmFjZXMucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaXBlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnfCcpIHtcbiAgICAgIGlmIChleHRnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbnMrKztcbiAgICAgIH1cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWFzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcsJykge1xuICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYnJhY2UgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdicmFjZXMnKSB7XG4gICAgICAgIGJyYWNlLmNvbW1hID0gdHJ1ZTtcbiAgICAgICAgb3V0cHV0ID0gJ3wnO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsYXNoZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy8nKSB7XG4gICAgICAvLyBpZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbG9iIGlzIFwiLi9cIiwgYWR2YW5jZSB0aGUgc3RhcnRcbiAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGluZGV4LCBhbmQgZG9uJ3QgYWRkIHRoZSBcIi4vXCIgY2hhcmFjdGVyc1xuICAgICAgLy8gdG8gdGhlIHN0YXRlLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyBsb29rYmVoaW5kcyB3aGVuXG4gICAgICAvLyBjaGVja2luZyBmb3IgQk9TIGNoYXJhY3RlcnMgbGlrZSBcIiFcIiBhbmQgXCIuXCIgKG5vdCBcIi4vXCIpXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90JyAmJiBzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgKyAxKSB7XG4gICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhdGUuaW5kZXggKyAxO1xuICAgICAgICBzdGF0ZS5jb25zdW1lZCA9ICcnO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSAnJztcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICBwcmV2ID0gYm9zOyAvLyByZXNldCBcInByZXZcIiB0byB0aGUgZmlyc3QgdG9rZW5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZSwgb3V0cHV0OiBTTEFTSF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLicpIHtcbiAgICAgIGlmIChzdGF0ZS5icmFjZXMgPiAwICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgaWYgKHByZXYudmFsdWUgPT09ICcuJykgcHJldi5vdXRwdXQgPSBET1RfTElURVJBTDtcbiAgICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBwcmV2LnR5cGUgPSAnZG90cyc7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBicmFjZS5kb3RzID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuYnJhY2VzICsgc3RhdGUucGFyZW5zKSA9PT0gMCAmJiBwcmV2LnR5cGUgIT09ICdib3MnICYmIHByZXYudHlwZSAhPT0gJ3NsYXNoJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVzdGlvbiBtYXJrc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnPycpIHtcbiAgICAgIGNvbnN0IGlzR3JvdXAgPSBwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJztcbiAgICAgIGlmICghaXNHcm91cCAmJiBvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3FtYXJrJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAncGFyZW4nKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG4gICAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gJzwnICYmICF1dGlscy5zdXBwb3J0c0xvb2tiZWhpbmRzKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vZGUuanMgdjEwIG9yIGhpZ2hlciBpcyByZXF1aXJlZCBmb3IgcmVnZXggbG9va2JlaGluZHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgocHJldi52YWx1ZSA9PT0gJygnICYmICEvWyE9PDpdLy50ZXN0KG5leHQpKSB8fCAobmV4dCA9PT0gJzwnICYmICEvPChbIT1dfFxcdys+KS8udGVzdChyZW1haW5pbmcoKSkpKSB7XG4gICAgICAgICAgb3V0cHV0ID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuZG90ICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnYm9zJykpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLX05PX0RPVCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSSyB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2xhbWF0aW9uXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICchJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnKSB7XG4gICAgICAgIGlmIChwZWVrKDIpICE9PSAnPycgfHwgIS9bIT08Ol0vLnRlc3QocGVlaygzKSkpIHtcbiAgICAgICAgICBleHRnbG9iT3BlbignbmVnYXRlJywgdmFsdWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIHN0YXRlLmluZGV4ID09PSAwKSB7XG4gICAgICAgIG5lZ2F0ZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcrJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncGx1cycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCcpIHx8IG9wdHMucmVnZXggPT09IGZhbHNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlLCBvdXRwdXQ6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNlJykpIHx8IHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZTogUExVU19MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnQCcpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdhdCcsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgIT09ICcqJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJCcgfHwgdmFsdWUgPT09ICdeJykge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhbHVlICs9IG1hdGNoWzBdO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnNcbiAgICAgKi9cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicgfHwgcHJldi5zdGFyID09PSB0cnVlKSkge1xuICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgcHJldi5zdGFyID0gdHJ1ZTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdCA9IHJlbWFpbmluZygpO1xuICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiAvXlxcKFteP10vLnRlc3QocmVzdCkpIHtcbiAgICAgIGV4dGdsb2JPcGVuKCdzdGFyJywgdmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ3N0YXInKSB7XG4gICAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpb3IgPSBwcmV2LnByZXY7XG4gICAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5wcmV2O1xuICAgICAgY29uc3QgaXNTdGFydCA9IHByaW9yLnR5cGUgPT09ICdzbGFzaCcgfHwgcHJpb3IudHlwZSA9PT0gJ2Jvcyc7XG4gICAgICBjb25zdCBhZnRlclN0YXIgPSBiZWZvcmUgJiYgKGJlZm9yZS50eXBlID09PSAnc3RhcicgfHwgYmVmb3JlLnR5cGUgPT09ICdnbG9ic3RhcicpO1xuXG4gICAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlICYmICghaXNTdGFydCB8fCAocmVzdFswXSAmJiByZXN0WzBdICE9PSAnLycpKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmIChwcmlvci50eXBlID09PSAnY29tbWEnIHx8IHByaW9yLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gZXh0Z2xvYnMubGVuZ3RoICYmIChwcmlvci50eXBlID09PSAncGlwZScgfHwgcHJpb3IudHlwZSA9PT0gJ3BhcmVuJyk7XG4gICAgICBpZiAoIWlzU3RhcnQgJiYgcHJpb3IudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RyaXAgY29uc2VjdXRpdmUgYC8qKi9gXG4gICAgICB3aGlsZSAocmVzdC5zbGljZSgwLCAzKSA9PT0gJy8qKicpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBpbnB1dFtzdGF0ZS5pbmRleCArIDRdO1xuICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09ICcvJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDMpO1xuICAgICAgICBjb25zdW1lKCcvKionLCAzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIGVvcygpKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiAhYWZ0ZXJTdGFyICYmIGVvcygpKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpICsgKG9wdHMuc3RyaWN0U2xhc2hlcyA/ICcpJyA6ICd8JCknKTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgY29uc3QgZW5kID0gcmVzdFsxXSAhPT0gdm9pZCAwID8gJ3wkJyA6ICcnO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH18JHtTTEFTSF9MSVRFUkFMfSR7ZW5kfSlgO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuXG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAoPzpefCR7U0xBU0hfTElURVJBTH18JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KWA7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbW92ZSBzaW5nbGUgc3RhciBmcm9tIG91dHB1dFxuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyByZXNldCBwcmV2aW91cyB0b2tlbiB0byBnbG9ic3RhclxuICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAvLyByZXNldCBvdXRwdXQgd2l0aCBnbG9ic3RhclxuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiBzdGFyIH07XG5cbiAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSAnLio/JztcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdib3MnIHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJykge1xuICAgICAgICB0b2tlbi5vdXRwdXQgPSBub2RvdCArIHRva2VuLm91dHB1dDtcbiAgICAgIH1cbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJykgJiYgb3B0cy5yZWdleCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gdmFsdWU7XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgfHwgcHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcblxuICAgICAgfSBlbHNlIGlmIChvcHRzLmRvdCA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IG5vZG90O1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBub2RvdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBlZWsoKSAhPT0gJyonKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2tldHMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnWycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICcpJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnKCcpO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2VzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnfScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ3snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc3RhcicgfHwgcHJldi50eXBlID09PSAnYnJhY2tldCcpKSB7XG4gICAgcHVzaCh7IHR5cGU6ICdtYXliZV9zbGFzaCcsIHZhbHVlOiAnJywgb3V0cHV0OiBgJHtTTEFTSF9MSVRFUkFMfT9gIH0pO1xuICB9XG5cbiAgLy8gcmVidWlsZCB0aGUgb3V0cHV0IGlmIHdlIGhhZCB0byBiYWNrdHJhY2sgYXQgYW55IHBvaW50XG4gIGlmIChzdGF0ZS5iYWNrdHJhY2sgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5vdXRwdXQgPSAnJztcblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygc3RhdGUudG9rZW5zKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcblxuICAgICAgaWYgKHRva2VuLnN1ZmZpeCkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4uc3VmZml4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogRmFzdCBwYXRocyBmb3IgY3JlYXRpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgY29tbW9uIGdsb2IgcGF0dGVybnMuXG4gKiBUaGlzIGNhbiBzaWduaWZpY2FudGx5IHNwZWVkIHVwIHByb2Nlc3NpbmcgYW5kIGhhcyB2ZXJ5IGxpdHRsZSBkb3duc2lkZVxuICogaW1wYWN0IHdoZW4gbm9uZSBvZiB0aGUgZmFzdCBwYXRocyBtYXRjaC5cbiAqL1xuXG5wYXJzZS5mYXN0cGF0aHMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UUyxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gTk9fRE9UUyA6IE5PX0RPVDtcbiAgY29uc3Qgc2xhc2hEb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFNfU0xBU0ggOiBOT19ET1Q7XG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHN0YXRlID0geyBuZWdhdGVkOiBmYWxzZSwgcHJlZml4OiAnJyB9O1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/ICcuKj8nIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSByZXR1cm4gc3RhcjtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZSA9IHN0ciA9PiB7XG4gICAgc3dpdGNoIChzdHIpIHtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnLionOlxuICAgICAgICByZXR1cm4gYCR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi4qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyovKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtTTEFTSF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzbGFzaERvdH0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKionOlxuICAgICAgICByZXR1cm4gbm9kb3QgKyBnbG9ic3RhcihvcHRzKTtcblxuICAgICAgY2FzZSAnKiovKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovKi4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8uKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4qPylcXC4oXFx3KykkLy5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBjcmVhdGUobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBzb3VyY2UgKyBET1RfTElURVJBTCArIG1hdGNoWzJdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGV0IHNvdXJjZSA9IGNyZWF0ZShvdXRwdXQpO1xuXG4gIGlmIChzb3VyY2UgJiYgb3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlKSB7XG4gICAgc291cmNlICs9IGAke1NMQVNIX0xJVEVSQUx9P2A7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBzY2FuID0gcmVxdWlyZSgnLi9zY2FuJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy4gVGhlXG4gKiByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC4gVGhlIHJldHVybmVkIG1hdGNoZXJcbiAqIGZ1bmN0aW9uIGFsc28gdGFrZXMgYSBib29sZWFuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdGhhdCwgd2hlbiB0cnVlLFxuICogcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaChnbG9iWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQG5hbWUgcGljb21hdGNoXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGdsb2JzYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICogQHBhcmFtIHtPYmplY3Q9fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9uPX0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHBpY29tYXRjaCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7XG4gICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoaW5wdXQgPT4gcGljb21hdGNoKGlucHV0LCBvcHRpb25zLCByZXR1cm5TdGF0ZSkpO1xuICAgIGNvbnN0IGFycmF5TWF0Y2hlciA9IHN0ciA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgZm5zKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNNYXRjaChzdHIpO1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheU1hdGNoZXI7XG4gIH1cblxuICBjb25zdCBpc1N0YXRlID0gaXNPYmplY3QoZ2xvYikgJiYgZ2xvYi50b2tlbnMgJiYgZ2xvYi5pbnB1dDtcblxuICBpZiAoZ2xvYiA9PT0gJycgfHwgKHR5cGVvZiBnbG9iICE9PSAnc3RyaW5nJyAmJiAhaXNTdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBwYXR0ZXJuIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBjb25zdCByZWdleCA9IGlzU3RhdGVcbiAgICA/IHBpY29tYXRjaC5jb21waWxlUmUoZ2xvYiwgb3B0aW9ucylcbiAgICA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucywgZmFsc2UsIHRydWUpO1xuXG4gIGNvbnN0IHN0YXRlID0gcmVnZXguc3RhdGU7XG4gIGRlbGV0ZSByZWdleC5zdGF0ZTtcblxuICBsZXQgaXNJZ25vcmVkID0gKCkgPT4gZmFsc2U7XG4gIGlmIChvcHRzLmlnbm9yZSkge1xuICAgIGNvbnN0IGlnbm9yZU9wdHMgPSB7IC4uLm9wdGlvbnMsIGlnbm9yZTogbnVsbCwgb25NYXRjaDogbnVsbCwgb25SZXN1bHQ6IG51bGwgfTtcbiAgICBpc0lnbm9yZWQgPSBwaWNvbWF0Y2gob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSAoaW5wdXQsIHJldHVybk9iamVjdCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBpc01hdGNoLCBtYXRjaCwgb3V0cHV0IH0gPSBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSk7XG4gICAgY29uc3QgcmVzdWx0ID0geyBnbG9iLCBzdGF0ZSwgcmVnZXgsIHBvc2l4LCBpbnB1dCwgb3V0cHV0LCBtYXRjaCwgaXNNYXRjaCB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0lnbm9yZWQoaW5wdXQpKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25JZ25vcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0cy5vbklnbm9yZShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25NYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vbk1hdGNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiB0cnVlO1xuICB9O1xuXG4gIGlmIChyZXR1cm5TdGF0ZSkge1xuICAgIG1hdGNoZXIuc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVyO1xufTtcblxuLyoqXG4gKiBUZXN0IGBpbnB1dGAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4YC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBtYWluXG4gKiBgcGljb21hdGNoKClgIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXhbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLnRlc3QoJ2Zvby9iYXInLCAvXig/OihbXi9dKj8pXFwvKFteL10qPykpJC8pKTtcbiAqIC8vIHsgaXNNYXRjaDogdHJ1ZSwgbWF0Y2g6IFsgJ2Zvby8nLCAnZm9vJywgJ2JhcicgXSwgb3V0cHV0OiAnZm9vL2JhcicgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBgcmVnZXhgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWF0Y2hpbmcgaW5mby5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRlc3QgPSAoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0gPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGlucHV0IHRvIGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgcmV0dXJuIHsgaXNNYXRjaDogZmFsc2UsIG91dHB1dDogJycgfTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBmb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCAocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyA6IG51bGwpO1xuICBsZXQgbWF0Y2ggPSBpbnB1dCA9PT0gZ2xvYjtcbiAgbGV0IG91dHB1dCA9IChtYXRjaCAmJiBmb3JtYXQpID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG4gICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7XG4gIH1cblxuICBpZiAobWF0Y2ggPT09IGZhbHNlIHx8IG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChvcHRzLm1hdGNoQmFzZSA9PT0gdHJ1ZSB8fCBvcHRzLmJhc2VuYW1lID09PSB0cnVlKSB7XG4gICAgICBtYXRjaCA9IHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCBwb3NpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhvdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzTWF0Y2g6IEJvb2xlYW4obWF0Y2gpLCBtYXRjaCwgb3V0cHV0IH07XG59O1xuXG4vKipcbiAqIE1hdGNoIHRoZSBiYXNlbmFtZSBvZiBhIGZpbGVwYXRoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIGdsb2JbLCBvcHRpb25zXSk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gubWF0Y2hCYXNlKCdmb28vYmFyLmpzJywgJyouanMnKTsgLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiBvciByZWdleCBjcmVhdGVkIGJ5IFsubWFrZVJlXSgjbWFrZVJlKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYXRjaEJhc2UgPSAoaW5wdXQsIGdsb2IsIG9wdGlvbnMsIHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMpO1xuICByZXR1cm4gcmVnZXgudGVzdChwYXRoLmJhc2VuYW1lKGlucHV0KSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBzdHIgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHBhdHRlcm5zIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgYSByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gucGFyc2UgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkgcmV0dXJuIHBhdHRlcm4ubWFwKHAgPT4gcGljb21hdGNoLnBhcnNlKHAsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHBhcnNlKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KTtcbn07XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5zY2FuKGlucHV0Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5zY2FuKCchLi9mb28vKi5qcycpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHsgcHJlZml4OiAnIS4vJyxcbiAqICAgaW5wdXQ6ICchLi9mb28vKi5qcycsXG4gKiAgIHN0YXJ0OiAzLFxuICogICBiYXNlOiAnZm9vJyxcbiAqICAgZ2xvYjogJyouanMnLFxuICogICBpc0JyYWNlOiBmYWxzZSxcbiAqICAgaXNCcmFja2V0OiBmYWxzZSxcbiAqICAgaXNHbG9iOiB0cnVlLFxuICogICBpc0V4dGdsb2I6IGZhbHNlLFxuICogICBpc0dsb2JzdGFyOiBmYWxzZSxcbiAqICAgbmVnYXRlZDogdHJ1ZSB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEdsb2IgcGF0dGVybiB0byBzY2FuLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5zY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiBzY2FuKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHJldHVybmVkIGJ5IHRoZVxuICogW3BhcnNlKCldKCNwYXJzZSkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEludGVuZGVkIGZvciBpbXBsZW1lbnRvcnMsIHRoaXMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgcGFyc2VyLlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEFkZHMgdGhlIHN0YXRlIHRvIGEgYHN0YXRlYCBwcm9wZXJ0eSBvbiB0aGUgcmV0dXJuZWQgcmVnZXguIFVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIGFuZCBkZWJ1Z2dpbmcuXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5jb21waWxlUmUgPSAoc3RhdGUsIG9wdGlvbnMsIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChyZXR1cm5PdXRwdXQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RhdGUub3V0cHV0O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgc291cmNlID0gYCR7cHJlcGVuZH0oPzoke3N0YXRlLm91dHB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlICYmIHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBzb3VyY2UgPSBgXig/ISR7c291cmNlfSkuKiRgO1xuICB9XG5cbiAgY29uc3QgcmVnZXggPSBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2UsIG9wdGlvbnMpO1xuICBpZiAocmV0dXJuU3RhdGUgPT09IHRydWUpIHtcbiAgICByZWdleC5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhIHBhcnNlZCBnbG9iIHBhdHRlcm4uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIC8vIHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGVbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZSkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RhdGVgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgYC5wYXJzZWAgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgY29tcGlsZWQgb3V0cHV0LCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGlzIG5vdCBleHBvc2VkIG9uIHRoZSBvcHRpb25zIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gbXV0YXRpbmcgdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgc3RhdGUgZnJvbSB0aGUgcGFyc2VkIGdsb2Igd2l0aCB0aGUgcmV0dXJuZWQgcmVndWxhciBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWFrZVJlID0gKGlucHV0LCBvcHRpb25zID0ge30sIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9O1xuXG4gIGlmIChvcHRpb25zLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgKGlucHV0WzBdID09PSAnLicgfHwgaW5wdXRbMF0gPT09ICcqJykpIHtcbiAgICBwYXJzZWQub3V0cHV0ID0gcGFyc2UuZmFzdHBhdGhzKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICghcGFyc2VkLm91dHB1dCkge1xuICAgIHBhcnNlZCA9IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBwaWNvbWF0Y2guY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCB7IG91dHB1dCB9ID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudG9SZWdleChvdXRwdXQpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHNvdXJjZWAgUmVndWxhciBleHByZXNzaW9uIHNvdXJjZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50b1JlZ2V4ID0gKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0cy5mbGFncyB8fCAob3B0cy5ub2Nhc2UgPyAnaScgOiAnJykpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnID09PSB0cnVlKSB0aHJvdyBlcnI7XG4gICAgcmV0dXJuIC8kXi87XG4gIH1cbn07XG5cbi8qKlxuICogUGljb21hdGNoIGNvbnN0YW50cy5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5waWNvbWF0Y2guY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBcInBpY29tYXRjaFwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwaWNvbWF0Y2g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BpY29tYXRjaCcpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJ3BpY29tYXRjaC9saWIvdXRpbHMnKTtcbmNvbnN0IGlzRW1wdHlTdHJpbmcgPSB2YWwgPT4gdmFsID09PSAnJyB8fCB2YWwgPT09ICcuLyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2ggb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbShbJ2EuanMnLCAnYS50eHQnXSwgWycqLmpzJ10pKTtcbiAqIC8vPT4gWyAnYS5qcycgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgbGlzdGAgTGlzdCBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKVxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlc1xuICogQHN1bW1hcnkgZmFsc2VcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgbWljcm9tYXRjaCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucyk7XG4gIGxpc3QgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgbGV0IG9taXQgPSBuZXcgU2V0KCk7XG4gIGxldCBrZWVwID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBuZXcgU2V0KCk7XG4gIGxldCBuZWdhdGl2ZXMgPSAwO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpdGVtcy5hZGQoc3RhdGUub3V0cHV0KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm9uUmVzdWx0KSB7XG4gICAgICBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuc1tpXSksIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSwgdHJ1ZSk7XG4gICAgbGV0IG5lZ2F0ZWQgPSBpc01hdGNoLnN0YXRlLm5lZ2F0ZWQgfHwgaXNNYXRjaC5zdGF0ZS5uZWdhdGVkRXh0Z2xvYjtcbiAgICBpZiAobmVnYXRlZCkgbmVnYXRpdmVzKys7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGxldCBtYXRjaGVkID0gaXNNYXRjaChpdGVtLCB0cnVlKTtcblxuICAgICAgbGV0IG1hdGNoID0gbmVnYXRlZCA/ICFtYXRjaGVkLmlzTWF0Y2ggOiBtYXRjaGVkLmlzTWF0Y2g7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgaWYgKG5lZ2F0ZWQpIHtcbiAgICAgICAgb21pdC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb21pdC5kZWxldGUobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgICBrZWVwLmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlcyA9PT0gcGF0dGVybnMubGVuZ3RoID8gWy4uLml0ZW1zXSA6IFsuLi5rZWVwXTtcbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gIW9taXQuaGFzKGl0ZW0pKTtcblxuICBpZiAob3B0aW9ucyAmJiBtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvcHRpb25zLmZhaWxnbG9iID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoZXMgZm91bmQgZm9yIFwiJHtwYXR0ZXJucy5qb2luKCcsICcpfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9udWxsID09PSB0cnVlIHx8IG9wdGlvbnMubnVsbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnVuZXNjYXBlID8gcGF0dGVybnMubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcnKSkgOiBwYXR0ZXJucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoID0gbWljcm9tYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYCBhbmQgYG9wdGlvbnNgLlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBvbmx5IGFyZ3VtZW50IGFuZCByZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaGVyKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IG1tLm1hdGNoZXIoJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBHbG9iIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJuLCBvcHRpb25zKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBbb3B0aW9uc11gIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2guYW55ID0gbWljcm9tYXRjaC5pc01hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBfKipkbyBub3QgbWF0Y2ggYW55KipfIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm5vdChsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ub3QoWydhLmEnLCAnYi5iJywgJ2MuYyddLCAnKi5hJykpO1xuICogLy89PiBbJ2IuYicsICdjLmMnXVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgbGlzdGAgQXJyYXkgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCAqKmRvIG5vdCBtYXRjaCoqIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ub3QgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucykubWFwKFN0cmluZyk7XG4gIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpZiAob3B0aW9ucy5vblJlc3VsdCkgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgaXRlbXMucHVzaChzdGF0ZS5vdXRwdXQpO1xuICB9O1xuXG4gIGxldCBtYXRjaGVzID0gbmV3IFNldChtaWNyb21hdGNoKGxpc3QsIHBhdHRlcm5zLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0pKTtcblxuICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKCFtYXRjaGVzLmhhcyhpdGVtKSkge1xuICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5yZXN1bHRdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBzdHJpbmdgIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXR0ZXJuLiBTaW1pbGFyXG4gKiB0byBbLmlzTWF0Y2hdKCNpc01hdGNoKSBidXQgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGFueSBwYXJ0IG9mIHRoZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIHZhciBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNvbnRhaW5zKHN0cmluZywgcGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmInKSk7XG4gKiAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqZCcpKTtcbiAqIC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBwYXR0ZXJucyBtYXRjaGVzIGFueSBwYXJ0IG9mIGBzdHJgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNvbnRhaW5zID0gKHN0ciwgcGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUocCA9PiBtaWNyb21hdGNoLmNvbnRhaW5zKHN0ciwgcCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0VtcHR5U3RyaW5nKHN0cikgfHwgaXNFbXB0eVN0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHIuaW5jbHVkZXMocGF0dGVybikgfHwgKHN0ci5zdGFydHNXaXRoKCcuLycpICYmIHN0ci5zbGljZSgyKS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaWNyb21hdGNoLmlzTWF0Y2goc3RyLCBwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGNvbnRhaW5zOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgdGhlIGtleXMgb2YgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgZ2xvYmAgcGF0dGVyblxuICogYW5kIGBvcHRpb25zYC4gRG9lcyBub3QgYXR0ZW1wdCB0byBtYXRjaCBuZXN0ZWQga2V5cy4gSWYgeW91IG5lZWQgdGhpcyBmZWF0dXJlLFxuICogdXNlIFtnbG9iLW9iamVjdF1bXSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoS2V5cyhvYmplY3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IG9iaiA9IHsgYWE6ICdhJywgYWI6ICdiJywgYWM6ICdjJyB9O1xuICogY29uc29sZS5sb2cobW0ubWF0Y2hLZXlzKG9iaiwgJypiJykpO1xuICogLy89PiB7IGFiOiAnYicgfVxuICogYGBgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9iamVjdGAgVGhlIG9iamVjdCB3aXRoIGtleXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbmx5IGtleXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hLZXlzID0gKG9iaiwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIGxldCBrZXlzID0gbWljcm9tYXRjaChPYmplY3Qua2V5cyhvYmopLCBwYXR0ZXJucywgb3B0aW9ucyk7XG4gIGxldCByZXMgPSB7fTtcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHJlc1trZXldID0gb2JqW2tleV07XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzb21lIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2ggYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uc29tZShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuIFJldHVybnMgYXMgc29vbiBhcyB0aGUgZmlyc3QgbWF0Y2ggaXMgZm91bmQuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBgcGF0dGVybnNgIG1hdGNoZXMgYW55IG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNvbWUgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKGl0ZW1zLnNvbWUoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGV2ZXJ5IHN0cmluZyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoZXNcbiAqIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmV2ZXJ5KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbGwgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guZXZlcnkgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKCFpdGVtcy5ldmVyeShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbGwqKiBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYCBtYXRjaFxuICogdGhlIHNwZWNpZmllZCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uYWxsKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZionLCAnKm8qJywgJypvLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYWxsID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChwYXR0ZXJucykuZXZlcnkocCA9PiBwaWNvbWF0Y2gocCwgb3B0aW9ucykoc3RyKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlcyBjYXB0dXJlZCBieSBgcGF0dGVybmAgaW4gYHN0cmluZywgb3IgYG51bGxgIGlmIHRoZSBwYXR0ZXJuIGRpZCBub3QgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY2FwdHVyZShwYXR0ZXJuLCBzdHJpbmdbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ3Rlc3QvZm9vLmpzJykpO1xuICogLy89PiBbJ2ZvbyddXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAnZm9vL2Jhci5jc3MnKSk7XG4gKiAvLz0+IG51bGxcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byBtYXRjaFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgY2FwdHVyZXMgaWYgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGdsb2IgcGF0dGVybiwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jYXB0dXJlID0gKGdsb2IsIGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGxldCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgbGV0IHJlZ2V4ID0gcGljb21hdGNoLm1ha2VSZShTdHJpbmcoZ2xvYiksIHsgLi4ub3B0aW9ucywgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyhwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzKGlucHV0KSA6IGlucHV0KTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSkubWFwKHYgPT4gdiA9PT0gdm9pZCAwID8gJycgOiB2KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWFrZVJlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubWFrZVJlKCcqLmpzJykpO1xuICogLy89PiAvXig/OihcXC5bXFxcXFxcL10pPyg/IVxcLikoPz0uKVteXFwvXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBBIGdsb2IgcGF0dGVybiB0byBjb252ZXJ0IHRvIHJlZ2V4LlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1ha2VSZSA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2gubWFrZVJlKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy4gVXNlZFxuICogYnkgdGhlIFtzcGxpdF0oI3NwbGl0KSBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5zY2FuKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNjYW4gPSAoLi4uYXJncykgPT4gcGljb21hdGNoLnNjYW4oLi4uYXJncyk7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gucGFyc2UgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucyB8fCBbXSkpIHtcbiAgICBmb3IgKGxldCBzdHIgb2YgYnJhY2VzKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucykpIHtcbiAgICAgIHJlcy5wdXNoKHBpY29tYXRjaC5wYXJzZShzdHIsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnJhY2UgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGJyYWNlcyB9ID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInKSk7XG4gKiAvLz0+IFsgJ2Zvby8oYXxifGMpL2JhcicgXVxuICpcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJywgeyBleHBhbmQ6IHRydWUgfSkpO1xuICogLy89PiBbICdmb28vYS9iYXInLCAnZm9vL2IvYmFyJywgJ2Zvby9jL2JhcicgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFN0cmluZyB3aXRoIGJyYWNlIHBhdHRlcm4gdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgQW55IFtvcHRpb25zXSgjb3B0aW9ucykgdG8gY2hhbmdlIGhvdyBleHBhbnNpb24gaXMgcGVyZm9ybWVkLiBTZWUgdGhlIFticmFjZXNdW10gbGlicmFyeSBmb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VzID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgaWYgKChvcHRpb25zICYmIG9wdGlvbnMubm9icmFjZSA9PT0gdHJ1ZSkgfHwgIS9cXHsuKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBbcGF0dGVybl07XG4gIH1cbiAgcmV0dXJuIGJyYWNlcyhwYXR0ZXJuLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNlc1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwgeyAuLi5vcHRpb25zLCBleHBhbmQ6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBtaWNyb21hdGNoXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb21hdGNoO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzID0gZXhwb3J0cy5tYXRjaEFueSA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9SZSA9IGV4cG9ydHMubWFrZVJlID0gZXhwb3J0cy5nZXRQYXR0ZXJuUGFydHMgPSBleHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwb3J0cy5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IGV4cG9ydHMuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBleHBvcnRzLmVuZHNXaXRoU2xhc2hHbG9iU3RhciA9IGV4cG9ydHMuaGFzR2xvYlN0YXIgPSBleHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBleHBvcnRzLmlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5pc0R5bmFtaWNQYXR0ZXJuID0gZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSB2b2lkIDA7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBnbG9iUGFyZW50ID0gcmVxdWlyZShcImdsb2ItcGFyZW50XCIpO1xuY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoXCJtaWNyb21hdGNoXCIpO1xuY29uc3QgR0xPQlNUQVIgPSAnKionO1xuY29uc3QgRVNDQVBFX1NZTUJPTCA9ICdcXFxcJztcbmNvbnN0IENPTU1PTl9HTE9CX1NZTUJPTFNfUkUgPSAvWyo/XXxeIS87XG5jb25zdCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRSA9IC9cXFtbXltdKl0vO1xuY29uc3QgUkVHRVhfR1JPVVBfU1lNQk9MU19SRSA9IC8oPzpefFteISorP0BdKVxcKFteKF0qXFx8W158XSpcXCkvO1xuY29uc3QgR0xPQl9FWFRFTlNJT05fU1lNQk9MU19SRSA9IC9bISorP0BdXFwoW14oXSpcXCkvO1xuY29uc3QgQlJBQ0VfRVhQQU5TSU9OX1NFUEFSQVRPUlNfUkUgPSAvLHxcXC5cXC4vO1xuLyoqXG4gKiBNYXRjaGVzIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgc2xhc2hlcywgZXhjbHVkaW5nIHRoZSBmaXJzdCB0d28gc2xhc2hlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuXG4gKiBUaGUgbGF0dGVyIGlzIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgdGhlIGRldmljZSBwYXRoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFVOQyBwYXRoLlxuICovXG5jb25zdCBET1VCTEVfU0xBU0hfUkUgPSAvKD8hXilcXC97Mix9L2c7XG5mdW5jdGlvbiBpc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICFpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSBpc1N0YXRpY1BhdHRlcm47XG5mdW5jdGlvbiBpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbCBjYXNlIHdpdGggYW4gZW1wdHkgc3RyaW5nIGlzIG5lY2Vzc2FyeSBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cbiAgICAgKiBBbiBlbXB0eSBzdHJpbmcgY2Fubm90IGJlIGEgZHluYW1pYyBwYXR0ZXJuLlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiBgL2xpYi8qYCB3aWxsIGJlIHNwcmVhZCBpbnRvIHBhcnRzOiAnJywgJ2xpYicsICcqJy5cbiAgICAgKi9cbiAgICBpZiAocGF0dGVybiA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBgY2FzZVNlbnNpdGl2ZU1hdGNoYCBvcHRpb24gaXMgZGlzYWJsZWQsIGFsbCBwYXR0ZXJucyBtdXN0IGJlIG1hcmtlZCBhcyBkeW5hbWljLCBiZWNhdXNlIHdlIGNhbm5vdCBjaGVja1xuICAgICAqIGZpbGVwYXRoIGRpcmVjdGx5ICh3aXRob3V0IHJlYWQgZGlyZWN0b3J5KS5cbiAgICAgKi9cbiAgICBpZiAob3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPT09IGZhbHNlIHx8IHBhdHRlcm4uaW5jbHVkZXMoRVNDQVBFX1NZTUJPTCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT01NT05fR0xPQl9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikgfHwgUkVHRVhfQ0hBUkFDVEVSX0NMQVNTX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSB8fCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmV4dGdsb2IgIT09IGZhbHNlICYmIEdMT0JfRVhURU5TSU9OX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYnJhY2VFeHBhbnNpb24gIT09IGZhbHNlICYmIGhhc0JyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmlzRHluYW1pY1BhdHRlcm4gPSBpc0R5bmFtaWNQYXR0ZXJuO1xuZnVuY3Rpb24gaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikge1xuICAgIGNvbnN0IG9wZW5pbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKG9wZW5pbmdCcmFjZUluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsb3NpbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd9Jywgb3BlbmluZ0JyYWNlSW5kZXggKyAxKTtcbiAgICBpZiAoY2xvc2luZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYnJhY2VDb250ZW50ID0gcGF0dGVybi5zbGljZShvcGVuaW5nQnJhY2VJbmRleCwgY2xvc2luZ0JyYWNlSW5kZXgpO1xuICAgIHJldHVybiBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRS50ZXN0KGJyYWNlQ29udGVudCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSA/IHBhdHRlcm4uc2xpY2UoMSkgOiBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiAnIScgKyBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIHBhdHRlcm5bMV0gIT09ICcoJztcbn1cbmV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBpc05lZ2F0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGlzUG9zaXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gIWlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pO1xufVxuZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGlzUG9zaXRpdmVQYXR0ZXJuO1xuZnVuY3Rpb24gZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNOZWdhdGl2ZVBhdHRlcm4pO1xufVxuZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJucztcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUG9zaXRpdmVQYXR0ZXJuKTtcbn1cbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XG4vKipcbiAqIFJldHVybnMgcGF0dGVybnMgdGhhdCBjYW4gYmUgYXBwbGllZCBpbnNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4vKicsICcqJywgJ2EvKiddXG4gKiBnZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkoWycuLyonLCAnKicsICdhLyonLCAnLi4vKicsICcuLy4uLyonXSlcbiAqL1xuZnVuY3Rpb24gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gIWlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSk7XG59XG5leHBvcnRzLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeTtcbi8qKlxuICogUmV0dXJucyBwYXR0ZXJucyB0byBiZSBleHBhbmRlZCByZWxhdGl2ZSB0byAob3V0c2lkZSkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4uLyonLCAnLi8uLi8qJ11cbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxuICovXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkpO1xufVxuZXhwb3J0cy5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeTtcbmZ1bmN0aW9uIGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnLi4nKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy4vLi4nKTtcbn1cbmV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5O1xuZnVuY3Rpb24gZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGdsb2JQYXJlbnQocGF0dGVybiwgeyBmbGlwQmFja3NsYXNoZXM6IGZhbHNlIH0pO1xufVxuZXhwb3J0cy5nZXRCYXNlRGlyZWN0b3J5ID0gZ2V0QmFzZURpcmVjdG9yeTtcbmZ1bmN0aW9uIGhhc0dsb2JTdGFyKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmNsdWRlcyhHTE9CU1RBUik7XG59XG5leHBvcnRzLmhhc0dsb2JTdGFyID0gaGFzR2xvYlN0YXI7XG5mdW5jdGlvbiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLmVuZHNXaXRoKCcvJyArIEdMT0JTVEFSKTtcbn1cbmV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZW5kc1dpdGhTbGFzaEdsb2JTdGFyO1xuZnVuY3Rpb24gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4ocGF0dGVybikge1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShwYXR0ZXJuKTtcbiAgICByZXR1cm4gZW5kc1dpdGhTbGFzaEdsb2JTdGFyKHBhdHRlcm4pIHx8IGlzU3RhdGljUGF0dGVybihiYXNlbmFtZSk7XG59XG5leHBvcnRzLmlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuID0gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm47XG5mdW5jdGlvbiBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29uY2F0KGV4cGFuZEJyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKTtcbiAgICB9LCBbXSk7XG59XG5leHBvcnRzLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb247XG5mdW5jdGlvbiBleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBtaWNyb21hdGNoLmJyYWNlcyhwYXR0ZXJuLCB7IGV4cGFuZDogdHJ1ZSwgbm9kdXBlczogdHJ1ZSwga2VlcEVzY2FwaW5nOiB0cnVlIH0pO1xuICAgIC8qKlxuICAgICAqIFNvcnQgdGhlIHBhdHRlcm5zIGJ5IGxlbmd0aCBzbyB0aGF0IHRoZSBzYW1lIGRlcHRoIHBhdHRlcm5zIGFyZSBwcm9jZXNzZWQgc2lkZSBieSBzaWRlLlxuICAgICAqIGBhL3tiLH0ve2MsfS8qYCBcdTIwMTMgYFsnYS8vLyonLCAnYS9iLy8qJywgJ2EvL2MvKicsICdhL2IvYy8qJ11gXG4gICAgICovXG4gICAgcGF0dGVybnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XG4gICAgLyoqXG4gICAgICogTWljcm9tYXRjaCBjYW4gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgY2FzZSBvZiBwYXR0ZXJucyBsaWtlIGB7YSx9YC5cbiAgICAgKi9cbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuICE9PSAnJyk7XG59XG5leHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kQnJhY2VFeHBhbnNpb247XG5mdW5jdGlvbiBnZXRQYXR0ZXJuUGFydHMocGF0dGVybiwgb3B0aW9ucykge1xuICAgIGxldCB7IHBhcnRzIH0gPSBtaWNyb21hdGNoLnNjYW4ocGF0dGVybiwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBwYXJ0czogdHJ1ZSB9KSk7XG4gICAgLyoqXG4gICAgICogVGhlIHNjYW4gbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgYXJyYXkgaW4gc29tZSBjYXNlcy5cbiAgICAgKiBTZWUgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBhcnRzID0gW3BhdHRlcm5dO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFuIGVtcHR5IHBhcnQgZm9yIHRoZSBwYXR0ZXJuIHdpdGggYSBmb3J3YXJkIHNsYXNoLlxuICAgICAqIFRoaXMgaXMgYW5vdGhlciBwYXJ0IG9mIG1pY3JvbWF0Y2gvcGljb21hdGNoIzU4LlxuICAgICAqL1xuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXS5zbGljZSgxKTtcbiAgICAgICAgcGFydHMudW5zaGlmdCgnJyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cztcbn1cbmV4cG9ydHMuZ2V0UGF0dGVyblBhcnRzID0gZ2V0UGF0dGVyblBhcnRzO1xuZnVuY3Rpb24gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWljcm9tYXRjaC5tYWtlUmUocGF0dGVybiwgb3B0aW9ucyk7XG59XG5leHBvcnRzLm1ha2VSZSA9IG1ha2VSZTtcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuc1RvUmUocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBtYWtlUmUocGF0dGVybiwgb3B0aW9ucykpO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1JlID0gY29udmVydFBhdHRlcm5zVG9SZTtcbmZ1bmN0aW9uIG1hdGNoQW55KGVudHJ5LCBwYXR0ZXJuc1JlKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zUmUuc29tZSgocGF0dGVyblJlKSA9PiBwYXR0ZXJuUmUudGVzdChlbnRyeSkpO1xufVxuZXhwb3J0cy5tYXRjaEFueSA9IG1hdGNoQW55O1xuLyoqXG4gKiBUaGlzIHBhY2thZ2Ugb25seSB3b3JrcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBhcyBhIHBhdGggc2VwYXJhdG9yLlxuICogQmVjYXVzZSBvZiB0aGlzLCB3ZSBjYW5ub3QgdXNlIHRoZSBzdGFuZGFyZCBgcGF0aC5ub3JtYWxpemVgIG1ldGhvZCwgYmVjYXVzZSBvbiBXaW5kb3dzIHBsYXRmb3JtIGl0IHdpbGwgdXNlIG9mIGJhY2tzbGFzaGVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVTbGFzaGVzKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKERPVUJMRV9TTEFTSF9SRSwgJy8nKTtcbn1cbmV4cG9ydHMucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyA9IHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1lcmdlID0gdm9pZCAwO1xuY29uc3QgbWVyZ2UyID0gcmVxdWlyZShcIm1lcmdlMlwiKTtcbmZ1bmN0aW9uIG1lcmdlKHN0cmVhbXMpIHtcbiAgICBjb25zdCBtZXJnZWRTdHJlYW0gPSBtZXJnZTIoc3RyZWFtcyk7XG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHtcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuICAgIH0pO1xuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpKTtcbiAgICByZXR1cm4gbWVyZ2VkU3RyZWFtO1xufVxuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuZnVuY3Rpb24gcHJvcGFnYXRlQ2xvc2VFdmVudFRvU291cmNlcyhzdHJlYW1zKSB7XG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHN0cmVhbS5lbWl0KCdjbG9zZScpKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbXB0eSA9IGV4cG9ydHMuaXNTdHJpbmcgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuZnVuY3Rpb24gaXNFbXB0eShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PT0gJyc7XG59XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLnN0cmVhbSA9IGV4cG9ydHMucGF0dGVybiA9IGV4cG9ydHMucGF0aCA9IGV4cG9ydHMuZnMgPSBleHBvcnRzLmVycm5vID0gZXhwb3J0cy5hcnJheSA9IHZvaWQgMDtcbmNvbnN0IGFycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlcIik7XG5leHBvcnRzLmFycmF5ID0gYXJyYXk7XG5jb25zdCBlcnJubyA9IHJlcXVpcmUoXCIuL2Vycm5vXCIpO1xuZXhwb3J0cy5lcnJubyA9IGVycm5vO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9mc1wiKTtcbmV4cG9ydHMuZnMgPSBmcztcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwiLi9wYXRoXCIpO1xuZXhwb3J0cy5wYXRoID0gcGF0aDtcbmNvbnN0IHBhdHRlcm4gPSByZXF1aXJlKFwiLi9wYXR0ZXJuXCIpO1xuZXhwb3J0cy5wYXR0ZXJuID0gcGF0dGVybjtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoXCIuL3N0cmVhbVwiKTtcbmV4cG9ydHMuc3RyZWFtID0gc3RyZWFtO1xuY29uc3Qgc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xuZXhwb3J0cy5zdHJpbmcgPSBzdHJpbmc7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2sgPSBleHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyA9IGV4cG9ydHMuZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUgPSBleHBvcnRzLmdldFBvc2l0aXZlUGF0dGVybnMgPSBleHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvVGFza3MgPSBleHBvcnRzLmdlbmVyYXRlID0gdm9pZCAwO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBnZW5lcmF0ZShpbnB1dCwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHByb2Nlc3NQYXR0ZXJucyhpbnB1dCwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IGlnbm9yZSA9IHByb2Nlc3NQYXR0ZXJucyhzZXR0aW5ncy5pZ25vcmUsIHNldHRpbmdzKTtcbiAgICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucyk7XG4gICAgY29uc3QgbmVnYXRpdmVQYXR0ZXJucyA9IGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpO1xuICAgIGNvbnN0IHN0YXRpY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4uaXNTdGF0aWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3QgZHluYW1pY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuLCBzZXR0aW5ncykpO1xuICAgIGNvbnN0IHN0YXRpY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhzdGF0aWNQYXR0ZXJucywgbmVnYXRpdmVQYXR0ZXJucywgLyogZHluYW1pYyAqLyBmYWxzZSk7XG4gICAgY29uc3QgZHluYW1pY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhkeW5hbWljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gdHJ1ZSk7XG4gICAgcmV0dXJuIHN0YXRpY1Rhc2tzLmNvbmNhdChkeW5hbWljVGFza3MpO1xufVxuZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xuZnVuY3Rpb24gcHJvY2Vzc1BhdHRlcm5zKGlucHV0LCBzZXR0aW5ncykge1xuICAgIGxldCBwYXR0ZXJucyA9IGlucHV0O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwYXR0ZXJuIGxpa2UgYHssKiwqKixhLyp9YCBjYW4gbGVhZCB0byBwcm9ibGVtcyBjaGVja2luZyB0aGUgZGVwdGggd2hlbiBtYXRjaGluZyBlbnRyeVxuICAgICAqIGFuZCBzb21lIHByb2JsZW1zIHdpdGggdGhlIG1pY3JvbWF0Y2ggcGFja2FnZSAoc2VlIGZhc3QtZ2xvYiBpc3N1ZXM6ICMzNjUsICMzOTQpLlxuICAgICAqXG4gICAgICogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB3ZSBleHBhbmQgYWxsIHBhdHRlcm5zIGNvbnRhaW5pbmcgYnJhY2UgZXhwYW5zaW9uLiBUaGlzIGNhbiBsZWFkIHRvIGEgc2xpZ2h0IHNsb3dkb3duXG4gICAgICogaW4gbWF0Y2hpbmcgaW4gdGhlIGNhc2Ugb2YgYSBsYXJnZSBzZXQgb2YgcGF0dGVybnMgYWZ0ZXIgZXhwYW5zaW9uLlxuICAgICAqL1xuICAgIGlmIChzZXR0aW5ncy5icmFjZUV4cGFuc2lvbikge1xuICAgICAgICBwYXR0ZXJucyA9IHV0aWxzLnBhdHRlcm4uZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24ocGF0dGVybnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgYGJhc2VOYW1lTWF0Y2hgIG9wdGlvbiBpcyBlbmFibGVkLCB3ZSBtdXN0IGFkZCBnbG9ic3RhciB0byBwYXR0ZXJucywgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkXG4gICAgICogYXQgYW55IG5lc3RpbmcgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBXZSBkbyB0aGlzIGhlcmUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29tcGxpY2F0ZSB0aGUgZmlsdGVyaW5nIGxvZ2ljLiBGb3IgZXhhbXBsZSwgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgKiB0aGUgcGF0dGVybiBpbiB0aGUgZmlsdGVyIGJlZm9yZSBjcmVhdGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIHBhdHRlcm5zXG4gICAgICogaW4gdGhlIGFwcGxpY2F0aW9uLiBPbmx5IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBpZiAoc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCkge1xuICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5pbmNsdWRlcygnLycpID8gcGF0dGVybiA6IGAqKi8ke3BhdHRlcm59YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGFsc28gcmVtb3ZlcyBkdXBsaWNhdGUgc2xhc2hlcyB0aGF0IG1heSBoYXZlIGJlZW4gaW4gdGhlIHBhdHRlcm4gb3IgZm9ybWVkIGFzIGEgcmVzdWx0IG9mIGV4cGFuc2lvbi5cbiAgICAgKi9cbiAgICByZXR1cm4gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiB1dGlscy5wYXR0ZXJuLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMocGF0dGVybikpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRhc2tzIGdyb3VwZWQgYnkgYmFzaWMgcGF0dGVybiBkaXJlY3Rvcmllcy5cbiAqXG4gKiBQYXR0ZXJucyB0aGF0IGNhbiBiZSBmb3VuZCBpbnNpZGUgKGAuL2ApIGFuZCBvdXRzaWRlIChgLi4vYCkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGRpcmVjdG9yeSB0cmF2ZXJzYWwgc3RhcnRzIGF0IHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgZ29lcyBkZWVwZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuc1RvVGFza3MocG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XG4gICAgY29uc3QgdGFza3MgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcbiAgICBjb25zdCBwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShwb3NpdGl2ZSk7XG4gICAgY29uc3Qgb3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSk7XG4gICAgY29uc3QgaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkpO1xuICAgIHRhc2tzLnB1c2goLi4uY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKG91dHNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAsIG5lZ2F0aXZlLCBkeW5hbWljKSk7XG4gICAgLypcbiAgICAgKiBGb3IgdGhlIHNha2Ugb2YgcmVkdWNpbmcgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoZSBmaWxlIHN5c3RlbSwgd2UgbWVyZ2UgYWxsIHRhc2tzIHdpdGhpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlcbiAgICAgKiBpbnRvIGEgZ2xvYmFsIHRhc2ssIGlmIGF0IGxlYXN0IG9uZSBwYXR0ZXJuIHJlZmVycyB0byB0aGUgcm9vdCAoYC5gKS4gSW4gdGhpcyBjYXNlLCB0aGUgZ2xvYmFsIHRhc2sgY292ZXJzIHRoZSByZXN0LlxuICAgICAqL1xuICAgIGlmICgnLicgaW4gaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwKSB7XG4gICAgICAgIHRhc2tzLnB1c2goY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaygnLicsIHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhc2tzLnB1c2goLi4uY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKGluc2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tzO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcztcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcbiAgICByZXR1cm4gdXRpbHMucGF0dGVybi5nZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKTtcbn1cbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XG5mdW5jdGlvbiBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZShwYXR0ZXJucywgaWdub3JlKSB7XG4gICAgY29uc3QgbmVnYXRpdmUgPSB1dGlscy5wYXR0ZXJuLmdldE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMpLmNvbmNhdChpZ25vcmUpO1xuICAgIGNvbnN0IHBvc2l0aXZlID0gbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuKTtcbiAgICByZXR1cm4gcG9zaXRpdmU7XG59XG5leHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlID0gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmU7XG5mdW5jdGlvbiBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB7fTtcbiAgICByZXR1cm4gcGF0dGVybnMucmVkdWNlKChjb2xsZWN0aW9uLCBwYXR0ZXJuKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB1dGlscy5wYXR0ZXJuLmdldEJhc2VEaXJlY3RvcnkocGF0dGVybik7XG4gICAgICAgIGlmIChiYXNlIGluIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0ucHVzaChwYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0gPSBbcGF0dGVybl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfSwgZ3JvdXApO1xufVxuZXhwb3J0cy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeTtcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocG9zaXRpdmUpLm1hcCgoYmFzZSkgPT4ge1xuICAgICAgICByZXR1cm4gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayhiYXNlLCBwb3NpdGl2ZVtiYXNlXSwgbmVnYXRpdmUsIGR5bmFtaWMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MgPSBjb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3M7XG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGR5bmFtaWMsXG4gICAgICAgIHBvc2l0aXZlLFxuICAgICAgICBuZWdhdGl2ZSxcbiAgICAgICAgYmFzZSxcbiAgICAgICAgcGF0dGVybnM6IFtdLmNvbmNhdChwb3NpdGl2ZSwgbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuKSlcbiAgICB9O1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQocGF0aCwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMubHN0YXQocGF0aCwgKGxzdGF0RXJyb3IsIGxzdGF0KSA9PiB7XG4gICAgICAgIGlmIChsc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxzdGF0LmlzU3ltYm9saWNMaW5rKCkgfHwgIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQocGF0aCwgKHN0YXRFcnJvciwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLm1hcmtTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICBzdGF0LmlzU3ltYm9saWNMaW5rID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHN0YXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJlc3VsdCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5mdW5jdGlvbiByZWFkKHBhdGgsIHNldHRpbmdzKSB7XG4gICAgY29uc3QgbHN0YXQgPSBzZXR0aW5ncy5mcy5sc3RhdFN5bmMocGF0aCk7XG4gICAgaWYgKCFsc3RhdC5pc1N5bWJvbGljTGluaygpIHx8ICFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgcmV0dXJuIGxzdGF0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0ID0gc2V0dGluZ3MuZnMuc3RhdFN5bmMocGF0aCk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5tYXJrU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICBzdGF0LmlzU3ltYm9saWNMaW5rID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gbHN0YXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmNcbn07XG5mdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcbiAgICBpZiAoZnNNZXRob2RzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSKSwgZnNNZXRob2RzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vYWRhcHRlcnMvZnNcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmssIHRydWUpO1xuICAgICAgICB0aGlzLmZzID0gZnMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIodGhpcy5fb3B0aW9ucy5mcyk7XG4gICAgICAgIHRoaXMubWFya1N5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMubWFya1N5bWJvbGljTGluaywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGF0U3luYyA9IGV4cG9ydHMuc3RhdCA9IGV4cG9ydHMuU2V0dGluZ3MgPSB2b2lkIDA7XG5jb25zdCBhc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiBzdGF0KHBhdGgsIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKCksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnN0YXQgPSBzdGF0O1xuZnVuY3Rpb24gc3RhdFN5bmMocGF0aCwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICByZXR1cm4gc3luYy5yZWFkKHBhdGgsIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMuc3RhdFN5bmMgPSBzdGF0U3luYztcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiLyohIHF1ZXVlLW1pY3JvdGFzay4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xubGV0IHByb21pc2VcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbidcbiAgPyBxdWV1ZU1pY3JvdGFzay5iaW5kKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxuICAvLyByZXVzZSByZXNvbHZlZCBwcm9taXNlLCBhbmQgYWxsb2NhdGUgaXQgbGF6aWx5XG4gIDogY2IgPT4gKHByb21pc2UgfHwgKHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKSkpXG4gICAgLnRoZW4oY2IpXG4gICAgLmNhdGNoKGVyciA9PiBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZXJyIH0sIDApKVxuIiwgIi8qISBydW4tcGFyYWxsZWwuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbm1vZHVsZS5leHBvcnRzID0gcnVuUGFyYWxsZWxcblxuY29uc3QgcXVldWVNaWNyb3Rhc2sgPSByZXF1aXJlKCdxdWV1ZS1taWNyb3Rhc2snKVxuXG5mdW5jdGlvbiBydW5QYXJhbGxlbCAodGFza3MsIGNiKSB7XG4gIGxldCByZXN1bHRzLCBwZW5kaW5nLCBrZXlzXG4gIGxldCBpc1N5bmMgPSB0cnVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgcmVzdWx0cyA9IFtdXG4gICAgcGVuZGluZyA9IHRhc2tzLmxlbmd0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh0YXNrcylcbiAgICByZXN1bHRzID0ge31cbiAgICBwZW5kaW5nID0ga2V5cy5sZW5ndGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUgKGVycikge1xuICAgIGZ1bmN0aW9uIGVuZCAoKSB7XG4gICAgICBpZiAoY2IpIGNiKGVyciwgcmVzdWx0cylcbiAgICAgIGNiID0gbnVsbFxuICAgIH1cbiAgICBpZiAoaXNTeW5jKSBxdWV1ZU1pY3JvdGFzayhlbmQpXG4gICAgZWxzZSBlbmQoKVxuICB9XG5cbiAgZnVuY3Rpb24gZWFjaCAoaSwgZXJyLCByZXN1bHQpIHtcbiAgICByZXN1bHRzW2ldID0gcmVzdWx0XG4gICAgaWYgKC0tcGVuZGluZyA9PT0gMCB8fCBlcnIpIHtcbiAgICAgIGRvbmUoZXJyKVxuICAgIH1cbiAgfVxuXG4gIGlmICghcGVuZGluZykge1xuICAgIC8vIGVtcHR5XG4gICAgZG9uZShudWxsKVxuICB9IGVsc2UgaWYgKGtleXMpIHtcbiAgICAvLyBvYmplY3RcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdGFza3Nba2V5XShmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsgZWFjaChrZXksIGVyciwgcmVzdWx0KSB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgLy8gYXJyYXlcbiAgICB0YXNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0YXNrLCBpKSB7XG4gICAgICB0YXNrKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyBlYWNoKGksIGVyciwgcmVzdWx0KSB9KVxuICAgIH0pXG4gIH1cblxuICBpc1N5bmMgPSBmYWxzZVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTID0gdm9pZCAwO1xuY29uc3QgTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFMgPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKTtcbmlmIChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1swXSA9PT0gdW5kZWZpbmVkIHx8IE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzFdID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYmVoYXZpb3IuIFRoZSAncHJvY2Vzcy52ZXJzaW9ucy5ub2RlJyB2YXJpYWJsZSBoYXMgaW52YWxpZCB2YWx1ZTogJHtwcm9jZXNzLnZlcnNpb25zLm5vZGV9YCk7XG59XG5jb25zdCBNQUpPUl9WRVJTSU9OID0gTnVtYmVyLnBhcnNlSW50KE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzBdLCAxMCk7XG5jb25zdCBNSU5PUl9WRVJTSU9OID0gTnVtYmVyLnBhcnNlSW50KE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzFdLCAxMCk7XG5jb25zdCBTVVBQT1JURURfTUFKT1JfVkVSU0lPTiA9IDEwO1xuY29uc3QgU1VQUE9SVEVEX01JTk9SX1ZFUlNJT04gPSAxMDtcbmNvbnN0IElTX01BVENIRURfQllfTUFKT1IgPSBNQUpPUl9WRVJTSU9OID4gU1VQUE9SVEVEX01BSk9SX1ZFUlNJT047XG5jb25zdCBJU19NQVRDSEVEX0JZX01BSk9SX0FORF9NSU5PUiA9IE1BSk9SX1ZFUlNJT04gPT09IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OICYmIE1JTk9SX1ZFUlNJT04gPj0gU1VQUE9SVEVEX01JTk9SX1ZFUlNJT047XG4vKipcbiAqIElTIGB0cnVlYCBmb3IgTm9kZS5qcyAxMC4xMCBhbmQgZ3JlYXRlci5cbiAqL1xuZXhwb3J0cy5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTID0gSVNfTUFUQ0hFRF9CWV9NQUpPUiB8fCBJU19NQVRDSEVEX0JZX01BSk9SX0FORF9NSU5PUjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gdm9pZCAwO1xuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBzdGF0cy5pc0RpcmVjdG9yeS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gc3RhdHMuaXNTb2NrZXQuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cyk7XG59XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZnMgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2ZzXCIpO1xuZXhwb3J0cy5mcyA9IGZzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gdm9pZCAwO1xuZnVuY3Rpb24gam9pblBhdGhTZWdtZW50cyhhLCBiLCBzZXBhcmF0b3IpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ycmVjdCBoYW5kbGluZyBvZiBjYXNlcyB3aGVuIHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgcm9vdCAoYC9gLCBgQzovYCkgb3IgVU5DIHBhdGggKGAvLz8vQzovYCkuXG4gICAgICovXG4gICAgaWYgKGEuZW5kc1dpdGgoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHJldHVybiBhICsgc2VwYXJhdG9yICsgYjtcbn1cbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGpvaW5QYXRoU2VnbWVudHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBycGwgPSByZXF1aXJlKFwicnVuLXBhcmFsbGVsXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5mdW5jdGlvbiByZWFkKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5zdGF0cyAmJiBjb25zdGFudHNfMS5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTKSB7XG4gICAgICAgIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKHJlYWRkaXJFcnJvciwgZGlyZW50cykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCByZWFkZGlyRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBkaXJlbnRzLm1hcCgoZGlyZW50KSA9PiAoe1xuICAgICAgICAgICAgZGlyZW50LFxuICAgICAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXRoOiBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIGRpcmVudC5uYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcilcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MpIHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBtYWtlUnBsVGFza0VudHJ5KGVudHJ5LCBzZXR0aW5ncykpO1xuICAgICAgICBycGwodGFza3MsIChycGxFcnJvciwgcnBsRW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJwbEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcnBsRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVudHJpZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSByZWFkZGlyV2l0aEZpbGVUeXBlcztcbmZ1bmN0aW9uIG1ha2VScGxUYXNrRW50cnkoZW50cnksIHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgIGlmICghZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQoZW50cnkucGF0aCwgKHN0YXRFcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5kaXJlbnQgPSB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMoZW50cnkubmFtZSwgc3RhdHMpO1xuICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMucmVhZGRpcihkaXJlY3RvcnksIChyZWFkZGlyRXJyb3IsIG5hbWVzKSA9PiB7XG4gICAgICAgIGlmIChyZWFkZGlyRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFza3MgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIG5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoZG9uZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZzU3RhdC5zdGF0KHBhdGgsIHNldHRpbmdzLmZzU3RhdFNldHRpbmdzLCAoZXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcnBsKHRhc2tzLCAocnBsRXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChycGxFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXIgPSByZWFkZGlyO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCByZXN1bHQpIHtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IGV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5mdW5jdGlvbiByZWFkKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzLnN0YXRzICYmIGNvbnN0YW50c18xLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLm1hcCgoZGlyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgZGlyZW50LFxuICAgICAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXRoOiBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIGRpcmVudC5uYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcilcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpICYmIHNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBzZXR0aW5ncy5mcy5zdGF0U3luYyhlbnRyeS5wYXRoKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5kaXJlbnQgPSB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMoZW50cnkubmFtZSwgc3RhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IHJlYWRkaXJXaXRoRmlsZVR5cGVzO1xuZnVuY3Rpb24gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgY29uc3QgbmFtZXMgPSBzZXR0aW5ncy5mcy5yZWFkZGlyU3luYyhkaXJlY3RvcnkpO1xuICAgIHJldHVybiBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnlQYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBuYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gZnNTdGF0LnN0YXRTeW5jKGVudHJ5UGF0aCwgc2V0dGluZ3MuZnNTdGF0U2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYXRoOiBlbnRyeVBhdGgsXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpciA9IHJlYWRkaXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5leHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XG4gICAgbHN0YXQ6IGZzLmxzdGF0LFxuICAgIHN0YXQ6IGZzLnN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jLFxuICAgIHJlYWRkaXI6IGZzLnJlYWRkaXIsXG4gICAgcmVhZGRpclN5bmM6IGZzLnJlYWRkaXJTeW5jXG59O1xuZnVuY3Rpb24gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIoZnNNZXRob2RzKSB7XG4gICAgaWYgKGZzTWV0aG9kcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiksIGZzTWV0aG9kcyk7XG59XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vYWRhcHRlcnMvZnNcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgZmFsc2UpO1xuICAgICAgICB0aGlzLmZzID0gZnMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIodGhpcy5fb3B0aW9ucy5mcyk7XG4gICAgICAgIHRoaXMucGF0aFNlZ21lbnRTZXBhcmF0b3IgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLCBwYXRoLnNlcCk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN0YXRzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIHRydWUpO1xuICAgICAgICB0aGlzLmZzU3RhdFNldHRpbmdzID0gbmV3IGZzU3RhdC5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbms6IHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLmZzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGlua1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXR0aW5ncyA9IGV4cG9ydHMuc2NhbmRpclN5bmMgPSBleHBvcnRzLnNjYW5kaXIgPSB2b2lkIDA7XG5jb25zdCBhc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiBzY2FuZGlyKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKCksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnNjYW5kaXIgPSBzY2FuZGlyO1xuZnVuY3Rpb24gc2NhbmRpclN5bmMocGF0aCwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICByZXR1cm4gc3luYy5yZWFkKHBhdGgsIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMuc2NhbmRpclN5bmMgPSBzY2FuZGlyU3luYztcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIHJldXNpZnkgKENvbnN0cnVjdG9yKSB7XG4gIHZhciBoZWFkID0gbmV3IENvbnN0cnVjdG9yKClcbiAgdmFyIHRhaWwgPSBoZWFkXG5cbiAgZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICB2YXIgY3VycmVudCA9IGhlYWRcblxuICAgIGlmIChjdXJyZW50Lm5leHQpIHtcbiAgICAgIGhlYWQgPSBjdXJyZW50Lm5leHRcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZCA9IG5ldyBDb25zdHJ1Y3RvcigpXG4gICAgICB0YWlsID0gaGVhZFxuICAgIH1cblxuICAgIGN1cnJlbnQubmV4dCA9IG51bGxcblxuICAgIHJldHVybiBjdXJyZW50XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChvYmopIHtcbiAgICB0YWlsLm5leHQgPSBvYmpcbiAgICB0YWlsID0gb2JqXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldDogZ2V0LFxuICAgIHJlbGVhc2U6IHJlbGVhc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJldXNpZnlcbiIsICIndXNlIHN0cmljdCdcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciByZXVzaWZ5ID0gcmVxdWlyZSgncmV1c2lmeScpXG5cbmZ1bmN0aW9uIGZhc3RxdWV1ZSAoY29udGV4dCwgd29ya2VyLCBjb25jdXJyZW5jeSkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25jdXJyZW5jeSA9IHdvcmtlclxuICAgIHdvcmtlciA9IGNvbnRleHRcbiAgICBjb250ZXh0ID0gbnVsbFxuICB9XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFzdHF1ZXVlIGNvbmN1cnJlbmN5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKVxuICB9XG5cbiAgdmFyIGNhY2hlID0gcmV1c2lmeShUYXNrKVxuICB2YXIgcXVldWVIZWFkID0gbnVsbFxuICB2YXIgcXVldWVUYWlsID0gbnVsbFxuICB2YXIgX3J1bm5pbmcgPSAwXG4gIHZhciBlcnJvckhhbmRsZXIgPSBudWxsXG5cbiAgdmFyIHNlbGYgPSB7XG4gICAgcHVzaDogcHVzaCxcbiAgICBkcmFpbjogbm9vcCxcbiAgICBzYXR1cmF0ZWQ6IG5vb3AsXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICAgIHJ1bm5pbmc6IHJ1bm5pbmcsXG4gICAgcmVzdW1lOiByZXN1bWUsXG4gICAgaWRsZTogaWRsZSxcbiAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICBnZXRRdWV1ZTogZ2V0UXVldWUsXG4gICAgdW5zaGlmdDogdW5zaGlmdCxcbiAgICBlbXB0eTogbm9vcCxcbiAgICBraWxsOiBraWxsLFxuICAgIGtpbGxBbmREcmFpbjoga2lsbEFuZERyYWluLFxuICAgIGVycm9yOiBlcnJvclxuICB9XG5cbiAgcmV0dXJuIHNlbGZcblxuICBmdW5jdGlvbiBydW5uaW5nICgpIHtcbiAgICByZXR1cm4gX3J1bm5pbmdcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlICgpIHtcbiAgICBzZWxmLnBhdXNlZCA9IHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlbmd0aCAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBxdWV1ZUhlYWRcbiAgICB2YXIgY291bnRlciA9IDBcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XG4gICAgICBjb3VudGVyKytcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlclxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVldWUgKCkge1xuICAgIHZhciBjdXJyZW50ID0gcXVldWVIZWFkXG4gICAgdmFyIHRhc2tzID0gW11cblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICB0YXNrcy5wdXNoKGN1cnJlbnQudmFsdWUpXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhc2tzXG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUgKCkge1xuICAgIGlmICghc2VsZi5wYXVzZWQpIHJldHVyblxuICAgIHNlbGYucGF1c2VkID0gZmFsc2VcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY29uY3VycmVuY3k7IGkrKykge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgcmVsZWFzZSgpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaWRsZSAoKSB7XG4gICAgcmV0dXJuIF9ydW5uaW5nID09PSAwICYmIHNlbGYubGVuZ3RoKCkgPT09IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2ggKHZhbHVlLCBkb25lKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjYWNoZS5nZXQoKVxuXG4gICAgY3VycmVudC5jb250ZXh0ID0gY29udGV4dFxuICAgIGN1cnJlbnQucmVsZWFzZSA9IHJlbGVhc2VcbiAgICBjdXJyZW50LnZhbHVlID0gdmFsdWVcbiAgICBjdXJyZW50LmNhbGxiYWNrID0gZG9uZSB8fCBub29wXG4gICAgY3VycmVudC5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXJcblxuICAgIGlmIChfcnVubmluZyA9PT0gc2VsZi5jb25jdXJyZW5jeSB8fCBzZWxmLnBhdXNlZCkge1xuICAgICAgaWYgKHF1ZXVlVGFpbCkge1xuICAgICAgICBxdWV1ZVRhaWwubmV4dCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICAgIHNlbGYuc2F0dXJhdGVkKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgY3VycmVudC52YWx1ZSwgY3VycmVudC53b3JrZWQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdW5zaGlmdCAodmFsdWUsIGRvbmUpIHtcbiAgICB2YXIgY3VycmVudCA9IGNhY2hlLmdldCgpXG5cbiAgICBjdXJyZW50LmNvbnRleHQgPSBjb250ZXh0XG4gICAgY3VycmVudC5yZWxlYXNlID0gcmVsZWFzZVxuICAgIGN1cnJlbnQudmFsdWUgPSB2YWx1ZVxuICAgIGN1cnJlbnQuY2FsbGJhY2sgPSBkb25lIHx8IG5vb3BcblxuICAgIGlmIChfcnVubmluZyA9PT0gc2VsZi5jb25jdXJyZW5jeSB8fCBzZWxmLnBhdXNlZCkge1xuICAgICAgaWYgKHF1ZXVlSGVhZCkge1xuICAgICAgICBjdXJyZW50Lm5leHQgPSBxdWV1ZUhlYWRcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICAgIHNlbGYuc2F0dXJhdGVkKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgY3VycmVudC52YWx1ZSwgY3VycmVudC53b3JrZWQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVsZWFzZSAoaG9sZGVyKSB7XG4gICAgaWYgKGhvbGRlcikge1xuICAgICAgY2FjaGUucmVsZWFzZShob2xkZXIpXG4gICAgfVxuICAgIHZhciBuZXh0ID0gcXVldWVIZWFkXG4gICAgaWYgKG5leHQpIHtcbiAgICAgIGlmICghc2VsZi5wYXVzZWQpIHtcbiAgICAgICAgaWYgKHF1ZXVlVGFpbCA9PT0gcXVldWVIZWFkKSB7XG4gICAgICAgICAgcXVldWVUYWlsID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSGVhZCA9IG5leHQubmV4dFxuICAgICAgICBuZXh0Lm5leHQgPSBudWxsXG4gICAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIG5leHQudmFsdWUsIG5leHQud29ya2VkKVxuICAgICAgICBpZiAocXVldWVUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5lbXB0eSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9ydW5uaW5nLS1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKC0tX3J1bm5pbmcgPT09IDApIHtcbiAgICAgIHNlbGYuZHJhaW4oKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGwgKCkge1xuICAgIHF1ZXVlSGVhZCA9IG51bGxcbiAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgc2VsZi5kcmFpbiA9IG5vb3BcbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGxBbmREcmFpbiAoKSB7XG4gICAgcXVldWVIZWFkID0gbnVsbFxuICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICBzZWxmLmRyYWluKClcbiAgICBzZWxmLmRyYWluID0gbm9vcFxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3IgKGhhbmRsZXIpIHtcbiAgICBlcnJvckhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBUYXNrICgpIHtcbiAgdGhpcy52YWx1ZSA9IG51bGxcbiAgdGhpcy5jYWxsYmFjayA9IG5vb3BcbiAgdGhpcy5uZXh0ID0gbnVsbFxuICB0aGlzLnJlbGVhc2UgPSBub29wXG4gIHRoaXMuY29udGV4dCA9IG51bGxcbiAgdGhpcy5lcnJvckhhbmRsZXIgPSBudWxsXG5cbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgdGhpcy53b3JrZWQgPSBmdW5jdGlvbiB3b3JrZWQgKGVyciwgcmVzdWx0KSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2VsZi5jYWxsYmFja1xuICAgIHZhciBlcnJvckhhbmRsZXIgPSBzZWxmLmVycm9ySGFuZGxlclxuICAgIHZhciB2YWwgPSBzZWxmLnZhbHVlXG4gICAgc2VsZi52YWx1ZSA9IG51bGxcbiAgICBzZWxmLmNhbGxiYWNrID0gbm9vcFxuICAgIGlmIChzZWxmLmVycm9ySGFuZGxlcikge1xuICAgICAgZXJyb3JIYW5kbGVyKGVyciwgdmFsKVxuICAgIH1cbiAgICBjYWxsYmFjay5jYWxsKHNlbGYuY29udGV4dCwgZXJyLCByZXN1bHQpXG4gICAgc2VsZi5yZWxlYXNlKHNlbGYpXG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVBc1Byb21pc2VkIChjb250ZXh0LCB3b3JrZXIsIGNvbmN1cnJlbmN5KSB7XG4gIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbmN1cnJlbmN5ID0gd29ya2VyXG4gICAgd29ya2VyID0gY29udGV4dFxuICAgIGNvbnRleHQgPSBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBhc3luY1dyYXBwZXIgKGFyZywgY2IpIHtcbiAgICB3b3JrZXIuY2FsbCh0aGlzLCBhcmcpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGNiKG51bGwsIHJlcylcbiAgICAgIH0sIGNiKVxuICB9XG5cbiAgdmFyIHF1ZXVlID0gZmFzdHF1ZXVlKGNvbnRleHQsIGFzeW5jV3JhcHBlciwgY29uY3VycmVuY3kpXG5cbiAgdmFyIHB1c2hDYiA9IHF1ZXVlLnB1c2hcbiAgdmFyIHVuc2hpZnRDYiA9IHF1ZXVlLnVuc2hpZnRcblxuICBxdWV1ZS5wdXNoID0gcHVzaFxuICBxdWV1ZS51bnNoaWZ0ID0gdW5zaGlmdFxuICBxdWV1ZS5kcmFpbmVkID0gZHJhaW5lZFxuXG4gIHJldHVybiBxdWV1ZVxuXG4gIGZ1bmN0aW9uIHB1c2ggKHZhbHVlKSB7XG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBwdXNoQ2IodmFsdWUsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIExldCdzIGZvcmsgdGhlIHByb21pc2UgY2hhaW4gdG9cbiAgICAvLyBtYWtlIHRoZSBlcnJvciBidWJibGUgdXAgdG8gdGhlIHVzZXIgYnV0XG4gICAgLy8gbm90IGxlYWQgdG8gYSB1bmhhbmRsZWRSZWplY3Rpb25cbiAgICBwLmNhdGNoKG5vb3ApXG5cbiAgICByZXR1cm4gcFxuICB9XG5cbiAgZnVuY3Rpb24gdW5zaGlmdCAodmFsdWUpIHtcbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHVuc2hpZnRDYih2YWx1ZSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcClcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbmVkICgpIHtcbiAgICBpZiAocXVldWUuaWRsZSgpKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0RyYWluID0gcXVldWUuZHJhaW5cblxuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHF1ZXVlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcmV2aW91c0RyYWluKClcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBwXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYXN0cXVldWVcbm1vZHVsZS5leHBvcnRzLnByb21pc2UgPSBxdWV1ZUFzUHJvbWlzZWRcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGV4cG9ydHMucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yID0gZXhwb3J0cy5pc0FwcGxpZWRGaWx0ZXIgPSBleHBvcnRzLmlzRmF0YWxFcnJvciA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzRmF0YWxFcnJvcihzZXR0aW5ncywgZXJyb3IpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXJyb3JGaWx0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhc2V0dGluZ3MuZXJyb3JGaWx0ZXIoZXJyb3IpO1xufVxuZXhwb3J0cy5pc0ZhdGFsRXJyb3IgPSBpc0ZhdGFsRXJyb3I7XG5mdW5jdGlvbiBpc0FwcGxpZWRGaWx0ZXIoZmlsdGVyLCB2YWx1ZSkge1xuICAgIHJldHVybiBmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyKHZhbHVlKTtcbn1cbmV4cG9ydHMuaXNBcHBsaWVkRmlsdGVyID0gaXNBcHBsaWVkRmlsdGVyO1xuZnVuY3Rpb24gcmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yKGZpbGVwYXRoLCBzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gZmlsZXBhdGguc3BsaXQoL1svXFxcXF0vKS5qb2luKHNlcGFyYXRvcik7XG59XG5leHBvcnRzLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvciA9IHJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcjtcbmZ1bmN0aW9uIGpvaW5QYXRoU2VnbWVudHMoYSwgYiwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKGEgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29ycmVjdCBoYW5kbGluZyBvZiBjYXNlcyB3aGVuIHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgcm9vdCAoYC9gLCBgQzovYCkgb3IgVU5DIHBhdGggKGAvLz8vQzovYCkuXG4gICAgICovXG4gICAgaWYgKGEuZW5kc1dpdGgoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHJldHVybiBhICsgc2VwYXJhdG9yICsgYjtcbn1cbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGpvaW5QYXRoU2VnbWVudHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jbGFzcyBSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcm9vdCA9IGNvbW1vbi5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IoX3Jvb3QsIF9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jb25zdCBmYXN0cSA9IHJlcXVpcmUoXCJmYXN0cVwiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgQXN5bmNSZWFkZXIgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKF9yb290LCBfc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fc2NhbmRpciA9IGZzU2NhbmRpci5zY2FuZGlyO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IGV2ZW50c18xLkV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IGZhc3RxKHRoaXMuX3dvcmtlci5iaW5kKHRoaXMpLCB0aGlzLl9zZXR0aW5ncy5jb25jdXJyZW5jeSk7XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9xdWV1ZS5kcmFpbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZSh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1pdHRlcjtcbiAgICB9XG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEZXN0cm95ZWQ7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcmVhZGVyIGlzIGFscmVhZHkgZGVzdHJveWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9xdWV1ZS5raWxsQW5kRHJhaW4oKTtcbiAgICB9XG4gICAgb25FbnRyeShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uKCdlbnRyeScsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uY2UoJ2Vycm9yJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBvbkVuZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uY2UoJ2VuZCcsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgX3B1c2hUb1F1ZXVlKGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSB7IGRpcmVjdG9yeSwgYmFzZSB9O1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHF1ZXVlSXRlbSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfd29ya2VyKGl0ZW0sIGRvbmUpIHtcbiAgICAgICAgdGhpcy5fc2NhbmRpcihpdGVtLmRpcmVjdG9yeSwgdGhpcy5fc2V0dGluZ3MuZnNTY2FuZGlyU2V0dGluZ3MsIChlcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZG9uZShlcnJvciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFbnRyeShlbnRyeSwgaXRlbS5iYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUobnVsbCwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIWNvbW1vbi5pc0ZhdGFsRXJyb3IodGhpcy5fc2V0dGluZ3MsIGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0ZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhiYXNlLCBlbnRyeS5uYW1lLCB0aGlzLl9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZW50cnlGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVudHJ5KGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW1pdEVudHJ5KGVudHJ5KSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW50cnknLCBlbnRyeSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXN5bmNSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jbGFzcyBBc3luY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgfVxuICAgIHJlYWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbnRyeSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbmQoKCkgPT4ge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgdGhpcy5fc3RvcmFnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEFzeW5jUHJvdmlkZXI7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpIHtcbiAgICBjYWxsYmFjayhudWxsLCBlbnRyaWVzKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNsYXNzIFN0cmVhbVByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zdHJlYW0gPSBuZXcgc3RyZWFtXzEuUmVhZGFibGUoe1xuICAgICAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWQ6ICgpID0+IHsgfSxcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JlYWRlci5pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0ucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbmQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLnB1c2gobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN0cmVhbVByb3ZpZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIFN5bmNSZWFkZXIgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fc2NhbmRpciA9IGZzU2NhbmRpci5zY2FuZGlyU3luYztcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MuYmFzZVBhdGgpO1xuICAgICAgICB0aGlzLl9oYW5kbGVRdWV1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgICB9XG4gICAgX3B1c2hUb1F1ZXVlKGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICB0aGlzLl9xdWV1ZS5hZGQoeyBkaXJlY3RvcnksIGJhc2UgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVRdWV1ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX3F1ZXVlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVEaXJlY3RvcnkoaXRlbS5kaXJlY3RvcnksIGl0ZW0uYmFzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZURpcmVjdG9yeShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLl9zY2FuZGlyKGRpcmVjdG9yeSwgdGhpcy5fc2V0dGluZ3MuZnNTY2FuZGlyU2V0dGluZ3MpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRW50cnkoZW50cnksIGJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoIWNvbW1vbi5pc0ZhdGFsRXJyb3IodGhpcy5fc2V0dGluZ3MsIGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBfaGFuZGxlRW50cnkoZW50cnksIGJhc2UpIHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbnRyeS5wYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoYmFzZSwgZW50cnkubmFtZSwgdGhpcy5fc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmVudHJ5RmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1N0b3JhZ2UoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmRlZXBGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUoZnVsbHBhdGgsIGJhc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGVudHJ5LnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9wdXNoVG9TdG9yYWdlKGVudHJ5KSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaChlbnRyeSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3luY1JlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N5bmNcIik7XG5jbGFzcyBTeW5jUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IHN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3luY1Byb3ZpZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJhc2VQYXRoLCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kZWVwRmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5lbnRyeUZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZW50cnlGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLmVycm9yRmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5lcnJvckZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMucGF0aFNlZ21lbnRTZXBhcmF0b3IgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLCBwYXRoLnNlcCk7XG4gICAgICAgIHRoaXMuZnNTY2FuZGlyU2V0dGluZ3MgPSBuZXcgZnNTY2FuZGlyLlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9vcHRpb25zLmZzLFxuICAgICAgICAgICAgcGF0aFNlZ21lbnRTZXBhcmF0b3I6IHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsXG4gICAgICAgICAgICBzdGF0czogdGhpcy5fb3B0aW9ucy5zdGF0cyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBleHBvcnRzLndhbGtTdHJlYW0gPSBleHBvcnRzLndhbGtTeW5jID0gZXhwb3J0cy53YWxrID0gdm9pZCAwO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHdhbGsoZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV3IGFzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIGdldFNldHRpbmdzKCkpLnJlYWQob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgYXN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSkucmVhZChjYWxsYmFjayk7XG59XG5leHBvcnRzLndhbGsgPSB3YWxrO1xuZnVuY3Rpb24gd2Fsa1N5bmMoZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBwcm92aWRlci5yZWFkKCk7XG59XG5leHBvcnRzLndhbGtTeW5jID0gd2Fsa1N5bmM7XG5mdW5jdGlvbiB3YWxrU3RyZWFtKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzdHJlYW1fMS5kZWZhdWx0KGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBwcm92aWRlci5yZWFkKCk7XG59XG5leHBvcnRzLndhbGtTdHJlYW0gPSB3YWxrU3RyZWFtO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jbGFzcyBSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fZnNTdGF0U2V0dGluZ3MgPSBuZXcgZnNTdGF0LlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldEZ1bGxFbnRyeVBhdGgoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGZpbGVwYXRoKTtcbiAgICB9XG4gICAgX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWU6IHBhdHRlcm4sXG4gICAgICAgICAgICBwYXRoOiBwYXR0ZXJuLFxuICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMocGF0dGVybiwgc3RhdHMpXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIF9pc0ZhdGFsRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICF1dGlscy5lcnJuby5pc0Vub2VudENvZGVFcnJvcihlcnJvcikgJiYgIXRoaXMuX3NldHRpbmdzLnN1cHByZXNzRXJyb3JzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIFJlYWRlclN0cmVhbSBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl93YWxrU3RyZWFtID0gZnNXYWxrLndhbGtTdHJlYW07XG4gICAgICAgIHRoaXMuX3N0YXQgPSBmc1N0YXQuc3RhdDtcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3RyZWFtKHJvb3QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZmlsZXBhdGhzID0gcGF0dGVybnMubWFwKHRoaXMuX2dldEZ1bGxFbnRyeVBhdGgsIHRoaXMpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgc3RyZWFtXzEuUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xuICAgICAgICBzdHJlYW0uX3dyaXRlID0gKGluZGV4LCBfZW5jLCBkb25lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cnkoZmlsZXBhdGhzW2luZGV4XSwgcGF0dGVybnNbaW5kZXhdLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPT0gbnVsbCAmJiBvcHRpb25zLmVudHJ5RmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gZmlsZXBhdGhzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkb25lKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpXG4gICAgICAgICAgICAudGhlbigoc3RhdHMpID0+IHRoaXMuX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lcnJvckZpbHRlcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXQoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzLCAoZXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yID09PSBudWxsID8gcmVzb2x2ZShzdGF0cykgOiByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlclN0cmVhbTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3N0cmVhbVwiKTtcbmNsYXNzIFJlYWRlckFzeW5jIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtBc3luYyA9IGZzV2Fsay53YWxrO1xuICAgICAgICB0aGlzLl9yZWFkZXJTdHJlYW0gPSBuZXcgc3RyZWFtXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2Fsa0FzeW5jKHJvb3QsIG9wdGlvbnMsIChlcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVudHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX3JlYWRlclN0cmVhbS5zdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpO1xuICAgICAgICAvLyBBZnRlciAjMjM1LCByZXBsYWNlIGl0IHdpdGggYW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLlxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICAgIHN0cmVhbS5vbignZGF0YScsIChlbnRyeSkgPT4gZW50cmllcy5wdXNoKGVudHJ5KSk7XG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4gcmVzb2x2ZShlbnRyaWVzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlckFzeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBNYXRjaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfcGF0dGVybnMsIF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5zID0gX3BhdHRlcm5zO1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5fZmlsbFN0b3JhZ2UoKTtcbiAgICB9XG4gICAgX2ZpbGxTdG9yYWdlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5fcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5fZ2V0UGF0dGVyblNlZ21lbnRzKHBhdHRlcm4pO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6IHNlY3Rpb25zLmxlbmd0aCA8PSAxLFxuICAgICAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRQYXR0ZXJuU2VnbWVudHMocGF0dGVybikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVyblBhcnRzKHBhdHRlcm4sIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHluYW1pYyA9IHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihwYXJ0LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgICAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogcGFydFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGR5bmFtaWM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogcGFydCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuUmU6IHV0aWxzLnBhdHRlcm4ubWFrZVJlKHBhcnQsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5hcnJheS5zcGxpdFdoZW4oc2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LmR5bmFtaWMgJiYgdXRpbHMucGF0dGVybi5oYXNHbG9iU3RhcihzZWdtZW50LnBhdHRlcm4pKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgbWF0Y2hlcl8xID0gcmVxdWlyZShcIi4vbWF0Y2hlclwiKTtcbmNsYXNzIFBhcnRpYWxNYXRjaGVyIGV4dGVuZHMgbWF0Y2hlcl8xLmRlZmF1bHQge1xuICAgIG1hdGNoKGZpbGVwYXRoKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gZmlsZXBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gcGFydHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX3N0b3JhZ2UuZmlsdGVyKChpbmZvKSA9PiAhaW5mby5jb21wbGV0ZSB8fCBpbmZvLnNlZ21lbnRzLmxlbmd0aCA+IGxldmVscyk7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHBhdHRlcm4uc2VjdGlvbnNbMF07XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIHBhdHRlcm4gaGFzIGEgZ2xvYnN0YXIgYW5kIHdlIG11c3QgcmVhZCBhbGwgZGlyZWN0b3JpZXMgdW5jb25kaXRpb25hbGx5LFxuICAgICAgICAgICAgICogYnV0IG9ubHkgaWYgdGhlIGxldmVsIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGdyb3VwLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIGZpeHR1cmVzL3thLGJ9LyoqXG4gICAgICAgICAgICAgKiAgXiB0cnVlL2ZhbHNlICBeIGFsd2F5cyB0cnVlXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKCFwYXR0ZXJuLmNvbXBsZXRlICYmIGxldmVscyA+IHNlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcnRzLmV2ZXJ5KChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBwYXR0ZXJuLnNlZ21lbnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVyblJlLnRlc3QocGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVybiA9PT0gcGFydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUGFydGlhbE1hdGNoZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNvbnN0IHBhcnRpYWxfMSA9IHJlcXVpcmUoXCIuLi9tYXRjaGVycy9wYXJ0aWFsXCIpO1xuY2xhc3MgRGVlcEZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIoYmFzZVBhdGgsIHBvc2l0aXZlLCBuZWdhdGl2ZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVyID0gdGhpcy5fZ2V0TWF0Y2hlcihwb3NpdGl2ZSk7XG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlUmUgPSB0aGlzLl9nZXROZWdhdGl2ZVBhdHRlcm5zUmUobmVnYXRpdmUpO1xuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl9maWx0ZXIoYmFzZVBhdGgsIGVudHJ5LCBtYXRjaGVyLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2dldE1hdGNoZXIocGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwYXJ0aWFsXzEuZGVmYXVsdChwYXR0ZXJucywgdGhpcy5fc2V0dGluZ3MsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgX2dldE5lZ2F0aXZlUGF0dGVybnNSZShwYXR0ZXJucykge1xuICAgICAgICBjb25zdCBhZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm5zID0gcGF0dGVybnMuZmlsdGVyKHV0aWxzLnBhdHRlcm4uaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4pO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKGFmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybnMsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgX2ZpbHRlcihiYXNlUGF0aCwgZW50cnksIG1hdGNoZXIsIG5lZ2F0aXZlUmUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5RGVlcChiYXNlUGF0aCwgZW50cnkucGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkU3ltYm9saWNMaW5rKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdXRpbHMucGF0aC5yZW1vdmVMZWFkaW5nRG90U2VnbWVudChlbnRyeS5wYXRoKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5UG9zaXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5RGVlcChiYXNlUGF0aCwgZW50cnlQYXRoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBdm9pZCB1bm5lY2Vzc2FyeSBkZXB0aCBjYWxjdWxhdGlvbnMgd2hlbiBpdCBkb2Vzbid0IG1hdHRlci5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5kZWVwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpID49IHRoaXMuX3NldHRpbmdzLmRlZXA7XG4gICAgfVxuICAgIF9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpIHtcbiAgICAgICAgY29uc3QgZW50cnlQYXRoRGVwdGggPSBlbnRyeVBhdGguc3BsaXQoJy8nKS5sZW5ndGg7XG4gICAgICAgIGlmIChiYXNlUGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlUGF0aERlcHRoID0gYmFzZVBhdGguc3BsaXQoJy8nKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aCAtIGJhc2VQYXRoRGVwdGg7XG4gICAgfVxuICAgIF9pc1NraXBwZWRTeW1ib2xpY0xpbmsoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzICYmIGVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlQb3NpdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgbWF0Y2hlcikge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3NldHRpbmdzLmJhc2VOYW1lTWF0Y2ggJiYgIW1hdGNoZXIubWF0Y2goZW50cnlQYXRoKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5TmVnYXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIHBhdHRlcm5zUmUpIHtcbiAgICAgICAgcmV0dXJuICF1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGVudHJ5UGF0aCwgcGF0dGVybnNSZSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRGVlcEZpbHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgRW50cnlGaWx0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0RmlsdGVyKHBvc2l0aXZlLCBuZWdhdGl2ZSkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZVJlID0gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKHBvc2l0aXZlLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlUmUgPSB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUobmVnYXRpdmUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpLCB7IGRvdDogdHJ1ZSB9KSk7XG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX2ZpbHRlcihlbnRyeSwgcG9zaXRpdmVSZSwgbmVnYXRpdmVSZSk7XG4gICAgfVxuICAgIF9maWx0ZXIoZW50cnksIHBvc2l0aXZlUmUsIG5lZ2F0aXZlUmUpIHtcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSB1dGlscy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5LnBhdGgpO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIHRoaXMuX2lzRHVwbGljYXRlRW50cnkoZmlsZXBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB8fCB0aGlzLl9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbmVnYXRpdmVSZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpO1xuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB0aGlzLl9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgcG9zaXRpdmVSZSwgaXNEaXJlY3RvcnkpICYmICF0aGlzLl9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgbmVnYXRpdmVSZSwgaXNEaXJlY3RvcnkpO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIGlzTWF0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlSW5kZXhSZWNvcmQoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc01hdGNoZWQ7XG4gICAgfVxuICAgIF9pc0R1cGxpY2F0ZUVudHJ5KGZpbGVwYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LmhhcyhmaWxlcGF0aCk7XG4gICAgfVxuICAgIF9jcmVhdGVJbmRleFJlY29yZChmaWxlcGF0aCkge1xuICAgICAgICB0aGlzLmluZGV4LnNldChmaWxlcGF0aCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5vbmx5RmlsZXMgJiYgIWVudHJ5LmRpcmVudC5pc0ZpbGUoKTtcbiAgICB9XG4gICAgX29ubHlEaXJlY3RvcnlGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlEaXJlY3RvcmllcyAmJiAhZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIHBhdHRlcm5zUmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBlbnRyeVBhdGgpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5tYXRjaEFueShmdWxscGF0aCwgcGF0dGVybnNSZSk7XG4gICAgfVxuICAgIF9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgcGF0dGVybnNSZSwgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgLy8gVHJ5aW5nIHRvIG1hdGNoIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBieSBwYXR0ZXJucy5cbiAgICAgICAgY29uc3QgaXNNYXRjaGVkID0gdXRpbHMucGF0dGVybi5tYXRjaEFueShmaWxlcGF0aCwgcGF0dGVybnNSZSk7XG4gICAgICAgIC8vIEEgcGF0dGVybiB3aXRoIGEgdHJhaWxsaW5nIHNsYXNoIGNhbiBiZSB1c2VkIGZvciBkaXJlY3RvcnkgbWF0Y2hpbmcuXG4gICAgICAgIC8vIFRvIGFwcGx5IHN1Y2ggcGF0dGVybiwgd2UgbmVlZCB0byBhZGQgYSB0cmFsbGluZyBzbGFzaCB0byB0aGUgcGF0aC5cbiAgICAgICAgaWYgKCFpc01hdGNoZWQgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZpbGVwYXRoICsgJy8nLCBwYXR0ZXJuc1JlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNNYXRjaGVkO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVudHJ5RmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFcnJvckZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiAoZXJyb3IpID0+IHRoaXMuX2lzTm9uRmF0YWxFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIF9pc05vbkZhdGFsRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSB8fCB0aGlzLl9zZXR0aW5ncy5zdXBwcmVzc0Vycm9ycztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFcnJvckZpbHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgRW50cnlUcmFuc2Zvcm1lciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXRUcmFuc2Zvcm1lcigpIHtcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fdHJhbnNmb3JtKGVudHJ5KTtcbiAgICB9XG4gICAgX3RyYW5zZm9ybShlbnRyeSkge1xuICAgICAgICBsZXQgZmlsZXBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XG4gICAgICAgICAgICBmaWxlcGF0aCA9IHV0aWxzLnBhdGgudW5peGlmeShmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1hcmtEaXJlY3RvcmllcyAmJiBlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgZmlsZXBhdGggKz0gJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3Mub2JqZWN0TW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVudHJ5KSwgeyBwYXRoOiBmaWxlcGF0aCB9KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFbnRyeVRyYW5zZm9ybWVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZGVlcF8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9kZWVwXCIpO1xuY29uc3QgZW50cnlfMSA9IHJlcXVpcmUoXCIuL2ZpbHRlcnMvZW50cnlcIik7XG5jb25zdCBlcnJvcl8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9lcnJvclwiKTtcbmNvbnN0IGVudHJ5XzIgPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1lcnMvZW50cnlcIik7XG5jbGFzcyBQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLmVycm9yRmlsdGVyID0gbmV3IGVycm9yXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZW50cnlGaWx0ZXIgPSBuZXcgZW50cnlfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzLCB0aGlzLl9nZXRNaWNyb21hdGNoT3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyID0gbmV3IGRlZXBfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzLCB0aGlzLl9nZXRNaWNyb21hdGNoT3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5lbnRyeVRyYW5zZm9ybWVyID0gbmV3IGVudHJ5XzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIF9nZXRSb290RGlyZWN0b3J5KHRhc2spIHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIHRhc2suYmFzZSk7XG4gICAgfVxuICAgIF9nZXRSZWFkZXJPcHRpb25zKHRhc2spIHtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSB0YXNrLmJhc2UgPT09ICcuJyA/ICcnIDogdGFzay5iYXNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgICBwYXRoU2VnbWVudFNlcGFyYXRvcjogJy8nLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IHRoaXMuX3NldHRpbmdzLmNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgZGVlcEZpbHRlcjogdGhpcy5kZWVwRmlsdGVyLmdldEZpbHRlcihiYXNlUGF0aCwgdGFzay5wb3NpdGl2ZSwgdGFzay5uZWdhdGl2ZSksXG4gICAgICAgICAgICBlbnRyeUZpbHRlcjogdGhpcy5lbnRyeUZpbHRlci5nZXRGaWx0ZXIodGFzay5wb3NpdGl2ZSwgdGFzay5uZWdhdGl2ZSksXG4gICAgICAgICAgICBlcnJvckZpbHRlcjogdGhpcy5lcnJvckZpbHRlci5nZXRGaWx0ZXIoKSxcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fc2V0dGluZ3MuZnMsXG4gICAgICAgICAgICBzdGF0czogdGhpcy5fc2V0dGluZ3Muc3RhdHMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5lbnRyeVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG90OiB0aGlzLl9zZXR0aW5ncy5kb3QsXG4gICAgICAgICAgICBtYXRjaEJhc2U6IHRoaXMuX3NldHRpbmdzLmJhc2VOYW1lTWF0Y2gsXG4gICAgICAgICAgICBub2JyYWNlOiAhdGhpcy5fc2V0dGluZ3MuYnJhY2VFeHBhbnNpb24sXG4gICAgICAgICAgICBub2Nhc2U6ICF0aGlzLl9zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlTWF0Y2gsXG4gICAgICAgICAgICBub2V4dDogIXRoaXMuX3NldHRpbmdzLmV4dGdsb2IsXG4gICAgICAgICAgICBub2dsb2JzdGFyOiAhdGhpcy5fc2V0dGluZ3MuZ2xvYnN0YXIsXG4gICAgICAgICAgICBwb3NpeDogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdFNsYXNoZXM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jb25zdCBwcm92aWRlcl8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJcIik7XG5jbGFzcyBQcm92aWRlckFzeW5jIGV4dGVuZHMgcHJvdmlkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKChlbnRyeSkgPT4gb3B0aW9ucy50cmFuc2Zvcm0oZW50cnkpKTtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyQXN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBzdHJlYW1fMiA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyU3RyZWFtIGV4dGVuZHMgcHJvdmlkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IHN0cmVhbV8yLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKHRhc2spIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgc3RyZWFtXzEuUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlLCByZWFkOiAoKSA9PiB7IH0gfSk7XG4gICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdlcnJvcicsIGVycm9yKSlcbiAgICAgICAgICAgIC5vbignZGF0YScsIChlbnRyeSkgPT4gZGVzdGluYXRpb24uZW1pdCgnZGF0YScsIG9wdGlvbnMudHJhbnNmb3JtKGVudHJ5KSkpXG4gICAgICAgICAgICAub25jZSgnZW5kJywgKCkgPT4gZGVzdGluYXRpb24uZW1pdCgnZW5kJykpO1xuICAgICAgICBkZXN0aW5hdGlvblxuICAgICAgICAgICAgLm9uY2UoJ2Nsb3NlJywgKCkgPT4gc291cmNlLmRlc3Ryb3koKSk7XG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyU3RyZWFtO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgUmVhZGVyU3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl93YWxrU3luYyA9IGZzV2Fsay53YWxrU3luYztcbiAgICAgICAgdGhpcy5fc3RhdFN5bmMgPSBmc1N0YXQuc3RhdFN5bmM7XG4gICAgfVxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Fsa1N5bmMocm9vdCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSB0aGlzLl9nZXRGdWxsRW50cnlQYXRoKHBhdHRlcm4pO1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IG51bGwgfHwgIW9wdGlvbnMuZW50cnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5fZ2V0U3RhdChmaWxlcGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRTeW5jKGZpbGVwYXRoLCB0aGlzLl9mc1N0YXRTZXR0aW5ncyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyU3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N5bmNcIik7XG5jb25zdCBwcm92aWRlcl8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJcIik7XG5jbGFzcyBQcm92aWRlclN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKHRhc2spIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5hcGkocm9vdCwgdGFzaywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuZHluYW1pYyhyb290LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlclN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIik7XG4vKipcbiAqIFRoZSBgb3MuY3B1c2AgbWV0aG9kIGNhbiByZXR1cm4gemVyby4gV2UgZXhwZWN0IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gYmUgZ3JlYXRlciB0aGFuIHplcm8uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi83ZmFlZGRmMjNhOThjNTM4OTZmOGI1NzRhNmU2NjU4OWU4ZmIxZWI4L2xpYi9vcy5qcyNMMTA2LUwxMDdcbiAqL1xuY29uc3QgQ1BVX0NPVU5UID0gTWF0aC5tYXgob3MuY3B1cygpLmxlbmd0aCwgMSk7XG5leHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmMsXG4gICAgcmVhZGRpcjogZnMucmVhZGRpcixcbiAgICByZWFkZGlyU3luYzogZnMucmVhZGRpclN5bmNcbn07XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuYWJzb2x1dGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmFic29sdXRlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuYmFzZU5hbWVNYXRjaCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYmFzZU5hbWVNYXRjaCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmJyYWNlRXhwYW5zaW9uID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5icmFjZUV4cGFuc2lvbiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZU1hdGNoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2gsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeSwgQ1BVX0NPVU5UKTtcbiAgICAgICAgdGhpcy5jd2QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmN3ZCwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgIHRoaXMuZGVlcCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZGVlcCwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLmRvdCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZG90LCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXh0Z2xvYiA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZXh0Z2xvYiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnMgPSB0aGlzLl9nZXRGaWxlU3lzdGVtTWV0aG9kcyh0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5nbG9ic3RhciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZ2xvYnN0YXIsIHRydWUpO1xuICAgICAgICB0aGlzLmlnbm9yZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuaWdub3JlLCBbXSk7XG4gICAgICAgIHRoaXMubWFya0RpcmVjdG9yaWVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5tYXJrRGlyZWN0b3JpZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vYmplY3RNb2RlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMub25seURpcmVjdG9yaWVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RGlyZWN0b3JpZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vbmx5RmlsZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9ubHlGaWxlcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN0YXRzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NFcnJvcnMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN1cHByZXNzRXJyb3JzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIGZhbHNlKTtcbiAgICAgICAgdGhpcy51bmlxdWUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnVuaXF1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLm9ubHlEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgdGhpcy5vbmx5RmlsZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGF0cykge1xuICAgICAgICAgICAgdGhpcy5vYmplY3RNb2RlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgdGhlIGNhc3QgdG8gdGhlIGFycmF5IGluIHRoZSBuZXh0IG1ham9yICgjNDA0KS5cbiAgICAgICAgdGhpcy5pZ25vcmUgPSBbXS5jb25jYXQodGhpcy5pZ25vcmUpO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG9wdGlvbjtcbiAgICB9XG4gICAgX2dldEZpbGVTeXN0ZW1NZXRob2RzKG1ldGhvZHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiksIG1ldGhvZHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuY29uc3QgdGFza01hbmFnZXIgPSByZXF1aXJlKFwiLi9tYW5hZ2Vycy90YXNrc1wiKTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zdHJlYW1cIik7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5hc3luYyBmdW5jdGlvbiBGYXN0R2xvYihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgY29uc3Qgd29ya3MgPSBnZXRXb3Jrcyhzb3VyY2UsIGFzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwod29ya3MpO1xuICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHJlc3VsdCk7XG59XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc2xpbnQvaXNzdWVzLzYwXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4oZnVuY3Rpb24gKEZhc3RHbG9iKSB7XG4gICAgRmFzdEdsb2IuZ2xvYiA9IEZhc3RHbG9iO1xuICAgIEZhc3RHbG9iLmdsb2JTeW5jID0gc3luYztcbiAgICBGYXN0R2xvYi5nbG9iU3RyZWFtID0gc3RyZWFtO1xuICAgIEZhc3RHbG9iLmFzeW5jID0gRmFzdEdsb2I7XG4gICAgZnVuY3Rpb24gc3luYyhzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3luY18xLmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdXRpbHMuYXJyYXkuZmxhdHRlbih3b3Jrcyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLnN5bmMgPSBzeW5jO1xuICAgIGZ1bmN0aW9uIHN0cmVhbShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3RyZWFtXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc3RyZWFtIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlciBjYW5ub3Qgd29yayB3aXRoIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cbiAgICAgICAgICogVG8gc3VwcG9ydCBhc3luY2hyb25vdXMgaXRlcmF0b3JzLCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgdGFza3MsIHdlIGFsd2F5cyBtdWx0aXBsZXggc3RyZWFtcy5cbiAgICAgICAgICogVGhpcyBhZmZlY3RzIHBlcmZvcm1hbmNlICgrMjUlKS4gSSBkb24ndCBzZWUgYmVzdCBzb2x1dGlvbiByaWdodCBub3cuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdXRpbHMuc3RyZWFtLm1lcmdlKHdvcmtzKTtcbiAgICB9XG4gICAgRmFzdEdsb2Iuc3RyZWFtID0gc3RyZWFtO1xuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFza3Moc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBbXS5jb25jYXQoc291cmNlKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGFza01hbmFnZXIuZ2VuZXJhdGUocGF0dGVybnMsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuZ2VuZXJhdGVUYXNrcyA9IGdlbmVyYXRlVGFza3M7XG4gICAgZnVuY3Rpb24gaXNEeW5hbWljUGF0dGVybihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmlzRHluYW1pY1BhdHRlcm4oc291cmNlLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmlzRHluYW1pY1BhdHRlcm4gPSBpc0R5bmFtaWNQYXR0ZXJuO1xuICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlKHNvdXJjZSk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgIGZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSkge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgbGV0IHBvc2l4O1xuICAgIChmdW5jdGlvbiAocG9zaXgpIHtcbiAgICAgICAgZnVuY3Rpb24gZXNjYXBlUGF0aChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmVzY2FwZVBvc2l4UGF0aChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHBvc2l4LmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgICAgICBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBwb3NpeC5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGNvbnZlcnRQYXRoVG9QYXR0ZXJuO1xuICAgIH0pKHBvc2l4ID0gRmFzdEdsb2IucG9zaXggfHwgKEZhc3RHbG9iLnBvc2l4ID0ge30pKTtcbiAgICBsZXQgd2luMzI7XG4gICAgKGZ1bmN0aW9uICh3aW4zMikge1xuICAgICAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlV2luZG93c1BhdGgoc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB3aW4zMi5lc2NhcGVQYXRoID0gZXNjYXBlUGF0aDtcbiAgICAgICAgZnVuY3Rpb24gY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5jb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB3aW4zMi5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGNvbnZlcnRQYXRoVG9QYXR0ZXJuO1xuICAgIH0pKHdpbjMyID0gRmFzdEdsb2Iud2luMzIgfHwgKEZhc3RHbG9iLndpbjMyID0ge30pKTtcbn0pKEZhc3RHbG9iIHx8IChGYXN0R2xvYiA9IHt9KSk7XG5mdW5jdGlvbiBnZXRXb3Jrcyhzb3VyY2UsIF9Qcm92aWRlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gW10uY29uY2F0KHNvdXJjZSk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgIGNvbnN0IHRhc2tzID0gdGFza01hbmFnZXIuZ2VuZXJhdGUocGF0dGVybnMsIHNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBfUHJvdmlkZXIoc2V0dGluZ3MpO1xuICAgIHJldHVybiB0YXNrcy5tYXAocHJvdmlkZXIucmVhZCwgcHJvdmlkZXIpO1xufVxuZnVuY3Rpb24gYXNzZXJ0UGF0dGVybnNJbnB1dChpbnB1dCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IFtdLmNvbmNhdChpbnB1dCk7XG4gICAgY29uc3QgaXNWYWxpZFNvdXJjZSA9IHNvdXJjZS5ldmVyeSgoaXRlbSkgPT4gdXRpbHMuc3RyaW5nLmlzU3RyaW5nKGl0ZW0pICYmICF1dGlscy5zdHJpbmcuaXNFbXB0eShpdGVtKSk7XG4gICAgaWYgKCFpc1ZhbGlkU291cmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgKG5vbiBlbXB0eSkgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gRmFzdEdsb2I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge3Byb21pc2lmeX0gPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIGlzVHlwZShmc1N0YXRUeXBlLCBzdGF0c01ldGhvZE5hbWUsIGZpbGVQYXRoKSB7XG5cdGlmICh0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiBmaWxlUGF0aH1gKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29uc3Qgc3RhdHMgPSBhd2FpdCBwcm9taXNpZnkoZnNbZnNTdGF0VHlwZV0pKGZpbGVQYXRoKTtcblx0XHRyZXR1cm4gc3RhdHNbc3RhdHNNZXRob2ROYW1lXSgpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRocm93IGVycm9yO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzVHlwZVN5bmMoZnNTdGF0VHlwZSwgc3RhdHNNZXRob2ROYW1lLCBmaWxlUGF0aCkge1xuXHRpZiAodHlwZW9mIGZpbGVQYXRoICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgZmlsZVBhdGh9YCk7XG5cdH1cblxuXHR0cnkge1xuXHRcdHJldHVybiBmc1tmc1N0YXRUeXBlXShmaWxlUGF0aClbc3RhdHNNZXRob2ROYW1lXSgpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRocm93IGVycm9yO1xuXHR9XG59XG5cbmV4cG9ydHMuaXNGaWxlID0gaXNUeXBlLmJpbmQobnVsbCwgJ3N0YXQnLCAnaXNGaWxlJyk7XG5leHBvcnRzLmlzRGlyZWN0b3J5ID0gaXNUeXBlLmJpbmQobnVsbCwgJ3N0YXQnLCAnaXNEaXJlY3RvcnknKTtcbmV4cG9ydHMuaXNTeW1saW5rID0gaXNUeXBlLmJpbmQobnVsbCwgJ2xzdGF0JywgJ2lzU3ltYm9saWNMaW5rJyk7XG5leHBvcnRzLmlzRmlsZVN5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ3N0YXRTeW5jJywgJ2lzRmlsZScpO1xuZXhwb3J0cy5pc0RpcmVjdG9yeVN5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ3N0YXRTeW5jJywgJ2lzRGlyZWN0b3J5Jyk7XG5leHBvcnRzLmlzU3ltbGlua1N5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ2xzdGF0U3luYycsICdpc1N5bWJvbGljTGluaycpO1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBwYXRoVHlwZSA9IHJlcXVpcmUoJ3BhdGgtdHlwZScpO1xuXG5jb25zdCBnZXRFeHRlbnNpb25zID0gZXh0ZW5zaW9ucyA9PiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgeyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fWAgOiBleHRlbnNpb25zWzBdO1xuXG5jb25zdCBnZXRQYXRoID0gKGZpbGVwYXRoLCBjd2QpID0+IHtcblx0Y29uc3QgcHRoID0gZmlsZXBhdGhbMF0gPT09ICchJyA/IGZpbGVwYXRoLnNsaWNlKDEpIDogZmlsZXBhdGg7XG5cdHJldHVybiBwYXRoLmlzQWJzb2x1dGUocHRoKSA/IHB0aCA6IHBhdGguam9pbihjd2QsIHB0aCk7XG59O1xuXG5jb25zdCBhZGRFeHRlbnNpb25zID0gKGZpbGUsIGV4dGVuc2lvbnMpID0+IHtcblx0aWYgKHBhdGguZXh0bmFtZShmaWxlKSkge1xuXHRcdHJldHVybiBgKiovJHtmaWxlfWA7XG5cdH1cblxuXHRyZXR1cm4gYCoqLyR7ZmlsZX0uJHtnZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpfWA7XG59O1xuXG5jb25zdCBnZXRHbG9iID0gKGRpcmVjdG9yeSwgb3B0aW9ucykgPT4ge1xuXHRpZiAob3B0aW9ucy5maWxlcyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbGVzKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGZpbGVzXFxgIHRvIGJlIG9mIHR5cGUgXFxgQXJyYXlcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5maWxlc31cXGBgKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmV4dGVuc2lvbnMgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5leHRlbnNpb25zKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGV4dGVuc2lvbnNcXGAgdG8gYmUgb2YgdHlwZSBcXGBBcnJheVxcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmV4dGVuc2lvbnN9XFxgYCk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5maWxlcyAmJiBvcHRpb25zLmV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5maWxlcy5tYXAoeCA9PiBwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBhZGRFeHRlbnNpb25zKHgsIG9wdGlvbnMuZXh0ZW5zaW9ucykpKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmZpbGVzKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuZmlsZXMubWFwKHggPT4gcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYCoqLyR7eH1gKSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5leHRlbnNpb25zKSB7XG5cdFx0cmV0dXJuIFtwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBgKiovKi4ke2dldEV4dGVuc2lvbnMob3B0aW9ucy5leHRlbnNpb25zKX1gKV07XG5cdH1cblxuXHRyZXR1cm4gW3BhdGgucG9zaXguam9pbihkaXJlY3RvcnksICcqKicpXTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGlucHV0LCBvcHRpb25zKSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Y3dkOiBwcm9jZXNzLmN3ZCgpLFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRpZiAodHlwZW9mIG9wdGlvbnMuY3dkICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGN3ZFxcYCB0byBiZSBvZiB0eXBlIFxcYHN0cmluZ1xcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmN3ZH1cXGBgKTtcblx0fVxuXG5cdGNvbnN0IGdsb2JzID0gYXdhaXQgUHJvbWlzZS5hbGwoW10uY29uY2F0KGlucHV0KS5tYXAoYXN5bmMgeCA9PiB7XG5cdFx0Y29uc3QgaXNEaXJlY3RvcnkgPSBhd2FpdCBwYXRoVHlwZS5pc0RpcmVjdG9yeShnZXRQYXRoKHgsIG9wdGlvbnMuY3dkKSk7XG5cdFx0cmV0dXJuIGlzRGlyZWN0b3J5ID8gZ2V0R2xvYih4LCBvcHRpb25zKSA6IHg7XG5cdH0pKTtcblxuXHRyZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBnbG9icyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZFxufTtcblxubW9kdWxlLmV4cG9ydHMuc3luYyA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdGN3ZDogcHJvY2Vzcy5jd2QoKSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0aWYgKHR5cGVvZiBvcHRpb25zLmN3ZCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjd2RcXGAgdG8gYmUgb2YgdHlwZSBcXGBzdHJpbmdcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5jd2R9XFxgYCk7XG5cdH1cblxuXHRjb25zdCBnbG9icyA9IFtdLmNvbmNhdChpbnB1dCkubWFwKHggPT4gcGF0aFR5cGUuaXNEaXJlY3RvcnlTeW5jKGdldFBhdGgoeCwgb3B0aW9ucy5jd2QpKSA/IGdldEdsb2IoeCwgb3B0aW9ucykgOiB4KTtcblxuXHRyZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBnbG9icyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZFxufTtcbiIsICIvLyBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBtYWtlLWFycmF5XG5mdW5jdGlvbiBtYWtlQXJyYXkgKHN1YmplY3QpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3ViamVjdClcbiAgICA/IHN1YmplY3RcbiAgICA6IFtzdWJqZWN0XVxufVxuXG5jb25zdCBFTVBUWSA9ICcnXG5jb25zdCBTUEFDRSA9ICcgJ1xuY29uc3QgRVNDQVBFID0gJ1xcXFwnXG5jb25zdCBSRUdFWF9URVNUX0JMQU5LX0xJTkUgPSAvXlxccyskL1xuY29uc3QgUkVHRVhfSU5WQUxJRF9UUkFJTElOR19CQUNLU0xBU0ggPSAvKD86W15cXFxcXXxeKVxcXFwkL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04gPSAvXlxcXFwhL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfSEFTSCA9IC9eXFxcXCMvXG5jb25zdCBSRUdFWF9TUExJVEFMTF9DUkxGID0gL1xccj9cXG4vZ1xuLy8gL2Zvbyxcbi8vIC4vZm9vLFxuLy8gLi4vZm9vLFxuLy8gLlxuLy8gLi5cbmNvbnN0IFJFR0VYX1RFU1RfSU5WQUxJRF9QQVRIID0gL15cXC4qXFwvfF5cXC4rJC9cblxuY29uc3QgU0xBU0ggPSAnLydcblxuLy8gRG8gbm90IHVzZSB0ZXJuYXJ5IGV4cHJlc3Npb24gaGVyZSwgc2luY2UgXCJpc3RhbmJ1bCBpZ25vcmUgbmV4dFwiIGlzIGJ1Z2d5XG5sZXQgVE1QX0tFWV9JR05PUkUgPSAnbm9kZS1pZ25vcmUnXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKSB7XG4gIFRNUF9LRVlfSUdOT1JFID0gU3ltYm9sLmZvcignbm9kZS1pZ25vcmUnKVxufVxuY29uc3QgS0VZX0lHTk9SRSA9IFRNUF9LRVlfSUdOT1JFXG5cbmNvbnN0IGRlZmluZSA9IChvYmplY3QsIGtleSwgdmFsdWUpID0+XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge3ZhbHVlfSlcblxuY29uc3QgUkVHRVhfUkVHRVhQX1JBTkdFID0gLyhbMC16XSktKFswLXpdKS9nXG5cbmNvbnN0IFJFVFVSTl9GQUxTRSA9ICgpID0+IGZhbHNlXG5cbi8vIFNhbml0aXplIHRoZSByYW5nZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuLy8gVGhlIGNhc2VzIGFyZSBjb21wbGljYXRlZCwgc2VlIHRlc3QgY2FzZXMgZm9yIGRldGFpbHNcbmNvbnN0IHNhbml0aXplUmFuZ2UgPSByYW5nZSA9PiByYW5nZS5yZXBsYWNlKFxuICBSRUdFWF9SRUdFWFBfUkFOR0UsXG4gIChtYXRjaCwgZnJvbSwgdG8pID0+IGZyb20uY2hhckNvZGVBdCgwKSA8PSB0by5jaGFyQ29kZUF0KDApXG4gICAgPyBtYXRjaFxuICAgIC8vIEludmFsaWQgcmFuZ2UgKG91dCBvZiBvcmRlcikgd2hpY2ggaXMgb2sgZm9yIGdpdGlnbm9yZSBydWxlcyBidXRcbiAgICAvLyAgIGZhdGFsIGZvciBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gZWxpbWluYXRlIGl0LlxuICAgIDogRU1QVFlcbilcblxuLy8gU2VlIGZpeHR1cmVzICM1OVxuY29uc3QgY2xlYW5SYW5nZUJhY2tTbGFzaCA9IHNsYXNoZXMgPT4ge1xuICBjb25zdCB7bGVuZ3RofSA9IHNsYXNoZXNcbiAgcmV0dXJuIHNsYXNoZXMuc2xpY2UoMCwgbGVuZ3RoIC0gbGVuZ3RoICUgMilcbn1cblxuLy8gPiBJZiB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSBzbGFzaCxcbi8vID4gaXQgaXMgcmVtb3ZlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbixcbi8vID4gYnV0IGl0IHdvdWxkIG9ubHkgZmluZCBhIG1hdGNoIHdpdGggYSBkaXJlY3RvcnkuXG4vLyA+IEluIG90aGVyIHdvcmRzLCBmb28vIHdpbGwgbWF0Y2ggYSBkaXJlY3RvcnkgZm9vIGFuZCBwYXRocyB1bmRlcm5lYXRoIGl0LFxuLy8gPiBidXQgd2lsbCBub3QgbWF0Y2ggYSByZWd1bGFyIGZpbGUgb3IgYSBzeW1ib2xpYyBsaW5rIGZvb1xuLy8gPiAgKHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaG93IHBhdGhzcGVjIHdvcmtzIGluIGdlbmVyYWwgaW4gR2l0KS5cbi8vICdgZm9vL2AnIHdpbGwgbm90IG1hdGNoIHJlZ3VsYXIgZmlsZSAnYGZvb2AnIG9yIHN5bWJvbGljIGxpbmsgJ2Bmb29gJ1xuLy8gLT4gaWdub3JlLXJ1bGVzIHdpbGwgbm90IGRlYWwgd2l0aCBpdCwgYmVjYXVzZSBpdCBjb3N0cyBleHRyYSBgZnMuc3RhdGAgY2FsbFxuLy8gICAgICB5b3UgY291bGQgdXNlIG9wdGlvbiBgbWFyazogdHJ1ZWAgd2l0aCBgZ2xvYmBcblxuLy8gJ2Bmb28vYCcgc2hvdWxkIG5vdCBjb250aW51ZSB3aXRoIHRoZSAnYC4uYCdcbmNvbnN0IFJFUExBQ0VSUyA9IFtcblxuICAvLyA+IFRyYWlsaW5nIHNwYWNlcyBhcmUgaWdub3JlZCB1bmxlc3MgdGhleSBhcmUgcXVvdGVkIHdpdGggYmFja3NsYXNoIChcIlxcXCIpXG4gIFtcbiAgICAvLyAoYVxcICkgLT4gKGEgKVxuICAgIC8vIChhICApIC0+IChhKVxuICAgIC8vIChhIFxcICkgLT4gKGEgIClcbiAgICAvXFxcXD9cXHMrJC8sXG4gICAgbWF0Y2ggPT4gbWF0Y2guaW5kZXhPZignXFxcXCcpID09PSAwXG4gICAgICA/IFNQQUNFXG4gICAgICA6IEVNUFRZXG4gIF0sXG5cbiAgLy8gcmVwbGFjZSAoXFwgKSB3aXRoICcgJ1xuICBbXG4gICAgL1xcXFxcXHMvZyxcbiAgICAoKSA9PiBTUEFDRVxuICBdLFxuXG4gIC8vIEVzY2FwZSBtZXRhY2hhcmFjdGVyc1xuICAvLyB3aGljaCBpcyB3cml0dGVuIGRvd24gYnkgdXNlcnMgYnV0IG1lYW5zIHNwZWNpYWwgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cbiAgLy8gPiBUaGVyZSBhcmUgMTIgY2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZ3M6XG4gIC8vID4gLSB0aGUgYmFja3NsYXNoIFxcLFxuICAvLyA+IC0gdGhlIGNhcmV0IF4sXG4gIC8vID4gLSB0aGUgZG9sbGFyIHNpZ24gJCxcbiAgLy8gPiAtIHRoZSBwZXJpb2Qgb3IgZG90IC4sXG4gIC8vID4gLSB0aGUgdmVydGljYWwgYmFyIG9yIHBpcGUgc3ltYm9sIHwsXG4gIC8vID4gLSB0aGUgcXVlc3Rpb24gbWFyayA/LFxuICAvLyA+IC0gdGhlIGFzdGVyaXNrIG9yIHN0YXIgKixcbiAgLy8gPiAtIHRoZSBwbHVzIHNpZ24gKyxcbiAgLy8gPiAtIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzICgsXG4gIC8vID4gLSB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyApLFxuICAvLyA+IC0gYW5kIHRoZSBvcGVuaW5nIHNxdWFyZSBicmFja2V0IFssXG4gIC8vID4gLSB0aGUgb3BlbmluZyBjdXJseSBicmFjZSB7LFxuICAvLyA+IFRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgb2Z0ZW4gY2FsbGVkIFwibWV0YWNoYXJhY3RlcnNcIi5cbiAgW1xuICAgIC9bXFxcXCQufCorKCl7Xl0vZyxcbiAgICBtYXRjaCA9PiBgXFxcXCR7bWF0Y2h9YFxuICBdLFxuXG4gIFtcbiAgICAvLyA+IGEgcXVlc3Rpb24gbWFyayAoPykgbWF0Y2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICAvKD8hXFxcXClcXD8vZyxcbiAgICAoKSA9PiAnW14vXSdcbiAgXSxcblxuICAvLyBsZWFkaW5nIHNsYXNoXG4gIFtcblxuICAgIC8vID4gQSBsZWFkaW5nIHNsYXNoIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aG5hbWUuXG4gICAgLy8gPiBGb3IgZXhhbXBsZSwgXCIvKi5jXCIgbWF0Y2hlcyBcImNhdC1maWxlLmNcIiBidXQgbm90IFwibW96aWxsYS1zaGExL3NoYTEuY1wiLlxuICAgIC8vIEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGhuYW1lXG4gICAgL15cXC8vLFxuICAgICgpID0+ICdeJ1xuICBdLFxuXG4gIC8vIHJlcGxhY2Ugc3BlY2lhbCBtZXRhY2hhcmFjdGVyIHNsYXNoIGFmdGVyIHRoZSBsZWFkaW5nIHNsYXNoXG4gIFtcbiAgICAvXFwvL2csXG4gICAgKCkgPT4gJ1xcXFwvJ1xuICBdLFxuXG4gIFtcbiAgICAvLyA+IEEgbGVhZGluZyBcIioqXCIgZm9sbG93ZWQgYnkgYSBzbGFzaCBtZWFucyBtYXRjaCBpbiBhbGwgZGlyZWN0b3JpZXMuXG4gICAgLy8gPiBGb3IgZXhhbXBsZSwgXCIqKi9mb29cIiBtYXRjaGVzIGZpbGUgb3IgZGlyZWN0b3J5IFwiZm9vXCIgYW55d2hlcmUsXG4gICAgLy8gPiB0aGUgc2FtZSBhcyBwYXR0ZXJuIFwiZm9vXCIuXG4gICAgLy8gPiBcIioqL2Zvby9iYXJcIiBtYXRjaGVzIGZpbGUgb3IgZGlyZWN0b3J5IFwiYmFyXCIgYW55d2hlcmUgdGhhdCBpcyBkaXJlY3RseVxuICAgIC8vID4gICB1bmRlciBkaXJlY3RvcnkgXCJmb29cIi5cbiAgICAvLyBOb3RpY2UgdGhhdCB0aGUgJyoncyBoYXZlIGJlZW4gcmVwbGFjZWQgYXMgJ1xcXFwqJ1xuICAgIC9eXFxeKlxcXFxcXCpcXFxcXFwqXFxcXFxcLy8sXG5cbiAgICAvLyAnKiovZm9vJyA8LT4gJ2ZvbydcbiAgICAoKSA9PiAnXig/Oi4qXFxcXC8pPydcbiAgXSxcblxuICAvLyBzdGFydGluZ1xuICBbXG4gICAgLy8gdGhlcmUgd2lsbCBiZSBubyBsZWFkaW5nICcvJ1xuICAgIC8vICAgKHdoaWNoIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHNlY3Rpb24gXCJsZWFkaW5nIHNsYXNoXCIpXG4gICAgLy8gSWYgc3RhcnRzIHdpdGggJyoqJywgYWRkaW5nIGEgJ14nIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWxzbyB3b3Jrc1xuICAgIC9eKD89W15eXSkvLFxuICAgIGZ1bmN0aW9uIHN0YXJ0aW5nUmVwbGFjZXIgKCkge1xuICAgICAgLy8gSWYgaGFzIGEgc2xhc2ggYC9gIGF0IHRoZSBiZWdpbm5pbmcgb3IgbWlkZGxlXG4gICAgICByZXR1cm4gIS9cXC8oPyEkKS8udGVzdCh0aGlzKVxuICAgICAgICAvLyA+IFByaW9yIHRvIDIuMjIuMVxuICAgICAgICAvLyA+IElmIHRoZSBwYXR0ZXJuIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCAvLFxuICAgICAgICAvLyA+ICAgR2l0IHRyZWF0cyBpdCBhcyBhIHNoZWxsIGdsb2IgcGF0dGVyblxuICAgICAgICAvLyBBY3R1YWxseSwgaWYgdGhlcmUgaXMgb25seSBhIHRyYWlsaW5nIHNsYXNoLFxuICAgICAgICAvLyAgIGdpdCBhbHNvIHRyZWF0cyBpdCBhcyBhIHNoZWxsIGdsb2IgcGF0dGVyblxuXG4gICAgICAgIC8vIEFmdGVyIDIuMjIuMSAoY29tcGF0aWJsZSBidXQgY2xlYXJlcilcbiAgICAgICAgLy8gPiBJZiB0aGVyZSBpcyBhIHNlcGFyYXRvciBhdCB0aGUgYmVnaW5uaW5nIG9yIG1pZGRsZSAob3IgYm90aClcbiAgICAgICAgLy8gPiBvZiB0aGUgcGF0dGVybiwgdGhlbiB0aGUgcGF0dGVybiBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5XG4gICAgICAgIC8vID4gbGV2ZWwgb2YgdGhlIHBhcnRpY3VsYXIgLmdpdGlnbm9yZSBmaWxlIGl0c2VsZi5cbiAgICAgICAgLy8gPiBPdGhlcndpc2UgdGhlIHBhdHRlcm4gbWF5IGFsc28gbWF0Y2ggYXQgYW55IGxldmVsIGJlbG93XG4gICAgICAgIC8vID4gdGhlIC5naXRpZ25vcmUgbGV2ZWwuXG4gICAgICAgID8gJyg/Ol58XFxcXC8pJ1xuXG4gICAgICAgIC8vID4gT3RoZXJ3aXNlLCBHaXQgdHJlYXRzIHRoZSBwYXR0ZXJuIGFzIGEgc2hlbGwgZ2xvYiBzdWl0YWJsZSBmb3JcbiAgICAgICAgLy8gPiAgIGNvbnN1bXB0aW9uIGJ5IGZubWF0Y2goMylcbiAgICAgICAgOiAnXidcbiAgICB9XG4gIF0sXG5cbiAgLy8gdHdvIGdsb2JzdGFyc1xuICBbXG4gICAgLy8gVXNlIGxvb2thaGVhZCBhc3NlcnRpb25zIHNvIHRoYXQgd2UgY291bGQgbWF0Y2ggbW9yZSB0aGFuIG9uZSBgJy8qKidgXG4gICAgL1xcXFxcXC9cXFxcXFwqXFxcXFxcKig/PVxcXFxcXC98JCkvZyxcblxuICAgIC8vIFplcm8sIG9uZSBvciBzZXZlcmFsIGRpcmVjdG9yaWVzXG4gICAgLy8gc2hvdWxkIG5vdCB1c2UgJyonLCBvciBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXh0IHJlcGxhY2VyXG5cbiAgICAvLyBDaGVjayBpZiBpdCBpcyBub3QgdGhlIGxhc3QgYCcvKionYFxuICAgIChfLCBpbmRleCwgc3RyKSA9PiBpbmRleCArIDYgPCBzdHIubGVuZ3RoXG5cbiAgICAgIC8vIGNhc2U6IC8qKi9cbiAgICAgIC8vID4gQSBzbGFzaCBmb2xsb3dlZCBieSB0d28gY29uc2VjdXRpdmUgYXN0ZXJpc2tzIHRoZW4gYSBzbGFzaCBtYXRjaGVzXG4gICAgICAvLyA+ICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzLlxuICAgICAgLy8gPiBGb3IgZXhhbXBsZSwgXCJhLyoqL2JcIiBtYXRjaGVzIFwiYS9iXCIsIFwiYS94L2JcIiwgXCJhL3gveS9iXCIgYW5kIHNvIG9uLlxuICAgICAgLy8gJy8qKi8nXG4gICAgICA/ICcoPzpcXFxcL1teXFxcXC9dKykqJ1xuXG4gICAgICAvLyBjYXNlOiAvKipcbiAgICAgIC8vID4gQSB0cmFpbGluZyBgXCIvKipcImAgbWF0Y2hlcyBldmVyeXRoaW5nIGluc2lkZS5cblxuICAgICAgLy8gIzIxOiBldmVyeXRoaW5nIGluc2lkZSBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBjdXJyZW50IGZvbGRlclxuICAgICAgOiAnXFxcXC8uKydcbiAgXSxcblxuICAvLyBub3JtYWwgaW50ZXJtZWRpYXRlIHdpbGRjYXJkc1xuICBbXG4gICAgLy8gTmV2ZXIgcmVwbGFjZSBlc2NhcGVkICcqJ1xuICAgIC8vIGlnbm9yZSBydWxlICdcXConIHdpbGwgbWF0Y2ggdGhlIHBhdGggJyonXG5cbiAgICAvLyAnYWJjLiovJyAtPiBnb1xuICAgIC8vICdhYmMuKicgIC0+IHNraXAgdGhpcyBydWxlLFxuICAgIC8vICAgIGNveiB0cmFpbGluZyBzaW5nbGUgd2lsZGNhcmQgd2lsbCBiZSBoYW5kZWQgYnkgW3RyYWlsaW5nIHdpbGRjYXJkXVxuICAgIC8oXnxbXlxcXFxdKykoXFxcXFxcKikrKD89LispL2csXG5cbiAgICAvLyAnKi5qcycgbWF0Y2hlcyAnLmpzJ1xuICAgIC8vICcqLmpzJyBkb2Vzbid0IG1hdGNoICdhYmMnXG4gICAgKF8sIHAxLCBwMikgPT4ge1xuICAgICAgLy8gMS5cbiAgICAgIC8vID4gQW4gYXN0ZXJpc2sgXCIqXCIgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYSBzbGFzaC5cbiAgICAgIC8vIDIuXG4gICAgICAvLyA+IE90aGVyIGNvbnNlY3V0aXZlIGFzdGVyaXNrcyBhcmUgY29uc2lkZXJlZCByZWd1bGFyIGFzdGVyaXNrc1xuICAgICAgLy8gPiBhbmQgd2lsbCBtYXRjaCBhY2NvcmRpbmcgdG8gdGhlIHByZXZpb3VzIHJ1bGVzLlxuICAgICAgY29uc3QgdW5lc2NhcGVkID0gcDIucmVwbGFjZSgvXFxcXFxcKi9nLCAnW15cXFxcL10qJylcbiAgICAgIHJldHVybiBwMSArIHVuZXNjYXBlZFxuICAgIH1cbiAgXSxcblxuICBbXG4gICAgLy8gdW5lc2NhcGUsIHJldmVydCBzdGVwIDMgZXhjZXB0IGZvciBiYWNrIHNsYXNoXG4gICAgLy8gRm9yIGV4YW1wbGUsIGlmIGEgdXNlciBlc2NhcGUgYSAnXFxcXConLFxuICAgIC8vIGFmdGVyIHN0ZXAgMywgdGhlIHJlc3VsdCB3aWxsIGJlICdcXFxcXFxcXFxcXFwqJ1xuICAgIC9cXFxcXFxcXFxcXFwoPz1bJC58KisoKXteXSkvZyxcbiAgICAoKSA9PiBFU0NBUEVcbiAgXSxcblxuICBbXG4gICAgLy8gJ1xcXFxcXFxcJyAtPiAnXFxcXCdcbiAgICAvXFxcXFxcXFwvZyxcbiAgICAoKSA9PiBFU0NBUEVcbiAgXSxcblxuICBbXG4gICAgLy8gPiBUaGUgcmFuZ2Ugbm90YXRpb24sIGUuZy4gW2EtekEtWl0sXG4gICAgLy8gPiBjYW4gYmUgdXNlZCB0byBtYXRjaCBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gYSByYW5nZS5cblxuICAgIC8vIGBcXGAgaXMgZXNjYXBlZCBieSBzdGVwIDNcbiAgICAvKFxcXFwpP1xcWyhbXlxcXS9dKj8pKFxcXFwqKSgkfFxcXSkvZyxcbiAgICAobWF0Y2gsIGxlYWRFc2NhcGUsIHJhbmdlLCBlbmRFc2NhcGUsIGNsb3NlKSA9PiBsZWFkRXNjYXBlID09PSBFU0NBUEVcbiAgICAgIC8vICdcXFxcW2Jhcl0nIC0+ICdcXFxcXFxcXFtiYXJcXFxcXSdcbiAgICAgID8gYFxcXFxbJHtyYW5nZX0ke2NsZWFuUmFuZ2VCYWNrU2xhc2goZW5kRXNjYXBlKX0ke2Nsb3NlfWBcbiAgICAgIDogY2xvc2UgPT09ICddJ1xuICAgICAgICA/IGVuZEVzY2FwZS5sZW5ndGggJSAyID09PSAwXG4gICAgICAgICAgLy8gQSBub3JtYWwgY2FzZSwgYW5kIGl0IGlzIGEgcmFuZ2Ugbm90YXRpb25cbiAgICAgICAgICAvLyAnW2Jhcl0nXG4gICAgICAgICAgLy8gJ1tiYXJcXFxcXFxcXF0nXG4gICAgICAgICAgPyBgWyR7c2FuaXRpemVSYW5nZShyYW5nZSl9JHtlbmRFc2NhcGV9XWBcbiAgICAgICAgICAvLyBJbnZhbGlkIHJhbmdlIG5vdGF0b25cbiAgICAgICAgICAvLyAnW2JhclxcXFxdJyAtPiAnW2JhclxcXFxcXFxcXSdcbiAgICAgICAgICA6ICdbXSdcbiAgICAgICAgOiAnW10nXG4gIF0sXG5cbiAgLy8gZW5kaW5nXG4gIFtcbiAgICAvLyAnanMnIHdpbGwgbm90IG1hdGNoICdqcy4nXG4gICAgLy8gJ2FiJyB3aWxsIG5vdCBtYXRjaCAnYWJjJ1xuICAgIC8oPzpbXipdKSQvLFxuXG4gICAgLy8gV1RGIVxuICAgIC8vIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRpZ25vcmVcbiAgICAvLyBjaGFuZ2VzIGluIFsyLjIyLjFdKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRpZ25vcmUvMi4yMi4xKVxuICAgIC8vIHdoaWNoIHJlLWZpeGVzICMyNCwgIzM4XG5cbiAgICAvLyA+IElmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4gdGhlbiB0aGUgcGF0dGVyblxuICAgIC8vID4gd2lsbCBvbmx5IG1hdGNoIGRpcmVjdG9yaWVzLCBvdGhlcndpc2UgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGJvdGhcbiAgICAvLyA+IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy5cblxuICAgIC8vICdqcyonIHdpbGwgbm90IG1hdGNoICdhLmpzJ1xuICAgIC8vICdqcy8nIHdpbGwgbm90IG1hdGNoICdhLmpzJ1xuICAgIC8vICdqcycgd2lsbCBtYXRjaCAnYS5qcycgYW5kICdhLmpzLydcbiAgICBtYXRjaCA9PiAvXFwvJC8udGVzdChtYXRjaClcbiAgICAgIC8vIGZvby8gd2lsbCBub3QgbWF0Y2ggJ2ZvbydcbiAgICAgID8gYCR7bWF0Y2h9JGBcbiAgICAgIC8vIGZvbyBtYXRjaGVzICdmb28nIGFuZCAnZm9vLydcbiAgICAgIDogYCR7bWF0Y2h9KD89JHxcXFxcLyQpYFxuICBdLFxuXG4gIC8vIHRyYWlsaW5nIHdpbGRjYXJkXG4gIFtcbiAgICAvKFxcXnxcXFxcXFwvKT9cXFxcXFwqJC8sXG4gICAgKF8sIHAxKSA9PiB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwMVxuICAgICAgICAvLyAnXFxeJzpcbiAgICAgICAgLy8gJy8qJyBkb2VzIG5vdCBtYXRjaCBFTVBUWVxuICAgICAgICAvLyAnLyonIGRvZXMgbm90IG1hdGNoIGV2ZXJ5dGhpbmdcblxuICAgICAgICAvLyAnXFxcXFxcLyc6XG4gICAgICAgIC8vICdhYmMvKicgZG9lcyBub3QgbWF0Y2ggJ2FiYy8nXG4gICAgICAgID8gYCR7cDF9W14vXStgXG5cbiAgICAgICAgLy8gJ2EqJyBtYXRjaGVzICdhJ1xuICAgICAgICAvLyAnYSonIG1hdGNoZXMgJ2FhJ1xuICAgICAgICA6ICdbXi9dKidcblxuICAgICAgcmV0dXJuIGAke3ByZWZpeH0oPz0kfFxcXFwvJClgXG4gICAgfVxuICBdLFxuXVxuXG4vLyBBIHNpbXBsZSBjYWNoZSwgYmVjYXVzZSBhbiBpZ25vcmUgcnVsZSBvbmx5IGhhcyBvbmx5IG9uZSBjZXJ0YWluIG1lYW5pbmdcbmNvbnN0IHJlZ2V4Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIEBwYXJhbSB7cGF0dGVybn1cbmNvbnN0IG1ha2VSZWdleCA9IChwYXR0ZXJuLCBpZ25vcmVDYXNlKSA9PiB7XG4gIGxldCBzb3VyY2UgPSByZWdleENhY2hlW3BhdHRlcm5dXG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICBzb3VyY2UgPSBSRVBMQUNFUlMucmVkdWNlKFxuICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHByZXYucmVwbGFjZShjdXJyZW50WzBdLCBjdXJyZW50WzFdLmJpbmQocGF0dGVybikpLFxuICAgICAgcGF0dGVyblxuICAgIClcbiAgICByZWdleENhY2hlW3BhdHRlcm5dID0gc291cmNlXG4gIH1cblxuICByZXR1cm4gaWdub3JlQ2FzZVxuICAgID8gbmV3IFJlZ0V4cChzb3VyY2UsICdpJylcbiAgICA6IG5ldyBSZWdFeHAoc291cmNlKVxufVxuXG5jb25zdCBpc1N0cmluZyA9IHN1YmplY3QgPT4gdHlwZW9mIHN1YmplY3QgPT09ICdzdHJpbmcnXG5cbi8vID4gQSBibGFuayBsaW5lIG1hdGNoZXMgbm8gZmlsZXMsIHNvIGl0IGNhbiBzZXJ2ZSBhcyBhIHNlcGFyYXRvciBmb3IgcmVhZGFiaWxpdHkuXG5jb25zdCBjaGVja1BhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm5cbiAgJiYgaXNTdHJpbmcocGF0dGVybilcbiAgJiYgIVJFR0VYX1RFU1RfQkxBTktfTElORS50ZXN0KHBhdHRlcm4pXG4gICYmICFSRUdFWF9JTlZBTElEX1RSQUlMSU5HX0JBQ0tTTEFTSC50ZXN0KHBhdHRlcm4pXG5cbiAgLy8gPiBBIGxpbmUgc3RhcnRpbmcgd2l0aCAjIHNlcnZlcyBhcyBhIGNvbW1lbnQuXG4gICYmIHBhdHRlcm4uaW5kZXhPZignIycpICE9PSAwXG5cbmNvbnN0IHNwbGl0UGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVybi5zcGxpdChSRUdFWF9TUExJVEFMTF9DUkxGKVxuXG5jbGFzcyBJZ25vcmVSdWxlIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIG9yaWdpbixcbiAgICBwYXR0ZXJuLFxuICAgIG5lZ2F0aXZlLFxuICAgIHJlZ2V4XG4gICkge1xuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVyblxuICAgIHRoaXMubmVnYXRpdmUgPSBuZWdhdGl2ZVxuICAgIHRoaXMucmVnZXggPSByZWdleFxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZVJ1bGUgPSAocGF0dGVybiwgaWdub3JlQ2FzZSkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBwYXR0ZXJuXG4gIGxldCBuZWdhdGl2ZSA9IGZhbHNlXG5cbiAgLy8gPiBBbiBvcHRpb25hbCBwcmVmaXggXCIhXCIgd2hpY2ggbmVnYXRlcyB0aGUgcGF0dGVybjtcbiAgaWYgKHBhdHRlcm4uaW5kZXhPZignIScpID09PSAwKSB7XG4gICAgbmVnYXRpdmUgPSB0cnVlXG4gICAgcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyKDEpXG4gIH1cblxuICBwYXR0ZXJuID0gcGF0dGVyblxuICAvLyA+IFB1dCBhIGJhY2tzbGFzaCAoXCJcXFwiKSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgXCIhXCIgZm9yIHBhdHRlcm5zIHRoYXRcbiAgLy8gPiAgIGJlZ2luIHdpdGggYSBsaXRlcmFsIFwiIVwiLCBmb3IgZXhhbXBsZSwgYFwiXFwhaW1wb3J0YW50IS50eHRcImAuXG4gIC5yZXBsYWNlKFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0VYQ0xBTUFUSU9OLCAnIScpXG4gIC8vID4gUHV0IGEgYmFja3NsYXNoIChcIlxcXCIpIGluIGZyb250IG9mIHRoZSBmaXJzdCBoYXNoIGZvciBwYXR0ZXJucyB0aGF0XG4gIC8vID4gICBiZWdpbiB3aXRoIGEgaGFzaC5cbiAgLnJlcGxhY2UoUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfSEFTSCwgJyMnKVxuXG4gIGNvbnN0IHJlZ2V4ID0gbWFrZVJlZ2V4KHBhdHRlcm4sIGlnbm9yZUNhc2UpXG5cbiAgcmV0dXJuIG5ldyBJZ25vcmVSdWxlKFxuICAgIG9yaWdpbixcbiAgICBwYXR0ZXJuLFxuICAgIG5lZ2F0aXZlLFxuICAgIHJlZ2V4XG4gIClcbn1cblxuY29uc3QgdGhyb3dFcnJvciA9IChtZXNzYWdlLCBDdG9yKSA9PiB7XG4gIHRocm93IG5ldyBDdG9yKG1lc3NhZ2UpXG59XG5cbmNvbnN0IGNoZWNrUGF0aCA9IChwYXRoLCBvcmlnaW5hbFBhdGgsIGRvVGhyb3cpID0+IHtcbiAgaWYgKCFpc1N0cmluZyhwYXRoKSkge1xuICAgIHJldHVybiBkb1Rocm93KFxuICAgICAgYHBhdGggbXVzdCBiZSBhIHN0cmluZywgYnV0IGdvdCBcXGAke29yaWdpbmFsUGF0aH1cXGBgLFxuICAgICAgVHlwZUVycm9yXG4gICAgKVxuICB9XG5cbiAgLy8gV2UgZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgaWdub3JlIEVNUFRZLCBzbyB0aHJvd1xuICBpZiAoIXBhdGgpIHtcbiAgICByZXR1cm4gZG9UaHJvdyhgcGF0aCBtdXN0IG5vdCBiZSBlbXB0eWAsIFR5cGVFcnJvcilcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0IGlzIGEgcmVsYXRpdmUgcGF0aFxuICBpZiAoY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUocGF0aCkpIHtcbiAgICBjb25zdCByID0gJ2BwYXRoLnJlbGF0aXZlKClgZCdcbiAgICByZXR1cm4gZG9UaHJvdyhcbiAgICAgIGBwYXRoIHNob3VsZCBiZSBhICR7cn0gc3RyaW5nLCBidXQgZ290IFwiJHtvcmlnaW5hbFBhdGh9XCJgLFxuICAgICAgUmFuZ2VFcnJvclxuICAgIClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IGlzTm90UmVsYXRpdmUgPSBwYXRoID0+IFJFR0VYX1RFU1RfSU5WQUxJRF9QQVRILnRlc3QocGF0aClcblxuY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUgPSBpc05vdFJlbGF0aXZlXG5jaGVja1BhdGguY29udmVydCA9IHAgPT4gcFxuXG5jbGFzcyBJZ25vcmUge1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIGlnbm9yZWNhc2UgPSB0cnVlLFxuICAgIGlnbm9yZUNhc2UgPSBpZ25vcmVjYXNlLFxuICAgIGFsbG93UmVsYXRpdmVQYXRocyA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGRlZmluZSh0aGlzLCBLRVlfSUdOT1JFLCB0cnVlKVxuXG4gICAgdGhpcy5fcnVsZXMgPSBbXVxuICAgIHRoaXMuX2lnbm9yZUNhc2UgPSBpZ25vcmVDYXNlXG4gICAgdGhpcy5fYWxsb3dSZWxhdGl2ZVBhdGhzID0gYWxsb3dSZWxhdGl2ZVBhdGhzXG4gICAgdGhpcy5faW5pdENhY2hlKClcbiAgfVxuXG4gIF9pbml0Q2FjaGUgKCkge1xuICAgIHRoaXMuX2lnbm9yZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuX3Rlc3RDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgfVxuXG4gIF9hZGRQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gICAgLy8gIzMyXG4gICAgaWYgKHBhdHRlcm4gJiYgcGF0dGVybltLRVlfSUdOT1JFXSkge1xuICAgICAgdGhpcy5fcnVsZXMgPSB0aGlzLl9ydWxlcy5jb25jYXQocGF0dGVybi5fcnVsZXMpXG4gICAgICB0aGlzLl9hZGRlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjaGVja1BhdHRlcm4ocGF0dGVybikpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSBjcmVhdGVSdWxlKHBhdHRlcm4sIHRoaXMuX2lnbm9yZUNhc2UpXG4gICAgICB0aGlzLl9hZGRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3J1bGVzLnB1c2gocnVsZSlcbiAgICB9XG4gIH1cblxuICAvLyBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCBzdHJpbmcgfCBJZ25vcmV9IHBhdHRlcm5cbiAgYWRkIChwYXR0ZXJuKSB7XG4gICAgdGhpcy5fYWRkZWQgPSBmYWxzZVxuXG4gICAgbWFrZUFycmF5KFxuICAgICAgaXNTdHJpbmcocGF0dGVybilcbiAgICAgICAgPyBzcGxpdFBhdHRlcm4ocGF0dGVybilcbiAgICAgICAgOiBwYXR0ZXJuXG4gICAgKS5mb3JFYWNoKHRoaXMuX2FkZFBhdHRlcm4sIHRoaXMpXG5cbiAgICAvLyBTb21lIHJ1bGVzIGhhdmUganVzdCBhZGRlZCB0byB0aGUgaWdub3JlLFxuICAgIC8vIG1ha2luZyB0aGUgYmVoYXZpb3IgY2hhbmdlZC5cbiAgICBpZiAodGhpcy5fYWRkZWQpIHtcbiAgICAgIHRoaXMuX2luaXRDYWNoZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIGxlZ2FjeVxuICBhZGRQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKHBhdHRlcm4pXG4gIH1cblxuICAvLyAgICAgICAgICB8ICAgICAgICAgICBpZ25vcmVkIDogdW5pZ25vcmVkXG4gIC8vIG5lZ2F0aXZlIHwgICAwOjAgICB8ICAgMDoxICAgfCAgIDE6MCAgIHwgICAxOjFcbiAgLy8gLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLVxuICAvLyAgICAgMCAgICB8ICBURVNUICAgfCAgVEVTVCAgIHwgIFNLSVAgICB8ICAgIFhcbiAgLy8gICAgIDEgICAgfCAgVEVTVElGIHwgIFNLSVAgICB8ICBURVNUICAgfCAgICBYXG5cbiAgLy8gLSBTS0lQOiBhbHdheXMgc2tpcFxuICAvLyAtIFRFU1Q6IGFsd2F5cyB0ZXN0XG4gIC8vIC0gVEVTVElGOiBvbmx5IHRlc3QgaWYgY2hlY2tVbmlnbm9yZWRcbiAgLy8gLSBYOiB0aGF0IG5ldmVyIGhhcHBlblxuXG4gIC8vIEBwYXJhbSB7Ym9vbGVhbn0gd2hldGhlciBzaG91bGQgY2hlY2sgaWYgdGhlIHBhdGggaXMgdW5pZ25vcmVkLFxuICAvLyAgIHNldHRpbmcgYGNoZWNrVW5pZ25vcmVkYCB0byBgZmFsc2VgIGNvdWxkIHJlZHVjZSBhZGRpdGlvbmFsXG4gIC8vICAgcGF0aCBtYXRjaGluZy5cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH0gdHJ1ZSBpZiBhIGZpbGUgaXMgaWdub3JlZFxuICBfdGVzdE9uZSAocGF0aCwgY2hlY2tVbmlnbm9yZWQpIHtcbiAgICBsZXQgaWdub3JlZCA9IGZhbHNlXG4gICAgbGV0IHVuaWdub3JlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgY29uc3Qge25lZ2F0aXZlfSA9IHJ1bGVcbiAgICAgIGlmIChcbiAgICAgICAgdW5pZ25vcmVkID09PSBuZWdhdGl2ZSAmJiBpZ25vcmVkICE9PSB1bmlnbm9yZWRcbiAgICAgICAgfHwgbmVnYXRpdmUgJiYgIWlnbm9yZWQgJiYgIXVuaWdub3JlZCAmJiAhY2hlY2tVbmlnbm9yZWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2hlZCA9IHJ1bGUucmVnZXgudGVzdChwYXRoKVxuXG4gICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICBpZ25vcmVkID0gIW5lZ2F0aXZlXG4gICAgICAgIHVuaWdub3JlZCA9IG5lZ2F0aXZlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBpZ25vcmVkLFxuICAgICAgdW5pZ25vcmVkXG4gICAgfVxuICB9XG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9XG4gIF90ZXN0IChvcmlnaW5hbFBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKSB7XG4gICAgY29uc3QgcGF0aCA9IG9yaWdpbmFsUGF0aFxuICAgICAgLy8gU3VwcG9ydHMgbnVsbGFibGUgcGF0aFxuICAgICAgJiYgY2hlY2tQYXRoLmNvbnZlcnQob3JpZ2luYWxQYXRoKVxuXG4gICAgY2hlY2tQYXRoKFxuICAgICAgcGF0aCxcbiAgICAgIG9yaWdpbmFsUGF0aCxcbiAgICAgIHRoaXMuX2FsbG93UmVsYXRpdmVQYXRoc1xuICAgICAgICA/IFJFVFVSTl9GQUxTRVxuICAgICAgICA6IHRocm93RXJyb3JcbiAgICApXG5cbiAgICByZXR1cm4gdGhpcy5fdChwYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcylcbiAgfVxuXG4gIF90IChwYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcykge1xuICAgIGlmIChwYXRoIGluIGNhY2hlKSB7XG4gICAgICByZXR1cm4gY2FjaGVbcGF0aF1cbiAgICB9XG5cbiAgICBpZiAoIXNsaWNlcykge1xuICAgICAgLy8gcGF0aC90by9hLmpzXG4gICAgICAvLyBbJ3BhdGgnLCAndG8nLCAnYS5qcyddXG4gICAgICBzbGljZXMgPSBwYXRoLnNwbGl0KFNMQVNIKVxuICAgIH1cblxuICAgIHNsaWNlcy5wb3AoKVxuXG4gICAgLy8gSWYgdGhlIHBhdGggaGFzIG5vIHBhcmVudCBkaXJlY3RvcnksIGp1c3QgdGVzdCBpdFxuICAgIGlmICghc2xpY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhY2hlW3BhdGhdID0gdGhpcy5fdGVzdE9uZShwYXRoLCBjaGVja1VuaWdub3JlZClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl90KFxuICAgICAgc2xpY2VzLmpvaW4oU0xBU0gpICsgU0xBU0gsXG4gICAgICBjYWNoZSxcbiAgICAgIGNoZWNrVW5pZ25vcmVkLFxuICAgICAgc2xpY2VzXG4gICAgKVxuXG4gICAgLy8gSWYgdGhlIHBhdGggY29udGFpbnMgYSBwYXJlbnQgZGlyZWN0b3J5LCBjaGVjayB0aGUgcGFyZW50IGZpcnN0XG4gICAgcmV0dXJuIGNhY2hlW3BhdGhdID0gcGFyZW50Lmlnbm9yZWRcbiAgICAgIC8vID4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlLWluY2x1ZGUgYSBmaWxlIGlmIGEgcGFyZW50IGRpcmVjdG9yeSBvZlxuICAgICAgLy8gPiAgIHRoYXQgZmlsZSBpcyBleGNsdWRlZC5cbiAgICAgID8gcGFyZW50XG4gICAgICA6IHRoaXMuX3Rlc3RPbmUocGF0aCwgY2hlY2tVbmlnbm9yZWQpXG4gIH1cblxuICBpZ25vcmVzIChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3QocGF0aCwgdGhpcy5faWdub3JlQ2FjaGUsIGZhbHNlKS5pZ25vcmVkXG4gIH1cblxuICBjcmVhdGVGaWx0ZXIgKCkge1xuICAgIHJldHVybiBwYXRoID0+ICF0aGlzLmlnbm9yZXMocGF0aClcbiAgfVxuXG4gIGZpbHRlciAocGF0aHMpIHtcbiAgICByZXR1cm4gbWFrZUFycmF5KHBhdGhzKS5maWx0ZXIodGhpcy5jcmVhdGVGaWx0ZXIoKSlcbiAgfVxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fVxuICB0ZXN0IChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3QocGF0aCwgdGhpcy5fdGVzdENhY2hlLCB0cnVlKVxuICB9XG59XG5cbmNvbnN0IGZhY3RvcnkgPSBvcHRpb25zID0+IG5ldyBJZ25vcmUob3B0aW9ucylcblxuY29uc3QgaXNQYXRoVmFsaWQgPSBwYXRoID0+XG4gIGNoZWNrUGF0aChwYXRoICYmIGNoZWNrUGF0aC5jb252ZXJ0KHBhdGgpLCBwYXRoLCBSRVRVUk5fRkFMU0UpXG5cbmZhY3RvcnkuaXNQYXRoVmFsaWQgPSBpc1BhdGhWYWxpZFxuXG4vLyBGaXhlcyB0eXBlc2NyaXB0XG5mYWN0b3J5LmRlZmF1bHQgPSBmYWN0b3J5XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeVxuXG4vLyBXaW5kb3dzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAoXG4gIC8vIERldGVjdCBgcHJvY2Vzc2Agc28gdGhhdCBpdCBjYW4gcnVuIGluIGJyb3dzZXJzLlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCdcbiAgJiYgKFxuICAgIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LklHTk9SRV9URVNUX1dJTjMyXG4gICAgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICApXG4pIHtcbiAgLyogZXNsaW50IG5vLWNvbnRyb2wtcmVnZXg6IFwib2ZmXCIgKi9cbiAgY29uc3QgbWFrZVBvc2l4ID0gc3RyID0+IC9eXFxcXFxcXFxcXD9cXFxcLy50ZXN0KHN0cilcbiAgfHwgL1tcIjw+fFxcdTAwMDAtXFx1MDAxRl0rL3UudGVzdChzdHIpXG4gICAgPyBzdHJcbiAgICA6IHN0ci5yZXBsYWNlKC9cXFxcL2csICcvJylcblxuICBjaGVja1BhdGguY29udmVydCA9IG1ha2VQb3NpeFxuXG4gIC8vICdDOlxcXFxmb28nICAgICA8LSAnQzpcXFxcZm9vJyBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gJ0M6LydcbiAgLy8gJ2Q6XFxcXGZvbydcbiAgY29uc3QgUkVHSVhfSVNfV0lORE9XU19QQVRIX0FCU09MVVRFID0gL15bYS16XTpcXC8vaVxuICBjaGVja1BhdGguaXNOb3RSZWxhdGl2ZSA9IHBhdGggPT5cbiAgICBSRUdJWF9JU19XSU5ET1dTX1BBVEhfQUJTT0xVVEUudGVzdChwYXRoKVxuICAgIHx8IGlzTm90UmVsYXRpdmUocGF0aClcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbGFzaChwYXRoKSB7XG5cdGNvbnN0IGlzRXh0ZW5kZWRMZW5ndGhQYXRoID0gL15cXFxcXFxcXFxcP1xcXFwvLnRlc3QocGF0aCk7XG5cdGNvbnN0IGhhc05vbkFzY2lpID0gL1teXFx1MDAwMC1cXHUwMDgwXSsvLnRlc3QocGF0aCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG5cdGlmIChpc0V4dGVuZGVkTGVuZ3RoUGF0aCB8fCBoYXNOb25Bc2NpaSkge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cblx0cmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuIiwgImltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHtUcmFuc2Zvcm19IGZyb20gJ25vZGU6c3RyZWFtJztcblxuZXhwb3J0IGNvbnN0IHRvUGF0aCA9IHVybE9yUGF0aCA9PiB1cmxPclBhdGggaW5zdGFuY2VvZiBVUkwgPyBmaWxlVVJMVG9QYXRoKHVybE9yUGF0aCkgOiB1cmxPclBhdGg7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuXHRjb25zdHJ1Y3RvcihmaWx0ZXIpIHtcblx0XHRzdXBlcih7XG5cdFx0XHRvYmplY3RNb2RlOiB0cnVlLFxuXHRcdFx0dHJhbnNmb3JtKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuXHRcdFx0XHRjYWxsYmFjayh1bmRlZmluZWQsIGZpbHRlcihkYXRhKSA/IGRhdGEgOiB1bmRlZmluZWQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNOZWdhdGl2ZVBhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm5bMF0gPT09ICchJztcbiIsICJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBmYXN0R2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IGdpdElnbm9yZSBmcm9tICdpZ25vcmUnO1xuaW1wb3J0IHNsYXNoIGZyb20gJ3NsYXNoJztcbmltcG9ydCB7dG9QYXRoLCBpc05lZ2F0aXZlUGF0dGVybn0gZnJvbSAnLi91dGlsaXRpZXMuanMnO1xuXG5jb25zdCBpZ25vcmVGaWxlc0dsb2JPcHRpb25zID0ge1xuXHRpZ25vcmU6IFtcblx0XHQnKiovbm9kZV9tb2R1bGVzJyxcblx0XHQnKiovZmxvdy10eXBlZCcsXG5cdFx0JyoqL2NvdmVyYWdlJyxcblx0XHQnKiovLmdpdCcsXG5cdF0sXG5cdGFic29sdXRlOiB0cnVlLFxuXHRkb3Q6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgR0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4gPSAnKiovLmdpdGlnbm9yZSc7XG5cbmNvbnN0IGFwcGx5QmFzZVRvUGF0dGVybiA9IChwYXR0ZXJuLCBiYXNlKSA9PiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKVxuXHQ/ICchJyArIHBhdGgucG9zaXguam9pbihiYXNlLCBwYXR0ZXJuLnNsaWNlKDEpKVxuXHQ6IHBhdGgucG9zaXguam9pbihiYXNlLCBwYXR0ZXJuKTtcblxuY29uc3QgcGFyc2VJZ25vcmVGaWxlID0gKGZpbGUsIGN3ZCkgPT4ge1xuXHRjb25zdCBiYXNlID0gc2xhc2gocGF0aC5yZWxhdGl2ZShjd2QsIHBhdGguZGlybmFtZShmaWxlLmZpbGVQYXRoKSkpO1xuXG5cdHJldHVybiBmaWxlLmNvbnRlbnRcblx0XHQuc3BsaXQoL1xccj9cXG4vKVxuXHRcdC5maWx0ZXIobGluZSA9PiBsaW5lICYmICFsaW5lLnN0YXJ0c1dpdGgoJyMnKSlcblx0XHQubWFwKHBhdHRlcm4gPT4gYXBwbHlCYXNlVG9QYXR0ZXJuKHBhdHRlcm4sIGJhc2UpKTtcbn07XG5cbmNvbnN0IHRvUmVsYXRpdmVQYXRoID0gKGZpbGVPckRpcmVjdG9yeSwgY3dkKSA9PiB7XG5cdGN3ZCA9IHNsYXNoKGN3ZCk7XG5cdGlmIChwYXRoLmlzQWJzb2x1dGUoZmlsZU9yRGlyZWN0b3J5KSkge1xuXHRcdGlmIChzbGFzaChmaWxlT3JEaXJlY3RvcnkpLnN0YXJ0c1dpdGgoY3dkKSkge1xuXHRcdFx0cmV0dXJuIHBhdGgucmVsYXRpdmUoY3dkLCBmaWxlT3JEaXJlY3RvcnkpO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgUGF0aCAke2ZpbGVPckRpcmVjdG9yeX0gaXMgbm90IGluIGN3ZCAke2N3ZH1gKTtcblx0fVxuXG5cdHJldHVybiBmaWxlT3JEaXJlY3Rvcnk7XG59O1xuXG5jb25zdCBnZXRJc0lnbm9yZWRQcmVkaWNhdGUgPSAoZmlsZXMsIGN3ZCkgPT4ge1xuXHRjb25zdCBwYXR0ZXJucyA9IGZpbGVzLmZsYXRNYXAoZmlsZSA9PiBwYXJzZUlnbm9yZUZpbGUoZmlsZSwgY3dkKSk7XG5cdGNvbnN0IGlnbm9yZXMgPSBnaXRJZ25vcmUoKS5hZGQocGF0dGVybnMpO1xuXG5cdHJldHVybiBmaWxlT3JEaXJlY3RvcnkgPT4ge1xuXHRcdGZpbGVPckRpcmVjdG9yeSA9IHRvUGF0aChmaWxlT3JEaXJlY3RvcnkpO1xuXHRcdGZpbGVPckRpcmVjdG9yeSA9IHRvUmVsYXRpdmVQYXRoKGZpbGVPckRpcmVjdG9yeSwgY3dkKTtcblx0XHRyZXR1cm4gZmlsZU9yRGlyZWN0b3J5ID8gaWdub3Jlcy5pZ25vcmVzKHNsYXNoKGZpbGVPckRpcmVjdG9yeSkpIDogZmFsc2U7XG5cdH07XG59O1xuXG5jb25zdCBub3JtYWxpemVPcHRpb25zID0gKG9wdGlvbnMgPSB7fSkgPT4gKHtcblx0Y3dkOiB0b1BhdGgob3B0aW9ucy5jd2QpIHx8IHByb2Nlc3MuY3dkKCksXG5cdHN1cHByZXNzRXJyb3JzOiBCb29sZWFuKG9wdGlvbnMuc3VwcHJlc3NFcnJvcnMpLFxuXHRkZWVwOiB0eXBlb2Ygb3B0aW9ucy5kZWVwID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZGVlcCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyA9IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB7Y3dkLCBzdXBwcmVzc0Vycm9ycywgZGVlcH0gPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gYXdhaXQgZmFzdEdsb2IocGF0dGVybnMsIHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwLCAuLi5pZ25vcmVGaWxlc0dsb2JPcHRpb25zfSk7XG5cblx0Y29uc3QgZmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRwYXRocy5tYXAoYXN5bmMgZmlsZVBhdGggPT4gKHtcblx0XHRcdGZpbGVQYXRoLFxuXHRcdFx0Y29udGVudDogYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JyksXG5cdFx0fSkpLFxuXHQpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkaWNhdGUoZmlsZXMsIGN3ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3Qge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXB9ID0gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKTtcblxuXHRjb25zdCBwYXRocyA9IGZhc3RHbG9iLnN5bmMocGF0dGVybnMsIHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwLCAuLi5pZ25vcmVGaWxlc0dsb2JPcHRpb25zfSk7XG5cblx0Y29uc3QgZmlsZXMgPSBwYXRocy5tYXAoZmlsZVBhdGggPT4gKHtcblx0XHRmaWxlUGF0aCxcblx0XHRjb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JyksXG5cdH0pKTtcblxuXHRyZXR1cm4gZ2V0SXNJZ25vcmVkUHJlZGljYXRlKGZpbGVzLCBjd2QpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR2l0SWdub3JlZCA9IG9wdGlvbnMgPT4gaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyhHSVRJR05PUkVfRklMRVNfUEFUVEVSTiwgb3B0aW9ucyk7XG5leHBvcnQgY29uc3QgaXNHaXRJZ25vcmVkU3luYyA9IG9wdGlvbnMgPT4gaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMoR0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4sIG9wdGlvbnMpO1xuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBub2RlUGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IG1lcmdlMiBmcm9tICdtZXJnZTInO1xuaW1wb3J0IGZhc3RHbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZGlyR2xvYiBmcm9tICdkaXItZ2xvYic7XG5pbXBvcnQge1xuXHRHSVRJR05PUkVfRklMRVNfUEFUVEVSTixcblx0aXNJZ25vcmVkQnlJZ25vcmVGaWxlcyxcblx0aXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMsXG59IGZyb20gJy4vaWdub3JlLmpzJztcbmltcG9ydCB7RmlsdGVyU3RyZWFtLCB0b1BhdGgsIGlzTmVnYXRpdmVQYXR0ZXJufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IGFzc2VydFBhdHRlcm5zSW5wdXQgPSBwYXR0ZXJucyA9PiB7XG5cdGlmIChwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gdHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuXHR9XG59O1xuXG5jb25zdCB0b1BhdHRlcm5zQXJyYXkgPSBwYXR0ZXJucyA9PiB7XG5cdHBhdHRlcm5zID0gWy4uLm5ldyBTZXQoW3BhdHRlcm5zXS5mbGF0KCkpXTtcblx0YXNzZXJ0UGF0dGVybnNJbnB1dChwYXR0ZXJucyk7XG5cdHJldHVybiBwYXR0ZXJucztcbn07XG5cbmNvbnN0IGNoZWNrQ3dkT3B0aW9uID0gb3B0aW9ucyA9PiB7XG5cdGlmICghb3B0aW9ucy5jd2QpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgc3RhdDtcblx0dHJ5IHtcblx0XHRzdGF0ID0gZnMuc3RhdFN5bmMob3B0aW9ucy5jd2QpO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoIXN0YXQuaXNEaXJlY3RvcnkoKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBjd2RgIG9wdGlvbiBtdXN0IGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeScpO1xuXHR9XG59O1xuXG5jb25zdCBub3JtYWxpemVPcHRpb25zID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0aWdub3JlOiBvcHRpb25zLmlnbm9yZSB8fCBbXSxcblx0XHRleHBhbmREaXJlY3Rvcmllczogb3B0aW9ucy5leHBhbmREaXJlY3RvcmllcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogb3B0aW9ucy5leHBhbmREaXJlY3Rvcmllcyxcblx0XHRjd2Q6IHRvUGF0aChvcHRpb25zLmN3ZCksXG5cdH07XG5cblx0Y2hlY2tDd2RPcHRpb24ob3B0aW9ucyk7XG5cblx0cmV0dXJuIG9wdGlvbnM7XG59O1xuXG5jb25zdCBub3JtYWxpemVBcmd1bWVudHMgPSBmbiA9PiBhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IGZuKHRvUGF0dGVybnNBcnJheShwYXR0ZXJucyksIG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucykpO1xuY29uc3Qgbm9ybWFsaXplQXJndW1lbnRzU3luYyA9IGZuID0+IChwYXR0ZXJucywgb3B0aW9ucykgPT4gZm4odG9QYXR0ZXJuc0FycmF5KHBhdHRlcm5zKSwgbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKSk7XG5cbmNvbnN0IGdldElnbm9yZUZpbGVzUGF0dGVybnMgPSBvcHRpb25zID0+IHtcblx0Y29uc3Qge2lnbm9yZUZpbGVzLCBnaXRpZ25vcmV9ID0gb3B0aW9ucztcblxuXHRjb25zdCBwYXR0ZXJucyA9IGlnbm9yZUZpbGVzID8gdG9QYXR0ZXJuc0FycmF5KGlnbm9yZUZpbGVzKSA6IFtdO1xuXHRpZiAoZ2l0aWdub3JlKSB7XG5cdFx0cGF0dGVybnMucHVzaChHSVRJR05PUkVfRklMRVNfUEFUVEVSTik7XG5cdH1cblxuXHRyZXR1cm4gcGF0dGVybnM7XG59O1xuXG5jb25zdCBnZXRGaWx0ZXIgPSBhc3luYyBvcHRpb25zID0+IHtcblx0Y29uc3QgaWdub3JlRmlsZXNQYXR0ZXJucyA9IGdldElnbm9yZUZpbGVzUGF0dGVybnMob3B0aW9ucyk7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJGdW5jdGlvbihcblx0XHRpZ25vcmVGaWxlc1BhdHRlcm5zLmxlbmd0aCA+IDAgJiYgYXdhaXQgaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyhpZ25vcmVGaWxlc1BhdHRlcm5zLCBvcHRpb25zKSxcblx0KTtcbn07XG5cbmNvbnN0IGdldEZpbHRlclN5bmMgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgaWdub3JlRmlsZXNQYXR0ZXJucyA9IGdldElnbm9yZUZpbGVzUGF0dGVybnMob3B0aW9ucyk7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJGdW5jdGlvbihcblx0XHRpZ25vcmVGaWxlc1BhdHRlcm5zLmxlbmd0aCA+IDAgJiYgaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMoaWdub3JlRmlsZXNQYXR0ZXJucywgb3B0aW9ucyksXG5cdCk7XG59O1xuXG5jb25zdCBjcmVhdGVGaWx0ZXJGdW5jdGlvbiA9IGlzSWdub3JlZCA9PiB7XG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG5cblx0cmV0dXJuIGZhc3RHbG9iUmVzdWx0ID0+IHtcblx0XHRjb25zdCBwYXRoID0gZmFzdEdsb2JSZXN1bHQucGF0aCB8fCBmYXN0R2xvYlJlc3VsdDtcblx0XHRjb25zdCBwYXRoS2V5ID0gbm9kZVBhdGgubm9ybWFsaXplKHBhdGgpO1xuXHRcdGNvbnN0IHNlZW5Pcklnbm9yZWQgPSBzZWVuLmhhcyhwYXRoS2V5KSB8fCAoaXNJZ25vcmVkICYmIGlzSWdub3JlZChwYXRoKSk7XG5cdFx0c2Vlbi5hZGQocGF0aEtleSk7XG5cdFx0cmV0dXJuICFzZWVuT3JJZ25vcmVkO1xuXHR9O1xufTtcblxuY29uc3QgdW5pb25GYXN0R2xvYlJlc3VsdHMgPSAocmVzdWx0cywgZmlsdGVyKSA9PiByZXN1bHRzLmZsYXQoKS5maWx0ZXIoZmFzdEdsb2JSZXN1bHQgPT4gZmlsdGVyKGZhc3RHbG9iUmVzdWx0KSk7XG5jb25zdCB1bmlvbkZhc3RHbG9iU3RyZWFtcyA9IChzdHJlYW1zLCBmaWx0ZXIpID0+IG1lcmdlMihzdHJlYW1zKS5waXBlKG5ldyBGaWx0ZXJTdHJlYW0oZmFzdEdsb2JSZXN1bHQgPT4gZmlsdGVyKGZhc3RHbG9iUmVzdWx0KSkpO1xuXG5jb25zdCBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXNrcyA9IFtdO1xuXG5cdHdoaWxlIChwYXR0ZXJucy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBwYXR0ZXJucy5maW5kSW5kZXgocGF0dGVybiA9PiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSk7XG5cblx0XHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHtwYXR0ZXJucywgb3B0aW9uc30pO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaWdub3JlUGF0dGVybiA9IHBhdHRlcm5zW2luZGV4XS5zbGljZSgxKTtcblxuXHRcdGZvciAoY29uc3QgdGFzayBvZiB0YXNrcykge1xuXHRcdFx0dGFzay5vcHRpb25zLmlnbm9yZS5wdXNoKGlnbm9yZVBhdHRlcm4pO1xuXHRcdH1cblxuXHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0dGFza3MucHVzaCh7XG5cdFx0XHRcdHBhdHRlcm5zOiBwYXR0ZXJucy5zbGljZSgwLCBpbmRleCksXG5cdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0XHRcdGlnbm9yZTogW1xuXHRcdFx0XHRcdFx0Li4ub3B0aW9ucy5pZ25vcmUsXG5cdFx0XHRcdFx0XHRpZ25vcmVQYXR0ZXJuLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRwYXR0ZXJucyA9IHBhdHRlcm5zLnNsaWNlKGluZGV4ICsgMSk7XG5cdH1cblxuXHRyZXR1cm4gdGFza3M7XG59O1xuXG5jb25zdCBnZXREaXJHbG9iT3B0aW9ucyA9IChvcHRpb25zLCBjd2QpID0+ICh7XG5cdC4uLihjd2QgPyB7Y3dkfSA6IHt9KSxcblx0Li4uKEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyB7ZmlsZXM6IG9wdGlvbnN9IDogb3B0aW9ucyksXG59KTtcblxuY29uc3QgZ2VuZXJhdGVUYXNrcyA9IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBnbG9iVGFza3MgPSBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cblx0Y29uc3Qge2N3ZCwgZXhwYW5kRGlyZWN0b3JpZXN9ID0gb3B0aW9ucztcblxuXHRpZiAoIWV4cGFuZERpcmVjdG9yaWVzKSB7XG5cdFx0cmV0dXJuIGdsb2JUYXNrcztcblx0fVxuXG5cdGNvbnN0IHBhdHRlcm5FeHBhbmRPcHRpb25zID0gZ2V0RGlyR2xvYk9wdGlvbnMoZXhwYW5kRGlyZWN0b3JpZXMsIGN3ZCk7XG5cdGNvbnN0IGlnbm9yZUV4cGFuZE9wdGlvbnMgPSBjd2QgPyB7Y3dkfSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0Z2xvYlRhc2tzLm1hcChhc3luYyB0YXNrID0+IHtcblx0XHRcdGxldCB7cGF0dGVybnMsIG9wdGlvbnN9ID0gdGFzaztcblxuXHRcdFx0W1xuXHRcdFx0XHRwYXR0ZXJucyxcblx0XHRcdFx0b3B0aW9ucy5pZ25vcmUsXG5cdFx0XHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdFx0XHRkaXJHbG9iKHBhdHRlcm5zLCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyksXG5cdFx0XHRcdGRpckdsb2Iob3B0aW9ucy5pZ25vcmUsIGlnbm9yZUV4cGFuZE9wdGlvbnMpLFxuXHRcdFx0XSk7XG5cblx0XHRcdHJldHVybiB7cGF0dGVybnMsIG9wdGlvbnN9O1xuXHRcdH0pLFxuXHQpO1xufTtcblxuY29uc3QgZ2VuZXJhdGVUYXNrc1N5bmMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgZ2xvYlRhc2tzID0gY29udmVydE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMsIG9wdGlvbnMpO1xuXG5cdGNvbnN0IHtjd2QsIGV4cGFuZERpcmVjdG9yaWVzfSA9IG9wdGlvbnM7XG5cblx0aWYgKCFleHBhbmREaXJlY3Rvcmllcykge1xuXHRcdHJldHVybiBnbG9iVGFza3M7XG5cdH1cblxuXHRjb25zdCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyA9IGdldERpckdsb2JPcHRpb25zKGV4cGFuZERpcmVjdG9yaWVzLCBjd2QpO1xuXHRjb25zdCBpZ25vcmVFeHBhbmRPcHRpb25zID0gY3dkID8ge2N3ZH0gOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIGdsb2JUYXNrcy5tYXAodGFzayA9PiB7XG5cdFx0bGV0IHtwYXR0ZXJucywgb3B0aW9uc30gPSB0YXNrO1xuXHRcdHBhdHRlcm5zID0gZGlyR2xvYi5zeW5jKHBhdHRlcm5zLCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyk7XG5cdFx0b3B0aW9ucy5pZ25vcmUgPSBkaXJHbG9iLnN5bmMob3B0aW9ucy5pZ25vcmUsIGlnbm9yZUV4cGFuZE9wdGlvbnMpO1xuXHRcdHJldHVybiB7cGF0dGVybnMsIG9wdGlvbnN9O1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnbG9iYnkgPSBub3JtYWxpemVBcmd1bWVudHMoYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IFtcblx0XHR0YXNrcyxcblx0XHRmaWx0ZXIsXG5cdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0Z2VuZXJhdGVUYXNrcyhwYXR0ZXJucywgb3B0aW9ucyksXG5cdFx0Z2V0RmlsdGVyKG9wdGlvbnMpLFxuXHRdKTtcblx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iKHRhc2sucGF0dGVybnMsIHRhc2sub3B0aW9ucykpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlJlc3VsdHMocmVzdWx0cywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2xvYmJ5U3luYyA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhc2tzID0gZ2VuZXJhdGVUYXNrc1N5bmMocGF0dGVybnMsIG9wdGlvbnMpO1xuXHRjb25zdCBmaWx0ZXIgPSBnZXRGaWx0ZXJTeW5jKG9wdGlvbnMpO1xuXHRjb25zdCByZXN1bHRzID0gdGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2Iuc3luYyh0YXNrLnBhdHRlcm5zLCB0YXNrLm9wdGlvbnMpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlJlc3VsdHMocmVzdWx0cywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2xvYmJ5U3RyZWFtID0gbm9ybWFsaXplQXJndW1lbnRzU3luYygocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFza3MgPSBnZW5lcmF0ZVRhc2tzU3luYyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cdGNvbnN0IGZpbHRlciA9IGdldEZpbHRlclN5bmMob3B0aW9ucyk7XG5cdGNvbnN0IHN0cmVhbXMgPSB0YXNrcy5tYXAodGFzayA9PiBmYXN0R2xvYi5zdHJlYW0odGFzay5wYXR0ZXJucywgdGFzay5vcHRpb25zKSk7XG5cblx0cmV0dXJuIHVuaW9uRmFzdEdsb2JTdHJlYW1zKHN0cmVhbXMsIGZpbHRlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IGlzRHluYW1pY1BhdHRlcm4gPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKFxuXHQocGF0dGVybnMsIG9wdGlvbnMpID0+IHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBmYXN0R2xvYi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdsb2JUYXNrcyA9IG5vcm1hbGl6ZUFyZ3VtZW50cyhnZW5lcmF0ZVRhc2tzKTtcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdsb2JUYXNrc1N5bmMgPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKGdlbmVyYXRlVGFza3NTeW5jKTtcblxuZXhwb3J0IHtcblx0aXNHaXRJZ25vcmVkLFxuXHRpc0dpdElnbm9yZWRTeW5jLFxufSBmcm9tICcuL2lnbm9yZS5qcyc7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuaW1wb3J0IHsgZ2V0VHlwZU5hbWUgfSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnbG9iYWxTY2hlbWFzKSkge1xuICAgIGlmIChrZXkgPT09IFwiYmF0Y2hcIikge1xuICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIGdsb2JhbFNjaGVtYXMpXG4gICAgICBnbG9iYWxTY2hlbWFzW2tleV0gPSBzY2hlbWFXaXRoUmVmZXJlbmNlc1xuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIE9wZW5BUEkgc3BlY1xuICBjb25zdCBidWlsZGVyID0gT3BlbkFwaUJ1aWxkZXIuY3JlYXRlKHtcbiAgICBvcGVuYXBpOiBcIjMuMC4wXCIsXG4gICAgaW5mbzoge1xuICAgICAgdGl0bGU6IGdsb2JhbFNldHVwUGFyYW1zLmFwaU5hbWUsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgfSxcbiAgICBzZXJ2ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIHVybDogZ2xvYmFsU2V0dXBQYXJhbXMucHJvZHVjdGlvblNlcnZlclVybCB8fCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0YWdzOiB0YWdzLm1hcCgodGFnKSA9PiAoeyBuYW1lOiB0YWcubmFtZSwgZGVzY3JpcHRpb246IHRhZy5kZXNjcmlwdGlvbiB9KSksXG4gICAgcGF0aHM6IHt9LFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lcyxcbiAgICAgIHNjaGVtYXM6IGdsb2JhbFNjaGVtYXMsXG4gICAgfSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IFtcbiAgICBmaWxlX3BhdGgsXG4gICAgeyBzZXR1cFBhcmFtcywgcm91dGVTcGVjLCByb3V0ZTogcm91dGVQYXRoIH0sXG4gIF0gb2YgZmlsZXBhdGhUb1JvdXRlRm4pIHtcbiAgICBjb25zdCBtZXRob2RzID0gcm91dGVTcGVjLm1ldGhvZHNcbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3QgbWV0aG9kUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25PYmplY3Q+ID0ge31cblxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGlzUG9zdE9yUHV0T3JQYXRjaCA9IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJQQVRDSFwiXS5pbmNsdWRlcyhtZXRob2QpXG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICAgbGV0IGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgICBpZiAocm91dGVTcGVjLmpzb25Cb2R5ICYmIHJvdXRlU3BlYy5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IChcbiAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uQm9keSBhcyB6LlpvZE9iamVjdDxhbnk+XG4gICAgICAgICAgKS5tZXJnZShyb3V0ZVNwZWMuY29tbW9uUGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT4pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5XG4gICAgICB9XG5cbiAgICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPVxuICAgICAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gKFxuICAgICAgICAgICAgcm91dGVTcGVjLnF1ZXJ5UGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT5cbiAgICAgICAgICApLm1lcmdlKHJvdXRlU3BlYy5jb21tb25QYXJhbXMgYXMgei5ab2RPYmplY3Q8YW55PilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgICAuLi5yb3V0ZVNwZWMub3BlbkFwaU1ldGFkYXRhLFxuICAgICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgICBzdW1tYXJ5OiByb3V0ZVBhdGgsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgICl9YCxcbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCYWQgUmVxdWVzdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAxOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eTogQXJyYXkuaXNBcnJheShyb3V0ZVNwZWMuYXV0aClcbiAgICAgICAgICA/IHJvdXRlU3BlYy5hdXRoXG4gICAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICA6IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW3JvdXRlU3BlYy5hdXRoXSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIHJvdXRlLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogZ2VuZXJhdGVTY2hlbWEoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpXG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlck9iamVjdFtdID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICBzY2hlbWEucHJvcGVydGllcyBhcyBhbnlcbiAgICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEucHJvcGVydGllcyFbbmFtZV0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKG5hbWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByb3V0ZS5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsganNvblJlc3BvbnNlIH0gPSByb3V0ZVNwZWNcbiAgICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZVR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoanNvblJlc3BvbnNlKVxuICAgICAgICBpZiAoanNvblJlc3BvbnNlVHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoXG4gICAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgID8ganNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgOiBqc29uUmVzcG9uc2VcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYVdpdGhSZWZlcmVuY2VzID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKFxuICAgICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChyb3V0ZS5yZXNwb25zZXMgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBub3QgaGFyZGNvZGUgMjAwIGhlcmVcbiAgICAgICAgICByb3V0ZS5yZXNwb25zZXNbMjAwXS5jb250ZW50ID0ge1xuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgICBtZXRob2RzOiBbbWV0aG9kXSwgLy8gT25seSBwYXNzIHRoaXMgc3BlY2lmaWMgbWV0aG9kXG4gICAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgICAgc2RrUmV0dXJuVmFsdWU6XG4gICAgICAgICAgZGVzY3JpcHRpb25NZXRhZGF0YT8ucmVzcG9uc2Vfa2V5ID8/IHJvdXRlU3BlYy5zZGtSZXR1cm5WYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGUsIG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdKVxuICAgICAgbWV0aG9kUm91dGVzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IHJvdXRlXG4gICAgfVxuXG4gICAgYnVpbGRlci5hZGRQYXRoKHJvdXRlUGF0aCwgbWV0aG9kUm91dGVzKVxuICB9XG5cbiAgaWYgKG91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMikpXG4gIH1cblxuICByZXR1cm4gYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMilcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFJvdXRlU3BlYywgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zXG4gIHJvdXRlU3BlYzogUm91dGVTcGVjXG4gIHJvdXRlRm46IEZ1bmN0aW9uXG4gIHJvdXRlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUm91dGVzSW5QYWNrYWdlID0gYXN5bmMgKG9wdHM6IHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4+ID0+IHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgZ2xvYmJ5ID0gKGF3YWl0IGltcG9ydChcImdsb2JieVwiKSkuZ2xvYmJ5XG4gIGNvbnN0IHtcbiAgICBwYWNrYWdlRGlyLFxuICAgIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIixcbiAgICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlID0gZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUob3B0cy5hcGlQcmVmaXgpLFxuICB9ID0gb3B0c1xuICAvLyBMb2FkIGFsbCByb3V0ZSBzcGVjc1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG4gIGNvbnNvbGUubG9nKGBzZWFyY2hpbmcgXCIke2Z1bGxQYXRoR2xvYn1cIi4uLmApXG4gIGNvbnN0IGZpbGVwYXRocyA9IGF3YWl0IGdsb2JieShgJHtmdWxsUGF0aEdsb2J9YClcbiAgY29uc29sZS5sb2coYGZvdW5kICR7ZmlsZXBhdGhzLmxlbmd0aH0gZmlsZXNgKVxuICBpZiAoZmlsZXBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZXMgZm91bmQgYXQgXCIke2Z1bGxQYXRoR2xvYn1cImApXG4gIH1cbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlRm4gPSBuZXcgTWFwPHN0cmluZywgUm91dGVJbmZvPigpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXBhdGhzLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiByb3V0ZUZuIH0gPSBhd2FpdCByZXF1aXJlKHBhdGgucmVzb2x2ZShwKSlcblxuICAgICAgaWYgKHJvdXRlRm4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJvdXRlRm4uX3JvdXRlU3BlYz8uZXhjbHVkZUZyb21PcGVuQXBpICYmXG4gICAgICAgICAgIW9wdHMuaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlc1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH0gYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQgZnJvbSBPcGVuQVBJIGdlbmVyYXRpb25cImBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZUZuLl9zZXR1cFBhcmFtcykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfVwiIGJlY2F1c2UgaXQgd2Fzbid0IGNyZWF0ZWQgd2l0aCB3aXRoUm91dGVTcGVjYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmaWxlcGF0aFRvUm91dGVGbi5zZXQocCwge1xuICAgICAgICAgIHNldHVwUGFyYW1zOiByb3V0ZUZuLl9zZXR1cFBhcmFtcyxcbiAgICAgICAgICByb3V0ZVNwZWM6IHJvdXRlRm4uX3JvdXRlU3BlYyxcbiAgICAgICAgICByb3V0ZTogbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShwKSxcbiAgICAgICAgICByb3V0ZUZuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgQ291bGRuJ3QgZmluZCByb3V0ZSAke3B9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIHJldHVybiBmaWxlcGF0aFRvUm91dGVGblxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlID1cbiAgKGFwaV9wcmVmaXg6IHN0cmluZyA9IFwiL2FwaVwiKSA9PlxuICAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb3V0ZSA9IGZpbGVfcGF0aFxuICAgICAgLy8gcmVwbGFjZSAuLyBpZiBpdCBzdGFydHMgd2l0aCAuL1xuICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCBcIi9cIilcbiAgICAgIC8vIHJlcGxhY2Ugc3RhcnRpbmcgL1xuICAgICAgLnJlcGxhY2UoL15cXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvc3JjIGlmIGl0IHN0YXJ0cyB3aXRoIC9zcmNcbiAgICAgIC5yZXBsYWNlKC9ec3JjXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3BhZ2VzIGlmIGl0IHN0YXJ0cyB3aXRoIC9wYWdlc1xuICAgICAgLnJlcGxhY2UoL15wYWdlc1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9hcGkgaWYgaXQgc3RhcnRzIHdpdGggL2FwaVxuICAgICAgLnJlcGxhY2UoL15hcGlcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAudHMgaWYgaXQgZW5kcyB3aXRoIC50c1xuICAgICAgLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpXG4gICAgICAvLyByZW1vdmUgcHVibGljIHJlZmVyZW5jZVxuICAgICAgLnJlcGxhY2UoXCJwdWJsaWNcIiwgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgaW5kZXggaWYgaXQgZW5kcyB3aXRoIGluZGV4XG4gICAgICAucmVwbGFjZSgvXFwvXFxpbmRleCg/IS4pLywgXCJcIilcblxuICAgIHJldHVybiBwYXRoLmpvaW4oYXBpX3ByZWZpeCwgcm91dGUpXG4gIH1cbiIsICIvKipcbiAqIFpvZCBPcGVuQVBJIEdlbmVyYXRvci5cbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmF0aW5lL3pvZC1wbHVnaW5zXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQnJpYW4gTWNCcmlkZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY2hlbWFPYmplY3QsIFNjaGVtYU9iamVjdFR5cGUgfSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXREZWYsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldEVmZmVjdCxcbiAgZ2V0Q2hlY2tzLFxuICBnZXRJbm5lclR5cGUsXG4gIGdldEVudW1WYWx1ZXMsXG4gIGdldExpdGVyYWxWYWx1ZSxcbiAgZ2V0RGVmYXVsdFZhbHVlLFxuICBnZXRBcnJheUNvbnN0cmFpbnRzLFxuICBnZXRSZWNvcmRWYWx1ZVR5cGUsXG4gIGdldENhdGNoYWxsLFxuICBnZXRVbmtub3duS2V5cyxcbiAgZ2V0SW50ZXJzZWN0aW9uUGFydHMsXG4gIGdldFVuaW9uT3B0aW9ucyxcbiAgZ2V0RGlzY3JpbWluYXRvcixcbiAgZ2V0QnJhbmRlZFR5cGUsXG4gIGdldFBpcGVsaW5lUGFydHMsXG4gIGdldFNoYXBlLFxufSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG4vLyBUeXBlIGFsaWFzIGZvciBab2QgMy80IGNvbXBhdGliaWxpdHlcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8YW55PlxuXG4vLyBFeHRlbmRlZCBTY2hlbWFPYmplY3QgdGhhdCBpbmNsdWRlcyBPcGVuQVBJIDMuMCdzIG51bGxhYmxlIHByb3BlcnR5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxudHlwZSBFeHRlbmRlZFNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgbnVsbGFibGU/OiBib29sZWFuIH1cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IEV4dGVuZGVkU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbi8qKlxuICogU2hhbGxvdyBtZXJnZSBtdWx0aXBsZSBzY2hlbWEgb2JqZWN0cyBpbnRvIG9uZS5cbiAqIERlZXAgbWVyZ2UgaXMgbm90IG5lZWRlZCBzaW5jZSBtZXRhT3BlbkFwaSBvbmx5IGNvbnRhaW5zIGZsYXQgbWV0YWRhdGFcbiAqIChkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCwgeC0qIGV4dGVuc2lvbnMpLCBub3QgbmVzdGVkIHNjaGVtYSBzdHJ1Y3R1cmVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVNjaGVtYXMoXG4gIC4uLnNjaGVtYXM6IEFycmF5PFBhcnRpYWw8RXh0ZW5kZWRTY2hlbWFPYmplY3Q+IHwgdW5kZWZpbmVkPlxuKTogRXh0ZW5kZWRTY2hlbWFPYmplY3Qge1xuICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkU2NoZW1hT2JqZWN0ID0ge31cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBzY2hlbWEpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpWm9kQW55IGV4dGVuZHMgWm9kVHlwZUFueSB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVpvZEFueU9iamVjdCBleHRlbmRzIEFueVpvZE9iamVjdCB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgUGFyc2luZ0FyZ3M8VD4ge1xuICB6b2RSZWY6IFRcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbiAgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEFwaTxUIGV4dGVuZHMgT3BlbkFwaVpvZEFueT4oXG4gIHNjaGVtYTogVCxcbiAgc2NoZW1hT2JqZWN0OiBBbmF0aW5lU2NoZW1hT2JqZWN0ID0ge31cbik6IFQge1xuICBzY2hlbWEubWV0YU9wZW5BcGkgPSBPYmplY3QuYXNzaWduKHNjaGVtYS5tZXRhT3BlbkFwaSB8fCB7fSwgc2NoZW1hT2JqZWN0KVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVab2RPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8T3BlbkFwaVpvZEFueU9iamVjdD4pIHtcbiAgLy8gR2V0IHNoYXBlIHVzaW5nIHRoZSBjb21wYXQgaGVscGVyICh3b3JrcyBpbiBib3RoIFpvZCAzIGFuZCA0KVxuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYShzaGFwZVtrZXldLCB1c2VPdXRwdXQpLFxuICAgICAgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWFPYmplY3Q+XG4gICAgKVxuXG4gIHJldHVybiByZWR1Y2VkXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmOiBPcGVuQXBpWm9kQW55KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKCF6b2RSZWYuZGVzY3JpcHRpb24pIHJldHVybiB7fVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoem9kUmVmLmRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKVxuICAgIHJldHVybiB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmIChib2R5LnRyaW0oKSkgb3V0cHV0LmRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKFxuICAgICAgcHJlZml4T2JqZWN0S2V5c1dpdGhYKGRhc2hpZnlPYmplY3RLZXlzKGF0dHJpYnV0ZXMpKVxuICAgICkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1hdGlvbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyU2NoZW1hID0gZ2V0RWZmZWN0c1NjaGVtYSh6b2RSZWYpXG4gIGNvbnN0IGlucHV0ID0gaW5uZXJTY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpbm5lclNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG5cbiAgbGV0IG91dHB1dCA9IFwidW5kZWZpbmVkXCJcbiAgY29uc3QgZWZmZWN0ID0gZ2V0RWZmZWN0KHpvZFJlZilcbiAgaWYgKHVzZU91dHB1dCAmJiBlZmZlY3QpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1FZmZlY3QgPSBlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGVmZmVjdCA6IG51bGxcbiAgICBpZiAodHJhbnNmb3JtRWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gdHJhbnNmb3JtRWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgdHJhbnNmb3JtRWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKHpvZFJlZi5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi4oW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIl0uaW5jbHVkZXMob3V0cHV0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IG91dHB1dCBhcyBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiYm9vbGVhblwiIHwgXCJudWxsXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kU3RyaW5nPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICB9XG4gIGNvbnN0IGNoZWNrcyA9IGdldENoZWNrcyh6b2RSZWYpXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgLy8gR2V0IHRoZSBraW5kIC0gWm9kIDMgdXNlcyBpdGVtLmtpbmQsIFpvZCA0IHVzZXMgaXRlbS5jaGVjayAobm9ybWFsaXplZCBieSBnZXRDaGVja3MpXG4gICAgY29uc3Qga2luZCA9IGl0ZW0ua2luZCB8fCBpdGVtLmNoZWNrXG4gICAgLy8gR2V0IGZvcm1hdCBmb3IgWm9kIDQgc3RyaW5nIGZvcm1hdCBjaGVja3NcbiAgICBjb25zdCBmb3JtYXQgPSBpdGVtLmZvcm1hdFxuXG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBab2QgNCB1c2VzIFwic3RyaW5nX2Zvcm1hdFwiIGFzIHRoZSBjaGVjayB0eXBlIHdpdGggZm9ybWF0IHByb3BlcnR5XG4gICAgICBjYXNlIFwic3RyaW5nX2Zvcm1hdFwiOlxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImVtYWlsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PT0gXCJ1dWlkXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgZWxzZSBpZiAoZm9ybWF0ID09PSBcImN1aWRcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImN1aWRcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwidXJsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwiZGF0ZXRpbWVcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgIGNhc2UgXCJtYXhfbGVuZ3RoXCI6XG4gICAgICAgIC8vIFpvZCAzOiBpdGVtLnZhbHVlLCBab2QgNCAobm9ybWFsaXplZCk6IGl0ZW0ubWF4aW11bVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWUgPz8gaXRlbS5tYXhpbXVtXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICBjYXNlIFwibWluX2xlbmd0aFwiOlxuICAgICAgICAvLyBab2QgMzogaXRlbS52YWx1ZSwgWm9kIDQgKG5vcm1hbGl6ZWQpOiBpdGVtLm1pbmltdW1cbiAgICAgICAgYmFzZVNjaGVtYS5taW5MZW5ndGggPSBpdGVtLnZhbHVlID8/IGl0ZW0ubWluaW11bVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXg/LnNvdXJjZSA/PyBpdGVtLnBhdHRlcm4/LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdW1iZXI+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZm9ybWF0OiBcImZsb2F0XCIsXG4gIH1cbiAgY29uc3QgY2hlY2tzID0gZ2V0Q2hlY2tzKHpvZFJlZilcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1heGltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1heGltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5pbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNaW5pbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiaW50XCI6XG4gICAgICAgIGJhc2VTY2hlbWEudHlwZSA9IFwiaW50ZWdlclwiXG4gICAgICAgIGRlbGV0ZSBiYXNlU2NoZW1hLmZvcm1hdFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpcGxlT2ZcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tdWx0aXBsZU9mID0gaXRlbS52YWx1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPEFueVpvZE9iamVjdD4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgY29uc3QgY2F0Y2hhbGwgPSBnZXRDYXRjaGFsbCh6b2RSZWYpXG4gIGNvbnN0IHVua25vd25LZXlzID0gZ2V0VW5rbm93bktleXMoem9kUmVmKVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICAoY2F0Y2hhbGwgJiYgZ2V0VHlwZU5hbWUoY2F0Y2hhbGwpID09PSBcIlpvZE5ldmVyXCIpXG4gICAgKVxuICApIHtcbiAgICBpZiAoY2F0Y2hhbGwpIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2VuZXJhdGVTY2hlbWEoY2F0Y2hhbGwsIHVzZU91dHB1dClcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIikge1xuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICB9IGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmljdFwiKSB7XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuICB9XG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCBvYmplY3RTaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvYmplY3RTaGFwZSkuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCBpdGVtID0gb2JqZWN0U2hhcGVba2V5XVxuICAgIGNvbnN0IGl0ZW1UeXBlTmFtZSA9IGdldFR5cGVOYW1lKGl0ZW0pXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbVR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW1UeXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IGl0ZXJhdGVab2RPYmplY3Qoe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBPcGVuQXBpWm9kQW55T2JqZWN0LFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICAgIGhpZGVEZWZpbml0aW9uczogZ2V0RXhjbHVkZWREZWZpbml0aW9uc0Zyb21TY2hlbWEoc2NoZW1hcyksXG4gICAgICB9KSxcbiAgICAgIC4uLnJlcXVpcmVkLFxuICAgICAgLi4uYWRkaXRpb25hbFByb3BlcnRpZXMsXG4gICAgICAuLi5oaWRlRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlY29yZD4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB2YWx1ZVR5cGUgPSBnZXRSZWNvcmRWYWx1ZVR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB2YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiB2YWx1ZVR5cGVcbiAgICAgICAgICA/IGdlbmVyYXRlU2NoZW1hKHZhbHVlVHlwZSwgdXNlT3V0cHV0KVxuICAgICAgICAgIDoge30sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiYm9vbGVhblwiIGFzIFNjaGVtYU9iamVjdFR5cGUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZSh7IHpvZFJlZiwgc2NoZW1hcyB9OiBQYXJzaW5nQXJnczx6LlpvZERhdGU+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dCksXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGxhYmxlKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bGxhYmxlPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyVHlwZSA9IGdldElubmVyVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgZGVmYXVsdDogZ2V0RGVmYXVsdFZhbHVlKHpvZFJlZiksXG4gICAgICAuLi4oaW5uZXJUeXBlID8gZ2VuZXJhdGVTY2hlbWEoaW5uZXJUeXBlLCB1c2VPdXRwdXQpIDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUFycmF5KHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEFycmF5PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBTY2hlbWFPYmplY3QgPSB7fVxuICBjb25zdCB7IGV4YWN0TGVuZ3RoLCBtaW5MZW5ndGgsIG1heExlbmd0aCB9ID0gZ2V0QXJyYXlDb25zdHJhaW50cyh6b2RSZWYpXG5cbiAgaWYgKGV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IGV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSBleGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKG1pbkxlbmd0aCAhPSBudWxsKSBjb25zdHJhaW50cy5taW5JdGVtcyA9IG1pbkxlbmd0aC52YWx1ZVxuICBpZiAobWF4TGVuZ3RoICE9IG51bGwpIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gbWF4TGVuZ3RoLnZhbHVlXG5cbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0TGl0ZXJhbFZhbHVlKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgdmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt2YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7IHNjaGVtYXMsIHpvZFJlZiB9OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgdmFsdWVzID0gZ2V0RW51bVZhbHVlcyh6b2RSZWYpXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgLi4uc2NoZW1hc1xuICAgIClcbiAgfVxuICBjb25zdCB2YWx1ZXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IE9iamVjdC52YWx1ZXModmFsdWVzKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB2YWx1ZXNBcnJheVswXSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIixcbiAgICAgIGVudW06IHZhbHVlc0FycmF5LFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IGdldEludGVyc2VjdGlvblBhcnRzKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBsZWZ0ID8gZ2VuZXJhdGVTY2hlbWEobGVmdCwgdXNlT3V0cHV0KSA6IHt9LFxuICAgICAgICByaWdodCA/IGdlbmVyYXRlU2NoZW1hKHJpZ2h0LCB1c2VPdXRwdXQpIDoge30sXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29udGVudHMgPSBnZXRVbmlvbk9wdGlvbnMoem9kUmVmKVxuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTGl0ZXJhbFwiLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKSB7XG4gICAgLy8gc3BlY2lhbCBjYXNlIHRvIHRyYW5zZm9ybSB1bmlvbnMgb2YgbGl0ZXJhbHMgaW50byBlbnVtc1xuICAgIGNvbnN0IGxpdGVyYWxzID0gY29udGVudHMgYXMgWm9kVHlwZUFueVtdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZSgocHJldiwgY29udGVudCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRMaXRlcmFsVmFsdWUoY29udGVudClcbiAgICAgIHJldHVybiAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgdmFsdWUgPyB0eXBlb2YgdmFsdWUgOiBudWxsXG4gICAgfSwgbnVsbCBhcyBudWxsIHwgc3RyaW5nKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIsXG4gICAgICAgICAgZW51bTogbGl0ZXJhbHMubWFwKChsaXRlcmFsKSA9PiBnZXRMaXRlcmFsVmFsdWUobGl0ZXJhbCkpLFxuICAgICAgICB9LFxuICAgICAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgICAgIC4uLnNjaGVtYXNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc051bGxhYmxlID0gY29udGVudHMuc29tZShcbiAgICAoY29udGVudCkgPT4gZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBnZXRUeXBlTmFtZShjb250ZW50KSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSBnZXREaXNjcmltaW5hdG9yKHpvZFJlZilcbiAgY29uc3Qgb3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKGRpc2NyaW1pbmF0b3JcbiAgICAgICAgPyB7IGRpc2NyaW1pbmF0b3I6IHsgcHJvcGVydHlOYW1lOiBkaXNjcmltaW5hdG9yIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICAgIG9uZU9mOiBvcHRpb25zLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHsgcmVhZE9ubHk6IHRydWUgfSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJyYW5kZWQoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHR5cGUgPSBnZXRCcmFuZGVkVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXModHlwZSA/IGdlbmVyYXRlU2NoZW1hKHR5cGUpIDoge30sIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VQaXBlbGluZSh7IHpvZFJlZiwgdXNlT3V0cHV0IH06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IGluOiBpblNjaGVtYSwgb3V0OiBvdXRTY2hlbWEgfSA9IGdldFBpcGVsaW5lUGFydHMoem9kUmVmKVxuICBpZiAodXNlT3V0cHV0ICYmIG91dFNjaGVtYSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYShvdXRTY2hlbWEsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gaW5TY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpblNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZG9ubHkoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbm5lclR5cGUgPSBnZXRJbm5lclR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIGlubmVyVHlwZSA/IGdlbmVyYXRlU2NoZW1hKGlubmVyVHlwZSwgdXNlT3V0cHV0KSA6IHt9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh6b2RSZWYpIGFzIFdvcmtlcktleXNcbiAgICBpZiAodHlwZU5hbWUgaW4gd29ya2VyTWFwKSB7XG4gICAgICByZXR1cm4gd29ya2VyTWFwW3R5cGVOYW1lXSh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIG5ldmVyLFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfVxufVxuIiwgIi8qKlxuICogRnJvbnQtTWF0dGVyXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanhzb24vZnJvbnQtbWF0dGVyXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEphc29uIENhbXBiZWxsIChcIkF1dGhvclwiKVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJqcy15YW1sXCJcbmNvbnN0IG9wdGlvbmFsQnl0ZU9yZGVyTWFyayA9IFwiXFxcXHVmZWZmP1wiXG5jb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiID8gcHJvY2Vzcy5wbGF0Zm9ybSA6IFwiXCJcbmNvbnN0IHBhdHRlcm4gPVxuICBcIl4oXCIgK1xuICBvcHRpb25hbEJ5dGVPcmRlck1hcmsgK1xuICBcIig9IHlhbWwgPXwtLS0pXCIgK1xuICBcIiQoW1xcXFxzXFxcXFNdKj8pXCIgK1xuICBcIl4oPzpcXFxcMnxcXFxcLlxcXFwuXFxcXC4pXFxcXHMqXCIgK1xuICBcIiRcIiArXG4gIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJcXFxccj9cIiA6IFwiXCIpICtcbiAgXCIoPzpcXFxcbik/KVwiXG4vLyBOT1RFOiBJZiB0aGlzIHBhdHRlcm4gdXNlcyB0aGUgJ2cnIGZsYWcgdGhlIGByZWdleGAgdmFyaWFibGUgZGVmaW5pdGlvbiB3aWxsXG4vLyBuZWVkIHRvIGJlIG1vdmVkIGRvd24gaW50byB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwibVwiKVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9udE1hdHRlcihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG9wdGlvbnMgPSB7fVxuKTogeyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgYm9keTogc3RyaW5nOyBib2R5QmVnaW46IG51bWJlciB9IHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0geyBhbGxvd1Vuc2FmZTogZmFsc2UgfVxuICBvcHRpb25zID1cbiAgICBvcHRpb25zIGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICA/IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfVxuICAgICAgOiBkZWZhdWx0T3B0aW9uc1xuICB2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoLyhcXHI/XFxuKS8pXG4gIGlmIChsaW5lc1swXSAmJiAvPSB5YW1sID18LS0tLy50ZXN0KGxpbmVzWzBdKSkge1xuICAgIHJldHVybiBwYXJzZShzdHJpbmcpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTG9jYXRpb24obWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSwgYm9keTogc3RyaW5nKSB7XG4gIHZhciBsaW5lID0gMVxuICB2YXIgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIpXG4gIHZhciBvZmZzZXQgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIHdoaWxlIChwb3MgIT09IC0xKSB7XG4gICAgaWYgKHBvcyA+PSBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBsaW5lXG4gICAgfVxuICAgIGxpbmUrK1xuICAgIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiLCBwb3MgKyAxKVxuICB9XG5cbiAgcmV0dXJuIGxpbmVcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nOiBzdHJpbmcpOiB7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGJvZHk6IHN0cmluZ1xuICBib2R5QmVnaW46IG51bWJlclxufSB7XG4gIHZhciBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxuXG4gIHZhciB5YW1sID0gbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0ucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIilcbiAgdmFyIGF0dHJpYnV0ZXMgPSAobG9hZCh5YW1sKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgdmFyIGJvZHkgPSBzdHJpbmcucmVwbGFjZShtYXRjaFswXSwgXCJcIilcbiAgdmFyIGxpbmUgPSBjb21wdXRlTG9jYXRpb24obWF0Y2gsIHN0cmluZylcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgYm9keTogYm9keSxcbiAgICBib2R5QmVnaW46IGxpbmUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RGcm9udE1hdHRlcihzdHJpbmc6IHN0cmluZykge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuXG4gIHJldHVybiByZWdleC50ZXN0KHN0cmluZylcbn1cbiIsICJ0eXBlIFByZWZpeGVkT2JqZWN0PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIGB4LSR7c3RyaW5nICYgS31gXTogVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4T2JqZWN0S2V5c1dpdGhYPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFRcbik6IFByZWZpeGVkT2JqZWN0PFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbYHgtJHtrZXl9YCwgdmFsdWVdKVxuICApIGFzIFByZWZpeGVkT2JqZWN0PFQ+XG59XG4iLCAidHlwZSBTbmFrZVRvRGFzaDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgc3RyaW5nID8gU25ha2VUb0Rhc2hTdHJpbmc8Sz4gOiBLXTogVFtLXVxufVxuXG50eXBlIFNuYWtlVG9EYXNoU3RyaW5nPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFR9XyR7aW5mZXIgVX1gXG4gID8gYCR7VH0tJHtTbmFrZVRvRGFzaFN0cmluZzxVPn1gXG4gIDogU1xuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGlmeU9iamVjdEtleXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogU25ha2VUb0Rhc2g8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkucmVwbGFjZSgvXy9nLCBcIi1cIiksIHZhbHVlXSlcbiAgKSBhcyBTbmFrZVRvRGFzaDxUPlxufVxuIiwgIi8qKlxuICogWm9kIENvbXBhdGliaWxpdHkgTGF5ZXJcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb21wYXRpYmlsaXR5IGJldHdlZW4gWm9kIHYzIGFuZCBab2QgdjQuXG4gKiBJbiBab2QgdjQsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgY2hhbmdlZDpcbiAqIC0gYC5fZGVmYCBtb3ZlZCB0byBgLl96b2QuZGVmYFxuICogLSBgLl9kZWYudHlwZU5hbWVgIG1vdmVkIHRvIGAuX3pvZC5kZWYudHlwZWBcbiAqXG4gKiBUaGlzIG1vZHVsZSBhYnN0cmFjdHMgdGhlc2UgZGlmZmVyZW5jZXMgdG8gc3VwcG9ydCBib3RoIHZlcnNpb25zLlxuICovXG5cbmltcG9ydCB7IFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSdyZSB1c2luZyBab2QgdjQrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1pvZFY0KHNjaGVtYTogWm9kVHlwZUFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gXCJfem9kXCIgaW4gc2NoZW1hXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbnRlcm5hbCBkZWZpbml0aW9uIG9iamVjdCBmcm9tIGEgWm9kIHNjaGVtYS5cbiAqIFdvcmtzIHdpdGggYm90aCBab2QgdjMgKC5fZGVmKSBhbmQgWm9kIHY0ICguX3pvZC5kZWYpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWYoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgaWYgKFwiX3pvZFwiIGluIHNjaGVtYSkge1xuICAgIC8vIFpvZCB2NFxuICAgIHJldHVybiAoc2NoZW1hIGFzIGFueSkuX3pvZC5kZWZcbiAgfVxuICAvLyBab2QgdjNcbiAgcmV0dXJuIChzY2hlbWEgYXMgYW55KS5fZGVmXG59XG5cbi8qKlxuICogR2V0IHRoZSB0eXBlIG5hbWUgb2YgYSBab2Qgc2NoZW1hLlxuICogWm9kIHYzOiBzY2hlbWEuX2RlZi50eXBlTmFtZSAoZS5nLiwgXCJab2RTdHJpbmdcIilcbiAqIFpvZCB2NDogc2NoZW1hLl96b2QuZGVmLnR5cGUgKGUuZy4sIFwic3RyaW5nXCIpIC0gYnV0IHdlIG5vcm1hbGl6ZSB0byB2My1zdHlsZSBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZU5hbWUoc2NoZW1hOiBab2RUeXBlQW55KTogc3RyaW5nIHtcbiAgaWYgKFwiX3pvZFwiIGluIHNjaGVtYSkge1xuICAgIC8vIFpvZCB2NCAtIHRoZSB0eXBlIGlzIHN0b3JlZCBkaWZmZXJlbnRseVxuICAgIGNvbnN0IHpvZCA9IChzY2hlbWEgYXMgYW55KS5fem9kXG4gICAgLy8gSW4gWm9kIHY0LCB0aGUgY29uc3RydWN0b3IgbmFtZSBnaXZlcyB1cyB0aGUgdHlwZVxuICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHNjaGVtYS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgaWYgKGNvbnN0cnVjdG9yTmFtZSAmJiBjb25zdHJ1Y3Rvck5hbWUuc3RhcnRzV2l0aChcIiRab2RcIikpIHtcbiAgICAgIC8vIFpvZCB2NCB1c2VzICRab2RTdHJpbmcsICRab2ROdW1iZXIsIGV0YyAtIGNvbnZlcnQgdG8gWm9kU3RyaW5nLCBab2ROdW1iZXJcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWUuc2xpY2UoMSlcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gZGVmLnR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHpvZC5kZWYgJiYgem9kLmRlZi50eXBlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplWm9kVjRUeXBlKHpvZC5kZWYudHlwZSlcbiAgICB9XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZSB8fCBcIlVua25vd25cIlxuICB9XG4gIC8vIFpvZCB2M1xuICByZXR1cm4gKHNjaGVtYSBhcyBhbnkpLl9kZWY/LnR5cGVOYW1lIHx8IFwiVW5rbm93blwiXG59XG5cbi8qKlxuICogTm9ybWFsaXplIFpvZCB2NCB0eXBlIG5hbWVzIHRvIHYzLXN0eWxlIG5hbWVzIGZvciBjb25zaXN0ZW5jeVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab2RWNFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHlwZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBzdHJpbmc6IFwiWm9kU3RyaW5nXCIsXG4gICAgbnVtYmVyOiBcIlpvZE51bWJlclwiLFxuICAgIGJpZ2ludDogXCJab2RCaWdJbnRcIixcbiAgICBib29sZWFuOiBcIlpvZEJvb2xlYW5cIixcbiAgICBkYXRlOiBcIlpvZERhdGVcIixcbiAgICB1bmRlZmluZWQ6IFwiWm9kVW5kZWZpbmVkXCIsXG4gICAgbnVsbDogXCJab2ROdWxsXCIsXG4gICAgdm9pZDogXCJab2RWb2lkXCIsXG4gICAgYW55OiBcIlpvZEFueVwiLFxuICAgIHVua25vd246IFwiWm9kVW5rbm93blwiLFxuICAgIG5ldmVyOiBcIlpvZE5ldmVyXCIsXG4gICAgbGl0ZXJhbDogXCJab2RMaXRlcmFsXCIsXG4gICAgZW51bTogXCJab2RFbnVtXCIsXG4gICAgbmF0aXZlRW51bTogXCJab2ROYXRpdmVFbnVtXCIsXG4gICAgb2JqZWN0OiBcIlpvZE9iamVjdFwiLFxuICAgIGFycmF5OiBcIlpvZEFycmF5XCIsXG4gICAgdHVwbGU6IFwiWm9kVHVwbGVcIixcbiAgICB1bmlvbjogXCJab2RVbmlvblwiLFxuICAgIGRpc2NyaW1pbmF0ZWRVbmlvbjogXCJab2REaXNjcmltaW5hdGVkVW5pb25cIixcbiAgICBpbnRlcnNlY3Rpb246IFwiWm9kSW50ZXJzZWN0aW9uXCIsXG4gICAgcmVjb3JkOiBcIlpvZFJlY29yZFwiLFxuICAgIG1hcDogXCJab2RNYXBcIixcbiAgICBzZXQ6IFwiWm9kU2V0XCIsXG4gICAgZnVuY3Rpb246IFwiWm9kRnVuY3Rpb25cIixcbiAgICBsYXp5OiBcIlpvZExhenlcIixcbiAgICBwcm9taXNlOiBcIlpvZFByb21pc2VcIixcbiAgICBvcHRpb25hbDogXCJab2RPcHRpb25hbFwiLFxuICAgIG51bGxhYmxlOiBcIlpvZE51bGxhYmxlXCIsXG4gICAgZGVmYXVsdDogXCJab2REZWZhdWx0XCIsXG4gICAgZWZmZWN0czogXCJab2RFZmZlY3RzXCIsXG4gICAgdHJhbnNmb3JtZXI6IFwiWm9kVHJhbnNmb3JtZXJcIixcbiAgICBicmFuZGVkOiBcIlpvZEJyYW5kZWRcIixcbiAgICBwaXBlbGluZTogXCJab2RQaXBlbGluZVwiLFxuICAgIHJlYWRvbmx5OiBcIlpvZFJlYWRvbmx5XCIsXG4gIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZV0gfHwgYFpvZCR7dHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR5cGUuc2xpY2UoMSl9YFxufVxuXG4vKipcbiAqIEdldCB0aGUgaW5uZXIgc2NoZW1hIGZyb20gYSBab2RFZmZlY3RzL1pvZFRyYW5zZm9ybWVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RzU2NoZW1hKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy5zY2hlbWFcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGlubmVyIHR5cGUgZnJvbSBab2RPcHRpb25hbCwgWm9kTnVsbGFibGUsIFpvZERlZmF1bHQsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElubmVyVHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uaW5uZXJUeXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaGFwZSBvZiBhIFpvZE9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGUoXG4gIHNjaGVtYTogWm9kVHlwZUFueVxuKTogUmVjb3JkPHN0cmluZywgWm9kVHlwZUFueT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBpZiAodHlwZW9mIGRlZj8uc2hhcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBkZWYuc2hhcGUoKVxuICB9XG4gIHJldHVybiBkZWY/LnNoYXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSBjaGVja3MgYXJyYXkgZnJvbSBhIHN0cmluZy9udW1iZXIgc2NoZW1hXG4gKiBJbiBab2QgNCwgY2hlY2tzIGFyZSBvYmplY3RzIHdpdGggX3pvZC5kZWYgY29udGFpbmluZyB0aGUgY2hlY2sgZGV0YWlsc1xuICogV2Ugbm9ybWFsaXplIHRoZW0gdG8gaGF2ZSB0aGUgcHJvcGVydGllcyBkaXJlY3RseSBhY2Nlc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGVja3Moc2NoZW1hOiBab2RUeXBlQW55KTogYW55W10ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBjb25zdCBjaGVja3MgPSBkZWY/LmNoZWNrcyB8fCBbXVxuXG4gIC8vIE5vcm1hbGl6ZSBab2QgNCBjaGVjayBvYmplY3RzXG4gIHJldHVybiBjaGVja3MubWFwKChjaGVjazogYW55KSA9PiB7XG4gICAgaWYgKGNoZWNrLl96b2Q/LmRlZikge1xuICAgICAgLy8gWm9kIDQ6IGZsYXR0ZW4gX3pvZC5kZWYgcHJvcGVydGllcyBvbnRvIHRoZSBjaGVjayBvYmplY3RcbiAgICAgIHJldHVybiB7IC4uLmNoZWNrLl96b2QuZGVmIH1cbiAgICB9XG4gICAgLy8gWm9kIDM6IGFscmVhZHkgaGFzIHByb3BlcnRpZXMgZGlyZWN0bHlcbiAgICByZXR1cm4gY2hlY2tcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgdmFsdWVzIGZyb20gYSBab2RFbnVtIG9yIFpvZE5hdGl2ZUVudW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIHNjaGVtYTogWm9kVHlwZUFueVxuKTogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgLy8gWm9kIDQ6IHVzZSBzY2hlbWEub3B0aW9ucyAoYXJyYXkpIG9yIHNjaGVtYS5lbnVtIChvYmplY3QpXG4gIGlmIChcIm9wdGlvbnNcIiBpbiBzY2hlbWEgJiYgQXJyYXkuaXNBcnJheSgoc2NoZW1hIGFzIGFueSkub3B0aW9ucykpIHtcbiAgICByZXR1cm4gKHNjaGVtYSBhcyBhbnkpLm9wdGlvbnNcbiAgfVxuICBpZiAoXCJlbnVtXCIgaW4gc2NoZW1hICYmIChzY2hlbWEgYXMgYW55KS5lbnVtKSB7XG4gICAgcmV0dXJuIChzY2hlbWEgYXMgYW55KS5lbnVtXG4gIH1cbiAgLy8gWm9kIDMgZmFsbGJhY2tcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgLy8gWm9kIDQgYWxzbyBoYXMgZW50cmllcyBpbiBkZWZcbiAgcmV0dXJuIGRlZj8udmFsdWVzIHx8IGRlZj8uZW50cmllc1xufVxuXG4vKipcbiAqIEdldCB0aGUgbGl0ZXJhbCB2YWx1ZSBmcm9tIGEgWm9kTGl0ZXJhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXJhbFZhbHVlKHNjaGVtYTogWm9kVHlwZUFueSk6IGFueSB7XG4gIC8vIFpvZCA0OiB0cnkgc2NoZW1hLnZhbHVlIGZpcnN0IChwdWJsaWMgQVBJKVxuICBpZiAoXCJ2YWx1ZVwiIGluIHNjaGVtYSkge1xuICAgIHJldHVybiAoc2NoZW1hIGFzIGFueSkudmFsdWVcbiAgfVxuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICAvLyBab2QgNDogdmFsdWVzIGlzIGFuIGFycmF5XG4gIGlmIChBcnJheS5pc0FycmF5KGRlZj8udmFsdWVzKSkge1xuICAgIHJldHVybiBkZWYudmFsdWVzWzBdXG4gIH1cbiAgLy8gWm9kIDM6IHZhbHVlIGlzIGEgc2luZ2xlIHZhbHVlXG4gIHJldHVybiBkZWY/LnZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gYSBab2REZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgaWYgKHR5cGVvZiBkZWY/LmRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGRlZi5kZWZhdWx0VmFsdWUoKVxuICB9XG4gIHJldHVybiBkZWY/LmRlZmF1bHRWYWx1ZVxufVxuXG4vKipcbiAqIEdldCBhcnJheSBjb25zdHJhaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlDb25zdHJhaW50cyhzY2hlbWE6IFpvZFR5cGVBbnkpOiB7XG4gIGV4YWN0TGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbiAgbWluTGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbiAgbWF4TGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbn0ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4ge1xuICAgIGV4YWN0TGVuZ3RoOiBkZWY/LmV4YWN0TGVuZ3RoLFxuICAgIG1pbkxlbmd0aDogZGVmPy5taW5MZW5ndGgsXG4gICAgbWF4TGVuZ3RoOiBkZWY/Lm1heExlbmd0aCxcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZWxlbWVudCB0eXBlIGZyb20gYSBab2RBcnJheVxuICogWm9kIHYzOiBkZWYudHlwZSBjb250YWlucyB0aGUgZWxlbWVudCBzY2hlbWFcbiAqIFpvZCB2NDogZGVmLmVsZW1lbnQgY29udGFpbnMgdGhlIGVsZW1lbnQgc2NoZW1hIChkZWYudHlwZSBpcyB0aGUgc3RyaW5nIFwiYXJyYXlcIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFycmF5VHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgLy8gWm9kIHY0IHVzZXMgZGVmLmVsZW1lbnQsIFpvZCB2MyB1c2VzIGRlZi50eXBlXG4gIHJldHVybiBkZWY/LmVsZW1lbnQgPz8gZGVmPy50eXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSB0eXBlIGZyb20gYSBab2RSZWNvcmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY29yZFZhbHVlVHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8udmFsdWVUeXBlXG59XG5cbi8qKlxuICogR2V0IGNhdGNoYWxsIGZyb20gWm9kT2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXRjaGFsbChzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uY2F0Y2hhbGxcbn1cblxuLyoqXG4gKiBHZXQgdW5rbm93bktleXMgZnJvbSBab2RPYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVua25vd25LZXlzKFxuICBzY2hlbWE6IFpvZFR5cGVBbnlcbik6IFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy51bmtub3duS2V5c1xufVxuXG4vKipcbiAqIEdldCBsZWZ0L3JpZ2h0IGZyb20gWm9kSW50ZXJzZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25QYXJ0cyhzY2hlbWE6IFpvZFR5cGVBbnkpOiB7XG4gIGxlZnQ/OiBab2RUeXBlQW55XG4gIHJpZ2h0PzogWm9kVHlwZUFueVxufSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiB7XG4gICAgbGVmdDogZGVmPy5sZWZ0LFxuICAgIHJpZ2h0OiBkZWY/LnJpZ2h0LFxuICB9XG59XG5cbi8qKlxuICogR2V0IG9wdGlvbnMgZnJvbSBab2RVbmlvbiBvciBab2REaXNjcmltaW5hdGVkVW5pb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaW9uT3B0aW9ucyhzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55W10ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBjb25zdCBvcHRpb25zID0gZGVmPy5vcHRpb25zXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucy52YWx1ZXMoKSlcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogR2V0IGRpc2NyaW1pbmF0b3IgZnJvbSBab2REaXNjcmltaW5hdGVkVW5pb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc2NyaW1pbmF0b3Ioc2NoZW1hOiBab2RUeXBlQW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uZGlzY3JpbWluYXRvclxufVxuXG4vKipcbiAqIEdldCBlZmZlY3QgZnJvbSBab2RFZmZlY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3Qoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uZWZmZWN0XG59XG5cbi8qKlxuICogR2V0IHBpcGVsaW5lIGluL291dCBmcm9tIFpvZFBpcGVsaW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQaXBlbGluZVBhcnRzKHNjaGVtYTogWm9kVHlwZUFueSk6IHtcbiAgaW4/OiBab2RUeXBlQW55XG4gIG91dD86IFpvZFR5cGVBbnlcbn0ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4ge1xuICAgIGluOiBkZWY/LmluLFxuICAgIG91dDogZGVmPy5vdXQsXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJyYW5kZWQgdHlwZSBmcm9tIFpvZEJyYW5kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyYW5kZWRUeXBlKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy50eXBlXG59XG5cbi8qKlxuICogR2V0IHR1cGxlIGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUdXBsZUl0ZW1zKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnlbXSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiBkZWY/Lml0ZW1zIHx8IFtdXG59XG5cbi8qKlxuICogR2V0IGZ1bmN0aW9uIGFyZ3MgYW5kIHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uUGFydHMoc2NoZW1hOiBab2RUeXBlQW55KToge1xuICBhcmdzPzogWm9kVHlwZUFueVxuICByZXR1cm5zPzogWm9kVHlwZUFueVxufSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiB7XG4gICAgYXJnczogZGVmPy5hcmdzLFxuICAgIHJldHVybnM6IGRlZj8ucmV0dXJucyxcbiAgfVxufVxuXG4vKipcbiAqIEdldCBtYXAga2V5IGFuZCB2YWx1ZSB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwVHlwZXMoc2NoZW1hOiBab2RUeXBlQW55KToge1xuICBrZXlUeXBlPzogWm9kVHlwZUFueVxuICB2YWx1ZVR5cGU/OiBab2RUeXBlQW55XG59IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiBkZWY/LmtleVR5cGUsXG4gICAgdmFsdWVUeXBlOiBkZWY/LnZhbHVlVHlwZSxcbiAgfVxufVxuXG4vKipcbiAqIEdldCBzZXQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0VmFsdWVUeXBlKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy52YWx1ZVR5cGVcbn1cblxuLyoqXG4gKiBHZXQgcHJvbWlzZSB0eXBlXG4gKiBab2QgdjM6IGRlZi50eXBlIGNvbnRhaW5zIHRoZSBpbm5lciBzY2hlbWFcbiAqIFpvZCB2NDogZGVmLmlubmVyVHlwZSBjb250YWlucyB0aGUgaW5uZXIgc2NoZW1hIChkZWYudHlwZSBpcyB0aGUgc3RyaW5nIFwicHJvbWlzZVwiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvbWlzZVR5cGUoc2NoZW1hOiBab2RUeXBlQW55KTogWm9kVHlwZUFueSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIC8vIFpvZCB2NCB1c2VzIGRlZi5pbm5lclR5cGUsIFpvZCB2MyB1c2VzIGRlZi50eXBlXG4gIHJldHVybiBkZWY/LmlubmVyVHlwZSA/PyBkZWY/LnR5cGVcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1c3RvbSB0eXBlIGdldHRlciBpZiBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1c3RvbVR5cGVHZXR0ZXIoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uZ2V0VHlwZVxufVxuIiwgImltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIlxuXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmoob2JqOiBhbnksIHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJlc3VsdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXy5mb3JPd24ob2JqLCAodiwgaykgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHYpICYmIF8uaXNNYXRjaCh2LCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdEtleSA9IGtcbiAgICAgIC8vIFN0b3AgdGhlIGl0ZXJhdGlvblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0S2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZFNjaGVtYVJlZmVyZW5jZXMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnkge1xuICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqMSwgKHJlc3VsdCwgdmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBmaW5kS2V5SW5PYmoob2JqMiwgdmFsdWUpXG4gICAgICBpZiAobWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB7XG4gICAgICAgICAgJHJlZjogYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7bWF0Y2hpbmdLZXl9YCxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIG9iajIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUm91dGVTcGVjIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChsYXN0UGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBsYXN0UGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gYnlfcGFyYW1cbiAgICBjb25zdCBwYXJhbSA9IGxhc3RQYXJ0LnNsaWNlKDEsIC0xKVxuICAgIHJldHVybiBgYnlfJHtwYXJhbX1gXG4gIH1cblxuICByZXR1cm4gbGFzdFBhcnRcbn1cblxuLy8gZmVybiBkb2NzOiBodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2RvY3Mvc3BlYy9leHRlbnNpb25zXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgcmV0dXJuIHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpXG59XG5cbmZ1bmN0aW9uIGdldEZlcm5TZGtNZXRhZGF0YShcbiAgcGF0aDogc3RyaW5nLFxuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG4pOlxuICB8IHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlXG4gICAgfVxuICB8IHtcbiAgICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHN0cmluZ1tdXG4gICAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogc3RyaW5nXG4gICAgfSB7XG4gIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aCksXG4gICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGgpLFxuICAgIC4uLihzZGtSZXR1cm5WYWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgXCJ4LWZlcm4tc2RrLXJldHVybi12YWx1ZVwiOiBzZGtSZXR1cm5WYWx1ZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YSh7XG4gIG1ldGhvZHMsXG4gIHBhdGgsXG4gIHNka1JldHVyblZhbHVlLFxufToge1xuICBtZXRob2RzOiBSb3V0ZVNwZWNbXCJtZXRob2RzXCJdXG4gIHBhdGg6IHN0cmluZ1xuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG59KSB7XG4gIGNvbnN0IGZlcm5TZGtNZXRhZGF0YSA9IGdldEZlcm5TZGtNZXRhZGF0YShwYXRoLCBzZGtSZXR1cm5WYWx1ZSlcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFttZXRob2RzWzBdXTogZmVyblNka01ldGFkYXRhLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE1ldGhvZHMgPSB7fVxuXG4gIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IGZlcm5TZGtNZXRhZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSB7XG4gICAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbWFwcGVkTWV0aG9kc1xufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyB6b2RUb1RzLCBwcmludE5vZGUgfSBmcm9tIFwiLi4vbGliL3pvZC10by10c1wiXG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCJcbmltcG9ydCB7IHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXRFZmZlY3RzU2NoZW1hLFxuICBnZXRJbm5lclR5cGUsXG4gIGdldFNoYXBlLFxufSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdXRlVHlwZXMgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCBmaWxlcGF0aFRvUm91dGUgPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIGNvbnN0IHNvcnRlZFJvdXRlcyA9IEFycmF5LmZyb20oZmlsZXBhdGhUb1JvdXRlLmVudHJpZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhWzFdLnJvdXRlLmxvY2FsZUNvbXBhcmUoYlsxXS5yb3V0ZSlcbiAgKVxuICBjb25zdCBmaWx0ZXJlZFJvdXRlcyA9IHNvcnRlZFJvdXRlcy5maWx0ZXIoXG4gICAgKFtfLCB7IHJvdXRlIH1dKSA9PiAhb3B0cy5maWx0ZXJSb3V0ZXMgfHwgb3B0cy5maWx0ZXJSb3V0ZXMocm91dGUpXG4gIClcblxuICAvLyBUT0RPIHdoZW4gbGVzcyBsYXp5LCB1c2UgdHMtbW9ycGggZm9yIGJldHRlciBnZW5lcmF0aW9uXG4gIGNvbnN0IHJvdXRlRGVmczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtfLCB7IHJvdXRlLCByb3V0ZVNwZWMsIHNldHVwUGFyYW1zIH1dIG9mIGZpbHRlcmVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF4RHVyYXRpb24gPSByb3V0ZVNwZWMubWF4RHVyYXRpb24gPz8gc2V0dXBQYXJhbXMubWF4RHVyYXRpb25cbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhcbiAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/IGdldFNoYXBlKHJvdXRlU3BlYy5xdWVyeVBhcmFtcykgPz8ge30gOiB7fVxuICAgIClcbiAgICBjb25zdCBwYXRoUGFyYW1ldGVycyA9IHF1ZXJ5S2V5cy5maWx0ZXIoKGtleSkgPT4gcm91dGUuaW5jbHVkZXMoYFske2tleX1dYCkpXG5cbiAgICAvLyBxdWVyeVBhcmFtcyBtaWdodCBiZSBhIFpvZEVmZmVjdHMgb3IgWm9kT3B0aW9uYWwgaW4gc29tZSBjYXNlc1xuICAgIGxldCBxdWVyeVBhcmFtczogWm9kVHlwZUFueSB8IHVuZGVmaW5lZCA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgIHdoaWxlIChxdWVyeVBhcmFtcykge1xuICAgICAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShxdWVyeVBhcmFtcylcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJab2RFZmZlY3RzXCIpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSBnZXRFZmZlY3RzU2NoZW1hKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcyA9IGlubmVyXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gZ2V0SW5uZXJUeXBlKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcyA9IGlubmVyXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMgJiZcbiAgICAgIHR5cGVvZiAocXVlcnlQYXJhbXMgYXMgYW55KS5vbWl0ID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIGFueSkub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgbWF4RHVyYXRpb246ICR7bWF4RHVyYXRpb24gPz8gXCJ1bmRlZmluZWRcIn1cbn1gLnRyaW0oKVxuICAgIClcbiAgfVxuICBjb25zdCByb3V0ZURlZlN0ciA9IHJvdXRlRGVmcy5qb2luKFwiLFxcblwiKVxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwcmV0dGllci5mb3JtYXQoXG4gICAgYGV4cG9ydCB0eXBlIFJvdXRlcyA9IHtcbiR7cm91dGVEZWZTdHJ9XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVzcG9uc2U8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uUmVzcG9uc2VcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0Qm9keTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25Cb2R5XCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdFBhcmFtczxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcInF1ZXJ5UGFyYW1zXCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5gLnRyaW0oKSxcbiAgICB7IHNlbWk6IGZhbHNlLCBwYXJzZXI6IFwidHlwZXNjcmlwdFwiIH1cbiAgKVxuXG4gIGlmIChvcHRzLm91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3B0cy5vdXRwdXRGaWxlLCBvdXRwdXQpXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iLCAiLy8gQHRzLW5vY2hlY2sgLSBWZW5kb3JlZCBjb2RlIHdpdGggWm9kIDMvNCB0eXBlIGluY29tcGF0aWJpbGl0aWVzIChydW50aW1lIHdvcmtzIGNvcnJlY3RseSlcbi8qKlxuICogWm9kIFRvIFRTXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FjaGlucmFqYS96b2QtdG8tdHNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBTYWNoaW4gUmFqYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCB7IFpvZFR5cGUsIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHtcbiAgZ2V0VHlwZU5hbWUsXG4gIGdldERlZixcbiAgZ2V0TGl0ZXJhbFZhbHVlLFxuICBnZXRTaGFwZSxcbiAgZ2V0QXJyYXlUeXBlLFxuICBnZXRFbnVtVmFsdWVzLFxuICBnZXRVbmlvbk9wdGlvbnMsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldElubmVyVHlwZSxcbiAgZ2V0VHVwbGVJdGVtcyxcbiAgZ2V0UmVjb3JkVmFsdWVUeXBlLFxuICBnZXRNYXBUeXBlcyxcbiAgZ2V0U2V0VmFsdWVUeXBlLFxuICBnZXRJbnRlcnNlY3Rpb25QYXJ0cyxcbiAgZ2V0UHJvbWlzZVR5cGUsXG4gIGdldEZ1bmN0aW9uUGFydHMsXG4gIGdldEN1c3RvbVR5cGVHZXR0ZXIsXG59IGZyb20gXCIuLi8uLi9saWIvem9kLWNvbXBhdFwiXG5cbmNvbnN0IHsgZmFjdG9yeTogZiwgU3ludGF4S2luZCwgU2NyaXB0S2luZCwgU2NyaXB0VGFyZ2V0LCBFbWl0SGludCB9ID0gdHNcblxuY29uc3QgbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlID0gKFxuICBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcbikgPT4ge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGlkZW50aWZpZXIpKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoaWRlbnRpZmllcilcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyXG59XG5cbmNvbnN0IGNyZWF0ZVR5cGVSZWZlcmVuY2VGcm9tU3RyaW5nID0gKGlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcikpXG5cbmNvbnN0IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSA9ICgpID0+XG4gIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5rbm93bktleXdvcmQpXG5cbmV4cG9ydCBjb25zdCBwcmludE5vZGUgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIHByaW50ZXJPcHRpb25zPzogdHMuUHJpbnRlck9wdGlvbnNcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwicHJpbnQudHNcIixcbiAgICBcIlwiLFxuICAgIFNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgZmFsc2UsXG4gICAgU2NyaXB0S2luZC5UU1xuICApXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHByaW50ZXJPcHRpb25zKVxuICByZXR1cm4gcHJpbnRlci5wcmludE5vZGUoRW1pdEhpbnQuVW5zcGVjaWZpZWQsIG5vZGUsIHNvdXJjZUZpbGUpXG59XG5cbmNvbnN0IGlkZW50aWZpZXJSRSA9IC9eWyRBLVpfYS16XVtcXHckXSokL1xuXG5jb25zdCBnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsID0gKHN0cmluZ186IHN0cmluZykgPT4ge1xuICBpZiAoaWRlbnRpZmllclJFLnRlc3Qoc3RyaW5nXykpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVJZGVudGlmaWVyKHN0cmluZ18pXG4gIH1cblxuICByZXR1cm4gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHN0cmluZ18pXG59XG5cbmNvbnN0IGFkZEpzRG9jQ29tbWVudCA9IChub2RlOiB0cy5Ob2RlLCB0ZXh0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeyBkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCB9ID0gcGFyc2VEZXNjcmlwdGlvbih0ZXh0KVxuXG4gIGxldCBjb21tZW50ID0gYCogJHtkZXNjcmlwdGlvbn1gXG4gIGlmIChkZXByZWNhdGVkKSB7XG4gICAgY29tbWVudCArPSBgXFxuICogQGRlcHJlY2F0ZWQgJHtcbiAgICAgIHR5cGVvZiBkZXByZWNhdGVkID09PSBcInN0cmluZ1wiID8gZGVwcmVjYXRlZCA6IFwiXCJcbiAgICB9YFxuICB9IGVsc2Uge1xuICAgIGNvbW1lbnQgKz0gYCBgXG4gIH1cblxuICB0cy5hZGRTeW50aGV0aWNMZWFkaW5nQ29tbWVudChcbiAgICBub2RlLFxuICAgIFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICBjb21tZW50LFxuICAgIHRydWVcbiAgKVxufVxuXG50eXBlIFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGRlcHJlY2F0ZWQ/OiBib29sZWFuIHwgc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogUGFyc2VkRGVzY3JpcHRpb24ge1xuICBpZiAoIWRlc2NyaXB0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICB9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkgcmV0dXJuIHsgZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICAgIGRlc2NyaXB0aW9uOiBib2R5LnRyaW0oKSxcbiAgfVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID1cbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQubGVuZ3RoID4gMCA/IGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiZGVzY3JpcHRpb25cIiB8fCBrZXkgPT09IFwiZGVwcmVjYXRlZFwiKSBjb250aW51ZVxuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0XG59XG5cbnR5cGUgTGl0ZXJhbFR5cGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG5cbnR5cGUgWm9kVG9Uc09wdGlvbnMgPSB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG5hdGl2ZUVudW1zYCBpbnN0ZWFkICovXG4gIHJlc29sdmVOYXRpdmVFbnVtcz86IGJvb2xlYW5cbiAgbmF0aXZlRW51bXM/OiBcImlkZW50aWZpZXJcIiB8IFwicmVzb2x2ZVwiIHwgXCJ1bmlvblwiXG59XG5cbmNvbnN0IHJlc29sdmVPcHRpb25zID0gKHJhdz86IFpvZFRvVHNPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0ge1xuICAgIG5hdGl2ZUVudW1zOiByYXc/LnJlc29sdmVOYXRpdmVFbnVtcyA/IFwicmVzb2x2ZVwiIDogXCJpZGVudGlmaWVyXCIsXG4gIH1cblxuICByZXR1cm4geyAuLi5yZXNvbHZlZCwgLi4ucmF3IH1cbn1cblxudHlwZSBSZXNvbHZlZFpvZFRvVHNPcHRpb25zID0gUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZU9wdGlvbnM+XG5cbnR5cGUgWm9kVG9Uc1N0b3JlID0ge1xuICBuYXRpdmVFbnVtczogdHMuRW51bURlY2xhcmF0aW9uW11cbn1cblxudHlwZSBab2RUb1RzUmV0dXJuID0ge1xuICBub2RlOiB0cy5UeXBlTm9kZVxuICBzdG9yZTogWm9kVG9Uc1N0b3JlXG59XG5cbnR5cGUgR2V0VHlwZUZ1bmN0aW9uID0gKFxuICB0eXBlc2NyaXB0OiB0eXBlb2YgdHMsXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRab2RUb1RzT3B0aW9uc1xuKSA9PiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGUgPSBnZXRDdXN0b21UeXBlR2V0dGVyKHpvZClcbiAgLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWNjZXNzaW5nICd0eXBlJ1xuICBpZiAoZ2V0VHlwZSkgdHlwZSA9IGdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh6b2QpXG5cbiAgY29uc3QgZ2V0VHlwZVR5cGUgPSBjYWxsR2V0VHlwZSh6b2QsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIC8vIHNwZWNpYWwgY2FzZSBuYXRpdmUgZW51bSwgd2hpY2ggbmVlZHMgYW4gaWRlbnRpZmllciBub2RlXG4gIGlmIChnZXRUeXBlVHlwZSAmJiB0eXBlTmFtZSAhPT0gXCJab2ROYXRpdmVFbnVtXCIpIHtcbiAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKGdldFR5cGVUeXBlKVxuICB9XG5cbiAgY29uc3Qgb3RoZXJBcmd1bWVudHMgPSBbaWRlbnRpZmllciwgc3RvcmUsIG9wdGlvbnNdIGFzIGNvbnN0XG5cbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgXCJab2RTdHJpbmdcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bWJlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQmlnSW50XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJpZ0ludEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCb29sZWFuXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kRGF0ZVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJEYXRlXCIpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5kZWZpbmVkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdWxsXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFZvaWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVm9pZEtleXdvcmQpLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZEFueVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5rbm93blwiOiB7XG4gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE5ldmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk5ldmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZExhenlcIjoge1xuICAgICAgLy8gaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGF6eSB2YWx1ZSBpcyByZWZlcnJpbmcgdG9cbiAgICAgIC8vIHNvIHdlIGZvcmNlIHRoZSB1c2VyIHRvIGRlY2xhcmUgaXRcbiAgICAgIGlmICghZ2V0VHlwZVR5cGUpIHJldHVybiBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyhpZGVudGlmaWVyKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY2FzZSBcIlpvZExpdGVyYWxcIjoge1xuICAgICAgLy8gei5saXRlcmFsKCdoaScpIC0+ICdoaSdcbiAgICAgIGxldCBsaXRlcmFsOiB0cy5MaXRlcmFsRXhwcmVzc2lvbiB8IHRzLkJvb2xlYW5MaXRlcmFsXG5cbiAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IGdldExpdGVyYWxWYWx1ZSh6b2QpIGFzIExpdGVyYWxUeXBlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBsaXRlcmFsVmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsVmFsdWUgPT09IHRydWUgPyBmLmNyZWF0ZVRydWUoKSA6IGYuY3JlYXRlRmFsc2UoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGxpdGVyYWwpXG4gICAgfVxuICAgIGNhc2UgXCJab2RPYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZSh6b2QpIHx8IHt9XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoc2hhcGUpXG5cbiAgICAgIGNvbnN0IG1lbWJlcnM6IHRzLlR5cGVFbGVtZW50W10gPSBwcm9wZXJ0aWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlID0gdmFsdWUgYXMgWm9kVHlwZUFueVxuICAgICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUobmV4dFpvZE5vZGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlVHlwZU5hbWUgPSBnZXRUeXBlTmFtZShuZXh0Wm9kTm9kZSlcbiAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9XG4gICAgICAgICAgbmV4dFpvZE5vZGVUeXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IG5leHRab2ROb2RlLmlzT3B0aW9uYWwoKVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2lnbmF0dXJlID0gZi5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLFxuICAgICAgICAgIGlzT3B0aW9uYWwgPyBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgYWRkSnNEb2NDb21tZW50KHByb3BlcnR5U2lnbmF0dXJlLCBuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgfSlcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShtZW1iZXJzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RBcnJheVwiOiB7XG4gICAgICBjb25zdCBhcnJheVR5cGUgPSBnZXRBcnJheVR5cGUoem9kKVxuICAgICAgY29uc3QgdHlwZSA9IGFycmF5VHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKGFycmF5VHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUFycmF5VHlwZU5vZGUodHlwZSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVudW1cIjoge1xuICAgICAgLy8gei5lbnVtWydhJywgJ2InLCAnYyddIC0+ICdhJyB8ICdiJyB8ICdjXG4gICAgICBjb25zdCB2YWx1ZXMgPSBnZXRFbnVtVmFsdWVzKHpvZClcbiAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogT2JqZWN0LnZhbHVlcyh2YWx1ZXMpXG4gICAgICBjb25zdCB0eXBlcyA9IHZhbHVlc0FycmF5Lm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IHVuaW9uT3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2QpXG4gICAgICBjb25zdCB0eXBlczogdHMuVHlwZU5vZGVbXSA9IHVuaW9uT3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCB1bmlvbk9wdGlvbnMgPSBnZXRVbmlvbk9wdGlvbnMoem9kKVxuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSB1bmlvbk9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFZmZlY3RzXCI6IHtcbiAgICAgIC8vIGlnbm9yZSBhbnkgZWZmZWN0cywgdGhleSB3b24ndCBmYWN0b3IgaW50byB0aGUgdHlwZXNcbiAgICAgIGNvbnN0IGVmZmVjdHNTY2hlbWEgPSBnZXRFZmZlY3RzU2NoZW1hKHpvZClcbiAgICAgIGlmICghZWZmZWN0c1NjaGVtYSkgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoZWZmZWN0c1NjaGVtYSwgLi4ub3RoZXJBcmd1bWVudHMpIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuICAgICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMoem9kKVxuICAgICAgY29uc3QgZW51bVZhbHVlc09iaiA9XG4gICAgICAgIHR5cGVvZiBlbnVtVmFsdWVzID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGVudW1WYWx1ZXMpXG4gICAgICAgICAgPyBlbnVtVmFsdWVzXG4gICAgICAgICAgOiB7fVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVmFsdWVzT2JqKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlIGFzIHN0cmluZykpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHoubmF0aXZlRW51bShGcnVpdHMpIC0+IEZydWl0c1xuICAgICAgLy8gY2FuIHJlc29sdmUgRnJ1aXRzIGludG8gc3RvcmUgYW5kIHVzZXIgY2FuIGhhbmRsZSBlbnVtc1xuICAgICAgaWYgKCF0eXBlKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgaWYgKG9wdGlvbnMubmF0aXZlRW51bXMgPT09IFwicmVzb2x2ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVudW1NZW1iZXJzID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZW51bVZhbHVlc09iaiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpXG4gICAgICAgICAgICAgIDogZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlRW51bU1lbWJlcihnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksIGxpdGVyYWwpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgICAgIHN0b3JlLm5hdGl2ZUVudW1zLnB1c2goXG4gICAgICAgICAgICBmLmNyZWF0ZUVudW1EZWNsYXJhdGlvbih1bmRlZmluZWQsIHR5cGUsIGVudW1NZW1iZXJzKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0VHlwZSBvbiBuYXRpdmVFbnVtIG11c3QgcmV0dXJuIGFuIGlkZW50aWZpZXIgd2hlbiBuYXRpdmVFbnVtcyBpcyBcInJlc29sdmVcIidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RPcHRpb25hbFwiOiB7XG4gICAgICBjb25zdCBpbm5lciA9IGdldElubmVyVHlwZSh6b2QpXG4gICAgICBpZiAoIWlubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKGlubmVyLCAuLi5vdGhlckFyZ3VtZW50cykgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lciA9IGdldElubmVyVHlwZSh6b2QpXG4gICAgICBpZiAoIWlubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKGlubmVyLCAuLi5vdGhlckFyZ3VtZW50cykgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVsbCgpKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFR1cGxlXCI6IHtcbiAgICAgIC8vIHoudHVwbGUoW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBbc3RyaW5nLCBudW1iZXJdXG4gICAgICBjb25zdCBpdGVtcyA9IGdldFR1cGxlSXRlbXMoem9kKVxuICAgICAgY29uc3QgdHlwZXMgPSBpdGVtcy5tYXAoKG9wdGlvbjogWm9kVHlwZUFueSkgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR1cGxlVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFJlY29yZFwiOiB7XG4gICAgICAvLyB6LnJlY29yZCh6Lm51bWJlcigpKSAtPiB7IFt4OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICAgY29uc3QgcmVjb3JkVmFsdWVUeXBlID0gZ2V0UmVjb3JkVmFsdWVUeXBlKHpvZClcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHJlY29yZFZhbHVlVHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKHJlY29yZFZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVJbmRleFNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihcInhcIiksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlVHlwZVxuICAgICAgICApLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTWFwXCI6IHtcbiAgICAgIC8vIHoubWFwKHouc3RyaW5nKCkpIC0+IE1hcDxzdHJpbmc+XG4gICAgICBjb25zdCB7IGtleVR5cGU6IG1hcEtleVR5cGUsIHZhbHVlVHlwZTogbWFwVmFsdWVUeXBlIH0gPSBnZXRNYXBUeXBlcyh6b2QpXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBtYXBWYWx1ZVR5cGVcbiAgICAgICAgPyB6b2RUb1RzTm9kZShtYXBWYWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBrZXlUeXBlID0gbWFwS2V5VHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKG1hcEtleVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIk1hcFwiKSwgW1xuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RTZXRcIjoge1xuICAgICAgLy8gei5zZXQoei5zdHJpbmcoKSkgLT4gU2V0PHN0cmluZz5cbiAgICAgIGNvbnN0IHNldFZhbHVlVHlwZSA9IGdldFNldFZhbHVlVHlwZSh6b2QpXG4gICAgICBjb25zdCB0eXBlID0gc2V0VmFsdWVUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUoc2V0VmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJTZXRcIiksIFt0eXBlXSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEludGVyc2VjdGlvblwiOiB7XG4gICAgICAvLyB6Lm51bWJlcigpLmFuZCh6LnN0cmluZygpKSAtPiBudW1iZXIgJiBzdHJpbmdcbiAgICAgIGNvbnN0IHsgbGVmdDogaW50ZXJzZWN0TGVmdCwgcmlnaHQ6IGludGVyc2VjdFJpZ2h0IH0gPVxuICAgICAgICBnZXRJbnRlcnNlY3Rpb25QYXJ0cyh6b2QpXG4gICAgICBjb25zdCBsZWZ0ID0gaW50ZXJzZWN0TGVmdFxuICAgICAgICA/IHpvZFRvVHNOb2RlKGludGVyc2VjdExlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCByaWdodCA9IGludGVyc2VjdFJpZ2h0XG4gICAgICAgID8gem9kVG9Uc05vZGUoaW50ZXJzZWN0UmlnaHQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCBwcm9taXNlVHlwZSA9IGdldFByb21pc2VUeXBlKHpvZClcbiAgICAgIGNvbnN0IHR5cGUgPSBwcm9taXNlVHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKHByb21pc2VUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJQcm9taXNlXCIpLCBbXG4gICAgICAgIHR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RGdW5jdGlvblwiOiB7XG4gICAgICAvLyB6LmZ1bmN0aW9uKCkuYXJncyh6LnN0cmluZygpKS5yZXR1cm5zKHoubnVtYmVyKCkpIC0+IChhcmdzXzA6IHN0cmluZykgPT4gbnVtYmVyXG4gICAgICBjb25zdCB7IGFyZ3M6IGZ1bmNBcmdzLCByZXR1cm5zOiBmdW5jUmV0dXJucyB9ID0gZ2V0RnVuY3Rpb25QYXJ0cyh6b2QpXG4gICAgICBjb25zdCBhcmdzSXRlbXMgPSBmdW5jQXJncyA/IGdldFR1cGxlSXRlbXMoZnVuY0FyZ3MpIDogW11cbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSBhcmdzSXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IGZ1bmNSZXR1cm5zXG4gICAgICAgID8gem9kVG9Uc05vZGUoZnVuY1JldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXJndW1lbnRUeXBlcyxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REZWZhdWx0XCI6IHtcbiAgICAgIC8vIHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KCdoaScpIC0+IHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdElubmVyID0gZ2V0SW5uZXJUeXBlKHpvZClcbiAgICAgIGlmICghZGVmYXVsdElubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShkZWZhdWx0SW5uZXIsIC4uLm90aGVyQXJndW1lbnRzKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUN3RUEsU0FBUyxpQkFBaUI7QUFDekIsUUFBTSxRQUFRLG9CQUFJLElBQUk7QUFFdEIsYUFBVyxDQUFDLFdBQVcsS0FBSyxLQUFLLE9BQU8sUUFBUSxNQUFNLEdBQUc7QUFDeEQsZUFBVyxDQUFDLFdBQVcsS0FBSyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDdkQsYUFBTyxhQUFhO0FBQUEsUUFDbkIsTUFBTSxRQUFVLE1BQU07QUFBQSxRQUN0QixPQUFPLFFBQVUsTUFBTTtBQUFBLE1BQ3hCO0FBRUEsWUFBTSxhQUFhLE9BQU87QUFFMUIsWUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7QUFBQSxJQUM3QjtBQUVBLFdBQU8sZUFBZSxRQUFRLFdBQVc7QUFBQSxNQUN4QyxPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsSUFDYixDQUFDO0FBQUEsRUFDRjtBQUVBLFNBQU8sZUFBZSxRQUFRLFNBQVM7QUFBQSxJQUN0QyxPQUFPO0FBQUEsSUFDUCxZQUFZO0FBQUEsRUFDYixDQUFDO0FBRUQsU0FBTyxNQUFNLFFBQVE7QUFDckIsU0FBTyxRQUFRLFFBQVE7QUFFdkIsU0FBTyxNQUFNLE9BQU8sV0FBVztBQUMvQixTQUFPLE1BQU0sVUFBVSxZQUFZO0FBQ25DLFNBQU8sTUFBTSxVQUFVLFlBQVk7QUFDbkMsU0FBTyxRQUFRLE9BQU8sV0FBVyxzQkFBc0I7QUFDdkQsU0FBTyxRQUFRLFVBQVUsWUFBWSxzQkFBc0I7QUFDM0QsU0FBTyxRQUFRLFVBQVUsWUFBWSxzQkFBc0I7QUFHM0QsU0FBTyxpQkFBaUIsUUFBUTtBQUFBLElBQy9CLGNBQWM7QUFBQSxNQUNiLE1BQU0s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UUFBUSxjQUFjLEtBQUssSUFBSSxNQUEvQixnQkFBQUEsSUFBa0M7QUFDbkQsZ0JBQUksQ0FBQyxVQUFVO0FBQ2IscUJBQU87QUFBQSxnQkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZLGtCQUFBRixRQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiLCAib3MiLCAidHR5IiwgInN0eWxlcyIsICJjaGFsayIsICJtb2R1bGUiLCAibWVyZ2UyIiwgIm9zIiwgInBhdGgiLCAicGF0dGVybiIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJzbGFzaCIsICJnbG9iYnkiLCAibm9kZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwYXR0ZXJuIiwgIm1heCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBhcnNlIiwgImluZGV4IiwgIm1vZHVsZSIsICJwYXJzZSIsICJwYXR0ZXJuIiwgInJlcXVpcmVfY29uc3RhbnRzIiwgIm1vZHVsZSIsICJwYXRoIiwgInJlcXVpcmVfdXRpbHMiLCAicGF0aCIsICJtb2R1bGUiLCAicmVxdWlyZV9wYXJzZSIsICJtb2R1bGUiLCAicGFyc2UiLCAib3B0cyIsICJ2YWx1ZSIsICJyZXN0IiwgInNvdXJjZSIsICJtb2R1bGUiLCAicGF0aCIsICJwYXJzZSIsICJzdGF0ZSIsICJyZWdleCIsICJwYXR0ZXJuIiwgInJlcXVpcmVfcGljb21hdGNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0dGVybiIsICJyZWdleCIsICJwYXRoIiwgInBhdHRlcm4iLCAiaXNEeW5hbWljUGF0dGVybiIsICJpc05lZ2F0aXZlUGF0dGVybiIsICJtZXJnZTIiLCAicmVxdWlyZV91dGlscyIsICJmcyIsICJwYXRoIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJwYXRoIiwgInBhdGgiLCAicmVxdWlyZV9mcyIsICJmcyIsICJmcyIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicXVldWVNaWNyb3Rhc2siLCAicmVxdWlyZV9jb25zdGFudHMiLCAicmVxdWlyZV9mcyIsICJyZXF1aXJlX3V0aWxzIiwgImZzIiwgInJlcXVpcmVfYXN5bmMiLCAicGF0aCIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9mcyIsICJmcyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAiZnMiLCAicmVxdWlyZV9vdXQiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJlcXVpcmVfY29tbW9uIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc2V0dGluZ3MiLCAicGF0aCIsICJyZXF1aXJlX291dCIsICJyZXF1aXJlX3JlYWRlciIsICJwYXRoIiwgInBhdHRlcm4iLCAicmVxdWlyZV9zdHJlYW0iLCAicGF0dGVybiIsICJyZXF1aXJlX2FzeW5jIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJyZXF1aXJlX2VudHJ5IiwgInBhdGgiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicGF0dGVybiIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJmcyIsICJvcyIsICJyZXF1aXJlX291dCIsICJtb2R1bGUiLCAiYXNzZXJ0UGF0dGVybnNJbnB1dCIsICJGYXN0R2xvYiIsICJnZW5lcmF0ZVRhc2tzIiwgImlzRHluYW1pY1BhdHRlcm4iLCAicG9zaXgiLCAiZXNjYXBlUGF0aCIsICJjb252ZXJ0UGF0aFRvUGF0dGVybiIsICJ3aW4zMiIsICJmcyIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAiXyIsICJwYXR0ZXJuIiwgInJlZ2V4IiwgInBhdGgiLCAicGF0aCIsICJpbml0X3V0aWxpdGllcyIsICJwYXR0ZXJuIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW5pdF91dGlsaXRpZXMiLCAicGF0dGVybiIsICJwYXRoIiwgImdpdElnbm9yZSIsICJwcm9jZXNzIiwgImZhc3RHbG9iIiwgImZzIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJub3JtYWxpemVPcHRpb25zIiwgImluaXRfdXRpbGl0aWVzIiwgInBhdHRlcm4iLCAiZnMiLCAicGF0aCIsICJub2RlUGF0aCIsICJtZXJnZTIiLCAicGF0dGVybnMiLCAib3B0aW9ucyIsICJkaXJHbG9iIiwgImZhc3RHbG9iIiwgImltcG9ydF96b2QiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIiwgImNoYWxrIiwgImdsb2JieSIsICJwYXRoIiwgImRlZGVudCIsICJfIiwgInBhdGgiLCAiaW1wb3J0X2RlZGVudCIsICJwYXRoIiwgImNoYWxrIiwgImRlZGVudCIsICJfYSIsICJmcyIsICJmcyIsICJpbXBvcnRfem9kIiwgImltcG9ydF9kZWRlbnQiLCAidHMiLCAicGFyc2VEZXNjcmlwdGlvbiIsICJkZWRlbnQiLCAiaW1wb3J0X3pvZCIsICJfIiwgInByZXR0aWVyIiwgImZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJjcnlwdG8iLCAiX2EiLCAiYnVpbGQiXQp9Cg==
|