@cartanova/qgrid-cli 2.5.4 → 2.5.6
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/bundle/dist/application/qgrid/tool-emulation-schema.js +9 -37
- package/bundle/dist/utils/providers/common/json-schema-keywords.js +77 -0
- package/bundle/dist/utils/providers/common/strictifier.js +42 -39
- package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +3 -3
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +29 -28
- package/bundle/src/utils/providers/common/json-schema-keywords.ts +72 -0
- package/bundle/src/utils/providers/common/strictifier.ts +46 -39
- package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +2 -2
- package/bundle/web-dist/client/assets/{index-DiY5V2e3.js → index-DYwq7a0y.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-UZ4Cvdmc.js → logs-BRpHY7bH.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-C5cJo-HD.js → monit-BBnFUnAg.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-DEKEmoQN.js → routes-DJDlOo-P.js} +1 -1
- package/bundle/web-dist/client/assets/{show-DnX6b8KG.js → show-Dn-exALi.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-Ct0FGD4b.js → tokens-DaMfQeAo.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/references/docs-workflow.md +9 -0
- package/skills/qgrid/references/tool-calling-and-multiturn.md +119 -7
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SCHEMA_ARRAY_KEYWORDS, SCHEMA_MAP_KEYWORDS, SCHEMA_SINGLE_KEYWORDS, UNSUPPORTED_REFERENCE_KEYWORDS } from "../../utils/providers/common/json-schema-keywords.js";
|
|
1
2
|
//#region src/application/qgrid/tool-emulation-schema.ts
|
|
2
3
|
const USER_OUTPUT_DEFINITION = "__qgrid_user_output";
|
|
3
4
|
const USER_OUTPUT_REF = `#/$defs/${USER_OUTPUT_DEFINITION}`;
|
|
@@ -60,43 +61,14 @@ function buildToolCallSchema(tools, answerSchema) {
|
|
|
60
61
|
function rebaseUserOutputSchema(schema) {
|
|
61
62
|
return rewriteSchemaNode(schema, "$");
|
|
62
63
|
}
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"dependentSchemas",
|
|
67
|
-
"patternProperties",
|
|
68
|
-
"properties"
|
|
69
|
-
]);
|
|
70
|
-
const SCHEMA_ARRAY_KEYWORDS = /* @__PURE__ */ new Set([
|
|
71
|
-
"allOf",
|
|
72
|
-
"anyOf",
|
|
73
|
-
"oneOf",
|
|
74
|
-
"prefixItems"
|
|
75
|
-
]);
|
|
76
|
-
const SCHEMA_KEYWORDS = /* @__PURE__ */ new Set([
|
|
77
|
-
"additionalItems",
|
|
78
|
-
"additionalProperties",
|
|
79
|
-
"contains",
|
|
80
|
-
"contentSchema",
|
|
81
|
-
"else",
|
|
82
|
-
"if",
|
|
83
|
-
"items",
|
|
84
|
-
"not",
|
|
85
|
-
"propertyNames",
|
|
86
|
-
"then",
|
|
87
|
-
"unevaluatedItems",
|
|
88
|
-
"unevaluatedProperties"
|
|
89
|
-
]);
|
|
64
|
+
const MAP_KEYWORDS = new Set(SCHEMA_MAP_KEYWORDS);
|
|
65
|
+
const ARRAY_KEYWORDS = new Set(SCHEMA_ARRAY_KEYWORDS);
|
|
66
|
+
const SINGLE_KEYWORDS = new Set(SCHEMA_SINGLE_KEYWORDS);
|
|
90
67
|
function rewriteSchemaNode(value, path) {
|
|
91
68
|
if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
|
|
92
69
|
const source = value;
|
|
93
70
|
const result = { ...source };
|
|
94
|
-
for (const unsupportedKeyword of
|
|
95
|
-
"$id",
|
|
96
|
-
"$dynamicRef",
|
|
97
|
-
"$recursiveRef",
|
|
98
|
-
"$recursiveAnchor"
|
|
99
|
-
]) if (unsupportedKeyword in source) throw new ToolSchemaCompositionError(`${unsupportedKeyword} is not supported`, `${path}.${unsupportedKeyword}`);
|
|
71
|
+
for (const unsupportedKeyword of UNSUPPORTED_REFERENCE_KEYWORDS) if (Object.hasOwn(source, unsupportedKeyword)) throw new ToolSchemaCompositionError(`${unsupportedKeyword} is not supported`, `${path}.${unsupportedKeyword}`);
|
|
100
72
|
if ("$ref" in source) {
|
|
101
73
|
const ref = source.$ref;
|
|
102
74
|
if (typeof ref !== "string" || ref !== "#" && !ref.startsWith("#/")) throw new ToolSchemaCompositionError("only root-relative JSON Pointer $ref values are supported", `${path}.$ref`);
|
|
@@ -104,10 +76,10 @@ function rewriteSchemaNode(value, path) {
|
|
|
104
76
|
}
|
|
105
77
|
for (const [keyword, child] of Object.entries(source)) {
|
|
106
78
|
const keywordPath = `${path}.${keyword}`;
|
|
107
|
-
if (
|
|
79
|
+
if (MAP_KEYWORDS.has(keyword) && isJsonObject(child)) result[keyword] = Object.fromEntries(Object.entries(child).map(([name, schema]) => [name, rewriteSchemaNode(schema, `${keywordPath}.${name}`)]));
|
|
108
80
|
else if (keyword === "dependencies" && isJsonObject(child)) result[keyword] = Object.fromEntries(Object.entries(child).map(([name, dependency]) => [name, Array.isArray(dependency) ? dependency : rewriteSchemaNode(dependency, `${keywordPath}.${name}`)]));
|
|
109
|
-
else if (
|
|
110
|
-
else if (
|
|
81
|
+
else if (ARRAY_KEYWORDS.has(keyword) && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`));
|
|
82
|
+
else if (SINGLE_KEYWORDS.has(keyword)) if (keyword === "items" && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`));
|
|
111
83
|
else result[keyword] = rewriteSchemaNode(child, keywordPath);
|
|
112
84
|
}
|
|
113
85
|
return result;
|
|
@@ -118,4 +90,4 @@ function isJsonObject(value) {
|
|
|
118
90
|
//#endregion
|
|
119
91
|
export { ToolSchemaCompositionError, buildToolCallSchema };
|
|
120
92
|
|
|
121
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUb29sIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgVVNFUl9PVVRQVVRfREVGSU5JVElPTiA9IFwiX19xZ3JpZF91c2VyX291dHB1dFwiO1xuY29uc3QgVVNFUl9PVVRQVVRfUkVGID0gYCMvJGRlZnMvJHtVU0VSX09VVFBVVF9ERUZJTklUSU9OfWA7XG5cbmV4cG9ydCBjbGFzcyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKGB0b29sIHNjaGVtYSBjb21wb3NpdGlvbjogJHttZXNzYWdlfSAoYXQgJHtwYXRofSlgKTtcbiAgICB0aGlzLm5hbWUgPSBcIlRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVG9vbENhbGxTY2hlbWEodG9vbHM6IFFncmlkVG9vbFtdLCBhbnN3ZXJTY2hlbWE/OiBKc29uVmFsdWUpOiBKc29uVmFsdWUge1xuICBjb25zdCB0b29sRGVzY3JpcHRpb25zID0gdG9vbHNcbiAgICAubWFwKCh0b29sKSA9PiB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBKU09OLnN0cmluZ2lmeSh0b29sLmlucHV0U2NoZW1hKTtcbiAgICAgIHJldHVybiBgLSAke3Rvb2wubmFtZX06ICR7dG9vbC5kZXNjcmlwdGlvbiA/PyBcIlwifVxcbiAgaW5wdXRTY2hlbWE6ICR7c2NoZW1hfWA7XG4gICAgfSlcbiAgICAuam9pbihcIlxcblwiKTtcblxuICBjb25zdCBub3JtYWxpemVkQW5zd2VyU2NoZW1hID1cbiAgICBhbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlYmFzZVVzZXJPdXRwdXRTY2hlbWEoYW5zd2VyU2NoZW1hKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlVzZSB0aGlzIHNjaGVtYSBvbmx5IHRocm91Z2ggU3RydWN0dXJlZE91dHB1dC4gRG8gbm90IGludm9rZSBsaXN0ZWQgY2xpZW50IHRvb2xzIGFzIG5hdGl2ZSBDbGF1ZGUgQ29kZSB0b29scy4gVG8gcmVxdWVzdCBjbGllbnQtc2lkZSB0b29sIGV4ZWN1dGlvbiwgc2V0IGFjdGlvbiB0byB0b29sX2NhbGwgYW5kIGluY2x1ZGUgdG9vbENhbGxzLiBVc2UgYWN0aW9uIGFuc3dlciBvbmx5IHdoZW4gbm8gZnVydGhlciBjbGllbnQgdG9vbCByZXN1bHQgaXMgbmVlZGVkLlwiLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGFjdGlvbjoge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBlbnVtOiBbXCJhbnN3ZXJcIiwgXCJ0b29sX2NhbGxcIl0sXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiVXNlIHRvb2xfY2FsbCB0byByZXF1ZXN0IGNsaWVudC1zaWRlIHRvb2wgZXhlY3V0aW9uIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmVkIG91dHB1dC4gVXNlIGFuc3dlciBvbmx5IGZvciBhIGZpbmFsIGFuc3dlci5cIixcbiAgICAgIH0sXG4gICAgICBhbnN3ZXI6IHtcbiAgICAgICAgYW55T2Y6IFtcbiAgICAgICAgICBub3JtYWxpemVkQW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWQgPyB7IHR5cGU6IFwic3RyaW5nXCIgfSA6IHsgJHJlZjogVVNFUl9PVVRQVVRfUkVGIH0sXG4gICAgICAgICAgeyB0eXBlOiBcIm51bGxcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHRvb2xDYWxsczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIkNsaWVudC1zaWRlIHRvb2wgY2FsbHMgcmVxdWVzdGVkIHRocm91Z2ggc3RydWN0dXJlZCBvdXRwdXQuIERvIG5vdCBjYWxsIHRoZXNlIHRvb2xzIGFzIG5hdGl2ZSBDbGF1ZGUgQ29kZSB0b29scy5cIixcbiAgICAgICAgYW55T2Y6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgdG9vbE5hbWU6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICBlbnVtOiB0b29scy5tYXAoKHRvb2wpID0+IHRvb2wubmFtZSksXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYENsaWVudC1zaWRlIHRvb2wgbmFtZSB0byByZXF1ZXN0IHRocm91Z2ggc3RydWN0dXJlZCBvdXRwdXQuIERvIG5vdCBjYWxsIHRoaXMgYXMgYSBuYXRpdmUgQ2xhdWRlIENvZGUgdG9vbC5cXG4ke3Rvb2xEZXNjcmlwdGlvbnN9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUb29sIGFyZ3VtZW50cyBhcyBhIEpTT04gc3RyaW5nIGZvciB0aGUgY2xpZW50LXNpZGUgdG9vbC5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXF1aXJlZDogW1widG9vbE5hbWVcIiwgXCJhcmdzXCJdLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB0eXBlOiBcIm51bGxcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbXCJhY3Rpb25cIiwgXCJhbnN3ZXJcIiwgXCJ0b29sQ2FsbHNcIl0sXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgIC4uLihub3JtYWxpemVkQW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWRcbiAgICAgID8ge31cbiAgICAgIDoge1xuICAgICAgICAgICRkZWZzOiB7XG4gICAgICAgICAgICBbVVNFUl9PVVRQVVRfREVGSU5JVElPTl06IG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlYmFzZVVzZXJPdXRwdXRTY2hlbWEoc2NoZW1hOiBKc29uVmFsdWUpOiBKc29uVmFsdWUge1xuICByZXR1cm4gcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBcIiRcIik7XG59XG5cbmNvbnN0IFNDSEVNQV9NQVBfS0VZV09SRFMgPSBuZXcgU2V0KFtcbiAgXCIkZGVmc1wiLFxuICBcImRlZmluaXRpb25zXCIsXG4gIFwiZGVwZW5kZW50U2NoZW1hc1wiLFxuICBcInBhdHRlcm5Qcm9wZXJ0aWVzXCIsXG4gIFwicHJvcGVydGllc1wiLFxuXSk7XG5jb25zdCBTQ0hFTUFfQVJSQVlfS0VZV09SRFMgPSBuZXcgU2V0KFtcImFsbE9mXCIsIFwiYW55T2ZcIiwgXCJvbmVPZlwiLCBcInByZWZpeEl0ZW1zXCJdKTtcbmNvbnN0IFNDSEVNQV9LRVlXT1JEUyA9IG5ldyBTZXQoW1xuICBcImFkZGl0aW9uYWxJdGVtc1wiLFxuICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIsXG4gIFwiY29udGFpbnNcIixcbiAgXCJjb250ZW50U2NoZW1hXCIsXG4gIFwiZWxzZVwiLFxuICBcImlmXCIsXG4gIFwiaXRlbXNcIixcbiAgXCJub3RcIixcbiAgXCJwcm9wZXJ0eU5hbWVzXCIsXG4gIFwidGhlblwiLFxuICBcInVuZXZhbHVhdGVkSXRlbXNcIixcbiAgXCJ1bmV2YWx1YXRlZFByb3BlcnRpZXNcIixcbl0pO1xuXG5mdW5jdGlvbiByZXdyaXRlU2NoZW1hTm9kZSh2YWx1ZTogSnNvblZhbHVlLCBwYXRoOiBzdHJpbmcpOiBKc29uVmFsdWUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3Qgc291cmNlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPjtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0geyAuLi5zb3VyY2UgfTtcblxuICBmb3IgKGNvbnN0IHVuc3VwcG9ydGVkS2V5d29yZCBvZiBbXCIkaWRcIiwgXCIkZHluYW1pY1JlZlwiLCBcIiRyZWN1cnNpdmVSZWZcIiwgXCIkcmVjdXJzaXZlQW5jaG9yXCJdKSB7XG4gICAgaWYgKHVuc3VwcG9ydGVkS2V5d29yZCBpbiBzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgYCR7dW5zdXBwb3J0ZWRLZXl3b3JkfSBpcyBub3Qgc3VwcG9ydGVkYCxcbiAgICAgICAgYCR7cGF0aH0uJHt1bnN1cHBvcnRlZEtleXdvcmR9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFwiJHJlZlwiIGluIHNvdXJjZSkge1xuICAgIGNvbnN0IHJlZiA9IHNvdXJjZS4kcmVmO1xuICAgIGlmICh0eXBlb2YgcmVmICE9PSBcInN0cmluZ1wiIHx8IChyZWYgIT09IFwiI1wiICYmICFyZWYuc3RhcnRzV2l0aChcIiMvXCIpKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yKFxuICAgICAgICBcIm9ubHkgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgICBgJHtwYXRofS4kcmVmYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc3VsdC4kcmVmID0gYCR7VVNFUl9PVVRQVVRfUkVGfSR7cmVmLnNsaWNlKDEpfWA7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXl3b3JkLCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgIGNvbnN0IGtleXdvcmRQYXRoID0gYCR7cGF0aH0uJHtrZXl3b3JkfWA7XG5cbiAgICBpZiAoU0NIRU1BX01BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJkZXBlbmRlbmNpZXNcIiAmJiBpc0pzb25PYmplY3QoY2hpbGQpKSB7XG4gICAgICByZXN1bHRba2V5d29yZF0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoaWxkKS5tYXAoKFtuYW1lLCBkZXBlbmRlbmN5XSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KVxuICAgICAgICAgICAgPyBkZXBlbmRlbmN5XG4gICAgICAgICAgICA6IHJld3JpdGVTY2hlbWFOb2RlKGRlcGVuZGVuY3ksIGAke2tleXdvcmRQYXRofS4ke25hbWV9YCksXG4gICAgICAgIF0pLFxuICAgICAgKSBhcyBKc29uVmFsdWU7XG4gICAgfSBlbHNlIGlmIChTQ0hFTUFfQVJSQVlfS0VZV09SRFMuaGFzKGtleXdvcmQpICYmIEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICByZXN1bHRba2V5d29yZF0gPSBjaGlsZC5tYXAoKHNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgIHJld3JpdGVTY2hlbWFOb2RlKHNjaGVtYSwgYCR7a2V5d29yZFBhdGh9WyR7aW5kZXh9XWApLFxuICAgICAgKSBhcyBKc29uVmFsdWU7XG4gICAgfSBlbHNlIGlmIChTQ0hFTUFfS0VZV09SRFMuaGFzKGtleXdvcmQpKSB7XG4gICAgICBpZiAoa2V5d29yZCA9PT0gXCJpdGVtc1wiICYmIEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IGNoaWxkLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgICAgICByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIGAke2tleXdvcmRQYXRofVske2luZGV4fV1gKSxcbiAgICAgICAgKSBhcyBKc29uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5d29yZF0gPSByZXdyaXRlU2NoZW1hTm9kZShjaGlsZCwga2V5d29yZFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgSnNvblZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSk6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1c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
|
|
93
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0b29sIGVudmVsb3BlICsg7IKs7Jqp7J6QIG91dHB1dCDsiqTtgqTrp4gg7ZWp7ISxICjsmpTssq0g67Cp7ZalKS4g7J2R64u1IO2VtOyEneydgCB0b29sLWVtdWxhdGlvbi50cy5cbiAqXG4gKiB0b29scyDqsIAg7J6I7Ja064+EIOy1nOyihSBhbnN3ZXIg6rCAIOyCrOyaqeyekCDsiqTtgqTrp4jroZwg6rCV7KCc65CY6rKMIO2VmOugpOqzoCBlbnZlbG9wZSDsnZggYW5zd2VyIOu4jOuenOy5mOyXkFxuICog7IKs7Jqp7J6QIOyKpO2CpOuniOulvCDsi6zripTri6QuIO2GteynuOuhnCDspJHssqntlaAg7IiYIOyXhuuKlCDsnbTsnKDripQgYCRyZWZgIOqwgCDrrLjshJwg7KCI64yAIOqyveuhnOydtOq4sCDrlYzrrLgg4oCUXG4gKiBgI2Ag7J2AIFwi7J20IOyhsOqwgeydmCDro6jtirhcIuqwgCDslYTri4jrnbwgXCLstZzsooUg66y47ISc7J2YIOujqO2KuFwi6528LCDqt7jrjIDroZwg64Sj7Jy866m0IO2PrOyduO2EsOqwgCBlbnZlbG9wZSDsnYRcbiAqIOqwgOumrOy8nCDsobDsmqntnogg7JeJ65qx7ZWcIOqxuCDqsoDspp3tlZjqsowg65Cc64ukLiDqt7jrnpjshJwg7JiI7JW9IOydtOumhCDslYTrnpjroZwg7Jiu6riw6rOgIOuhnOy7rCDtj6zsnbjthLDrpbwg7J6s7J6R7ISx7ZWc64ukLlxuICpcbiAqIOuwsOqyvcK37Iuk7LihwrfsmIjsi5zCt+qxsOu2gCDrqqnroZ3snYAg7Iqk7YKsIOusuOyEnOulvCDrs7wg6rKDOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqICAg4oaSIFwiQ29tcG9zaW5nIFRvb2xzIFdpdGggQSBVc2VyIE91dHB1dCBTY2hlbWFcIlxuICovXG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICBTQ0hFTUFfQVJSQVlfS0VZV09SRFMsXG4gIFNDSEVNQV9ERVBFTkRFTkNJRVNfS0VZV09SRCxcbiAgU0NIRU1BX01BUF9LRVlXT1JEUyxcbiAgU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyxcbiAgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9qc29uLXNjaGVtYS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgdHlwZSBRZ3JpZFRvb2wgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBVU0VSX09VVFBVVF9ERUZJTklUSU9OID0gXCJfX3FncmlkX3VzZXJfb3V0cHV0XCI7XG5jb25zdCBVU0VSX09VVFBVVF9SRUYgPSBgIy8kZGVmcy8ke1VTRVJfT1VUUFVUX0RFRklOSVRJT059YDtcblxuZXhwb3J0IGNsYXNzIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHBhdGg6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoYHRvb2wgc2NoZW1hIGNvbXBvc2l0aW9uOiAke21lc3NhZ2V9IChhdCAke3BhdGh9KWApO1xuICAgIHRoaXMubmFtZSA9IFwiVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUb29sQ2FsbFNjaGVtYSh0b29sczogUWdyaWRUb29sW10sIGFuc3dlclNjaGVtYT86IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIGNvbnN0IHRvb2xEZXNjcmlwdGlvbnMgPSB0b29sc1xuICAgIC5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04uc3RyaW5naWZ5KHRvb2wuaW5wdXRTY2hlbWEpO1xuICAgICAgcmV0dXJuIGAtICR7dG9vbC5uYW1lfTogJHt0b29sLmRlc2NyaXB0aW9uID8/IFwiXCJ9XFxuICBpbnB1dFNjaGVtYTogJHtzY2hlbWF9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPVxuICAgIGFuc3dlclNjaGVtYSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmViYXNlVXNlck91dHB1dFNjaGVtYShhbnN3ZXJTY2hlbWEpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlIHRoaXMgc2NoZW1hIG9ubHkgdGhyb3VnaCBTdHJ1Y3R1cmVkT3V0cHV0LiBEbyBub3QgaW52b2tlIGxpc3RlZCBjbGllbnQgdG9vbHMgYXMgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2xzLiBUbyByZXF1ZXN0IGNsaWVudC1zaWRlIHRvb2wgZXhlY3V0aW9uLCBzZXQgYWN0aW9uIHRvIHRvb2xfY2FsbCBhbmQgaW5jbHVkZSB0b29sQ2FsbHMuIFVzZSBhY3Rpb24gYW5zd2VyIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgYWN0aW9uOiB7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGVudW06IFtcImFuc3dlclwiLCBcInRvb2xfY2FsbFwiXSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJVc2UgdG9vbF9jYWxsIHRvIHJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24gdGhyb3VnaCB0aGlzIHN0cnVjdHVyZWQgb3V0cHV0LiBVc2UgYW5zd2VyIG9ubHkgZm9yIGEgZmluYWwgYW5zd2VyLlwiLFxuICAgICAgfSxcbiAgICAgIGFuc3dlcjoge1xuICAgICAgICBhbnlPZjogW1xuICAgICAgICAgIG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZCA/IHsgdHlwZTogXCJzdHJpbmdcIiB9IDogeyAkcmVmOiBVU0VSX09VVFBVVF9SRUYgfSxcbiAgICAgICAgICB7IHR5cGU6IFwibnVsbFwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgdG9vbENhbGxzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiQ2xpZW50LXNpZGUgdG9vbCBjYWxscyByZXF1ZXN0ZWQgdGhyb3VnaCBzdHJ1Y3R1cmVkIG91dHB1dC4gRG8gbm90IGNhbGwgdGhlc2UgdG9vbHMgYXMgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2xzLlwiLFxuICAgICAgICBhbnlPZjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICB0b29sTmFtZToge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgIGVudW06IHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ2xpZW50LXNpZGUgdG9vbCBuYW1lIHRvIHJlcXVlc3QgdGhyb3VnaCBzdHJ1Y3R1cmVkIG91dHB1dC4gRG8gbm90IGNhbGwgdGhpcyBhcyBhIG5hdGl2ZSBDbGF1ZGUgQ29kZSB0b29sLlxcbiR7dG9vbERlc2NyaXB0aW9uc31gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHRoZSBjbGllbnQtc2lkZSB0b29sLlwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0b29sTmFtZVwiLCBcImFyZ3NcIl0sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHR5cGU6IFwibnVsbFwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtcImFjdGlvblwiLCBcImFuc3dlclwiLCBcInRvb2xDYWxsc1wiXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgLi4uKG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgJGRlZnM6IHtcbiAgICAgICAgICAgIFtVU0VSX09VVFBVVF9ERUZJTklUSU9OXTogbm9ybWFsaXplZEFuc3dlclNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmViYXNlVXNlck91dHB1dFNjaGVtYShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIHJldHVybiByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIFwiJFwiKTtcbn1cblxuY29uc3QgTUFQX0tFWVdPUkRTID0gbmV3IFNldDxzdHJpbmc+KFNDSEVNQV9NQVBfS0VZV09SRFMpO1xuY29uc3QgQVJSQVlfS0VZV09SRFMgPSBuZXcgU2V0PHN0cmluZz4oU0NIRU1BX0FSUkFZX0tFWVdPUkRTKTtcbmNvbnN0IFNJTkdMRV9LRVlXT1JEUyA9IG5ldyBTZXQ8c3RyaW5nPihTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTKTtcblxuZnVuY3Rpb24gcmV3cml0ZVNjaGVtYU5vZGUodmFsdWU6IEpzb25WYWx1ZSwgcGF0aDogc3RyaW5nKTogSnNvblZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT47XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHsgLi4uc291cmNlIH07XG5cbiAgZm9yIChjb25zdCB1bnN1cHBvcnRlZEtleXdvcmQgb2YgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oc291cmNlLCB1bnN1cHBvcnRlZEtleXdvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAgIGAke3Vuc3VwcG9ydGVkS2V5d29yZH0gaXMgbm90IHN1cHBvcnRlZGAsXG4gICAgICAgIGAke3BhdGh9LiR7dW5zdXBwb3J0ZWRLZXl3b3JkfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcIiRyZWZcIiBpbiBzb3VyY2UpIHtcbiAgICBjb25zdCByZWYgPSBzb3VyY2UuJHJlZjtcbiAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJzdHJpbmdcIiB8fCAocmVmICE9PSBcIiNcIiAmJiAhcmVmLnN0YXJ0c1dpdGgoXCIjL1wiKSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgXCJvbmx5IHJvb3QtcmVsYXRpdmUgSlNPTiBQb2ludGVyICRyZWYgdmFsdWVzIGFyZSBzdXBwb3J0ZWRcIixcbiAgICAgICAgYCR7cGF0aH0uJHJlZmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQuJHJlZiA9IGAke1VTRVJfT1VUUFVUX1JFRn0ke3JlZi5zbGljZSgxKX1gO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5d29yZCwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBrZXl3b3JkUGF0aCA9IGAke3BhdGh9LiR7a2V5d29yZH1gO1xuXG4gICAgaWYgKE1BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JEICYmIGlzSnNvbk9iamVjdChjaGlsZCkpIHtcbiAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hpbGQpLm1hcCgoW25hbWUsIGRlcGVuZGVuY3ldKSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpXG4gICAgICAgICAgICA/IGRlcGVuZGVuY3lcbiAgICAgICAgICAgIDogcmV3cml0ZVNjaGVtYU5vZGUoZGVwZW5kZW5jeSwgYCR7a2V5d29yZFBhdGh9LiR7bmFtZX1gKSxcbiAgICAgICAgXSksXG4gICAgICApIGFzIEpzb25WYWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFSUkFZX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gY2hpbGQubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgICByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIGAke2tleXdvcmRQYXRofVske2luZGV4fV1gKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoU0lOR0xFX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiaXRlbXNcIiAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICByZXN1bHRba2V5d29yZF0gPSBjaGlsZC5tYXAoKHNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH1bJHtpbmRleH1dYCksXG4gICAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleXdvcmRdID0gcmV3cml0ZVNjaGVtYU5vZGUoY2hpbGQsIGtleXdvcmRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIEpzb25WYWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBdUJBLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLFdBQVc7QUFFbkMsSUFBYSw2QkFBYixjQUFnRCxNQUFNO0NBRzNDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLDRCQUE0QixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRmpELEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FB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
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//#region src/utils/providers/common/json-schema-keywords.ts
|
|
2
|
+
/**
|
|
3
|
+
* JSON Schema 하위 스키마 위치 목록 — qgrid 의 스키마 순회 3곳이 공유하는 단일 정본.
|
|
4
|
+
*
|
|
5
|
+
* - `tool-emulation-schema.rewriteSchemaNode`: 사용자 스키마의 local `$ref` 를 namespace 로 rebase
|
|
6
|
+
* - `strictifier.assertNormalizationCompatibility`: provider 표현 가능성 검사
|
|
7
|
+
* - `strictifier.strictifyNode`: strict 재작성
|
|
8
|
+
*
|
|
9
|
+
* 세 소비자가 각자 테이블을 들고 있으면 새 keyword 를 한쪽에만 추가하는 순간 조용히 어긋난다.
|
|
10
|
+
* 재작성 패스가 훑지 않는 위치의 `$ref` 는 rebase 되지 않은 채 남고, 검사 패스가 놓친 위치의
|
|
11
|
+
* tuple 은 정규화 없이 provider 로 샌다. 실제로 통합 전 `additionalItems` 가 그 상태였다.
|
|
12
|
+
* 위치 목록은 여기서만 관리한다.
|
|
13
|
+
*
|
|
14
|
+
* 왜 이런 순회가 필요한지는 스킬 문서 참고:
|
|
15
|
+
* packages/cli/skills/qgrid/references/tool-calling-and-multiturn.md
|
|
16
|
+
*
|
|
17
|
+
* 소비자별로 다른 것은 위치 목록이 아니라 **각 위치를 어떻게 다루는가** 이므로(strictifier 의
|
|
18
|
+
* `normalizable` 플래그 등) 그 판단은 각 소비자가 이 목록 위에 얹는다.
|
|
19
|
+
*/
|
|
20
|
+
/** 이름 → 하위 스키마 맵. 예: `properties`, `$defs`. */
|
|
21
|
+
const SCHEMA_MAP_KEYWORDS = [
|
|
22
|
+
"$defs",
|
|
23
|
+
"definitions",
|
|
24
|
+
"dependentSchemas",
|
|
25
|
+
"patternProperties",
|
|
26
|
+
"properties"
|
|
27
|
+
];
|
|
28
|
+
/** 하위 스키마 배열. 예: `anyOf`, `prefixItems`. */
|
|
29
|
+
const SCHEMA_ARRAY_KEYWORDS = [
|
|
30
|
+
"allOf",
|
|
31
|
+
"anyOf",
|
|
32
|
+
"oneOf",
|
|
33
|
+
"prefixItems"
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* 하위 스키마 하나를 직접 갖는 위치. `items` 와 `additionalItems` 는 Draft-7 tuple 형식에서
|
|
37
|
+
* 배열이 올 수 있으므로 소비자가 배열 분기를 따로 처리한다.
|
|
38
|
+
*/
|
|
39
|
+
const SCHEMA_SINGLE_KEYWORDS = [
|
|
40
|
+
"additionalItems",
|
|
41
|
+
"additionalProperties",
|
|
42
|
+
"contains",
|
|
43
|
+
"contentSchema",
|
|
44
|
+
"else",
|
|
45
|
+
"if",
|
|
46
|
+
"items",
|
|
47
|
+
"not",
|
|
48
|
+
"propertyNames",
|
|
49
|
+
"then",
|
|
50
|
+
"unevaluatedItems",
|
|
51
|
+
"unevaluatedProperties"
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Draft-7 `dependencies` 는 값이 스키마이거나 property 이름 배열이라 위 분류에 들어가지 않는다.
|
|
55
|
+
* 배열 형태는 스키마가 아니므로 순회 대상이 아니다.
|
|
56
|
+
*/
|
|
57
|
+
const SCHEMA_DEPENDENCIES_KEYWORD = "dependencies";
|
|
58
|
+
/**
|
|
59
|
+
* qgrid 가 거부하는 참조/식별 keyword.
|
|
60
|
+
*
|
|
61
|
+
* 사용자 스키마는 envelope 의 `$defs` 아래로 옮겨지고 정의는 전역적으로 정규화되므로, base URI 를
|
|
62
|
+
* 새로 선언하거나(`$id`) 런타임 스코프로 대상이 정해지는 참조(`$dynamicRef` 등)는 옮긴 뒤의 의미를
|
|
63
|
+
* 보장할 수 없다. 조용히 잘못 rebase 하는 대신 명시적으로 거부한다.
|
|
64
|
+
*/
|
|
65
|
+
const UNSUPPORTED_REFERENCE_KEYWORDS = [
|
|
66
|
+
"$id",
|
|
67
|
+
"id",
|
|
68
|
+
"$anchor",
|
|
69
|
+
"$dynamicAnchor",
|
|
70
|
+
"$recursiveAnchor",
|
|
71
|
+
"$dynamicRef",
|
|
72
|
+
"$recursiveRef"
|
|
73
|
+
];
|
|
74
|
+
//#endregion
|
|
75
|
+
export { SCHEMA_ARRAY_KEYWORDS, SCHEMA_DEPENDENCIES_KEYWORD, SCHEMA_MAP_KEYWORDS, SCHEMA_SINGLE_KEYWORDS, UNSUPPORTED_REFERENCE_KEYWORDS };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEta2V5d29yZHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vanNvbi1zY2hlbWEta2V5d29yZHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDtlZjsnIQg7Iqk7YKk66eIIOychOy5mCDrqqnroZ0g4oCUIHFncmlkIOydmCDsiqTtgqTrp4gg7Iic7ZqMIDPqs7PsnbQg6rO17Jyg7ZWY64qUIOuLqOydvCDsoJXrs7guXG4gKlxuICogIC0gYHRvb2wtZW11bGF0aW9uLXNjaGVtYS5yZXdyaXRlU2NoZW1hTm9kZWA6IOyCrOyaqeyekCDsiqTtgqTrp4jsnZggbG9jYWwgYCRyZWZgIOulvCBuYW1lc3BhY2Ug66GcIHJlYmFzZVxuICogIC0gYHN0cmljdGlmaWVyLmFzc2VydE5vcm1hbGl6YXRpb25Db21wYXRpYmlsaXR5YDogcHJvdmlkZXIg7ZGc7ZiEIOqwgOuKpeyEsSDqsoDsgqxcbiAqICAtIGBzdHJpY3RpZmllci5zdHJpY3RpZnlOb2RlYDogc3RyaWN0IOyerOyekeyEsVxuICpcbiAqIOyEuCDshozruYTsnpDqsIAg6rCB7J6QIO2FjOydtOu4lOydhCDrk6Tqs6Ag7J6I7Jy866m0IOyDiCBrZXl3b3JkIOulvCDtlZzsqr3sl5Drp4wg7LaU6rCA7ZWY64qUIOyInOqwhCDsobDsmqntnogg7Ja06riL64Kc64ukLlxuICog7J6s7J6R7ISxIO2MqOyKpOqwgCDtm5Hsp4Ag7JWK64qUIOychOy5mOydmCBgJHJlZmAg64qUIHJlYmFzZSDrkJjsp4Ag7JWK7J2AIOyxhCDrgqjqs6AsIOqygOyCrCDtjKjsiqTqsIAg64aT7LmcIOychOy5mOydmFxuICogdHVwbGUg7J2AIOygleq3nO2ZlCDsl4bsnbQgcHJvdmlkZXIg66GcIOyDjOuLpC4g7Iuk7KCc66GcIO2Gte2VqSDsoIQgYGFkZGl0aW9uYWxJdGVtc2Ag6rCAIOq3uCDsg4Htg5zsmIDri6QuXG4gKiDsnITsuZgg66qp66Gd7J2AIOyXrOq4sOyEnOunjCDqtIDrpqztlZzri6QuXG4gKlxuICog7JmcIOydtOufsCDsiJztmozqsIAg7ZWE7JqU7ZWc7KeA64qUIOyKpO2CrCDrrLjshJwg7LC46rOgOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqXG4gKiDshozruYTsnpDrs4TroZwg64uk66W4IOqyg+ydgCDsnITsuZgg66qp66Gd7J20IOyVhOuLiOudvCAqKuqwgSDsnITsuZjrpbwg7Ja065a76rKMIOuLpOujqOuKlOqwgCoqIOydtOuvgOuhnChzdHJpY3RpZmllciDsnZhcbiAqIGBub3JtYWxpemFibGVgIO2UjOuemOq3uCDrk7EpIOq3uCDtjJDri6jsnYAg6rCBIOyGjOu5hOyekOqwgCDsnbQg66qp66GdIOychOyXkCDslrnripTri6QuXG4gKi9cblxuLyoqIOydtOumhCDihpIg7ZWY7JyEIOyKpO2CpOuniCDrp7UuIOyYiDogYHByb3BlcnRpZXNgLCBgJGRlZnNgLiAqL1xuZXhwb3J0IGNvbnN0IFNDSEVNQV9NQVBfS0VZV09SRFMgPSBbXG4gIFwiJGRlZnNcIixcbiAgXCJkZWZpbml0aW9uc1wiLFxuICBcImRlcGVuZGVudFNjaGVtYXNcIixcbiAgXCJwYXR0ZXJuUHJvcGVydGllc1wiLFxuICBcInByb3BlcnRpZXNcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiDtlZjsnIQg7Iqk7YKk66eIIOuwsOyXtC4g7JiIOiBgYW55T2ZgLCBgcHJlZml4SXRlbXNgLiAqL1xuZXhwb3J0IGNvbnN0IFNDSEVNQV9BUlJBWV9LRVlXT1JEUyA9IFtcImFsbE9mXCIsIFwiYW55T2ZcIiwgXCJvbmVPZlwiLCBcInByZWZpeEl0ZW1zXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIO2VmOychCDsiqTtgqTrp4gg7ZWY64KY66W8IOyngeygkSDqsJbripQg7JyE7LmYLiBgaXRlbXNgIOyZgCBgYWRkaXRpb25hbEl0ZW1zYCDripQgRHJhZnQtNyB0dXBsZSDtmJXsi53sl5DshJxcbiAqIOuwsOyXtOydtCDsmKwg7IiYIOyeiOycvOuvgOuhnCDshozruYTsnpDqsIAg67Cw7Je0IOu2hOq4sOulvCDrlLDroZwg7LKY66as7ZWc64ukLlxuICovXG5leHBvcnQgY29uc3QgU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyA9IFtcbiAgXCJhZGRpdGlvbmFsSXRlbXNcIixcbiAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuICBcImNvbnRhaW5zXCIsXG4gIFwiY29udGVudFNjaGVtYVwiLFxuICBcImVsc2VcIixcbiAgXCJpZlwiLFxuICBcIml0ZW1zXCIsXG4gIFwibm90XCIsXG4gIFwicHJvcGVydHlOYW1lc1wiLFxuICBcInRoZW5cIixcbiAgXCJ1bmV2YWx1YXRlZEl0ZW1zXCIsXG4gIFwidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzXCIsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIERyYWZ0LTcgYGRlcGVuZGVuY2llc2Ag64qUIOqwkuydtCDsiqTtgqTrp4jsnbTqsbDrgpggcHJvcGVydHkg7J2066aEIOuwsOyXtOydtOudvCDsnIQg67aE66WY7JeQIOuTpOyWtOqwgOyngCDslYrripTri6QuXG4gKiDrsLDsl7Qg7ZiV7YOc64qUIOyKpO2CpOuniOqwgCDslYTri4jrr4DroZwg7Iic7ZqMIOuMgOyDgeydtCDslYTri4jri6QuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ0hFTUFfREVQRU5ERU5DSUVTX0tFWVdPUkQgPSBcImRlcGVuZGVuY2llc1wiO1xuXG4vKipcbiAqIHFncmlkIOqwgCDqsbDrtoDtlZjripQg7LC47KGwL+yLneuzhCBrZXl3b3JkLlxuICpcbiAqIOyCrOyaqeyekCDsiqTtgqTrp4jripQgZW52ZWxvcGUg7J2YIGAkZGVmc2Ag7JWE656Y66GcIOyYruqyqOyngOqzoCDsoJXsnZjripQg7KCE7Jet7KCB7Jy866GcIOygleq3nO2ZlOuQmOuvgOuhnCwgYmFzZSBVUkkg66W8XG4gKiDsg4jroZwg7ISg7Ja47ZWY6rGw64KYKGAkaWRgKSDrn7Dtg4DsnoQg7Iqk7L2U7ZSE66GcIOuMgOyDgeydtCDsoJXtlbTsp4DripQg7LC47KGwKGAkZHluYW1pY1JlZmAg65OxKeuKlCDsmK7quLQg65Kk7J2YIOydmOuvuOulvFxuICog67O07J6l7ZWgIOyImCDsl4bri6QuIOyhsOyaqe2eiCDsnpjrqrsgcmViYXNlIO2VmOuKlCDrjIDsi6Ag66qF7Iuc7KCB7Jy866GcIOqxsOu2gO2VnOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOU1VQUE9SVEVEX1JFRkVSRU5DRV9LRVlXT1JEUyA9IFtcbiAgXCIkaWRcIixcbiAgXCJpZFwiLFxuICBcIiRhbmNob3JcIixcbiAgXCIkZHluYW1pY0FuY2hvclwiLFxuICBcIiRyZWN1cnNpdmVBbmNob3JcIixcbiAgXCIkZHluYW1pY1JlZlwiLFxuICBcIiRyZWN1cnNpdmVSZWZcIixcbl0gYXMgY29uc3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLE1BQWEsc0JBQXNCO0NBQ2pDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRjs7QUFHQSxNQUFhLHdCQUF3QjtDQUFDO0NBQVM7Q0FBUztDQUFTO0FBQWE7Ozs7O0FBTTlFLE1BQWEseUJBQXlCO0NBQ3BDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGOzs7OztBQU1BLE1BQWEsOEJBQThCOzs7Ozs7OztBQVMzQyxNQUFhLGlDQUFpQztDQUM1QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGIn0=
|
|
@@ -1,4 +1,14 @@
|
|
|
1
|
+
import { SCHEMA_ARRAY_KEYWORDS, SCHEMA_MAP_KEYWORDS, SCHEMA_SINGLE_KEYWORDS, UNSUPPORTED_REFERENCE_KEYWORDS } from "./json-schema-keywords.js";
|
|
1
2
|
//#region src/utils/providers/common/strictifier.ts
|
|
3
|
+
/**
|
|
4
|
+
* JSON Schema → OpenAI strict JSON Schema 변환.
|
|
5
|
+
*
|
|
6
|
+
* OpenAI Responses API strict 모드 요구사항:
|
|
7
|
+
* - 모든 object 에 additionalProperties: false
|
|
8
|
+
* - 모든 object properties 를 required 에 포함
|
|
9
|
+
* - optional 필드 → anyOf [original, { type: 'null' }] 로 required 유지
|
|
10
|
+
* - recursive 처리 (nested objects, arrays, allOf/anyOf/oneOf)
|
|
11
|
+
*/
|
|
2
12
|
var StrictifierError = class extends Error {
|
|
3
13
|
path;
|
|
4
14
|
constructor(message, path) {
|
|
@@ -13,31 +23,33 @@ function strictify(schema, options = {}) {
|
|
|
13
23
|
if (options.provider === "openai" || options.provider === "anthropic") assertNormalizationCompatibility(result, options.provider);
|
|
14
24
|
return result;
|
|
15
25
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
[
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
/**
|
|
27
|
+
* 위치 목록은 json-schema-keywords 가 소유하고, 여기서는 각 위치의 `normalizable` 여부만 얹는다.
|
|
28
|
+
* normalizable=true 는 strictifyNode 가 그 위치를 실제로 재작성한다는 뜻이다. `not`/`if` 처럼
|
|
29
|
+
* 재작성하면 caller 의미가 바뀌는 위치는 false 이고, 그 아래 tuple/`$ref` 는 정규화 대신 거부된다.
|
|
30
|
+
*
|
|
31
|
+
* `items`/`additionalItems` 는 tuple 판정과 함께 다뤄야 해서 아래 순회에서 개별 처리한다.
|
|
32
|
+
*/
|
|
33
|
+
const NON_NORMALIZABLE_POSITIONS = /* @__PURE__ */ new Set([
|
|
34
|
+
"dependentSchemas",
|
|
35
|
+
"patternProperties",
|
|
36
|
+
"additionalProperties",
|
|
37
|
+
"contains",
|
|
38
|
+
"contentSchema",
|
|
39
|
+
"else",
|
|
40
|
+
"if",
|
|
41
|
+
"not",
|
|
42
|
+
"propertyNames",
|
|
43
|
+
"then",
|
|
44
|
+
"unevaluatedItems",
|
|
45
|
+
"unevaluatedProperties"
|
|
46
|
+
]);
|
|
47
|
+
function positionEntries(keywords) {
|
|
48
|
+
return keywords.map((keyword) => [keyword, !NON_NORMALIZABLE_POSITIONS.has(keyword)]);
|
|
49
|
+
}
|
|
50
|
+
const SCHEMA_SCAN_MAP_KEYWORDS = positionEntries(SCHEMA_MAP_KEYWORDS);
|
|
51
|
+
const SCHEMA_SCAN_ARRAY_KEYWORDS = positionEntries(SCHEMA_ARRAY_KEYWORDS);
|
|
52
|
+
const SCHEMA_SCAN_SINGLE_KEYWORDS = positionEntries(SCHEMA_SINGLE_KEYWORDS.filter((keyword) => keyword !== "items" && keyword !== "additionalItems"));
|
|
41
53
|
/**
|
|
42
54
|
* Inspect every JSON Schema-bearing position without rewriting it.
|
|
43
55
|
*
|
|
@@ -133,15 +145,6 @@ function assertNormalizationCompatibility(schema, provider) {
|
|
|
133
145
|
}
|
|
134
146
|
assertReferenceTargets(schema, references);
|
|
135
147
|
}
|
|
136
|
-
const UNSUPPORTED_REFERENCE_KEYWORDS = [
|
|
137
|
-
"$id",
|
|
138
|
-
"id",
|
|
139
|
-
"$anchor",
|
|
140
|
-
"$dynamicAnchor",
|
|
141
|
-
"$recursiveAnchor",
|
|
142
|
-
"$dynamicRef",
|
|
143
|
-
"$recursiveRef"
|
|
144
|
-
];
|
|
145
148
|
function assertUnsupportedReferenceKeywords(schema, path) {
|
|
146
149
|
for (const keyword of UNSUPPORTED_REFERENCE_KEYWORDS) if (Object.hasOwn(schema, keyword)) throw new StrictifierError(`${keyword} is not supported`, `${path}.${keyword}`);
|
|
147
150
|
}
|
|
@@ -216,24 +219,24 @@ function strictifyNode(node, path, provider) {
|
|
|
216
219
|
if (type === "array" || Object.hasOwn(result, "items") || Object.hasOwn(result, "prefixItems")) result = strictifyArray(result, path, provider);
|
|
217
220
|
return strictifySchemaArrays(result, path, provider);
|
|
218
221
|
}
|
|
219
|
-
const
|
|
222
|
+
const DEFINITION_MAP_KEYWORDS = ["$defs", "definitions"];
|
|
220
223
|
function strictifySchemaMaps(node, path, provider) {
|
|
221
224
|
const result = { ...node };
|
|
222
|
-
for (const keyword of
|
|
225
|
+
for (const keyword of DEFINITION_MAP_KEYWORDS) {
|
|
223
226
|
const schemas = ownValue(node, keyword);
|
|
224
227
|
if (!isSchemaObject(schemas)) continue;
|
|
225
228
|
result[keyword] = Object.fromEntries(Object.entries(schemas).map(([name, schema]) => [name, isSchemaObject(schema) ? strictifyNode(schema, `${path}.${keyword}.${name}`, provider) : schema]));
|
|
226
229
|
}
|
|
227
230
|
return result;
|
|
228
231
|
}
|
|
229
|
-
const
|
|
232
|
+
const COMBINATOR_KEYWORDS = [
|
|
230
233
|
"anyOf",
|
|
231
234
|
"oneOf",
|
|
232
235
|
"allOf"
|
|
233
236
|
];
|
|
234
237
|
function strictifySchemaArrays(node, path, provider) {
|
|
235
238
|
const result = { ...node };
|
|
236
|
-
for (const keyword of
|
|
239
|
+
for (const keyword of COMBINATOR_KEYWORDS) {
|
|
237
240
|
const schemas = ownValue(node, keyword);
|
|
238
241
|
if (!schemas) continue;
|
|
239
242
|
result[keyword] = schemas.map((schema, index) => strictifyNode(schema, `${path}.${keyword}[${index}]`, provider));
|
|
@@ -365,4 +368,4 @@ function makeNullable(schema) {
|
|
|
365
368
|
//#endregion
|
|
366
369
|
export { StrictifierError, strictify };
|
|
367
370
|
|
|
368
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWN0aWZpZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIgT3BlbkFJIHN0cmljdCBKU09OIFNjaGVtYSDrs4DtmZguXG4gKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgc3RyaWN0IOuqqOuTnCDsmpTqtazsgqztla06XG4gKiAgLSDrqqjrk6Agb2JqZWN0IOyXkCBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAqICAtIOuqqOuToCBvYmplY3QgcHJvcGVydGllcyDrpbwgcmVxdWlyZWQg7JeQIO2PrO2VqFxuICogIC0gb3B0aW9uYWwg7ZWE65OcIOKGkiBhbnlPZiBbb3JpZ2luYWwsIHsgdHlwZTogJ251bGwnIH1dIOuhnCByZXF1aXJlZCDsnKDsp4BcbiAqICAtIHJlY3Vyc2l2ZSDsspjrpqwgKG5lc3RlZCBvYmplY3RzLCBhcnJheXMsIGFsbE9mL2FueU9mL29uZU9mKVxuICovXG5cbmV4cG9ydCB0eXBlIEpzb25TY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpY3RpZmllck9wdGlvbnMge1xuICBwcm92aWRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN0cmljdGlmaWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihgc3RyaWN0aWZpZXI6ICR7bWVzc2FnZX0gKGF0ICR7cGF0aH0pYCk7XG4gICAgdGhpcy5uYW1lID0gXCJTdHJpY3RpZmllckVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdGlmeShzY2hlbWE6IEpzb25TY2hlbWEsIG9wdGlvbnM6IFN0cmljdGlmaWVyT3B0aW9ucyA9IHt9KTogSnNvblNjaGVtYSB7XG4gIGlmIChvcHRpb25zLnByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IG9wdGlvbnMucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eShzY2hlbWEsIG9wdGlvbnMucHJvdmlkZXIpO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHN0cmljdGlmeU5vZGUoc2NoZW1hLCBcIiRcIiwgb3B0aW9ucy5wcm92aWRlcik7XG4gIGlmIChvcHRpb25zLnByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IG9wdGlvbnMucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eShyZXN1bHQsIG9wdGlvbnMucHJvdmlkZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IFNDSEVNQV9TQ0FOX01BUF9LRVlXT1JEUyA9IFtcbiAgW1wiJGRlZnNcIiwgdHJ1ZV0sXG4gIFtcImRlZmluaXRpb25zXCIsIHRydWVdLFxuICBbXCJwcm9wZXJ0aWVzXCIsIHRydWVdLFxuICBbXCJkZXBlbmRlbnRTY2hlbWFzXCIsIGZhbHNlXSxcbiAgW1wicGF0dGVyblByb3BlcnRpZXNcIiwgZmFsc2VdLFxuXSBhcyBjb25zdDtcbmNvbnN0IFNDSEVNQV9TQ0FOX0FSUkFZX0tFWVdPUkRTID0gW1xuICBbXCJhbGxPZlwiLCB0cnVlXSxcbiAgW1wiYW55T2ZcIiwgdHJ1ZV0sXG4gIFtcIm9uZU9mXCIsIHRydWVdLFxuICBbXCJwcmVmaXhJdGVtc1wiLCB0cnVlXSxcbl0gYXMgY29uc3Q7XG5jb25zdCBTQ0hFTUFfU0NBTl9TSU5HTEVfS0VZV09SRFMgPSBbXG4gIFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIsIGZhbHNlXSxcbiAgW1wiY29udGFpbnNcIiwgZmFsc2VdLFxuICBbXCJjb250ZW50U2NoZW1hXCIsIGZhbHNlXSxcbiAgW1wiZWxzZVwiLCBmYWxzZV0sXG4gIFtcImlmXCIsIGZhbHNlXSxcbiAgW1wibm90XCIsIGZhbHNlXSxcbiAgW1wicHJvcGVydHlOYW1lc1wiLCBmYWxzZV0sXG4gIFtcInRoZW5cIiwgZmFsc2VdLFxuICBbXCJ1bmV2YWx1YXRlZEl0ZW1zXCIsIGZhbHNlXSxcbiAgW1widW5ldmFsdWF0ZWRQcm9wZXJ0aWVzXCIsIGZhbHNlXSxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogSW5zcGVjdCBldmVyeSBKU09OIFNjaGVtYS1iZWFyaW5nIHBvc2l0aW9uIHdpdGhvdXQgcmV3cml0aW5nIGl0LlxuICpcbiAqIFBvc2l0aXZlIHBvc2l0aW9ucyBhbHJlYWR5IHRyYXZlcnNlZCBieSBzdHJpY3RpZnlOb2RlIG1heSBub3JtYWxpemUgT3BlbkFJIHR1cGxlcy4gUG9zaXRpb25zXG4gKiBzdWNoIGFzIGBub3RgIGFuZCBgaWZgIGNhbm5vdCBiZSB0aWdodGVuZWQgd2l0aG91dCBjaGFuZ2luZyBjYWxsZXIgc2VtYW50aWNzLCBzbyBwb3NpdGlvbmFsXG4gKiB0dXBsZXMgdGhlcmUgZmFpbCBleHBsaWNpdGx5IGluc3RlYWQgb2YgbGVha2luZyBhbiB1bnN1cHBvcnRlZCBwcm92aWRlciBzY2hlbWEuIFJlZmVyZW5jZXNcbiAqIGZyb20gdGhvc2UgcG9zaXRpb25zIGFsc28gZmFpbCBiZWNhdXNlIHRoZWlyIGRlZmluaXRpb25zIGFyZSBub3JtYWxpemVkIGdsb2JhbGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eShcbiAgc2NoZW1hOiBKc29uU2NoZW1hLFxuICBwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsXG4pOiB2b2lkIHtcbiAgY29uc3QgcmVmZXJlbmNlczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT4gPSBbXTtcbiAgY29uc3Qgc3RhY2s6IEFycmF5PHsgbm9kZTogSnNvblNjaGVtYTsgcGF0aDogc3RyaW5nOyBub3JtYWxpemFibGU6IGJvb2xlYW4gfT4gPSBbXG4gICAgeyBub2RlOiBzY2hlbWEsIHBhdGg6IFwiJFwiLCBub3JtYWxpemFibGU6IHRydWUgfSxcbiAgXTtcblxuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdGFjay5wb3AoKSE7XG4gICAgY29uc3QgaXRlbXNWYWx1ZSA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJpdGVtc1wiKTtcbiAgICBjb25zdCBwcmVmaXhJdGVtc1ZhbHVlID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcInByZWZpeEl0ZW1zXCIpO1xuICAgIGNvbnN0IGxlZ2FjeVR1cGxlID0gQXJyYXkuaXNBcnJheShpdGVtc1ZhbHVlKTtcbiAgICBjb25zdCBwcmVmaXhUdXBsZSA9IEFycmF5LmlzQXJyYXkocHJlZml4SXRlbXNWYWx1ZSk7XG5cbiAgICBhc3NlcnRVbnN1cHBvcnRlZFJlZmVyZW5jZUtleXdvcmRzKGN1cnJlbnQubm9kZSwgY3VycmVudC5wYXRoKTtcbiAgICBjb2xsZWN0U2NoZW1hUmVmZXJlbmNlKGN1cnJlbnQsIHJlZmVyZW5jZXMpO1xuXG4gICAgaWYgKGxlZ2FjeVR1cGxlIHx8IHByZWZpeFR1cGxlKSB7XG4gICAgICBjb25zdCB0dXBsZSA9IChsZWdhY3lUdXBsZSA/IGl0ZW1zVmFsdWUgOiBwcmVmaXhJdGVtc1ZhbHVlKSBhcyB1bmtub3duW107XG4gICAgICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdHVwbGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgICBcInBvc2l0aW9uYWwgdHVwbGUgc2NoZW1hcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBBbnRocm9waWMgYmVjYXVzZSBDbGF1ZGUgQ29kZSBjYW5ub3QgcHJlc2VydmUgaXRlbSBwb3NpdGlvbnNcIixcbiAgICAgICAgICBjdXJyZW50LnBhdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIWN1cnJlbnQubm9ybWFsaXphYmxlKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICAgIFwicG9zaXRpb25hbCB0dXBsZSBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgc2NoZW1hIHBvc2l0aW9uXCIsXG4gICAgICAgICAgY3VycmVudC5wYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJ0eXBlXCIpICE9PSBcImFycmF5XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgICAgJ3Bvc2l0aW9uYWwgdHVwbGUgc2NoZW1hcyBtdXN0IGRlY2xhcmUgdHlwZSBcImFycmF5XCI7IGV4cHJlc3MgbnVsbGFibGUgdHVwbGVzIHdpdGggYW55T2YnLFxuICAgICAgICAgIGAke2N1cnJlbnQucGF0aH0udHlwZWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwga2V5d29yZE5vcm1hbGl6YWJsZV0gb2YgU0NIRU1BX1NDQU5fTUFQX0tFWVdPUkRTKSB7XG4gICAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBrZXl3b3JkKTtcbiAgICAgIGlmICghaXNTY2hlbWFPYmplY3Qoc2NoZW1hcykpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYXMpKSB7XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS4ke2tleXdvcmR9LiR7bmFtZX1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYga2V5d29yZE5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcImRlcGVuZGVuY2llc1wiKTtcbiAgICBpZiAoaXNTY2hlbWFPYmplY3QoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LmRlcGVuZGVuY2llcy4ke25hbWV9YCxcbiAgICAgICAgICBub3JtYWxpemFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCBrZXl3b3JkTm9ybWFsaXphYmxlXSBvZiBTQ0hFTUFfU0NBTl9BUlJBWV9LRVlXT1JEUykge1xuICAgICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwga2V5d29yZCk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIGNvbnRpbnVlO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjaGVtYXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gc2NoZW1hc1tpbmRleF07XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS4ke2tleXdvcmR9WyR7aW5kZXh9XWAsXG4gICAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSAmJiBrZXl3b3JkTm9ybWFsaXphYmxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpdGVtcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJpdGVtc1wiKTtcbiAgICBpZiAoaXNTY2hlbWFPYmplY3QoaXRlbXMpKSB7XG4gICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgbm9kZTogaXRlbXMsXG4gICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uaXRlbXNgLFxuICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9Lml0ZW1zWyR7aW5kZXh9XWAsXG4gICAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbEl0ZW1zID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcImFkZGl0aW9uYWxJdGVtc1wiKTtcbiAgICBpZiAoaXNTY2hlbWFPYmplY3QoYWRkaXRpb25hbEl0ZW1zKSkge1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGFkZGl0aW9uYWxJdGVtcyxcbiAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS5hZGRpdGlvbmFsSXRlbXNgLFxuICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGxlZ2FjeVR1cGxlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwga2V5d29yZE5vcm1hbGl6YWJsZV0gb2YgU0NIRU1BX1NDQU5fU0lOR0xFX0tFWVdPUkRTKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwga2V5d29yZCk7XG4gICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHtrZXl3b3JkfWAsXG4gICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYga2V5d29yZE5vcm1hbGl6YWJsZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzc2VydFJlZmVyZW5jZVRhcmdldHMoc2NoZW1hLCByZWZlcmVuY2VzKTtcbn1cblxuY29uc3QgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTID0gW1xuICBcIiRpZFwiLFxuICBcImlkXCIsXG4gIFwiJGFuY2hvclwiLFxuICBcIiRkeW5hbWljQW5jaG9yXCIsXG4gIFwiJHJlY3Vyc2l2ZUFuY2hvclwiLFxuICBcIiRkeW5hbWljUmVmXCIsXG4gIFwiJHJlY3Vyc2l2ZVJlZlwiLFxuXSBhcyBjb25zdDtcblxuZnVuY3Rpb24gYXNzZXJ0VW5zdXBwb3J0ZWRSZWZlcmVuY2VLZXl3b3JkcyhzY2hlbWE6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oc2NoZW1hLCBrZXl3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoYCR7a2V5d29yZH0gaXMgbm90IHN1cHBvcnRlZGAsIGAke3BhdGh9LiR7a2V5d29yZH1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFNjaGVtYVJlZmVyZW5jZShcbiAgY3VycmVudDogeyBub2RlOiBKc29uU2NoZW1hOyBwYXRoOiBzdHJpbmc7IG5vcm1hbGl6YWJsZTogYm9vbGVhbiB9LFxuICByZWZlcmVuY2VzOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9Pixcbik6IHZvaWQge1xuICBpZiAoIU9iamVjdC5oYXNPd24oY3VycmVudC5ub2RlLCBcIiRyZWZcIikpIHJldHVybjtcblxuICBjb25zdCByZWZlcmVuY2UgPSBjdXJyZW50Lm5vZGUuJHJlZjtcbiAgaWYgKHR5cGVvZiByZWZlcmVuY2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgbXVzdCBiZSBhIHN0cmluZ1wiLCBgJHtjdXJyZW50LnBhdGh9LiRyZWZgKTtcbiAgfVxuICBpZiAoIWN1cnJlbnQubm9ybWFsaXphYmxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcInNjaGVtYSByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgc2NoZW1hIHBvc2l0aW9uXCIsXG4gICAgICBjdXJyZW50LnBhdGgsXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW5jZXMucHVzaCh7IHZhbHVlOiByZWZlcmVuY2UsIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHJlZmAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFJlZmVyZW5jZVRhcmdldHMoXG4gIHJvb3Q6IEpzb25TY2hlbWEsXG4gIHJlZmVyZW5jZXM6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+LFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCB0b2tlbnMgPSBwYXJzZUxvY2FsSnNvblBvaW50ZXIocmVmZXJlbmNlLnZhbHVlLCByZWZlcmVuY2UucGF0aCk7XG4gICAgaWYgKCFpc0RlZmluaXRpb25Sb290UG9pbnRlcih0b2tlbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCIkcmVmIHRhcmdldCBtdXN0IGJlIHRoZSBkb2N1bWVudCByb290IG9yIGEgZGVmaW5pdGlvbiByb290XCIsXG4gICAgICAgIHJlZmVyZW5jZS5wYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmVzb2x2ZURlZmluaXRpb25Sb290KHJvb3QsIHRva2VucywgcmVmZXJlbmNlLnBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5pdGlvblJvb3RQb2ludGVyKHRva2Vuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAodG9rZW5zLmxlbmd0aCAlIDIgIT09IDApIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSBcIiRkZWZzXCIgJiYgdG9rZW5zW2luZGV4XSAhPT0gXCJkZWZpbml0aW9uc1wiKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTG9jYWxKc29uUG9pbnRlcihyZWZlcmVuY2U6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAocmVmZXJlbmNlID09PSBcIiNcIikgcmV0dXJuIFtdO1xuICBpZiAoIXJlZmVyZW5jZS5zdGFydHNXaXRoKFwiIy9cIikpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgIFwib25seSBsb2NhbCByb290LXJlbGF0aXZlIEpTT04gUG9pbnRlciAkcmVmIHZhbHVlcyBhcmUgc3VwcG9ydGVkXCIsXG4gICAgICBwYXRoLFxuICAgICk7XG4gIH1cblxuICBsZXQgZnJhZ21lbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBmcmFnbWVudCA9IGRlY29kZVVSSUNvbXBvbmVudChyZWZlcmVuY2Uuc2xpY2UoMSkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgY29udGFpbnMgaW52YWxpZCBwZXJjZW50IGVuY29kaW5nXCIsIHBhdGgpO1xuICB9XG4gIGlmICghZnJhZ21lbnQuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgIFwib25seSBsb2NhbCByb290LXJlbGF0aXZlIEpTT04gUG9pbnRlciAkcmVmIHZhbHVlcyBhcmUgc3VwcG9ydGVkXCIsXG4gICAgICBwYXRoLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZnJhZ21lbnRcbiAgICAuc2xpY2UoMSlcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLm1hcCgodG9rZW4pID0+IGRlY29kZUpzb25Qb2ludGVyVG9rZW4odG9rZW4sIHBhdGgpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb25Sb290KHJvb3Q6IEpzb25TY2hlbWEsIHRva2Vuczogc3RyaW5nW10sIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgY3VycmVudCA9IHJvb3Q7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCArPSAyKSB7XG4gICAgY29uc3Qga2V5d29yZCA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGNvbnN0IG5hbWUgPSB0b2tlbnNbaW5kZXggKyAxXSE7XG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSBvd25WYWx1ZShjdXJyZW50LCBrZXl3b3JkKTtcbiAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGRlZmluaXRpb25zKSB8fCAhT2JqZWN0Lmhhc093bihkZWZpbml0aW9ucywgbmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiJHJlZiBkb2VzIG5vdCByZXNvbHZlIGluc2lkZSB0aGUgY2FsbGVyIHNjaGVtYVwiLCBwYXRoKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZGVmaW5pdGlvbnNbbmFtZV07XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdCh0YXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0IHNjaGVtYVwiLCBwYXRoKTtcbiAgICB9XG4gICAgY3VycmVudCA9IHRhcmdldDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNvZGVKc29uUG9pbnRlclRva2VuKHJhd1Rva2VuOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB0b2tlbiA9IFwiXCI7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByYXdUb2tlbi5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSByYXdUb2tlbltpbmRleF0hO1xuICAgIGlmIChjaGFyYWN0ZXIgIT09IFwiflwiKSB7XG4gICAgICB0b2tlbiArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBlc2NhcGVkID0gcmF3VG9rZW5baW5kZXggKyAxXTtcbiAgICBpZiAoZXNjYXBlZCA9PT0gXCIwXCIpIHtcbiAgICAgIHRva2VuICs9IFwiflwiO1xuICAgIH0gZWxzZSBpZiAoZXNjYXBlZCA9PT0gXCIxXCIpIHtcbiAgICAgIHRva2VuICs9IFwiL1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgY29udGFpbnMgYW4gaW52YWxpZCBKU09OIFBvaW50ZXIgZXNjYXBlXCIsIHBhdGgpO1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICB9XG4gIHJldHVybiB0b2tlbjtcbn1cblxuZnVuY3Rpb24gc3RyaWN0aWZ5Tm9kZShub2RlOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcsIHByb3ZpZGVyPzogc3RyaW5nKTogSnNvblNjaGVtYSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIiB8fCBub2RlID09PSBudWxsKSByZXR1cm4gbm9kZTtcblxuICBjb25zdCBkaWFsZWN0TmV1dHJhbE5vZGUgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IG9taXRLZXlzKG5vZGUsIFtcIiRzY2hlbWFcIl0pIDogbm9kZTtcbiAgbGV0IHJlc3VsdCA9IHN0cmljdGlmeVNjaGVtYU1hcHMoZGlhbGVjdE5ldXRyYWxOb2RlLCBwYXRoLCBwcm92aWRlcik7XG4gIGNvbnN0IHR5cGUgPSBvd25WYWx1ZShyZXN1bHQsIFwidHlwZVwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgT2JqZWN0Lmhhc093bihyZXN1bHQsIFwicHJvcGVydGllc1wiKSkge1xuICAgIHJlc3VsdCA9IHN0cmljdGlmeU9iamVjdChyZXN1bHQsIHBhdGgsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIgfHwgT2JqZWN0Lmhhc093bihyZXN1bHQsIFwiaXRlbXNcIikgfHwgT2JqZWN0Lmhhc093bihyZXN1bHQsIFwicHJlZml4SXRlbXNcIikpIHtcbiAgICByZXN1bHQgPSBzdHJpY3RpZnlBcnJheShyZXN1bHQsIHBhdGgsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIHJldHVybiBzdHJpY3RpZnlTY2hlbWFBcnJheXMocmVzdWx0LCBwYXRoLCBwcm92aWRlcik7XG59XG5cbmNvbnN0IFNDSEVNQV9NQVBfS0VZV09SRFMgPSBbXCIkZGVmc1wiLCBcImRlZmluaXRpb25zXCJdIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBzdHJpY3RpZnlTY2hlbWFNYXBzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIFNDSEVNQV9NQVBfS0VZV09SRFMpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUobm9kZSwga2V5d29yZCk7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWFzKSkgY29udGludWU7XG5cbiAgICByZXN1bHRba2V5d29yZF0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKS5tYXAoKFtuYW1lLCBzY2hlbWFdKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlzU2NoZW1hT2JqZWN0KHNjaGVtYSlcbiAgICAgICAgICA/IHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS4ke2tleXdvcmR9LiR7bmFtZX1gLCBwcm92aWRlcilcbiAgICAgICAgICA6IHNjaGVtYSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBTQ0hFTUFfQVJSQVlfS0VZV09SRFMgPSBbXCJhbnlPZlwiLCBcIm9uZU9mXCIsIFwiYWxsT2ZcIl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIHN0cmljdGlmeVNjaGVtYUFycmF5cyhub2RlOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcsIHByb3ZpZGVyPzogc3RyaW5nKTogSnNvblNjaGVtYSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4ubm9kZSB9O1xuXG4gIGZvciAoY29uc3Qga2V5d29yZCBvZiBTQ0hFTUFfQVJSQVlfS0VZV09SRFMpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUobm9kZSwga2V5d29yZCk7XG4gICAgaWYgKCFzY2hlbWFzKSBjb250aW51ZTtcbiAgICByZXN1bHRba2V5d29yZF0gPSAoc2NoZW1hcyBhcyBKc29uU2NoZW1hW10pLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS4ke2tleXdvcmR9WyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaWN0aWZ5T2JqZWN0KG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IG93blZhbHVlKG5vZGUsIFwicHJvcGVydGllc1wiKSBhcyBSZWNvcmQ8c3RyaW5nLCBKc29uU2NoZW1hPiB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIHsgLi4ubm9kZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1JlcXVpcmVkID0gbmV3IFNldCgob3duVmFsdWUobm9kZSwgXCJyZXF1aXJlZFwiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW10pO1xuICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgY29uc3Qgc3RyaWN0UHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgYWxsS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNba2V5XSE7XG4gICAgICBjb25zdCBzdHJpY3RQcm9wID0gc3RyaWN0aWZ5Tm9kZShwcm9wLCBgJHtwYXRofS4ke2tleX1gLCBwcm92aWRlcik7XG5cbiAgICAgIHJldHVybiBba2V5LCBleGlzdGluZ1JlcXVpcmVkLmhhcyhrZXkpID8gc3RyaWN0UHJvcCA6IG1ha2VOdWxsYWJsZShzdHJpY3RQcm9wKV07XG4gICAgfSksXG4gICkgYXMgUmVjb3JkPHN0cmluZywgSnNvblNjaGVtYT47XG5cbiAgY29uc3QgcmVzdWx0OiBKc29uU2NoZW1hID0ge1xuICAgIC4uLm5vZGUsXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiBzdHJpY3RQcm9wcyxcbiAgICByZXF1aXJlZDogYWxsS2V5cyxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgVU5SRUFDSEFCTEVfVFVQTEVfVEFJTF9TQ0hFTUE6IEpzb25TY2hlbWEgPSB7IHR5cGU6IFwic3RyaW5nXCIgfTtcblxuZnVuY3Rpb24gc3RyaWN0aWZ5QXJyYXkobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBpZiAoXG4gICAgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSAmJlxuICAgIChBcnJheS5pc0FycmF5KG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIikpIHx8IEFycmF5LmlzQXJyYXkob3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSkpXG4gICkge1xuICAgIHJldHVybiBub3JtYWxpemVUdXBsZShub2RlLCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7IC4uLm5vZGUgfTtcbiAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShub2RlLCBcIml0ZW1zXCIpIGFzIEpzb25TY2hlbWEgfCBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgcmVzdWx0Lml0ZW1zID0gaXRlbXMubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIGAke3BhdGh9Lml0ZW1zWyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQuaXRlbXMgPSBzdHJpY3RpZnlOb2RlKGl0ZW1zLCBgJHtwYXRofS5pdGVtc2AsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSBhcyBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKSkge1xuICAgIHJlc3VsdC5wcmVmaXhJdGVtcyA9IHByZWZpeEl0ZW1zLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS5wcmVmaXhJdGVtc1ske2luZGV4fV1gLCBwcm92aWRlciksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICBwYXRoOiBzdHJpbmcsXG4gIHByb3ZpZGVyOiBcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIixcbik6IEpzb25TY2hlbWEge1xuICBjb25zdCBpdGVtcyA9IG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIik7XG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgY29uc3QgbGVnYWN5VHVwbGUgPSBBcnJheS5pc0FycmF5KGl0ZW1zKTtcbiAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKTtcbiAgaWYgKGxlZ2FjeVR1cGxlICYmIHByZWZpeFR1cGxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJpdGVtcyBhbmQgcHJlZml4SXRlbXMgdHVwbGUgZm9ybXMgY2Fubm90IGJlIGNvbWJpbmVkXCIsIHBhdGgpO1xuICB9XG4gIGlmIChwcmVmaXhUdXBsZSAmJiBPYmplY3QuaGFzT3duKG5vZGUsIFwiYWRkaXRpb25hbEl0ZW1zXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJhZGRpdGlvbmFsSXRlbXMgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggcHJlZml4SXRlbXNcIiwgcGF0aCk7XG4gIH1cblxuICBjb25zdCByYXdUdXBsZSA9IChsZWdhY3lUdXBsZSA/IGl0ZW1zIDogcHJlZml4SXRlbXMpIGFzIHVua25vd25bXTtcbiAgY29uc3QgdHVwbGVQYXRoID0gbGVnYWN5VHVwbGUgPyBgJHtwYXRofS5pdGVtc2AgOiBgJHtwYXRofS5wcmVmaXhJdGVtc2A7XG4gIGNvbnN0IHR1cGxlID0gcmF3VHVwbGUubWFwKChzY2hlbWEsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJib29sZWFuIGFuZCBub24tb2JqZWN0IHR1cGxlIG1lbWJlciBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkXCIsXG4gICAgICAgIGAke3R1cGxlUGF0aH1bJHtpbmRleH1dYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlclBhdGggPSBgJHt0dXBsZVBhdGh9WyR7aW5kZXh9XWA7XG4gICAgY29uc3QgbWVtYmVyID0gc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIG1lbWJlclBhdGgsIHByb3ZpZGVyKTtcbiAgICBpZiAoIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludChtZW1iZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJ0dXBsZSBtZW1iZXIgbXVzdCBkZWZpbmUgYSBwcm92aWRlci1yZXByZXNlbnRhYmxlIHNjaGVtYVwiLFxuICAgICAgICBtZW1iZXJQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbWJlcjtcbiAgfSk7XG5cbiAgY29uc3QgcmF3VGFpbCA9IGxlZ2FjeVR1cGxlID8gb3duVmFsdWUobm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIikgOiBpdGVtcztcbiAgaWYgKHJhd1RhaWwgPT09IHRydWUpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcImFuIHVucmVzdHJpY3RlZCB0dXBsZSByZXN0IGlzIG5vdCBzdXBwb3J0ZWRcIiwgcGF0aCk7XG4gIH1cbiAgaWYgKHJhd1RhaWwgIT09IHVuZGVmaW5lZCAmJiByYXdUYWlsICE9PSBmYWxzZSAmJiAhaXNTY2hlbWFPYmplY3QocmF3VGFpbCkpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcInR1cGxlIHJlc3QgbXVzdCBiZSBhbiBvYmplY3Qgc2NoZW1hIG9yIGZhbHNlXCIsIHBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGFpbCA9IGlzU2NoZW1hT2JqZWN0KHJhd1RhaWwpXG4gICAgPyBzdHJpY3RpZnlOb2RlKHJhd1RhaWwsIGxlZ2FjeVR1cGxlID8gYCR7cGF0aH0uYWRkaXRpb25hbEl0ZW1zYCA6IGAke3BhdGh9Lml0ZW1zYCwgcHJvdmlkZXIpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGlmICh0YWlsICE9PSB1bmRlZmluZWQgJiYgIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludCh0YWlsKSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiYW4gdW5yZXN0cmljdGVkIHR1cGxlIHJlc3QgaXMgbm90IHN1cHBvcnRlZFwiLCBwYXRoKTtcbiAgfVxuICBjb25zdCB0YWlsTW9kZSA9IHRhaWwgIT09IHVuZGVmaW5lZCA/IFwidHlwZWRcIiA6IHJhd1RhaWwgPT09IGZhbHNlID8gXCJjbG9zZWRcIiA6IFwiaW1wbGljaXRcIjtcbiAgY29uc3QgYm91bmRzID0gbm9ybWFsaXplVHVwbGVCb3VuZHMobm9kZSwgdHVwbGUubGVuZ3RoLCB0YWlsTW9kZSwgcGF0aCk7XG4gIGNvbnN0IGJhc2UgPSBvbWl0S2V5cyhub2RlLCBbXCJpdGVtc1wiLCBcInByZWZpeEl0ZW1zXCIsIFwiYWRkaXRpb25hbEl0ZW1zXCIsIFwibWluSXRlbXNcIiwgXCJtYXhJdGVtc1wiXSk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eSDqsIAg67mE7Ja0IOyeiOyngCDslYrsnYAgdHVwbGUg7J2EIOydtOuvuCDqsbDrtoDtlojsnLzrr4DroZxcbiAgLy8g7Jes6riwIOuPhOuLrO2VmOuKlCB0dXBsZSDsnYAg67mIIHR1cGxlIOu/kOydtOqzoCwg6re4IOqyveyasCBwcmVmaXhJdGVtcyBzcHJlYWQg64qUIOyekOyXsO2eiCDsg53rnrXrkJzri6Qg4oCUXG4gIC8vIHByb3ZpZGVyIOu2hOq4sCDsl4bsnbQg7ZWcIO2Yle2DnOuhnCDrkZAgcHJvdmlkZXIg66qo65GQ66W8IO2RnO2YhO2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLih0dXBsZS5sZW5ndGggPiAwID8geyBwcmVmaXhJdGVtczogdHVwbGUgfSA6IHt9KSxcbiAgICBpdGVtczogdGFpbCA/PyBVTlJFQUNIQUJMRV9UVVBMRV9UQUlMX1NDSEVNQSxcbiAgICAuLi5ib3VuZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlQm91bmRzKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICB0dXBsZUxlbmd0aDogbnVtYmVyLFxuICB0YWlsTW9kZTogXCJ0eXBlZFwiIHwgXCJjbG9zZWRcIiB8IFwiaW1wbGljaXRcIixcbiAgcGF0aDogc3RyaW5nLFxuKTogeyBtaW5JdGVtczogbnVtYmVyOyBtYXhJdGVtcz86IG51bWJlciB9IHtcbiAgY29uc3QgY2FsbGVyTWluSXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtaW5JdGVtc1wiKSwgXCJtaW5JdGVtc1wiLCBwYXRoKTtcbiAgY29uc3QgY2FsbGVyTWF4SXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtYXhJdGVtc1wiKSwgXCJtYXhJdGVtc1wiLCBwYXRoKTtcbiAgaWYgKHRhaWxNb2RlID09PSBcImltcGxpY2l0XCIgJiYgY2FsbGVyTWF4SXRlbXMgIT09IHVuZGVmaW5lZCAmJiBjYWxsZXJNYXhJdGVtcyA+IHR1cGxlTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcImltcGxpY2l0IHR1cGxlIHJlc3QgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdoZW4gbWF4SXRlbXMgZXhjZWVkcyB0aGUgdHVwbGUgbGVuZ3RoXCIsXG4gICAgICBwYXRoLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtaW5JdGVtcyA9IGNhbGxlck1pbkl0ZW1zID8/IChjYWxsZXJNYXhJdGVtcyA9PT0gdW5kZWZpbmVkID8gdHVwbGVMZW5ndGggOiAwKTtcbiAgY29uc3QgbWF4SXRlbXMgPVxuICAgIHRhaWxNb2RlID09PSBcInR5cGVkXCIgPyBjYWxsZXJNYXhJdGVtcyA6IE1hdGgubWluKGNhbGxlck1heEl0ZW1zID8/IHR1cGxlTGVuZ3RoLCB0dXBsZUxlbmd0aCk7XG5cbiAgaWYgKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgJiYgbWluSXRlbXMgPiBtYXhJdGVtcykge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwidHVwbGUgbWluSXRlbXMgY2Fubm90IGV4Y2VlZCBtYXhJdGVtc1wiLCBwYXRoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWluSXRlbXMsXG4gICAgLi4uKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgPyB7IG1heEl0ZW1zIH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGludGVnZXJCb3VuZCh2YWx1ZTogdW5rbm93biwga2V5d29yZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgKHZhbHVlIGFzIG51bWJlcikgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoYCR7a2V5d29yZH0gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBzYWZlIGludGVnZXJgLCBwYXRoKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBpc1NjaGVtYU9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25TY2hlbWEge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gb3duVmFsdWUoc2NoZW1hOiBKc29uU2NoZW1hLCBrZXl3b3JkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oc2NoZW1hLCBrZXl3b3JkKSA/IHNjaGVtYVtrZXl3b3JkXSA6IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgUFJPVklERVJfU0NIRU1BX0VOVFJZX1BPSU5UX0tFWVdPUkRTID0gbmV3IFNldChbXG4gIFwidHlwZVwiLFxuICBcIiRyZWZcIixcbiAgXCJwcm9wZXJ0aWVzXCIsXG4gIFwiYW55T2ZcIixcbiAgXCJvbmVPZlwiLFxuICBcImFsbE9mXCIsXG5dKTtcblxuZnVuY3Rpb24gaGFzUHJvdmlkZXJTY2hlbWFFbnRyeVBvaW50KHNjaGVtYTogSnNvblNjaGVtYSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5zb21lKChrZXkpID0+IFBST1ZJREVSX1NDSEVNQV9FTlRSWV9QT0lOVF9LRVlXT1JEUy5oYXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIG9taXRLZXlzKG5vZGU6IEpzb25TY2hlbWEsIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogSnNvblNjaGVtYSB7XG4gIGNvbnN0IG9taXR0ZWQgPSBuZXcgU2V0KGtleXMpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5vZGUpLmZpbHRlcigoW2tleV0pID0+ICFvbWl0dGVkLmhhcyhrZXkpKSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VOdWxsYWJsZShzY2hlbWE6IEpzb25TY2hlbWEpOiBKc29uU2NoZW1hIHtcbiAgaWYgKG93blZhbHVlKHNjaGVtYSwgXCJ0eXBlXCIpID09PSBcIm51bGxcIikgcmV0dXJuIHNjaGVtYTtcblxuICBjb25zdCBhbnlPZiA9IG93blZhbHVlKHNjaGVtYSwgXCJhbnlPZlwiKTtcbiAgaWYgKGFueU9mKSB7XG4gICAgY29uc3QgdmFyaWFudHMgPSBhbnlPZiBhcyBKc29uU2NoZW1hW107XG4gICAgY29uc3QgaGFzTnVsbCA9IHZhcmlhbnRzLnNvbWUoKHYpID0+IG93blZhbHVlKHYsIFwidHlwZVwiKSA9PT0gXCJudWxsXCIpO1xuICAgIGlmIChoYXNOdWxsKSByZXR1cm4gc2NoZW1hO1xuICAgIHJldHVybiB7IGFueU9mOiBbLi4udmFyaWFudHMsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbiAgfVxuXG4gIGNvbnN0IG9uZU9mID0gb3duVmFsdWUoc2NoZW1hLCBcIm9uZU9mXCIpO1xuICBpZiAob25lT2YpIHtcbiAgICBjb25zdCB2YXJpYW50cyA9IG9uZU9mIGFzIEpzb25TY2hlbWFbXTtcbiAgICBjb25zdCBoYXNOdWxsID0gdmFyaWFudHMuc29tZSgodikgPT4gb3duVmFsdWUodiwgXCJ0eXBlXCIpID09PSBcIm51bGxcIik7XG4gICAgaWYgKGhhc051bGwpIHJldHVybiBzY2hlbWE7XG4gICAgcmV0dXJuIHsgb25lT2Y6IFsuLi52YXJpYW50cywgeyB0eXBlOiBcIm51bGxcIiB9XSB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYW55T2Y6IFtzY2hlbWEsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQWdCQSxJQUFhLG1CQUFiLGNBQXNDLE1BQU07Q0FHakM7Q0FGVCxZQUNFLFNBQ0EsTUFDQTtFQUNBLE1BQU0sZ0JBQWdCLFFBQVEsT0FBTyxLQUFLLEVBQUU7RUFGckMsS0FBQSxPQUFBO0VBR1AsS0FBSyxPQUFPO0NBQ2Q7QUFDRjtBQUVBLFNBQWdCLFVBQVUsUUFBb0IsVUFBOEIsQ0FBQyxHQUFlO0NBQzFGLElBQUksUUFBUSxhQUFhLFlBQVksUUFBUSxhQUFhLGFBQ3hELGlDQUFpQyxRQUFRLFFBQVEsUUFBUTtDQUUzRCxNQUFNLFNBQVMsY0FBYyxRQUFRLEtBQUssUUFBUSxRQUFRO0NBQzFELElBQUksUUFBUSxhQUFhLFlBQVksUUFBUSxhQUFhLGFBQ3hELGlDQUFpQyxRQUFRLFFBQVEsUUFBUTtDQUUzRCxPQUFPO0FBQ1Q7QUFFQSxNQUFNLDJCQUEyQjtDQUMvQixDQUFDLFNBQVMsSUFBSTtDQUNkLENBQUMsZUFBZSxJQUFJO0NBQ3BCLENBQUMsY0FBYyxJQUFJO0NBQ25CLENBQUMsb0JBQW9CLEtBQUs7Q0FDMUIsQ0FBQyxxQkFBcUIsS0FBSztBQUM3QjtBQUNBLE1BQU0sNkJBQTZCO0NBQ2pDLENBQUMsU0FBUyxJQUFJO0NBQ2QsQ0FBQyxTQUFTLElBQUk7Q0FDZCxDQUFDLFNBQVMsSUFBSTtDQUNkLENBQUMsZUFBZSxJQUFJO0FBQ3RCO0FBQ0EsTUFBTSw4QkFBOEI7Q0FDbEMsQ0FBQyx3QkFBd0IsS0FBSztDQUM5QixDQUFDLFlBQVksS0FBSztDQUNsQixDQUFDLGlCQUFpQixLQUFLO0NBQ3ZCLENBQUMsUUFBUSxLQUFLO0NBQ2QsQ0FBQyxNQUFNLEtBQUs7Q0FDWixDQUFDLE9BQU8sS0FBSztDQUNiLENBQUMsaUJBQWlCLEtBQUs7Q0FDdkIsQ0FBQyxRQUFRLEtBQUs7Q0FDZCxDQUFDLG9CQUFvQixLQUFLO0NBQzFCLENBQUMseUJBQXlCLEtBQUs7QUFDakM7Ozs7Ozs7OztBQVVBLFNBQVMsaUNBQ1AsUUFDQSxVQUNNO0NBQ04sTUFBTSxhQUFxRCxDQUFDO0NBQzVELE1BQU0sUUFBMEUsQ0FDOUU7RUFBRSxNQUFNO0VBQVEsTUFBTTtFQUFLLGNBQWM7Q0FBSyxDQUNoRDtDQUVBLE9BQU8sTUFBTSxTQUFTLEdBQUc7RUFDdkIsTUFBTSxVQUFVLE1BQU0sSUFBSTtFQUMxQixNQUFNLGFBQWEsU0FBUyxRQUFRLE1BQU0sT0FBTztFQUNqRCxNQUFNLG1CQUFtQixTQUFTLFFBQVEsTUFBTSxhQUFhO0VBQzdELE1BQU0sY0FBYyxNQUFNLFFBQVEsVUFBVTtFQUM1QyxNQUFNLGNBQWMsTUFBTSxRQUFRLGdCQUFnQjtFQUVsRCxtQ0FBbUMsUUFBUSxNQUFNLFFBQVEsSUFBSTtFQUM3RCx1QkFBdUIsU0FBUyxVQUFVO0VBRTFDLElBQUksZUFBZSxhQUFhO0dBRTlCLElBQUksYUFBYSxnQkFERixjQUFjLGFBQWEsaUJBQ1YsQ0FBTSxTQUFTLEdBQzdDLE1BQU0sSUFBSSxpQkFDUiw4R0FDQSxRQUFRLElBQ1Y7R0FFRixJQUFJLENBQUMsUUFBUSxjQUNYLE1BQU0sSUFBSSxpQkFDUixzRUFDQSxRQUFRLElBQ1Y7R0FFRixJQUFJLFNBQVMsUUFBUSxNQUFNLE1BQU0sTUFBTSxTQUNyQyxNQUFNLElBQUksaUJBQ1IsNEZBQ0EsR0FBRyxRQUFRLEtBQUssTUFDbEI7RUFFSjtFQUVBLEtBQUssTUFBTSxDQUFDLFNBQVMsd0JBQXdCLDBCQUEwQjtHQUNyRSxNQUFNLFVBQVUsU0FBUyxRQUFRLE1BQU0sT0FBTztHQUM5QyxJQUFJLENBQUMsZUFBZSxPQUFPLEdBQUc7R0FDOUIsS0FBSyxNQUFNLENBQUMsTUFBTSxVQUFVLE9BQU8sUUFBUSxPQUFPLEdBQUc7SUFDbkQsSUFBSSxDQUFDLGVBQWUsS0FBSyxHQUFHO0lBQzVCLE1BQU0sS0FBSztLQUNULE1BQU07S0FDTixNQUFNLEdBQUcsUUFBUSxLQUFLLEdBQUcsUUFBUSxHQUFHO0tBQ3BDLGNBQWMsUUFBUSxnQkFBZ0I7SUFDeEMsQ0FBQztHQUNIO0VBQ0Y7RUFFQSxNQUFNLGVBQWUsU0FBUyxRQUFRLE1BQU0sY0FBYztFQUMxRCxJQUFJLGVBQWUsWUFBWSxHQUM3QixLQUFLLE1BQU0sQ0FBQyxNQUFNLFVBQVUsT0FBTyxRQUFRLFlBQVksR0FBRztHQUN4RCxJQUFJLENBQUMsZUFBZSxLQUFLLEdBQUc7R0FDNUIsTUFBTSxLQUFLO0lBQ1QsTUFBTTtJQUNOLE1BQU0sR0FBRyxRQUFRLEtBQUssZ0JBQWdCO0lBQ3RDLGNBQWM7R0FDaEIsQ0FBQztFQUNIO0VBR0YsS0FBSyxNQUFNLENBQUMsU0FBUyx3QkFBd0IsNEJBQTRCO0dBQ3ZFLE1BQU0sVUFBVSxTQUFTLFFBQVEsTUFBTSxPQUFPO0dBQzlDLElBQUksQ0FBQyxNQUFNLFFBQVEsT0FBTyxHQUFHO0dBQzdCLEtBQUssSUFBSSxRQUFRLEdBQUcsUUFBUSxRQUFRLFFBQVEsU0FBUyxHQUFHO0lBQ3RELE1BQU0sUUFBUSxRQUFRO0lBQ3RCLElBQUksQ0FBQyxlQUFlLEtBQUssR0FBRztJQUM1QixNQUFNLEtBQUs7S0FDVCxNQUFNO0tBQ04sTUFBTSxHQUFHLFFBQVEsS0FBSyxHQUFHLFFBQVEsR0FBRyxNQUFNO0tBQzFDLGNBQWMsUUFBUSxnQkFBZ0I7SUFDeEMsQ0FBQztHQUNIO0VBQ0Y7RUFFQSxNQUFNLFFBQVEsU0FBUyxRQUFRLE1BQU0sT0FBTztFQUM1QyxJQUFJLGVBQWUsS0FBSyxHQUN0QixNQUFNLEtBQUs7R0FDVCxNQUFNO0dBQ04sTUFBTSxHQUFHLFFBQVEsS0FBSztHQUN0QixjQUFjLFFBQVE7RUFDeEIsQ0FBQztPQUNJLElBQUksTUFBTSxRQUFRLEtBQUssR0FDNUIsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLE1BQU0sUUFBUSxTQUFTLEdBQUc7R0FDcEQsTUFBTSxRQUFRLE1BQU07R0FDcEIsSUFBSSxDQUFDLGVBQWUsS0FBSyxHQUFHO0dBQzVCLE1BQU0sS0FBSztJQUNULE1BQU07SUFDTixNQUFNLEdBQUcsUUFBUSxLQUFLLFNBQVMsTUFBTTtJQUNyQyxjQUFjLFFBQVE7R0FDeEIsQ0FBQztFQUNIO0VBR0YsTUFBTSxrQkFBa0IsU0FBUyxRQUFRLE1BQU0saUJBQWlCO0VBQ2hFLElBQUksZUFBZSxlQUFlLEdBQ2hDLE1BQU0sS0FBSztHQUNULE1BQU07R0FDTixNQUFNLEdBQUcsUUFBUSxLQUFLO0dBQ3RCLGNBQWMsUUFBUSxnQkFBZ0I7RUFDeEMsQ0FBQztFQUdILEtBQUssTUFBTSxDQUFDLFNBQVMsd0JBQXdCLDZCQUE2QjtHQUN4RSxNQUFNLFFBQVEsU0FBUyxRQUFRLE1BQU0sT0FBTztHQUM1QyxJQUFJLENBQUMsZUFBZSxLQUFLLEdBQUc7R0FDNUIsTUFBTSxLQUFLO0lBQ1QsTUFBTTtJQUNOLE1BQU0sR0FBRyxRQUFRLEtBQUssR0FBRztJQUN6QixjQUFjLFFBQVEsZ0JBQWdCO0dBQ3hDLENBQUM7RUFDSDtDQUNGO0NBRUEsdUJBQXVCLFFBQVEsVUFBVTtBQUMzQztBQUVBLE1BQU0saUNBQWlDO0NBQ3JDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0FBQ0Y7QUFFQSxTQUFTLG1DQUFtQyxRQUFvQixNQUFvQjtDQUNsRixLQUFLLE1BQU0sV0FBVyxnQ0FDcEIsSUFBSSxPQUFPLE9BQU8sUUFBUSxPQUFPLEdBQy9CLE1BQU0sSUFBSSxpQkFBaUIsR0FBRyxRQUFRLG9CQUFvQixHQUFHLEtBQUssR0FBRyxTQUFTO0FBR3BGO0FBRUEsU0FBUyx1QkFDUCxTQUNBLFlBQ007Q0FDTixJQUFJLENBQUMsT0FBTyxPQUFPLFFBQVEsTUFBTSxNQUFNLEdBQUc7Q0FFMUMsTUFBTSxZQUFZLFFBQVEsS0FBSztDQUMvQixJQUFJLE9BQU8sY0FBYyxVQUN2QixNQUFNLElBQUksaUJBQWlCLHlCQUF5QixHQUFHLFFBQVEsS0FBSyxNQUFNO0NBRTVFLElBQUksQ0FBQyxRQUFRLGNBQ1gsTUFBTSxJQUFJLGlCQUNSLCtEQUNBLFFBQVEsSUFDVjtDQUdGLFdBQVcsS0FBSztFQUFFLE9BQU87RUFBVyxNQUFNLEdBQUcsUUFBUSxLQUFLO0NBQU8sQ0FBQztBQUNwRTtBQUVBLFNBQVMsdUJBQ1AsTUFDQSxZQUNNO0NBQ04sS0FBSyxNQUFNLGFBQWEsWUFBWTtFQUNsQyxNQUFNLFNBQVMsc0JBQXNCLFVBQVUsT0FBTyxVQUFVLElBQUk7RUFDcEUsSUFBSSxDQUFDLHdCQUF3QixNQUFNLEdBQ2pDLE1BQU0sSUFBSSxpQkFDUiw4REFDQSxVQUFVLElBQ1o7RUFFRixzQkFBc0IsTUFBTSxRQUFRLFVBQVUsSUFBSTtDQUNwRDtBQUNGO0FBRUEsU0FBUyx3QkFBd0IsUUFBMkI7Q0FDMUQsSUFBSSxPQUFPLFdBQVcsR0FBRyxPQUFPO0NBQ2hDLElBQUksT0FBTyxTQUFTLE1BQU0sR0FBRyxPQUFPO0NBRXBDLEtBQUssSUFBSSxRQUFRLEdBQUcsUUFBUSxPQUFPLFFBQVEsU0FBUyxHQUNsRCxJQUFJLE9BQU8sV0FBVyxXQUFXLE9BQU8sV0FBVyxlQUFlLE9BQU87Q0FFM0UsT0FBTztBQUNUO0FBRUEsU0FBUyxzQkFBc0IsV0FBbUIsTUFBd0I7Q0FDeEUsSUFBSSxjQUFjLEtBQUssT0FBTyxDQUFDO0NBQy9CLElBQUksQ0FBQyxVQUFVLFdBQVcsSUFBSSxHQUM1QixNQUFNLElBQUksaUJBQ1IsbUVBQ0EsSUFDRjtDQUdGLElBQUk7Q0FDSixJQUFJO0VBQ0YsV0FBVyxtQkFBbUIsVUFBVSxNQUFNLENBQUMsQ0FBQztDQUNsRCxRQUFRO0VBQ04sTUFBTSxJQUFJLGlCQUFpQiwwQ0FBMEMsSUFBSTtDQUMzRTtDQUNBLElBQUksQ0FBQyxTQUFTLFdBQVcsR0FBRyxHQUMxQixNQUFNLElBQUksaUJBQ1IsbUVBQ0EsSUFDRjtDQUdGLE9BQU8sU0FDSixNQUFNLENBQUMsQ0FBQyxDQUNSLE1BQU0sR0FBRyxDQUFDLENBQ1YsS0FBSyxVQUFVLHVCQUF1QixPQUFPLElBQUksQ0FBQztBQUN2RDtBQUVBLFNBQVMsc0JBQXNCLE1BQWtCLFFBQWtCLE1BQW9CO0NBQ3JGLElBQUksVUFBVTtDQUNkLEtBQUssSUFBSSxRQUFRLEdBQUcsUUFBUSxPQUFPLFFBQVEsU0FBUyxHQUFHO0VBQ3JELE1BQU0sVUFBVSxPQUFPO0VBQ3ZCLE1BQU0sT0FBTyxPQUFPLFFBQVE7RUFDNUIsTUFBTSxjQUFjLFNBQVMsU0FBUyxPQUFPO0VBQzdDLElBQUksQ0FBQyxlQUFlLFdBQVcsS0FBSyxDQUFDLE9BQU8sT0FBTyxhQUFhLElBQUksR0FDbEUsTUFBTSxJQUFJLGlCQUFpQixrREFBa0QsSUFBSTtFQUVuRixNQUFNLFNBQVMsWUFBWTtFQUMzQixJQUFJLENBQUMsZUFBZSxNQUFNLEdBQ3hCLE1BQU0sSUFBSSxpQkFBaUIsd0NBQXdDLElBQUk7RUFFekUsVUFBVTtDQUNaO0FBQ0Y7QUFFQSxTQUFTLHVCQUF1QixVQUFrQixNQUFzQjtDQUN0RSxJQUFJLFFBQVE7Q0FDWixLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsU0FBUyxRQUFRLFNBQVMsR0FBRztFQUN2RCxNQUFNLFlBQVksU0FBUztFQUMzQixJQUFJLGNBQWMsS0FBSztHQUNyQixTQUFTO0dBQ1Q7RUFDRjtFQUVBLE1BQU0sVUFBVSxTQUFTLFFBQVE7RUFDakMsSUFBSSxZQUFZLEtBQ2QsU0FBUztPQUNKLElBQUksWUFBWSxLQUNyQixTQUFTO09BRVQsTUFBTSxJQUFJLGlCQUFpQixnREFBZ0QsSUFBSTtFQUVqRixTQUFTO0NBQ1g7Q0FDQSxPQUFPO0FBQ1Q7QUFFQSxTQUFTLGNBQWMsTUFBa0IsTUFBYyxVQUErQjtDQUNwRixJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTSxPQUFPO0NBR3RELElBQUksU0FBUyxvQkFEYyxhQUFhLFdBQVcsU0FBUyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFDNUIsTUFBTSxRQUFRO0NBQ25FLE1BQU0sT0FBTyxTQUFTLFFBQVEsTUFBTTtDQUVwQyxJQUFJLFNBQVMsWUFBWSxPQUFPLE9BQU8sUUFBUSxZQUFZLEdBQ3pELFNBQVMsZ0JBQWdCLFFBQVEsTUFBTSxRQUFRO0NBR2pELElBQUksU0FBUyxXQUFXLE9BQU8sT0FBTyxRQUFRLE9BQU8sS0FBSyxPQUFPLE9BQU8sUUFBUSxhQUFhLEdBQzNGLFNBQVMsZUFBZSxRQUFRLE1BQU0sUUFBUTtDQUdoRCxPQUFPLHNCQUFzQixRQUFRLE1BQU0sUUFBUTtBQUNyRDtBQUVBLE1BQU0sc0JBQXNCLENBQUMsU0FBUyxhQUFhO0FBRW5ELFNBQVMsb0JBQW9CLE1BQWtCLE1BQWMsVUFBK0I7Q0FDMUYsTUFBTSxTQUFTLEVBQUUsR0FBRyxLQUFLO0NBRXpCLEtBQUssTUFBTSxXQUFXLHFCQUFxQjtFQUN6QyxNQUFNLFVBQVUsU0FBUyxNQUFNLE9BQU87RUFDdEMsSUFBSSxDQUFDLGVBQWUsT0FBTyxHQUFHO0VBRTlCLE9BQU8sV0FBVyxPQUFPLFlBQ3ZCLE9BQU8sUUFBUSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxZQUFZLENBQzlDLE1BQ0EsZUFBZSxNQUFNLElBQ2pCLGNBQWMsUUFBUSxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQUcsUUFBUSxRQUFRLElBQzVELE1BQ04sQ0FBQyxDQUNIO0NBQ0Y7Q0FFQSxPQUFPO0FBQ1Q7QUFFQSxNQUFNLHdCQUF3QjtDQUFDO0NBQVM7Q0FBUztBQUFPO0FBRXhELFNBQVMsc0JBQXNCLE1BQWtCLE1BQWMsVUFBK0I7Q0FDNUYsTUFBTSxTQUFTLEVBQUUsR0FBRyxLQUFLO0NBRXpCLEtBQUssTUFBTSxXQUFXLHVCQUF1QjtFQUMzQyxNQUFNLFVBQVUsU0FBUyxNQUFNLE9BQU87RUFDdEMsSUFBSSxDQUFDLFNBQVM7RUFDZCxPQUFPLFdBQVksUUFBeUIsS0FBSyxRQUFRLFVBQ3ZELGNBQWMsUUFBUSxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FDaEU7Q0FDRjtDQUVBLE9BQU87QUFDVDtBQUVBLFNBQVMsZ0JBQWdCLE1BQWtCLE1BQWMsVUFBK0I7Q0FDdEYsTUFBTSxhQUFhLFNBQVMsTUFBTSxZQUFZO0NBQzlDLElBQUksQ0FBQyxZQUNILE9BQU87RUFBRSxHQUFHO0VBQU0sc0JBQXNCO0NBQU07Q0FHaEQsTUFBTSxtQkFBbUIsSUFBSSxJQUFLLFNBQVMsTUFBTSxVQUFVLEtBQThCLENBQUMsQ0FBQztDQUMzRixNQUFNLFVBQVUsT0FBTyxLQUFLLFVBQVU7Q0FFdEMsTUFBTSxjQUFjLE9BQU8sWUFDekIsUUFBUSxLQUFLLFFBQVE7RUFDbkIsTUFBTSxPQUFPLFdBQVc7RUFDeEIsTUFBTSxhQUFhLGNBQWMsTUFBTSxHQUFHLEtBQUssR0FBRyxPQUFPLFFBQVE7RUFFakUsT0FBTyxDQUFDLEtBQUssaUJBQWlCLElBQUksR0FBRyxJQUFJLGFBQWEsYUFBYSxVQUFVLENBQUM7Q0FDaEYsQ0FBQyxDQUNIO0NBVUEsT0FBTztFQVBMLEdBQUc7RUFDSCxNQUFNO0VBQ04sWUFBWTtFQUNaLFVBQVU7RUFDVixzQkFBc0I7Q0FHakI7QUFDVDtBQUVBLE1BQU0sZ0NBQTRDLEVBQUUsTUFBTSxTQUFTO0FBRW5FLFNBQVMsZUFBZSxNQUFrQixNQUFjLFVBQStCO0NBQ3JGLEtBQ0csYUFBYSxZQUFZLGFBQWEsaUJBQ3RDLE1BQU0sUUFBUSxTQUFTLE1BQU0sT0FBTyxDQUFDLEtBQUssTUFBTSxRQUFRLFNBQVMsTUFBTSxhQUFhLENBQUMsSUFFdEYsT0FBTyxlQUFlLE1BQU0sTUFBTSxRQUFRO0NBRzVDLE1BQU0sU0FBUyxFQUFFLEdBQUcsS0FBSztDQUN6QixNQUFNLFFBQVEsU0FBUyxNQUFNLE9BQU87Q0FFcEMsSUFBSSxNQUFNLFFBQVEsS0FBSyxHQUNyQixPQUFPLFFBQVEsTUFBTSxLQUFLLFFBQVEsVUFDaEMsY0FBYyxRQUFRLEdBQUcsS0FBSyxTQUFTLE1BQU0sSUFBSSxRQUFRLENBQzNEO01BQ0ssSUFBSSxVQUFVLFFBQ25CLE9BQU8sUUFBUSxjQUFjLE9BQU8sR0FBRyxLQUFLLFNBQVMsUUFBUTtDQUcvRCxNQUFNLGNBQWMsU0FBUyxNQUFNLGFBQWE7Q0FDaEQsSUFBSSxNQUFNLFFBQVEsV0FBVyxHQUMzQixPQUFPLGNBQWMsWUFBWSxLQUFLLFFBQVEsVUFDNUMsY0FBYyxRQUFRLEdBQUcsS0FBSyxlQUFlLE1BQU0sSUFBSSxRQUFRLENBQ2pFO0NBR0YsT0FBTztBQUNUO0FBRUEsU0FBUyxlQUNQLE1BQ0EsTUFDQSxVQUNZO0NBQ1osTUFBTSxRQUFRLFNBQVMsTUFBTSxPQUFPO0NBQ3BDLE1BQU0sY0FBYyxTQUFTLE1BQU0sYUFBYTtDQUNoRCxNQUFNLGNBQWMsTUFBTSxRQUFRLEtBQUs7Q0FDdkMsTUFBTSxjQUFjLE1BQU0sUUFBUSxXQUFXO0NBQzdDLElBQUksZUFBZSxhQUNqQixNQUFNLElBQUksaUJBQWlCLHdEQUF3RCxJQUFJO0NBRXpGLElBQUksZUFBZSxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsR0FDdEQsTUFBTSxJQUFJLGlCQUFpQix1REFBdUQsSUFBSTtDQUd4RixNQUFNLFdBQVksY0FBYyxRQUFRO0NBQ3hDLE1BQU0sWUFBWSxjQUFjLEdBQUcsS0FBSyxVQUFVLEdBQUcsS0FBSztDQUMxRCxNQUFNLFFBQVEsU0FBUyxLQUFLLFFBQVEsVUFBVTtFQUM1QyxJQUFJLENBQUMsZUFBZSxNQUFNLEdBQ3hCLE1BQU0sSUFBSSxpQkFDUixpRUFDQSxHQUFHLFVBQVUsR0FBRyxNQUFNLEVBQ3hCO0VBRUYsTUFBTSxhQUFhLEdBQUcsVUFBVSxHQUFHLE1BQU07RUFDekMsTUFBTSxTQUFTLGNBQWMsUUFBUSxZQUFZLFFBQVE7RUFDekQsSUFBSSxDQUFDLDRCQUE0QixNQUFNLEdBQ3JDLE1BQU0sSUFBSSxpQkFDUiw0REFDQSxVQUNGO0VBRUYsT0FBTztDQUNULENBQUM7Q0FFRCxNQUFNLFVBQVUsY0FBYyxTQUFTLE1BQU0saUJBQWlCLElBQUk7Q0FDbEUsSUFBSSxZQUFZLE1BQ2QsTUFBTSxJQUFJLGlCQUFpQiwrQ0FBK0MsSUFBSTtDQUVoRixJQUFJLFlBQVksVUFBYSxZQUFZLFNBQVMsQ0FBQyxlQUFlLE9BQU8sR0FDdkUsTUFBTSxJQUFJLGlCQUFpQixnREFBZ0QsSUFBSTtDQUdqRixNQUFNLE9BQU8sZUFBZSxPQUFPLElBQy9CLGNBQWMsU0FBUyxjQUFjLEdBQUcsS0FBSyxvQkFBb0IsR0FBRyxLQUFLLFNBQVMsUUFBUSxJQUMxRjtDQUNKLElBQUksU0FBUyxVQUFhLENBQUMsNEJBQTRCLElBQUksR0FDekQsTUFBTSxJQUFJLGlCQUFpQiwrQ0FBK0MsSUFBSTtDQUVoRixNQUFNLFdBQVcsU0FBUyxTQUFZLFVBQVUsWUFBWSxRQUFRLFdBQVc7Q0FDL0UsTUFBTSxTQUFTLHFCQUFxQixNQUFNLE1BQU0sUUFBUSxVQUFVLElBQUk7Q0FNdEUsT0FBTztFQUNMLEdBTlcsU0FBUyxNQUFNO0dBQUM7R0FBUztHQUFlO0dBQW1CO0dBQVk7RUFBVSxDQU16RjtFQUNILEdBQUksTUFBTSxTQUFTLElBQUksRUFBRSxhQUFhLE1BQU0sSUFBSSxDQUFDO0VBQ2pELE9BQU8sUUFBUTtFQUNmLEdBQUc7Q0FDTDtBQUNGO0FBRUEsU0FBUyxxQkFDUCxNQUNBLGFBQ0EsVUFDQSxNQUN5QztDQUN6QyxNQUFNLGlCQUFpQixhQUFhLFNBQVMsTUFBTSxVQUFVLEdBQUcsWUFBWSxJQUFJO0NBQ2hGLE1BQU0saUJBQWlCLGFBQWEsU0FBUyxNQUFNLFVBQVUsR0FBRyxZQUFZLElBQUk7Q0FDaEYsSUFBSSxhQUFhLGNBQWMsbUJBQW1CLFVBQWEsaUJBQWlCLGFBQzlFLE1BQU0sSUFBSSxpQkFDUixvRkFDQSxJQUNGO0NBR0YsTUFBTSxXQUFXLG1CQUFtQixtQkFBbUIsU0FBWSxjQUFjO0NBQ2pGLE1BQU0sV0FDSixhQUFhLFVBQVUsaUJBQWlCLEtBQUssSUFBSSxrQkFBa0IsYUFBYSxXQUFXO0NBRTdGLElBQUksYUFBYSxVQUFhLFdBQVcsVUFDdkMsTUFBTSxJQUFJLGlCQUFpQix5Q0FBeUMsSUFBSTtDQUcxRSxPQUFPO0VBQ0w7RUFDQSxHQUFJLGFBQWEsU0FBWSxFQUFFLFNBQVMsSUFBSSxDQUFDO0NBQy9DO0FBQ0Y7QUFFQSxTQUFTLGFBQWEsT0FBZ0IsU0FBaUIsTUFBa0M7Q0FDdkYsSUFBSSxVQUFVLFFBQVcsT0FBTztDQUNoQyxJQUFJLENBQUMsT0FBTyxjQUFjLEtBQUssS0FBTSxRQUFtQixHQUN0RCxNQUFNLElBQUksaUJBQWlCLEdBQUcsUUFBUSx1Q0FBdUMsSUFBSTtDQUVuRixPQUFPO0FBQ1Q7QUFFQSxTQUFTLGVBQWUsT0FBcUM7Q0FDM0QsT0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUM1RTtBQUVBLFNBQVMsU0FBUyxRQUFvQixTQUEwQjtDQUM5RCxPQUFPLE9BQU8sT0FBTyxRQUFRLE9BQU8sSUFBSSxPQUFPLFdBQVc7QUFDNUQ7QUFFQSxNQUFNLHVEQUF1QyxJQUFJLElBQUk7Q0FDbkQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUVELFNBQVMsNEJBQTRCLFFBQTZCO0NBQ2hFLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLE1BQU0sUUFBUSxxQ0FBcUMsSUFBSSxHQUFHLENBQUM7QUFDeEY7QUFFQSxTQUFTLFNBQVMsTUFBa0IsTUFBcUM7Q0FDdkUsTUFBTSxVQUFVLElBQUksSUFBSSxJQUFJO0NBQzVCLE9BQU8sT0FBTyxZQUFZLE9BQU8sUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyRjtBQUVBLFNBQVMsYUFBYSxRQUFnQztDQUNwRCxJQUFJLFNBQVMsUUFBUSxNQUFNLE1BQU0sUUFBUSxPQUFPO0NBRWhELE1BQU0sUUFBUSxTQUFTLFFBQVEsT0FBTztDQUN0QyxJQUFJLE9BQU87RUFDVCxNQUFNLFdBQVc7RUFFakIsSUFEZ0IsU0FBUyxNQUFNLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxNQUN6RCxHQUFTLE9BQU87RUFDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQyxFQUFFO0NBQ2xEO0NBRUEsTUFBTSxRQUFRLFNBQVMsUUFBUSxPQUFPO0NBQ3RDLElBQUksT0FBTztFQUNULE1BQU0sV0FBVztFQUVqQixJQURnQixTQUFTLE1BQU0sTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLE1BQ3pELEdBQVMsT0FBTztFQUNwQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDLEVBQUU7Q0FDbEQ7Q0FFQSxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQyxFQUFFO0FBQzdDIn0=
|
|
371
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWN0aWZpZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIgT3BlbkFJIHN0cmljdCBKU09OIFNjaGVtYSDrs4DtmZguXG4gKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgc3RyaWN0IOuqqOuTnCDsmpTqtazsgqztla06XG4gKiAgLSDrqqjrk6Agb2JqZWN0IOyXkCBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAqICAtIOuqqOuToCBvYmplY3QgcHJvcGVydGllcyDrpbwgcmVxdWlyZWQg7JeQIO2PrO2VqFxuICogIC0gb3B0aW9uYWwg7ZWE65OcIOKGkiBhbnlPZiBbb3JpZ2luYWwsIHsgdHlwZTogJ251bGwnIH1dIOuhnCByZXF1aXJlZCDsnKDsp4BcbiAqICAtIHJlY3Vyc2l2ZSDsspjrpqwgKG5lc3RlZCBvYmplY3RzLCBhcnJheXMsIGFsbE9mL2FueU9mL29uZU9mKVxuICovXG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX01BUF9LRVlXT1JEUyxcbiAgU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyxcbiAgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTLFxufSBmcm9tIFwiLi9qc29uLXNjaGVtYS1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgdHlwZSBKc29uU2NoZW1hID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWN0aWZpZXJPcHRpb25zIHtcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpY3RpZmllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHBhdGg6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoYHN0cmljdGlmaWVyOiAke21lc3NhZ2V9IChhdCAke3BhdGh9KWApO1xuICAgIHRoaXMubmFtZSA9IFwiU3RyaWN0aWZpZXJFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RpZnkoc2NoZW1hOiBKc29uU2NoZW1hLCBvcHRpb25zOiBTdHJpY3RpZmllck9wdGlvbnMgPSB7fSk6IEpzb25TY2hlbWEge1xuICBpZiAob3B0aW9ucy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBvcHRpb25zLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkoc2NoZW1hLCBvcHRpb25zLnByb3ZpZGVyKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBzdHJpY3RpZnlOb2RlKHNjaGVtYSwgXCIkXCIsIG9wdGlvbnMucHJvdmlkZXIpO1xuICBpZiAob3B0aW9ucy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBvcHRpb25zLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkocmVzdWx0LCBvcHRpb25zLnByb3ZpZGVyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIOychOy5mCDrqqnroZ3snYAganNvbi1zY2hlbWEta2V5d29yZHMg6rCAIOyGjOycoO2VmOqzoCwg7Jes6riw7ISc64qUIOqwgSDsnITsuZjsnZggYG5vcm1hbGl6YWJsZWAg7Jes67aA66eMIOyWueuKlOuLpC5cbiAqIG5vcm1hbGl6YWJsZT10cnVlIOuKlCBzdHJpY3RpZnlOb2RlIOqwgCDqt7gg7JyE7LmY66W8IOyLpOygnOuhnCDsnqzsnpHshLHtlZzri6TripQg65y77J2064ukLiBgbm90YC9gaWZgIOyymOufvFxuICog7J6s7J6R7ISx7ZWY66m0IGNhbGxlciDsnZjrr7jqsIAg67CU64CM64qUIOychOy5mOuKlCBmYWxzZSDsnbTqs6AsIOq3uCDslYTrnpggdHVwbGUvYCRyZWZgIOuKlCDsoJXqt5ztmZQg64yA7IugIOqxsOu2gOuQnOuLpC5cbiAqXG4gKiBgaXRlbXNgL2BhZGRpdGlvbmFsSXRlbXNgIOuKlCB0dXBsZSDtjJDsoJXqs7wg7ZWo6ruYIOuLpOukhOyVvCDtlbTshJwg7JWE656YIOyInO2ajOyXkOyEnCDqsJzrs4Qg7LKY66as7ZWc64ukLlxuICovXG5jb25zdCBOT05fTk9STUFMSVpBQkxFX1BPU0lUSU9OUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIFwiZGVwZW5kZW50U2NoZW1hc1wiLFxuICBcInBhdHRlcm5Qcm9wZXJ0aWVzXCIsXG4gIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIixcbiAgXCJjb250YWluc1wiLFxuICBcImNvbnRlbnRTY2hlbWFcIixcbiAgXCJlbHNlXCIsXG4gIFwiaWZcIixcbiAgXCJub3RcIixcbiAgXCJwcm9wZXJ0eU5hbWVzXCIsXG4gIFwidGhlblwiLFxuICBcInVuZXZhbHVhdGVkSXRlbXNcIixcbiAgXCJ1bmV2YWx1YXRlZFByb3BlcnRpZXNcIixcbl0pO1xuXG5mdW5jdGlvbiBwb3NpdGlvbkVudHJpZXMoa2V5d29yZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBib29sZWFuXT4ge1xuICByZXR1cm4ga2V5d29yZHMubWFwKChrZXl3b3JkKSA9PiBba2V5d29yZCwgIU5PTl9OT1JNQUxJWkFCTEVfUE9TSVRJT05TLmhhcyhrZXl3b3JkKV0gYXMgY29uc3QpO1xufVxuXG5jb25zdCBTQ0hFTUFfU0NBTl9NQVBfS0VZV09SRFMgPSBwb3NpdGlvbkVudHJpZXMoU0NIRU1BX01BUF9LRVlXT1JEUyk7XG5jb25zdCBTQ0hFTUFfU0NBTl9BUlJBWV9LRVlXT1JEUyA9IHBvc2l0aW9uRW50cmllcyhTQ0hFTUFfQVJSQVlfS0VZV09SRFMpO1xuLy8gaXRlbXMvYWRkaXRpb25hbEl0ZW1zIOuKlCB0dXBsZSDrtoTquLDsl5DshJwg7KeB7KCRIOuLpOujqOuvgOuhnCDri6jsnbwg7JyE7LmYIOyKpOy6lOyXkOyEnCDsoJzsmbjtlZzri6QuXG5jb25zdCBTQ0hFTUFfU0NBTl9TSU5HTEVfS0VZV09SRFMgPSBwb3NpdGlvbkVudHJpZXMoXG4gIFNDSEVNQV9TSU5HTEVfS0VZV09SRFMuZmlsdGVyKChrZXl3b3JkKSA9PiBrZXl3b3JkICE9PSBcIml0ZW1zXCIgJiYga2V5d29yZCAhPT0gXCJhZGRpdGlvbmFsSXRlbXNcIiksXG4pO1xuXG4vKipcbiAqIEluc3BlY3QgZXZlcnkgSlNPTiBTY2hlbWEtYmVhcmluZyBwb3NpdGlvbiB3aXRob3V0IHJld3JpdGluZyBpdC5cbiAqXG4gKiBQb3NpdGl2ZSBwb3NpdGlvbnMgYWxyZWFkeSB0cmF2ZXJzZWQgYnkgc3RyaWN0aWZ5Tm9kZSBtYXkgbm9ybWFsaXplIE9wZW5BSSB0dXBsZXMuIFBvc2l0aW9uc1xuICogc3VjaCBhcyBgbm90YCBhbmQgYGlmYCBjYW5ub3QgYmUgdGlnaHRlbmVkIHdpdGhvdXQgY2hhbmdpbmcgY2FsbGVyIHNlbWFudGljcywgc28gcG9zaXRpb25hbFxuICogdHVwbGVzIHRoZXJlIGZhaWwgZXhwbGljaXRseSBpbnN0ZWFkIG9mIGxlYWtpbmcgYW4gdW5zdXBwb3J0ZWQgcHJvdmlkZXIgc2NoZW1hLiBSZWZlcmVuY2VzXG4gKiBmcm9tIHRob3NlIHBvc2l0aW9ucyBhbHNvIGZhaWwgYmVjYXVzZSB0aGVpciBkZWZpbml0aW9ucyBhcmUgbm9ybWFsaXplZCBnbG9iYWxseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkoXG4gIHNjaGVtYTogSnNvblNjaGVtYSxcbiAgcHJvdmlkZXI6IFwib3BlbmFpXCIgfCBcImFudGhyb3BpY1wiLFxuKTogdm9pZCB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+ID0gW107XG4gIGNvbnN0IHN0YWNrOiBBcnJheTx7IG5vZGU6IEpzb25TY2hlbWE7IHBhdGg6IHN0cmluZzsgbm9ybWFsaXphYmxlOiBib29sZWFuIH0+ID0gW1xuICAgIHsgbm9kZTogc2NoZW1hLCBwYXRoOiBcIiRcIiwgbm9ybWFsaXphYmxlOiB0cnVlIH0sXG4gIF07XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIGNvbnN0IGl0ZW1zVmFsdWUgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwiaXRlbXNcIik7XG4gICAgY29uc3QgcHJlZml4SXRlbXNWYWx1ZSA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgICBjb25zdCBsZWdhY3lUdXBsZSA9IEFycmF5LmlzQXJyYXkoaXRlbXNWYWx1ZSk7XG4gICAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zVmFsdWUpO1xuXG4gICAgYXNzZXJ0VW5zdXBwb3J0ZWRSZWZlcmVuY2VLZXl3b3JkcyhjdXJyZW50Lm5vZGUsIGN1cnJlbnQucGF0aCk7XG4gICAgY29sbGVjdFNjaGVtYVJlZmVyZW5jZShjdXJyZW50LCByZWZlcmVuY2VzKTtcblxuICAgIGlmIChsZWdhY3lUdXBsZSB8fCBwcmVmaXhUdXBsZSkge1xuICAgICAgY29uc3QgdHVwbGUgPSAobGVnYWN5VHVwbGUgPyBpdGVtc1ZhbHVlIDogcHJlZml4SXRlbXNWYWx1ZSkgYXMgdW5rbm93bltdO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiICYmIHR1cGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgICAgXCJwb3NpdGlvbmFsIHR1cGxlIHNjaGVtYXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gQW50aHJvcGljIGJlY2F1c2UgQ2xhdWRlIENvZGUgY2Fubm90IHByZXNlcnZlIGl0ZW0gcG9zaXRpb25zXCIsXG4gICAgICAgICAgY3VycmVudC5wYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCFjdXJyZW50Lm5vcm1hbGl6YWJsZSkge1xuICAgICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgICBcInBvc2l0aW9uYWwgdHVwbGUgc2NoZW1hcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHNjaGVtYSBwb3NpdGlvblwiLFxuICAgICAgICAgIGN1cnJlbnQucGF0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwidHlwZVwiKSAhPT0gXCJhcnJheVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICAgICdwb3NpdGlvbmFsIHR1cGxlIHNjaGVtYXMgbXVzdCBkZWNsYXJlIHR5cGUgXCJhcnJheVwiOyBleHByZXNzIG51bGxhYmxlIHR1cGxlcyB3aXRoIGFueU9mJyxcbiAgICAgICAgICBgJHtjdXJyZW50LnBhdGh9LnR5cGVgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGtleXdvcmROb3JtYWxpemFibGVdIG9mIFNDSEVNQV9TQ0FOX01BUF9LRVlXT1JEUykge1xuICAgICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwga2V5d29yZCk7XG4gICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KHNjaGVtYXMpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWFzKSkge1xuICAgICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHtrZXl3b3JkfS4ke25hbWV9YCxcbiAgICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJkZXBlbmRlbmNpZXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS5kZXBlbmRlbmNpZXMuJHtuYW1lfWAsXG4gICAgICAgICAgbm9ybWFsaXphYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwga2V5d29yZE5vcm1hbGl6YWJsZV0gb2YgU0NIRU1BX1NDQU5fQVJSQVlfS0VZV09SRFMpIHtcbiAgICAgIGNvbnN0IHNjaGVtYXMgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIGtleXdvcmQpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSBjb250aW51ZTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY2hlbWFzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHNjaGVtYXNbaW5kZXhdO1xuICAgICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHtrZXl3b3JkfVske2luZGV4fV1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYga2V5d29yZE5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwiaXRlbXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGl0ZW1zKSkge1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGl0ZW1zLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9Lml0ZW1zYCxcbiAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBpdGVtc1tpbmRleF07XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS5pdGVtc1ske2luZGV4fV1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxJdGVtcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICBub2RlOiBhZGRpdGlvbmFsSXRlbXMsXG4gICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uYWRkaXRpb25hbEl0ZW1zYCxcbiAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSAmJiBsZWdhY3lUdXBsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGtleXdvcmROb3JtYWxpemFibGVdIG9mIFNDSEVNQV9TQ0FOX1NJTkdMRV9LRVlXT1JEUykge1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIGtleXdvcmQpO1xuICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiR7a2V5d29yZH1gLFxuICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NlcnRSZWZlcmVuY2VUYXJnZXRzKHNjaGVtYSwgcmVmZXJlbmNlcyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuc3VwcG9ydGVkUmVmZXJlbmNlS2V5d29yZHMoc2NoZW1hOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIFVOU1VQUE9SVEVEX1JFRkVSRU5DRV9LRVlXT1JEUykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHNjaGVtYSwga2V5d29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKGAke2tleXdvcmR9IGlzIG5vdCBzdXBwb3J0ZWRgLCBgJHtwYXRofS4ke2tleXdvcmR9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTY2hlbWFSZWZlcmVuY2UoXG4gIGN1cnJlbnQ6IHsgbm9kZTogSnNvblNjaGVtYTsgcGF0aDogc3RyaW5nOyBub3JtYWxpemFibGU6IGJvb2xlYW4gfSxcbiAgcmVmZXJlbmNlczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT4sXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGN1cnJlbnQubm9kZSwgXCIkcmVmXCIpKSByZXR1cm47XG5cbiAgY29uc3QgcmVmZXJlbmNlID0gY3VycmVudC5ub2RlLiRyZWY7XG4gIGlmICh0eXBlb2YgcmVmZXJlbmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIG11c3QgYmUgYSBzdHJpbmdcIiwgYCR7Y3VycmVudC5wYXRofS4kcmVmYCk7XG4gIH1cbiAgaWYgKCFjdXJyZW50Lm5vcm1hbGl6YWJsZSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgXCJzY2hlbWEgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHNjaGVtYSBwb3NpdGlvblwiLFxuICAgICAgY3VycmVudC5wYXRoLFxuICAgICk7XG4gIH1cblxuICByZWZlcmVuY2VzLnB1c2goeyB2YWx1ZTogcmVmZXJlbmNlLCBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiRyZWZgIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWZlcmVuY2VUYXJnZXRzKFxuICByb290OiBKc29uU2NoZW1hLFxuICByZWZlcmVuY2VzOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9Pixcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgdG9rZW5zID0gcGFyc2VMb2NhbEpzb25Qb2ludGVyKHJlZmVyZW5jZS52YWx1ZSwgcmVmZXJlbmNlLnBhdGgpO1xuICAgIGlmICghaXNEZWZpbml0aW9uUm9vdFBvaW50ZXIodG9rZW5zKSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgIFwiJHJlZiB0YXJnZXQgbXVzdCBiZSB0aGUgZG9jdW1lbnQgcm9vdCBvciBhIGRlZmluaXRpb24gcm9vdFwiLFxuICAgICAgICByZWZlcmVuY2UucGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc29sdmVEZWZpbml0aW9uUm9vdChyb290LCB0b2tlbnMsIHJlZmVyZW5jZS5wYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0RlZmluaXRpb25Sb290UG9pbnRlcih0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHRva2Vucy5sZW5ndGggJSAyICE9PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gXCIkZGVmc1wiICYmIHRva2Vuc1tpbmRleF0gIT09IFwiZGVmaW5pdGlvbnNcIikgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsSnNvblBvaW50ZXIocmVmZXJlbmNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKHJlZmVyZW5jZSA9PT0gXCIjXCIpIHJldHVybiBbXTtcbiAgaWYgKCFyZWZlcmVuY2Uuc3RhcnRzV2l0aChcIiMvXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcIm9ubHkgbG9jYWwgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgbGV0IGZyYWdtZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZnJhZ21lbnQgPSBkZWNvZGVVUklDb21wb25lbnQocmVmZXJlbmNlLnNsaWNlKDEpKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIGNvbnRhaW5zIGludmFsaWQgcGVyY2VudCBlbmNvZGluZ1wiLCBwYXRoKTtcbiAgfVxuICBpZiAoIWZyYWdtZW50LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcIm9ubHkgbG9jYWwgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGZyYWdtZW50XG4gICAgLnNsaWNlKDEpXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5tYXAoKHRva2VuKSA9PiBkZWNvZGVKc29uUG9pbnRlclRva2VuKHRva2VuLCBwYXRoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZpbml0aW9uUm9vdChyb290OiBKc29uU2NoZW1hLCB0b2tlbnM6IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IGN1cnJlbnQgPSByb290O1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGNvbnN0IGtleXdvcmQgPSB0b2tlbnNbaW5kZXhdITtcbiAgICBjb25zdCBuYW1lID0gdG9rZW5zW2luZGV4ICsgMV0hO1xuICAgIGNvbnN0IGRlZmluaXRpb25zID0gb3duVmFsdWUoY3VycmVudCwga2V5d29yZCk7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChkZWZpbml0aW9ucykgfHwgIU9iamVjdC5oYXNPd24oZGVmaW5pdGlvbnMsIG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgZG9lcyBub3QgcmVzb2x2ZSBpbnNpZGUgdGhlIGNhbGxlciBzY2hlbWFcIiwgcGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGRlZmluaXRpb25zW25hbWVdO1xuICAgIGlmICghaXNTY2hlbWFPYmplY3QodGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCBzY2hlbWFcIiwgcGF0aCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSB0YXJnZXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlSnNvblBvaW50ZXJUb2tlbihyYXdUb2tlbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgdG9rZW4gPSBcIlwiO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmF3VG9rZW4ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gcmF3VG9rZW5baW5kZXhdITtcbiAgICBpZiAoY2hhcmFjdGVyICE9PSBcIn5cIikge1xuICAgICAgdG9rZW4gKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZCA9IHJhd1Rva2VuW2luZGV4ICsgMV07XG4gICAgaWYgKGVzY2FwZWQgPT09IFwiMFwiKSB7XG4gICAgICB0b2tlbiArPSBcIn5cIjtcbiAgICB9IGVsc2UgaWYgKGVzY2FwZWQgPT09IFwiMVwiKSB7XG4gICAgICB0b2tlbiArPSBcIi9cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIGNvbnRhaW5zIGFuIGludmFsaWQgSlNPTiBQb2ludGVyIGVzY2FwZVwiLCBwYXRoKTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgfVxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIHN0cmljdGlmeU5vZGUobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBpZiAodHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIgfHwgbm9kZSA9PT0gbnVsbCkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgZGlhbGVjdE5ldXRyYWxOb2RlID0gcHJvdmlkZXIgPT09IFwib3BlbmFpXCIgPyBvbWl0S2V5cyhub2RlLCBbXCIkc2NoZW1hXCJdKSA6IG5vZGU7XG4gIGxldCByZXN1bHQgPSBzdHJpY3RpZnlTY2hlbWFNYXBzKGRpYWxlY3ROZXV0cmFsTm9kZSwgcGF0aCwgcHJvdmlkZXIpO1xuICBjb25zdCB0eXBlID0gb3duVmFsdWUocmVzdWx0LCBcInR5cGVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmICh0eXBlID09PSBcIm9iamVjdFwiIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcInByb3BlcnRpZXNcIikpIHtcbiAgICByZXN1bHQgPSBzdHJpY3RpZnlPYmplY3QocmVzdWx0LCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcIml0ZW1zXCIpIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcInByZWZpeEl0ZW1zXCIpKSB7XG4gICAgcmVzdWx0ID0gc3RyaWN0aWZ5QXJyYXkocmVzdWx0LCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICByZXR1cm4gc3RyaWN0aWZ5U2NoZW1hQXJyYXlzKHJlc3VsdCwgcGF0aCwgcHJvdmlkZXIpO1xufVxuXG4vLyDsnqzsnpHshLEg7Yyo7Iqk64qUIOygleydmCDrp7Xrp4wg7J6s6reA7ZWc64ukLiBwcm9wZXJ0aWVzIOuKlCBzdHJpY3RpZnlPYmplY3Qg6rCAIOuzhOuPhOuhnCDsspjrpqztlZjrr4DroZxcbi8vIOqzteycoCDsnITsuZgg66qp66GdKFNDSEVNQV9NQVBfS0VZV09SRFMp6rO8IOydmOuPhOyggeycvOuhnCDrspTsnITqsIAg64uk66W064ukLlxuY29uc3QgREVGSU5JVElPTl9NQVBfS0VZV09SRFMgPSBbXCIkZGVmc1wiLCBcImRlZmluaXRpb25zXCJdIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBzdHJpY3RpZnlTY2hlbWFNYXBzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIERFRklOSVRJT05fTUFQX0tFWVdPUkRTKSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKG5vZGUsIGtleXdvcmQpO1xuICAgIGlmICghaXNTY2hlbWFPYmplY3Qoc2NoZW1hcykpIGNvbnRpbnVlO1xuXG4gICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hcykubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBpc1NjaGVtYU9iamVjdChzY2hlbWEpXG4gICAgICAgICAgPyBzdHJpY3RpZnlOb2RlKHNjaGVtYSwgYCR7cGF0aH0uJHtrZXl3b3JkfS4ke25hbWV9YCwgcHJvdmlkZXIpXG4gICAgICAgICAgOiBzY2hlbWEsXG4gICAgICBdKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gcHJlZml4SXRlbXMg64qUIHN0cmljdGlmeUFycmF5IOydmCB0dXBsZSDqsr3roZzqsIAg64uk66Oo66+A66GcIOyXrOq4sOyEnOuKlCDsobDtlakga2V5d29yZCDrp4wg7J6s6reA7ZWc64ukLlxuY29uc3QgQ09NQklOQVRPUl9LRVlXT1JEUyA9IFtcImFueU9mXCIsIFwib25lT2ZcIiwgXCJhbGxPZlwiXSBhcyBjb25zdDtcblxuZnVuY3Rpb24gc3RyaWN0aWZ5U2NoZW1hQXJyYXlzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIENPTUJJTkFUT1JfS0VZV09SRFMpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUobm9kZSwga2V5d29yZCk7XG4gICAgaWYgKCFzY2hlbWFzKSBjb250aW51ZTtcbiAgICByZXN1bHRba2V5d29yZF0gPSAoc2NoZW1hcyBhcyBKc29uU2NoZW1hW10pLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS4ke2tleXdvcmR9WyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaWN0aWZ5T2JqZWN0KG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IG93blZhbHVlKG5vZGUsIFwicHJvcGVydGllc1wiKSBhcyBSZWNvcmQ8c3RyaW5nLCBKc29uU2NoZW1hPiB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIHsgLi4ubm9kZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1JlcXVpcmVkID0gbmV3IFNldCgob3duVmFsdWUobm9kZSwgXCJyZXF1aXJlZFwiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW10pO1xuICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgY29uc3Qgc3RyaWN0UHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgYWxsS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNba2V5XSE7XG4gICAgICBjb25zdCBzdHJpY3RQcm9wID0gc3RyaWN0aWZ5Tm9kZShwcm9wLCBgJHtwYXRofS4ke2tleX1gLCBwcm92aWRlcik7XG5cbiAgICAgIHJldHVybiBba2V5LCBleGlzdGluZ1JlcXVpcmVkLmhhcyhrZXkpID8gc3RyaWN0UHJvcCA6IG1ha2VOdWxsYWJsZShzdHJpY3RQcm9wKV07XG4gICAgfSksXG4gICkgYXMgUmVjb3JkPHN0cmluZywgSnNvblNjaGVtYT47XG5cbiAgY29uc3QgcmVzdWx0OiBKc29uU2NoZW1hID0ge1xuICAgIC4uLm5vZGUsXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiBzdHJpY3RQcm9wcyxcbiAgICByZXF1aXJlZDogYWxsS2V5cyxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgVU5SRUFDSEFCTEVfVFVQTEVfVEFJTF9TQ0hFTUE6IEpzb25TY2hlbWEgPSB7IHR5cGU6IFwic3RyaW5nXCIgfTtcblxuZnVuY3Rpb24gc3RyaWN0aWZ5QXJyYXkobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBpZiAoXG4gICAgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSAmJlxuICAgIChBcnJheS5pc0FycmF5KG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIikpIHx8IEFycmF5LmlzQXJyYXkob3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSkpXG4gICkge1xuICAgIHJldHVybiBub3JtYWxpemVUdXBsZShub2RlLCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7IC4uLm5vZGUgfTtcbiAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShub2RlLCBcIml0ZW1zXCIpIGFzIEpzb25TY2hlbWEgfCBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgcmVzdWx0Lml0ZW1zID0gaXRlbXMubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIGAke3BhdGh9Lml0ZW1zWyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQuaXRlbXMgPSBzdHJpY3RpZnlOb2RlKGl0ZW1zLCBgJHtwYXRofS5pdGVtc2AsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSBhcyBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKSkge1xuICAgIHJlc3VsdC5wcmVmaXhJdGVtcyA9IHByZWZpeEl0ZW1zLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS5wcmVmaXhJdGVtc1ske2luZGV4fV1gLCBwcm92aWRlciksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICBwYXRoOiBzdHJpbmcsXG4gIHByb3ZpZGVyOiBcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIixcbik6IEpzb25TY2hlbWEge1xuICBjb25zdCBpdGVtcyA9IG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIik7XG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgY29uc3QgbGVnYWN5VHVwbGUgPSBBcnJheS5pc0FycmF5KGl0ZW1zKTtcbiAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKTtcbiAgaWYgKGxlZ2FjeVR1cGxlICYmIHByZWZpeFR1cGxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJpdGVtcyBhbmQgcHJlZml4SXRlbXMgdHVwbGUgZm9ybXMgY2Fubm90IGJlIGNvbWJpbmVkXCIsIHBhdGgpO1xuICB9XG4gIGlmIChwcmVmaXhUdXBsZSAmJiBPYmplY3QuaGFzT3duKG5vZGUsIFwiYWRkaXRpb25hbEl0ZW1zXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJhZGRpdGlvbmFsSXRlbXMgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggcHJlZml4SXRlbXNcIiwgcGF0aCk7XG4gIH1cblxuICBjb25zdCByYXdUdXBsZSA9IChsZWdhY3lUdXBsZSA/IGl0ZW1zIDogcHJlZml4SXRlbXMpIGFzIHVua25vd25bXTtcbiAgY29uc3QgdHVwbGVQYXRoID0gbGVnYWN5VHVwbGUgPyBgJHtwYXRofS5pdGVtc2AgOiBgJHtwYXRofS5wcmVmaXhJdGVtc2A7XG4gIGNvbnN0IHR1cGxlID0gcmF3VHVwbGUubWFwKChzY2hlbWEsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJib29sZWFuIGFuZCBub24tb2JqZWN0IHR1cGxlIG1lbWJlciBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkXCIsXG4gICAgICAgIGAke3R1cGxlUGF0aH1bJHtpbmRleH1dYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlclBhdGggPSBgJHt0dXBsZVBhdGh9WyR7aW5kZXh9XWA7XG4gICAgY29uc3QgbWVtYmVyID0gc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIG1lbWJlclBhdGgsIHByb3ZpZGVyKTtcbiAgICBpZiAoIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludChtZW1iZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJ0dXBsZSBtZW1iZXIgbXVzdCBkZWZpbmUgYSBwcm92aWRlci1yZXByZXNlbnRhYmxlIHNjaGVtYVwiLFxuICAgICAgICBtZW1iZXJQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbWJlcjtcbiAgfSk7XG5cbiAgY29uc3QgcmF3VGFpbCA9IGxlZ2FjeVR1cGxlID8gb3duVmFsdWUobm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIikgOiBpdGVtcztcbiAgaWYgKHJhd1RhaWwgPT09IHRydWUpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcImFuIHVucmVzdHJpY3RlZCB0dXBsZSByZXN0IGlzIG5vdCBzdXBwb3J0ZWRcIiwgcGF0aCk7XG4gIH1cbiAgaWYgKHJhd1RhaWwgIT09IHVuZGVmaW5lZCAmJiByYXdUYWlsICE9PSBmYWxzZSAmJiAhaXNTY2hlbWFPYmplY3QocmF3VGFpbCkpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcInR1cGxlIHJlc3QgbXVzdCBiZSBhbiBvYmplY3Qgc2NoZW1hIG9yIGZhbHNlXCIsIHBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGFpbCA9IGlzU2NoZW1hT2JqZWN0KHJhd1RhaWwpXG4gICAgPyBzdHJpY3RpZnlOb2RlKHJhd1RhaWwsIGxlZ2FjeVR1cGxlID8gYCR7cGF0aH0uYWRkaXRpb25hbEl0ZW1zYCA6IGAke3BhdGh9Lml0ZW1zYCwgcHJvdmlkZXIpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGlmICh0YWlsICE9PSB1bmRlZmluZWQgJiYgIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludCh0YWlsKSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiYW4gdW5yZXN0cmljdGVkIHR1cGxlIHJlc3QgaXMgbm90IHN1cHBvcnRlZFwiLCBwYXRoKTtcbiAgfVxuICBjb25zdCB0YWlsTW9kZSA9IHRhaWwgIT09IHVuZGVmaW5lZCA/IFwidHlwZWRcIiA6IHJhd1RhaWwgPT09IGZhbHNlID8gXCJjbG9zZWRcIiA6IFwiaW1wbGljaXRcIjtcbiAgY29uc3QgYm91bmRzID0gbm9ybWFsaXplVHVwbGVCb3VuZHMobm9kZSwgdHVwbGUubGVuZ3RoLCB0YWlsTW9kZSwgcGF0aCk7XG4gIGNvbnN0IGJhc2UgPSBvbWl0S2V5cyhub2RlLCBbXCJpdGVtc1wiLCBcInByZWZpeEl0ZW1zXCIsIFwiYWRkaXRpb25hbEl0ZW1zXCIsIFwibWluSXRlbXNcIiwgXCJtYXhJdGVtc1wiXSk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eSDqsIAg67mE7Ja0IOyeiOyngCDslYrsnYAgdHVwbGUg7J2EIOydtOuvuCDqsbDrtoDtlojsnLzrr4DroZxcbiAgLy8g7Jes6riwIOuPhOuLrO2VmOuKlCB0dXBsZSDsnYAg67mIIHR1cGxlIOu/kOydtOqzoCwg6re4IOqyveyasCBwcmVmaXhJdGVtcyBzcHJlYWQg64qUIOyekOyXsO2eiCDsg53rnrXrkJzri6Qg4oCUXG4gIC8vIHByb3ZpZGVyIOu2hOq4sCDsl4bsnbQg7ZWcIO2Yle2DnOuhnCDrkZAgcHJvdmlkZXIg66qo65GQ66W8IO2RnO2YhO2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLih0dXBsZS5sZW5ndGggPiAwID8geyBwcmVmaXhJdGVtczogdHVwbGUgfSA6IHt9KSxcbiAgICBpdGVtczogdGFpbCA/PyBVTlJFQUNIQUJMRV9UVVBMRV9UQUlMX1NDSEVNQSxcbiAgICAuLi5ib3VuZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlQm91bmRzKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICB0dXBsZUxlbmd0aDogbnVtYmVyLFxuICB0YWlsTW9kZTogXCJ0eXBlZFwiIHwgXCJjbG9zZWRcIiB8IFwiaW1wbGljaXRcIixcbiAgcGF0aDogc3RyaW5nLFxuKTogeyBtaW5JdGVtczogbnVtYmVyOyBtYXhJdGVtcz86IG51bWJlciB9IHtcbiAgY29uc3QgY2FsbGVyTWluSXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtaW5JdGVtc1wiKSwgXCJtaW5JdGVtc1wiLCBwYXRoKTtcbiAgY29uc3QgY2FsbGVyTWF4SXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtYXhJdGVtc1wiKSwgXCJtYXhJdGVtc1wiLCBwYXRoKTtcbiAgaWYgKHRhaWxNb2RlID09PSBcImltcGxpY2l0XCIgJiYgY2FsbGVyTWF4SXRlbXMgIT09IHVuZGVmaW5lZCAmJiBjYWxsZXJNYXhJdGVtcyA+IHR1cGxlTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcImltcGxpY2l0IHR1cGxlIHJlc3QgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdoZW4gbWF4SXRlbXMgZXhjZWVkcyB0aGUgdHVwbGUgbGVuZ3RoXCIsXG4gICAgICBwYXRoLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtaW5JdGVtcyA9IGNhbGxlck1pbkl0ZW1zID8/IChjYWxsZXJNYXhJdGVtcyA9PT0gdW5kZWZpbmVkID8gdHVwbGVMZW5ndGggOiAwKTtcbiAgY29uc3QgbWF4SXRlbXMgPVxuICAgIHRhaWxNb2RlID09PSBcInR5cGVkXCIgPyBjYWxsZXJNYXhJdGVtcyA6IE1hdGgubWluKGNhbGxlck1heEl0ZW1zID8/IHR1cGxlTGVuZ3RoLCB0dXBsZUxlbmd0aCk7XG5cbiAgaWYgKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgJiYgbWluSXRlbXMgPiBtYXhJdGVtcykge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwidHVwbGUgbWluSXRlbXMgY2Fubm90IGV4Y2VlZCBtYXhJdGVtc1wiLCBwYXRoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWluSXRlbXMsXG4gICAgLi4uKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgPyB7IG1heEl0ZW1zIH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGludGVnZXJCb3VuZCh2YWx1ZTogdW5rbm93biwga2V5d29yZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgKHZhbHVlIGFzIG51bWJlcikgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoYCR7a2V5d29yZH0gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBzYWZlIGludGVnZXJgLCBwYXRoKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBpc1NjaGVtYU9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25TY2hlbWEge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gb3duVmFsdWUoc2NoZW1hOiBKc29uU2NoZW1hLCBrZXl3b3JkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oc2NoZW1hLCBrZXl3b3JkKSA/IHNjaGVtYVtrZXl3b3JkXSA6IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgUFJPVklERVJfU0NIRU1BX0VOVFJZX1BPSU5UX0tFWVdPUkRTID0gbmV3IFNldChbXG4gIFwidHlwZVwiLFxuICBcIiRyZWZcIixcbiAgXCJwcm9wZXJ0aWVzXCIsXG4gIFwiYW55T2ZcIixcbiAgXCJvbmVPZlwiLFxuICBcImFsbE9mXCIsXG5dKTtcblxuZnVuY3Rpb24gaGFzUHJvdmlkZXJTY2hlbWFFbnRyeVBvaW50KHNjaGVtYTogSnNvblNjaGVtYSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5zb21lKChrZXkpID0+IFBST1ZJREVSX1NDSEVNQV9FTlRSWV9QT0lOVF9LRVlXT1JEUy5oYXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIG9taXRLZXlzKG5vZGU6IEpzb25TY2hlbWEsIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogSnNvblNjaGVtYSB7XG4gIGNvbnN0IG9taXR0ZWQgPSBuZXcgU2V0KGtleXMpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5vZGUpLmZpbHRlcigoW2tleV0pID0+ICFvbWl0dGVkLmhhcyhrZXkpKSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VOdWxsYWJsZShzY2hlbWE6IEpzb25TY2hlbWEpOiBKc29uU2NoZW1hIHtcbiAgaWYgKG93blZhbHVlKHNjaGVtYSwgXCJ0eXBlXCIpID09PSBcIm51bGxcIikgcmV0dXJuIHNjaGVtYTtcblxuICBjb25zdCBhbnlPZiA9IG93blZhbHVlKHNjaGVtYSwgXCJhbnlPZlwiKTtcbiAgaWYgKGFueU9mKSB7XG4gICAgY29uc3QgdmFyaWFudHMgPSBhbnlPZiBhcyBKc29uU2NoZW1hW107XG4gICAgY29uc3QgaGFzTnVsbCA9IHZhcmlhbnRzLnNvbWUoKHYpID0+IG93blZhbHVlKHYsIFwidHlwZVwiKSA9PT0gXCJudWxsXCIpO1xuICAgIGlmIChoYXNOdWxsKSByZXR1cm4gc2NoZW1hO1xuICAgIHJldHVybiB7IGFueU9mOiBbLi4udmFyaWFudHMsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbiAgfVxuXG4gIGNvbnN0IG9uZU9mID0gb3duVmFsdWUoc2NoZW1hLCBcIm9uZU9mXCIpO1xuICBpZiAob25lT2YpIHtcbiAgICBjb25zdCB2YXJpYW50cyA9IG9uZU9mIGFzIEpzb25TY2hlbWFbXTtcbiAgICBjb25zdCBoYXNOdWxsID0gdmFyaWFudHMuc29tZSgodikgPT4gb3duVmFsdWUodiwgXCJ0eXBlXCIpID09PSBcIm51bGxcIik7XG4gICAgaWYgKGhhc051bGwpIHJldHVybiBzY2hlbWE7XG4gICAgcmV0dXJuIHsgb25lT2Y6IFsuLi52YXJpYW50cywgeyB0eXBlOiBcIm51bGxcIiB9XSB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYW55T2Y6IFtzY2hlbWEsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF1QkEsSUFBYSxtQkFBYixjQUFzQyxNQUFNO0NBR2pDO0NBRlQs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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//#region src/utils/providers/openai/openai-worker-pool-config.ts
|
|
2
2
|
const MAX_OPENAI_WORKERS_PER_TOKEN = 20;
|
|
3
|
-
const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN =
|
|
4
|
-
const DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN =
|
|
3
|
+
const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN = 1;
|
|
4
|
+
const DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN = 3;
|
|
5
5
|
const OPENAI_WORKER_BASE_RSS_GIB = .71;
|
|
6
6
|
const OPENAI_WORKER_RSS_GIB = .157;
|
|
7
7
|
function boundedInteger(value, fallback, min, max) {
|
|
@@ -34,4 +34,4 @@ function estimateOpenAIWorkerRssGiB(totalWorkers) {
|
|
|
34
34
|
//#endregion
|
|
35
35
|
export { MAX_OPENAI_WORKERS_PER_TOKEN, OPENAI_WORKER_BASE_RSS_GIB, OPENAI_WORKER_RSS_GIB, estimateOpenAIWorkerRssGiB, resolveOpenAIWorkerPoolConfig };
|
|
36
36
|
|
|
37
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXdvcmtlci1wb29sLWNvbmZpZy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktd29ya2VyLXBvb2wtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOID0gMjA7XG5jb25zdCBERUZBVUxUX09QRU5BSV9NSU5fV09SS0VSU19QRVJfVE9LRU4gPSAxO1xuY29uc3QgREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOID0gMztcblxuZXhwb3J0IGNvbnN0IE9QRU5BSV9XT1JLRVJfQkFTRV9SU1NfR0lCID0gMC43MTtcbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX1JTU19HSUIgPSAwLjE1NztcblxuZXhwb3J0IHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHtcbiAgYXV0b3NjYWxlOiBib29sZWFuO1xuICBtaW5Xb3JrZXJzUGVyVG9rZW46IG51bWJlcjtcbiAgbWF4V29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIHNjYWxlSW50ZXJ2YWxNczogbnVtYmVyO1xuICBzY2FsZURvd25JZGxlTXM6IG51bWJlcjtcbiAgbWF4RXN0aW1hdGVkUnNzR2lCOiBudW1iZXI7XG4gIG1pbkhvc3RBdmFpbGFibGVHaUI6IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGJvdW5kZWRJbnRlZ2VyKFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBtaW46IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKE1hdGguZmxvb3IocGFyc2VkKSwgbWF4KSk7XG59XG5cbmZ1bmN0aW9uIGJvdW5kZWROdW1iZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWluOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIHBhcnNlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlbkFJV29ya2VyUG9vbENvbmZpZyhcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0gcHJvY2Vzcy5lbnYsXG4pOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnIHtcbiAgY29uc3QgYXV0b3NjYWxlID0gZW52LlFHUklEX09QRU5BSV9BVVRPU0NBTEUgIT09IFwiZmFsc2VcIiAmJiBlbnYuUUdSSURfT1BFTkFJX0FVVE9TQ0FMRSAhPT0gXCIwXCI7XG4gIGNvbnN0IGxlZ2FjeVdvcmtlcnMgPSBib3VuZGVkSW50ZWdlcihcbiAgICBlbnYuUUdSSURfV09SS0VSU19QRVJfVE9LRU4sXG4gICAgREVGQVVMVF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIDEsXG4gICAgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTixcbiAgKTtcbiAgY29uc3QgbWluV29ya2Vyc1BlclRva2VuID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX09QRU5BSV9NSU5fV09SS0VSU19QRVJfVE9LRU4sXG4gICAgbGVnYWN5V29ya2VycyxcbiAgICAxLFxuICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICk7XG4gIHJldHVybiB7XG4gICAgYXV0b3NjYWxlLFxuICAgIG1pbldvcmtlcnNQZXJUb2tlbixcbiAgICAvLyBhdXRvc2NhbGUg7J20IOq6vOyngOuptCBtYXgg64qUIG1pbiDsnLzroZwg6rOg7KCV65CY66+A66GcIGVudiDtjIzsi7Eg7J6Q7LK06rCAIGF1dG9zY2FsZSDrtoTquLAg7JWI7JeQ66eMIOyeiOuLpC5cbiAgICBtYXhXb3JrZXJzUGVyVG9rZW46IGF1dG9zY2FsZVxuICAgICAgPyBNYXRoLm1heChcbiAgICAgICAgICBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgICAgICAgYm91bmRlZEludGVnZXIoXG4gICAgICAgICAgICBlbnYuUUdSSURfT1BFTkFJX01BWF9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAgICAgICAgIERFRkFVTFRfT1BFTkFJX01BWF9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIDogbWluV29ya2Vyc1BlclRva2VuLFxuICAgIHNjYWxlSW50ZXJ2YWxNczogYm91bmRlZEludGVnZXIoZW52LlFHUklEX09QRU5BSV9TQ0FMRV9JTlRFUlZBTF9NUywgNV8wMDAsIDI1MCwgMzAwXzAwMCksXG4gICAgc2NhbGVEb3duSWRsZU1zOiBib3VuZGVkSW50ZWdlcihcbiAgICAgIGVudi5RR1JJRF9PUEVOQUlfU0NBTEVfRE9XTl9JRExFX01TLFxuICAgICAgMTAgKiA2MF8wMDAsXG4gICAgICAxXzAwMCxcbiAgICAgIDI0ICogNjAgKiA2MF8wMDAsXG4gICAgKSxcbiAgICBtYXhFc3RpbWF0ZWRSc3NHaUI6IGJvdW5kZWROdW1iZXIoZW52LlFHUklEX09QRU5BSV9NQVhfRVNUSU1BVEVEX1JTU19HSUIsIDE2LCAxKSxcbiAgICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBib3VuZGVkTnVtYmVyKGVudi5RR1JJRF9PUEVOQUlfTUlOX0hPU1RfQVZBSUxBQkxFX0dJQiwgMjAsIDApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIodG90YWxXb3JrZXJzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gT1BFTkFJX1dPUktFUl9CQVNFX1JTU19HSUIgKyBPUEVOQUlfV09SS0VSX1JTU19HSUIgKiB0b3RhbFdvcmtlcnM7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFhLCtCQUErQjtBQUM1QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLHVDQUF1QztBQUU3QyxNQUFhLDZCQUE2QjtBQUMxQyxNQUFhLHdCQUF3QjtBQVlyQyxTQUFTLGVBQ1AsT0FDQSxVQUNBLEtBQ0EsS0FDUTtDQUNSLE1BQU0sU0FBUyxPQUFPLEtBQUs7Q0FDM0IsSUFBSSxDQUFDLE9BQU8sU0FBUyxNQUFNLEdBQUcsT0FBTztDQUNyQyxPQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN4RDtBQUVBLFNBQVMsY0FBYyxPQUEyQixVQUFrQixLQUFxQjtDQUN2RixNQUFNLFNBQVMsT0FBTyxLQUFLO0NBQzNCLElBQUksQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHLE9BQU87Q0FDckMsT0FBTyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQzdCO0FBRUEsU0FBZ0IsOEJBQ2QsTUFBMEMsUUFBUSxLQUMxQjtDQUN4QixNQUFNLFlBQVksSUFBSSwyQkFBMkIsV0FBVyxJQUFJLDJCQUEyQjtDQUMzRixNQUFNLGdCQUFnQixlQUNwQixJQUFJLHlCQUNKLHNDQUNBLEdBQUEsRUFFRjtDQUNBLE1BQU0scUJBQXFCLGVBQ3pCLElBQUksb0NBQ0osZUFDQSxHQUFBLEVBRUY7Q0FDQSxPQUFPO0VBQ0w7RUFDQTtFQUVBLG9CQUFvQixZQUNoQixLQUFLLElBQ0gsb0JBQ0EsZUFDRSxJQUFJLG9DQUNKLHNDQUNBLEdBQUEsRUFFRixDQUNGLElBQ0E7RUFDSixpQkFBaUIsZUFBZSxJQUFJLGdDQUFnQyxLQUFPLEtBQUssR0FBTztFQUN2RixpQkFBaUIsZUFDZixJQUFJLGlDQUNKLEtBQUssS0FDTCxLQUNBLE9BQVUsR0FDWjtFQUNBLG9CQUFvQixjQUFjLElBQUksb0NBQW9DLElBQUksQ0FBQztFQUMvRSxxQkFBcUIsY0FBYyxJQUFJLHFDQUFxQyxJQUFJLENBQUM7Q0FDbkY7QUFDRjtBQUVBLFNBQWdCLDJCQUEyQixjQUE4QjtDQUN2RSxPQUFPLDZCQUE2Qix3QkFBd0I7QUFDOUQifQ==
|