nextlove 2.15.0 → 2.16.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/generators/index.js +33 -10
- package/dist/generators/index.mjs +33 -10
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -145,6 +145,24 @@ function testFrontMatter(string) {
|
|
|
145
145
|
|
|
146
146
|
// src/generators/lib/zod-openapi.ts
|
|
147
147
|
import dedent from "dedent";
|
|
148
|
+
|
|
149
|
+
// src/generators/utils/prefix-object-keys-with-x.ts
|
|
150
|
+
init_esm_shims();
|
|
151
|
+
function prefixObjectKeysWithX(obj) {
|
|
152
|
+
return Object.fromEntries(
|
|
153
|
+
Object.entries(obj).map(([key, value]) => [`x-${key}`, value])
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/generators/utils/dashify-object-keys.ts
|
|
158
|
+
init_esm_shims();
|
|
159
|
+
function dashifyObjectKeys(obj) {
|
|
160
|
+
return Object.fromEntries(
|
|
161
|
+
Object.entries(obj).map(([key, value]) => [key.replace(/_/g, "-"), value])
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// src/generators/lib/zod-openapi.ts
|
|
148
166
|
function iterateZodObject({
|
|
149
167
|
zodRef,
|
|
150
168
|
useOutput,
|
|
@@ -173,9 +191,11 @@ function parseDescription(zodRef) {
|
|
|
173
191
|
if ("deprecated" in attributes && attributes.deprecated) {
|
|
174
192
|
output.deprecated = true;
|
|
175
193
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
194
|
+
Object.entries(
|
|
195
|
+
prefixObjectKeysWithX(dashifyObjectKeys(attributes))
|
|
196
|
+
).forEach(([key, value]) => {
|
|
197
|
+
output[key] = value;
|
|
198
|
+
});
|
|
179
199
|
}
|
|
180
200
|
return output;
|
|
181
201
|
}
|
|
@@ -326,7 +346,7 @@ function parseObject({
|
|
|
326
346
|
...additionalProperties,
|
|
327
347
|
...hideDefinitions
|
|
328
348
|
},
|
|
329
|
-
zodRef
|
|
349
|
+
parseDescription(zodRef),
|
|
330
350
|
...schemas
|
|
331
351
|
);
|
|
332
352
|
}
|
|
@@ -757,7 +777,7 @@ function pascalCase(input) {
|
|
|
757
777
|
return pascalCaseString;
|
|
758
778
|
}
|
|
759
779
|
async function generateOpenAPI(opts) {
|
|
760
|
-
var _a, _b, _c, _d;
|
|
780
|
+
var _a, _b, _c, _d, _e;
|
|
761
781
|
const chalk = (await Promise.resolve().then(() => __toESM(__require("../source-XAJDITG2.mjs")))).default;
|
|
762
782
|
const { outputFile, tags = [] } = opts;
|
|
763
783
|
const filepathToRouteFn = await parseRoutesInPackage(opts);
|
|
@@ -859,20 +879,23 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
859
879
|
continue;
|
|
860
880
|
}
|
|
861
881
|
let description = routeSpec.description;
|
|
862
|
-
let
|
|
882
|
+
let descriptionMetadata = {};
|
|
863
883
|
if (description) {
|
|
864
884
|
const trimmedDescription = dedent2(description).trim();
|
|
865
885
|
if (testFrontMatter(trimmedDescription)) {
|
|
866
886
|
const { attributes, body } = parseFrontMatter(trimmedDescription);
|
|
867
|
-
|
|
887
|
+
descriptionMetadata = attributes;
|
|
868
888
|
description = body.trim();
|
|
869
889
|
} else {
|
|
870
890
|
description = trimmedDescription;
|
|
871
891
|
}
|
|
872
892
|
}
|
|
893
|
+
const formattedDescriptionMetadata = prefixObjectKeysWithX(
|
|
894
|
+
dashifyObjectKeys(descriptionMetadata)
|
|
895
|
+
);
|
|
873
896
|
const route = {
|
|
874
897
|
...routeSpec.openApiMetadata,
|
|
875
|
-
...
|
|
898
|
+
...formattedDescriptionMetadata,
|
|
876
899
|
summary: routePath,
|
|
877
900
|
...description && { description },
|
|
878
901
|
responses: {
|
|
@@ -947,7 +970,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
947
970
|
const methodsMappedToFernSdkMetadata = await mapMethodsToFernSdkMetadata({
|
|
948
971
|
methods,
|
|
949
972
|
path: routePath,
|
|
950
|
-
sdkReturnValue: routeSpec.sdkReturnValue
|
|
973
|
+
sdkReturnValue: (_e = descriptionMetadata == null ? void 0 : descriptionMetadata.response_key) != null ? _e : routeSpec.sdkReturnValue
|
|
951
974
|
});
|
|
952
975
|
builder.addPath(routePath, {
|
|
953
976
|
...methods.map((method) => ({
|
|
@@ -1548,4 +1571,4 @@ export {
|
|
|
1548
1571
|
generateOpenAPI,
|
|
1549
1572
|
generateRouteTypes
|
|
1550
1573
|
};
|
|
1551
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9mZXJuLXNkay11dGlscy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1yb3V0ZS10eXBlcy9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLXRvLXRzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1vcGVuYXBpXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRlLXJvdXRlLXR5cGVzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzXCJcbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHtcbiAgT3BlbkFwaUJ1aWxkZXIsXG4gIE9wZXJhdGlvbk9iamVjdCxcbiAgUGFyYW1ldGVyT2JqZWN0LFxufSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSBcIi4uL2xpYi96b2Qtb3BlbmFwaVwiXG5pbXBvcnQgeyBlbWJlZFNjaGVtYVJlZmVyZW5jZXMgfSBmcm9tIFwiLi9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlc1wiXG5pbXBvcnQgeyBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEgfSBmcm9tIFwiLi9mZXJuLXNkay11dGlsc1wiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi4vbGliL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLnNvbWUoKG1ldGhvZCkgPT5cbiAgICAgIHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICApXG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG5cbiAgICAvLyBoYW5kbGUgYm9keVxuICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBxdWVyeVxuICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUxFVEUgYW5kIEdFVCBjYW5ub3QgaGF2ZSBhIGJvZHlcbiAgICBsZXQgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJERUxFVEVcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJERUxFVEVcIilcbiAgICB9XG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJHRVRcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJHRVRcIilcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgYWRkaXRpb25hbE1ldGFkYXRhID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGFkZGl0aW9uYWxNZXRhZGF0YSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0cmltbWVkRGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgLi4ucm91dGVTcGVjLm9wZW5BcGlNZXRhZGF0YSxcbiAgICAgIC4uLmFkZGl0aW9uYWxNZXRhZGF0YSxcbiAgICAgIHN1bW1hcnk6IHJvdXRlUGF0aCxcbiAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9LXCIsXG4gICAgICAgIH0sXG4gICAgICAgIDQwMDoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIDQwMToge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlY3VyaXR5OiBBcnJheS5pc0FycmF5KHJvdXRlU3BlYy5hdXRoKVxuICAgICAgICA/IHJvdXRlU3BlYy5hdXRoXG4gICAgICAgICAgICAubWFwKChhdXRoVHlwZSkgPT4gc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aFR5cGVdKVxuICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICA6IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW3JvdXRlU3BlYy5hdXRoXSxcbiAgICB9XG5cbiAgICBpZiAoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIHJvdXRlLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgIHNjaGVtYTogZ2VuZXJhdGVTY2hlbWEoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpXG4gICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyT2JqZWN0W10gPSBPYmplY3Qua2V5cyhcbiAgICAgICAgICBzY2hlbWEucHJvcGVydGllcyBhcyBhbnlcbiAgICAgICAgKS5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGluOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICBzY2hlbWE6IHNjaGVtYS5wcm9wZXJ0aWVzIVtuYW1lXSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKG5hbWUpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByb3V0ZS5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsganNvblJlc3BvbnNlIH0gPSByb3V0ZVNwZWNcbiAgICBjb25zdCB7IGFkZE9rU3RhdHVzID0gdHJ1ZSB9ID0gc2V0dXBQYXJhbXNcblxuICAgIGlmIChqc29uUmVzcG9uc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmIHx8XG4gICAgICAgICFqc29uUmVzcG9uc2UuX2RlZi50eXBlTmFtZSB8fFxuICAgICAgICBqc29uUmVzcG9uc2UuX2RlZi50eXBlTmFtZSAhPT0gXCJab2RPYmplY3RcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICBgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzIG5vdCBhIFpvZE9iamVjdC5gXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlU2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoXG4gICAgICAgIGFkZE9rU3RhdHVzICYmIGpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgPyBqc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pXG4gICAgICAgICAgOiBqc29uUmVzcG9uc2VcbiAgICAgIClcblxuICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXMoXG4gICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICBnbG9iYWxTY2hlbWFzXG4gICAgICApXG5cbiAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBub3QgaGFyZGNvZGUgMjAwIGhlcmVcbiAgICAgIHJvdXRlLnJlc3BvbnNlc1syMDBdLmNvbnRlbnQgPSB7XG4gICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3V0ZS50YWdzID0gW11cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICByb3V0ZS50YWdzLnB1c2godGFnLm5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhID0gYXdhaXQgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgICAgIG1ldGhvZHMsXG4gICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICBzZGtSZXR1cm5WYWx1ZTogcm91dGVTcGVjLnNka1JldHVyblZhbHVlLFxuICAgIH0pXG5cbiAgICAvLyBTb21lIHJvdXRlcyBhY2NlcHQgbXVsdGlwbGUgbWV0aG9kc1xuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIHtcbiAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgLm1hcCgobWV0aG9kKSA9PiAoe1xuICAgICAgICAgIFttZXRob2QudG9Mb3dlckNhc2UoKV06IHtcbiAgICAgICAgICAgIC4uLm1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdLFxuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgICAucmVkdWNlUmlnaHQoKGFjYywgY3VyKSA9PiAoeyAuLi5hY2MsIC4uLmN1ciB9KSwge30pLFxuICAgIH0pXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCBnbG9iYnkgPSAoYXdhaXQgaW1wb3J0KFwiZ2xvYmJ5XCIpKS5nbG9iYnlcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcm91dGVGbi5fcm91dGVTcGVjPy5leGNsdWRlRnJvbU9wZW5BcGkgJiZcbiAgICAgICAgICAhb3B0cy5pbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JheShcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZCBmcm9tIE9wZW5BUEkgZ2VuZXJhdGlvblwiYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgIi8qKlxuICogWm9kIE9wZW5BUEkgR2VuZXJhdG9yLlxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuYXRpbmUvem9kLXBsdWdpbnNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBCcmlhbiBNY0JyaWRlXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU9iamVjdCwgU2NoZW1hT2JqZWN0VHlwZSB9IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5pbXBvcnQgbWVyZ2UgZnJvbSBcInRzLWRlZXBtZXJnZVwiXG5pbXBvcnQgeyBBbnlab2RPYmplY3QsIHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuXG50eXBlIEFuYXRpbmVTY2hlbWFPYmplY3QgPSBTY2hlbWFPYmplY3QgJiB7IGhpZGVEZWZpbml0aW9ucz86IHN0cmluZ1tdIH1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpWm9kQW55IGV4dGVuZHMgWm9kVHlwZUFueSB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVpvZEFueU9iamVjdCBleHRlbmRzIEFueVpvZE9iamVjdCB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgUGFyc2luZ0FyZ3M8VD4ge1xuICB6b2RSZWY6IFRcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbiAgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEFwaTxUIGV4dGVuZHMgT3BlbkFwaVpvZEFueT4oXG4gIHNjaGVtYTogVCxcbiAgc2NoZW1hT2JqZWN0OiBBbmF0aW5lU2NoZW1hT2JqZWN0ID0ge31cbik6IFQge1xuICBzY2hlbWEubWV0YU9wZW5BcGkgPSBPYmplY3QuYXNzaWduKHNjaGVtYS5tZXRhT3BlbkFwaSB8fCB7fSwgc2NoZW1hT2JqZWN0KVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVab2RPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8T3BlbkFwaVpvZEFueU9iamVjdD4pIHtcbiAgY29uc3QgcmVkdWNlZCA9IE9iamVjdC5rZXlzKHpvZFJlZi5zaGFwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+IGhpZGVEZWZpbml0aW9ucz8uaW5jbHVkZXMoa2V5KSA9PT0gZmFsc2UpXG4gICAgLnJlZHVjZShcbiAgICAgIChjYXJyeSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5jYXJyeSxcbiAgICAgICAgW2tleV06IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5zaGFwZVtrZXldLCB1c2VPdXRwdXQpLFxuICAgICAgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWFPYmplY3Q+XG4gICAgKVxuXG4gIHJldHVybiByZWR1Y2VkXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmOiBPcGVuQXBpWm9kQW55KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKCF6b2RSZWYuZGVzY3JpcHRpb24pIHJldHVybiB7fVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoem9kUmVmLmRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKVxuICAgIHJldHVybiB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmIChib2R5LnRyaW0oKSkgb3V0cHV0LmRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgb3V0cHV0W2B4LSR7a2V5fWBdID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybWF0aW9uKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFRyYW5zZm9ybWVyPG5ldmVyPiB8IHouWm9kRWZmZWN0czxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgaW5wdXQgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5zY2hlbWEsIHVzZU91dHB1dClcblxuICBsZXQgb3V0cHV0ID0gXCJ1bmRlZmluZWRcIlxuICBpZiAodXNlT3V0cHV0ICYmIHpvZFJlZi5fZGVmLmVmZmVjdCkge1xuICAgIGNvbnN0IGVmZmVjdCA9XG4gICAgICB6b2RSZWYuX2RlZi5lZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IHpvZFJlZi5fZGVmLmVmZmVjdCA6IG51bGxcbiAgICBpZiAoZWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gZWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgZWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICAuLi4oem9kUmVmLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi5pbnB1dCxcbiAgICAgIC4uLihbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJib29sZWFuXCIsIFwibnVsbFwiXS5pbmNsdWRlcyhvdXRwdXQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogb3V0cHV0IGFzIFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCIgfCBcIm51bGxcIixcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RTdHJpbmc+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXVpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiY3VpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJkYXRlLXRpbWVcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZWdleFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnBhdHRlcm4gPSBpdGVtLnJlZ2V4LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bWJlcj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBmb3JtYXQ6IFwiZmxvYXRcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4aW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gVE9ETzogb3B0aW9uIHRvIG1ha2UgdGhpcyBhbHdheXMgZXhwbGljaXQ/IChmYWxzZSBpbnN0ZWFkIG9mIG5vbi1leGlzdGVudClcbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbmltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS50eXBlID0gXCJpbnRlZ2VyXCJcbiAgICAgICAgZGVsZXRlIGJhc2VTY2hlbWEuZm9ybWF0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICBiYXNlU2NoZW1hLm11bHRpcGxlT2YgPSBpdGVtLnZhbHVlXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4Y2x1ZGVkRGVmaW5pdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpKSB7XG4gICAgICBleGNsdWRlZERlZmluaXRpb25zLnB1c2goLi4uc2NoZW1hLmhpZGVEZWZpbml0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhjbHVkZWREZWZpbml0aW9uc1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2RPYmplY3Q8bmV2ZXIsIFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCI+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3RbXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbD8uX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROZXZlclwiXG4gICAgKVxuICApXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5jYXRjaGFsbCwgdXNlT3V0cHV0KVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuXG4gIC8vIFNvIHRoYXQgYHVuZGVmaW5lZGAgdmFsdWVzIGRvbid0IGVuZCB1cCBpbiB0aGUgc2NoZW1hIGFuZCBiZSB3ZWlyZFxuICBhZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCA/IHsgYWRkaXRpb25hbFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgY29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoXG4gICAgKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVcbiAgKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgcHJvcGVydGllczogaXRlcmF0ZVpvZE9iamVjdCh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIE9wZW5BcGlab2RBbnlPYmplY3QsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgICAgaGlkZURlZmluaXRpb25zOiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShzY2hlbWFzKSxcbiAgICAgIH0pLFxuICAgICAgLi4ucmVxdWlyZWQsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAgIC4uLmhpZGVEZWZpbml0aW9ucyxcbiAgICB9LFxuICAgIHpvZFJlZi5kZXNjcmlwdGlvblxuICAgICAgPyB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24sIGhpZGVEZWZpbml0aW9ucyB9XG4gICAgICA6IHt9LFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWNvcmQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB6b2RSZWYuX2RlZi52YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi52YWx1ZVR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJpbnRlZ2VyXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImludDY0XCIgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9vbGVhbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQm9vbGVhbj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcImJvb2xlYW5cIiBhcyBTY2hlbWFPYmplY3RUeXBlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGUoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2REYXRlPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25hbCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RPcHRpb25hbDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsYWJsZSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsYWJsZTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dClcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkZWZhdWx0OiB6b2RSZWYuX2RlZi5kZWZhdWx0VmFsdWUoKSxcbiAgICAgIC4uLmdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RBcnJheTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb25zdHJhaW50czogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKHpvZFJlZi5fZGVmLm1pbkxlbmd0aCAhPSBudWxsKVxuICAgIGNvbnN0cmFpbnRzLm1pbkl0ZW1zID0gem9kUmVmLl9kZWYubWluTGVuZ3RoLnZhbHVlXG4gIGlmICh6b2RSZWYuX2RlZi5tYXhMZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5tYXhJdGVtcyA9IHpvZFJlZi5fZGVmLm1heExlbmd0aC52YWx1ZVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZExpdGVyYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB6b2RSZWYuX2RlZi52YWx1ZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgZW51bTogW3pvZFJlZi5fZGVmLnZhbHVlXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnVtKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RFbnVtPG5ldmVyPiB8IHouWm9kTmF0aXZlRW51bTxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcylbMF0gYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIsXG4gICAgICBlbnVtOiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcyksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGVBbnksIHouWm9kVHlwZUFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGFsbE9mOiBbXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmxlZnQsIHVzZU91dHB1dCksXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnJpZ2h0LCB1c2VPdXRwdXQpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RVbmlvbjxbei5ab2RUeXBlQW55LCAuLi56LlpvZFR5cGVBbnlbXV0+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnRlbnRzID0gem9kUmVmLl9kZWYub3B0aW9uc1xuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgY29udGVudC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZExpdGVyYWxcIixcbiAgICAgIHRydWVcbiAgICApXG4gICkge1xuICAgIC8vIHNwZWNpYWwgY2FzZSB0byB0cmFuc2Zvcm0gdW5pb25zIG9mIGxpdGVyYWxzIGludG8gZW51bXNcbiAgICBjb25zdCBsaXRlcmFscyA9IGNvbnRlbnRzIGFzIHVua25vd24gYXMgei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+W11cbiAgICBjb25zdCB0eXBlID0gbGl0ZXJhbHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+XG4gICAgICAgICFwcmV2IHx8IHByZXYgPT09IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA/IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBudWxsIGFzIG51bGwgfCBzdHJpbmdcbiAgICApXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGVudW06IGxpdGVyYWxzLm1hcCgobGl0ZXJhbCkgPT4gbGl0ZXJhbC5fZGVmLnZhbHVlKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgICAuLi5zY2hlbWFzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNOdWxsYWJsZSA9IGNvbnRlbnRzLnNvbWUoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROdWxsXCJcbiAgKVxuICBjb25zdCBub25OdWxsQ29udGVudHMgPSBjb250ZW50cy5maWx0ZXIoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBvbmVPZjogbm9uTnVsbENvbnRlbnRzLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgICAgLi4uKGlzTnVsbGFibGUgPyB7IG51bGxhYmxlOiB0cnVlIH0gOiB7fSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2REaXNjcmltaW5hdGVkVW5pb248c3RyaW5nLCB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W10+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGRpc2NyaW1pbmF0b3I6IHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiAoXG4gICAgICAgICAgem9kUmVmIGFzIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdXG4gICAgICAgICAgPlxuICAgICAgICApLl9kZWYuZGlzY3JpbWluYXRvcixcbiAgICAgIH0sXG4gICAgICBvbmVPZjogQXJyYXkuZnJvbShcbiAgICAgICAgKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLm9wdGlvbnMudmFsdWVzKClcbiAgICAgICkubWFwKChzY2hlbWEpID0+IGdlbmVyYXRlU2NoZW1hKHNjaGVtYSwgdXNlT3V0cHV0KSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTmV2ZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE5ldmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZSh7IHJlYWRPbmx5OiB0cnVlIH0sIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VCcmFuZGVkKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCcmFuZGVkPHouWm9kQW55LCBzdHJpbmc+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi50eXBlKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gY2F0Y2hBbGxQYXJzZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczxab2RUeXBlQW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGlwZWxpbmUoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUGlwZWxpbmU8bmV2ZXIsIG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBpZiAodXNlT3V0cHV0KSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLm91dCwgdXNlT3V0cHV0KVxuICB9XG4gIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbiwgdXNlT3V0cHV0KVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlYWRvbmx5KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlYWRvbmx5PHouWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW5uZXJUeXBlLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB6b2RSZWYuX2RlZi50eXBlTmFtZSBhcyBXb3JrZXJLZXlzXG4gICAgaWYgKHR5cGVOYW1lIGluIHdvcmtlck1hcCkge1xuICAgICAgcmV0dXJuIHdvcmtlck1hcFt0eXBlTmFtZV0oe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBuZXZlcixcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH1cbn1cbiIsICIvKipcbiAqIEZyb250LU1hdHRlclxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p4c29uL2Zyb250LW1hdHRlclxuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSBKYXNvbiBDYW1wYmVsbCAoXCJBdXRob3JcIilcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IGxvYWQgfSBmcm9tIFwianMteWFtbFwiXG5jb25zdCBvcHRpb25hbEJ5dGVPcmRlck1hcmsgPSBcIlxcXFx1ZmVmZj9cIlxuY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiA/IHByb2Nlc3MucGxhdGZvcm0gOiBcIlwiXG5jb25zdCBwYXR0ZXJuID1cbiAgXCJeKFwiICtcbiAgb3B0aW9uYWxCeXRlT3JkZXJNYXJrICtcbiAgXCIoPSB5YW1sID18LS0tKVwiICtcbiAgXCIkKFtcXFxcc1xcXFxTXSo/KVwiICtcbiAgXCJeKD86XFxcXDJ8XFxcXC5cXFxcLlxcXFwuKVxcXFxzKlwiICtcbiAgXCIkXCIgK1xuICAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwiXFxcXHI/XCIgOiBcIlwiKSArXG4gIFwiKD86XFxcXG4pPylcIlxuLy8gTk9URTogSWYgdGhpcyBwYXR0ZXJuIHVzZXMgdGhlICdnJyBmbGFnIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGRlZmluaXRpb24gd2lsbFxuLy8gbmVlZCB0byBiZSBtb3ZlZCBkb3duIGludG8gdGhlIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbmNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcIm1cIilcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zID0ge31cbik6IHsgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGJvZHk6IHN0cmluZzsgYm9keUJlZ2luOiBudW1iZXIgfSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHsgYWxsb3dVbnNhZmU6IGZhbHNlIH1cbiAgb3B0aW9ucyA9XG4gICAgb3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgPyB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH1cbiAgICAgIDogZGVmYXVsdE9wdGlvbnNcbiAgdmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KC8oXFxyP1xcbikvKVxuICBpZiAobGluZXNbMF0gJiYgLz0geWFtbCA9fC0tLS8udGVzdChsaW5lc1swXSkpIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyaW5nKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUxvY2F0aW9uKG1hdGNoOiBSZWdFeHBFeGVjQXJyYXksIGJvZHk6IHN0cmluZykge1xuICB2YXIgbGluZSA9IDFcbiAgdmFyIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiKVxuICB2YXIgb2Zmc2V0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcblxuICB3aGlsZSAocG9zICE9PSAtMSkge1xuICAgIGlmIChwb3MgPj0gb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBsaW5lKytcbiAgICBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIiwgcG9zICsgMSlcbiAgfVxuXG4gIHJldHVybiBsaW5lXG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cmluZzogc3RyaW5nKToge1xuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBib2R5OiBzdHJpbmdcbiAgYm9keUJlZ2luOiBudW1iZXJcbn0ge1xuICB2YXIgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cblxuICB2YXIgeWFtbCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpXG4gIHZhciBhdHRyaWJ1dGVzID0gKGxvYWQoeWFtbCkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHZhciBib2R5ID0gc3RyaW5nLnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpXG4gIHZhciBsaW5lID0gY29tcHV0ZUxvY2F0aW9uKG1hdGNoLCBzdHJpbmcpXG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGJvZHk6IGJvZHksXG4gICAgYm9keUJlZ2luOiBsaW5lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RnJvbnRNYXR0ZXIoc3RyaW5nOiBzdHJpbmcpIHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcblxuICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmcpXG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kRWZmZWN0cywgWm9kT3B0aW9uYWwgfSBmcm9tIFwiem9kXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3V0ZVR5cGVzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBBcnJheS5mcm9tKGZpbGVwYXRoVG9Sb3V0ZS5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+XG4gICAgYVsxXS5yb3V0ZS5sb2NhbGVDb21wYXJlKGJbMV0ucm91dGUpXG4gIClcbiAgY29uc3QgZmlsdGVyZWRSb3V0ZXMgPSBzb3J0ZWRSb3V0ZXMuZmlsdGVyKFxuICAgIChbXywgeyByb3V0ZSB9XSkgPT4gIW9wdHMuZmlsdGVyUm91dGVzIHx8IG9wdHMuZmlsdGVyUm91dGVzKHJvdXRlKVxuICApXG5cbiAgLy8gVE9ETyB3aGVuIGxlc3MgbGF6eSwgdXNlIHRzLW1vcnBoIGZvciBiZXR0ZXIgZ2VuZXJhdGlvblxuICBjb25zdCByb3V0ZURlZnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBbXywgeyByb3V0ZSwgcm91dGVTcGVjLCBzZXR1cFBhcmFtcyB9XSBvZiBmaWx0ZXJlZFJvdXRlcykge1xuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlU3BlYy5xdWVyeVBhcmFtcz8uc2hhcGUgPz8ge30pXG4gICAgY29uc3QgcGF0aFBhcmFtZXRlcnMgPSBxdWVyeUtleXMuZmlsdGVyKChrZXkpID0+IHJvdXRlLmluY2x1ZGVzKGBbJHtrZXl9XWApKVxuXG4gICAgLy8gcXVlcnlQYXJhbXMgbWlnaHQgYmUgYSBab2RFZmZlY3RzIG9yIFpvZE9wdGlvbmFsIGluIHNvbWUgY2FzZXNcbiAgICBsZXQgcXVlcnlQYXJhbXMgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB3aGlsZSAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zIHx8IFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpXG4gICAgKSB7XG4gICAgICBpZiAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RFZmZlY3RzPGFueT4pLnNvdXJjZVR5cGUoKVxuICAgICAgfSBlbHNlIGlmIChcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kT3B0aW9uYWw8YW55PikudW53cmFwKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvKipcbiAqIFpvZCBUbyBUU1xuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhY2hpbnJhamEvem9kLXRvLXRzXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2FjaGluIFJhamFcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5pbXBvcnQgeyBab2RUeXBlLCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG50eXBlIEdldFR5cGUgPSB7IF9kZWY6IHsgZ2V0VHlwZT86IEdldFR5cGVGdW5jdGlvbiB9IH1cblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGVTY2hlbWEgPSB6b2QgYXMgR2V0VHlwZVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSlcbiAgICB0eXBlID0gZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSB6b2QuX2RlZi50eXBlTmFtZVxuXG4gIGNvbnN0IGdldFR5cGVUeXBlID0gY2FsbEdldFR5cGUoem9kLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICAvLyBzcGVjaWFsIGNhc2UgbmF0aXZlIGVudW0sIHdoaWNoIG5lZWRzIGFuIGlkZW50aWZpZXIgbm9kZVxuICBpZiAoZ2V0VHlwZVR5cGUgJiYgdHlwZU5hbWUgIT09IFwiWm9kTmF0aXZlRW51bVwiKSB7XG4gICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZShnZXRUeXBlVHlwZSlcbiAgfVxuXG4gIGNvbnN0IG90aGVyQXJndW1lbnRzID0gW2lkZW50aWZpZXIsIHN0b3JlLCBvcHRpb25zXSBhcyBjb25zdFxuXG4gIHN3aXRjaCAodHlwZU5hbWUpIHtcbiAgICBjYXNlIFwiWm9kU3RyaW5nXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdW1iZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJpZ0ludFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5CaWdJbnRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQm9vbGVhblwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZERhdGVcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiRGF0ZVwiKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVuZGVmaW5lZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVsbFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpXG4gICAgfVxuICAgIGNhc2UgXCJab2RWb2lkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlZvaWRLZXl3b3JkKSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuICAgIGNhc2UgXCJab2RBbnlcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVua25vd25cIjoge1xuICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROZXZlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OZXZlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RMYXp5XCI6IHtcbiAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxhenkgdmFsdWUgaXMgcmVmZXJyaW5nIHRvXG4gICAgICAvLyBzbyB3ZSBmb3JjZSB0aGUgdXNlciB0byBkZWNsYXJlIGl0XG4gICAgICBpZiAoIWdldFR5cGVUeXBlKSByZXR1cm4gY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcoaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgXCJab2RMaXRlcmFsXCI6IHtcbiAgICAgIC8vIHoubGl0ZXJhbCgnaGknKSAtPiAnaGknXG4gICAgICBsZXQgbGl0ZXJhbDogdHMuTGl0ZXJhbEV4cHJlc3Npb24gfCB0cy5Cb29sZWFuTGl0ZXJhbFxuXG4gICAgICBjb25zdCBsaXRlcmFsVmFsdWUgPSB6b2QuX2RlZi52YWx1ZSBhcyBMaXRlcmFsVHlwZVxuICAgICAgc3dpdGNoICh0eXBlb2YgbGl0ZXJhbFZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbFZhbHVlID09PSB0cnVlID8gZi5jcmVhdGVUcnVlKCkgOiBmLmNyZWF0ZUZhbHNlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShsaXRlcmFsKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kT2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyh6b2QuX2RlZi5zaGFwZSgpKVxuXG4gICAgICBjb25zdCBtZW1iZXJzOiB0cy5UeXBlRWxlbWVudFtdID0gcHJvcGVydGllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0Wm9kTm9kZSA9IHZhbHVlIGFzIFpvZFR5cGVBbnlcbiAgICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKG5leHRab2ROb2RlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICBjb25zdCB7IHR5cGVOYW1lOiBuZXh0Wm9kTm9kZVR5cGVOYW1lIH0gPSBuZXh0Wm9kTm9kZS5fZGVmXG4gICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPVxuICAgICAgICAgIG5leHRab2ROb2RlVHlwZU5hbWUgPT09IFwiWm9kT3B0aW9uYWxcIiB8fCBuZXh0Wm9kTm9kZS5pc09wdGlvbmFsKClcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eVNpZ25hdHVyZSA9IGYuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSxcbiAgICAgICAgICBpc09wdGlvbmFsID8gZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIGFkZEpzRG9jQ29tbWVudChwcm9wZXJ0eVNpZ25hdHVyZSwgbmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydHlTaWduYXR1cmVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUobWVtYmVycylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kQXJyYXlcIjoge1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYudmFsdWVzLm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IHpvZC5fZGVmLm9wdGlvbnNcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSBbLi4uem9kLl9kZWYub3B0aW9ucy52YWx1ZXMoKV1cbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5zY2hlbWEsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyh6b2QuX2RlZi52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB6b2QuX2RlZi52YWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuICAgICAgICApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKVxuICAgICAgICAgICAgICA6IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSlcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUVudW1NZW1iZXIoZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLCBsaXRlcmFsKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBzdG9yZS5uYXRpdmVFbnVtcy5wdXNoKFxuICAgICAgICAgICAgZi5jcmVhdGVFbnVtRGVjbGFyYXRpb24odW5kZWZpbmVkLCB0eXBlLCBlbnVtTWVtYmVycylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldFR5cGUgb24gbmF0aXZlRW51bSBtdXN0IHJldHVybiBhbiBpZGVudGlmaWVyIHdoZW4gbmF0aXZlRW51bXMgaXMgXCJyZXNvbHZlXCInXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kT3B0aW9uYWxcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYuaXRlbXMubWFwKChvcHRpb246IFpvZFR5cGVBbnkpID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVUdXBsZVR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RSZWNvcmRcIjoge1xuICAgICAgLy8gei5yZWNvcmQoei5udW1iZXIoKSkgLT4geyBbeDogc3RyaW5nXTogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShbXG4gICAgICAgIGYuY3JlYXRlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoXCJ4XCIpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZVR5cGVcbiAgICAgICAgKSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE1hcFwiOiB7XG4gICAgICAvLyB6Lm1hcCh6LnN0cmluZygpKSAtPiBNYXA8c3RyaW5nPlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5rZXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgbGVmdCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmxlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3QgcmlnaHQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSB6b2QuX2RlZi5hcmdzLl9kZWYuaXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVGdW5jdGlvblR5cGVOb2RlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3VtZW50VHlwZXMsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIClcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGVmYXVsdFwiOiB7XG4gICAgICAvLyB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdCgnaGknKSAtPiBzdHJpbmdcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7OztBQ0FBO0FBQUEsT0FBTyxRQUFRO0FBQ2Y7QUFBQSxFQUNFO0FBQUEsT0FHSztBQUVQLFNBQVMsS0FBQUEsVUFBUzs7O0FDUGxCO0FBQUEsT0FBT0MsV0FBVTs7O0FDQWpCO0FBQUEsT0FBTyxVQUFVO0FBRVYsSUFBTSxnQ0FDWCxDQUFDLGFBQXFCLFdBQ3RCLENBQUMsY0FBc0I7QUFDckIsUUFBTSxRQUFRLFVBRVgsUUFBUSxTQUFTLEdBQUcsRUFFcEIsUUFBUSxPQUFPLEVBQUUsRUFFakIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxZQUFZLEVBQUUsRUFFdEIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxTQUFTLEVBQUUsRUFFbkIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxpQkFBaUIsRUFB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Q25ELGdCQUFJLENBQUMsVUFBVTtBQUNiLHFCQUFPO0FBQUEsZ0JBQ0wsVUFBVTtBQUFBLGdCQUNWLFFBQVE7QUFBQSxjQUNWO0FBQUEsWUFDRjtBQUVBLG1CQUFPO0FBQUEsY0FDTDtBQUFBLGNBQ0EsUUFBUTtBQUFBLGNBQ1IsWUFBWUYsTUFBSyxRQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3BDO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLElBQUksZ0JBQUssbUJBQUwsbUJBQXFCLFlBQXJCLFlBQWdDLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJ6IiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgImRlZGVudCIsICJwYXRoIiwgIl9hIiwgInoiLCAiZnMiLCAiZGVkZW50IiwgInBhcnNlRGVzY3JpcHRpb24iLCAib3B0aW9ucyIsICJ6IiwgIl8iLCAiZnMiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJfYSIsICJidWlsZCJdCn0K
|
|
1574
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLnNvbWUoKG1ldGhvZCkgPT5cbiAgICAgIHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICApXG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG5cbiAgICAvLyBoYW5kbGUgYm9keVxuICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBxdWVyeVxuICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUxFVEUgYW5kIEdFVCBjYW5ub3QgaGF2ZSBhIGJvZHlcbiAgICBsZXQgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJERUxFVEVcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJERUxFVEVcIilcbiAgICB9XG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJHRVRcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJHRVRcIilcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgIC4uLnJvdXRlU3BlYy5vcGVuQXBpTWV0YWRhdGEsXG4gICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAwOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgfSxcbiAgICAgICAgNDAxOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgID8gcm91dGVTcGVjLmF1dGhcbiAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgIDogc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbcm91dGVTcGVjLmF1dGhdLFxuICAgIH1cblxuICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgcm91dGUucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgc2NoZW1hOiBnZW5lcmF0ZVNjaGVtYShib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSlcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzIGFzIGFueVxuICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMobmFtZSksXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvdXRlLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBqc29uUmVzcG9uc2UgfSA9IHJvdXRlU3BlY1xuICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYgfHxcbiAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgIGpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE9iamVjdFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShcbiAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICA6IGpzb25SZXNwb25zZVxuICAgICAgKVxuXG4gICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgcmVzcG9uc2VTY2hlbWEsXG4gICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgIClcblxuICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIG5vdCBoYXJkY29kZSAyMDAgaGVyZVxuICAgICAgcm91dGUucmVzcG9uc2VzWzIwMF0uY29udGVudCA9IHtcbiAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICBzY2hlbWE6IHNjaGVtYVdpdGhSZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGlmICh0YWcuZG9lc1JvdXRlSGF2ZVRhZyAmJiB0YWcuZG9lc1JvdXRlSGF2ZVRhZyhyb3V0ZS5zdW1tYXJ5IHx8IFwiXCIpKSB7XG4gICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgbWV0aG9kcyxcbiAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhPy5yZXNwb25zZV9rZXkgPz8gcm91dGVTcGVjLnNka1JldHVyblZhbHVlLFxuICAgIH0pXG5cbiAgICAvLyBTb21lIHJvdXRlcyBhY2NlcHQgbXVsdGlwbGUgbWV0aG9kc1xuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIHtcbiAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgLm1hcCgobWV0aG9kKSA9PiAoe1xuICAgICAgICAgIFttZXRob2QudG9Mb3dlckNhc2UoKV06IHtcbiAgICAgICAgICAgIC4uLm1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdLFxuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgICAucmVkdWNlUmlnaHQoKGFjYywgY3VyKSA9PiAoeyAuLi5hY2MsIC4uLmN1ciB9KSwge30pLFxuICAgIH0pXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24odW5kZWZpbmVkLCAyKVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCBnbG9iYnkgPSAoYXdhaXQgaW1wb3J0KFwiZ2xvYmJ5XCIpKS5nbG9iYnlcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcm91dGVGbi5fcm91dGVTcGVjPy5leGNsdWRlRnJvbU9wZW5BcGkgJiZcbiAgICAgICAgICAhb3B0cy5pbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuZ3JheShcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfSBiZWNhdXNlIGl0IHdhcyBleGNsdWRlZCBmcm9tIE9wZW5BUEkgZ2VuZXJhdGlvblwiYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgIi8qKlxuICogWm9kIE9wZW5BUEkgR2VuZXJhdG9yLlxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuYXRpbmUvem9kLXBsdWdpbnNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMiBCcmlhbiBNY0JyaWRlXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNjaGVtYU9iamVjdCwgU2NoZW1hT2JqZWN0VHlwZSB9IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5pbXBvcnQgbWVyZ2UgZnJvbSBcInRzLWRlZXBtZXJnZVwiXG5pbXBvcnQgeyBBbnlab2RPYmplY3QsIHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW10gfVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BcGlab2RBbnkgZXh0ZW5kcyBab2RUeXBlQW55IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBPcGVuQXBpWm9kQW55T2JqZWN0IGV4dGVuZHMgQW55Wm9kT2JqZWN0IHtcbiAgbWV0YU9wZW5BcGk/OiBBbmF0aW5lU2NoZW1hT2JqZWN0IHwgQW5hdGluZVNjaGVtYU9iamVjdFtdXG59XG5cbmludGVyZmFjZSBQYXJzaW5nQXJnczxUPiB7XG4gIHpvZFJlZjogVFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbiAgdXNlT3V0cHV0PzogYm9vbGVhblxuICBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kQXBpPFQgZXh0ZW5kcyBPcGVuQXBpWm9kQW55PihcbiAgc2NoZW1hOiBULFxuICBzY2hlbWFPYmplY3Q6IEFuYXRpbmVTY2hlbWFPYmplY3QgPSB7fVxuKTogVCB7XG4gIHNjaGVtYS5tZXRhT3BlbkFwaSA9IE9iamVjdC5hc3NpZ24oc2NoZW1hLm1ldGFPcGVuQXBpIHx8IHt9LCBzY2hlbWFPYmplY3QpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZnVuY3Rpb24gaXRlcmF0ZVpvZE9iamVjdCh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxPcGVuQXBpWm9kQW55T2JqZWN0Pikge1xuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoem9kUmVmLnNoYXBlKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gaGlkZURlZmluaXRpb25zPy5pbmNsdWRlcyhrZXkpID09PSBmYWxzZSlcbiAgICAucmVkdWNlKFxuICAgICAgKGNhcnJ5LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmNhcnJ5LFxuICAgICAgICBba2V5XTogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnNoYXBlW2tleV0sIHVzZU91dHB1dCksXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIFNjaGVtYU9iamVjdD5cbiAgICApXG5cbiAgcmV0dXJuIHJlZHVjZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbih6b2RSZWY6IE9wZW5BcGlab2RBbnkpOiBTY2hlbWFPYmplY3Qge1xuICBpZiAoIXpvZFJlZi5kZXNjcmlwdGlvbikgcmV0dXJuIHt9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudCh6b2RSZWYuZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpXG4gICAgcmV0dXJuIHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKGJvZHkudHJpbSgpKSBvdXRwdXQuZGVzY3JpcHRpb24gPSBib2R5LnRyaW0oKVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBwcmVmaXhPYmplY3RLZXlzV2l0aFgoZGFzaGlmeU9iamVjdEtleXMoYXR0cmlidXRlcykpXG4gICAgKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zZm9ybWF0aW9uKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFRyYW5zZm9ybWVyPG5ldmVyPiB8IHouWm9kRWZmZWN0czxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgaW5wdXQgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5zY2hlbWEsIHVzZU91dHB1dClcblxuICBsZXQgb3V0cHV0ID0gXCJ1bmRlZmluZWRcIlxuICBpZiAodXNlT3V0cHV0ICYmIHpvZFJlZi5fZGVmLmVmZmVjdCkge1xuICAgIGNvbnN0IGVmZmVjdCA9XG4gICAgICB6b2RSZWYuX2RlZi5lZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IHpvZFJlZi5fZGVmLmVmZmVjdCA6IG51bGxcbiAgICBpZiAoZWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gZWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgZWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICAuLi4oem9kUmVmLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi5pbnB1dCxcbiAgICAgIC4uLihbXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJib29sZWFuXCIsIFwibnVsbFwiXS5pbmNsdWRlcyhvdXRwdXQpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogb3V0cHV0IGFzIFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCIgfCBcIm51bGxcIixcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RTdHJpbmc+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXVpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY3VpZFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiY3VpZFwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJkYXRlLXRpbWVcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbkxlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZWdleFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnBhdHRlcm4gPSBpdGVtLnJlZ2V4LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VOdW1iZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bWJlcj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBmb3JtYXQ6IFwiZmxvYXRcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwibWF4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWF4aW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gVE9ETzogb3B0aW9uIHRvIG1ha2UgdGhpcyBhbHdheXMgZXhwbGljaXQ/IChmYWxzZSBpbnN0ZWFkIG9mIG5vbi1leGlzdGVudClcbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1pblwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1pbmltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS50eXBlID0gXCJpbnRlZ2VyXCJcbiAgICAgICAgZGVsZXRlIGJhc2VTY2hlbWEuZm9ybWF0XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGlwbGVPZlwiOlxuICAgICAgICBiYXNlU2NoZW1hLm11bHRpcGxlT2YgPSBpdGVtLnZhbHVlXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4Y2x1ZGVkRGVmaW5pdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpKSB7XG4gICAgICBleGNsdWRlZERlZmluaXRpb25zLnB1c2goLi4uc2NoZW1hLmhpZGVEZWZpbml0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhjbHVkZWREZWZpbml0aW9uc1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxuICBoaWRlRGVmaW5pdGlvbnMsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2RPYmplY3Q8bmV2ZXIsIFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCI+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3RbXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbD8uX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROZXZlclwiXG4gICAgKVxuICApXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5jYXRjaGFsbCwgdXNlT3V0cHV0KVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICBlbHNlIGlmICh6b2RSZWYuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuXG4gIC8vIFNvIHRoYXQgYHVuZGVmaW5lZGAgdmFsdWVzIGRvbid0IGVuZCB1cCBpbiB0aGUgc2NoZW1hIGFuZCBiZSB3ZWlyZFxuICBhZGRpdGlvbmFsUHJvcGVydGllcyA9XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCA/IHsgYWRkaXRpb25hbFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgY29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoXG4gICAgKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVcbiAgKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgcHJvcGVydGllczogaXRlcmF0ZVpvZE9iamVjdCh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIE9wZW5BcGlab2RBbnlPYmplY3QsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgICAgaGlkZURlZmluaXRpb25zOiBnZXRFeGNsdWRlZERlZmluaXRpb25zRnJvbVNjaGVtYShzY2hlbWFzKSxcbiAgICAgIH0pLFxuICAgICAgLi4ucmVxdWlyZWQsXG4gICAgICAuLi5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAgIC4uLmhpZGVEZWZpbml0aW9ucyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUmVjb3JkPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczpcbiAgICAgICAgem9kUmVmLl9kZWYudmFsdWVUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudmFsdWVUeXBlLCB1c2VPdXRwdXQpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJpZ0ludCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQmlnSW50Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJib29sZWFuXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kRGF0ZT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcInN0cmluZ1wiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJkYXRlLXRpbWVcIiB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsKHsgem9kUmVmLCBzY2hlbWFzIH06IFBhcnNpbmdBcmdzPHouWm9kTnVsbD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVsbGFibGUoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVsbGFibGU8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpXG4gIHJldHVybiBtZXJnZShcbiAgICB7IC4uLnNjaGVtYSwgdHlwZTogc2NoZW1hLnR5cGUsIG51bGxhYmxlOiB0cnVlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURlZmF1bHQoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kRGVmYXVsdDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgZGVmYXVsdDogem9kUmVmLl9kZWYuZGVmYXVsdFZhbHVlKCksXG4gICAgICAuLi5nZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbm5lclR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJyYXkoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kQXJyYXk8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29uc3RyYWludHM6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmICh6b2RSZWYuX2RlZi5leGFjdExlbmd0aCAhPSBudWxsKSB7XG4gICAgY29uc3RyYWludHMubWluSXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICAgIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gem9kUmVmLl9kZWYuZXhhY3RMZW5ndGgudmFsdWVcbiAgfVxuXG4gIGlmICh6b2RSZWYuX2RlZi5taW5MZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLm1pbkxlbmd0aC52YWx1ZVxuICBpZiAoem9kUmVmLl9kZWYubWF4TGVuZ3RoICE9IG51bGwpXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5tYXhMZW5ndGgudmFsdWVcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJhcnJheVwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBpdGVtczogZ2VuZXJhdGVTY2hlbWEoem9kUmVmLmVsZW1lbnQsIHVzZU91dHB1dCksXG4gICAgICAuLi5jb25zdHJhaW50cyxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2Ygem9kUmVmLl9kZWYudmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt6b2RSZWYuX2RlZi52YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kRW51bTxuZXZlcj4gfCB6LlpvZE5hdGl2ZUVudW08bmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpWzBdIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiLFxuICAgICAgZW51bTogT2JqZWN0LnZhbHVlcyh6b2RSZWYuX2RlZi52YWx1ZXMpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5sZWZ0LCB1c2VPdXRwdXQpLFxuICAgICAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5yaWdodCwgdXNlT3V0cHV0KSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVW5pb248W3ouWm9kVHlwZUFueSwgLi4uei5ab2RUeXBlQW55W11dPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb250ZW50cyA9IHpvZFJlZi5fZGVmLm9wdGlvbnNcbiAgaWYgKFxuICAgIGNvbnRlbnRzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PiBwcmV2ICYmIGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2RMaXRlcmFsXCIsXG4gICAgICB0cnVlXG4gICAgKVxuICApIHtcbiAgICAvLyBzcGVjaWFsIGNhc2UgdG8gdHJhbnNmb3JtIHVuaW9ucyBvZiBsaXRlcmFscyBpbnRvIGVudW1zXG4gICAgY29uc3QgbGl0ZXJhbHMgPSBjb250ZW50cyBhcyB1bmtub3duIGFzIHouWm9kTGl0ZXJhbDxPcGVuQXBpWm9kQW55PltdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZShcbiAgICAgIChwcmV2LCBjb250ZW50KSA9PlxuICAgICAgICAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgPyB0eXBlb2YgY29udGVudC5fZGVmLnZhbHVlXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgbnVsbCBhcyBudWxsIHwgc3RyaW5nXG4gICAgKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgICAgICBlbnVtOiBsaXRlcmFscy5tYXAoKGxpdGVyYWwpID0+IGxpdGVyYWwuX2RlZi52YWx1ZSksXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAgICAgLi4uc2NoZW1hc1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzTnVsbGFibGUgPSBjb250ZW50cy5zb21lKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBjb250ZW50Ll9kZWYudHlwZU5hbWUgIT09IFwiWm9kTnVsbFwiXG4gIClcblxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8XG4gIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPHN0cmluZywgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdPlxuPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkaXNjcmltaW5hdG9yOiB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLmRpc2NyaW1pbmF0b3IsXG4gICAgICB9LFxuICAgICAgb25lT2Y6IEFycmF5LmZyb20oXG4gICAgICAgIChcbiAgICAgICAgICB6b2RSZWYgYXMgei5ab2REaXNjcmltaW5hdGVkVW5pb248XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W11cbiAgICAgICAgICA+XG4gICAgICAgICkuX2RlZi5vcHRpb25zLnZhbHVlcygpXG4gICAgICApLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoeyByZWFkT25seTogdHJ1ZSB9LCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlQnJhbmRlZCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kQnJhbmRlZDx6LlpvZEFueSwgc3RyaW5nPj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYudHlwZSksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UocGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBpcGVsaW5lKHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFBpcGVsaW5lPG5ldmVyLCBuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKHVzZU91dHB1dCkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5vdXQsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW4sIHVzZU91dHB1dClcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWFkb25seSh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWFkb25seTx6LlpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmNvbnN0IHdvcmtlck1hcCA9IHtcbiAgWm9kT2JqZWN0OiBwYXJzZU9iamVjdCxcbiAgWm9kUmVjb3JkOiBwYXJzZVJlY29yZCxcbiAgWm9kU3RyaW5nOiBwYXJzZVN0cmluZyxcbiAgWm9kTnVtYmVyOiBwYXJzZU51bWJlcixcbiAgWm9kQmlnSW50OiBwYXJzZUJpZ0ludCxcbiAgWm9kQm9vbGVhbjogcGFyc2VCb29sZWFuLFxuICBab2REYXRlOiBwYXJzZURhdGUsXG4gIFpvZE51bGw6IHBhcnNlTnVsbCxcbiAgWm9kT3B0aW9uYWw6IHBhcnNlT3B0aW9uYWwsXG4gIFpvZE51bGxhYmxlOiBwYXJzZU51bGxhYmxlLFxuICBab2REZWZhdWx0OiBwYXJzZURlZmF1bHQsXG4gIFpvZEFycmF5OiBwYXJzZUFycmF5LFxuICBab2RMaXRlcmFsOiBwYXJzZUxpdGVyYWwsXG4gIFpvZEVudW06IHBhcnNlRW51bSxcbiAgWm9kTmF0aXZlRW51bTogcGFyc2VFbnVtLFxuICBab2RUcmFuc2Zvcm1lcjogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kRWZmZWN0czogcGFyc2VUcmFuc2Zvcm1hdGlvbixcbiAgWm9kSW50ZXJzZWN0aW9uOiBwYXJzZUludGVyc2VjdGlvbixcbiAgWm9kVW5pb246IHBhcnNlVW5pb24sXG4gIFpvZERpc2NyaW1pbmF0ZWRVbmlvbjogcGFyc2VEaXNjcmltaW5hdGVkVW5pb24sXG4gIFpvZE5ldmVyOiBwYXJzZU5ldmVyLFxuICBab2RCcmFuZGVkOiBwYXJzZUJyYW5kZWQsXG4gIC8vIFRPRE8gVHJhbnNmb3JtIHRoZSByZXN0IHRvIHNjaGVtYXNcbiAgWm9kVW5kZWZpbmVkOiBjYXRjaEFsbFBhcnNlcixcbiAgLy8gVE9ETzogYHByZWZpeEl0ZW1zYCBpcyBhbGxvd2VkIGluIE9wZW5BUEkgMy4xIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0dXBsZXNcbiAgWm9kVHVwbGU6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RNYXA6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RGdW5jdGlvbjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZExhenk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQcm9taXNlOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kQW55OiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVW5rbm93bjogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFZvaWQ6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RQaXBlbGluZTogcGFyc2VQaXBlbGluZSxcbiAgWm9kUmVhZG9ubHk6IHBhcnNlUmVhZG9ubHksXG59XG50eXBlIFdvcmtlcktleXMgPSBrZXlvZiB0eXBlb2Ygd29ya2VyTWFwXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYShcbiAgem9kUmVmOiBPcGVuQXBpWm9kQW55LFxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IG1ldGFPcGVuQXBpID0ge30gfSA9IHpvZFJlZlxuICBjb25zdCBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W10gPSBbXG4gICAgLi4uKEFycmF5LmlzQXJyYXkobWV0YU9wZW5BcGkpID8gbWV0YU9wZW5BcGkgOiBbbWV0YU9wZW5BcGldKSxcbiAgXVxuICB0cnkge1xuICAgIGNvbnN0IHR5cGVOYW1lID0gem9kUmVmLl9kZWYudHlwZU5hbWUgYXMgV29ya2VyS2V5c1xuICAgIGlmICh0eXBlTmFtZSBpbiB3b3JrZXJNYXApIHtcbiAgICAgIHJldHVybiB3b3JrZXJNYXBbdHlwZU5hbWVdKHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgbmV2ZXIsXG4gICAgICAgIHNjaGVtYXMsXG4gICAgICAgIHVzZU91dHB1dCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9XG59XG4iLCAiLyoqXG4gKiBGcm9udC1NYXR0ZXJcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qeHNvbi9mcm9udC1tYXR0ZXJcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgSmFzb24gQ2FtcGJlbGwgKFwiQXV0aG9yXCIpXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBsb2FkIH0gZnJvbSBcImpzLXlhbWxcIlxuY29uc3Qgb3B0aW9uYWxCeXRlT3JkZXJNYXJrID0gXCJcXFxcdWZlZmY/XCJcbmNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgPyBwcm9jZXNzLnBsYXRmb3JtIDogXCJcIlxuY29uc3QgcGF0dGVybiA9XG4gIFwiXihcIiArXG4gIG9wdGlvbmFsQnl0ZU9yZGVyTWFyayArXG4gIFwiKD0geWFtbCA9fC0tLSlcIiArXG4gIFwiJChbXFxcXHNcXFxcU10qPylcIiArXG4gIFwiXig/OlxcXFwyfFxcXFwuXFxcXC5cXFxcLilcXFxccypcIiArXG4gIFwiJFwiICtcbiAgKHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxyP1wiIDogXCJcIikgK1xuICBcIig/OlxcXFxuKT8pXCJcbi8vIE5PVEU6IElmIHRoaXMgcGF0dGVybiB1c2VzIHRoZSAnZycgZmxhZyB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBkZWZpbml0aW9uIHdpbGxcbi8vIG5lZWQgdG8gYmUgbW92ZWQgZG93biBpbnRvIHRoZSBmdW5jdGlvbnMgdGhhdCB1c2UgaXQuXG5jb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJtXCIpXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250TWF0dGVyKFxuICBzdHJpbmc6IHN0cmluZyxcbiAgb3B0aW9ucyA9IHt9XG4pOiB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBib2R5OiBzdHJpbmc7IGJvZHlCZWdpbjogbnVtYmVyIH0ge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7IGFsbG93VW5zYWZlOiBmYWxzZSB9XG4gIG9wdGlvbnMgPVxuICAgIG9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgID8geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9XG4gICAgICA6IGRlZmF1bHRPcHRpb25zXG4gIHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCgvKFxccj9cXG4pLylcbiAgaWYgKGxpbmVzWzBdICYmIC89IHlhbWwgPXwtLS0vLnRlc3QobGluZXNbMF0pKSB7XG4gICAgcmV0dXJuIHBhcnNlKHN0cmluZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVMb2NhdGlvbihtYXRjaDogUmVnRXhwRXhlY0FycmF5LCBib2R5OiBzdHJpbmcpIHtcbiAgdmFyIGxpbmUgPSAxXG4gIHZhciBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIilcbiAgdmFyIG9mZnNldCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG5cbiAgd2hpbGUgKHBvcyAhPT0gLTEpIHtcbiAgICBpZiAocG9zID49IG9mZnNldCkge1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG4gICAgbGluZSsrXG4gICAgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIsIHBvcyArIDEpXG4gIH1cblxuICByZXR1cm4gbGluZVxufVxuXG5mdW5jdGlvbiBwYXJzZShzdHJpbmc6IHN0cmluZyk6IHtcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgYm9keTogc3RyaW5nXG4gIGJvZHlCZWdpbjogbnVtYmVyXG59IHtcbiAgdmFyIG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBib2R5OiBzdHJpbmcsXG4gICAgICBib2R5QmVnaW46IDEsXG4gICAgfVxuICB9XG5cbiAgdmFyIHlhbWwgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBcIlwiKVxuICB2YXIgYXR0cmlidXRlcyA9IChsb2FkKHlhbWwpIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB2YXIgYm9keSA9IHN0cmluZy5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKVxuICB2YXIgbGluZSA9IGNvbXB1dGVMb2NhdGlvbihtYXRjaCwgc3RyaW5nKVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICBib2R5OiBib2R5LFxuICAgIGJvZHlCZWdpbjogbGluZSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdEZyb250TWF0dGVyKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG5cbiAgcmV0dXJuIHJlZ2V4LnRlc3Qoc3RyaW5nKVxufVxuIiwgInR5cGUgUHJlZml4ZWRPYmplY3Q8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgYHgtJHtzdHJpbmcgJiBLfWBdOiBUW0tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXhPYmplY3RLZXlzV2l0aFg8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVFxuKTogUHJlZml4ZWRPYmplY3Q8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtgeC0ke2tleX1gLCB2YWx1ZV0pXG4gICkgYXMgUHJlZml4ZWRPYmplY3Q8VD5cbn1cbiIsICJ0eXBlIFNuYWtlVG9EYXNoPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBzdHJpbmcgPyBTbmFrZVRvRGFzaFN0cmluZzxLPiA6IEtdOiBUW0tdXG59XG5cbnR5cGUgU25ha2VUb0Rhc2hTdHJpbmc8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgVH1fJHtpbmZlciBVfWBcbiAgPyBgJHtUfS0ke1NuYWtlVG9EYXNoU3RyaW5nPFU+fWBcbiAgOiBTXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoaWZ5T2JqZWN0S2V5czxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBTbmFrZVRvRGFzaDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5yZXBsYWNlKC9fL2csIFwiLVwiKSwgdmFsdWVdKVxuICApIGFzIFNuYWtlVG9EYXNoPFQ+XG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kRWZmZWN0cywgWm9kT3B0aW9uYWwgfSBmcm9tIFwiem9kXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3V0ZVR5cGVzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICBjb25zdCBzb3J0ZWRSb3V0ZXMgPSBBcnJheS5mcm9tKGZpbGVwYXRoVG9Sb3V0ZS5lbnRyaWVzKCkpLnNvcnQoKGEsIGIpID0+XG4gICAgYVsxXS5yb3V0ZS5sb2NhbGVDb21wYXJlKGJbMV0ucm91dGUpXG4gIClcbiAgY29uc3QgZmlsdGVyZWRSb3V0ZXMgPSBzb3J0ZWRSb3V0ZXMuZmlsdGVyKFxuICAgIChbXywgeyByb3V0ZSB9XSkgPT4gIW9wdHMuZmlsdGVyUm91dGVzIHx8IG9wdHMuZmlsdGVyUm91dGVzKHJvdXRlKVxuICApXG5cbiAgLy8gVE9ETyB3aGVuIGxlc3MgbGF6eSwgdXNlIHRzLW1vcnBoIGZvciBiZXR0ZXIgZ2VuZXJhdGlvblxuICBjb25zdCByb3V0ZURlZnM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBbXywgeyByb3V0ZSwgcm91dGVTcGVjLCBzZXR1cFBhcmFtcyB9XSBvZiBmaWx0ZXJlZFJvdXRlcykge1xuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlU3BlYy5xdWVyeVBhcmFtcz8uc2hhcGUgPz8ge30pXG4gICAgY29uc3QgcGF0aFBhcmFtZXRlcnMgPSBxdWVyeUtleXMuZmlsdGVyKChrZXkpID0+IHJvdXRlLmluY2x1ZGVzKGBbJHtrZXl9XWApKVxuXG4gICAgLy8gcXVlcnlQYXJhbXMgbWlnaHQgYmUgYSBab2RFZmZlY3RzIG9yIFpvZE9wdGlvbmFsIGluIHNvbWUgY2FzZXNcbiAgICBsZXQgcXVlcnlQYXJhbXMgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB3aGlsZSAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zIHx8IFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpXG4gICAgKSB7XG4gICAgICBpZiAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RFZmZlY3RzPGFueT4pLnNvdXJjZVR5cGUoKVxuICAgICAgfSBlbHNlIGlmIChcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kT3B0aW9uYWw8YW55PikudW53cmFwKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvKipcbiAqIFpvZCBUbyBUU1xuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NhY2hpbnJhamEvem9kLXRvLXRzXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2FjaGluIFJhamFcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5pbXBvcnQgeyBab2RUeXBlLCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG50eXBlIEdldFR5cGUgPSB7IF9kZWY6IHsgZ2V0VHlwZT86IEdldFR5cGVGdW5jdGlvbiB9IH1cblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGVTY2hlbWEgPSB6b2QgYXMgR2V0VHlwZVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSlcbiAgICB0eXBlID0gZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSB6b2QuX2RlZi50eXBlTmFtZVxuXG4gIGNvbnN0IGdldFR5cGVUeXBlID0gY2FsbEdldFR5cGUoem9kLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICAvLyBzcGVjaWFsIGNhc2UgbmF0aXZlIGVudW0sIHdoaWNoIG5lZWRzIGFuIGlkZW50aWZpZXIgbm9kZVxuICBpZiAoZ2V0VHlwZVR5cGUgJiYgdHlwZU5hbWUgIT09IFwiWm9kTmF0aXZlRW51bVwiKSB7XG4gICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZShnZXRUeXBlVHlwZSlcbiAgfVxuXG4gIGNvbnN0IG90aGVyQXJndW1lbnRzID0gW2lkZW50aWZpZXIsIHN0b3JlLCBvcHRpb25zXSBhcyBjb25zdFxuXG4gIHN3aXRjaCAodHlwZU5hbWUpIHtcbiAgICBjYXNlIFwiWm9kU3RyaW5nXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdW1iZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJpZ0ludFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5CaWdJbnRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQm9vbGVhblwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZERhdGVcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiRGF0ZVwiKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVuZGVmaW5lZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVsbFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpXG4gICAgfVxuICAgIGNhc2UgXCJab2RWb2lkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlZvaWRLZXl3b3JkKSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuICAgIGNhc2UgXCJab2RBbnlcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZFVua25vd25cIjoge1xuICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROZXZlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OZXZlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RMYXp5XCI6IHtcbiAgICAgIC8vIGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGxhenkgdmFsdWUgaXMgcmVmZXJyaW5nIHRvXG4gICAgICAvLyBzbyB3ZSBmb3JjZSB0aGUgdXNlciB0byBkZWNsYXJlIGl0XG4gICAgICBpZiAoIWdldFR5cGVUeXBlKSByZXR1cm4gY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcoaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgXCJab2RMaXRlcmFsXCI6IHtcbiAgICAgIC8vIHoubGl0ZXJhbCgnaGknKSAtPiAnaGknXG4gICAgICBsZXQgbGl0ZXJhbDogdHMuTGl0ZXJhbEV4cHJlc3Npb24gfCB0cy5Cb29sZWFuTGl0ZXJhbFxuXG4gICAgICBjb25zdCBsaXRlcmFsVmFsdWUgPSB6b2QuX2RlZi52YWx1ZSBhcyBMaXRlcmFsVHlwZVxuICAgICAgc3dpdGNoICh0eXBlb2YgbGl0ZXJhbFZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbFZhbHVlID09PSB0cnVlID8gZi5jcmVhdGVUcnVlKCkgOiBmLmNyZWF0ZUZhbHNlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKGxpdGVyYWxWYWx1ZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShsaXRlcmFsKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kT2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyh6b2QuX2RlZi5zaGFwZSgpKVxuXG4gICAgICBjb25zdCBtZW1iZXJzOiB0cy5UeXBlRWxlbWVudFtdID0gcHJvcGVydGllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0Wm9kTm9kZSA9IHZhbHVlIGFzIFpvZFR5cGVBbnlcbiAgICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKG5leHRab2ROb2RlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICBjb25zdCB7IHR5cGVOYW1lOiBuZXh0Wm9kTm9kZVR5cGVOYW1lIH0gPSBuZXh0Wm9kTm9kZS5fZGVmXG4gICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPVxuICAgICAgICAgIG5leHRab2ROb2RlVHlwZU5hbWUgPT09IFwiWm9kT3B0aW9uYWxcIiB8fCBuZXh0Wm9kTm9kZS5pc09wdGlvbmFsKClcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eVNpZ25hdHVyZSA9IGYuY3JlYXRlUHJvcGVydHlTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSxcbiAgICAgICAgICBpc09wdGlvbmFsID8gZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLlF1ZXN0aW9uVG9rZW4pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIGFkZEpzRG9jQ29tbWVudChwcm9wZXJ0eVNpZ25hdHVyZSwgbmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydHlTaWduYXR1cmVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUobWVtYmVycylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kQXJyYXlcIjoge1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYudmFsdWVzLm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IHpvZC5fZGVmLm9wdGlvbnNcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSBbLi4uem9kLl9kZWYub3B0aW9ucy52YWx1ZXMoKV1cbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5zY2hlbWEsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyh6b2QuX2RlZi52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB6b2QuX2RlZi52YWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPlxuICAgICAgICApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyBmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKVxuICAgICAgICAgICAgICA6IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSlcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUVudW1NZW1iZXIoZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLCBsaXRlcmFsKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBzdG9yZS5uYXRpdmVFbnVtcy5wdXNoKFxuICAgICAgICAgICAgZi5jcmVhdGVFbnVtRGVjbGFyYXRpb24odW5kZWZpbmVkLCB0eXBlLCBlbnVtTWVtYmVycylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2dldFR5cGUgb24gbmF0aXZlRW51bSBtdXN0IHJldHVybiBhbiBpZGVudGlmaWVyIHdoZW4gbmF0aXZlRW51bXMgaXMgXCJyZXNvbHZlXCInXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kT3B0aW9uYWxcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IHR5cGVzID0gem9kLl9kZWYuaXRlbXMubWFwKChvcHRpb246IFpvZFR5cGVBbnkpID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVUdXBsZVR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RSZWNvcmRcIjoge1xuICAgICAgLy8gei5yZWNvcmQoei5udW1iZXIoKSkgLT4geyBbeDogc3RyaW5nXTogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShbXG4gICAgICAgIGYuY3JlYXRlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoXCJ4XCIpLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZVR5cGVcbiAgICAgICAgKSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE1hcFwiOiB7XG4gICAgICAvLyB6Lm1hcCh6LnN0cmluZygpKSAtPiBNYXA8c3RyaW5nPlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5rZXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgbGVmdCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmxlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3QgcmlnaHQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSB6b2QuX2RlZi5hcmdzLl9kZWYuaXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVGdW5jdGlvblR5cGVOb2RlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3VtZW50VHlwZXMsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIClcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGVmYXVsdFwiOiB7XG4gICAgICAvLyB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVmYXVsdCgnaGknKSAtPiBzdHJpbmdcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUE7OztBQ0FBO0FBQUEsT0FBTyxRQUFRO0FBQ2Y7QUFBQSxFQUNFO0FBQUEsT0FHSztBQUVQLFNBQVMsS0FBQUEsVUFBUzs7O0FDUGxCO0FBQUEsT0FBT0MsV0FBVTs7O0FDQWpCO0FBQUEsT0FBTyxVQUFVO0FBRVYsSUFBTSxnQ0FDWCxDQUFDLGFBQXFCLFdBQ3RCLENBQUMsY0FBc0I7QUFDckIsUUFBTSxRQUFRLFVBRVgsUUFBUSxTQUFTLEdBQUcsRUFFcEIsUUFBUSxPQUFPLEVBQUUsRUFFakIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxZQUFZLEVBQUUsRUFFdEIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxTQUFTLEVBQUUsRUFFbkIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxpQkFBaUIsRUFBRTtBQUU5QixTQUFPLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFDcEM7OztBRGJLLElBQU0sdUJBQXVCLE9BQU8sU0FNSjtBQUNyQyxRQUFNLFNBQVMsTUFBTSwrQ0FBTyw2QkFBVTtBQUN0QyxRQUFNLFVBQVUsTUFBTSwrQ0FBTyw2QkFBVztBQUN4QyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gseUJBQXlCLDhCQUE4QixLQUFLLFNBQVM7QUFBQSxFQUN2RSxJQUFJO0FBRUosUUFBTSxlQUFlQyxNQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFDekQsVUFBUSxJQUFJLGNBQWMsa0JBQWtCO0FBQzVDLFFBQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxjQUFjO0FBQ2hELFVBQVEsSUFBSSxTQUFTLFVBQVUsY0FBYztBQUM3QyxNQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFVBQU0sSUFBSSxNQUFNLHNCQUFzQixlQUFlO0FBQUEsRUFD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QkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZRixNQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInoiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAiZGVkZW50IiwgInBhdGgiLCAiZGVkZW50IiwgIl9hIiwgInoiLCAiZnMiLCAiZGVkZW50IiwgInBhcnNlRGVzY3JpcHRpb24iLCAib3B0aW9ucyIsICJ6IiwgIl8iLCAiZnMiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJfYSIsICJidWlsZCJdCn0K
|