@decaf-ts/decorator-validation 1.6.0 → 1.6.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/decorator-validation.cjs +17 -16
- package/dist/decorator-validation.esm.cjs +17 -16
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/Model.js +1 -1
- package/lib/esm/model/validation.js +1 -1
- package/lib/esm/validation/Validators/MaxLengthValidator.js +3 -3
- package/lib/esm/validation/Validators/MinLengthValidator.js +3 -3
- package/lib/esm/validation/Validators/constants.d.ts +16 -15
- package/lib/esm/validation/Validators/constants.js +2 -1
- package/lib/esm/validation/decorators.js +11 -11
- package/lib/esm/validation/types.d.ts +8 -8
- package/lib/esm/validation/types.js +2 -2
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/Model.cjs +1 -1
- package/lib/model/validation.cjs +1 -1
- package/lib/validation/Validators/MaxLengthValidator.cjs +3 -3
- package/lib/validation/Validators/MinLengthValidator.cjs +3 -3
- package/lib/validation/Validators/constants.cjs +2 -1
- package/lib/validation/Validators/constants.d.ts +16 -15
- package/lib/validation/decorators.cjs +11 -11
- package/lib/validation/types.cjs +2 -1
- package/lib/validation/types.d.ts +8 -8
- package/package.json +1 -1
|
@@ -67,6 +67,7 @@ const ValidationKeys = {
|
|
|
67
67
|
TYPE: "type",
|
|
68
68
|
PASSWORD: "password",
|
|
69
69
|
LIST: "list",
|
|
70
|
+
FORMAT: "format",
|
|
70
71
|
};
|
|
71
72
|
/**
|
|
72
73
|
* @summary list of month names
|
|
@@ -1730,8 +1731,8 @@ let MaxLengthValidator = class MaxLengthValidator extends Validator {
|
|
|
1730
1731
|
hasErrors(value, options) {
|
|
1731
1732
|
if (typeof value === "undefined")
|
|
1732
1733
|
return;
|
|
1733
|
-
return value.length > options.
|
|
1734
|
-
? this.getMessage(options.message || this.message, options.
|
|
1734
|
+
return value.length > options.maxlength
|
|
1735
|
+
? this.getMessage(options.message || this.message, options.maxlength)
|
|
1735
1736
|
: undefined;
|
|
1736
1737
|
}
|
|
1737
1738
|
};
|
|
@@ -1815,8 +1816,8 @@ let MinLengthValidator = class MinLengthValidator extends Validator {
|
|
|
1815
1816
|
hasErrors(value, options) {
|
|
1816
1817
|
if (typeof value === "undefined")
|
|
1817
1818
|
return;
|
|
1818
|
-
return value.length < options.
|
|
1819
|
-
? this.getMessage(options.message || this.message, options.
|
|
1819
|
+
return value.length < options.minlength
|
|
1820
|
+
? this.getMessage(options.message || this.message, options.minlength)
|
|
1820
1821
|
: undefined;
|
|
1821
1822
|
}
|
|
1822
1823
|
};
|
|
@@ -2103,7 +2104,7 @@ function required(message = DEFAULT_ERROR_MESSAGES.REQUIRED) {
|
|
|
2103
2104
|
*/
|
|
2104
2105
|
function min(value, message = DEFAULT_ERROR_MESSAGES.MIN) {
|
|
2105
2106
|
return propMetadata(Validation.key(ValidationKeys.MIN), {
|
|
2106
|
-
|
|
2107
|
+
[ValidationKeys.MIN]: value,
|
|
2107
2108
|
message: message,
|
|
2108
2109
|
types: [Number.name, Date.name],
|
|
2109
2110
|
});
|
|
@@ -2121,7 +2122,7 @@ function min(value, message = DEFAULT_ERROR_MESSAGES.MIN) {
|
|
|
2121
2122
|
*/
|
|
2122
2123
|
function max(value, message = DEFAULT_ERROR_MESSAGES.MAX) {
|
|
2123
2124
|
return propMetadata(Validation.key(ValidationKeys.MAX), {
|
|
2124
|
-
|
|
2125
|
+
[ValidationKeys.MAX]: value,
|
|
2125
2126
|
message: message,
|
|
2126
2127
|
types: [Number.name, Date.name],
|
|
2127
2128
|
});
|
|
@@ -2139,7 +2140,7 @@ function max(value, message = DEFAULT_ERROR_MESSAGES.MAX) {
|
|
|
2139
2140
|
*/
|
|
2140
2141
|
function step(value, message = DEFAULT_ERROR_MESSAGES.STEP) {
|
|
2141
2142
|
return propMetadata(Validation.key(ValidationKeys.STEP), {
|
|
2142
|
-
|
|
2143
|
+
[ValidationKeys.STEP]: value,
|
|
2143
2144
|
message: message,
|
|
2144
2145
|
types: [Number.name],
|
|
2145
2146
|
});
|
|
@@ -2157,7 +2158,7 @@ function step(value, message = DEFAULT_ERROR_MESSAGES.STEP) {
|
|
|
2157
2158
|
*/
|
|
2158
2159
|
function minlength(value, message = DEFAULT_ERROR_MESSAGES.MIN_LENGTH) {
|
|
2159
2160
|
return propMetadata(Validation.key(ValidationKeys.MIN_LENGTH), {
|
|
2160
|
-
|
|
2161
|
+
[ValidationKeys.MIN_LENGTH]: value,
|
|
2161
2162
|
message: message,
|
|
2162
2163
|
types: [String.name, Array.name, Set.name],
|
|
2163
2164
|
});
|
|
@@ -2175,7 +2176,7 @@ function minlength(value, message = DEFAULT_ERROR_MESSAGES.MIN_LENGTH) {
|
|
|
2175
2176
|
*/
|
|
2176
2177
|
function maxlength(value, message = DEFAULT_ERROR_MESSAGES.MAX_LENGTH) {
|
|
2177
2178
|
return propMetadata(Validation.key(ValidationKeys.MAX_LENGTH), {
|
|
2178
|
-
|
|
2179
|
+
[ValidationKeys.MAX_LENGTH]: value,
|
|
2179
2180
|
message: message,
|
|
2180
2181
|
types: [String.name, Array.name, Set.name],
|
|
2181
2182
|
});
|
|
@@ -2193,7 +2194,7 @@ function maxlength(value, message = DEFAULT_ERROR_MESSAGES.MAX_LENGTH) {
|
|
|
2193
2194
|
*/
|
|
2194
2195
|
function pattern(value, message = DEFAULT_ERROR_MESSAGES.PATTERN) {
|
|
2195
2196
|
return propMetadata(Validation.key(ValidationKeys.PATTERN), {
|
|
2196
|
-
|
|
2197
|
+
[ValidationKeys.PATTERN]: typeof value === "string" ? value : value.toString(),
|
|
2197
2198
|
message: message,
|
|
2198
2199
|
types: [String.name],
|
|
2199
2200
|
});
|
|
@@ -2210,7 +2211,7 @@ function pattern(value, message = DEFAULT_ERROR_MESSAGES.PATTERN) {
|
|
|
2210
2211
|
*/
|
|
2211
2212
|
function email(message = DEFAULT_ERROR_MESSAGES.EMAIL) {
|
|
2212
2213
|
return propMetadata(Validation.key(ValidationKeys.EMAIL), {
|
|
2213
|
-
|
|
2214
|
+
[ValidationKeys.PATTERN]: DEFAULT_PATTERNS.EMAIL,
|
|
2214
2215
|
message: message,
|
|
2215
2216
|
types: [String.name],
|
|
2216
2217
|
});
|
|
@@ -2227,7 +2228,7 @@ function email(message = DEFAULT_ERROR_MESSAGES.EMAIL) {
|
|
|
2227
2228
|
*/
|
|
2228
2229
|
function url(message = DEFAULT_ERROR_MESSAGES.URL) {
|
|
2229
2230
|
return propMetadata(Validation.key(ValidationKeys.URL), {
|
|
2230
|
-
|
|
2231
|
+
[ValidationKeys.PATTERN]: DEFAULT_PATTERNS.URL,
|
|
2231
2232
|
message: message,
|
|
2232
2233
|
types: [String.name],
|
|
2233
2234
|
});
|
|
@@ -2267,7 +2268,7 @@ function type(types, message = DEFAULT_ERROR_MESSAGES.TYPE) {
|
|
|
2267
2268
|
function date(format = "dd/MM/yyyy", message = DEFAULT_ERROR_MESSAGES.DATE) {
|
|
2268
2269
|
return (target, propertyKey) => {
|
|
2269
2270
|
propMetadata(Validation.key(ValidationKeys.DATE), {
|
|
2270
|
-
|
|
2271
|
+
[ValidationKeys.FORMAT]: format,
|
|
2271
2272
|
message: message,
|
|
2272
2273
|
types: [Date.name],
|
|
2273
2274
|
})(target, propertyKey);
|
|
@@ -2315,7 +2316,7 @@ function date(format = "dd/MM/yyyy", message = DEFAULT_ERROR_MESSAGES.DATE) {
|
|
|
2315
2316
|
*/
|
|
2316
2317
|
function password(pattern = DEFAULT_PATTERNS.PASSWORD.CHAR8_ONE_OF_EACH, message = DEFAULT_ERROR_MESSAGES.PASSWORD) {
|
|
2317
2318
|
return propMetadata(Validation.key(ValidationKeys.PASSWORD), {
|
|
2318
|
-
|
|
2319
|
+
[ValidationKeys.PATTERN]: pattern,
|
|
2319
2320
|
message: message,
|
|
2320
2321
|
types: [String.name],
|
|
2321
2322
|
});
|
|
@@ -2518,7 +2519,7 @@ function serializedBy(serializer, ...args) {
|
|
|
2518
2519
|
* @namespace Format
|
|
2519
2520
|
* @memberOf module:decorator-validation
|
|
2520
2521
|
*/
|
|
2521
|
-
const VERSION = "1.6.
|
|
2522
|
+
const VERSION = "1.6.1";
|
|
2522
2523
|
|
|
2523
2524
|
export { DAYS_OF_WEEK_NAMES, DEFAULT_ERROR_MESSAGES, DEFAULT_PATTERNS, DateValidator, DefaultHashingMethod, DefaultSerializationMethod, EmailValidator, Hashing, JSONSerializer, ListValidator, MONTH_NAMES, MaxLengthValidator, MaxValidator, MinLengthValidator, MinValidator, Model, ModelErrorDefinition, ModelKeys, ModelRegistryManager, PasswordValidator, PatternValidator, Primitives, RequiredValidator, ReservedModels, Serialization, StepValidator, TypeValidator, URLValidator, VERSION, Validation, ValidationKeys, Validator, ValidatorRegistry, bindDateToString, bindModelPrototype, bulkModelRegister, construct, date, dateFromFormat, email, findLastProtoBeforeObject, formatDate, hashCode, hashObj, hashedBy, isModel, isPropertyModel, isValidDate, isValidator, jsTypes, list, max, maxlength, min, minlength, model, parseDate, password, pattern, prop, propMetadata, regexpParser, required, serializedBy, set, sf, step, stringFormat, twoDigitPad, type, url, validate, validator };
|
|
2524
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ3MudHMiLCIuLi9zcmMvdXRpbHMvZGF0ZXMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9oYXNoaW5nLnRzIiwiLi4vc3JjL21vZGVsL01vZGVsRXJyb3JEZWZpbml0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0YW50cy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnkudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGF0dGVyblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRW1haWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xpc3RWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heExlbmd0aFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWF4VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5MZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01pblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGFzc3dvcmRWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1JlcXVpcmVkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9TdGVwVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9UeXBlVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9VUkxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBNb2RlbCBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb25cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBwcmVmaXggdG8gYWxsIG90aGVyIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIHR5cGUga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFSQU1TIG1ldGhvZCBwYXJhbXMga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVUVVJOIG1ldGhvZCByZXR1cm4ga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUwgbW9kZWwga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5DSE9SIGFuY2hvciBrZXkuIHdpbGwgc2VydmUgYXMgYSBnaG9zdCBwcm9wZXJ0eSBpbiB0aGUgbW9kZWxcbiAqXG4gKiBAY29uc3RhbnQgTW9kZWxLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxLZXlzIHtcbiAgUkVGTEVDVCA9IFwiZGVjYWYubW9kZWwuXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsXCIsXG4gIENPTlNUUlVDVElPTiA9IFwiY29uc3RydWN0ZWQtYnlcIixcbiAgQVRUUklCVVRFID0gXCJfX2F0dHJpYnV0ZXNcIixcbiAgSEFTSElORyA9IFwiaGFzaGluZ1wiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG59XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIGtleXMgdXNlZCBmb3IgdmFsaWRhdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIHByZWZpeGVzIG90aGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIHNldHMgYXMgcmVxdWlyZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmaW5lcyBtaW4gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVggZGVmaW5lcyBtYXggdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIGRlZmluZXMgc3RlcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmaW5lcyBtaW4gbGVuZ3RoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZpbmVzIG1heCBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmluZXMgcGF0dGVyblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmluZXMgZW1haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgZGVmaW5lcyB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIGRlZmluZXMgZGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgZGVmaW5lcyB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgZGVmaW5lcyBwYXNzd29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmaW5lcyBsaXN0XG4gKlxuICogQGNvbnN0YW50IFZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9dmFsaWRhdGlvbi5gLFxuICBWQUxJREFUT1I6IFwidmFsaWRhdG9yXCIsXG4gIFJFUVVJUkVEOiBcInJlcXVpcmVkXCIsXG4gIE1JTjogXCJtaW5cIixcbiAgTUFYOiBcIm1heFwiLFxuICBTVEVQOiBcInN0ZXBcIixcbiAgTUlOX0xFTkdUSDogXCJtaW5sZW5ndGhcIixcbiAgTUFYX0xFTkdUSDogXCJtYXhsZW5ndGhcIixcbiAgUEFUVEVSTjogXCJwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcImVtYWlsXCIsXG4gIFVSTDogXCJ1cmxcIixcbiAgREFURTogXCJkYXRlXCIsXG4gIFRZUEU6IFwidHlwZVwiLFxuICBQQVNTV09SRDogXCJwYXNzd29yZFwiLFxuICBMSVNUOiBcImxpc3RcIixcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgbGlzdCBvZiBtb250aCBuYW1lc1xuICogQGRlc2NyaXB0aW9uIFN0b3JlcyBtb250aCBuYW1lcy4gQ2FuIGJlIGNoYW5nZWQgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3Nlc1xuICpcbiAqIEBjb25zdGFudCBNT05USF9OQU1FU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgTU9OVEhfTkFNRVMgPSBbXG4gIFwiSmFudWFyeVwiLFxuICBcIkZlYnJ1YXJ5XCIsXG4gIFwiTWFyY2hcIixcbiAgXCJBcHJpbFwiLFxuICBcIk1heVwiLFxuICBcIkp1bmVcIixcbiAgXCJKdWx5XCIsXG4gIFwiQXVndXN0XCIsXG4gIFwiU2VwdGVtYmVyXCIsXG4gIFwiT2N0b2JlclwiLFxuICBcIk5vdmVtYmVyXCIsXG4gIFwiRGVjZW1iZXJcIixcbl07XG5cbi8qKlxuICogQHN1bW1hcnkgbGlzdCBvZiBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIG5hbWVzIGZvciBkYXlzIG9mIHRoZSB3ZWVrLiBDYW4gYmUgY2hhbmdlZCBmb3IgbG9jYWxpemF0aW9uIHB1cnBvc2VzXG4gKlxuICogQGNvbnN0YW50IERBWVNfT0ZfV0VFS19OQU1FU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgREFZU19PRl9XRUVLX05BTUVTID0gW1xuICBcIlN1bmRheVwiLFxuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG5dO1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZXNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVRVUlSRUQgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWF9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREVGQVVMVCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVNTV09SRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMSVNUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1RfSU5TSURFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMX05PVF9GT1VORCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY29uc3RhbnQgREVGQVVMVF9FUlJPUl9NRVNTQUdFU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgUkVRVUlSRUQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxuICBNSU46IFwiVGhlIG1pbmltdW0gdmFsdWUgaXMgezB9XCIsXG4gIE1BWDogXCJUaGUgbWF4aW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUlOX0xFTkdUSDogXCJUaGUgbWluaW11bSBsZW5ndGggaXMgezB9XCIsXG4gIE1BWF9MRU5HVEg6IFwiVGhlIG1heGltdW0gbGVuZ3RoIGlzIHswfVwiLFxuICBQQVRURVJOOiBcIlRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLFxuICBFTUFJTDogXCJUaGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgZW1haWxcIixcbiAgVVJMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBVUkxcIixcbiAgVFlQRTogXCJJbnZhbGlkIHR5cGUuIEV4cGVjdGVkIHswfSwgcmVjZWl2ZWQgezF9XCIsXG4gIFNURVA6IFwiSW52YWxpZCB2YWx1ZS4gTm90IGEgc3RlcCBvZiB7MH1cIixcbiAgREFURTogXCJJbnZhbGlkIHZhbHVlLiBub3QgYSB2YWxpZCBEYXRlXCIsXG4gIERFRkFVTFQ6IFwiVGhlcmUgaXMgYW4gRXJyb3JcIixcbiAgUEFTU1dPUkQ6XG4gICAgXCJNdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycyBhbmQgY29udGFpbiBvbmUgb2YgbnVtYmVyLCBsb3dlciBhbmQgdXBwZXIgY2FzZSBsZXR0ZXJzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXIgKEAkISUqPyZfLS4sKVwiLFxuICBMSVNUOiBcIkludmFsaWQgbGlzdCBvZiB7MH1cIixcbiAgTU9ERUxfTk9UX0ZPVU5EOiBcIk5vIG1vZGVsIHJlZ2lzdGVyZWQgdW5kZXIgezB9XCIsXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgZGVmYXVsdCByZWdleHAgcGF0dGVybnMgdXNlZFxuICpcbiAqIEBlbnVtIERFRkFVTFRfUEFUVEVSTlNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFUVEVSTlMgPSB7XG4gIEVNQUlMOlxuICAgIC9bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqQCg/OlthLXpBLVowLTldKD86W2EtejAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVowLTldKD86W2EtekEtWjAtOS1dKlthLXpBLVowLTldKT8vLFxuICBVUkw6IC9eKD86KD86KD86aHR0cHM/fGZ0cCk6KT9cXC9cXC8pKD86XFxTKyg/OjpcXFMqKT9AKT8oPzooPyEoPzoxMHwxMjcpKD86XFwuXFxkezEsM30pezN9KSg/ISg/OjE2OVxcLjI1NHwxOTJcXC4xNjgpKD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXowLTlcXHUwMGExLVxcdWZmZmZdW2EtejAtOVxcdTAwYTEtXFx1ZmZmZl8tXXswLDYyfSk/W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1cXC4pKyg/OlthLXpcXHUwMGExLVxcdWZmZmZdezIsfVxcLj8pKSg/OjpcXGR7Miw1fSk/KD86Wy8/I11cXFMqKT8kL2ksXG4gIFBBU1NXT1JEOiB7XG4gICAgQ0hBUjhfT05FX09GX0VBQ0g6XG4gICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mX1xcLS4sXSlbQS1aYS16XFxkQCQhJSo/Jl9cXC0uLF17OCx9JC9nLFxuICB9LFxufTtcbiIsIi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gW2FyZ3NdIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5Gb3JtYXRcbiAqIEBjYXRlZ29yeSBGb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zvcm1hdChzdHJpbmc6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT09IFwidW5kZWZpbmVkXCJcbiAgICAgID8gYXJnc1tudW1iZXJdLnRvU3RyaW5nKClcbiAgICAgIDogXCJ1bmRlZmluZWRcIjtcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwcm92aWRlIHN0cmluZyBmb3JtYXQgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIEMjJ3Mgc3RyaW5nLmZvcm1hdFxuICogQGRlc2NyaXB0aW9uIGFsaWFzIGZvciB7QGxpbmsgc3RyaW5nRm9ybWF0fVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzIHJlcGxhY2VtZW50cyBtYWRlIGJ5IG9yZGVyIG9mIGFwcGVhcmFuY2UgKHJlcGxhY2VtZW50MCB3aWwgcmVwbGFjZSB7MH0gYW5kIHNvIG9uKVxuICogQHJldHVybiB7c3RyaW5nfSBmb3JtYXR0ZWQgc3RyaW5nXG4gKlxuICogQGZ1bmN0aW9uIHNmXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkZvcm1hdFxuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgY29uc3Qgc2YgPSBzdHJpbmdGb3JtYXQ7XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEQVlTX09GX1dFRUtfTkFNRVMsXG4gIE1PTlRIX05BTUVTLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV2ZXJzZXMgdGhlIHByb2Nlc3MgZnJvbSB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZSB0aGUgZGF0ZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIGJhY2sgaW50byBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IHRoZSBkYXRlIGZvcm1hdFxuICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUgZnJvbSB0aGUgZm9ybWF0IG9yIHRoZSBzdGFuZGFyZCBuZXcgRGF0ZSh7QHByb3AgZGF0ZX0pIGlmIHRoZSBzdHJpbmcgY291bGRuJ3QgYmUgcGFyc2VkIChhcmUgeW91IHN1cmUgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBzdHJpbmc/KVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Gb3JtYXQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZykge1xuICBsZXQgZm9ybWF0UmVnZXhwOiBzdHJpbmcgPSBmb3JtYXQ7XG5cbiAgLy8gSG91clxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaGhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ISC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSEhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJIXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaW51dGVzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL21tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtbVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL20vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIFNlY29uZHNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvc3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic1wiLCBcIig/PHNlY29uZHM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2RkLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkZFwiLCBcIig/PGRheT5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZFwiLCBcIig/PGRheT5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXkgT2YgV2Vla1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWVsc2UtaWZcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcblxuICAvLyBZZWFyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5eXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5eXlcIiwgXCIoPzx5ZWFyPlxcXFxkezR9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXlcIiwgXCIoPzx5ZWFyPlxcXFxkezJ9KVwiKTtcblxuICAvLyBNb250aFxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1NXCIsIFwiKD88bW9udGhuYW1lPlxcXFx3KylcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1cIiwgXCIoPzxtb250aG5hbWVzbWFsbD5cXFxcdyspXCIpO1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1cIiwgXCIoPzxtb250aD5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTVwiLCBcIig/PG1vbnRoPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbGlzIGFuZCBBbSBQbVxuICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHBcbiAgICAucmVwbGFjZShcIlNcIiwgXCIoPzxtaWxpcz5cXFxcZHsxLDN9KVwiKVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIFwiKD88YW1wbT5cXFxcd3syfSlcIik7XG5cbiAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChmb3JtYXRSZWdleHAsIFwiZ1wiKTtcblxuICBjb25zdCBtYXRjaDoge1xuICAgIGdyb3Vwczoge1xuICAgICAgeWVhcj86IHN0cmluZztcbiAgICAgIGRheT86IHN0cmluZztcbiAgICAgIGFtcG0/OiBzdHJpbmc7XG4gICAgICBob3VyPzogc3RyaW5nO1xuICAgICAgbWludXRlcz86IHN0cmluZztcbiAgICAgIHNlY29uZHM/OiBzdHJpbmc7XG4gICAgICBtaWxpcz86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZT86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZXNtYWxsPzogc3RyaW5nO1xuICAgICAgbW9udGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSA9IHJlZ2V4cC5leGVjKGRhdGUpIGFzIGFueTtcblxuICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5ncm91cHMpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblxuICBjb25zdCBzYWZlUGFyc2VJbnQgPSBmdW5jdGlvbiAobj86IHN0cmluZykge1xuICAgIGlmICghbikgcmV0dXJuIDA7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VJbnQobik7XG5cbiAgICByZXR1cm4gaXNOYU4ocmVzdWx0KSA/IDAgOiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgeWVhciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMueWVhcik7XG4gIGNvbnN0IGRheSA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuZGF5KTtcblxuICBjb25zdCBhbVBtID0gbWF0Y2guZ3JvdXBzLmFtcG07XG4gIGxldCBob3VyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5ob3VyKTtcblxuICBpZiAoYW1QbSkgaG91ciA9IGFtUG0gPT09IFwiUE1cIiA/IGhvdXIgKyAxMiA6IGhvdXI7XG5cbiAgY29uc3QgbWludXRlcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWludXRlcyk7XG4gIGNvbnN0IHNlY29uZHMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnNlY29uZHMpO1xuICBjb25zdCBtcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWlsaXMpO1xuXG4gIGNvbnN0IG1vbnRoTmFtZSA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWU7XG4gIGNvbnN0IG1vbnRoTmFtZVNtYWxsID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZXNtYWxsO1xuICBsZXQgbW9udGg6IG51bWJlciB8IHN0cmluZyA9IG1hdGNoLmdyb3Vwcy5tb250aCBhcyBzdHJpbmc7XG4gIGlmIChtb250aE5hbWUpIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtb250aE5hbWUpO1xuICBlbHNlIGlmIChtb250aE5hbWVTbWFsbCkge1xuICAgIGNvbnN0IG0gPSBNT05USF9OQU1FUy5maW5kKChtKSA9PlxuICAgICAgbS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobW9udGhOYW1lU21hbGwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGlmICghbSkgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtKTtcbiAgfSBlbHNlIG1vbnRoID0gc2FmZVBhcnNlSW50KGAke21vbnRofWApO1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlcywgc2Vjb25kcywgbXMpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJpbmRzIGEgZGF0ZSBmb3JtYXQgdG8gYSBzdHJpbmdcbiAqIEBwYXJhbSB7RGF0ZX0gW2RhdGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nKGRhdGU6IERhdGUgfCB1bmRlZmluZWQsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGlmICghZGF0ZSkgcmV0dXJuO1xuICBjb25zdCBmdW5jID0gKCkgPT4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgXCJ0b0lTT1N0cmluZ1wiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuYyxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgLy8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGRhdGUsIERhdGUucHJvdG90eXBlKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBpbnN0YW5jZU9mIERhdGVcbiAqIEBwYXJhbSBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZGF0ZSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIgJiZcbiAgICAhTnVtYmVyLmlzTmFOKGRhdGUpXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwYWQgbnVtYmVyc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqXG4gKiBAZnVuY3Rpb24gdHdvRGlnaXRQYWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBwYXR0ZXJuU3RyOiBzdHJpbmcgPSBcInl5eXkvTU0vZGRcIikge1xuICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpLFxuICAgIG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldE1vbnRoKCksXG4gICAgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGhvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICBtaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpLFxuICAgIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgbWlsaXNlY29uZHM6IG51bWJlciA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgaDogbnVtYmVyID0gaG91ciAlIDEyLFxuICAgIGhoOiBzdHJpbmcgPSB0d29EaWdpdFBhZChoKSxcbiAgICBISDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaG91ciksXG4gICAgbW06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKG1pbnV0ZSksXG4gICAgc3M6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKHNlY29uZCksXG4gICAgYWFhOiBzdHJpbmcgPSBob3VyIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCIsXG4gICAgRUVFRTogc3RyaW5nID0gREFZU19PRl9XRUVLX05BTUVTW2RhdGUuZ2V0RGF5KCldLFxuICAgIEVFRTogc3RyaW5nID0gRUVFRS5zdWJzdHIoMCwgMyksXG4gICAgZGQ6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGRheSksXG4gICAgTTogbnVtYmVyID0gbW9udGggKyAxLFxuICAgIE1NOiBzdHJpbmcgPSB0d29EaWdpdFBhZChNKSxcbiAgICBNTU1NOiBzdHJpbmcgPSBNT05USF9OQU1FU1ttb250aF0sXG4gICAgTU1NOiBzdHJpbmcgPSBNTU1NLnN1YnN0cigwLCAzKSxcbiAgICB5eXl5OiBzdHJpbmcgPSB5ZWFyICsgXCJcIixcbiAgICB5eTogc3RyaW5nID0geXl5eS5zdWJzdHIoMiwgMik7XG4gIC8vIGNoZWNrcyB0byBzZWUgaWYgbW9udGggbmFtZSB3aWxsIGJlIHVzZWRcbiAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHJcbiAgICAucmVwbGFjZShcImhoXCIsIGhoKVxuICAgIC5yZXBsYWNlKFwiaFwiLCBoLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJISFwiLCBISClcbiAgICAucmVwbGFjZShcIkhcIiwgaG91ci50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwibW1cIiwgbW0pXG4gICAgLnJlcGxhY2UoXCJtXCIsIG1pbnV0ZS50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwic3NcIiwgc3MpXG4gICAgLnJlcGxhY2UoXCJzXCIsIHNlY29uZC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiU1wiLCBtaWxpc2Vjb25kcy50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiZGRcIiwgZGQpXG4gICAgLnJlcGxhY2UoXCJkXCIsIGRheS50b1N0cmluZygpKVxuXG4gICAgLnJlcGxhY2UoXCJFRUVFXCIsIEVFRUUpXG4gICAgLnJlcGxhY2UoXCJFRUVcIiwgRUVFKVxuICAgIC5yZXBsYWNlKFwieXl5eVwiLCB5eXl5KVxuICAgIC5yZXBsYWNlKFwieXlcIiwgeXkpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgYWFhKTtcbiAgaWYgKHBhdHRlcm5TdHIuaW5kZXhPZihcIk1NTVwiKSA+IC0xKSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NTU1cIiwgTU1NTSkucmVwbGFjZShcIk1NTVwiLCBNTU0pO1xuICB9IGVsc2Uge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTVwiLCBNTSkucmVwbGFjZShcIk1cIiwgTS50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gcGF0dGVyblN0cjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXJzZXMgYSBkYXRlIGZyb20gYSBzcGVjaWZpZWQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZyB8IERhdGUgfCBudW1iZXJ9IFt2XVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGZvcm1hdDogc3RyaW5nLCB2Pzogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKHYgYXMgRGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LnRvU3RyaW5nKCksIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQodiwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkRGF0ZSh2KSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdiwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkICR7dn1gKTtcbiAgfVxuICByZXR1cm4gYmluZERhdGVUb1N0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbn1cbiIsImltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wKGtleTogc3RyaW5nID0gTW9kZWxLZXlzLkFUVFJJQlVURSkge1xuICByZXR1cm4gKG1vZGVsOiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KTogdm9pZCA9PiB7XG4gICAgbGV0IHByb3BzOiBzdHJpbmdbXTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBrZXkpKSB7XG4gICAgICBwcm9wcyA9IChtb2RlbCBhcyBhbnkpW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BzID0gKG1vZGVsIGFzIGFueSlba2V5XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXByb3BzLmluY2x1ZGVzKHByb3BlcnR5S2V5IGFzIHN0cmluZykpXG4gICAgICBwcm9wcy5wdXNoKHByb3BlcnR5S2V5IGFzIHN0cmluZyk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTWV0YWRhdGE8Vj4oa2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7XG4gIHJldHVybiBhcHBseShwcm9wKCksIG1ldGFkYXRhPFY+KGtleSwgdmFsdWUpKTtcbn1cbiIsIi8qKlxuICogQHN1bW1hcnkgTWltaWNzIEphdmEncyBTdHJpbmcncyBIYXNoIGltcGxlbWVudGF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBEYXRlfSBvYmpcbiAqIEByZXR1cm4ge251bWJlcn0gaGFzaCB2YWx1ZSBvZiBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaENvZGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICogQGNhdGVnb3J5IEhhc2hpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hDb2RlKG9iajogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sIHwgRGF0ZSk6IHN0cmluZyB7XG4gIG9iaiA9IFN0cmluZyhvYmopO1xuICBsZXQgaGFzaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gb2JqLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXJhY3RlcjtcbiAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0ZWggdHlwZSBmb3IgYSBIYXNoaW5nIGZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkhhc2hpbmdcbiAqIEBjYXRlZ29yeSBIYXNoaW5nXG4gKi9cbmV4cG9ydCB0eXBlIEhhc2hpbmdGdW5jdGlvbiA9ICh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhhc2hlcyBhbiBvYmplY3QgYnkgY29tYmluaW5nIHRoZSBoYXNoIG9mIGFsbCBpdHMgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSByZXN1bHRpbmcgaGFzaFxuICpcbiAqIEBmdW5jdGlvbiBoYXNoT2JqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkhhc2hpbmdcbiAqIEBjYXRlZ29yeSBIYXNoaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoT2JqKG9iajogUmVjb3JkPHN0cmluZywgYW55PiB8IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaFJlZHVjZXIgPSBmdW5jdGlvbiAoaDogbnVtYmVyIHwgc3RyaW5nLCBlbDogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBjb25zdCBlbEhhc2ggPSBoYXNoRnVuY3Rpb24oZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBlbEhhc2ggPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gaGFzaEZ1bmN0aW9uKCgoaCBhcyBzdHJpbmcpIHx8IFwiXCIpICsgaGFzaEZ1bmN0aW9uKGVsKSk7XG5cbiAgICBoID0gaCB8fCAwO1xuICAgIGggPSAoKGggYXMgbnVtYmVyKSA8PCA1KSAtIChoIGFzIG51bWJlcikgKyBlbEhhc2g7XG4gICAgcmV0dXJuIGggJiBoO1xuICB9O1xuXG4gIGNvbnN0IGZ1bmM6IEhhc2hpbmdGdW5jdGlvbiA9IGhhc2hDb2RlO1xuXG4gIGNvbnN0IGhhc2hGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwic3ltYm9sXCJdLmluZGV4T2YodHlwZW9mIHZhbHVlKSAhPT0gLTEpXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZS50b1N0cmluZygpKTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gZnVuYyh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnJlZHVjZShoYXNoUmVkdWNlciwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gKE9iamVjdC52YWx1ZXModmFsdWUpIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLnJlZHVjZShcbiAgICAgIGhhc2hSZWR1Y2VyLFxuICAgICAgdW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nIHwgbnVtYmVyXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBPYmplY3QudmFsdWVzKG9iaikucmVkdWNlKGhhc2hSZWR1Y2VyLCAwKTtcblxuICByZXR1cm4gKHR5cGVvZiByZXN1bHQgPT09IFwibnVtYmVyXCIgPyBNYXRoLmFicyhyZXN1bHQpIDogcmVzdWx0KS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEhhc2hpbmdNZXRob2QgPSBcImRlZmF1bHRcIjtcblxuZXhwb3J0IGNsYXNzIEhhc2hpbmcge1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0SGFzaGluZ01ldGhvZDtcblxuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPHN0cmluZywgSGFzaGluZ0Z1bmN0aW9uPiA9IHtcbiAgICBkZWZhdWx0OiBoYXNoT2JqLFxuICB9O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKSByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gaGFzaGluZyBtZXRob2QgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmdW5jOiBIYXNoaW5nRnVuY3Rpb24sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFzaGluZyBtZXRob2QgJHtrZXl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IGZ1bmM7XG4gICAgaWYgKHNldERlZmF1bHQpIHRoaXMuY3VycmVudCA9IGtleTtcbiAgfVxuXG4gIHN0YXRpYyBoYXNoKG9iajogYW55LCBtZXRob2Q/OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKCFtZXRob2QpIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbnQpKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXREZWZhdWx0KG1ldGhvZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5nZXQobWV0aG9kKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWxFcnJvcnMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhlbHBlciBDbGFzcyB0byBob2xkIHRoZSBlcnJvciByZXN1bHRzXG4gKiBAZGVzY3JpcHRpb24gaG9sZHMgZXJyb3IgcmVzdWx0cyBpbiBhbiAnaW5kZXhhYmxlJyBtYW5uZXJcbiAqIHdoaWxlIHN0aWxsIHByb3ZpZGluZyB0aGUgc2FtZSByZXN1bHQgb24gdG9TdHJpbmdcbiAqXG4gKiBAcGFyYW0ge01vZGVsRXJyb3JzfSBlcnJvcnNcbiAqXG4gKiBAY2xhc3MgTW9kZWxFcnJvckRlZmluaXRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsRXJyb3JEZWZpbml0aW9uIHtcbiAgW2luZGV4ZXI6IHN0cmluZ106XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4gICAgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IE1vZGVsRXJyb3JzKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIGVycm9ycykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlcnJvcnMsIHByb3ApICYmIGVycm9yc1twcm9wXSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMgYXMgYW55LCBwcm9wLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBlcnJvcnNbcHJvcF0sXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgT3V0cHV0cyB0aGUgY2xhc3MgdG8gYSBuaWNlIHJlYWRhYmxlIHN0cmluZ1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZjogYW55ID0gdGhpcyBhcyBhbnk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlbGYpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaykgPT5cbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VsZiwgaykgJiZcbiAgICAgICAgICB0eXBlb2Ygc2VsZltrXSAhPT0gXCJmdW5jdGlvblwiXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nLCBwcm9wKSA9PiB7XG4gICAgICAgIGxldCBwcm9wRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHNlbGZbcHJvcF0pLnJlZHVjZShcbiAgICAgICAgICAocHJvcEFjY3VtOiB1bmRlZmluZWQgfCBzdHJpbmcsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcm9wQWNjdW0pIHByb3BBY2N1bSA9IHNlbGZbcHJvcF1ba2V5XTtcbiAgICAgICAgICAgIGVsc2UgcHJvcEFjY3VtICs9IGBcXG4ke3NlbGZbcHJvcF1ba2V5XX1gO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BBY2N1bTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwcm9wRXJyb3IpIHtcbiAgICAgICAgICBwcm9wRXJyb3IgPSBgJHtwcm9wfSAtICR7cHJvcEVycm9yfWA7XG4gICAgICAgICAgaWYgKCFhY2N1bSkgYWNjdW0gPSBwcm9wRXJyb3I7XG4gICAgICAgICAgZWxzZSBhY2N1bSArPSBgXFxuJHtwcm9wRXJyb3J9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFwiXCIpO1xuICB9XG59XG4iLCIvKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIHJlbGV2YW50IEpTIHByaW1pdGl2ZXNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RSSU5HIHJlZmVyZW5jZXMgdGhlIHN0cmluZyBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVIgcmVmZXJlbmNlcyB0aGUgbnVtYmVyIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJPT0xFQU4gcmVmZXJlbmNlcyB0aGUgYm9vbGVhbiBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdJTlQgcmVmZXJlbmNlcyB0aGUgYmlnaW50IHByaW1pdGl2ZVxuICpcbiAqIEBjb25zdGFudCBQcmltaXRpdmVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIFByaW1pdGl2ZXMge1xuICBTVFJJTkcgPSBcInN0cmluZ1wiLFxuICBOVU1CRVIgPSBcIm51bWJlclwiLFxuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIEJJR0lOVCA9IFwiYmlnaW50XCIsXG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgUmVzZXJ2ZWQgbW9kZWwgbmFtZXMgdG8gaWdub3JlIGR1cmluZyBNb2RlbCByZWJ1aWxkaW5nXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklOR1xuICogQHByb3BlcnR5IHtzdHJpbmd9IE9CSkVDVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJPT0xFQU5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdJTlRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFXG4gKlxuICogQGNvbnN0YW50IFJlc2VydmVkTW9kZWxzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIFJlc2VydmVkTW9kZWxzIHtcbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgT0JKRUNUID0gXCJvYmplY3RcIixcbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgQk9PTEVBTiA9IFwiYm9vbGVhblwiLFxuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxuICBEQVRFID0gXCJkYXRlXCIsXG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgYmFzaWMgc3VwcG9ydGVkIGpzIHR5cGVzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0cmluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFycmF5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbnVtYmVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYm9vbGVhblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN5bWJvbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbnVsbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVFxuICpcbiAqIEBjb25zdGFudCBqc1R5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBqc1R5cGVzID0gW1xuICBcInN0cmluZ1wiLFxuICBcImFycmF5XCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiYm9vbGVhblwiLFxuICBcInN5bWJvbFwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwib2JqZWN0XCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwibnVsbFwiLFxuICBcImJpZ2ludFwiLFxuXTtcbiIsImltcG9ydCB7IFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IElWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBEdWNrIHR5cGluZyBmb3IgVmFsaWRhdG9yc1xuICogQGZ1bmN0aW9uIGlzVmFsaWRhdG9yXG4gKiBAcGFyYW0gdmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkYXRvcih2YWw6IGFueSkge1xuICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yICYmIHZhbFtcImhhc0Vycm9yc1wiXTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCYXNlIEltcGxlbWVudGF0aW9uIG9mIGEgVmFsaWRhdG9yIFJlZ2lzdHJ5XG4gKlxuICogQHByb3Age1ZhbGlkYXRvcltdfSBbdmFsaWRhdG9yc10gdGhlIGluaXRpYWwgdmFsaWRhdG9ycyB0byByZWdpc3RlclxuICpcbiAqIEBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeVxuICogQGltcGxlbWVudHMgSVZhbGlkYXRvclJlZ2lzdHJ5PFQ+XG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5PFQgZXh0ZW5kcyBWYWxpZGF0b3I+XG4gIGltcGxlbWVudHMgSVZhbGlkYXRvclJlZ2lzdHJ5PFQ+XG57XG4gIHByaXZhdGUgY2FjaGU6IGFueSA9IHt9O1xuICBwcml2YXRlIGN1c3RvbUtleUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKC4uLnZhbGlkYXRvcnM6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVmFsaWRhdG9yKVtdKSB7XG4gICAgdGhpcy5jdXN0b21LZXlDYWNoZSA9IHt9O1xuICAgIHRoaXMucmVnaXN0ZXIoLi4udmFsaWRhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSBjdXN0b20ga2V5c1xuICAgKi9cbiAgZ2V0Q3VzdG9tS2V5cygpOiB7IFtpbmRleGVyOiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY3VzdG9tS2V5Q2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIGtleXNcbiAgICovXG4gIGdldEtleXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBWYWxpZGF0b3I+KHZhbGlkYXRvcktleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsaWRhdG9yS2V5IGluIHRoaXMuY2FjaGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2xhc3NPckluc3RhbmNlID0gdGhpcy5jYWNoZVt2YWxpZGF0b3JLZXldO1xuICAgIGlmIChpc1ZhbGlkYXRvcihjbGFzc09ySW5zdGFuY2UpKSByZXR1cm4gY2xhc3NPckluc3RhbmNlIGFzIFQ7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBjbGFzc09ySW5zdGFuY2UuZGVmYXVsdCB8fCBjbGFzc09ySW5zdGFuY2U7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoKTtcbiAgICB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV0gPSBpbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFZhbGlkYXRvckRlZmluaXRpb24gfCBUKVtdXG4gICk6IHZvaWQge1xuICAgIHZhbGlkYXRvci5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICBpZiAoaXNWYWxpZGF0b3IodikpIHtcbiAgICAgICAgLy8gY29uc3QgayA9XG5cbiAgICAgICAgaWYgKCh2IGFzIFZhbGlkYXRvckRlZmluaXRpb24pLnZhbGlkYXRpb25LZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhY2hlWyh2IGFzIFZhbGlkYXRvckRlZmluaXRpb24pLnZhbGlkYXRpb25LZXldID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdmFsaWRhdGlvbktleSwgdmFsaWRhdG9yLCBzYXZlIH0gPSB2IGFzIFZhbGlkYXRvckRlZmluaXRpb247XG4gICAgICAgIGlmICh2YWxpZGF0aW9uS2V5IGluIHRoaXMuY2FjaGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYWNoZVt2YWxpZGF0aW9uS2V5XSA9IHZhbGlkYXRvcjtcbiAgICAgICAgaWYgKCFzYXZlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBvYmpbdmFsaWRhdGlvbktleS50b1VwcGVyQ2FzZSgpXSA9IHZhbGlkYXRpb25LZXk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21LZXlDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY3VzdG9tS2V5Q2FjaGUsIG9iaik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBJVmFsaWRhdG9yUmVnaXN0cnksIFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tIFwiLi9WYWxpZGF0b3JzL1ZhbGlkYXRvclJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgU3RhdGljIGNsYXNzIGFjdGluZyBhcyBhIG5hbWVzcGFjZSBmb3IgdGhlIFZhbGlkYXRpb25cbiAqXG4gKiBAY2xhc3MgVmFsaWRhdGlvblxuICogQHN0YXRpY1xuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk/OiBJVmFsaWRhdG9yUmVnaXN0cnk8VmFsaWRhdG9yPiA9XG4gICAgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhY3RpbmcgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtJVmFsaWRhdG9yUmVnaXN0cnl9IHZhbGlkYXRvclJlZ2lzdHJ5IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRvciBSZWdpc3RyeVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFZhbGlkYXRvcik6IFZhbGlkYXRvcn0gW21pZ3JhdGlvbkhhbmRsZXJdIHRoZSBtZXRob2QgdG8gbWFwIHRoZSB2YWxpZGF0b3IgaWYgcmVxdWlyZWQ7XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkoXG4gICAgdmFsaWRhdG9yUmVnaXN0cnk6IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+LFxuICAgIG1pZ3JhdGlvbkhhbmRsZXI/OiAodmFsaWRhdG9yOiBWYWxpZGF0b3IpID0+IFZhbGlkYXRvclxuICApIHtcbiAgICBpZiAobWlncmF0aW9uSGFuZGxlciAmJiBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5KVxuICAgICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeS5nZXRLZXlzKCkuZm9yRWFjaCgoazogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHZhbGlkYXRvclJlZ2lzdHJ5LmdldChrKTtcbiAgICAgICAgaWYgKHZhbGlkYXRvcikgdmFsaWRhdG9yUmVnaXN0cnkucmVnaXN0ZXIobWlncmF0aW9uSGFuZGxlcih2YWxpZGF0b3IpKTtcbiAgICAgIH0pO1xuICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkgPSB2YWxpZGF0b3JSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAqXG4gICAqIEByZXR1cm4gSVZhbGlkYXRvclJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgVmFsaWRhdG9yUmVnaXN0cnl9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIVZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkpXG4gICAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7XG4gICAgcmV0dXJuIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgdmFsaWRhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0b3JLZXkgb25lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXN9XG4gICAqIEByZXR1cm4ge1ZhbGlkYXRvciB8IHVuZGVmaW5lZH0gdGhlIHJlZ2lzdGVyZWQgVmFsaWRhdG9yIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBub25vIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBrZXlcbiAgICovXG4gIHN0YXRpYyBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4odmFsaWRhdG9yS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5nZXRSZWdpc3RyeSgpLmdldCh2YWxpZGF0b3JLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycyBvbnRvIHRoZSByZWdpc3RyeVxuICAgKlxuICAgKiBAcGFyYW0ge1RbXSB8IFZhbGlkYXRvckRlZmluaXRpb25bXX0gdmFsaWRhdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIFZhbGlkYXRpb24uZ2V0UmVnaXN0cnkoKS5yZWdpc3RlciguLi52YWxpZGF0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIE1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zXG4gICAqIEBkZXNjcmlwdGlvbiBjb25jYXRlbmF0ZXMge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFRkxFQ1R9IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqL1xuICBzdGF0aWMga2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCB2YWxpZGF0aW9uIGtleXNcbiAgICovXG4gIHN0YXRpYyBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFJlZ2lzdHJ5KCkuZ2V0S2V5cygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbEVycm9yRGVmaW5pdGlvbiB9IGZyb20gXCIuL01vZGVsRXJyb3JEZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgUmVzZXJ2ZWRNb2RlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRhYmxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzTW9kZWwsIE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBNb2RlbEVycm9ycyxcbiAgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbixcbn0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vdHlwZXNcIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFuYWx5c2VzIHRoZSBkZWNvcmF0aW9ucyBvZiB0aGUgcHJvcGVydGllcyBhbmQgdmFsaWRhdGVzIHRoZSBvYmogYWNjb3JkaW5nIHRvIHRoZW1cbiAqXG4gKiBAdHlwZWRlZiBUIGV4dGVuZHMgTW9kZWxcbiAqIEBwcm9wIHtUfSBvYmogTW9kZWwgb2JqZWN0IHRvIHZhbGlkYXRlXG4gKiBAcHJvcCB7c3RyaW5nW119IFtwcm9wc1RvSWdub3JlXSBvYmplY3QgcHJvcGVydGllcyB0byBpZ25vcmUgaW4gdGhlIHZhbGlkYXRpb25cbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG9iajogVCxcbiAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbik6IE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcHJvcCBpbiBvYmopXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkgJiZcbiAgICAgIHByb3BzVG9JZ25vcmUuaW5kZXhPZihwcm9wKSA9PT0gLTFcbiAgICApXG4gICAgICBkZWNvcmF0ZWRQcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgb2JqLFxuICAgICAgICAgIHByb3BcbiAgICAgICAgKSBhcyBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uXG4gICAgICApO1xuXG4gIGxldCByZXN1bHQ6IE1vZGVsRXJyb3JzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZGVjb3JhdGVkUHJvcGVydHkgb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9ID0gZGVjb3JhdGVkUHJvcGVydHk7XG5cbiAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGRlZmF1bHRUeXBlRGVjb3JhdG9yOiBEZWNvcmF0b3JNZXRhZGF0YSA9IGRlY29yYXRvcnNbMF07XG5cbiAgICAvLyB0cmllcyB0byBmaW5kIGFueSB0eXBlIGRlY29yYXRvcnMgb3Igb3RoZXIgZGVjb3JhdG9ycyB0aGF0IGFscmVhZHkgZW5mb3JjZSB0eXBlICh0aGUgb25lcyB3aXRoIHRoZSBhbGxvd2VkIHR5cGVzIHByb3BlcnR5IGRlZmluZWQpLiBpZiBzbywgc2tpcCB0aGUgZGVmYXVsdCB0eXBlIHZlcmlmaWNhdGlvblxuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4ge1xuICAgICAgICBpZiAoZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gISFkLnByb3BzLnR5cGVzPy5maW5kKFxuICAgICAgICAgICh0KSA9PiB0ID09PSBkZWZhdWx0VHlwZURlY29yYXRvci5wcm9wcy5uYW1lXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICkge1xuICAgICAgZGVjb3JhdG9ycy5zaGlmdCgpOyAvLyByZW1vdmUgdGhlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgdGhlIHR5cGUgd2lsbCBhbHJlYWR5IGJlIGNoZWNrZWRcbiAgICB9XG5cbiAgICBsZXQgZXJyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICAgICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkYXRvciBmb3IgJHtkZWNvcmF0b3Iua2V5fWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgICAgIGRlY29yYXRvci5rZXkgPT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICAgICAgPyBbZGVjb3JhdG9yLnByb3BzXVxuICAgICAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gICAgICBjb25zdCBlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbGlkYXRvci5oYXNFcnJvcnMoXG4gICAgICAgIChvYmogYXMgYW55KVtwcm9wLnRvU3RyaW5nKCldLFxuICAgICAgICBkZWNvcmF0b3JQcm9wcyBhcyBWYWxpZGF0b3JPcHRpb25zXG4gICAgICApO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycnMgPSBlcnJzIHx8IHt9O1xuICAgICAgICBlcnJzW2RlY29yYXRvci5rZXldID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHRbZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgfVxuICB9XG5cbiAgLy8gdGVzdHMgbmVzdGVkIGNsYXNzZXNcbiAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrKSA9PiAhcmVzdWx0IHx8ICFyZXN1bHRba10pKSB7XG4gICAgbGV0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIGlmIGEgbmVzdGVkIE1vZGVsXG4gICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnMuZmlsdGVyKFxuICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICApO1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgY29uc3QgY2xhenogPSBkZWMucHJvcHMubmFtZVxuICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICA/IGRlYy5wcm9wcy5jdXN0b21UeXBlc1xuICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIGZvciAoY29uc3QgYyBvZiBjbGF6eikge1xuICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgdHlwZURlY29yYXRvcktleSA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRTtcbiAgICAgICAgY29uc3QgdHlwZXM6IGFueSA9XG4gICAgICAgICAgYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IHR5cGVEZWNvcmF0b3JLZXlcbiAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBsZXQgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZXMgJiYgdHlwZXMucHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21UeXBlcyA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgICAgPyB0eXBlcy5wcm9wcy5jbGFzc1xuICAgICAgICAgICAgOiB0eXBlcy5wcm9wcy5jdXN0b21UeXBlcztcbiAgICAgICAgICBpZiAoY3VzdG9tVHlwZXMpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXMgPSBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgICA/IGN1c3RvbVR5cGVzLm1hcCgodCkgPT4gYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgIDogW2N1c3RvbVR5cGVzLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSAocHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIE1vZGVsKS5oYXNFcnJvcnMoKVxuICAgICAgICAgICAgICA6IGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlIEFycmF5Lm5hbWU6XG4gICAgICAgICAgY2FzZSBTZXQubmFtZTpcbiAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgICAgIChkOiB7IGtleTogc3RyaW5nIH0pID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gKFxuICAgICAgICAgICAgICAgICAgYyA9PT0gQXJyYXkubmFtZVxuICAgICAgICAgICAgICAgICAgICA/IChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgOiAvLyBJZiBpdCdzIGEgU2V0XG4gICAgICAgICAgICAgICAgICAgICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS52YWx1ZXMoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHY6IFZhbGlkYXRhYmxlKSA9PiB2YWxpZGF0ZShwcm9wLCB2KSlcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGU6IGFueSkgPT4gISFlKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnI/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0Li4uXG4gICAgICAgICAgICAgICAgICBlcnIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdGUocHJvcCwgKG9iaiBhcyBhbnkpW3Byb3BdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oc2YoXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0cyBub3Q6IFwiICsgZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0W3Byb3BdID0gZXJyIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdCkgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBTZXJpYWxpemF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgQ29tcGFyYWJsZSxcbiAgQ29uc3RydWN0b3IsXG4gIEhhc2hhYmxlLFxuICBNb2RlbEFyZyxcbiAgTW9kZWxCdWlsZGVyRnVuY3Rpb24sXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFNlcmlhbGl6YWJsZSxcbiAgVmFsaWRhdGFibGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgaXNFcXVhbCwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgdmFsaWRhdGUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIYXNoaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hhc2hpbmdcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IGpzVHlwZXMsIFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmxldCBtb2RlbEJ1aWxkZXJGdW5jdGlvbjogTW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5sZXQgYWN0aW5nTW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT47XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5TW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgdGFyZ2V0OiBNLFxuICBhdHRyaWJ1dGU6IHN0cmluZ1xuKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01vZGVsKCh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgYW55PilbYXR0cmlidXRlXSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIHRhcmdldCwgYXR0cmlidXRlKTtcbiAgcmV0dXJuIE1vZGVsLmdldChtZXRhZGF0YS5uYW1lKSA/IG1ldGFkYXRhLm5hbWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRm9yIFNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIHRoZSB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHkgb2YgYSB7QGxpbmsgTW9kZWx9IHRvIGRpc2NvdmVyIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICpcbiAqIEBmdW5jdGlvbiBpc01vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICB0cnkge1xuICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbCB8fCAhIU1vZGVsLmdldE1ldGFkYXRhKHRhcmdldCBhcyBhbnkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kZWxSZWdpc3RyeSBJbnRlcmZhY2VcbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxNb2RlbD5cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeTxUIGV4dGVuZHMgTW9kZWw+ID0gQnVpbGRlclJlZ2lzdHJ5PFQ+O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgY2xhc3MgdG8gZW5hYmxlIHNlcmlhbGl6YXRpb24gYW5kIGNvcnJlY3QgcmVidWlsZGluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbmNob3JLZXkgZGVmYXVsdHMgdG8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9LiBUaGUgcHJvcGVydHkgbmFtZSB3aGVyZSB0aGUgcmVnaXN0ZXJlZCBjbGFzcyBuYW1lIGlzIHN0b3JlZDtcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW59IFt0ZXN0RnVuY3Rpb25dIG1ldGhvZCB0byB0ZXN0IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYSBNb2RlbCBPYmplY3QuIGRlZmF1bHRzIHRvIHtAbGluayBpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeVxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnk8VD4ge1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPFQ+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGdW5jdGlvbjogKG9iajogb2JqZWN0KSA9PiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHRlc3RGdW5jdGlvbjogKG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbiA9IGlzTW9kZWwpIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZWdpc3RlciBuZXcgTW9kZWxzXG4gICAqIEBwYXJhbSB7YW55fSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIHdoZW4gbm90IGRlZmluZWQsIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPFQ+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IFQge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIlByb3ZpZGVkIGNsYXNzIHswfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdFwiLCBuYW1lKVxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuY2FjaGVbbmFtZV0ob2JqKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJ1bGsgUmVnaXN0ZXJzIE1vZGVsc1xuICogQGRlc2NyaXB0aW9uIFVzZWZ1bCB3aGVuIHVzaW5nIGJ1bmRsZXJzIHRoYXQgbWlnaHQgbm90IGV2YWx1YXRlIGFsbCB0aGUgY29kZSBhdCBvbmNlXG4gKlxuICogQHBhcmFtIHtBcnJheTxDb25zdHJ1Y3RvcjxUPj4gfCBBcnJheTx7bmFtZTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD59Pn0gW21vZGVsc11cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtNb2RlbFJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIC4uLm1vZGVsczogKENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KVtdXG4pIHtcbiAgbW9kZWxzLmZvckVhY2goXG4gICAgKG06IENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gPSAoXG4gICAgICAgIG0uY29uc3RydWN0b3IgPyBtLmNvbnN0cnVjdG9yIDogbVxuICAgICAgKSBhcyBDb25zdHJ1Y3RvcjxUPjtcbiAgICAgIE1vZGVsLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCAobSBhcyBDb25zdHJ1Y3RvcjxUPikubmFtZSk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIFZhbGlkYXRhYmxlIE1vZGVsIG9iamVjdFxuICogQGRlc2NyaXB0aW9uIE1lYW50IHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBhbGwgTW9kZWwgY2xhc3Nlc1xuICpcbiAqIE1vZGVsIG9iamVjdHMgbXVzdDpcbiAqICAtIEhhdmUgYWxsIHRoZWlyIHJlcXVpcmVkIHByb3BlcnRpZXMgbWFya2VkIHdpdGggJyEnO1xuICogIC0gSGF2ZSBhbGwgdGhlaXIgb3B0aW9uYWwgcHJvcGVydGllcyBtYXJrZWQgYXMgJz8nOlxuICpcbiAqIEBwYXJhbSB7TW9kZWwgfCB7fX0gbW9kZWwgYmFzZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSBwcm9wZXJ0aWVzIGZyb21cbiAqXG4gKiBAY2xhc3MgTW9kZWxcbiAqIEBhYnN0cmFjdFxuICogQGltcGxlbWVudHMgVmFsaWRhdGFibGVcbiAqIEBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgICBAcmVxdWlyZWQoKVxuICogICAgICAgICAgcmVxdWlyZWRQcm9wZXJ0eU5hbWUhOiBQcm9wZXJ0eVR5cGU7XG4gKlxuICogICAgICAgICAgb3B0aW9uYWxQcm9wZXJ0eU5hbWU/OiBQcm9wZXJ0eVR5cGU7XG4gKiAgICAgIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsXG4gIGltcGxlbWVudHMgVmFsaWRhdGFibGUsIFNlcmlhbGl6YWJsZSwgSGFzaGFibGUsIENvbXBhcmFibGU8TW9kZWw+XG57XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPE1vZGVsPikge31cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIGl0cyBkZWNvcmF0ZWQgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0ge2FueVtdfSBbZXhjZXB0aW9uc10gcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0IHRvIGJlIGlnbm9yZWQgZm9yIHRoZSB2YWxpZGF0aW9uLiBNYXJrZWQgYXMgJ2FueScgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbiBidXQgZXhwZWN0cyBzdHJpbmdzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IGFueVtdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDb21wYXJlIG9iamVjdCBlcXVhbGl0eSByZWN1cnNpdmVseVxuICAgKiBAcGFyYW0ge2FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhjZXB0aW9uc10gcHJvcGVydHkgbmFtZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvblxuICAgKi9cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSwgLi4uZXhjZXB0aW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLCBvYmosIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHNlcmlhbGl6ZWQgbW9kZWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50bHkgZGVmaW5lZCB7QGxpbmsgU2VyaWFsaXplcn1cbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5zZXJpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGUgdGhlIGltcGxlbWVudGF0aW9uIGZvciBqcydzICd0b1N0cmluZygpJyB3aGljaCBzdWNrcy4uLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLCB1bmRlZmluZWQsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvYmplY3QgaGFzaC4gUmVsaWVzIG9uIGEgdmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKYXZhJ3Mgc3RyaW5nIGhhc2g7XG4gICAqL1xuICBwdWJsaWMgaGFzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5oYXNoKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlc2VyaWFsaXplcyBhIE1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIGlmIGl0IGZhaWxzIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSxcbiAgICAgIHRoaXMuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLnNlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShcbiAgICAgICAgc3RyLFxuICAgICAgICBtZXRhZGF0YS5zZXJpYWxpemVyLFxuICAgICAgICAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgb25lcyBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBJdGVyYXRlcyBhbGwgY29tbW9uIHByb3BlcnRpZXMgb2Ygb2JqIChpZiBleGlzdGluZykgYW5kIHNlbGYsIGFuZCBjb3BpZXMgdGhlbSBvbnRvIHNlbGZcbiAgICpcbiAgICogQHBhcmFtIHtUfSBzZWxmXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNlbGY6IFQsXG4gICAgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogVCB7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBNb2RlbC5nZXRBdHRyaWJ1dGVzKHNlbGYpKSB7XG4gICAgICAoc2VsZiBhcyBhbnkpW3Byb3BdID0gKG9iaiBhcyBhbnkpW3Byb3BdIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVwb3B1bGF0ZXMgdGhlIGluc3RhbmNlIHdpdGggdGhlIG9uZXMgZnJvbSB0aGUgbmV3IE1vZGVsIE9iamVjdFxuICAgKiBAZGVzY3JpcHRpb24gSXRlcmF0ZXMgYWxsIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG9iaiAoaWYgZXhpc3RpbmcpIGFuZCBzZWxmLCBhbmQgY29waWVzIHRoZW0gb250byBzZWxmLlxuICAgKiBJcyBhd2FyZSBvZiBuZXN0ZWQgTW9kZWwgT2JqZWN0cyBhbmQgcmVidWlsZHMgdGhlbSBhbHNvLlxuICAgKiBXaGVuIExpc3QgcHJvcGVydGllcyBhcmUgZGVjb3JhdGVkIHdpdGgge0BsaW5rIGxpc3R9LCB0aGV5IGxpc3QgaXRlbXMgd2lsbCBhbHNvIGJlIHJlYnVpbHRcbiAgICpcbiAgICogQHBhcmFtIHtUfSBzZWxmXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbD4oc2VsZjogVCwgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUIHtcbiAgICBpZiAoIW9iaikgb2JqID0ge307XG5cbiAgICBsZXQgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSwgZGVjOiBEZWNvcmF0b3JNZXRhZGF0YTtcblxuICAgIGNvbnN0IHByb3BzID0gTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPVxuICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdIHx8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgKHNlbGYgYXMgYW55KVtwcm9wXSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICBjb25zdCBwcm9wTSA9IGlzUHJvcGVydHlNb2RlbChzZWxmLCBwcm9wKTtcbiAgICAgIGlmIChwcm9wTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSxcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wTSA9PT0gXCJzdHJpbmdcIiA/IHByb3BNIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbERlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPVxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApLmRlY29yYXRvcnM7XG4gICAgICBkZWNvcmF0b3JzID0gYWxsRGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAgIChkOiBEZWNvcmF0b3JNZXRhZGF0YSkgPT5cbiAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEVdLmluZGV4T2YoZC5rZXkpICE9PSAtMVxuICAgICAgKTtcbiAgICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihzZihcImZhaWxlZCB0byBmaW5kIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5IHswfVwiLCBwcm9wKSk7XG4gICAgICBkZWMgPSBkZWNvcmF0b3JzLnBvcCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgY29uc3QgY2xhenogPSBkZWMucHJvcHMubmFtZVxuICAgICAgICA/IFtkZWMucHJvcHMubmFtZV1cbiAgICAgICAgOiBBcnJheS5pc0FycmF5KGRlYy5wcm9wcy5jdXN0b21UeXBlcylcbiAgICAgICAgICA/IGRlYy5wcm9wcy5jdXN0b21UeXBlc1xuICAgICAgICAgIDogW2RlYy5wcm9wcy5jdXN0b21UeXBlc107XG4gICAgICBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT5cbiAgICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgICApIGFzIHN0cmluZ1tdO1xuXG4gICAgICBjbGF6ei5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGlmIChyZXNlcnZlZC5pbmRleE9mKGMudG9Mb3dlckNhc2UoKSkgPT09IC0xKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6TmFtZSA9IChsaXN0RGVjLnByb3BzLmNsYXp6IGFzIHN0cmluZ1tdKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICh0OiBzdHJpbmcpID0+ICFqc1R5cGVzLmluY2x1ZGVzKHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IFwiQXJyYXlcIilcbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgICAgICAgICAgICAgIClbcHJvcF0ubWFwKChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1wib2JqZWN0XCIsIFwiZnVuY3Rpb25cIl0uaW5jbHVkZXModHlwZW9mIGVsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNb2RlbC5idWlsZChlbCwgY2xhenpOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVsO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCJTZXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtcIm9iamVjdFwiLCBcImZ1bmN0aW9uXCJdLmluY2x1ZGVzKHR5cGVvZiB2KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZChNb2RlbC5idWlsZCh2LCBjbGF6ek5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdKVxuICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSBNb2RlbC5idWlsZChcbiAgICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgYW55KVtwcm9wXSxcbiAgICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZy4gd2UgaGF2ZSBubyByZWdpc3RyeSBvZiB0aGlzIGNsYXNzXG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259XG4gICAqIEBwYXJhbSB7TW9kZWxCdWlsZGVyRnVuY3Rpb259IFtidWlsZGVyXVxuICAgKi9cbiAgc3RhdGljIHNldEJ1aWxkZXIoYnVpbGRlcj86IE1vZGVsQnVpbGRlckZ1bmN0aW9uKSB7XG4gICAgbW9kZWxCdWlsZGVyRnVuY3Rpb24gPSBidWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufVxuICAgKi9cbiAgc3RhdGljIGdldEJ1aWxkZXIoKTogTW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtb2RlbEJ1aWxkZXJGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn1cbiAgICpcbiAgICogQHJldHVybiBNb2RlbFJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgTW9kZWxSZWdpc3RyeU1hbmFnZXJ9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIWFjdGluZ01vZGVsUmVnaXN0cnkpIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAgICByZXR1cm4gYWN0aW5nTW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGluZ01vZGVsUmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnl9IG1vZGVsUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KG1vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+KSB7XG4gICAgYWN0aW5nTW9kZWxSZWdpc3RyeSA9IG1vZGVsUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmVnaXN0ZXIgbmV3IE1vZGVsc1xuICAgKiBAcGFyYW0ge2FueX0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSB3aGVuIG5vdCBkZWZpbmVkLCB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkXG4gICAqXG4gICAqIEBzZWUgTW9kZWxSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbmFtZT86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqXG4gICAqIEBzZWUgTW9kZWxSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgTW9kZWw+KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXp6XSB3aGVuIHByb3ZpZGVkLCBpdCB3aWxsIGF0dGVtcHQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHRocm93cyBFcnJvciBJZiBjbGF6eiBpcyBub3QgZm91bmQsIG9yIG9iaiBpcyBub3QgYSB7QGxpbmsgTW9kZWx9IG1lYW5pbmcgaXQgaGFzIG5vIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfSBwcm9wZXJ0eVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGNsYXp6Pzogc3RyaW5nXG4gICk6IFQge1xuICAgIHJldHVybiBNb2RlbC5nZXRSZWdpc3RyeSgpLmJ1aWxkKG9iaiwgY2xhenopO1xuICB9XG5cbiAgc3RhdGljIGdldE1ldGFkYXRhPFYgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IFYpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcbiAgICBpZiAoIW1ldGFkYXRhKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImNvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm92aWRlZCBcIiArIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgc3RhdGljIGdldEF0dHJpYnV0ZXM8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8Vj4gfCBWKSB7XG4gICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBwcm90b3R5cGUgPVxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbFxuICAgICAgICA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcbiAgICAgICAgOiAobW9kZWwgYXMgYW55KS5wcm90b3R5cGU7XG4gICAgd2hpbGUgKHByb3RvdHlwZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBwcm90b3R5cGVbTW9kZWxLZXlzLkFUVFJJQlVURV07XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4ucHJvcHMpO1xuICAgICAgfVxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgZXF1YWxzPFYgZXh0ZW5kcyBNb2RlbD4ob2JqMTogViwgb2JqMjogViwgLi4uZXhjZXB0aW9uczogYW55W10pIHtcbiAgICByZXR1cm4gaXNFcXVhbChvYmoxLCBvYmoyLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBoYXNFcnJvcnM8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogViwgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdmFsaWRhdGUobW9kZWwsIC4uLnByb3BzVG9JZ25vcmUpO1xuICB9XG5cbiAgc3RhdGljIHNlcmlhbGl6ZTxWIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBWKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5zZXJpYWxpemVyKVxuICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uc2VyaWFsaXplKFxuICAgICAgICB0aGlzLFxuICAgICAgICBtZXRhZGF0YS5zZXJpYWxpemVyLFxuICAgICAgICAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uc2VyaWFsaXplKG1vZGVsKTtcbiAgfVxuXG4gIHN0YXRpYyBoYXNoPFYgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IFYpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBNb2RlbC5rZXkoTW9kZWxLZXlzLkhBU0hJTkcpLFxuICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLmFsZ29yaXRobSlcbiAgICAgIHJldHVybiBIYXNoaW5nLmhhc2gobW9kZWwsIG1ldGFkYXRhLmFsZ29yaXRobSwgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pKTtcbiAgICByZXR1cm4gSGFzaGluZy5oYXNoKG1vZGVsKTtcbiAgfVxuICAvKipcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgTW9kZWxLZXlzI1JFRkxFQ1R9IHdpdGggdGhlIHByb3ZpZGVkIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMga2V5KHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIE1vZGVsS2V5cy5SRUZMRUNUICsgc3RyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZCA9IFwianNvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFNlcmlhbGl6ZXJ9IGluIEpTT04gZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gSlMncyBuYXRpdmUgSlNPTi5zdHJpbmdpZnkgKHVzZWQgaGVyZSkgaXMgbm90IGRldGVybWluaXN0aWNcbiAqIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBoYXNoaW5nIHB1cnBvc2VzXG4gKlxuICogVG8ga2VlcCBkZXBlbmRlbmNpZXMgbG93LCB3ZSB3aWxsIG5vdCBpbXBsZW1lbnQgdGhpcywgYnV0IHdlIHJlY29tbWVuZFxuICogaW1wbGVtZW50aW5nIGEgc2ltaWxhciB7QGxpbmsgSlNPTlNlcmlhbGl6ZXJ9IHVzaW5nICdkZXRlcm1pbmlzdGljLWpzb24nIGxpYnJhcmllc1xuICpcbiAqIEBjbGFzcyBKU09OU2VyaWFsaXplclxuICogQGltcGxlbWVudHMgU2VyaWFsaXplclxuICpcbiAqIEBjYXRlZ29yeSBTZXJpYWxpemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBKU09OU2VyaWFsaXplcjxUIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgU2VyaWFsaXplcjxUPiB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHByZXBhcmVzIHRoZSBtb2RlbCBmb3Igc2VyaWFsaXphdGlvblxuICAgKiBAZGVzY3JpcHRpb24gcmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGUgb2JqZWN0LCBjb250YWluaW5nIGFuIGVudW1lcmFibGUge0BsaW5rIE1vZGVsS2V5cyNBTkNIT1J9IHByb3BlcnR5XG4gICAqIHNvIHRoZSBvYmplY3QgY2FuIGJlIHJlY29nbml6ZWQgdXBvbiBkZXNlcmlhbGl6YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlU2VyaWFsaXplKG1vZGVsOiBUKSB7XG4gICAgLy8gVE9ETzogbmVzdGVkIHByZXNlcmlhbGl6YXRpb24gKHNvIGluY3JlYXNlIHBlcmZvcm1hbmNlIHdoZW4gZGVzZXJpYWxpemluZylcbiAgICBjb25zdCB0b1NlcmlhbGl6ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGVsKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IE1vZGVsLmdldE1ldGFkYXRhKG1vZGVsKTtcbiAgICB0b1NlcmlhbGl6ZVtNb2RlbEtleXMuQU5DSE9SXSA9IG1ldGFkYXRhIHx8IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlYnVpbGRzIGEgbW9kZWwgZnJvbSBhIHNlcmlhbGl6YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbHMgdG8gcGFyc2UgdGhlIHN0cmluZywgb3IgdG8gYnVpbGQgdGhlIG1vZGVsXG4gICAqL1xuICBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkZXNlcmlhbGl6YXRpb25bTW9kZWxLZXlzLkFOQ0hPUl07XG4gICAgaWYgKCFjbGFzc05hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcbiAgICBjb25zdCBtb2RlbDogVCA9IE1vZGVsLmJ1aWxkKGRlc2VyaWFsaXphdGlvbiwgY2xhc3NOYW1lKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbFxuICAgKiBAcGFyYW0ge1R9IG1vZGVsXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBmYWlscyB0byBzZXJpYWxpemVcbiAgICovXG4gIHNlcmlhbGl6ZShtb2RlbDogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb24ge1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZDtcblxuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPHN0cmluZywgU2VyaWFsaXplcjxhbnk+PiA9IHtcbiAgICBqc29uOiBuZXcgSlNPTlNlcmlhbGl6ZXIoKSxcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwcml2YXRlIHN0YXRpYyBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNlcmlhbGl6YXRpb24gbWV0aG9kIHJlZ2lzdGVyZWQgdW5kZXIgJHtrZXl9YCk7XG4gIH1cblxuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZnVuYzogQ29uc3RydWN0b3I8U2VyaWFsaXplcjxhbnk+PixcbiAgICBzZXREZWZhdWx0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJpYWxpemF0aW9uIG1ldGhvZCAke2tleX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IGZ1bmMoKTtcbiAgICBpZiAoc2V0RGVmYXVsdCkgdGhpcy5jdXJyZW50ID0ga2V5O1xuICB9XG5cbiAgc3RhdGljIHNlcmlhbGl6ZShvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShvYmo6IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpLmRlc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcclxuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcclxuICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBhciA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvd25LZXlzKG8pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XHJcbiAgICAgICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbn1cclxuXHJcbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xyXG4gICAgZnVuY3Rpb24gZmFpbChlKSB7XHJcbiAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB2YXIgciwgcyA9IDA7XHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcyB8PSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xyXG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19lc0RlY29yYXRlOiBfX2VzRGVjb3JhdGUsXHJcbiAgICBfX3J1bkluaXRpYWxpemVyczogX19ydW5Jbml0aWFsaXplcnMsXHJcbiAgICBfX3Byb3BLZXk6IF9fcHJvcEtleSxcclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lOiBfX3NldEZ1bmN0aW9uTmFtZSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxuICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uOiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcclxufTtcclxuIiwiaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEJhc2UgSW1wbGVtZW50YXRpb24gZm9yIFZhbGlkYXRvcnNcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgVmFsaWRhdG9yfXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdGlvbktleSB0aGUga2V5IHRvIHJlZ2lzdGVyIHRoZSB2YWxpZGF0b3IgdW5kZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RFRkFVTFR9XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWNjZXB0ZWRUeXBlc10gZGVmaW5lcyB0aGUgdmFsdWUgdHlwZXMgdGhpcyB2YWxpZGF0b3IgY2FuIHZhbGlkYXRlXG4gKlxuICogQGNsYXNzIFZhbGlkYXRvclxuICogQGFic3RyYWN0XG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdG9yPFYgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zID0gVmFsaWRhdG9yT3B0aW9ucz4ge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY2VwdGVkVHlwZXM/OiBzdHJpbmdbXTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5ERUZBVUxULFxuICAgIC4uLmFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdXG4gICkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cbiAgICBpZiAoYWNjZXB0ZWRUeXBlcy5sZW5ndGgpIHRoaXMuYWNjZXB0ZWRUeXBlcyA9IGFjY2VwdGVkVHlwZXM7XG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgIHRoaXMuaGFzRXJyb3JzID0gdGhpcy5jaGVja1R5cGVBbmRIYXNFcnJvcnModGhpcy5oYXNFcnJvcnMuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgYnVpbGRzIHRoZSBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzZihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdHlwZVxuICAgKiBAcGFyYW0ge2FueX0gdW5ib3VuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1R5cGVBbmRIYXNFcnJvcnMoXG4gICAgdW5ib3VuZDogKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IFZhbGlkYXRvcixcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgLi4uYXJncyk7XG4gICAgICBpZiAoIVJlZmxlY3Rpb24uY2hlY2tUeXBlcyh2YWx1ZSwgdGhpcy5hY2NlcHRlZFR5cGVzKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZShcbiAgICAgICAgICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUsXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB0eXBlb2YgdmFsdWVcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB1bmJvdW5kKHZhbHVlLCAuLi5hcmdzKTtcbiAgICB9LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGFuIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHtWYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9uc10gVmFsaWRhdGUgb3B0aW9ucyBmb3IgY3VzdG9taXppbmcgdGhlIG1vZGVsIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqXG4gICAqIEBzZWUgTW9kZWwjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgaGFzRXJyb3JzKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBWKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uLy4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWFya3MgdGhlIGNsYXNzIGFzIGEgdmFsaWRhdG9yIGZvciBhIGNlcnRhaW4ga2V5LlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyB0aGUgY2xhc3MgaW4gdGhlIHtAbGluayBWYWxpZGF0aW9ufSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5cyB0aGUgdmFsaWRhdGlvbiBrZXlcbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRvcjxUIGV4dGVuZHMgVmFsaWRhdG9yPiguLi5rZXlzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgKChvcmlnaW5hbDogQ29uc3RydWN0b3I8VD4pID0+IHtcbiAgICAgIGtleXMuZm9yRWFjaCgoazogc3RyaW5nKSA9PiB7XG4gICAgICAgIFZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICAgICAgICAgIHZhbGlkYXRvcjogb3JpZ2luYWwsXG4gICAgICAgICAgdmFsaWRhdGlvbktleTogayxcbiAgICAgICAgICBzYXZlOiB0cnVlLFxuICAgICAgICB9IGFzIFZhbGlkYXRvckRlZmluaXRpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3JpZ2luYWw7XG4gICAgfSkgYXMgQ2xhc3NEZWNvcmF0b3IsXG4gICAgbWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVkFMSURBVE9SKSwga2V5cylcbiAgKTtcbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IERhdGVWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKlxuICogQGNsYXNzIERhdGVWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuREFURSlcbmV4cG9ydCBjbGFzcyBEYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPERhdGVWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIE51bWJlci5uYW1lLCBEYXRlLm5hbWUsIFN0cmluZy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge0RhdGUgfCBzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7RGF0ZVZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zXVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogRGF0ZVZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUuZ2V0RGF0ZSgpKSkge1xuICAgICAgY29uc3QgeyBtZXNzYWdlID0gXCJcIiB9ID0gb3B0aW9ucztcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHJlZ2V4cFBhcnNlcjogUmVnRXhwID0gbmV3IFJlZ0V4cChcIl4vKC4rKS8oW2dpbXVzXSopJFwiKTtcblxuLyoqXG4gKiBAc3VtbWFyeSBQYXR0ZXJuIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBkZWZhdWx0cyB0byB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFUVEVSTn1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFUVEVSTn1cbiAqXG4gKiBAY2xhc3MgUGF0dGVyblZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuZXhwb3J0IGNsYXNzIFBhdHRlcm5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8UGF0dGVyblZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcGFyc2VzIGFuZCB2YWxpZGF0ZXMgYSBwYXR0ZXJuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldFBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUmVnRXhwIHtcbiAgICBpZiAoIXJlZ2V4cFBhcnNlci50ZXN0KHBhdHRlcm4pKSByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICBjb25zdCBtYXRjaDogYW55ID0gcGF0dGVybi5tYXRjaChyZWdleHBQYXJzZXIpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgTW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICBsZXQgeyBwYXR0ZXJuIH0gPSBvcHRpb25zO1xuICAgIGlmICghcGF0dGVybikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBQYXR0ZXJuXCIpO1xuICAgIHBhdHRlcm4gPSB0eXBlb2YgcGF0dGVybiA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuZ2V0UGF0dGVybihwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwOyAvLyByZXNldHMgcGF0dGVybiBwb3NpdGlvbiBmb3IgcmVwZWF0IHZhbGlkYXRpb24gcmVxdWVzdHNcbiAgICByZXR1cm4gIXBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRW1haWwgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNFTUFJTH1cbiAqXG4gKiBAY2xhc3MgRW1haWxWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkVNQUlMKVxuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnNdXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcGF0dGVybjogb3B0aW9ucz8ucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLkVNQUlMLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMaXN0VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IExpc3QgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBjbGFzcyBMaXN0VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG5leHBvcnQgY2xhc3MgTGlzdFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxMaXN0VmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1QpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBBcnJheS5uYW1lLCBTZXQubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHthbnlbXSB8IFNldDxhbnk+fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0xpc3RWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnlbXSB8IFNldDxhbnk+LFxuICAgIG9wdGlvbnM6IExpc3RWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAhdmFsdWUubGVuZ3RoIDogIXZhbHVlLnNpemUpKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGF6eiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5jbGF6eilcbiAgICAgID8gb3B0aW9ucy5jbGF6elxuICAgICAgOiBbb3B0aW9ucy5jbGF6el07XG4gICAgbGV0IHZhbDogYW55LFxuICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGkgPCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiB2YWx1ZS5zaXplKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdmFsID0gKHZhbHVlIGFzIGFueSlbaV07XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouaW5jbHVkZXMoKHZhbCBhcyBvYmplY3QpLmNvbnN0cnVjdG9yPy5uYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouc29tZSgoYzogc3RyaW5nKSA9PiB0eXBlb2YgdmFsID09PSBjLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgY2xhenopO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzLCBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWF4aW11bSBMZW5ndGggVmFsaWRhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHN0cmluZ3MgYW5kIEFycmF5cyBvbiB0aGVpciBtYXhpbXVtIGxlbmd0aFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG5leHBvcnQgY2xhc3MgTWF4TGVuZ3RoVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge01heExlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBvcHRpb25zLm1heExlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5tYXhMZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWF4VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1heCBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqXG4gKiBAY2xhc3MgTWF4VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1BWClcbmV4cG9ydCBjbGFzcyBNYXhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWF4VmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFwibnVtYmVyXCIsIFwiRGF0ZVwiLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBNb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtNYXhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBNYXhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgbGV0IHsgbWF4IH0gPSBvcHRpb25zO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIShtYXggaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgbWF4ID0gbmV3IERhdGUobWF4KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obWF4LmdldERhdGUoKSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTWF4IHBhcmFtIGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlID4gbWF4XG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBtYXgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1pbmltdW0gTGVuZ3RoIFZhbGlkYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBzdHJpbmdzIGFuZCBBcnJheXMgb24gdGhlaXIgbWluaW11bSBsZW5ndGhcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuZXhwb3J0IGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFN0cmluZy5uYW1lLCBBcnJheS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge01pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTWluTGVuZ3RoVmFsaWRhdG9yXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyB8IGFueVtdLFxuICAgIG9wdGlvbnM6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IG9wdGlvbnMubWluTGVuZ3RoXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLm1pbkxlbmd0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNaW5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWluIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICpcbiAqIEBjbGFzcyBNaW5WYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUlOKVxuZXhwb3J0IGNsYXNzIE1pblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNaW5WYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJudW1iZXJcIiwgXCJEYXRlXCIsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBNb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtNYXhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBNaW5WYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgbGV0IHsgbWluIH0gPSBvcHRpb25zO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIShtaW4gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgbWluID0gbmV3IERhdGUobWluKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obWluLmdldERhdGUoKSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTWluIHBhcmFtIGRlZmluZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA8IG1pblxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWluKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3IgfSBmcm9tIFwiLi9QYXR0ZXJuVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIYW5kbGVzIFBhc3N3b3JkIFZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9yTWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUEFTU1dPUkR9XG4gKlxuICogQGNsYXNzIFBhc3N3b3JkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5QQVNTV09SRClcbmV4cG9ydCBjbGFzcyBQYXNzd29yZFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBQYXR0ZXJuVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKHZhbHVlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcXVpcmVkIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjUkVRVUlSRUR9XG4gKlxuICogQGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRVFVSVJFRCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1ZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gIXZhbHVlXG4gICAgICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFN0ZXBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgU3RlcCBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGNsYXNzIFN0ZXBWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuU1RFUClcbmV4cG9ydCBjbGFzcyBTdGVwVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPFN0ZXBWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuU1RFUCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcFxuICAgKiBAcGFyYW0ge1N0ZXBWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN0ZXBWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpICUgTnVtYmVyKG9wdGlvbnMuc3RlcCkgIT09IDBcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG9wdGlvbnMuc3RlcClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVWYWxpZGF0b3JPcHRpb25zLCBWYWxpZGF0b3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmVxdWlyZWQgVmFsaWRhdG9yXG4gKlxuICogQGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG5leHBvcnQgY2xhc3MgVHlwZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxUeXBlVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtUeXBlVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zOiBUeXBlVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIERvbid0IHRyeSBhbmQgZW5mb3JjZSB0eXBlIGlmIHVuZGVmaW5lZFxuICAgIGNvbnN0IHsgdHlwZXMsIG1lc3NhZ2UgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFSZWZsZWN0aW9uLmV2YWx1YXRlRGVzaWduVHlwZXModmFsdWUsIHR5cGVzKSlcbiAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLFxuICAgICAgICB0eXBlb2YgdHlwZXMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHR5cGVzXG4gICAgICAgICAgOiBBcnJheS5pc0FycmF5KHR5cGVzKVxuICAgICAgICAgICAgPyB0eXBlcy5qb2luKFwiLCBcIilcbiAgICAgICAgICAgIDogdHlwZXMubmFtZSxcbiAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICApO1xuICB9XG59XG5cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IsXG4gIHZhbGlkYXRpb25LZXk6IE1vZGVsS2V5cy5UWVBFLFxuICBzYXZlOiBmYWxzZSxcbn0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4iLCJpbXBvcnQge1xuICBWYWxpZGF0aW9uS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVUkwgVmFsaWRhdG9yXG4gKiBAZGVzY3JpcHRpb24gUGF0dGVybiBmcm9tIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NH1cbiAqXG4gKiBAY2xhc3MgVVJMVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5VUkwpXG5leHBvcnQgY2xhc3MgVVJMVmFsaWRhdG9yIGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVVJMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHBhdHRlcm46IG9wdGlvbnMucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlVSTCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL2RhdGVzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVxdWlyZWQuXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFUVVJUkVEfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICpcbiAqIEBmdW5jdGlvbiByZXF1aXJlZFxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCksXG4gICAge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNNSU59XG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCBEYXRlfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICpcbiAqIEBmdW5jdGlvbiBtaW5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5cbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOKSwge1xuICAgIG1pbjogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWH1cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGV9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWFxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVgpLCB7XG4gICAgbWF4OiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzdGVwIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjU1RFUH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1NURVB9XG4gKlxuICogQGZ1bmN0aW9uIHN0ZXBcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RlcChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5TVEVQXG4pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlNURVApLCB7XG4gICAgc3RlcDogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lXSxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW5sZW5ndGgoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSFxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKSxcbiAgICB7XG4gICAgICBtaW5MZW5ndGg6IHZhbHVlLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWF9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1heGxlbmd0aFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhsZW5ndGgoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYX0xFTkdUSFxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKSxcbiAgICB7XG4gICAgICBtYXhMZW5ndGg6IHZhbHVlLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIFJlZ0V4cCBwYXR0ZXJuIHRoZSBwcm9wZXJ0eSBtdXN0IHJlc3BlY3RcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFUVEVSTn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBVFRFUk59XG4gKlxuICogQGZ1bmN0aW9uIHBhdHRlcm5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0dGVybihcbiAgdmFsdWU6IFJlZ0V4cCB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVRURVJOXG4pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pLFxuICAgIHtcbiAgICAgIHBhdHRlcm46IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gZW1haWxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjRU1BSUx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGZ1bmN0aW9uIGVtYWlsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVNQUlMKSxcbiAgICB7XG4gICAgICBwYXR0ZXJuOiBERUZBVUxUX1BBVFRFUk5TLkVNQUlMLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBwcm9wZXJ0eSBhcyBhbiBVUkxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjVVJMfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1VSTH1cbiAqXG4gKiBAZnVuY3Rpb24gdXJsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKSwge1xuICAgIHBhdHRlcm46IERFRkFVTFRfUEFUVEVSTlMuVVJMLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEVuZm9yY2VzIHR5cGUgdmVyaWZpY2F0aW9uXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1RZUEV9XG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gdHlwZXMgYWNjZXB0ZWQgdHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1RZUEV9XG4gKlxuICogQGZ1bmN0aW9uIHR5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZShcbiAgdHlwZXM6IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEVcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVFlQRSksIHtcbiAgICBjdXN0b21UeXBlczogdHlwZXMsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNEQVRFfVxuICpcbiAqIFdpbGwgZW5mb3JjZSBzZXJpYWxpemF0aW9uIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgZm9ybWF0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBhY2NlcHRlZCBmb3JtYXQgYWNjb3JkaW5nIHRvIHtAbGluayBmb3JtYXREYXRlfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VmFsaWRhdG9yPn0gW3ZhbGlkYXRvcl0gdGhlIFZhbGlkYXRvciB0byBiZSB1c2VkLiBEZWZhdWx0cyB0byB7QGxpbmsgRGF0ZVZhbGlkYXRvcn1cbiAqXG4gKiBAZnVuY3Rpb24gZGF0ZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZShcbiAgZm9ybWF0OiBzdHJpbmcgPSBcImRkL01NL3l5eXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5EQVRFXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByb3BlcnR5S2V5PzogYW55KTogYW55ID0+IHtcbiAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuREFURSksIHtcbiAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIHR5cGVzOiBbRGF0ZS5uYW1lXSxcbiAgICB9KSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHNldCh0aGlzOiBhbnksIG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHZhbHVlcy5nZXQodGhpcyksXG4gICAgICAgICAgICBzZXQ6IChuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlRGF0ZShmb3JtYXQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIHZhbCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2YoXCJGYWlsZWQgdG8gcGFyc2UgZGF0ZTogezB9XCIsIGUubWVzc2FnZSB8fCBlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXNbcHJvcGVydHlLZXldID0gbmV3VmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImhlcmVcIik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhc3N3b3JkIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBU1NXT1JEfVxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSBbcGF0dGVybl0gZGVmYXVsdHMgdG8ge0BsaW5rIFBhc3N3b3JkUGF0dGVybnMjQ0hBUjhfT05FX09GX0VBQ0h9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VmFsaWRhdG9yPn0gW3ZhbGlkYXRvcl0gRGVmYXVsdHMgdG8ge0BsaW5rIFBhc3N3b3JkVmFsaWRhdG9yfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmQoXG4gIHBhdHRlcm46IFJlZ0V4cCA9IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkRcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKSwge1xuICAgIHBhdHRlcm46IHBhdHRlcm4sXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTGlzdCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBBbHNvIHNldHMgdGhlIHtAbGluayB0eXBlfSB0byB0aGUgcHJvdmlkZWQgY29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcn0gY2xhenpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29sbGVjdGlvbl0gVGhlIGNvbGxlY3Rpb24gYmVpbmcgdXNlZC4gZGVmYXVsdHMgdG8gQXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VmFsaWRhdG9yPn0gW3ZhbGlkYXRvcl0gZGVmYXVsdHMgdG8ge0BsaW5rIExpc3RWYWxpZGF0b3J9XG4gKlxuICogQGZ1bmN0aW9uIGxpc3RcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4gfCBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSxcbiAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YShWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSwge1xuICAgIGNsYXp6OiBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6Lm1hcCgoYykgPT4gYy5uYW1lKSA6IFtjbGF6ei5uYW1lXSxcbiAgICB0eXBlOiBjb2xsZWN0aW9uLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNldCBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBXcmFwcGVyIGZvciB7QGxpbmsgbGlzdH0gd2l0aCB0aGUgJ1NldCcgQ29sbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcn0gY2xhenpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VmFsaWRhdG9yPn0gW3ZhbGlkYXRvcl1cbiAqXG4gKiBAZnVuY3Rpb24gc2V0XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgRnVuY3Rpb24gdG8gb3ZlcnJpZGUgY29uc3RydWN0b3JzXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7YW55W119IFthcmdzXVxuICogQHJldHVybiB7VH0gdGhlIG5ldyBpbnN0YW5jZVxuICpcbiAqIEBmdW5jdGlvbiBjb25zdHJ1Y3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uQ29uc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3Q8VCBleHRlbmRzIE1vZGVsPihcbiAgY29uc3RydWN0b3I6IGFueSxcbiAgLi4uYXJnczogYW55W11cbik6IFQge1xuICBjb25zdCBfY29uc3RyID0gKC4uLmFyZ3o6IGFueVtdKSA9PiBuZXcgY29uc3RydWN0b3IoLi4uYXJneik7XG4gIF9jb25zdHIucHJvdG90eXBlID0gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICByZXR1cm4gX2NvbnN0ciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZWN1cnNpdmVseSBmaW5kcyB0aGUgbGFzdCBwcm90b3R5cGUgYmVmb3JlIE9iamVjdFxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICpcbiAqIEBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkNvbnN0cnVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RQcm90b0JlZm9yZU9iamVjdChvYmo6IG9iamVjdCk6IG9iamVjdCB7XG4gIGxldCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gb2JqO1xuICB3aGlsZSAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBwcm90b3R5cGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZVwiKTtcbn1cblxuLyoqXG4gKiBAc3VtYXJ5IGJpbmRzIHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzIGFzIGEgcm9vdCBwcm90b3R5cGUgb2YgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmpcbiAqXG4gKiBAZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkNvbnN0cnVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZE1vZGVsUHJvdG90eXBlKG9iajogdW5rbm93bikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgTW9kZWwpIHJldHVybjtcblxuICBmdW5jdGlvbiBiaW5kUHJvdG90eXBlKG9ialRvT3ZlcnJpZGU6IHVua25vd24sIHByb3RvdHlwZTogb2JqZWN0KSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9ialRvT3ZlcnJpZGUsIHByb3RvdHlwZSk7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGU6IGFueSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGJpbmRQcm90b3R5cGUob2JqLCBNb2RlbC5wcm90b3R5cGUpO1xuICB9XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBjb25zdCBwcm90ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgaWYgKFxuICAgICAgcHJvdCA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3QpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICByZXR1cm4gYmluZFByb3RvdHlwZShwcm90b3R5cGUsIE1vZGVsLnByb3RvdHlwZSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHByb3BlciBwcm90b3R5cGUgdG8gYmluZFwiKTtcbn1cbiIsImltcG9ydCB7IGJpbmRNb2RlbFByb3RvdHlwZSwgY29uc3RydWN0IH0gZnJvbSBcIi4vY29uc3RydWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IGRlZmluZXMgdGhlIHRwZSBvcyBhbiBJbnN0YW5jZUNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICovXG5leHBvcnQgdHlwZSBJbnN0YW5jZUNhbGxiYWNrID0gKGluc3RhbmNlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhIE1vZGVsIGNsYXNzXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAtIFJlZ2lzdGVycyB0aGUgY2xhc3MgdW5kZXIgdGhlIG1vZGVsIHJlZ2lzdHJ5IHNvIGl0IGNhbiBiZSBlYXNpbHkgcmVidWlsdDtcbiAqIC0gT3ZlcnJpZGVzIHRoZSBjbGFzcyBjb25zdHJ1Y3RvcjtcbiAqIC0gUnVucyB0aGUgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn0gaWYgZGVmaW5lZDtcbiAqIC0gUnVucyB0aGUgb3B0aW9uYWwge0BsaW5rIEluc3RhbmNlQ2FsbGJhY2t9IGlmIHByb3ZpZGVkO1xuICpcbiAqIEBwYXJhbSB7SW5zdGFuY2VDYWxsYmFja30gW2luc3RhbmNlQ2FsbGJhY2tdIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgaW5zdGFuY2UgdXBvbiBpbnN0YW50aWF0aW9uLiBkZWZhdWx0cyB0byB1bmRlZmluZWRcbiAqXG4gKiBAZnVuY3Rpb24gbW9kZWxcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWwoaW5zdGFuY2VDYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2spIHtcbiAgcmV0dXJuICgob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIG9yaWdpbmFsPiA9IGNvbnN0cnVjdChcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBiaW5kTW9kZWxQcm90b3R5cGUoaW5zdGFuY2UpO1xuICAgICAgLy8gcnVuIGEgYnVpbGRlciBmdW5jdGlvbiBpZiBkZWZpbmVkIHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IChUaGUgTW9kZWxBcmcpXG4gICAgICBjb25zdCBidWlsZGVyID0gTW9kZWwuZ2V0QnVpbGRlcigpO1xuICAgICAgaWYgKGJ1aWxkZXIpIGJ1aWxkZXIoaW5zdGFuY2UsIGFyZ3MubGVuZ3RoID8gYXJnc1swXSA6IHVuZGVmaW5lZCk7XG5cbiAgICAgIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuTU9ERUwpLCBvcmlnaW5hbC5uYW1lKShpbnN0YW5jZS5jb25zdHJ1Y3Rvcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZUNhbGxiYWNrKSBpbnN0YW5jZUNhbGxiYWNrKGluc3RhbmNlLCAuLi5hcmdzKTtcblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCksIG9yaWdpbmFsLm5hbWUpKG9yaWdpbmFsKTtcblxuICAgIE1vZGVsLnJlZ2lzdGVyKG5ld0NvbnN0cnVjdG9yLCBvcmlnaW5hbC5uYW1lKTtcblxuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9KSBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoZWRCeShhbGdvcml0aG06IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuSEFTSElORyksIHtcbiAgICBhbGdvcml0aG06IGFsZ29yaXRobSxcbiAgICBhcmdzOiBhcmdzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZWRCeShzZXJpYWxpemVyOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLlNFUklBTElaQVRJT04pLCB7XG4gICAgc2VyaWFsaXplcjogc2VyaWFsaXplcixcbiAgICBhcmdzOiBhcmdzLFxuICB9KTtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSBkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgTW9kZWwgZGVmaW5pdGlvbiBmdW5jdGlvbmFsaXR5XG4gKiBAZGVzY3JpcHRpb24gZGVmaW5lcyB0aGUgYmFzZSBjbGFzcyBhbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5XG4gKlxuICogQG5hbWVzcGFjZSBNb2RlbFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgSG9sZHMgYWxsIHRoZSBzdXBwb3J0ZWQgZGVjb3JhdG9yc1xuICogQG5hbWVzcGFjZSBEZWNvcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBWYWxpZGF0aW9uIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eVxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIE1vZGVsIHZhbGlkYXRpb24gYXBpcyBhbmQgYmFzZSBjbGFzc2VzIGZvciB2YWxpZGF0b3JzXG4gKlxuICogQG5hbWVzcGFjZSBWYWxpZGF0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAbmFtZXNwYWNlIERhdGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAbmFtZXNwYWNlIEhhc2hpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgU2VyaWFsaXphdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQG5hbWVzcGFjZSBGb3JtYXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7QUFhRztJQUNTO0FBQVosQ0FBQSxVQUFZLFNBQVMsRUFBQTtBQUNuQixJQUFBLFNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxjQUF3QjtBQUN4QixJQUFBLFNBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxhQUFvQjtBQUNwQixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxtQkFBNEI7QUFDNUIsSUFBQSxTQUFBLENBQUEsUUFBQSxDQUFBLEdBQUEsbUJBQTRCO0FBQzVCLElBQUEsU0FBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDZixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxTQUFrQjtBQUNsQixJQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSxnQkFBK0I7QUFDL0IsSUFBQSxTQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsY0FBMEI7QUFDMUIsSUFBQSxTQUFBLENBQUEsU0FBQSxDQUFBLEdBQUEsU0FBbUI7QUFDbkIsSUFBQSxTQUFBLENBQUEsZUFBQSxDQUFBLEdBQUEsZUFBK0I7QUFDakMsQ0FBQyxFQVhXLFNBQVMsS0FBVCxTQUFTLEdBV3BCLEVBQUEsQ0FBQSxDQUFBOztBQ3ZCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJHO0FBQ1UsTUFBQSxjQUFjLEdBQUc7QUFDNUIsSUFBQSxPQUFPLEVBQUUsQ0FBQSxFQUFHLFNBQVMsQ0FBQyxPQUFPLENBQWEs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
|
|
2525
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXZhbGlkYXRpb24uZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ3MudHMiLCIuLi9zcmMvdXRpbHMvZGF0ZXMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9oYXNoaW5nLnRzIiwiLi4vc3JjL21vZGVsL01vZGVsRXJyb3JEZWZpbml0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0YW50cy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnkudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL3ZhbGlkYXRpb24udHMiLCIuLi9zcmMvbW9kZWwvTW9kZWwudHMiLCIuLi9zcmMvdXRpbHMvc2VyaWFsaXphdGlvbi50cyIsIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1ZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRGF0ZVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGF0dGVyblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvRW1haWxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0xpc3RWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01heExlbmd0aFZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTWF4VmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5MZW5ndGhWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL01pblZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvUGFzc3dvcmRWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1JlcXVpcmVkVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9TdGVwVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9UeXBlVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9VUkxWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL21vZGVsL2NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBNb2RlbCBrZXlzIHVzZWQgZm9yIHJlZmxlY3Rpb25cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBwcmVmaXggdG8gYWxsIG90aGVyIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIHR5cGUga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFSQU1TIG1ldGhvZCBwYXJhbXMga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVUVVJOIG1ldGhvZCByZXR1cm4ga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUwgbW9kZWwga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5DSE9SIGFuY2hvciBrZXkuIHdpbGwgc2VydmUgYXMgYSBnaG9zdCBwcm9wZXJ0eSBpbiB0aGUgbW9kZWxcbiAqXG4gKiBAY29uc3RhbnQgTW9kZWxLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxLZXlzIHtcbiAgUkVGTEVDVCA9IFwiZGVjYWYubW9kZWwuXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsXCIsXG4gIENPTlNUUlVDVElPTiA9IFwiY29uc3RydWN0ZWQtYnlcIixcbiAgQVRUUklCVVRFID0gXCJfX2F0dHJpYnV0ZXNcIixcbiAgSEFTSElORyA9IFwiaGFzaGluZ1wiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG59XG4iLCJpbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIGtleXMgdXNlZCBmb3IgdmFsaWRhdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIHByZWZpeGVzIG90aGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIHNldHMgYXMgcmVxdWlyZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmaW5lcyBtaW4gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVggZGVmaW5lcyBtYXggdmFsdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIGRlZmluZXMgc3RlcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmaW5lcyBtaW4gbGVuZ3RoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZpbmVzIG1heCBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmluZXMgcGF0dGVyblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmluZXMgZW1haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgZGVmaW5lcyB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIGRlZmluZXMgZGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgZGVmaW5lcyB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgZGVmaW5lcyBwYXNzd29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmaW5lcyBsaXN0XG4gKlxuICogQGNvbnN0YW50IFZhbGlkYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0aW9uS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9dmFsaWRhdGlvbi5gLFxuICBWQUxJREFUT1I6IFwidmFsaWRhdG9yXCIsXG4gIFJFUVVJUkVEOiBcInJlcXVpcmVkXCIsXG4gIE1JTjogXCJtaW5cIixcbiAgTUFYOiBcIm1heFwiLFxuICBTVEVQOiBcInN0ZXBcIixcbiAgTUlOX0xFTkdUSDogXCJtaW5sZW5ndGhcIixcbiAgTUFYX0xFTkdUSDogXCJtYXhsZW5ndGhcIixcbiAgUEFUVEVSTjogXCJwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcImVtYWlsXCIsXG4gIFVSTDogXCJ1cmxcIixcbiAgREFURTogXCJkYXRlXCIsXG4gIFRZUEU6IFwidHlwZVwiLFxuICBQQVNTV09SRDogXCJwYXNzd29yZFwiLFxuICBMSVNUOiBcImxpc3RcIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAc3VtbWFyeSBsaXN0IG9mIG1vbnRoIG5hbWVzXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIG1vbnRoIG5hbWVzLiBDYW4gYmUgY2hhbmdlZCBmb3IgbG9jYWxpemF0aW9uIHB1cnBvc2VzXG4gKlxuICogQGNvbnN0YW50IE1PTlRIX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBNT05USF9OQU1FUyA9IFtcbiAgXCJKYW51YXJ5XCIsXG4gIFwiRmVicnVhcnlcIixcbiAgXCJNYXJjaFwiLFxuICBcIkFwcmlsXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuZVwiLFxuICBcIkp1bHlcIixcbiAgXCJBdWd1c3RcIixcbiAgXCJTZXB0ZW1iZXJcIixcbiAgXCJPY3RvYmVyXCIsXG4gIFwiTm92ZW1iZXJcIixcbiAgXCJEZWNlbWJlclwiLFxuXTtcblxuLyoqXG4gKiBAc3VtbWFyeSBsaXN0IG9mIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWtcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgbmFtZXMgZm9yIGRheXMgb2YgdGhlIHdlZWsuIENhbiBiZSBjaGFuZ2VkIGZvciBsb2NhbGl6YXRpb24gcHVycG9zZXNcbiAqXG4gKiBAY29uc3RhbnQgREFZU19PRl9XRUVLX05BTUVTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEQVlTX09GX1dFRUtfTkFNRVMgPSBbXG4gIFwiU3VuZGF5XCIsXG4gIFwiTW9uZGF5XCIsXG4gIFwiVHVlc2RheVwiLFxuICBcIldlZG5lc2RheVwiLFxuICBcIlRodXJzZGF5XCIsXG4gIFwiRnJpZGF5XCIsXG4gIFwiU2F0dXJkYXlcIixcbl07XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU4gZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTl9MRU5HVEggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQQVRURVJOIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUWVBFIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUZBVUxUIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJU1QgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElTVF9JTlNJREUgZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9ERUxfTk9UX0ZPVU5EIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICpcbiAqIEBjb25zdGFudCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRVFVSVJFRDogXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIsXG4gIE1JTjogXCJUaGUgbWluaW11bSB2YWx1ZSBpcyB7MH1cIixcbiAgTUFYOiBcIlRoZSBtYXhpbXVtIHZhbHVlIGlzIHswfVwiLFxuICBNSU5fTEVOR1RIOiBcIlRoZSBtaW5pbXVtIGxlbmd0aCBpcyB7MH1cIixcbiAgTUFYX0xFTkdUSDogXCJUaGUgbWF4aW11bSBsZW5ndGggaXMgezB9XCIsXG4gIFBBVFRFUk46IFwiVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsXG4gIEVNQUlMOiBcIlRoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbWFpbFwiLFxuICBVUkw6IFwiVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIFVSTFwiLFxuICBUWVBFOiBcIkludmFsaWQgdHlwZS4gRXhwZWN0ZWQgezB9LCByZWNlaXZlZCB7MX1cIixcbiAgU1RFUDogXCJJbnZhbGlkIHZhbHVlLiBOb3QgYSBzdGVwIG9mIHswfVwiLFxuICBEQVRFOiBcIkludmFsaWQgdmFsdWUuIG5vdCBhIHZhbGlkIERhdGVcIixcbiAgREVGQVVMVDogXCJUaGVyZSBpcyBhbiBFcnJvclwiLFxuICBQQVNTV09SRDpcbiAgICBcIk11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIG9uZSBvZiBudW1iZXIsIGxvd2VyIGFuZCB1cHBlciBjYXNlIGxldHRlcnMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlciAoQCQhJSo/Jl8tLiwpXCIsXG4gIExJU1Q6IFwiSW52YWxpZCBsaXN0IG9mIHswfVwiLFxuICBNT0RFTF9OT1RfRk9VTkQ6IFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCB1bmRlciB7MH1cIixcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdmFyaW91cyBkZWZhdWx0IHJlZ2V4cCBwYXR0ZXJucyB1c2VkXG4gKlxuICogQGVudW0gREVGQVVMVF9QQVRURVJOU1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQVRURVJOUyA9IHtcbiAgRU1BSUw6XG4gICAgL1thLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSpAKD86W2EtekEtWjAtOV0oPzpbYS16MC05LV0qW2EtekEtWjAtOV0pP1xcLikrW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pPy8sXG4gIFVSTDogL14oPzooPzooPzpodHRwcz98ZnRwKTopP1xcL1xcLykoPzpcXFMrKD86OlxcUyopP0ApPyg/Oig/ISg/OjEwfDEyNykoPzpcXC5cXGR7MSwzfSl7M30pKD8hKD86MTY5XFwuMjU0fDE5MlxcLjE2OCkoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTcyXFwuKD86MVs2LTldfDJcXGR8M1swLTFdKSg/OlxcLlxcZHsxLDN9KXsyfSkoPzpbMS05XVxcZD98MVxcZFxcZHwyWzAxXVxcZHwyMlswLTNdKSg/OlxcLig/OjE/XFxkezEsMn18MlswLTRdXFxkfDI1WzAtNV0pKXsyfSg/OlxcLig/OlsxLTldXFxkP3wxXFxkXFxkfDJbMC00XVxcZHwyNVswLTRdKSl8KD86KD86W2EtejAtOVxcdTAwYTEtXFx1ZmZmZl1bYS16MC05XFx1MDBhMS1cXHVmZmZmXy1dezAsNjJ9KT9bYS16MC05XFx1MDBhMS1cXHVmZmZmXVxcLikrKD86W2EtelxcdTAwYTEtXFx1ZmZmZl17Mix9XFwuPykpKD86OlxcZHsyLDV9KT8oPzpbLz8jXVxcUyopPyQvaSxcbiAgUEFTU1dPUkQ6IHtcbiAgICBDSEFSOF9PTkVfT0ZfRUFDSDpcbiAgICAgIC9eKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxkKSg/PS4qW0AkISUqPyZfXFwtLixdKVtBLVphLXpcXGRAJCElKj8mX1xcLS4sXXs4LH0kL2csXG4gIH0sXG59O1xuIiwiLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHByb3ZpZGUgc3RyaW5nIGZvcm1hdCBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gQyMncyBzdHJpbmcuZm9ybWF0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXI+fSBbYXJnc10gcmVwbGFjZW1lbnRzIG1hZGUgYnkgb3JkZXIgb2YgYXBwZWFyYW5jZSAocmVwbGFjZW1lbnQwIHdpbCByZXBsYWNlIHswfSBhbmQgc28gb24pXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc3RyaW5nRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkZvcm1hdFxuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRm9ybWF0KHN0cmluZzogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgPyBhcmdzW251bWJlcl0udG9TdHJpbmcoKVxuICAgICAgOiBcInVuZGVmaW5lZFwiO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHByb3ZpZGUgc3RyaW5nIGZvcm1hdCBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gQyMncyBzdHJpbmcuZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gYWxpYXMgZm9yIHtAbGluayBzdHJpbmdGb3JtYXR9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MgcmVwbGFjZW1lbnRzIG1hZGUgYnkgb3JkZXIgb2YgYXBwZWFyYW5jZSAocmVwbGFjZW1lbnQwIHdpbCByZXBsYWNlIHswfSBhbmQgc28gb24pXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGZvcm1hdHRlZCBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2ZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBjb25zdCBzZiA9IHN0cmluZ0Zvcm1hdDtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIERBWVNfT0ZfV0VFS19OQU1FUyxcbiAgTU9OVEhfTkFNRVMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuL3N0cmluZ3NcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXZlcnNlcyB0aGUgcHJvY2VzcyBmcm9tIHtAbGluayBmb3JtYXREYXRlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlIHRoZSBkYXRlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGRhdGUgZm9ybWF0XG4gKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZSBmcm9tIHRoZSBmb3JtYXQgb3IgdGhlIHN0YW5kYXJkIG5ldyBEYXRlKHtAcHJvcCBkYXRlfSkgaWYgdGhlIHN0cmluZyBjb3VsZG4ndCBiZSBwYXJzZWQgKGFyZSB5b3Ugc3VyZSB0aGUgZm9ybWF0IG1hdGNoZXMgdGhlIHN0cmluZz8pXG4gKlxuICogQGZ1bmN0aW9uIGRhdGVGcm9tRm9ybWF0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdChkYXRlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGxldCBmb3JtYXRSZWdleHA6IHN0cmluZyA9IGZvcm1hdDtcblxuICAvLyBIb3VyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2hoLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoaFwiLCBcIig/PGhvdXI+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2gvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImhcIiwgXCIoPzxob3VyPlxcXFxkezEsMn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0hILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJISFwiLCBcIig/PGhvdXI+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0gvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkhcIiwgXCIoPzxob3VyPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbnV0ZXNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvbW0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1tXCIsIFwiKD88bWludXRlcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvbS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwibVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gU2Vjb25kc1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9zcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic3NcIiwgXCIoPzxzZWNvbmRzPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9zLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXlcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZGQvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcImRkXCIsIFwiKD88ZGF5PlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9kLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkXCIsIFwiKD88ZGF5PlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIERheSBPZiBXZWVrXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0VFRUUvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkVFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtZWxzZS1pZlxuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL0VFRUUvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIkVFRVwiLCBcIig/PGRheW9md2Vlaz5cXFxcdyspXCIpO1xuXG4gIC8vIFllYXJcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgveXl5eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXl5eVwiLCBcIig/PHllYXI+XFxcXGR7NH0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5LykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJ5eVwiLCBcIig/PHllYXI+XFxcXGR7Mn0pXCIpO1xuXG4gIC8vIE1vbnRoXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NTU1cIiwgXCIoPzxtb250aG5hbWU+XFxcXHcrKVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU0vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIk1NTVwiLCBcIig/PG1vbnRobmFtZXNtYWxsPlxcXFx3KylcIik7XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL01NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTVwiLCBcIig/PG1vbnRoPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNXCIsIFwiKD88bW9udGg+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gTWlsaXMgYW5kIEFtIFBtXG4gIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cFxuICAgIC5yZXBsYWNlKFwiU1wiLCBcIig/PG1pbGlzPlxcXFxkezEsM30pXCIpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgXCIoPzxhbXBtPlxcXFx3ezJ9KVwiKTtcblxuICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGZvcm1hdFJlZ2V4cCwgXCJnXCIpO1xuXG4gIGNvbnN0IG1hdGNoOiB7XG4gICAgZ3JvdXBzOiB7XG4gICAgICB5ZWFyPzogc3RyaW5nO1xuICAgICAgZGF5Pzogc3RyaW5nO1xuICAgICAgYW1wbT86IHN0cmluZztcbiAgICAgIGhvdXI/OiBzdHJpbmc7XG4gICAgICBtaW51dGVzPzogc3RyaW5nO1xuICAgICAgc2Vjb25kcz86IHN0cmluZztcbiAgICAgIG1pbGlzPzogc3RyaW5nO1xuICAgICAgbW9udGhuYW1lPzogc3RyaW5nO1xuICAgICAgbW9udGhuYW1lc21hbGw/OiBzdHJpbmc7XG4gICAgICBtb250aD86IHN0cmluZztcbiAgICB9O1xuICB9ID0gcmVnZXhwLmV4ZWMoZGF0ZSkgYXMgYW55O1xuXG4gIGlmICghbWF0Y2ggfHwgIW1hdGNoLmdyb3VwcykgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuXG4gIGNvbnN0IHNhZmVQYXJzZUludCA9IGZ1bmN0aW9uIChuPzogc3RyaW5nKSB7XG4gICAgaWYgKCFuKSByZXR1cm4gMDtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUludChuKTtcblxuICAgIHJldHVybiBpc05hTihyZXN1bHQpID8gMCA6IHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCB5ZWFyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy55ZWFyKTtcbiAgY29uc3QgZGF5ID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5kYXkpO1xuXG4gIGNvbnN0IGFtUG0gPSBtYXRjaC5ncm91cHMuYW1wbTtcbiAgbGV0IGhvdXIgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLmhvdXIpO1xuXG4gIGlmIChhbVBtKSBob3VyID0gYW1QbSA9PT0gXCJQTVwiID8gaG91ciArIDEyIDogaG91cjtcblxuICBjb25zdCBtaW51dGVzID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5taW51dGVzKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuc2Vjb25kcyk7XG4gIGNvbnN0IG1zID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5taWxpcyk7XG5cbiAgY29uc3QgbW9udGhOYW1lID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZTtcbiAgY29uc3QgbW9udGhOYW1lU21hbGwgPSBtYXRjaC5ncm91cHMubW9udGhuYW1lc21hbGw7XG4gIGxldCBtb250aDogbnVtYmVyIHwgc3RyaW5nID0gbWF0Y2guZ3JvdXBzLm1vbnRoIGFzIHN0cmluZztcbiAgaWYgKG1vbnRoTmFtZSkgbW9udGggPSBNT05USF9OQU1FUy5pbmRleE9mKG1vbnRoTmFtZSk7XG4gIGVsc2UgaWYgKG1vbnRoTmFtZVNtYWxsKSB7XG4gICAgY29uc3QgbSA9IE1PTlRIX05BTUVTLmZpbmQoKG0pID0+XG4gICAgICBtLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtb250aE5hbWVTbWFsbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgaWYgKCFtKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG4gICAgbW9udGggPSBNT05USF9OQU1FUy5pbmRleE9mKG0pO1xuICB9IGVsc2UgbW9udGggPSBzYWZlUGFyc2VJbnQoYCR7bW9udGh9YCk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyLCBtaW51dGVzLCBzZWNvbmRzLCBtcyk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgQmluZHMgYSBkYXRlIGZvcm1hdCB0byBhIHN0cmluZ1xuICogQHBhcmFtIHtEYXRlfSBbZGF0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5Gb3JtYXRcbiAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgaWYgKCFkYXRlKSByZXR1cm47XG4gIGNvbnN0IGZ1bmMgPSAoKSA9PiBmb3JtYXREYXRlKGRhdGUsIGZvcm1hdCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvSVNPU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsIFwidG9TdHJpbmdcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmMsXG4gIH0pO1xuICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZGF0ZSwgRGF0ZS5wcm90b3R5cGUpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBIZWxwZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIGluc3RhbmNlT2YgRGF0ZVxuICogQHBhcmFtIGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRGF0ZXNcbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBkYXRlICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGUpID09PSBcIltvYmplY3QgRGF0ZV1cIiAmJlxuICAgICFOdW1iZXIuaXNOYU4oZGF0ZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHBhZCBudW1iZXJzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gKlxuICogQHJldHVybiB7c3RyaW5nfVxuICpcbiAqIEBmdW5jdGlvbiB0d29EaWdpdFBhZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5Gb3JtYXRcbiAqIEBjYXRlZ29yeSBGb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3b0RpZ2l0UGFkKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bSA8IDEwID8gXCIwXCIgKyBudW0gOiBudW0udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEZvcm1hdCBIYW5kbGluZ1xuICogQGRlc2NyaXB0aW9uIENvZGUgZnJvbSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU1MjQ2MS9ob3ctdG8tZm9ybWF0LWEtamF2YXNjcmlwdC1kYXRlfVxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0dGVyblN0cl0gZGVmYXVsdHMgdG8gJ3l5eXkvTU0vZGQnXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBmb3JtYXR0ZWQgZGF0ZVxuICpcbiAqIEBmdW5jdGlvbiBmb3JtYXREYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIHBhdHRlcm5TdHI6IHN0cmluZyA9IFwieXl5eS9NTS9kZFwiKSB7XG4gIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCksXG4gICAgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSxcbiAgICB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgaG91cjogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpLFxuICAgIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgc2Vjb25kOiBudW1iZXIgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICBtaWxpc2Vjb25kczogbnVtYmVyID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICBoOiBudW1iZXIgPSBob3VyICUgMTIsXG4gICAgaGg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGgpLFxuICAgIEhIOiBzdHJpbmcgPSB0d29EaWdpdFBhZChob3VyKSxcbiAgICBtbTogc3RyaW5nID0gdHdvRGlnaXRQYWQobWludXRlKSxcbiAgICBzczogc3RyaW5nID0gdHdvRGlnaXRQYWQoc2Vjb25kKSxcbiAgICBhYWE6IHN0cmluZyA9IGhvdXIgPCAxMiA/IFwiQU1cIiA6IFwiUE1cIixcbiAgICBFRUVFOiBzdHJpbmcgPSBEQVlTX09GX1dFRUtfTkFNRVNbZGF0ZS5nZXREYXkoKV0sXG4gICAgRUVFOiBzdHJpbmcgPSBFRUVFLnN1YnN0cigwLCAzKSxcbiAgICBkZDogc3RyaW5nID0gdHdvRGlnaXRQYWQoZGF5KSxcbiAgICBNOiBudW1iZXIgPSBtb250aCArIDEsXG4gICAgTU06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKE0pLFxuICAgIE1NTU06IHN0cmluZyA9IE1PTlRIX05BTUVTW21vbnRoXSxcbiAgICBNTU06IHN0cmluZyA9IE1NTU0uc3Vic3RyKDAsIDMpLFxuICAgIHl5eXk6IHN0cmluZyA9IHllYXIgKyBcIlwiLFxuICAgIHl5OiBzdHJpbmcgPSB5eXl5LnN1YnN0cigyLCAyKTtcbiAgLy8gY2hlY2tzIHRvIHNlZSBpZiBtb250aCBuYW1lIHdpbGwgYmUgdXNlZFxuICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0clxuICAgIC5yZXBsYWNlKFwiaGhcIiwgaGgpXG4gICAgLnJlcGxhY2UoXCJoXCIsIGgudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIkhIXCIsIEhIKVxuICAgIC5yZXBsYWNlKFwiSFwiLCBob3VyLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJtbVwiLCBtbSlcbiAgICAucmVwbGFjZShcIm1cIiwgbWludXRlLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJzc1wiLCBzcylcbiAgICAucmVwbGFjZShcInNcIiwgc2Vjb25kLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJTXCIsIG1pbGlzZWNvbmRzLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJkZFwiLCBkZClcbiAgICAucmVwbGFjZShcImRcIiwgZGF5LnRvU3RyaW5nKCkpXG5cbiAgICAucmVwbGFjZShcIkVFRUVcIiwgRUVFRSlcbiAgICAucmVwbGFjZShcIkVFRVwiLCBFRUUpXG4gICAgLnJlcGxhY2UoXCJ5eXl5XCIsIHl5eXkpXG4gICAgLnJlcGxhY2UoXCJ5eVwiLCB5eSlcbiAgICAucmVwbGFjZShcImFhYVwiLCBhYWEpO1xuICBpZiAocGF0dGVyblN0ci5pbmRleE9mKFwiTU1NXCIpID4gLTEpIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1NTVwiLCBNTU1NKS5yZXBsYWNlKFwiTU1NXCIsIE1NTSk7XG4gIH0gZWxzZSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NXCIsIE1NKS5yZXBsYWNlKFwiTVwiLCBNLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBwYXR0ZXJuU3RyO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhcnNlcyBhIGRhdGUgZnJvbSBhIHNwZWNpZmllZCBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRGF0ZSB8IG51bWJlcn0gW3ZdXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoZm9ybWF0OiBzdHJpbmcsIHY/OiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSB7XG4gIGxldCB2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBpZiAoIXYpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUodiBhcyBEYXRlLCBmb3JtYXQpLCBmb3JtYXQpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIkNvdWxkIG5vdCBjb252ZXJ0IGRhdGUgezB9IHRvIGZvcm1hdDogezF9XCIsIHYudG9TdHJpbmcoKSwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdCh2LCBmb3JtYXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKHYpO1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZShkLCBmb3JtYXQpLCBmb3JtYXQpO1xuICB9IGVsc2UgaWYgKGlzVmFsaWREYXRlKHYpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQoZm9ybWF0RGF0ZShkLCBmb3JtYXQpLCBmb3JtYXQpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LCBmb3JtYXQpXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgcHJvdmlkZWQgJHt2fWApO1xuICB9XG4gIHJldHVybiBiaW5kRGF0ZVRvU3RyaW5nKHZhbHVlLCBmb3JtYXQpO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3Aoa2V5OiBzdHJpbmcgPSBNb2RlbEtleXMuQVRUUklCVVRFKSB7XG4gIHJldHVybiAobW9kZWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpOiB2b2lkID0+IHtcbiAgICBsZXQgcHJvcHM6IHN0cmluZ1tdO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIGtleSkpIHtcbiAgICAgIHByb3BzID0gKG1vZGVsIGFzIGFueSlba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMgPSAobW9kZWwgYXMgYW55KVtrZXldID0gW107XG4gICAgfVxuICAgIGlmICghcHJvcHMuaW5jbHVkZXMocHJvcGVydHlLZXkgYXMgc3RyaW5nKSlcbiAgICAgIHByb3BzLnB1c2gocHJvcGVydHlLZXkgYXMgc3RyaW5nKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BNZXRhZGF0YTxWPihrZXk6IHN0cmluZywgdmFsdWU6IFYpIHtcbiAgcmV0dXJuIGFwcGx5KHByb3AoKSwgbWV0YWRhdGE8Vj4oa2V5LCB2YWx1ZSkpO1xufVxuIiwiLyoqXG4gKiBAc3VtbWFyeSBNaW1pY3MgSmF2YSdzIFN0cmluZydzIEhhc2ggaW1wbGVtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IERhdGV9IG9ialxuICogQHJldHVybiB7bnVtYmVyfSBoYXNoIHZhbHVlIG9mIG9ialxuICpcbiAqIEBmdW5jdGlvbiBoYXNoQ29kZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5IYXNoaW5nXG4gKiBAY2F0ZWdvcnkgSGFzaGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvZGUob2JqOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBEYXRlKTogc3RyaW5nIHtcbiAgb2JqID0gU3RyaW5nKG9iaik7XG4gIGxldCBoYXNoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBvYmouY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hhcmFjdGVyO1xuICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRlaCB0eXBlIGZvciBhIEhhc2hpbmcgZnVuY3Rpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICogQGNhdGVnb3J5IEhhc2hpbmdcbiAqL1xuZXhwb3J0IHR5cGUgSGFzaGluZ0Z1bmN0aW9uID0gKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQHN1bW1hcnkgSGFzaGVzIGFuIG9iamVjdCBieSBjb21iaW5pbmcgdGhlIGhhc2ggb2YgYWxsIGl0cyBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHJlc3VsdGluZyBoYXNoXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hPYmpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICogQGNhdGVnb3J5IEhhc2hpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPYmoob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W10pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoUmVkdWNlciA9IGZ1bmN0aW9uIChoOiBudW1iZXIgfCBzdHJpbmcsIGVsOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGVsSGFzaCA9IGhhc2hGdW5jdGlvbihlbCk7XG5cbiAgICBpZiAodHlwZW9mIGVsSGFzaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBoYXNoRnVuY3Rpb24oKChoIGFzIHN0cmluZykgfHwgXCJcIikgKyBoYXNoRnVuY3Rpb24oZWwpKTtcblxuICAgIGggPSBoIHx8IDA7XG4gICAgaCA9ICgoaCBhcyBudW1iZXIpIDw8IDUpIC0gKGggYXMgbnVtYmVyKSArIGVsSGFzaDtcbiAgICByZXR1cm4gaCAmIGg7XG4gIH07XG5cbiAgY29uc3QgZnVuYzogSGFzaGluZ0Z1bmN0aW9uID0gaGFzaENvZGU7XG5cbiAgY29uc3QgaGFzaEZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcIlwiO1xuICAgIGlmIChbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJzeW1ib2xcIl0uaW5kZXhPZih0eXBlb2YgdmFsdWUpICE9PSAtMSlcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBmdW5jKHZhbHVlLmdldFRpbWUoKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUucmVkdWNlKGhhc2hSZWR1Y2VyLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiAoT2JqZWN0LnZhbHVlcyh2YWx1ZSkgYXMgKHN0cmluZyB8IG51bWJlcilbXSkucmVkdWNlKFxuICAgICAgaGFzaFJlZHVjZXIsXG4gICAgICB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXJcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC52YWx1ZXMob2JqKS5yZWR1Y2UoaGFzaFJlZHVjZXIsIDApO1xuXG4gIHJldHVybiAodHlwZW9mIHJlc3VsdCA9PT0gXCJudW1iZXJcIiA/IE1hdGguYWJzKHJlc3VsdCkgOiByZXN1bHQpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0SGFzaGluZ01ldGhvZCA9IFwiZGVmYXVsdFwiO1xuXG5leHBvcnQgY2xhc3MgSGFzaGluZyB7XG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6IHN0cmluZyA9IERlZmF1bHRIYXNoaW5nTWV0aG9kO1xuXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBIYXNoaW5nRnVuY3Rpb24+ID0ge1xuICAgIGRlZmF1bHQ6IGhhc2hPYmosXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBoYXNoaW5nIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZ1bmM6IEhhc2hpbmdGdW5jdGlvbixcbiAgICBzZXREZWZhdWx0ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYXNoaW5nIG1ldGhvZCAke2tleX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gZnVuYztcbiAgICBpZiAoc2V0RGVmYXVsdCkgdGhpcy5jdXJyZW50ID0ga2V5O1xuICB9XG5cbiAgc3RhdGljIGhhc2gob2JqOiBhbnksIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIHNldERlZmF1bHQobWV0aG9kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmdldChtZXRob2QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbEVycm9ycyB9IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIENsYXNzIHRvIGhvbGQgdGhlIGVycm9yIHJlc3VsdHNcbiAqIEBkZXNjcmlwdGlvbiBob2xkcyBlcnJvciByZXN1bHRzIGluIGFuICdpbmRleGFibGUnIG1hbm5lclxuICogd2hpbGUgc3RpbGwgcHJvdmlkaW5nIHRoZSBzYW1lIHJlc3VsdCBvbiB0b1N0cmluZ1xuICpcbiAqIEBwYXJhbSB7TW9kZWxFcnJvcnN9IGVycm9yc1xuICpcbiAqIEBjbGFzcyBNb2RlbEVycm9yRGVmaW5pdGlvblxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxFcnJvckRlZmluaXRpb24ge1xuICBbaW5kZXhlcjogc3RyaW5nXTpcbiAgICB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD5cbiAgICB8ICgoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIGNvbnN0cnVjdG9yKGVycm9yczogTW9kZWxFcnJvcnMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZXJyb3JzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9ycywgcHJvcCkgJiYgZXJyb3JzW3Byb3BdKVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyBhcyBhbnksIHByb3AsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IGVycm9yc1twcm9wXSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBPdXRwdXRzIHRoZSBjbGFzcyB0byBhIG5pY2UgcmVhZGFibGUgc3RyaW5nXG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxmOiBhbnkgPSB0aGlzIGFzIGFueTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2VsZilcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChrKSA9PlxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxmLCBrKSAmJlxuICAgICAgICAgIHR5cGVvZiBzZWxmW2tdICE9PSBcImZ1bmN0aW9uXCJcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcsIHByb3ApID0+IHtcbiAgICAgICAgbGV0IHByb3BFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gT2JqZWN0LmtleXMoc2VsZltwcm9wXSkucmVkdWNlKFxuICAgICAgICAgIChwcm9wQWNjdW06IHVuZGVmaW5lZCB8IHN0cmluZywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByb3BBY2N1bSkgcHJvcEFjY3VtID0gc2VsZltwcm9wXVtrZXldO1xuICAgICAgICAgICAgZWxzZSBwcm9wQWNjdW0gKz0gYFxcbiR7c2VsZltwcm9wXVtrZXldfWA7XG4gICAgICAgICAgICByZXR1cm4gcHJvcEFjY3VtO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb3BFcnJvcikge1xuICAgICAgICAgIHByb3BFcnJvciA9IGAke3Byb3B9IC0gJHtwcm9wRXJyb3J9YDtcbiAgICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHByb3BFcnJvcjtcbiAgICAgICAgICBlbHNlIGFjY3VtICs9IGBcXG4ke3Byb3BFcnJvcn1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgXCJcIik7XG4gIH1cbn1cbiIsIi8qKlxuICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgcmVsZXZhbnQgSlMgcHJpbWl0aXZlc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkcgcmVmZXJlbmNlcyB0aGUgc3RyaW5nIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiByZWZlcmVuY2VzIHRoZSBudW1iZXIgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTiByZWZlcmVuY2VzIHRoZSBib29sZWFuIHByaW1pdGl2ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVCByZWZlcmVuY2VzIHRoZSBiaWdpbnQgcHJpbWl0aXZlXG4gKlxuICogQGNvbnN0YW50IFByaW1pdGl2ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uTW9kZWxcbiAqL1xuZXhwb3J0IGVudW0gUHJpbWl0aXZlcyB7XG4gIFNUUklORyA9IFwic3RyaW5nXCIsXG4gIE5VTUJFUiA9IFwibnVtYmVyXCIsXG4gIEJPT0xFQU4gPSBcImJvb2xlYW5cIixcbiAgQklHSU5UID0gXCJiaWdpbnRcIixcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBSZXNlcnZlZCBtb2RlbCBuYW1lcyB0byBpZ25vcmUgZHVyaW5nIE1vZGVsIHJlYnVpbGRpbmdcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1RSSU5HXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT0JKRUNUXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0lOVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEVcbiAqXG4gKiBAY29uc3RhbnQgUmVzZXJ2ZWRNb2RlbHNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uTW9kZWxcbiAqL1xuZXhwb3J0IGVudW0gUmVzZXJ2ZWRNb2RlbHMge1xuICBTVFJJTkcgPSBcInN0cmluZ1wiLFxuICBPQkpFQ1QgPSBcIm9iamVjdFwiLFxuICBOVU1CRVIgPSBcIm51bWJlclwiLFxuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIEJJR0lOVCA9IFwiYmlnaW50XCIsXG4gIERBVEUgPSBcImRhdGVcIixcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBiYXNpYyBzdXBwb3J0ZWQganMgdHlwZXNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RyaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXJyYXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBib29sZWFuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3ltYm9sXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1bmRlZmluZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKlxuICogQGNvbnN0YW50IGpzVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uTW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IGpzVHlwZXMgPSBbXG4gIFwic3RyaW5nXCIsXG4gIFwiYXJyYXlcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuIiwiaW1wb3J0IHsgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSVZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IER1Y2sgdHlwaW5nIGZvciBWYWxpZGF0b3JzXG4gKiBAZnVuY3Rpb24gaXNWYWxpZGF0b3JcbiAqIEBwYXJhbSB2YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdG9yKHZhbDogYW55KSB7XG4gIHJldHVybiB2YWwuY29uc3RydWN0b3IgJiYgdmFsW1wiaGFzRXJyb3JzXCJdO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJhc2UgSW1wbGVtZW50YXRpb24gb2YgYSBWYWxpZGF0b3IgUmVnaXN0cnlcbiAqXG4gKiBAcHJvcCB7VmFsaWRhdG9yW119IFt2YWxpZGF0b3JzXSB0aGUgaW5pdGlhbCB2YWxpZGF0b3JzIHRvIHJlZ2lzdGVyXG4gKlxuICogQGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5XG4gKiBAaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnk8VCBleHRlbmRzIFZhbGlkYXRvcj5cbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yUmVnaXN0cnk8VD5cbntcbiAgcHJpdmF0ZSBjYWNoZTogYW55ID0ge307XG4gIHByaXZhdGUgY3VzdG9tS2V5Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoLi4udmFsaWRhdG9yczogKFZhbGlkYXRvckRlZmluaXRpb24gfCBWYWxpZGF0b3IpW10pIHtcbiAgICB0aGlzLmN1c3RvbUtleUNhY2hlID0ge307XG4gICAgdGhpcy5yZWdpc3RlciguLi52YWxpZGF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGN1c3RvbSBrZXlzXG4gICAqL1xuICBnZXRDdXN0b21LZXlzKCk6IHsgW2luZGV4ZXI6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXN0b21LZXlDYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMga2V5c1xuICAgKi9cbiAgZ2V0S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdG9yS2V5IG9uZSBvZiB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzfVxuICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4odmFsaWRhdG9yS2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoISh2YWxpZGF0b3JLZXkgaW4gdGhpcy5jYWNoZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjbGFzc09ySW5zdGFuY2UgPSB0aGlzLmNhY2hlW3ZhbGlkYXRvcktleV07XG4gICAgaWYgKGlzVmFsaWRhdG9yKGNsYXNzT3JJbnN0YW5jZSkpIHJldHVybiBjbGFzc09ySW5zdGFuY2UgYXMgVDtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGNsYXNzT3JJbnN0YW5jZS5kZWZhdWx0IHx8IGNsYXNzT3JJbnN0YW5jZTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb25zdHJ1Y3RvcigpO1xuICAgIHRoaXMuY2FjaGVbdmFsaWRhdG9yS2V5XSA9IGluc3RhbmNlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZhbGlkYXRvcnMgb250byB0aGUgcmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtUW10gfCBWYWxpZGF0b3JEZWZpbml0aW9uW119IHZhbGlkYXRvclxuICAgKi9cbiAgcmVnaXN0ZXI8VCBleHRlbmRzIFZhbGlkYXRvcj4oXG4gICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgKTogdm9pZCB7XG4gICAgdmFsaWRhdG9yLmZvckVhY2goKHYpID0+IHtcbiAgICAgIGlmIChpc1ZhbGlkYXRvcih2KSkge1xuICAgICAgICAvLyBjb25zdCBrID1cblxuICAgICAgICBpZiAoKHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbikudmFsaWRhdGlvbktleSBpbiB0aGlzLmNhY2hlKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FjaGVbKHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbikudmFsaWRhdGlvbktleV0gPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB2YWxpZGF0aW9uS2V5LCB2YWxpZGF0b3IsIHNhdmUgfSA9IHYgYXMgVmFsaWRhdG9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKHZhbGlkYXRpb25LZXkgaW4gdGhpcy5jYWNoZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhY2hlW3ZhbGlkYXRpb25LZXldID0gdmFsaWRhdG9yO1xuICAgICAgICBpZiAoIXNhdmUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIG9ialt2YWxpZGF0aW9uS2V5LnRvVXBwZXJDYXNlKCldID0gdmFsaWRhdGlvbktleTtcblxuICAgICAgICB0aGlzLmN1c3RvbUtleUNhY2hlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jdXN0b21LZXlDYWNoZSwgb2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IElWYWxpZGF0b3JSZWdpc3RyeSwgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gXCIuL1ZhbGlkYXRvcnMvVmFsaWRhdG9yUmVnaXN0cnlcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgYWN0aW5nIGFzIGEgbmFtZXNwYWNlIGZvciB0aGUgVmFsaWRhdGlvblxuICpcbiAqIEBjbGFzcyBWYWxpZGF0aW9uXG4gKiBAc3RhdGljXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb24ge1xuICBwcml2YXRlIHN0YXRpYyBhY3RpbmdWYWxpZGF0b3JSZWdpc3RyeT86IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+ID1cbiAgICB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGFjdGluZyBWYWxpZGF0b3JSZWdpc3RyeVxuICAgKlxuICAgKiBAcGFyYW0ge0lWYWxpZGF0b3JSZWdpc3RyeX0gdmFsaWRhdG9yUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIFJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oVmFsaWRhdG9yKTogVmFsaWRhdG9yfSBbbWlncmF0aW9uSGFuZGxlcl0gdGhlIG1ldGhvZCB0byBtYXAgdGhlIHZhbGlkYXRvciBpZiByZXF1aXJlZDtcbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShcbiAgICB2YWxpZGF0b3JSZWdpc3RyeTogSVZhbGlkYXRvclJlZ2lzdHJ5PFZhbGlkYXRvcj4sXG4gICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICkge1xuICAgIGlmIChtaWdyYXRpb25IYW5kbGVyICYmIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkpXG4gICAgICBWYWxpZGF0aW9uLmFjdGluZ1ZhbGlkYXRvclJlZ2lzdHJ5LmdldEtleXMoKS5mb3JFYWNoKChrOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdG9yUmVnaXN0cnkuZ2V0KGspO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB2YWxpZGF0b3JSZWdpc3RyeS5yZWdpc3RlcihtaWdyYXRpb25IYW5kbGVyKHZhbGlkYXRvcikpO1xuICAgICAgfSk7XG4gICAgVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSA9IHZhbGlkYXRvclJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICpcbiAgICogQHJldHVybiBJVmFsaWRhdG9yUmVnaXN0cnksIGRlZmF1bHRzIHRvIHtAbGluayBWYWxpZGF0b3JSZWdpc3RyeX1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCkge1xuICAgIGlmICghVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeSlcbiAgICAgIFZhbGlkYXRpb24uYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnkgPSBuZXcgVmFsaWRhdG9yUmVnaXN0cnkoKTtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5hY3RpbmdWYWxpZGF0b3JSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSB2YWxpZGF0b3JcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICogQHJldHVybiB7VmFsaWRhdG9yIHwgdW5kZWZpbmVkfSB0aGUgcmVnaXN0ZXJlZCBWYWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbm8gbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGtleVxuICAgKi9cbiAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBWYWxpZGF0aW9uLmdldFJlZ2lzdHJ5KCkuZ2V0KHZhbGlkYXRvcktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7VFtdIHwgVmFsaWRhdG9yRGVmaW5pdGlvbltdfSB2YWxpZGF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgVmFsaWRhdG9yPihcbiAgICAuLi52YWxpZGF0b3I6IChWYWxpZGF0b3JEZWZpbml0aW9uIHwgVClbXVxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbi5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKC4uLnZhbGlkYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBrZXkgdG8gc3RvcmUgYXMgTWV0YWRhdGEgdW5kZXIgUmVmbGVjdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIHZhbGlkYXRpb24ga2V5c1xuICAgKi9cbiAgc3RhdGljIGtleXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRLZXlzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vTW9kZWxFcnJvckRlZmluaXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhLCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBSZXNlcnZlZE1vZGVscyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVmFsaWRhdGFibGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNNb2RlbCwgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQW5hbHlzZXMgdGhlIGRlY29yYXRpb25zIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWxpZGF0ZXMgdGhlIG9iaiBhY2NvcmRpbmcgdG8gdGhlbVxuICpcbiAqIEB0eXBlZGVmIFQgZXh0ZW5kcyBNb2RlbFxuICogQHByb3Age1R9IG9iaiBNb2RlbCBvYmplY3QgdG8gdmFsaWRhdGVcbiAqIEBwcm9wIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGlnbm9yZSBpbiB0aGUgdmFsaWRhdGlvblxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIE1vZGVsPihcbiAgb2JqOiBULFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG9iailcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSAmJlxuICAgICAgcHJvcHNUb0lnbm9yZS5pbmRleE9mKHByb3ApID09PSAtMVxuICAgIClcbiAgICAgIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaChcbiAgICAgICAgUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBvYmosXG4gICAgICAgICAgcHJvcFxuICAgICAgICApIGFzIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25cbiAgICAgICk7XG5cbiAgbGV0IHJlc3VsdDogTW9kZWxFcnJvcnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0eSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gPSBkZWNvcmF0ZWRQcm9wZXJ0eTtcblxuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVmYXVsdFR5cGVEZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhID0gZGVjb3JhdG9yc1swXTtcblxuICAgIC8vIHRyaWVzIHRvIGZpbmQgYW55IHR5cGUgZGVjb3JhdG9ycyBvciBvdGhlciBkZWNvcmF0b3JzIHRoYXQgYWxyZWFkeSBlbmZvcmNlIHR5cGUgKHRoZSBvbmVzIHdpdGggdGhlIGFsbG93ZWQgdHlwZXMgcHJvcGVydHkgZGVmaW5lZCkuIGlmIHNvLCBza2lwIHRoZSBkZWZhdWx0IHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB7XG4gICAgICAgIGlmIChkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuVFlQRSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhIWQucHJvcHMudHlwZXM/LmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQgPT09IGRlZmF1bHRUeXBlRGVjb3JhdG9yLnByb3BzLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBkZWNvcmF0b3JzLnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSB0aGUgdHlwZSB3aWxsIGFscmVhZHkgYmUgY2hlY2tlZFxuICAgIH1cblxuICAgIGxldCBlcnJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoZGVjb3JhdG9yLmtleSk7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvclByb3BzID1cbiAgICAgICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgICA/IFtkZWNvcmF0b3IucHJvcHNdXG4gICAgICAgICAgOiBkZWNvcmF0b3IucHJvcHMgfHwge307XG5cbiAgICAgIGNvbnN0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdmFsaWRhdG9yLmhhc0Vycm9ycyhcbiAgICAgICAgKG9iaiBhcyBhbnkpW3Byb3AudG9TdHJpbmcoKV0sXG4gICAgICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJycyA9IGVycnMgfHwge307XG4gICAgICAgIGVycnNbZGVjb3JhdG9yLmtleV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycnMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdFtkZWNvcmF0ZWRQcm9wZXJ0eS5wcm9wLnRvU3RyaW5nKCldID0gZXJycztcbiAgICB9XG4gIH1cblxuICAvLyB0ZXN0cyBuZXN0ZWQgY2xhc3Nlc1xuICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoKGspID0+ICFyZXN1bHQgfHwgIXJlc3VsdFtrXSkpIHtcbiAgICBsZXQgZXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gaWYgYSBuZXN0ZWQgTW9kZWxcbiAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICkuZGVjb3JhdG9ycztcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICkuZGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAoZDogeyBrZXk6IHN0cmluZyB9KSA9PlxuICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICApO1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgY29uc3QgY2xhenogPSBkZWMucHJvcHMubmFtZVxuICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICA/IGRlYy5wcm9wcy5jdXN0b21UeXBlc1xuICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIGZvciAoY29uc3QgYyBvZiBjbGF6eikge1xuICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgdHlwZURlY29yYXRvcktleSA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRTtcbiAgICAgICAgY29uc3QgdHlwZXM6IGFueSA9XG4gICAgICAgICAgYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IHR5cGVEZWNvcmF0b3JLZXlcbiAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBsZXQgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZXMgJiYgdHlwZXMucHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21UeXBlcyA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgICAgPyB0eXBlcy5wcm9wcy5jbGFzc1xuICAgICAgICAgICAgOiB0eXBlcy5wcm9wcy5jdXN0b21UeXBlcztcbiAgICAgICAgICBpZiAoY3VzdG9tVHlwZXMpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXMgPSBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgICA/IGN1c3RvbVR5cGVzLm1hcCgodCkgPT4gYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgIDogW2N1c3RvbVR5cGVzLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSAocHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIE1vZGVsKS5oYXNFcnJvcnMoKVxuICAgICAgICAgICAgICA6IGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlIEFycmF5Lm5hbWU6XG4gICAgICAgICAgY2FzZSBTZXQubmFtZTpcbiAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgICAgIChkOiB7IGtleTogc3RyaW5nIH0pID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gKFxuICAgICAgICAgICAgICAgICAgYyA9PT0gQXJyYXkubmFtZVxuICAgICAgICAgICAgICAgICAgICA/IChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgOiAvLyBJZiBpdCdzIGEgU2V0XG4gICAgICAgICAgICAgICAgICAgICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS52YWx1ZXMoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHY6IFZhbGlkYXRhYmxlKSA9PiB2YWxpZGF0ZShwcm9wLCB2KSlcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGU6IGFueSkgPT4gISFlKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnI/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0Li4uXG4gICAgICAgICAgICAgICAgICBlcnIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdGUocHJvcCwgKG9iaiBhcyBhbnkpW3Byb3BdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oc2YoXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0cyBub3Q6IFwiICsgZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0W3Byb3BdID0gZXJyIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdCkgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBTZXJpYWxpemF0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgQ29tcGFyYWJsZSxcbiAgQ29uc3RydWN0b3IsXG4gIEhhc2hhYmxlLFxuICBNb2RlbEFyZyxcbiAgTW9kZWxCdWlsZGVyRnVuY3Rpb24sXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFNlcmlhbGl6YWJsZSxcbiAgVmFsaWRhdGFibGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgaXNFcXVhbCwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgdmFsaWRhdGUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIYXNoaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hhc2hpbmdcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IGpzVHlwZXMsIFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmxldCBtb2RlbEJ1aWxkZXJGdW5jdGlvbjogTW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5sZXQgYWN0aW5nTW9kZWxSZWdpc3RyeTogQnVpbGRlclJlZ2lzdHJ5PGFueT47XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5TW9kZWw8TSBleHRlbmRzIE1vZGVsPihcbiAgdGFyZ2V0OiBNLFxuICBhdHRyaWJ1dGU6IHN0cmluZ1xuKTogYm9vbGVhbiB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01vZGVsKCh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgYW55PilbYXR0cmlidXRlXSkpIHJldHVybiB0cnVlO1xuICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIHRhcmdldCwgYXR0cmlidXRlKTtcbiAgcmV0dXJuIE1vZGVsLmdldChtZXRhZGF0YS5uYW1lKSA/IG1ldGFkYXRhLm5hbWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRm9yIFNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIHRoZSB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHkgb2YgYSB7QGxpbmsgTW9kZWx9IHRvIGRpc2NvdmVyIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICpcbiAqIEBmdW5jdGlvbiBpc01vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICB0cnkge1xuICAgIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbCB8fCAhIU1vZGVsLmdldE1ldGFkYXRhKHRhcmdldCBhcyBhbnkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kZWxSZWdpc3RyeSBJbnRlcmZhY2VcbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxNb2RlbD5cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeTxUIGV4dGVuZHMgTW9kZWw+ID0gQnVpbGRlclJlZ2lzdHJ5PFQ+O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgY2xhc3MgdG8gZW5hYmxlIHNlcmlhbGl6YXRpb24gYW5kIGNvcnJlY3QgcmVidWlsZGluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbmNob3JLZXkgZGVmYXVsdHMgdG8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9LiBUaGUgcHJvcGVydHkgbmFtZSB3aGVyZSB0aGUgcmVnaXN0ZXJlZCBjbGFzcyBuYW1lIGlzIHN0b3JlZDtcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW59IFt0ZXN0RnVuY3Rpb25dIG1ldGhvZCB0byB0ZXN0IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYSBNb2RlbCBPYmplY3QuIGRlZmF1bHRzIHRvIHtAbGluayBpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeVxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnk8VD4ge1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPFQ+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGdW5jdGlvbjogKG9iajogb2JqZWN0KSA9PiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHRlc3RGdW5jdGlvbjogKG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbiA9IGlzTW9kZWwpIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZWdpc3RlciBuZXcgTW9kZWxzXG4gICAqIEBwYXJhbSB7YW55fSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIHdoZW4gbm90IGRlZmluZWQsIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPFQ+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IFQge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIlByb3ZpZGVkIGNsYXNzIHswfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdFwiLCBuYW1lKVxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuY2FjaGVbbmFtZV0ob2JqKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJ1bGsgUmVnaXN0ZXJzIE1vZGVsc1xuICogQGRlc2NyaXB0aW9uIFVzZWZ1bCB3aGVuIHVzaW5nIGJ1bmRsZXJzIHRoYXQgbWlnaHQgbm90IGV2YWx1YXRlIGFsbCB0aGUgY29kZSBhdCBvbmNlXG4gKlxuICogQHBhcmFtIHtBcnJheTxDb25zdHJ1Y3RvcjxUPj4gfCBBcnJheTx7bmFtZTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD59Pn0gW21vZGVsc11cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtNb2RlbFJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIC4uLm1vZGVsczogKENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KVtdXG4pIHtcbiAgbW9kZWxzLmZvckVhY2goXG4gICAgKG06IENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gPSAoXG4gICAgICAgIG0uY29uc3RydWN0b3IgPyBtLmNvbnN0cnVjdG9yIDogbVxuICAgICAgKSBhcyBDb25zdHJ1Y3RvcjxUPjtcbiAgICAgIE1vZGVsLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCAobSBhcyBDb25zdHJ1Y3RvcjxUPikubmFtZSk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIFZhbGlkYXRhYmxlIE1vZGVsIG9iamVjdFxuICogQGRlc2NyaXB0aW9uIE1lYW50IHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBhbGwgTW9kZWwgY2xhc3Nlc1xuICpcbiAqIE1vZGVsIG9iamVjdHMgbXVzdDpcbiAqICAtIEhhdmUgYWxsIHRoZWlyIHJlcXVpcmVkIHByb3BlcnRpZXMgbWFya2VkIHdpdGggJyEnO1xuICogIC0gSGF2ZSBhbGwgdGhlaXIgb3B0aW9uYWwgcHJvcGVydGllcyBtYXJrZWQgYXMgJz8nOlxuICpcbiAqIEBwYXJhbSB7TW9kZWwgfCB7fX0gbW9kZWwgYmFzZSBvYmplY3QgZnJvbSB3aGljaCB0byBwb3B1bGF0ZSBwcm9wZXJ0aWVzIGZyb21cbiAqXG4gKiBAY2xhc3MgTW9kZWxcbiAqIEBhYnN0cmFjdFxuICogQGltcGxlbWVudHMgVmFsaWRhdGFibGVcbiAqIEBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgICBAcmVxdWlyZWQoKVxuICogICAgICAgICAgcmVxdWlyZWRQcm9wZXJ0eU5hbWUhOiBQcm9wZXJ0eVR5cGU7XG4gKlxuICogICAgICAgICAgb3B0aW9uYWxQcm9wZXJ0eU5hbWU/OiBQcm9wZXJ0eVR5cGU7XG4gKiAgICAgIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsXG4gIGltcGxlbWVudHMgVmFsaWRhdGFibGUsIFNlcmlhbGl6YWJsZSwgSGFzaGFibGUsIENvbXBhcmFibGU8TW9kZWw+XG57XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGFyZz86IE1vZGVsQXJnPE1vZGVsPikge31cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIGl0cyBkZWNvcmF0ZWQgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0ge2FueVtdfSBbZXhjZXB0aW9uc10gcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0IHRvIGJlIGlnbm9yZWQgZm9yIHRoZSB2YWxpZGF0aW9uLiBNYXJrZWQgYXMgJ2FueScgdG8gYWxsb3cgZm9yIGV4dGVuc2lvbiBidXQgZXhwZWN0cyBzdHJpbmdzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKC4uLmV4Y2VwdGlvbnM6IGFueVtdKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDb21wYXJlIG9iamVjdCBlcXVhbGl0eSByZWN1cnNpdmVseVxuICAgKiBAcGFyYW0ge2FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhjZXB0aW9uc10gcHJvcGVydHkgbmFtZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvblxuICAgKi9cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSwgLi4uZXhjZXB0aW9uczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLCBvYmosIC4uLmV4Y2VwdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHNlcmlhbGl6ZWQgbW9kZWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50bHkgZGVmaW5lZCB7QGxpbmsgU2VyaWFsaXplcn1cbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5zZXJpYWxpemUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGUgdGhlIGltcGxlbWVudGF0aW9uIGZvciBqcydzICd0b1N0cmluZygpJyB3aGljaCBzdWNrcy4uLlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIjogXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzLCB1bmRlZmluZWQsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvYmplY3QgaGFzaC4gUmVsaWVzIG9uIGEgdmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKYXZhJ3Mgc3RyaW5nIGhhc2g7XG4gICAqL1xuICBwdWJsaWMgaGFzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5oYXNoKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlc2VyaWFsaXplcyBhIE1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIGlmIGl0IGZhaWxzIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5TRVJJQUxJWkFUSU9OKSxcbiAgICAgIHRoaXMuY29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgaWYgKG1ldGFkYXRhICYmIG1ldGFkYXRhLnNlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gU2VyaWFsaXphdGlvbi5kZXNlcmlhbGl6ZShcbiAgICAgICAgc3RyLFxuICAgICAgICBtZXRhZGF0YS5zZXJpYWxpemVyLFxuICAgICAgICAuLi4obWV0YWRhdGEuYXJncyB8fCBbXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb24uZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXBvcHVsYXRlcyB0aGUgT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgb25lcyBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBJdGVyYXRlcyBhbGwgY29tbW9uIHByb3BlcnRpZXMgb2Ygb2JqIChpZiBleGlzdGluZykgYW5kIHNlbGYsIGFuZCBjb3BpZXMgdGhlbSBvbnRvIHNlbGZcbiAgICpcbiAgICogQHBhcmFtIHtUfSBzZWxmXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNlbGY6IFQsXG4gICAgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogVCB7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBNb2RlbC5nZXRBdHRyaWJ1dGVzKHNlbGYpKSB7XG4gICAgICAoc2VsZiBhcyBhbnkpW3Byb3BdID0gKG9iaiBhcyBhbnkpW3Byb3BdIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVwb3B1bGF0ZXMgdGhlIGluc3RhbmNlIHdpdGggdGhlIG9uZXMgZnJvbSB0aGUgbmV3IE1vZGVsIE9iamVjdFxuICAgKiBAZGVzY3JpcHRpb24gSXRlcmF0ZXMgYWxsIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIG9iaiAoaWYgZXhpc3RpbmcpIGFuZCBzZWxmLCBhbmQgY29waWVzIHRoZW0gb250byBzZWxmLlxuICAgKiBJcyBhd2FyZSBvZiBuZXN0ZWQgTW9kZWwgT2JqZWN0cyBhbmQgcmVidWlsZHMgdGhlbSBhbHNvLlxuICAgKiBXaGVuIExpc3QgcHJvcGVydGllcyBhcmUgZGVjb3JhdGVkIHdpdGgge0BsaW5rIGxpc3R9LCB0aGV5IGxpc3QgaXRlbXMgd2lsbCBhbHNvIGJlIHJlYnVpbHRcbiAgICpcbiAgICogQHBhcmFtIHtUfSBzZWxmXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IFtvYmpdXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbD4oc2VsZjogVCwgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUIHtcbiAgICBpZiAoIW9iaikgb2JqID0ge307XG5cbiAgICBsZXQgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSwgZGVjOiBEZWNvcmF0b3JNZXRhZGF0YTtcblxuICAgIGNvbnN0IHByb3BzID0gTW9kZWwuZ2V0QXR0cmlidXRlcyhzZWxmKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPVxuICAgICAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdIHx8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgKHNlbGYgYXMgYW55KVtwcm9wXSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgICBjb25zdCBwcm9wTSA9IGlzUHJvcGVydHlNb2RlbChzZWxmLCBwcm9wKTtcbiAgICAgIGlmIChwcm9wTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSxcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wTSA9PT0gXCJzdHJpbmdcIiA/IHByb3BNIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbERlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPVxuICAgICAgICBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApLmRlY29yYXRvcnM7XG4gICAgICBkZWNvcmF0b3JzID0gYWxsRGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAgIChkOiBEZWNvcmF0b3JNZXRhZGF0YSkgPT5cbiAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICAgICk7XG4gICAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2YoXCJmYWlsZWQgdG8gZmluZCBkZWNvcmF0b3JzIGZvciBwcm9wZXJ0eSB7MH1cIiwgcHJvcCkpO1xuICAgICAgZGVjID0gZGVjb3JhdG9ycy5wb3AoKSBhcyBEZWNvcmF0b3JNZXRhZGF0YTtcbiAgICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShkZWMucHJvcHMuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+XG4gICAgICAgIHYudG9Mb3dlckNhc2UoKVxuICAgICAgKSBhcyBzdHJpbmdbXTtcblxuICAgICAgY2xhenouZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBpZiAocmVzZXJ2ZWQuaW5kZXhPZihjLnRvTG93ZXJDYXNlKCkpID09PSAtMSlcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgICAgaWYgKGFsbERlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoZCkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1RcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAobGlzdERlYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAobGlzdERlYy5wcm9wcy5jbGF6eiBhcyBzdHJpbmdbXSkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodDogc3RyaW5nKSA9PiAhanNUeXBlcy5pbmNsdWRlcyh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBcIkFycmF5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAgICAgICAgICAgICApW3Byb3BdLm1hcCgoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcIm9iamVjdFwiLCBcImZ1bmN0aW9uXCJdLmluY2x1ZGVzKHR5cGVvZiBlbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gTW9kZWwuYnVpbGQoZWwsIGNsYXp6TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbDtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IFwiU2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiAoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXCJvYmplY3RcIiwgXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlb2YgdikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQoTW9kZWwuYnVpbGQodiwgY2xhenpOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZCh2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKHNlbGYgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICgoc2VsZiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXSlcbiAgICAgICAgICAgICAgICAgIChzZWxmIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdID0gTW9kZWwuYnVpbGQoXG4gICAgICAgICAgICAgICAgICAgIChzZWxmIGFzIGFueSlbcHJvcF0sXG4gICAgICAgICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGhhdmUgbm8gcmVnaXN0cnkgb2YgdGhpcyBjbGFzc1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBHbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufVxuICAgKiBAcGFyYW0ge01vZGVsQnVpbGRlckZ1bmN0aW9ufSBbYnVpbGRlcl1cbiAgICovXG4gIHN0YXRpYyBzZXRCdWlsZGVyKGJ1aWxkZXI/OiBNb2RlbEJ1aWxkZXJGdW5jdGlvbikge1xuICAgIG1vZGVsQnVpbGRlckZ1bmN0aW9uID0gYnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZ2xvYmFsIHtAbGluayBNb2RlbEJ1aWxkZXJGdW5jdGlvbn1cbiAgICovXG4gIHN0YXRpYyBnZXRCdWlsZGVyKCk6IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbW9kZWxCdWlsZGVyRnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgTW9kZWxSZWdpc3RyeU1hbmFnZXJ9XG4gICAqXG4gICAqIEByZXR1cm4gTW9kZWxSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIE1vZGVsUmVnaXN0cnlNYW5hZ2VyfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKSB7XG4gICAgaWYgKCFhY3RpbmdNb2RlbFJlZ2lzdHJ5KSBhY3RpbmdNb2RlbFJlZ2lzdHJ5ID0gbmV3IE1vZGVsUmVnaXN0cnlNYW5hZ2VyKCk7XG4gICAgcmV0dXJuIGFjdGluZ01vZGVsUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBhY3RpbmdNb2RlbFJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7QnVpbGRlclJlZ2lzdHJ5fSBtb2RlbFJlZ2lzdHJ5IHRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShtb2RlbFJlZ2lzdHJ5OiBCdWlsZGVyUmVnaXN0cnk8YW55Pikge1xuICAgIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBtb2RlbFJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJlZ2lzdGVyIG5ldyBNb2RlbHNcbiAgICogQHBhcmFtIHthbnl9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gd2hlbiBub3QgZGVmaW5lZCwgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZFxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG5hbWU/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoY29uc3RydWN0b3IsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihuYW1lOiBzdHJpbmcpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICpcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICBjbGF6ej86IHN0cmluZ1xuICApOiBUIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5idWlsZChvYmosIGNsYXp6KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxWIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBWKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG4gICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvdmlkZWQgXCIgKyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRBdHRyaWJ1dGVzPFYgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPFY+IHwgVikge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcHJvdG90eXBlID1cbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWxcbiAgICAgICAgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpXG4gICAgICAgIDogKG1vZGVsIGFzIGFueSkucHJvdG90eXBlO1xuICAgIHdoaWxlIChwcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gcHJvdG90eXBlW01vZGVsS2V5cy5BVFRSSUJVVEVdO1xuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnByb3BzKTtcbiAgICAgIH1cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGVxdWFsczxWIGV4dGVuZHMgTW9kZWw+KG9iajE6IFYsIG9iajI6IFYsIC4uLmV4Y2VwdGlvbnM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGlzRXF1YWwob2JqMSwgb2JqMiwgLi4uZXhjZXB0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgaGFzRXJyb3JzPFYgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IFYsIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKG1vZGVsLCAuLi5wcm9wc1RvSWdub3JlKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemU8ViBleHRlbmRzIE1vZGVsPihtb2RlbDogVikge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuc2VyaWFsaXplcilcbiAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbWV0YWRhdGEuc2VyaWFsaXplcixcbiAgICAgICAgLi4uKG1ldGFkYXRhLmFyZ3MgfHwgW10pXG4gICAgICApO1xuICAgIHJldHVybiBTZXJpYWxpemF0aW9uLnNlcmlhbGl6ZShtb2RlbCk7XG4gIH1cblxuICBzdGF0aWMgaGFzaDxWIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBWKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSxcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5hbGdvcml0aG0pXG4gICAgICByZXR1cm4gSGFzaGluZy5oYXNoKG1vZGVsLCBtZXRhZGF0YS5hbGdvcml0aG0sIC4uLihtZXRhZGF0YS5hcmdzIHx8IFtdKSk7XG4gICAgcmV0dXJuIEhhc2hpbmcuaGFzaChtb2RlbCk7XG4gIH1cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIE1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zXG4gICAqIEBkZXNjcmlwdGlvbiBjb25jYXRlbmF0ZXMge0BsaW5rIE1vZGVsS2V5cyNSRUZMRUNUfSB3aXRoIHRoZSBwcm92aWRlZCBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGtleShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBNb2RlbEtleXMuUkVGTEVDVCArIHN0cjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcmlhbGl6YXRpb25NZXRob2QgPSBcImpzb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBTZXJpYWxpemVyfSBpbiBKU09OIGZvcm1hdFxuICogQGRlc2NyaXB0aW9uIEpTJ3MgbmF0aXZlIEpTT04uc3RyaW5naWZ5ICh1c2VkIGhlcmUpIGlzIG5vdCBkZXRlcm1pbmlzdGljXG4gKiBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgaGFzaGluZyBwdXJwb3Nlc1xuICpcbiAqIFRvIGtlZXAgZGVwZW5kZW5jaWVzIGxvdywgd2Ugd2lsbCBub3QgaW1wbGVtZW50IHRoaXMsIGJ1dCB3ZSByZWNvbW1lbmRcbiAqIGltcGxlbWVudGluZyBhIHNpbWlsYXIge0BsaW5rIEpTT05TZXJpYWxpemVyfSB1c2luZyAnZGV0ZXJtaW5pc3RpYy1qc29uJyBsaWJyYXJpZXNcbiAqXG4gKiBAY2xhc3MgSlNPTlNlcmlhbGl6ZXJcbiAqIEBpbXBsZW1lbnRzIFNlcmlhbGl6ZXJcbiAqXG4gKiBAY2F0ZWdvcnkgU2VyaWFsaXphdGlvblxuICovXG5leHBvcnQgY2xhc3MgSlNPTlNlcmlhbGl6ZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIFNlcmlhbGl6ZXI8VD4ge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHNlcmlhbGl6YXRpb25cbiAgICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIG9iamVjdCwgY29udGFpbmluZyBhbiBlbnVtZXJhYmxlIHtAbGluayBNb2RlbEtleXMjQU5DSE9SfSBwcm9wZXJ0eVxuICAgKiBzbyB0aGUgb2JqZWN0IGNhbiBiZSByZWNvZ25pemVkIHVwb24gZGVzZXJpYWxpemF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VH0gbW9kZWxcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZVNlcmlhbGl6ZShtb2RlbDogVCkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBNb2RlbC5nZXRNZXRhZGF0YShtb2RlbCk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IFQgPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBUO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWxcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgZmFpbHMgdG8gc2VyaWFsaXplXG4gICAqL1xuICBzZXJpYWxpemUobW9kZWw6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDogc3RyaW5nID0gRGVmYXVsdFNlcmlhbGl6YXRpb25NZXRob2Q7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6ZXI8YW55Pj4gPSB7XG4gICAganNvbjogbmV3IEpTT05TZXJpYWxpemVyKCksXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzZXJpYWxpemF0aW9uIG1ldGhvZCByZWdpc3RlcmVkIHVuZGVyICR7a2V5fWApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZ1bmM6IENvbnN0cnVjdG9yPFNlcmlhbGl6ZXI8YW55Pj4sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGlmIChrZXkgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VyaWFsaXphdGlvbiBtZXRob2QgJHtrZXl9IGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIHRoaXMuY2FjaGVba2V5XSA9IG5ldyBmdW5jKCk7XG4gICAgaWYgKHNldERlZmF1bHQpIHRoaXMuY3VycmVudCA9IGtleTtcbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqOiBhbnksIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KG1ldGhvZCkuc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUob2JqOiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuY3VycmVudCkuZGVzZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICB9XG5cbiAgc3RhdGljIHNldERlZmF1bHQobWV0aG9kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmdldChtZXRob2QpO1xuICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fZXNEZWNvcmF0ZTogX19lc0RlY29yYXRlLFxyXG4gICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzLFxyXG4gICAgX19wcm9wS2V5OiBfX3Byb3BLZXksXHJcbiAgICBfX3NldEZ1bmN0aW9uTmFtZTogX19zZXRGdW5jdGlvbk5hbWUsXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbjogX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXHJcbn07XHJcbiIsImltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBCYXNlIEltcGxlbWVudGF0aW9uIGZvciBWYWxpZGF0b3JzXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIFZhbGlkYXRvcn1zXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRpb25LZXkgdGhlIGtleSB0byByZWdpc3RlciB0aGUgdmFsaWRhdG9yIHVuZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNERUZBVUxUfVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FjY2VwdGVkVHlwZXNdIGRlZmluZXMgdGhlIHZhbHVlIHR5cGVzIHRoaXMgdmFsaWRhdG9yIGNhbiB2YWxpZGF0ZVxuICpcbiAqIEBjbGFzcyBWYWxpZGF0b3JcbiAqIEBhYnN0cmFjdFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbGlkYXRvcjxWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyA9IFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBhY2NlcHRlZFR5cGVzPzogc3RyaW5nW107XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXG4gICAgaWYgKGFjY2VwdGVkVHlwZXMubGVuZ3RoKSB0aGlzLmFjY2VwdGVkVHlwZXMgPSBhY2NlcHRlZFR5cGVzO1xuICAgIGlmICh0aGlzLmFjY2VwdGVkVHlwZXMpXG4gICAgICB0aGlzLmhhc0Vycm9ycyA9IHRoaXMuY2hlY2tUeXBlQW5kSGFzRXJyb3JzKHRoaXMuaGFzRXJyb3JzLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGJ1aWxkcyB0aGUgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gc2YobWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHR5cGVcbiAgICogQHBhcmFtIHthbnl9IHVuYm91bmRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tUeXBlQW5kSGFzRXJyb3JzKFxuICAgIHVuYm91bmQ6ICh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBWYWxpZGF0b3IsXG4gICAgICB2YWx1ZTogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgICAgcmV0dXJuIHVuYm91bmQodmFsdWUsIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFSZWZsZWN0aW9uLmNoZWNrVHlwZXModmFsdWUsIHRoaXMuYWNjZXB0ZWRUeXBlcykpXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlcy5qb2luKFwiLCBcIiksXG4gICAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgLi4uYXJncyk7XG4gICAgfS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhbiBhdHRyaWJ1dGVcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEBwYXJhbSB7VmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnNdIFZhbGlkYXRlIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBtb2RlbCB2YWxpZGF0aW9uIGJlaGF2aW9yXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKlxuICAgKiBAc2VlIE1vZGVsI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGhhc0Vycm9ycyh2YWx1ZTogYW55LCBvcHRpb25zPzogVik6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi8uLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1hcmtzIHRoZSBjbGFzcyBhcyBhIHZhbGlkYXRvciBmb3IgYSBjZXJ0YWluIGtleS5cbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgdGhlIGNsYXNzIGluIHRoZSB7QGxpbmsgVmFsaWRhdGlvbn0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleXMgdGhlIHZhbGlkYXRpb24ga2V5XG4gKlxuICogQGZ1bmN0aW9uIHZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0b3I8VCBleHRlbmRzIFZhbGlkYXRvcj4oLi4ua2V5czogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgICgob3JpZ2luYWw6IENvbnN0cnVjdG9yPFQ+KSA9PiB7XG4gICAgICBrZXlzLmZvckVhY2goKGs6IHN0cmluZykgPT4ge1xuICAgICAgICBWYWxpZGF0aW9uLnJlZ2lzdGVyKHtcbiAgICAgICAgICB2YWxpZGF0b3I6IG9yaWdpbmFsLFxuICAgICAgICAgIHZhbGlkYXRpb25LZXk6IGssXG4gICAgICAgICAgc2F2ZTogdHJ1ZSxcbiAgICAgICAgfSBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsO1xuICAgIH0pIGFzIENsYXNzRGVjb3JhdG9yLFxuICAgIG1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlZBTElEQVRPUiksIGtleXMpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEYXRlVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNEQVRFfVxuICpcbiAqIEBjbGFzcyBEYXRlVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG5leHBvcnQgY2xhc3MgRGF0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxEYXRlVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRBVEUpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBOdW1iZXIubmFtZSwgRGF0ZS5uYW1lLCBTdHJpbmcubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtEYXRlIHwgc3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0RhdGVWYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9uc11cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM6IERhdGVWYWxpZGF0b3JPcHRpb25zID0ge31cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlLmdldERhdGUoKSkpIHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSA9IFwiXCIgfSA9IG9wdGlvbnM7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCByZWdleHBQYXJzZXI6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoXCJeLyguKykvKFtnaW11c10qKSRcIik7XG5cbi8qKlxuICogQHN1bW1hcnkgUGF0dGVybiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBVFRFUk59XG4gKlxuICogQGNsYXNzIFBhdHRlcm5WYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuUEFUVEVSTilcbmV4cG9ydCBjbGFzcyBQYXR0ZXJuVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFUVEVSTikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFwic3RyaW5nXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgcGF0dGVyblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCB7XG4gICAgaWYgKCFyZWdleHBQYXJzZXIudGVzdChwYXR0ZXJuKSkgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgY29uc3QgbWF0Y2g6IGFueSA9IHBhdHRlcm4ubWF0Y2gocmVnZXhwUGFyc2VyKTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIE1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgbGV0IHsgcGF0dGVybiB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXBhdHRlcm4pIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgUGF0dGVyblwiKTtcbiAgICBwYXR0ZXJuID0gdHlwZW9mIHBhdHRlcm4gPT09IFwic3RyaW5nXCIgPyB0aGlzLmdldFBhdHRlcm4ocGF0dGVybikgOiBwYXR0ZXJuO1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDsgLy8gcmVzZXRzIHBhdHRlcm4gcG9zaXRpb24gZm9yIHJlcGVhdCB2YWxpZGF0aW9uIHJlcXVlc3RzXG4gICAgcmV0dXJuICFwYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3IgfSBmcm9tIFwiLi9QYXR0ZXJuVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEVtYWlsIFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGNsYXNzIEVtYWlsVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5FTUFJTClcbmV4cG9ydCBjbGFzcyBFbWFpbFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVNQUlMKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7UGF0dGVyblZhbGlkYXRvck9wdGlvbnN9IFtvcHRpb25zXVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHBhdHRlcm46IG9wdGlvbnM/LnBhdHRlcm4gfHwgREVGQVVMVF9QQVRURVJOUy5FTUFJTCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTGlzdFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBMaXN0IFZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTElTVH1cbiAqXG4gKiBAY2xhc3MgTGlzdFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuZXhwb3J0IGNsYXNzIExpc3RWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TGlzdFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgQXJyYXkubmFtZSwgU2V0Lm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7YW55W10gfCBTZXQ8YW55Pn0gdmFsdWVcbiAgICogQHBhcmFtIHtMaXN0VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogYW55W10gfCBTZXQ8YW55PixcbiAgICBvcHRpb25zOiBMaXN0VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gIXZhbHVlLmxlbmd0aCA6ICF2YWx1ZS5zaXplKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xhenogPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuY2xhenopXG4gICAgICA/IG9wdGlvbnMuY2xhenpcbiAgICAgIDogW29wdGlvbnMuY2xhenpdO1xuICAgIGxldCB2YWw6IGFueSxcbiAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGZvciAoXG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBpIDwgKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubGVuZ3RoIDogdmFsdWUuc2l6ZSk7XG4gICAgICBpKytcbiAgICApIHtcbiAgICAgIHZhbCA9ICh2YWx1ZSBhcyBhbnkpW2ldO1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgaXNWYWxpZCA9IGNsYXp6LmluY2x1ZGVzKCh2YWwgYXMgb2JqZWN0KS5jb25zdHJ1Y3Rvcj8ubmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaXNWYWxpZCA9IGNsYXp6LnNvbWUoKGM6IHN0cmluZykgPT4gdHlwZW9mIHZhbCA9PT0gYy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXNWYWxpZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIGNsYXp6KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cywgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1heGltdW0gTGVuZ3RoIFZhbGlkYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBzdHJpbmdzIGFuZCBBcnJheXMgb24gdGhlaXIgbWF4aW11bSBsZW5ndGhcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWF9MRU5HVEh9XG4gKlxuICogQGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKVxuZXhwb3J0IGNsYXNzIE1heExlbmd0aFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUFYX0xFTkdUSCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFN0cmluZy5uYW1lLCBBcnJheS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICB2YWx1ZTogc3RyaW5nIHwgYW55W10sXG4gICAgb3B0aW9uczogTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gb3B0aW9ucy5tYXhsZW5ndGhcbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG9wdGlvbnMubWF4bGVuZ3RoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1heFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNYXggVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGNsYXNzIE1heFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG5leHBvcnQgY2xhc3MgTWF4VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yPE1heFZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcIkRhdGVcIiwgXCJzdHJpbmdcIik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgTW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TWF4VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWF4VmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1heCB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWF4IGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1heCA9IG5ldyBEYXRlKG1heCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1heC5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1heCBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA+IG1heFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgbWF4KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNaW5pbXVtIExlbmd0aCBWYWxpZGF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgc3RyaW5ncyBhbmQgQXJyYXlzIG9uIHRoZWlyIG1pbmltdW0gbGVuZ3RoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3JcbiAqIEBleHRlbmRzIFZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbmV4cG9ydCBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEgpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBTdHJpbmcubmFtZSwgQXJyYXkubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG1lbWJlck9mIE1pbkxlbmd0aFZhbGlkYXRvclxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBhbnlbXSxcbiAgICBvcHRpb25zOiBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBvcHRpb25zLm1pbmxlbmd0aFxuICAgICAgPyB0aGlzLmdldE1lc3NhZ2Uob3B0aW9ucy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZSwgb3B0aW9ucy5taW5sZW5ndGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1pbiBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqXG4gKiBAY2xhc3MgTWluVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLk1JTilcbmV4cG9ydCBjbGFzcyBNaW5WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8TWluVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFwibnVtYmVyXCIsIFwiRGF0ZVwiLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgTW9kZWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7TWF4VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTWluVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblxuICAgIGxldCB7IG1pbiB9ID0gb3B0aW9ucztcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICEobWluIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIG1pbiA9IG5ldyBEYXRlKG1pbik7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG1pbi5nZXREYXRlKCkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIE1pbiBwYXJhbSBkZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPCBtaW5cbiAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsIG1pbilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXR0ZXJuVmFsaWRhdG9yIH0gZnJvbSBcIi4vUGF0dGVyblZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgSGFuZGxlcyBQYXNzd29yZCBWYWxpZGF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck1lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBU1NXT1JEfVxuICpcbiAqIEBjbGFzcyBQYXNzd29yZFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuUEFTU1dPUkQpXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRWYWxpZGF0b3IgZXh0ZW5kcyBQYXR0ZXJuVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkQpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXF1aXJlZCBWYWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICpcbiAqIEBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbmV4cG9ydCBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVRVUlSRUQpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtWYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICF2YWx1ZVxuICAgICAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTdGVwVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFN0ZXAgVmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNTVEVQfVxuICpcbiAqIEBjbGFzcyBTdGVwVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLlNURVApXG5leHBvcnQgY2xhc3MgU3RlcFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxTdGVwVmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBcIm51bWJlclwiLCBcInN0cmluZ1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXBcbiAgICogQHBhcmFtIHtTdGVwVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdGVwVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSAlIE51bWJlcihvcHRpb25zLnN0ZXApICE9PSAwXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLnN0ZXApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi9WYWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlVmFsaWRhdG9yT3B0aW9ucywgVmFsaWRhdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcXVpcmVkIFZhbGlkYXRvclxuICpcbiAqIEBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuZXhwb3J0IGNsYXNzIFR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8VHlwZVZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgbW9kZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7VHlwZVZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVHlwZVZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBEb24ndCB0cnkgYW5kIGVuZm9yY2UgdHlwZSBpZiB1bmRlZmluZWRcbiAgICBjb25zdCB7IHR5cGVzLCBtZXNzYWdlIH0gPSBvcHRpb25zO1xuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcykpXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdHlwZW9mIHR5cGVzID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0eXBlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh0eXBlcylcbiAgICAgICAgICAgID8gdHlwZXMuam9pbihcIiwgXCIpXG4gICAgICAgICAgICA6IHR5cGVzLm5hbWUsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG5WYWxpZGF0aW9uLnJlZ2lzdGVyKHtcbiAgdmFsaWRhdG9yOiBUeXBlVmFsaWRhdG9yLFxuICB2YWxpZGF0aW9uS2V5OiBNb2RlbEtleXMuVFlQRSxcbiAgc2F2ZTogZmFsc2UsXG59IGFzIFZhbGlkYXRvckRlZmluaXRpb24pO1xuIiwiaW1wb3J0IHtcbiAgVmFsaWRhdGlvbktleXMsXG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVVJMIFZhbGlkYXRvclxuICogQGRlc2NyaXB0aW9uIFBhdHRlcm4gZnJvbSB7QGxpbmsgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZHBlcmluaS83MjkyOTR9XG4gKlxuICogQGNsYXNzIFVSTFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICpcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuVVJMKVxuZXhwb3J0IGNsYXNzIFVSTFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBhIG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1BhdHRlcm5WYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV1cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7fVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnModmFsdWUsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBwYXR0ZXJuOiBvcHRpb25zLnBhdHRlcm4gfHwgREVGQVVMVF9QQVRURVJOUy5VUkwsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25NZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBERUZBVUxUX1BBVFRFUk5TLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIi4vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gXCIuLi91dGlscy9kYXRlc1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIi4uL3V0aWxzL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi9WYWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlcXVpcmVkLlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNSRVFVSVJFRH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNSRVFVSVJFRH1cbiAqXG4gKiBAZnVuY3Rpb24gcmVxdWlyZWRcbiAqXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRVFVSVJFRCkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpLFxuICAgIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTn1cbiAqXG4gKiBAZnVuY3Rpb24gbWluXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOXG4pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLk1JTiksIHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWH1cbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IERhdGV9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVh9XG4gKlxuICogQGZ1bmN0aW9uIG1heFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gIHZhbHVlOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWFxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVgpLCB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZSwgRGF0ZS5uYW1lXSxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHN0ZXAgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNTVEVQfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAZnVuY3Rpb24gc3RlcFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5EZWNvcmF0b3JzLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlNURVBcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuU1RFUCksIHtcbiAgICBbVmFsaWRhdGlvbktleXMuU1RFUF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZV0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01JTl9MRU5HVEh9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNSU5fTEVOR1RIfVxuICpcbiAqIEBmdW5jdGlvbiBtaW5sZW5ndGhcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWlubGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1JTl9MRU5HVEhcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCksXG4gICAge1xuICAgICAgW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdOiB2YWx1ZSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtYXhpbXVtIGxlbmd0aCBmb3IgdGhlIHByb3BlcnR5XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI01BWF9MRU5HVEh9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNNQVhfTEVOR1RIfVxuICpcbiAqIEBmdW5jdGlvbiBtYXhsZW5ndGhcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4bGVuZ3RoKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLk1BWF9MRU5HVEhcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCksXG4gICAge1xuICAgICAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiB2YWx1ZSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB0eXBlczogW1N0cmluZy5uYW1lLCBBcnJheS5uYW1lLCBTZXQubmFtZV0sXG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBSZWdFeHAgcGF0dGVybiB0aGUgcHJvcGVydHkgbXVzdCByZXNwZWN0XG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBVFRFUk59XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVRURVJOfVxuICpcbiAqIEBmdW5jdGlvbiBwYXR0ZXJuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHZhbHVlOiBSZWdFeHAgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFUVEVSTlxuKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVRURVJOKSxcbiAgICB7XG4gICAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gZW1haWxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjRU1BSUx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGZ1bmN0aW9uIGVtYWlsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRU1BSUwpIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVNQUlMKSxcbiAgICB7XG4gICAgICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl06IERFRkFVTFRfUEFUVEVSTlMuRU1BSUwsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVVJMKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5VUkwpLCB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLlVSTCxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBFbmZvcmNlcyB0eXBlIHZlcmlmaWNhdGlvblxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNUWVBFfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmd9IHR5cGVzIGFjY2VwdGVkIHR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNUWVBFfVxuICpcbiAqIEBmdW5jdGlvbiB0eXBlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGUoXG4gIHR5cGVzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFXG4pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlRZUEUpLCB7XG4gICAgY3VzdG9tVHlwZXM6IHR5cGVzLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERhdGUgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjREFURX1cbiAqXG4gKiBXaWxsIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGZvcm1hdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgYWNjZXB0ZWQgZm9ybWF0IGFjY29yZGluZyB0byB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RBVEV9XG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFZhbGlkYXRvcj59IFt2YWxpZGF0b3JdIHRoZSBWYWxpZGF0b3IgdG8gYmUgdXNlZC4gRGVmYXVsdHMgdG8ge0BsaW5rIERhdGVWYWxpZGF0b3J9XG4gKlxuICogQGZ1bmN0aW9uIGRhdGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGUoXG4gIGZvcm1hdDogc3RyaW5nID0gXCJkZC9NTS95eXl5XCIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREFURVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcm9wZXJ0eUtleT86IGFueSk6IGFueSA9PiB7XG4gICAgcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkRBVEUpLCB7XG4gICAgICBbVmFsaWRhdGlvbktleXMuRk9STUFUXTogZm9ybWF0LFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIHR5cGVzOiBbRGF0ZS5uYW1lXSxcbiAgICB9KSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHNldCh0aGlzOiBhbnksIG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKVxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHZhbHVlcy5nZXQodGhpcyksXG4gICAgICAgICAgICBzZXQ6IChuZXdWYWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlRGF0ZShmb3JtYXQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIHZhbCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2YoXCJGYWlsZWQgdG8gcGFyc2UgZGF0ZTogezB9XCIsIGUubWVzc2FnZSB8fCBlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXNbcHJvcGVydHlLZXldID0gbmV3VmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImhlcmVcIik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFBhc3N3b3JkIEhhbmRsZXIgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1BBU1NXT1JEfVxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSBbcGF0dGVybl0gZGVmYXVsdHMgdG8ge0BsaW5rIFBhc3N3b3JkUGF0dGVybnMjQ0hBUjhfT05FX09GX0VBQ0h9XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNQQVNTV09SRH1cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VmFsaWRhdG9yPn0gW3ZhbGlkYXRvcl0gRGVmYXVsdHMgdG8ge0BsaW5rIFBhc3N3b3JkVmFsaWRhdG9yfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFzc3dvcmQoXG4gIHBhdHRlcm46IFJlZ0V4cCA9IERFRkFVTFRfUEFUVEVSTlMuUEFTU1dPUkQuQ0hBUjhfT05FX09GX0VBQ0gsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUEFTU1dPUkRcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKSwge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogcGF0dGVybixcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWVdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBMaXN0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIEFsc28gc2V0cyB0aGUge0BsaW5rIHR5cGV9IHRvIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xsZWN0aW9uXSBUaGUgY29sbGVjdGlvbiBiZWluZyB1c2VkLiBkZWZhdWx0cyB0byBBcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+fSBbdmFsaWRhdG9yXSBkZWZhdWx0cyB0byB7QGxpbmsgTGlzdFZhbGlkYXRvcn1cbiAqXG4gKiBAZnVuY3Rpb24gbGlzdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uRGVjb3JhdG9ycy5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdChcbiAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PiB8IE1vZGVsQ29uc3RydWN0b3I8YW55PltdLFxuICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1Rcbikge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxJU1QpLCB7XG4gICAgY2xheno6IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenoubWFwKChjKSA9PiBjLm5hbWUpIDogW2NsYXp6Lm5hbWVdLFxuICAgIHR5cGU6IGNvbGxlY3Rpb24sXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgU2V0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFdyYXBwZXIgZm9yIHtAbGluayBsaXN0fSB3aXRoIHRoZSAnU2V0JyBDb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+fSBbdmFsaWRhdG9yXVxuICpcbiAqIEBmdW5jdGlvbiBzZXRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLkRlY29yYXRvcnMuVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldChcbiAgY2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgcmV0dXJuIGxpc3QoY2xhenosIFwiU2V0XCIsIG1lc3NhZ2UpO1xufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhlbHBlciBGdW5jdGlvbiB0byBvdmVycmlkZSBjb25zdHJ1Y3RvcnNcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdXG4gKiBAcmV0dXJuIHtUfSB0aGUgbmV3IGluc3RhbmNlXG4gKlxuICogQGZ1bmN0aW9uIGNvbnN0cnVjdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Db25zdHJ1Y3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdDxUIGV4dGVuZHMgTW9kZWw+KFxuICBjb25zdHJ1Y3RvcjogYW55LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogVCB7XG4gIGNvbnN0IF9jb25zdHIgPSAoLi4uYXJnejogYW55W10pID0+IG5ldyBjb25zdHJ1Y3RvciguLi5hcmd6KTtcbiAgX2NvbnN0ci5wcm90b3R5cGUgPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBfY29uc3RyKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlY3Vyc2l2ZWx5IGZpbmRzIHRoZSBsYXN0IHByb3RvdHlwZSBiZWZvcmUgT2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKlxuICogQGZ1bmN0aW9uIGZpbmRMYXN0UHJvdG9CZWZvcmVPYmplY3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uQ29uc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFByb3RvQmVmb3JlT2JqZWN0KG9iajogb2JqZWN0KTogb2JqZWN0IHtcbiAgbGV0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBvYmo7XG4gIHdoaWxlIChwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAocHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlKSByZXR1cm4gcHJvdG90eXBlO1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHByb3RvdHlwZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwcm9wZXIgcHJvdG90eXBlXCIpO1xufVxuXG4vKipcbiAqIEBzdW1hcnkgYmluZHMgdGhlIHtAbGluayBNb2RlbH0gY2xhc3MgYXMgYSByb290IHByb3RvdHlwZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9ialxuICpcbiAqIEBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uQ29uc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kTW9kZWxQcm90b3R5cGUob2JqOiB1bmtub3duKSB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBNb2RlbCkgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGJpbmRQcm90b3R5cGUob2JqVG9PdmVycmlkZTogdW5rbm93biwgcHJvdG90eXBlOiBvYmplY3QpIHtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqVG9PdmVycmlkZSwgcHJvdG90eXBlKTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZTogYW55ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gYmluZFByb3RvdHlwZShvYmosIE1vZGVsLnByb3RvdHlwZSk7XG4gIH1cbiAgd2hpbGUgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGNvbnN0IHByb3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICBpZiAoXG4gICAgICBwcm90ID09PSBPYmplY3QucHJvdG90eXBlIHx8XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIHJldHVybiBiaW5kUHJvdG90eXBlKHByb3RvdHlwZSwgTW9kZWwucHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgcHJvcGVyIHByb3RvdHlwZSB0byBiaW5kXCIpO1xufVxuIiwiaW1wb3J0IHsgYmluZE1vZGVsUHJvdG90eXBlLCBjb25zdHJ1Y3QgfSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyB0aGUgdHBlIG9zIGFuIEluc3RhbmNlQ2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlQ2FsbGJhY2sgPSAoaW5zdGFuY2U6IGFueSwgLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGEgTW9kZWwgY2xhc3NcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIC0gUmVnaXN0ZXJzIHRoZSBjbGFzcyB1bmRlciB0aGUgbW9kZWwgcmVnaXN0cnkgc28gaXQgY2FuIGJlIGVhc2lseSByZWJ1aWx0O1xuICogLSBPdmVycmlkZXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yO1xuICogLSBSdW5zIHRoZSBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufSBpZiBkZWZpbmVkO1xuICogLSBSdW5zIHRoZSBvcHRpb25hbCB7QGxpbmsgSW5zdGFuY2VDYWxsYmFja30gaWYgcHJvdmlkZWQ7XG4gKlxuICogQHBhcmFtIHtJbnN0YW5jZUNhbGxiYWNrfSBbaW5zdGFuY2VDYWxsYmFja10gb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpbnN0YW5jZSB1cG9uIGluc3RhbnRpYXRpb24uIGRlZmF1bHRzIHRvIHVuZGVmaW5lZFxuICpcbiAqIEBmdW5jdGlvbiBtb2RlbFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uTW9kZWxcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbChpbnN0YW5jZUNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjaykge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55KSA9PiB7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZTogUmV0dXJuVHlwZTx0eXBlb2Ygb3JpZ2luYWw+ID0gY29uc3RydWN0KFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICAgIGJpbmRNb2RlbFByb3RvdHlwZShpbnN0YW5jZSk7XG4gICAgICAvLyBydW4gYSBidWlsZGVyIGZ1bmN0aW9uIGlmIGRlZmluZWQgd2l0aCB0aGUgZmlyc3QgYXJndW1lbnQgKFRoZSBNb2RlbEFyZylcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBNb2RlbC5nZXRCdWlsZGVyKCk7XG4gICAgICBpZiAoYnVpbGRlcikgYnVpbGRlcihpbnN0YW5jZSwgYXJncy5sZW5ndGggPyBhcmdzWzBdIDogdW5kZWZpbmVkKTtcblxuICAgICAgbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5NT0RFTCksIG9yaWdpbmFsLm5hbWUpKGluc3RhbmNlLmNvbnN0cnVjdG9yKTtcblxuICAgICAgaWYgKGluc3RhbmNlQ2FsbGJhY2spIGluc3RhbmNlQ2FsbGJhY2soaW5zdGFuY2UsIC4uLmFyZ3MpO1xuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBtZXRhZGF0YShNb2RlbC5rZXkoTW9kZWxLZXlzLk1PREVMKSwgb3JpZ2luYWwubmFtZSkob3JpZ2luYWwpO1xuXG4gICAgTW9kZWwucmVnaXN0ZXIobmV3Q29uc3RydWN0b3IsIG9yaWdpbmFsLm5hbWUpO1xuXG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH0pIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hlZEJ5KGFsZ29yaXRobTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gbWV0YWRhdGEoTW9kZWwua2V5KE1vZGVsS2V5cy5IQVNISU5HKSwge1xuICAgIGFsZ29yaXRobTogYWxnb3JpdGhtLFxuICAgIGFyZ3M6IGFyZ3MsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplZEJ5KHNlcmlhbGl6ZXI6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIG1ldGFkYXRhKE1vZGVsLmtleShNb2RlbEtleXMuU0VSSUFMSVpBVElPTiksIHtcbiAgICBzZXJpYWxpemVyOiBzZXJpYWxpemVyLFxuICAgIGFyZ3M6IGFyZ3MsXG4gIH0pO1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBNb2RlbCBkZWZpbml0aW9uIGZ1bmN0aW9uYWxpdHlcbiAqIEBkZXNjcmlwdGlvbiBkZWZpbmVzIHRoZSBiYXNlIGNsYXNzIGFuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBAbmFtZXNwYWNlIE1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBIb2xkcyBhbGwgdGhlIHN1cHBvcnRlZCBkZWNvcmF0b3JzXG4gKiBAbmFtZXNwYWNlIERlY29yYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IFZhbGlkYXRpb24gcmVsYXRlZCBmdW5jdGlvbmFsaXR5XG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgTW9kZWwgdmFsaWRhdGlvbiBhcGlzIGFuZCBiYXNlIGNsYXNzZXMgZm9yIHZhbGlkYXRvcnNcbiAqXG4gKiBAbmFtZXNwYWNlIFZhbGlkYXRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgRGF0ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgSGFzaGluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5cbi8qKlxuICogQG5hbWVzcGFjZSBTZXJpYWxpemF0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAbmFtZXNwYWNlIEZvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7OztBQWFHO0lBQ1M7QUFBWixDQUFBLFVBQVksU0FBUyxFQUFBO0FBQ25CLElBQUEsU0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLGNBQXdCO0FBQ3hCLElBQUEsU0FBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLGFBQW9CO0FBQ3BCLElBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLG1CQUE0QjtBQUM1QixJQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxtQkFBNEI7QUFDNUIsSUFBQSxTQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtBQUNmLElBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFNBQWtCO0FBQ2xCLElBQUEsU0FBQSxDQUFBLGNBQUEsQ0FBQSxHQUFBLGdCQUErQjtBQUMvQixJQUFBLFNBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxjQUEwQjtBQUMxQixJ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QU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtBQUN6QixTQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUM1QixTQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtBQUM5QixTQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtBQUM5QixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtBQUNuQyxTQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRTtBQUUzQixTQUFBLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSTtBQUNwQixTQUFBLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRztBQUNsQixTQUFBLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSTtBQUNwQixTQUFBLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtBQUNoQixTQUFBLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0lBQ3RCLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDbEMsUUFBQSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7O1NBQzVEO0FBQ0wsUUFBQSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFB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
|