@cartanova/qgrid-cli 2.5.3 → 2.5.5
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/README.ko.md +7 -2
- package/README.md +7 -2
- package/bundle/dist/application/monit/monit.frame.js +3 -3
- package/bundle/dist/application/qgrid/oauth.js +1 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +36 -14
- package/bundle/dist/application/qgrid/qgrid.frame.js +19 -5
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +93 -0
- package/bundle/dist/application/qgrid/tool-emulation.js +116 -96
- package/bundle/dist/application/request-log/request-log.model.js +3 -3
- package/bundle/dist/application/request-log-step/request-log-step.model.js +2 -2
- package/bundle/dist/application/token/token.model.js +2 -2
- package/bundle/dist/server-error-handler.js +15 -0
- package/bundle/dist/sonamu.config.js +4 -7
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +4 -3
- package/bundle/dist/utils/providers/anthropic/claude-session.js +7 -5
- package/bundle/dist/utils/providers/common/json-schema-keywords.js +77 -0
- package/bundle/dist/utils/providers/common/schema-validation.js +178 -0
- package/bundle/dist/utils/providers/common/strictifier.js +332 -42
- package/bundle/dist/utils/providers/openai/codex-worker.js +16 -8
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +5 -37
- package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +37 -0
- package/bundle/src/application/monit/monit.frame.ts +1 -1
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +103 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +337 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +45 -25
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +580 -8
- package/bundle/src/application/qgrid/qgrid.frame.ts +28 -1
- package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +188 -0
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +177 -0
- package/bundle/src/application/qgrid/tool-emulation.test.ts +285 -67
- package/bundle/src/application/qgrid/tool-emulation.ts +199 -102
- package/bundle/src/server-error-handler.ts +22 -0
- package/bundle/src/sonamu.config.test.ts +37 -0
- package/bundle/src/sonamu.config.ts +2 -5
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +44 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +2 -2
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +10 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +6 -1
- package/bundle/src/utils/providers/common/json-schema-keywords.ts +72 -0
- package/bundle/src/utils/providers/common/schema-validation.test.ts +284 -0
- package/bundle/src/utils/providers/common/schema-validation.ts +308 -0
- package/bundle/src/utils/providers/common/strictifier.test.ts +746 -0
- package/bundle/src/utils/providers/common/strictifier.ts +520 -52
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +31 -0
- package/bundle/src/utils/providers/openai/codex-worker.ts +12 -4
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +6 -4
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +6 -79
- package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +80 -0
- package/bundle/web-dist/client/assets/{index-DXdGBfB8.js → index-CN_kMswh.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-D_j1yxC4.js → logs-6nYj9OKL.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CIToyoxW.js → monit-CaPH9Uwc.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-Dd21A-wi.js → routes-Dh5HPi-b.js} +1 -1
- package/bundle/web-dist/client/assets/{show-DfePWRbc.js → show-Be_LVd9d.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-B4MV2fdk.js → tokens-CAi3zu_0.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/ai-sdk-provider-contract.md +34 -2
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +3 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +1 -1
- package/skills/qgrid/references/decision-rationale.md +10 -1
- package/skills/qgrid/references/docs-workflow.md +9 -0
- package/skills/qgrid/references/repo-map.md +2 -1
- package/skills/qgrid/references/tool-calling-and-multiturn.md +145 -6
- package/skills/qgrid/references/verification-and-debugging.md +16 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { getExpiresAt, getRefreshToken } from "../common/credentials.js";
|
|
2
|
+
import { serializeAndValidateDispatchSchema } from "../common/schema-validation.js";
|
|
1
3
|
import { QuotaThresholdExceededError } from "../../../application/qgrid/qgrid.types.js";
|
|
2
4
|
import { TokenModel } from "../../../application/token/token.model.js";
|
|
3
5
|
import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
|
|
4
|
-
import { getExpiresAt, getRefreshToken } from "../common/credentials.js";
|
|
5
6
|
import { assertSupportedOneMillionSuffix, canonicalAnthropicModel } from "./anthropic-constants.js";
|
|
6
7
|
import { readAnthropicQuotaUsage } from "./anthropic-quota.js";
|
|
7
8
|
import { makeAnthropicWorkerId, runClaudeSession } from "./claude-session.js";
|
|
@@ -185,7 +186,7 @@ var AnthropicDispatcher = class {
|
|
|
185
186
|
if (req.imageGeneration) throw new Error("image generation is not supported on the Anthropic route");
|
|
186
187
|
assertSupportedOneMillionSuffix(req.model);
|
|
187
188
|
const model = canonicalAnthropicModel(req.model);
|
|
188
|
-
const jsonSchema = req.outputSchema
|
|
189
|
+
const jsonSchema = serializeAndValidateDispatchSchema(req.outputSchema, "anthropic");
|
|
189
190
|
const token = await this.selectToken();
|
|
190
191
|
if (!token) throw new Error("No anthropic tokens available");
|
|
191
192
|
const exec = async () => {
|
|
@@ -246,4 +247,4 @@ var AnthropicDispatcher = class {
|
|
|
246
247
|
//#endregion
|
|
247
248
|
export { AnthropicDispatcher };
|
|
248
249
|
|
|
249
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeCwgY2Fub25pY2FsQW50aHJvcGljTW9kZWwgfSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkQW50aHJvcGljUXVvdGFVc2FnZSwgdHlwZSBBbnRocm9waWNRdW90YVVzYWdlUmVzdWx0IH0gZnJvbSBcIi4vYW50aHJvcGljLXF1b3RhXCI7XG5pbXBvcnQgeyBtYWtlQW50aHJvcGljV29ya2VySWQsIHJ1bkNsYXVkZVNlc3Npb24gfSBmcm9tIFwiLi9jbGF1ZGUtc2Vzc2lvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJhbnRocm9waWMtZGlzcGF0Y2hlclwiXSk7XG5cbi8vIDFNIGNvbnRleHQg7KCV7IOBIOyDneyEseydgCDsi6TsuKHsg4EgMTAwcyvquYzsp4Ag6rCE64ukLiAyNDBz64qUIOyZhOy2qSDsnqXsuZjsnbwg67+QLFxuLy8g6rGw67aAK+qxsOuMgCBzeXN0ZW0g7J6s7IOd7ISxIOyngOyXsOydhCDsmYTsoITtnogg7ZW06rKw7ZWY64qUIOqwkuydgCDslYTri4jri6QuXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAyNDBfMDAwO1xuLy8gYWNjZXNzIHRva2VuIOunjOujjCDsnoTrsJUg7J6E6rOEIOKAlCDquLDsobQgc3RhbmRhbG9uZSDqsr3roZwocWdyaWQuZGlzcGF0Y2hlci50cynsmYAg64+Z7J28KDYwcykuXG5jb25zdCBSRUZSRVNIX1NBRkVUWV9NUyA9IDYwXzAwMDtcblxuaW50ZXJmYWNlIFBvb2xlZFRva2VuIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbmV4cG9ydCBjbGFzcyBBbnRocm9waWNEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgLy8gdG9rZW5JZCDihpIg7ZKAIO2VreuqqS4gc3RhcnQoKS90b2tlbiDsnbTrsqTtirjroZwg7LGE7JuAXG4gIHByaXZhdGUgdG9rZW5Qb29sID0gbmV3IE1hcDxudW1iZXIsIFBvb2xlZFRva2VuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gT3BlbkFJRGlzcGF0Y2hlci5zdGFydCgpIOyZgCDrj5nsnbztlZjqsowgREIg7JeQ7IScIOq4sOyhtCBhbnRocm9waWMg7Yag7YGw7J2EIHNlbGYtYm9vdHN0cmFwIO2VnOuLpC5cbiAgICAvLyAo7ISc67KEIOyerOyLnOyekSDsi5wgTk9USUZZIOqwgCDslYgg7Jik66+A66GcIOu2gO2KuOyKpO2KuOueqeydtCDsl4bsnLzrqbQg7ZKA7J20IOu5iCDssYTroZwg64Ko64qU64ukLilcbiAgICAvLyDsnbTtm4Qg67OA6rK967aE7J2AIHRva2VuLXN1YnNjcmliZXIg6rCAIG9uVG9rZW5BZGRlZC9VcGRhdGVkL1JlbW92ZWQg66GcIOyghOuLrO2VnOuLpC5cbiAgICAvLyBmaW5kQWN0aXZlQnlQcm92aWRlciDqsIAgYWN0aXZlPXRydWUgKyBwcm92aWRlciDtlYTthLDrpbwgREIg7JeQ7IScIOyymOumrCDihpIgaW5hY3RpdmUg64qUIOyVoOy0iOyXkCDslYgg7Jio64ukLlxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpO1xuICAgIGZvciAoY29uc3QgdCBvZiB0b2tlbnMpIHtcbiAgICAgIHRoaXMudG9rZW5Qb29sLnNldCh0LmlkLCB7XG4gICAgICAgIGlkOiB0LmlkLFxuICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB0LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogdC5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogdC53ZWlnaHQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbih0LmlkLCB0LndlaWdodCk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VyIHNwYXduZWQ6ICR7dC5uYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5JZHMgPSBbLi4udGhpcy50b2tlblBvb2wua2V5cygpXTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRva2VuSWRzKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMudG9rZW5Qb29sLmNsZWFyKCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICAvLyDtmITsnqwg7ZKA7J2YIO2GoO2BsCDsiJgoc3RhcnR1cCDroZzqt7gvaGVhbHRoIOyaqSkuXG4gIGdldCB0b2tlbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLnNpemU7XG4gIH1cblxuICAvLyBNb25pdCDtkZzsi5zsmqkg4oCUIO2SgOyXkCDsnojripQg7Yag7YGwIOydtOumhCDsiqTrg4Xsg7cgKOydtOumhOyInCDsoJXroKwpXG4gIGdldCB0b2tlbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXS5tYXAoKHRva2VuKSA9PiB0b2tlbi5uYW1lKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgLy8gREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg66qp66Gd7Jy866GcIO2SgOydhCDsnqzrj5nquLDtmZTtlZzri6QocGVyaW9kaWMgcmVjb25jaWxlL+yerOyXsOqysOyaqSkuXG4gIC8vIExJU1RFTi9OT1RJRlkg6rCAIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CcIOy2lOqwgC/sgq3soJwv67mE7Zmc7ISx7ZmU66W8IERCIOq4sOykgOycvOuhnCDri6Tsi5wg66ee7LaY64ukLlxuICAvLyDsnbTrsqTtirgg7ZW465Ok65+s66W8IOyerOyCrOyaqe2VtCDtkoAg6rCx7Iug7J20IOydvOq0gOuQmOqyjCDsoIHsmqnrkJjrj4TroZ0g7ZWc64ukOlxuICAvLyAgLSBEQiDsl5Ag7JeG64qU642wIO2SgOyXkCDsnojripQg7Yag7YGwIOKGkiBvblRva2VuUmVtb3ZlZFxuICAvLyAgLSBEQiDsl5Ag7J6I64qUIO2GoO2BsCDihpIg7Iug6rec66m0IG9uVG9rZW5BZGRlZCwg6riw7KG07J2066m0IG9uVG9rZW5VcGRhdGVkXG4gIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uVG9rZW5BZGRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyB0b2tlbiBldmVudHMgKHRva2VuLXN1YnNjcmliZXIg6rCAIO2YuOy2nClcbiAgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgfVxuXG4gIC8vIHF1b3RhIO2GteqzvCDtm4Trs7Trp4zsnLzroZwg7JqU7LKt66eI64ukIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDshKDtg53tlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgc2VsZWN0VG9rZW4oKTogUHJvbWlzZTxQb29sZWRUb2tlbiB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudG9rZW5Qb29sLnZhbHVlcygpXTtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgZWxpZ2libGUsIG92ZXJUaHJlc2hvbGRUb2tlbnMgfSA9IGF3YWl0IHRoaXMuZmlsdGVyRWxpZ2libGVUb2tlbnMocm93cyk7XG4gICAgaWYgKGVsaWdpYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgIHRva2VuQ291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IHJvd3MuZmlsdGVyKChyKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHIpKS5sZW5ndGgsXG4gICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICAgIHJlYXNvbjogXCJhbGxfZXhjZWVkZWRcIixcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgICAgcXVvdGFUaHJlc2hvbGRFeGNlZWRlZE1lc3NhZ2UoXCJhbnRocm9waWNcIiwgb3ZlclRocmVzaG9sZFRva2VucyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQoZWxpZ2libGUubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpKSk7XG4gICAgaWYgKHNlbGVjdGVkSWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5nZXQoc2VsZWN0ZWRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMocm93czogUG9vbGVkVG9rZW5bXSk6IFByb21pc2U8e1xuICAgIGVsaWdpYmxlOiBQb29sZWRUb2tlbltdO1xuICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB9PiB7XG4gICAgY29uc3QgdGhyZXNob2xkZWQgPSByb3dzLmZpbHRlcigodG9rZW4pID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKTtcbiAgICBpZiAodGhyZXNob2xkZWQubGVuZ3RoID09PSAwKSByZXR1cm4geyBlbGlnaWJsZTogcm93cywgb3ZlclRocmVzaG9sZFRva2VuczogW10gfTtcblxuICAgIGNvbnN0IGVsaWdpYmxlSWRzID0gbmV3IFNldChcbiAgICAgIHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCksXG4gICAgKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRocmVzaG9sZGVkLm1hcChhc3luYyAodG9rZW4pID0+ICh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICByZXN1bHQ6IGF3YWl0IHJlYWRBbnRocm9waWNRdW90YVVzYWdlKHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgY2hlY2tzLmZvckVhY2goKGNoZWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNoZWNrLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhyZXNob2xkZWRbaW5kZXhdO1xuICAgICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZUlkcy5hZGQodG9rZW4uaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gY2hlY2sudmFsdWUudG9rZW47XG4gICAgICBjb25zdCByZXN1bHQgPSBjaGVjay52YWx1ZS5yZXN1bHQ7XG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbiwgcmVzdWx0KTtcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLCB0aHJlc2hvbGQ6IHRva2VuLnF1b3RhVGhyZXNob2xkIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBlbGlnaWJsZTogcm93cy5maWx0ZXIoKHRva2VuKSA9PiBlbGlnaWJsZUlkcy5oYXModG9rZW4uaWQpKSwgb3ZlclRocmVzaG9sZFRva2VucyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdW90YVRocmVzaG9sZCh0b2tlbjogUG9vbGVkVG9rZW4pOiB0b2tlbiBpcyBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4gdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuOiBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9LFxuICAgIHJlc3VsdDogRXh0cmFjdDxBbnRocm9waWNRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGRcIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgcmVhc29uOiBcIm92ZXJfdGhyZXNob2xkXCIsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhTG9va3VwRmFpbE9wZW4oXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxLCAoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuKHJlcSwgY2Iub25EZWx0YSwgeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiB0cnVlIH0pO1xuICAgICAgY2Iub25UaHJlYWRJZD8uKHJlc3VsdC50aHJlYWRDb29yZC50aHJlYWRJZCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2Iub25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDqs7XthrUg7Iuk7ZaJLiBvbkRlbHRhIOuKlCDsiqTtirjrprzsnbTrqbQg7KCQ7KeEIOuwqey2nCwg67mE7Iqk7Yq466a87J2066m0IG5vLW9wLlxuICBwcml2YXRlIGFzeW5jIHJ1bihcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBvbkRlbHRhOiAodDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9wdHM/OiB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7IOd7ISx7J2AIE9wZW5BSShjb2RleCkg6rK966GcIOyghOyaqS4gQW50aHJvcGljIOudvOyasO2MheyXkCDsnbTrr7jsp4Ag7ZSM656Y6re46rCAXG4gICAgLy8g64+E64us7ZWY66m0IOyhsOyaqe2eiCDthY3siqTtirjroZwg7Y+067Cx7ZWY7KeAIOyViuqzoCDrqoXsi5zsoIHsnLzroZwg6rGw67aA7ZWc64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFudGhyb3BpYyByb3V0ZVwiKTtcbiAgICB9XG4gICAgLy8gbW9kZWwg7KCV6rec7ZmU66W8IGRpc3BhdGNoZXIg7KeE7J6F7KCQ7JeQ7IScIO2VnCDrsogg7ZWc64ukOiByZXN1bHQubW9kZWwgLyBydW5DbGF1ZGVTZXNzaW9uIOyghOu2gFxuICAgIC8vIGNhbm9uaWNhbChwcmVmaXgg7JeG64qUIGNvc3Qg7YKkKSDsnYQg7JOw6rKMIO2GteydvC4g66+47KeA7KCV7J2066m0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOKAlCBxZ3JpZC5kaXNwYXRjaGVyXG4gICAgLy8g7J2YIFwic29ubmV0XCIg67OE7LmtIOyasO2ajCDssKjri6guIOygleq3nO2ZlCDqt5zsuZnsnYAgZmFsbGJhY2sg6rK966Gc7JmAIOqzteycoChjYW5vbmljYWxBbnRocm9waWNNb2RlbCkuXG4gICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgICBjb25zdCBqc29uU2NoZW1hID1cbiAgICAgIHJlcS5vdXRwdXRTY2hlbWEgIT09IHVuZGVmaW5lZCA/IEpTT04uc3RyaW5naWZ5KHJlcS5vdXRwdXRTY2hlbWEpIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gYW50aHJvcGljIHRva2VucyBhdmFpbGFibGVcIik7XG5cbiAgICBjb25zdCBleGVjID0gYXN5bmMgKCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+ID0+IHtcbiAgICAgIC8vIOunjOujjCDsnoTrsJUg7Yag7YGwIHByZWVtcHRpdmUgcmVmcmVzaCjquLDsobQgc3RhbmRhbG9uZSDqsr3roZzsmYAg64+Z7J28KS4g7Iuk7Yyo7ZW064+EIOynhO2WiS5cbiAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuO1xuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZ2V0RXhwaXJlc0F0KHRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhwaXJlc0F0ICYmXG4gICAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgICBnZXRSZWZyZXNoVG9rZW4odG9rZW4uY3JlZGVudGlhbHMpXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IFFncmlkRnJhbWUgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCIpO1xuICAgICAgICAgIC8vIHByb3ZpZGVyIOulvCDrsJjrk5zsi5wg7LGE7JuM7JW8IHJlZnJlc2hUb2tlbiDrgrTrtoAgVG9rZW5Nb2RlbC5zYXZlIOqwgCDshLHqs7XtlZzri6QuXG4gICAgICAgICAgLy8gcmVmcmVzaFRva2VuKFRva2VuU3Vic2V0QSkg64qUIGlkL3Byb3ZpZGVyL2NyZWRlbnRpYWxzL25hbWUg66eMIOyCrOyaqe2VmOuvgOuhnCDqt7ggNOqwnOunjCDrhJjquLTri6QuXG4gICAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbih7XG4gICAgICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogdG9rZW4uY3JlZGVudGlhbHMsXG4gICAgICAgICAgfSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbj5bMF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt0b2tlbi5uYW1lfSAobW9kZWw6ICR7bW9kZWx9KWApO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHJ1bkNsYXVkZVNlc3Npb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgICAgICB0b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgc3lzdGVtOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiByZXEuZWZmb3J0LFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxLnRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBpbnB1dDogcmVxLmNvbGRJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbDogcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IG9wdHM/LmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsdGEsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2Vzc2lvbi5xdW90YUV4aGF1c3RlZCkgdGhyb3cgbmV3IEVycm9yKGBxdW90YSBleGhhdXN0ZWQgKCR7dG9rZW4ubmFtZX0pYCk7XG4gICAgICBpZiAoc2Vzc2lvbi5pc0Vycm9yKSB7XG4gICAgICAgIC8vIOynhOuLqChTT04tNDk1KTogaXNFcnJvciDtjJDsoJUg7IKs7JygKHN1YnR5cGUvdGVybWluYWxfcmVhc29uKeulvCDrqZTsi5zsp4Ag7JWe7JeQIOuTnOufrOuCuOuLpC5cbiAgICAgICAgLy8g6re464+Z7JWIIGRldGFpbCDsnbQgc2Vzc2lvbi50ZXh0KOyZhOyghO2VnCBKU09OIOuzuOusuCnrv5DsnbTrnbwgXCJzY2hlbWEg7JyE67CY7J247KeAIC8gbWF4IHJldHJpZXMg7J247KeAIC9cbiAgICAgICAgLy8gbWF4IHR1cm5zIOyduOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG7JeI64ukLiB0ZXh0IOuKlCDsp4Tri6jsl5Ag7ZWE7JqU7ZWcIOunjO2BvOunjCDsnpjrnbwg642n67aZ7J2464ukLlxuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIHNlc3Npb24uc3VidHlwZSA/PyBzZXNzaW9uLnRlcm1pbmFsUmVhc29uID8/IChzZXNzaW9uLmlzRXJyb3IgPyBcImlzX2Vycm9yXCIgOiBcInVua25vd25cIik7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBzZXNzaW9uLnRleHRcbiAgICAgICAgICA/IHNlc3Npb24udGV4dC5sZW5ndGggPiA1MDBcbiAgICAgICAgICAgID8gYCR7c2Vzc2lvbi50ZXh0LnNsaWNlKDAsIDUwMCl94oCmKCR7c2Vzc2lvbi50ZXh0Lmxlbmd0aH0gY2hhcnMpYFxuICAgICAgICAgICAgOiBzZXNzaW9uLnRleHRcbiAgICAgICAgICA6IGBlbXB0eSB0ZXh0LCBvdXRwdXRUb2tlbnM9JHtzZXNzaW9uLnVzYWdlLm91dHB1dFRva2Vuc31gO1xuICAgICAgICBjb25zdCByZWZ1c2FsID0gc2Vzc2lvbi5yZWZ1c2FsID8gYCByZWZ1c2FsPSR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbi5yZWZ1c2FsKX1gIDogXCJcIjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjbGF1ZGUgZXJyb3IgKCR7dG9rZW4ubmFtZX0pIFske3JlYXNvbn1dOiAke2JvZHl9JHtyZWZ1c2FsfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiBzZXNzaW9uLnRleHQsXG4gICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgdXNhZ2U6IHNlc3Npb24udXNhZ2UsXG4gICAgICAgIGR1cmF0aW9uTXM6IHNlc3Npb24uZHVyYXRpb25NcyxcbiAgICAgICAgdHRmdE1zOiBzZXNzaW9uLnR0ZnRNcyxcbiAgICAgICAgY29zdFVzZDogc2Vzc2lvbi5jb3N0VXNkLFxuICAgICAgICAvLyBDbGF1ZGUgQ29kZSDripQgRmFibGUgcmVmdXNhbCDsnYQgT3B1cyDroZwg7J6Q64+ZIGZhbGxiYWNrIO2VoCDsiJgg7J6I64ukLiDsmpTssq0g66qo64247J2EXG4gICAgICAgIC8vIOq3uOuMgOuhnCBzZXJ2aW5nIG1vZGVsIOuhnCDquLDroZ3tlZjrqbQg67mE7JqpL+qwkOyCrCDroZzqt7jqsIAg66qo65GQIO2LgOyWtOyngOuvgOuhnCDrkZjsnYQg6rWs67aE7ZWc64ukLlxuICAgICAgICBtb2RlbDogc2Vzc2lvbi5zZXJ2ZWRNb2RlbCA/PyBtb2RlbCxcbiAgICAgICAgcmVxdWVzdGVkTW9kZWw6IG1vZGVsLFxuICAgICAgICBtb2RlbEZhbGxiYWNrczogc2Vzc2lvbi5tb2RlbEZhbGxiYWNrcyxcbiAgICAgICAgLy8gc3lzdGVtSGFzaCDripQg7IOB7JyEIGlzc3VlQ29udkNvbnRleHQg6rCAIOyxhOyatOuLpCjsl6zquLDshKAg67mE7Jq064ukKS5cbiAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICB3b3JrZXJJZDogbWFrZUFudGhyb3BpY1dvcmtlcklkKHRva2VuLmlkKSxcbiAgICAgICAgICB0aHJlYWRJZDogc2Vzc2lvbi5zZXNzaW9uSWQsXG4gICAgICAgICAgZXBvY2g6IDAsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gZXhlYygpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFJMUQsTUFBTSxxQkFBcUI7QUFFM0IsTUFBTSxvQkFBb0I7QUFVMUIsU0FBUyw4QkFDUCxVQUNBLFFBQ1E7Q0FDUixNQUFNLFVBQVUsT0FDYixLQUFLLFVBQVUsR0FBRyxNQUFNLFVBQVUsY0FBYyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQ3BFLEtBQUssSUFBSTtDQUNaLE9BQU8sUUFBUSxTQUFTLElBQ3BCLE9BQU8sU0FBUyxvQ0FBb0MsWUFDcEQsT0FBTyxTQUFTO0FBQ3RCO0FBRUEsSUFBYSxzQkFBYixNQUErRDtDQUU3RCw0QkFBb0IsSUFBSSxJQUF5QjtDQUNqRCxtQkFBb0MsSUFBSSx5QkFBeUI7Q0FFakUsTUFBTSxRQUF1QjtFQUszQixNQUFNLFNBQVMsTUFBTSxXQUFXLHFCQUFxQixLQUFLLFdBQVc7RUFDckUsS0FBSyxNQUFNLEtBQUssUUFBUTtHQUN0QixLQUFLLFVBQVUsSUFBSSxFQUFFLElBQUk7SUFDdkIsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFO0lBQ1IsYUFBYSxFQUFFO0lBQ2YsZ0JBQWdCLEVBQUU7SUFDbEIsUUFBUSxFQUFFO0dBQ1osQ0FBQztHQUNELEtBQUssaUJBQWlCLFNB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
|
|
250
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hIH0gZnJvbSBcIi4uL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIH0gZnJvbSBcIi4uL2NvbW1vbi9zbW9vdGgtd2VpZ2h0ZWQtcm91bmQtcm9iaW5cIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UsIHR5cGUgQW50aHJvcGljUXVvdGFVc2FnZVJlc3VsdCB9IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcbiAgcHJvdmlkZXI6IHN0cmluZyxcbiAgdG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9Pixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRldGFpbHMgPSB0b2tlbnNcbiAgICAubWFwKCh0b2tlbikgPT4gYCR7dG9rZW4udG9rZW5OYW1lfSAodGhyZXNob2xkICR7dG9rZW4udGhyZXNob2xkfSUpYClcbiAgICAuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlscy5sZW5ndGggPiAwXG4gICAgPyBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsc31gXG4gICAgOiBgQWxsICR7cHJvdmlkZXJ9IHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGRgO1xufVxuXG5leHBvcnQgY2xhc3MgQW50aHJvcGljRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIC8vIHRva2VuSWQg4oaSIO2SgCDtla3rqqkuIHN0YXJ0KCkvdG9rZW4g7J2067Kk7Yq466GcIOyxhOybgFxuICBwcml2YXRlIHRva2VuUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBQb29sZWRUb2tlbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHQud2VpZ2h0LFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4odC5pZCwgdC53ZWlnaHQpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3QubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuSWRzID0gWy4uLnRoaXMudG9rZW5Qb29sLmtleXMoKV07XG4gICAgZm9yIChjb25zdCBpZCBvZiB0b2tlbklkcykgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLnRva2VuUG9vbC5jbGVhcigpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2SgOydmCDthqDtgbAg7IiYKHN0YXJ0dXAg66Gc6re4L2hlYWx0aCDsmqkpLlxuICBnZXQgdG9rZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRva2VuUG9vbC5zaXplO1xuICB9XG5cbiAgLy8gTW9uaXQg7ZGc7Iuc7JqpIOKAlCDtkoDsl5Ag7J6I64qUIO2GoO2BsCDsnbTrpoQg7Iqk64OF7IO3ICjsnbTrpoTsiJwg7KCV66CsKVxuICBnZXQgdG9rZW5OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV0ubWFwKCh0b2tlbikgPT4gdG9rZW4ubmFtZSkudG9Tb3J0ZWQoKTtcbiAgfVxuXG4gIC8vIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOuqqeuhneycvOuhnCDtkoDsnYQg7J6s64+Z6riw7ZmU7ZWc64ukKHBlcmlvZGljIHJlY29uY2lsZS/snqzsl7DqsrDsmqkpLlxuICAvLyBMSVNURU4vTk9USUZZIOqwgCDrgYrquLQg64+Z7JWIIOycoOyLpOuQnCDstpTqsIAv7IKt7KCcL+u5hO2ZnOyEse2ZlOulvCBEQiDquLDspIDsnLzroZwg64uk7IucIOunnuy2mOuLpC5cbiAgLy8g7J2067Kk7Yq4IO2VuOuTpOufrOulvCDsnqzsgqzsmqntlbQg7ZKAIOqwseyLoOydtCDsnbzqtIDrkJjqsowg7KCB7Jqp65CY64+E66GdIO2VnOuLpDpcbiAgLy8gIC0gREIg7JeQIOyXhuuKlOuNsCDtkoDsl5Ag7J6I64qUIO2GoO2BsCDihpIgb25Ub2tlblJlbW92ZWRcbiAgLy8gIC0gREIg7JeQIOyeiOuKlCDthqDtgbAg4oaSIOyLoOq3nOuptCBvblRva2VuQWRkZWQsIOq4sOyhtOydtOuptCBvblRva2VuVXBkYXRlZFxuICByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICAvLyBvblRva2VuUmVtb3ZlZCDqsIAgdG9rZW5Qb29sIOydhCBkZWxldGUg7ZWY66+A66GcIOyInO2ajCDspJEg7IiY7KCV7J2EIO2UvO2VmOugpCDtgqTrpbwg66i87KCAIOyKpOuDheyDt+2VnOuLpC5cbiAgICBjb25zdCBjdXJyZW50SWRzID0gQXJyYXkuZnJvbSh0aGlzLnRva2VuUG9vbC5rZXlzKCkpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgY3VycmVudElkcykge1xuICAgICAgaWYgKCFuZXh0LmhhcyhpZCkpIHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm93cykge1xuICAgICAgaWYgKHRoaXMudG9rZW5Qb29sLmhhcyhyLmlkKSkge1xuICAgICAgICB0aGlzLm9uVG9rZW5VcGRhdGVkKHIuaWQsIHIubmFtZSwgci5jcmVkZW50aWFscywgci5xdW90YVRocmVzaG9sZCwgci53ZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vblRva2VuQWRkZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkLCByLndlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gdG9rZW4gZXZlbnRzICh0b2tlbi1zdWJzY3JpYmVyIOqwgCDtmLjstpwpXG4gIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgb25Ub2tlblVwZGF0ZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5zZXQoaWQsIHsgaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0IH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIG9uVG9rZW5SZW1vdmVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5kZWxldGUoaWQpO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gIH1cblxuICAvLyBxdW90YSDthrXqs7wg7ZuE67O066eM7Jy866GcIOyalOyyreuniOuLpCBzbW9vdGggd2VpZ2h0ZWQgcm91bmQtcm9iaW4g7ISg7YOd7ZWc64ukLlxuICBwcml2YXRlIGFzeW5jIHNlbGVjdFRva2VuKCk6IFByb21pc2U8UG9vbGVkVG9rZW4gfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLnRva2VuUG9vbC52YWx1ZXMoKV07XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IGVsaWdpYmxlLCBvdmVyVGhyZXNob2xkVG9rZW5zIH0gPSBhd2FpdCB0aGlzLmZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3MpO1xuICAgIGlmIChlbGlnaWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGFsbF9leGNlZWRlZFwiLCB7XG4gICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICB0b2tlbkNvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50OiByb3dzLmZpbHRlcigocikgPT4gdGhpcy5oYXNRdW90YVRocmVzaG9sZChyKSkubGVuZ3RoLFxuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLFxuICAgICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwiYW50aHJvcGljXCIsIG92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZElkID0gdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNlbGVjdChuZXcgU2V0KGVsaWdpYmxlLm1hcCgodG9rZW4pID0+IHRva2VuLmlkKSkpO1xuICAgIGlmIChzZWxlY3RlZElkID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy50b2tlblBvb2wuZ2V0KHNlbGVjdGVkSWQpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbHRlckVsaWdpYmxlVG9rZW5zKHJvd3M6IFBvb2xlZFRva2VuW10pOiBQcm9taXNlPHtcbiAgICBlbGlnaWJsZTogUG9vbGVkVG9rZW5bXTtcbiAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZGVkID0gcm93cy5maWx0ZXIoKHRva2VuKSA9PiB0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSk7XG4gICAgaWYgKHRocmVzaG9sZGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MsIG92ZXJUaHJlc2hvbGRUb2tlbnM6IFtdIH07XG5cbiAgICBjb25zdCBlbGlnaWJsZUlkcyA9IG5ldyBTZXQoXG4gICAgICByb3dzLmZpbHRlcigodG9rZW4pID0+ICF0aGlzLmhhc1F1b3RhVGhyZXNob2xkKHRva2VuKSkubWFwKCh0b2tlbikgPT4gdG9rZW4uaWQpLFxuICAgICk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aHJlc2hvbGRlZC5tYXAoYXN5bmMgKHRva2VuKSA9PiAoe1xuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVzdWx0OiBhd2FpdCByZWFkQW50aHJvcGljUXVvdGFVc2FnZSh0b2tlbi5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbiksXG4gICAgICB9KSksXG4gICAgKTtcblxuICAgIGNoZWNrcy5mb3JFYWNoKChjaGVjaywgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjaGVjay5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRocmVzaG9sZGVkW2luZGV4XTtcbiAgICAgICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW4sIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IGNoZWNrLnZhbHVlLnRva2VuO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2sudmFsdWUucmVzdWx0O1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW4sIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICBlbGlnaWJsZUlkcy5hZGQodG9rZW4uaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQudXRpbGl6YXRpb25QY3QgPj0gdG9rZW4ucXVvdGFUaHJlc2hvbGQpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW4sIHJlc3VsdCk7XG4gICAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnMucHVzaCh7IHRva2VuTmFtZTogdG9rZW4ubmFtZSwgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbGlnaWJsZUlkcy5hZGQodG9rZW4uaWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgZWxpZ2libGU6IHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gZWxpZ2libGVJZHMuaGFzKHRva2VuLmlkKSksIG92ZXJUaHJlc2hvbGRUb2tlbnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUXVvdGFUaHJlc2hvbGQodG9rZW46IFBvb2xlZFRva2VuKTogdG9rZW4gaXMgUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHRva2VuLnF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbjogUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSxcbiAgICByZXN1bHQ6IEV4dHJhY3Q8QW50aHJvcGljUXVvdGFVc2FnZVJlc3VsdCwgeyBraW5kOiBcIm9rXCIgfT4sXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkXCIsIHtcbiAgICAgIHRva2VuSWQ6IHRva2VuLmlkLFxuICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICB0aHJlc2hvbGQ6IHRva2VuLnF1b3RhVGhyZXNob2xkLFxuICAgICAgY2FjaGVkVXRpbGl6YXRpb246IHJlc3VsdC51dGlsaXphdGlvblBjdCxcbiAgICAgIGNhY2hlQWdlOiByZXN1bHQuY2FjaGVBZ2VNcyxcbiAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YUxvb2t1cEZhaWxPcGVuKFxuICAgIHRva2VuOiBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9LFxuICAgIHJlYXNvbjogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBsb29rdXBfZmFpbF9vcGVuXCIsIHtcbiAgICAgIHRva2VuSWQ6IHRva2VuLmlkLFxuICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICB0aHJlc2hvbGQ6IHRva2VuLnF1b3RhVGhyZXNob2xkLFxuICAgICAgcmVhc29uOiBcImxvb2t1cF9mYWlsX29wZW5cIixcbiAgICAgIGxvb2t1cFJlYXNvbjogcmVhc29uLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGUocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuKHJlcSwgKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVTdHJlYW0ocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bihyZXEsIGNiLm9uRGVsdGEsIHsgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogdHJ1ZSB9KTtcbiAgICAgIGNiLm9uVGhyZWFkSWQ/LihyZXN1bHQudGhyZWFkQ29vcmQudGhyZWFkSWQpO1xuICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiLm9uRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2VuZXJhdGUvZ2VuZXJhdGVTdHJlYW0g6rO17Ya1IOyLpO2WiS4gb25EZWx0YSDripQg7Iqk7Yq466a87J2066m0IOygkOynhCDrsKnstpwsIOu5hOyKpO2KuOumvOydtOuptCBuby1vcC5cbiAgcHJpdmF0ZSBhc3luYyBydW4oXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgb25EZWx0YTogKHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvcHRzPzogeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyDneyEseydgCBPcGVuQUkoY29kZXgpIOqyveuhnCDsoITsmqkuIEFudGhyb3BpYyDrnbzsmrDtjIXsl5Ag7J2066+47KeAIO2UjOuemOq3uOqwgFxuICAgIC8vIOuPhOuLrO2VmOuptCDsobDsmqntnogg7YWN7Iqk7Yq466GcIO2PtOuwse2VmOyngCDslYrqs6Ag66qF7Iuc7KCB7Jy866GcIOqxsOu2gO2VnOuLpC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBBbnRocm9waWMgcm91dGVcIik7XG4gICAgfVxuICAgIC8vIG1vZGVsIOygleq3nO2ZlOulvCBkaXNwYXRjaGVyIOynhOyeheygkOyXkOyEnCDtlZwg67KIIO2VnOuLpDogcmVzdWx0Lm1vZGVsIC8gcnVuQ2xhdWRlU2Vzc2lvbiDsoITrtoBcbiAgICAvLyBjYW5vbmljYWwocHJlZml4IOyXhuuKlCBjb3N0IO2CpCkg7J2EIOyTsOqyjCDthrXsnbwuIOuvuOyngOygleydtOuptCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDigJQgcWdyaWQuZGlzcGF0Y2hlclxuICAgIC8vIOydmCBcInNvbm5ldFwiIOuzhOy5rSDsmrDtmowg7LCo64uoLiDsoJXqt5ztmZQg6rec7LmZ7J2AIGZhbGxiYWNrIOqyveuhnOyZgCDqs7XsnKAoY2Fub25pY2FsQW50aHJvcGljTW9kZWwpLlxuICAgIGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgocmVxLm1vZGVsKTtcbiAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKHJlcS5tb2RlbCk7XG4gICAgY29uc3QganNvblNjaGVtYSA9IHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEocmVxLm91dHB1dFNjaGVtYSwgXCJhbnRocm9waWNcIik7XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBhbnRocm9waWMgdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIGNvbnN0IGV4ZWMgPSBhc3luYyAoKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4gPT4ge1xuICAgICAgLy8g66eM66OMIOyehOuwlSDthqDtgbAgcHJlZW1wdGl2ZSByZWZyZXNoKOq4sOyhtCBzdGFuZGFsb25lIOqyveuhnOyZgCDrj5nsnbwpLiDsi6TtjKjtlbTrj4Qg7KeE7ZaJLlxuICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQodG9rZW4uY3JlZGVudGlhbHMpO1xuICAgICAgaWYgKFxuICAgICAgICBleHBpcmVzQXQgJiZcbiAgICAgICAgZXhwaXJlc0F0IC0gRGF0ZS5ub3coKSA8IFJFRlJFU0hfU0FGRVRZX01TICYmXG4gICAgICAgIGdldFJlZnJlc2hUb2tlbih0b2tlbi5jcmVkZW50aWFscylcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIik7XG4gICAgICAgICAgLy8gcHJvdmlkZXIg66W8IOuwmOuTnOyLnCDssYTsm4zslbwgcmVmcmVzaFRva2VuIOuCtOu2gCBUb2tlbk1vZGVsLnNhdmUg6rCAIOyEseqzte2VnOuLpC5cbiAgICAgICAgICAvLyByZWZyZXNoVG9rZW4oVG9rZW5TdWJzZXRBKSDripQgaWQvcHJvdmlkZXIvY3JlZGVudGlhbHMvbmFtZSDrp4wg7IKs7Jqp7ZWY66+A66GcIOq3uCA06rCc66eMIOuEmOq4tOuLpC5cbiAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IFFncmlkRnJhbWUucmVmcmVzaFRva2VuKHtcbiAgICAgICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgICB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIFFncmlkRnJhbWUucmVmcmVzaFRva2VuPlswXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3Rva2VuLm5hbWV9IChtb2RlbDogJHttb2RlbH0pYCk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcnVuQ2xhdWRlU2Vzc2lvbihcbiAgICAgICAge1xuICAgICAgICAgIHRva2VuSWQ6IHRva2VuLmlkLFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NUb2tlbixcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBzeXN0ZW06IHJlcS5zeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAganNvblNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQsXG4gICAgICAgICAgdGltZW91dE1zOiByZXEudGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIGlucHV0OiByZXEuY29sZElucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsOiByZXEuYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogb3B0cz8uaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICAgICAgfSxcbiAgICAgICAgb25EZWx0YSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChzZXNzaW9uLnF1b3RhRXhoYXVzdGVkKSB0aHJvdyBuZXcgRXJyb3IoYHF1b3RhIGV4aGF1c3RlZCAoJHt0b2tlbi5uYW1lfSlgKTtcbiAgICAgIGlmIChzZXNzaW9uLmlzRXJyb3IpIHtcbiAgICAgICAgLy8g7KeE64uoKFNPTi00OTUpOiBpc0Vycm9yIO2MkOyglSDsgqzsnKAoc3VidHlwZS90ZXJtaW5hbF9yZWFzb24p66W8IOuplOyLnOyngCDslZ7sl5Ag65Oc65+s64K464ukLlxuICAgICAgICAvLyDqt7jrj5nslYggZGV0YWlsIOydtCBzZXNzaW9uLnRleHQo7JmE7KCE7ZWcIEpTT04g67O466y4Keu/kOydtOudvCBcInNjaGVtYSDsnITrsJjsnbjsp4AgLyBtYXggcmV0cmllcyDsnbjsp4AgL1xuICAgICAgICAvLyBtYXggdHVybnMg7J247KeAXCLrpbwg6rWs67aE7ZWgIOyImCDsl4bsl4jri6QuIHRleHQg64qUIOynhOuLqOyXkCDtlYTsmpTtlZwg66eM7YG866eMIOyemOudvCDrjafrtpnsnbjri6QuXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgICAgc2Vzc2lvbi5zdWJ0eXBlID8/IHNlc3Npb24udGVybWluYWxSZWFzb24gPz8gKHNlc3Npb24uaXNFcnJvciA/IFwiaXNfZXJyb3JcIiA6IFwidW5rbm93blwiKTtcbiAgICAgICAgY29uc3QgYm9keSA9IHNlc3Npb24udGV4dFxuICAgICAgICAgID8gc2Vzc2lvbi50ZXh0Lmxlbmd0aCA+IDUwMFxuICAgICAgICAgICAgPyBgJHtzZXNzaW9uLnRleHQuc2xpY2UoMCwgNTAwKX3igKYoJHtzZXNzaW9uLnRleHQubGVuZ3RofSBjaGFycylgXG4gICAgICAgICAgICA6IHNlc3Npb24udGV4dFxuICAgICAgICAgIDogYGVtcHR5IHRleHQsIG91dHB1dFRva2Vucz0ke3Nlc3Npb24udXNhZ2Uub3V0cHV0VG9rZW5zfWA7XG4gICAgICAgIGNvbnN0IHJlZnVzYWwgPSBzZXNzaW9uLnJlZnVzYWwgPyBgIHJlZnVzYWw9JHtKU09OLnN0cmluZ2lmeShzZXNzaW9uLnJlZnVzYWwpfWAgOiBcIlwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNsYXVkZSBlcnJvciAoJHt0b2tlbi5uYW1lfSkgWyR7cmVhc29ufV06ICR7Ym9keX0ke3JlZnVzYWx9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IHNlc3Npb24udGV4dCxcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICB1c2FnZTogc2Vzc2lvbi51c2FnZSxcbiAgICAgICAgZHVyYXRpb25Nczogc2Vzc2lvbi5kdXJhdGlvbk1zLFxuICAgICAgICB0dGZ0TXM6IHNlc3Npb24udHRmdE1zLFxuICAgICAgICBjb3N0VXNkOiBzZXNzaW9uLmNvc3RVc2QsXG4gICAgICAgIC8vIENsYXVkZSBDb2RlIOuKlCBGYWJsZSByZWZ1c2FsIOydhCBPcHVzIOuhnCDsnpDrj5kgZmFsbGJhY2sg7ZWgIOyImCDsnojri6QuIOyalOyyrSDrqqjrjbjsnYRcbiAgICAgICAgLy8g6re464yA66GcIHNlcnZpbmcgbW9kZWwg66GcIOq4sOuhne2VmOuptCDruYTsmqkv6rCQ7IKsIOuhnOq3uOqwgCDrqqjrkZAg7YuA7Ja07KeA66+A66GcIOuRmOydhCDqtazrtoTtlZzri6QuXG4gICAgICAgIG1vZGVsOiBzZXNzaW9uLnNlcnZlZE1vZGVsID8/IG1vZGVsLFxuICAgICAgICByZXF1ZXN0ZWRNb2RlbDogbW9kZWwsXG4gICAgICAgIG1vZGVsRmFsbGJhY2tzOiBzZXNzaW9uLm1vZGVsRmFsbGJhY2tzLFxuICAgICAgICAvLyBzeXN0ZW1IYXNoIOuKlCDsg4HsnIQgaXNzdWVDb252Q29udGV4dCDqsIAg7LGE7Jq064ukKOyXrOq4sOyEoCDruYTsmrTri6QpLlxuICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgIHdvcmtlcklkOiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW4uaWQpLFxuICAgICAgICAgIHRocmVhZElkOiBzZXNzaW9uLnNlc3Npb25JZCxcbiAgICAgICAgICBlcG9jaDogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBleGVjKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsc0JBQXNCLENBQUM7QUFJMUQsTUFBTSxxQkFBcUI7QUFFM0IsTUFBTSxvQkFBb0I7QUFVMUIsU0FBUyw4QkFDUCxVQUNBLFFBQ1E7Q0FDUixNQUFNLFVBQVUsT0FDYixLQUFLLFVBQVUsR0FBRyxNQUFNLFVBQVUsY0FBYyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQ3BFLEtBQUssSUFBSTtDQUNaLE9BQU8sUUFBUSxTQUFTLElBQ3BCLE9BQU8sU0FBUyxvQ0FBb0MsWUFDcEQsT0FBTyxTQUFTO0FBQ3RCO0FBRUEsSUFBYSxzQkFBYixNQUErRDtDQUU3RCw0QkFBb0IsSUFBSSxJQUF5QjtDQUNqRCxtQkFBb0MsSUFBSSx5QkFBeUI7Q0FFakUsTUFBTSxRQUF1QjtFQUszQixNQUFNLFNBQVMsTUFBTSxXQUFXLHFCQUFxQixLQUFLLFdBQVc7RUFDckUsS0FBSyxNQUFNLEtBQUssUUFBUTtHQUN0QixLQUFLLFVBQVUsSUFBSSxFQUFFLElBQUk7SUFDdkIsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFO0lBQ1IsYUFB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
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ARGV_SAFE_MAX_UTF8_BYTES, assertAnthropicSchemaArgvSize } from "../common/schema-validation.js";
|
|
2
2
|
import { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, assertSupportedOneMillionSuffix, canonicalAnthropicModel, needsCli1mSuffix, supports1MContext, usesAdaptiveThinking } from "./anthropic-constants.js";
|
|
3
|
+
import { createTtftTracker } from "../common/ttft.js";
|
|
3
4
|
import { buildStreamJsonInput, handleStreamJsonLine } from "./stream-json-adapter.js";
|
|
4
|
-
import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
5
|
-
import { spawn } from "node:child_process";
|
|
6
5
|
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
7
|
+
import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
7
8
|
//#region src/utils/providers/anthropic/claude-session.ts
|
|
8
9
|
/**
|
|
9
10
|
* claude-session — Claude CLI 세션 spawn + QgridThreadCoord 매핑 + per-session 락.
|
|
@@ -78,9 +79,10 @@ function structuredOutputRetriesEnv(raw = process.env.MAX_STRUCTURED_OUTPUT_RETR
|
|
|
78
79
|
function shouldPinStructuredRetries(opts) {
|
|
79
80
|
return opts.useStructured && opts.includePartialMessages === true;
|
|
80
81
|
}
|
|
81
|
-
const SYSTEM_PROMPT_ARGV_MAX_BYTES =
|
|
82
|
+
const SYSTEM_PROMPT_ARGV_MAX_BYTES = ARGV_SAFE_MAX_UTF8_BYTES;
|
|
82
83
|
function buildClaudeArgs(opts) {
|
|
83
84
|
const useStructured = Boolean(opts.jsonSchema && opts.jsonSchema.length > 0);
|
|
85
|
+
if (useStructured) assertAnthropicSchemaArgvSize(opts.jsonSchema);
|
|
84
86
|
const toolArgs = useStructured ? [
|
|
85
87
|
"--tools",
|
|
86
88
|
"",
|
|
@@ -270,4 +272,4 @@ function runClaudeSession(req, onDelta) {
|
|
|
270
272
|
//#endregion
|
|
271
273
|
export { SYSTEM_PROMPT_ARGV_MAX_BYTES, applyOneMillionSuffix, buildClaudeArgs, decorateAndSerialize, ensureConfigDir, makeAnthropicWorkerId, oneMillionEnv, runClaudeSession, shouldPinStructuredRetries, structuredOutputRetriesEnv, thinkingEnv, withSessionLock };
|
|
272
274
|
|
|
273
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOunpCDtmLjstpwgZnJlc2ggYC0tc2Vzc2lvbi1pZCA8dXVpZD5g66GcIOyLpO2Wie2VnOuLpC4g7J6F66Cl7J2AIOyWtOuMke2EsOqwgCDrp4zrk6AgSlNPTkwg7J2EXG4gKiBzdGRpbiDsnLzroZwg7Z2Y66as6rOgKGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmApLCDstpzroKXsnYAg7YyM7ISc66GcIOyymOumrO2VnOuLpC5cbiAqXG4gKiDtlbXsi6wg6rOE7JW9OlxuICogIC0gY29vcmQg64qUIOyehOydmCDsoIDsnqXsnbQg7JWE64uI6528IOq4sOyhtCBRZ3JpZFRocmVhZENvb3Jke3dvcmtlcklkLHRocmVhZElkLGVwb2NoLHN5c3RlbUhhc2h9IOyXkFxuICogICAg66ek7ZWR7ZWc64ukLiB0aHJlYWRJZD3shLjshZggdXVpZCwgZXBvY2g9MCDqs6DsoJUod29ya2VyIHJlc3RhcnQg6rCc64WQIOyXhuydjCksIHdvcmtlcklkPXRva2VuIOq4sOuwmFxuICogICAg7JWI7KCVIO2VqeyEsSwgc3lzdGVtSGFzaD3smpTssq0gc3lzdGVtIO2VtOyLnC4gaXNzdWVDb252Q29udGV4dC9kZWNpZGVDb252Um91dGluZyDqs7wgcm91bmQtdHJpcC5cbiAqICAtIHdpdGhTZXNzaW9uTG9jayDsnYAgZXhwb3J0ZWQgcHJpbWl0aXZlIOuhnCDsnKDsp4DtlZzri6QuIOq4sOuzuCDqsr3roZzsl5DshJzripQg66ekIO2YuOy2nCDsg4ggc2Vzc2lvbi1pZCDrnbxcbiAqICAgIOyCrOyLpOyDgSBuby1jb250ZW50aW9uIOydtOyngOunjCwg7KeB7KCRIO2YuOy2nOyekC/thYzsiqTtirjsnZgg7KeB66Cs7ZmUIOuztOyepeydgCDrs7TsobTtlZzri6QuXG4gKiAgLSBzdHJlYW0tanNvbiDsp4HroKztmZQg7IucIFNESyBlbnZlbG9wZSh1dWlkL3Nlc3Npb25faWQvcGFyZW50X3Rvb2xfdXNlX2lkKSBkZWNvcmF0ZS5cbiAqICAtIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwg7Lac66ClIO2MjOyEnOyXkCB7IHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSDsoITri6wo7JeG7Jy866m0IHN0cmVhbU9iamVjdCDquajsp5ApLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQge1xuICBBTlRIUk9QSUNfQ0xBVURFX0NXRCxcbiAgYW50aHJvcGljQ29uZmlnRGlyLFxuICBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gIEFOVEhST1BJQ19ESVNBTExPV0VEX1RPT0xTLFxuICBhc3NlcnRTdXBwb3J0ZWRPbmVNaWxsaW9uU3VmZml4LFxuICBjYW5vbmljYWxBbnRocm9waWNNb2RlbCxcbiAgbmVlZHNDbGkxbVN1ZmZpeCxcbiAgc3VwcG9ydHMxTUNvbnRleHQsXG4gIHVzZXNBZGFwdGl2ZVRoaW5raW5nLFxufSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBidWlsZFN0cmVhbUpzb25JbnB1dCxcbiAgdHlwZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvbkxpbmUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtUmVzdWx0LFxuICBoYW5kbGVTdHJlYW1Kc29uTGluZSxcbn0gZnJvbSBcIi4vc3RyZWFtLWpzb24tYWRhcHRlclwiO1xuXG4vLyDilIDilIAgcGVyLXNlc3Npb24g6529IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzZXNzaW9uLWlkIOuLqOychCDsp4HroKztmZQgcHJpbWl0aXZlLiDquLDrs7gg6rK966Gc7JeQ7ISc64qUIOunpCDtmLjstpwg7IOIIHV1aWQg6528IOyCrOyLpOyDgSBuby1vcCDsnbTsp4Drp4wsXG4vLyDqsJnsnYAgc2Vzc2lvbi1pZCDrpbwg7KeB7KCRIOyTsOuKlCDtmLjstpzsnpDripQg7Jes7KCE7Z6IIOyngeugrO2ZlCDrs7TsnqXsnYQg67Cb64qU64ukLlxuY29uc3Qgc2Vzc2lvbkNoYWlucyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFNlc3Npb25Mb2NrPFQ+KHNlc3Npb25JZDogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gc2Vzc2lvbkNoYWlucy5nZXQoc2Vzc2lvbklkKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgLy8g7J207KCEIHR1cm4g7J2YIOyEse2MqOyZgCDrrLTqtIDtlZjqsowg7KeB66CsIOyytOyduOydhCDsnofripTri6QuXG4gIGNvbnN0IG5leHQgPSBwcmV2LnRoZW4oZm4sIGZuKTtcbiAgLy8gdGFpbDog7ISx7YyoIOustOq0gCBzZXR0bGUg65CY64qUIO2VuOuTpC4g7J206rG4IOunteyXkCDrkZDqs6AsIGZpbmFsbHkg7JeQ7IScIFwi7Jes7KCE7Z6IIOuCtOqwgCDrgZ1cIuydvCDrlYzrp4wg7IKt7KCcLlxuICAvLyAoc2V0IOynge2bhCB1bmRlZmluZWQg6rKA7IKs66GcIO2VmOuptCDsoIjrjIAg7IKt7KCcIOyViCDrj7wg7IS47IWYIGlkIOqwgCDriITsiJjrkKgg4oCUIHRhaWwg7J287LmYIOqygOyCrOuhnCDtmoztlLwuKVxuICBjb25zdCB0YWlsID0gbmV4dC50aGVuKFxuICAgICgpID0+IHt9LFxuICAgICgpID0+IHt9LFxuICApO1xuICBzZXNzaW9uQ2hhaW5zLnNldChzZXNzaW9uSWQsIHRhaWwpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuZXh0O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIOq3uCDsgqzsnbQg64uk66W4IHR1cm4g7J20IOyytOyduOydhCDsnbTslrTrsJvslZjsnLzrqbQgdGFpbCDsnbQg6rWQ7LK064+8IOyeiOuLpCDigJQg6re465WM64qUIOyCreygnO2VmOyngCDslYrripTri6QuXG4gICAgaWYgKHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPT09IHRhaWwpIHNlc3Npb25DaGFpbnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8g4pSA4pSAIGNvb3JkIOunpO2VkSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gdG9rZW4g6riw67CYIOyViOyglSB3b3JrZXJJZCDtlanshLEuIEFudGhyb3BpYyDsnYAgd29ya2VyIHBvb2wg7J20IOyXhuycvOuvgOuhnCB0b2tlbklkIOulvCDqt7jrjIDroZwg7JO064ukLlxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZDtcbn1cblxuLy8g4pSA4pSAIGVudmVsb3BlIGRlY29yYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzdHJlYW0tanNvbiDsnoXroKUg65287J247JeQIFNESyBlbnZlbG9wZSDrtoDssKkg7ZuEIOyngeugrO2ZlC4gc2Vzc2lvbiDshozsnKDsnpDsnbgg7Jes6riw7IScIO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZUFuZFNlcmlhbGl6ZShcbiAgbGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPixcbiAgc2Vzc2lvbklkOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgdXVpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgIHBhcmVudF90b29sX3VzZV9pZDogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKSArIFwiXFxuXCJcbiAgKTtcbn1cblxuLy8g4pSA4pSAIHNwYXduICsgY29uc3VtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVxdWVzdCB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW46IHN0cmluZzsgLy8gT0F1dGggYWNjZXNzIHRva2VuXG4gIG1vZGVsOiBzdHJpbmc7XG4gIHN5c3RlbT86IHN0cmluZztcbiAganNvblNjaGVtYT86IHN0cmluZzsgLy8g7J6I7Jy866m0IHN0cnVjdHVyZWQgb3V0cHV0XG4gIGVmZm9ydD86IHN0cmluZztcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIGNvbGRIaXN0b3J5PzogQXJyYXk8SnNvblZhbHVlPjtcbiAgaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD47XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVNlc3Npb25SZXN1bHQgZXh0ZW5kcyBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgd29ya2VySWQ6IG51bWJlcjtcbiAgdHRmdE1zOiBudW1iZXIgfCBudWxsO1xufVxuXG4vLyBwZXItdG9rZW4gQ0xBVURFX0NPTkZJR19ESVIg67O07J6lKOqyqeumrCkuIOqyveuhnCDqt5zsuZnsnYAgYW50aHJvcGljQ29uZmlnRGlyKOyInOyImCDtlajsiJgp7J20IOyGjOycoCDigJRcbi8vIOyXrOq4sOyEoCDqt7gg6rK966Gc7JeQIOu5iCBzZXR0aW5ncyDrpbwg6rmU7JWEIGNsYXVkZS1tZW0gaG9vayDrk7HsnYQg7LCo64uo7ZWc64ukLiAoUjEwIOqyqeumrClcbi8vIOydtCBzZWVkIO2MjOydvOydgCBjbGF1ZGUtbWVtIGhvb2sgLyDsgqzsmqnsnpAg7ISk7KCVIOyYpOyXvCDssKjri6jsnYQg7JyE7ZWcIOqyqeumrCDqsr3qs4Tri6QuIOunpCDtmLjstpzrp4jri6Qg64uk7IucIOyNqOyEnFxuLy8g7Jm467aAIOuzgOyhsMK37IKt7KCcIO2bhOyXkOuPhCDri6TsnYwg7Iuk7ZaJ7JeQ7IScIHNlbGYtaGVhbGluZyDrkJjrj4TroZ0g6riw7KG0IHNlbWFudGljcyDrpbwg7Jyg7KeA7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0Rpcih0b2tlbklkOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBkaXIgPSBhbnRocm9waWNDb25maWdEaXIodG9rZW5JZCk7XG4gIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGAke2Rpcn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgd3JpdGVGaWxlU3luYyhgJHtkaXJ9L3NldHRpbmdzLmpzb25gLCBcInt9XCIpO1xuICByZXR1cm4gZGlyO1xufVxuXG5sZXQgY3dkRW5zdXJlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW5zdXJlQ3dkKCk6IHZvaWQge1xuICBpZiAoY3dkRW5zdXJlZCkgcmV0dXJuO1xuICBta2RpclN5bmMoYCR7QU5USFJPUElDX0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhgJHtBTlRIUk9QSUNfQ0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgXCJ7fVwiKTtcbiAgY3dkRW5zdXJlZCA9IHRydWU7XG59XG5cbi8vIHNwYXduIGFyZ3Mg6rWs7ISxLiDrqYDti7DthLQv6rKp66asL3N0cnVjdHVyZWQg66qo65OcIOuwmOyYgS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9uZU1pbGxpb25TdWZmaXgobW9kZWw6IHN0cmluZywgbmVlZHNTdWZmaXg6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpO1xuICByZXR1cm4gbmVlZHNTdWZmaXggPyBgJHtiYXNlfVsxbV1gIDogYmFzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uZU1pbGxpb25FbnYoc3VwcG9ydGVkOiBib29sZWFuKTogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ/OiBcIjFcIiB9IHtcbiAgcmV0dXJuIHN1cHBvcnRlZCA/IHt9IDogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ6IFwiMVwiIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aGlua2luZ0Vudihtb2RlbDogc3RyaW5nKToge1xuICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HPzogXCIxXCI7XG4gIE1BWF9USElOS0lOR19UT0tFTlM/OiBcIjBcIjtcbn0ge1xuICByZXR1cm4gdXNlc0FkYXB0aXZlVGhpbmtpbmcobW9kZWwpXG4gICAgPyB7fVxuICAgIDoge1xuICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HOiBcIjFcIixcbiAgICAgICAgTUFYX1RISU5LSU5HX1RPS0VOUzogXCIwXCIsXG4gICAgICB9O1xufVxuXG4vLyBTT04tNDk1OiBzdHJ1Y3R1cmVkIG91dHB1dCByZXRyeSDrpbwgMSDroZwg6rOg7KCV7ZWc64ukLiBDQyDqsIAgYXR0ZW1wdCDrpbwgcmVqZWN0IO2VmOqzoCByZXRyeSDtlZjrqbRcbi8vIGB7cmVqZWN0ZWR9e2FjY2VwdGVkfWAg64iE7KCB7J20IEFJLVNESyDsnZggSlNPTi5wYXJzZSDrpbwg6rmo65yo66as66+A66GcLCByZXRyeSDsnpDssrTrpbwg66eJ7JWEIOq3uCDqsr3roZzrpbxcbi8vIOybkOyynCDssKjri6jtlZzri6QuIGAwYCDsnYAgQ0MgcXVlcnkgbG9vcChgY2FsbHNUaGlzUXVlcnkgPj0gbWF4UmV0cmllc2Ap6rCAIOyyqyBhdHRlbXB0IGVtaXQg7KCE7JeQXG4vLyDsi6TtjKjsi5ztgqTrr4DroZwoYGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzYCkg7Jm467aAIOqwkuydtCAxIOuvuOunjOydtOyWtOuPhCAxIOuhnCDtgbTrnqjtlITtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gc3RydWN0dXJlZE91dHB1dFJldHJpZXNFbnYocmF3ID0gcHJvY2Vzcy5lbnYuTUFYX1NUUlVDVFVSRURfT1VUUFVUX1JFVFJJRVMpOiB7XG4gIE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFyYXcpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQocmF3LCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogU3RyaW5nKE1hdGgubWF4KHBhcnNlZCwgMSkpIH07XG59XG5cbi8vIFNPTi00OTUg7J2YIHJldHJ5IOqzoOygleydgCBcIuyKpO2KuOumrOuwjSArIHN0cnVjdHVyZWRcIiDsobDtlakg7ZWc7KCVIOygleyxheydtOuLpC4g7Iqk7Yq466a87JeQ7IScIHJldHJ5IOqwgCDrj4zrqbRcbi8vIHdhbGwtY2xvY2sg7J20IDLrsLDqsIAg65CY7Ja0IOyLpOyaqeyEseydtCDsl4bquLAg65WM66y47J2064ukKOybkCDqsrDsoJUg7IKs7JygKS4g64W87Iqk7Yq466a8IGdlbmVyYXRlIOuKlCDslaDstIjsl5Ag7JmE66OM66W8XG4vLyDquLDri6Trpqzrr4DroZwg6re4IOyCrOycoOqwgCDshLHrpr3tlZjsp4Ag7JWK64qU64ukLiDrsJjrqbQgQ2xhdWRlIOqzhOyXtOydgCBPcGVuQUkg64yA67mEIHN0cnVjdHVyZWQgb3V0cHV0IOykgOyImOycqOydtFxuLy8g64Ku7JWELCDrhbzsiqTtirjrprzquYzsp4AgcmV0cnk9MSDroZwg66y27Jy866m0IDHtmowgcmVqZWN0IOqwgCDqs6frsJTroZxcbi8vIGBlcnJvcl9tYXhfc3RydWN0dXJlZF9vdXRwdXRfcmV0cmllc2Ag66GcIOyngeqysOuQnOuLpCjsi6TsuKE6IGRldGlfcHJvZHVjdGlvbiBvcHVzLTQtOCDsi6TtjKjsnKggMzkuNiUpLlxuLy8g7Iqk7Yq466as67CNIOyXrOu2gOuKlCBgLS1pbmNsdWRlLXBhcnRpYWwtbWVzc2FnZXNgIOulvCDrtpnsnbTripQgZ2VuZXJhdGVTdHJlYW0g6rK966Gc7JeQ7ISc66eMIHRydWUg6rCAIOuQmOuvgOuhnFxuLy8gKGFudGhyb3BpYy1kaXNwYXRjaGVyIOydmCBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDrtoTquLApIOydtOulvCDsi6Tsp4gg6rWs67aE7J6Q66GcIOyTtOuLpC5cbi8vIOu5hOyEseqztSBzdWJ0eXBlIOydhCDtla3sg4EgaXNFcnJvciDroZwg7Jis66as64qUIFNPTi00OTUg7J2YIOuCmOuouOyngCDsoIjrsJjsnYAg6re464yA66GcIOycoOyngOuQnOuLpCDigJQgcmV0cnkg7ZuE7JeQ64+EXG4vLyBkZWdlbmVyYXRlIOy2nOugpeydtOuptCDsobDsmqntnogg7Ya16rO87Iuc7YKk7KeAIOyViuqzoCDsoJXsp4HtlZjqsowg7Iuk7Yyo7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFBpblN0cnVjdHVyZWRSZXRyaWVzKG9wdHM6IHtcbiAgdXNlU3RydWN0dXJlZDogYm9vbGVhbjtcbiAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW47XG59KTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRzLnVzZVN0cnVjdHVyZWQgJiYgb3B0cy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzID09PSB0cnVlO1xufVxuXG4vLyBMaW51eCDri6jsnbwgYXJndiDsnbjsnpAg7ZWc6rOEKE1BWF9BUkdfU1RSTEVOID0gUEFHRV9TSVpFw5czMiA9IDEyOEtCLCDsu6TrhJAg7ZWY65Oc7L2U65SpIOyDgeyImClcbi8vIOyLnOyKpO2FnCDtlITroaztlITtirjqsIAg7J2066W8IOuEmOycvOuptCBleGVjdmUg6rCAIEUyQklHIOuhnCDqsbDrtoDrkJzri6QuIGRldGkg65OxIOuMgO2YlSDtlITroaztlITtirjripQg7Iuk7LihXG4vLyDtj4nqt6AgMzQzS0LCt+y1nOuMgCA0ODVLQihvcHVzLTQtOCnrnbwg7J287IOB7KCB7Jy866GcIOy0iOqzvO2VnOuLpC4g7ZWc6rOE7J2YIOygiOuwmCg2NEtCKeydhCDsnoTqs4TqsJLsnLzroZwg7J6h7JWEXG4vLyBVVEYtOCDrqYDti7DrsJTsnbTtirjCt+yYiOy4oSDrqrsg7ZWcIOyXrOycoOu2hOq5jOyngCDslYjsoIQg66eI7KeE7J2EIOuRlOuLpC5cbmV4cG9ydCBjb25zdCBTWVNURU1fUFJPTVBUX0FSR1ZfTUFYX0JZVEVTID0gNjQgKiAxMDI0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDbGF1ZGVBcmdzKG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuCDsoITri6zsnYAg7YGs6riw66GcIOu2hOq4sO2VnOuLpCjtmLjstpzrtoDqsIAg6rKw7KCVKTpcbiAgLy8gIC0g7J6R7Jy866m0IHN5c3RlbShpbmxpbmUpIOKGkiAtLXN5c3RlbS1wcm9tcHQgPHRleHQ+ICjtjIzsnbwgSS9PIOyXhuydjCwg6riw7KG0IOqyveuhnClcbiAgLy8gIC0g7YGs66m0IHN5c3RlbVByb21wdEZpbGUo6rK966GcKSDihpIgLS1zeXN0ZW0tcHJvbXB0LWZpbGUgPHBhdGg+IChhcmd2IO2VnOqzhCDtmoztlLwpXG4gIC8vIC0tc3lzdGVtLXByb21wdC1maWxlIOydgCAtLXN5c3RlbS1wcm9tcHQg7JmAIOuPmeydvO2VmOqyjCBkZWZhdWx0IOulvCByZXBsYWNlIO2VnOuLpChhcHBlbmQg7JWE64uYIOKAlFxuICAvLyBSNyDqsqnrpqwg67O07KG0LCDsi6TsuKEg7ZmV7J24KS4g65GYIOuLpCDsl4bsnLzrqbQg67mIIC0tc3lzdGVtLXByb21wdChkZWZhdWx0IDIzayDso7zsnoUg67Cp7KeAKS5cbiAgc3lzdGVtPzogc3RyaW5nO1xuICBzeXN0ZW1Qcm9tcHRGaWxlPzogc3RyaW5nO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuZWVkc09uZU1pbGxpb25TdWZmaXg/OiBib29sZWFuO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn0pOiBBcnJheTxzdHJpbmc+IHtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ob3B0cy5qc29uU2NoZW1hICYmIG9wdHMuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgLy8gLS10b29scyBcIlwiIOuhnCDsoITssrQg7LCo64uoLCBzdHJ1Y3R1cmVkKGpzb25TY2hlbWEg7J6I7J2MKSDrqbQgU3RydWN0dXJlZE91dHB1dCDrp4wg7ZeI7JqpLlxuICBjb25zdCB0b29sQXJncyA9IHVzZVN0cnVjdHVyZWRcbiAgICA/IFtcIi0tdG9vbHNcIiwgXCJcIiwgXCItLWFsbG93ZWQtdG9vbHNcIiwgXCJTdHJ1Y3R1cmVkT3V0cHV0XCJdXG4gICAgOiBbXCItLXRvb2xzXCIsIFwiXCJdO1xuXG4gIC8vIOyLnOyKpO2FnCDtlITroaztlITtirg6IO2MjOydvCDqsr3roZzqsIAg7Jik66m0IC0tc3lzdGVtLXByb21wdC1maWxlLCDslYTri4jrqbQgaW5saW5lIC0tc3lzdGVtLXByb21wdC5cbiAgLy8gKO2YuOy2nOu2gOqwgCDtgazquLDroZwg67aE6riw7ZW0IOuRmCDspJEg7ZWY64KY66eMIOyxhOyatOuLpC4g65GYIOuLpCDsl4bsnLzrqbQg67mIIC0tc3lzdGVtLXByb21wdC4pXG4gIGNvbnN0IHN5c3RlbUFyZ3MgPSBvcHRzLnN5c3RlbVByb21wdEZpbGVcbiAgICA/IFtcIi0tc3lzdGVtLXByb21wdC1maWxlXCIsIG9wdHMuc3lzdGVtUHJvbXB0RmlsZV1cbiAgICA6IFtcIi0tc3lzdGVtLXByb21wdFwiLCBvcHRzLnN5c3RlbSA/PyBcIlwiXTtcblxuICBjb25zdCBhcmdzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIFwiLXBcIixcbiAgICAuLi50b29sQXJncyxcbiAgICBcIi0tZGlzYWxsb3dlZFRvb2xzXCIsXG4gICAgLi4uQU5USFJPUElDX0RJU0FMTE9XRURfVE9PTFMsXG4gICAgXCItLWlucHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC4uLihvcHRzLmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMgPyBbXCItLWluY2x1ZGUtcGFydGlhbC1tZXNzYWdlc1wiXSA6IFtdKSxcbiAgICBcIi0tcGVybWlzc2lvbi1tb2RlXCIsXG4gICAgXCJieXBhc3NQZXJtaXNzaW9uc1wiLFxuICAgIFwiLS1zZXR0aW5nLXNvdXJjZXNcIixcbiAgICBcInByb2plY3RcIixcbiAgICBcIi0tbW9kZWxcIixcbiAgICBhcHBseU9uZU1pbGxpb25TdWZmaXgob3B0cy5tb2RlbCwgb3B0cy5uZWVkc09uZU1pbGxpb25TdWZmaXggPz8gZmFsc2UpLFxuICAgIC8vIGlubGluZSBbU3lzdGVtXSDquIjsp4Ag4oCUIOygleyLnSDssYTrhJDrp4woUjcpLiDsg53rnrUg7IucIENDIGRlZmF1bHQoMjNrKSDso7zsnoXrkJjrr4DroZwg67CY65Oc7IucIOuqheyLnC5cbiAgICAvLyDtgazquLDsl5Ag65Sw6528IC0tc3lzdGVtLXByb21wdCjsnpHsnYwpIC8gLS1zeXN0ZW0tcHJvbXB0LWZpbGUo7YG8KeuhnCDrtoTquLAoc3lzdGVtQXJncykuXG4gICAgLi4uc3lzdGVtQXJncyxcbiAgICAvLyBGYWJsZSA1IOuKlCBhZGFwdGl2ZSB0aGlua2luZyDsnbQg7ZWE7IiY7J206rOgLCBPcHVzIDUg64qUIOqzteyLnSDquLDrs7ggYWRhcHRpdmUg64+Z7J6R7J2EIOuztOyhtO2VnOuLpC5cbiAgICAuLi4odXNlc0FkYXB0aXZlVGhpbmtpbmcob3B0cy5tb2RlbCkgPyBbXSA6IFtcIi0tdGhpbmtpbmdcIiwgXCJkaXNhYmxlZFwiXSksXG4gICAgXCItLWVmZm9ydFwiLFxuICAgIG9wdHMuZWZmb3J0ID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICAgIFwiLS1zZXNzaW9uLWlkXCIsXG4gICAgb3B0cy5zZXNzaW9uSWQsXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkKSBhcmdzLnB1c2goXCItLWpzb24tc2NoZW1hXCIsIG9wdHMuanNvblNjaGVtYSEpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDbGF1ZGUg7IS47IWY7J2EIHNwYXduIO2VtCDtlZwgdHVybiDsnYQg7Iuk7ZaJ7ZWc64ukLiBwZXItc2Vzc2lvbiDrnb3snLzroZwg7KeB66Cs7ZmU65Cc64ukLlxuICogQHBhcmFtIG9uRGVsdGEg7KCQ7KeEIO2FjeyKpO2KuCBkZWx0YShzdHJlYW1UZXh0KSDrmJDripQgc3RydWN0dXJlZCDrtoDrtoQgSlNPTihzdHJlYW1PYmplY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2xhdWRlU2Vzc2lvbihcbiAgcmVxOiBDbGF1ZGVTZXNzaW9uUmVxdWVzdCxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbik6IFByb21pc2U8Q2xhdWRlU2Vzc2lvblJlc3VsdD4ge1xuICAvLyDsoJXqt5ztmZQg6rec7LmZ7J2AIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIOydtCDri6jrj4Ug7IaM7JygIOKAlCBkaXNwYXRjaGVyIOqwgCDsnbTrr7ggY2Fub25pY2FsIOydhCDrhJjquLDsp4Drp4wsXG4gIC8vIOyngeygkSDtmLjstpwo7YWM7Iqk7Yq4L+uvuOuemCBjYWxsZXIpIOuMgOu5hCDrsKnslrTsoIHsnLzroZwg7ZWcIOuyiCDrjZQg7Ya16rO87Iuc7YKo64ukKOydtOuvuCBjYW5vbmljYWwg7J2066m0IG5vLW9wKS5cbiAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKHJlcS5tb2RlbCk7XG4gIGNvbnN0IHN1cHBvcnRzT25lTWlsbGlvbiA9IHN1cHBvcnRzMU1Db250ZXh0KG1vZGVsKTtcbiAgY29uc3QgbmVlZHNPbmVNaWxsaW9uU3VmZml4ID0gbmVlZHNDbGkxbVN1ZmZpeChtb2RlbCk7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ocmVxLmpzb25TY2hlbWEgJiYgcmVxLmpzb25TY2hlbWEubGVuZ3RoID4gMCk7XG4gIGNvbnN0IHdvcmtlcklkID0gbWFrZUFudGhyb3BpY1dvcmtlcklkKHJlcS50b2tlbklkKTtcblxuICByZXR1cm4gd2l0aFNlc3Npb25Mb2NrKHNlc3Npb25JZCwgKCkgPT4ge1xuICAgIGVuc3VyZUN3ZCgpO1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IGVuc3VyZUNvbmZpZ0RpcihyZXEudG9rZW5JZCk7XG5cbiAgICAvLyDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq466W8IO2BrOq4sOuhnCDrtoTquLA6IDEyOEtCKGFyZ3Yg7ZWc6rOEKeydmCDsoIjrsJjsnYQg64SY7Jy866m0IO2MjOydvOuhnCDrhJjqsqggRTJCSUcg7ZqM7ZS8LlxuICAgIC8vIOyekeydgCDtlITroaztlITtirjripQg7YyM7J28IEkvTyDsl4bsnbQg6riw7KG0IGlubGluZSDqsr3roZzrpbwg6re464yA66GcIOyTtOuLpCjrjIDrtoDrtoTsnZgg7Zi47LacKS5cbiAgICAvLyDsi6TsoJwg7YyM7J28IOyTsOq4sOuKlCBhYm9ydCDssrTtgawg7J207ZuEKFByb21pc2Ug7JWIKeuhnCDrr7jrpIQsIOydtOuvuCDst6jshozrkJwg7JqU7LKt7JeUIOyTsOyngCDslYrripTri6QuXG4gICAgY29uc3Qgc3lzdGVtID0gcmVxLnN5c3RlbSA/PyBcIlwiO1xuICAgIGNvbnN0IHVzZVN5c3RlbVByb21wdEZpbGUgPSBCdWZmZXIuYnl0ZUxlbmd0aChzeXN0ZW0sIFwidXRmOFwiKSA+IFNZU1RFTV9QUk9NUFRfQVJHVl9NQVhfQllURVM7XG4gICAgY29uc3Qgc3lzdGVtUHJvbXB0RmlsZSA9IHVzZVN5c3RlbVByb21wdEZpbGVcbiAgICAgID8gYCR7Y29uZmlnRGlyfS9zeXN0ZW0tcHJvbXB0LSR7c2Vzc2lvbklkfS50eHRgXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGFyZ3MgPSBidWlsZENsYXVkZUFyZ3Moe1xuICAgICAgbW9kZWwsXG4gICAgICBzeXN0ZW06IHVzZVN5c3RlbVByb21wdEZpbGUgPyB1bmRlZmluZWQgOiByZXEuc3lzdGVtLFxuICAgICAgc3lzdGVtUHJvbXB0RmlsZSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCxcbiAgICAgIGpzb25TY2hlbWE6IHJlcS5qc29uU2NoZW1hLFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgbmVlZHNPbmVNaWxsaW9uU3VmZml4LFxuICAgICAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlczogcmVxLmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dExpbmVzID0gYnVpbGRTdHJlYW1Kc29uSW5wdXQoe1xuICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGlucHV0OiByZXEuaW5wdXQsXG4gICAgfSk7XG4gICAgY29uc3Qgc3RkaW5QYXlsb2FkID0gZGVjb3JhdGVBbmRTZXJpYWxpemUoaW5wdXRMaW5lcywgc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDbGF1ZGVTZXNzaW9uUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAocmVxLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDrjIDtmJUg7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuOuKlCBzcGF3biDsp4HsoITsl5Ag7YyM7J2866GcIOq4sOuhnShhcmd2IEUyQklHIO2ajO2UvCkuIOyiheujjCDsi5wg7KCV66as7ZWc64ukLlxuICAgICAgaWYgKHN5c3RlbVByb21wdEZpbGUpIHdyaXRlRmlsZVN5bmMoc3lzdGVtUHJvbXB0RmlsZSwgc3lzdGVtKTtcblxuICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICAgIC8vIHN0ZGVyciDrj4Qg7Lqh7LKYOiBpbnZhbGlkIE9BdXRoIC8g7J6Y66q765CcIO2UjOuemOq3uCAvIENMSSDqsoDspp0g7Iuk7Yyo6rCAXG4gICAgICAgIC8vIFwiY2xvc2VkIHdpdGhvdXQgcmVzdWx0XCIg66GcIOutieqwnOyngOyngCDslYrqsowgY2xvc2UvZXJyb3Ig7JeQIHN0ZGVyciDrpbwg7Iuk7Ja0IOuztOuCuOuLpC5cbiAgICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgY3dkOiBBTlRIUk9QSUNfQ0xBVURFX0NXRCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICAgICAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogcmVxLnRva2VuLFxuICAgICAgICAgIENMQVVERV9DT05GSUdfRElSOiBjb25maWdEaXIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9BVVRPX01FTU9SWTogXCIxXCIsXG4gICAgICAgICAgLi4udGhpbmtpbmdFbnYobW9kZWwpLFxuICAgICAgICAgIC4uLm9uZU1pbGxpb25FbnYoc3VwcG9ydHNPbmVNaWxsaW9uKSxcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0NMQVVERV9NRFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfVEVSTUlOQUxfVElUTEU6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQlVORExFRF9TS0lMTFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfV09SS0ZMT1dTOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICAgICAgICAgIC8vIHN0cnVjdHVyZWQgKyDsiqTtirjrpqzrsI3snbwg65WM66eMIHJldHJ5IOulvCDqs6DsoJXtlZzri6QoU09OLTQ5NSkuIHRleHQg66qo65Oc7JmAIOuFvOyKpO2KuOumvFxuICAgICAgICAgIC8vIGdlbmVyYXRlIOuKlCBDQyDquLDrs7ggcmV0cnkg66W8IOq3uOuMgOuhnCDsk7Tri6QuXG4gICAgICAgICAgLi4uKHNob3VsZFBpblN0cnVjdHVyZWRSZXRyaWVzKHtcbiAgICAgICAgICAgIHVzZVN0cnVjdHVyZWQsXG4gICAgICAgICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiByZXEuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgPyBzdHJ1Y3R1cmVkT3V0cHV0UmV0cmllc0VudigpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gICAgICBjb25zdCBzdHJlYW1TdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlID0ge307XG4gICAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgICBjb25zdCBvblRyYWNrZWREZWx0YSA9IHR0ZnRUcmFja2VyLndyYXBEZWx0YShvbkRlbHRhKTtcbiAgICAgIC8vIGJvdW5kZWQgc3RkZXJyIOuyhO2NvCjstZzqt7wgfjRLQuunjCDsnKDsp4Ag4oCUIOustO2VnCDriITsoIEg67Cp7KeAKS5cbiAgICAgIGxldCBzdGRlcnJCdWYgPSBcIlwiO1xuICAgICAgY29uc3QgU1RERVJSX0NBUCA9IDQwOTY7XG4gICAgICBjaGlsZC5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoZDogQnVmZmVyKSA9PiB7XG4gICAgICAgIHN0ZGVyckJ1ZiA9IChzdGRlcnJCdWYgKyBkLnRvU3RyaW5nKCkpLnNsaWNlKC1TVERFUlJfQ0FQKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RkZXJyU3VmZml4ID0gKCkgPT4gKHN0ZGVyckJ1Zi50cmltKCkgPyBgIOKAlCBzdGRlcnI6ICR7c3RkZXJyQnVmLnRyaW0oKX1gIDogXCJcIik7XG4gICAgICAvLyBzcGF3biDsi5wg7JO0IOyehOyLnCDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4IO2MjOydvCDsoJXrpqwo7ZWcIOuyiOunjCkuIOuqqOuToCDsooXro4wg6rK966Gc7JeQ7IScIO2YuOy2nO2VnOuLpC5cbiAgICAgIC8vIOuIhOudveuPvOuPhCDri6TsnYwgZW5zdXJlQ29uZmlnRGlyIOqwgCDrlJTroInthqDrpqzrpbwg7J6s7IKs7Jqp7ZWgIOu/kOydtOyngOunjCwgc2Vzc2lvbklkIOuzhCDtjIzsnbzsnbTrnbxcbiAgICAgIC8vIOyMk+ydtOuptCDrlJTsiqTtgazqsIAg7LCo66+A66GcIHNldHRsZSDsi5wg7KaJ7IucIOyngOyatOuLpC5cbiAgICAgIGNvbnN0IGNsZWFudXBTcGF3bkZpbGVzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXN5c3RlbVByb21wdEZpbGUpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1bmxpbmtTeW5jKHN5c3RlbVByb21wdEZpbGUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyDsnbTrr7gg7JeG6rGw64KYIOq2jO2VnCDrrLjsoJzrqbQg66y07IucIOKAlCDsoJXrpqzripQgYmVzdC1lZmZvcnQuXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZXQgY2xlYW51cEFib3J0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgY2hpbGQua2lsbCgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiB0aW1lb3V0IGFmdGVyICR7cmVxLnRpbWVvdXRNcyAvIDEwMDB9c2ApKTtcbiAgICAgIH0sIHJlcS50aW1lb3V0TXMpO1xuXG4gICAgICBjb25zdCBmaW5pc2ggPSAocmVzdWx0OiBDbGF1ZGVTdHJlYW1SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIHJlc29sdmUoeyAuLi5yZXN1bHQsIHNlc3Npb25JZCwgd29ya2VySWQsIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICBjaGlsZC5raWxsKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgIH07XG4gICAgICBjbGVhbnVwQWJvcnQgPSAoKSA9PiByZXEuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHJlcS5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgPz8gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlU3RyZWFtSnNvbkxpbmUobGluZSwgb25UcmFja2VkRGVsdGEsIHtcbiAgICAgICAgICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHVzZVN0cnVjdHVyZWQsXG4gICAgICAgICAgICBzdGF0ZTogc3RyZWFtU3RhdGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgZmluaXNoKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiBjbG9zZWQgd2l0aG91dCByZXN1bHQke3N0ZGVyclN1ZmZpeCgpfWApKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDbGF1ZGUgc2Vzc2lvbiBzcGF3biBlcnJvcjogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3RkaW4g7Jy866GcIOyeheugpSBKU09OTCDtnZjrpqzqs6Ag64ur64qU64ukLlxuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBjaGlsZC5zdGRpbj8ud3JpdGUoc3RkaW5QYXlsb2FkKTtcbiAgICAgIGNoaWxkLnN0ZGluPy5lbmQoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIHVzYWdlIOyerOuFuOy2nCjthYzsiqTtirgg7Y647J2YKS5cbmV4cG9ydCB0eXBlIHsgVG9rZW5Vc2FnZUJyZWFrZG93biB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0NBLE1BQU0sZ0NBQWdCLElBQUksSUFBOEI7QUFFeEQsZUFBc0IsZ0JBQW1CLFdBQW1CLElBQWtDO0NBRzVGLE1BQU0sUUFGTyxjQUFjLElBQUksU0FBUyxLQUFLLFFBQVEsUUFBUSxFQUVoRCxDQUFLLEtBQUssSUFBSSxFQUFFO0NBRzdCLE1BQU0sT0FBTyxLQUFLLFdBQ1YsQ0FBQyxTQUNELENBQUMsQ0FDVDtDQUNBLGNBQWMsSUFBSSxXQUFX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
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOunpCDtmLjstpwgZnJlc2ggYC0tc2Vzc2lvbi1pZCA8dXVpZD5g66GcIOyLpO2Wie2VnOuLpC4g7J6F66Cl7J2AIOyWtOuMke2EsOqwgCDrp4zrk6AgSlNPTkwg7J2EXG4gKiBzdGRpbiDsnLzroZwg7Z2Y66as6rOgKGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmApLCDstpzroKXsnYAg7YyM7ISc66GcIOyymOumrO2VnOuLpC5cbiAqXG4gKiDtlbXsi6wg6rOE7JW9OlxuICogIC0gY29vcmQg64qUIOyehOydmCDsoIDsnqXsnbQg7JWE64uI6528IOq4sOyhtCBRZ3JpZFRocmVhZENvb3Jke3dvcmtlcklkLHRocmVhZElkLGVwb2NoLHN5c3RlbUhhc2h9IOyXkFxuICogICAg66ek7ZWR7ZWc64ukLiB0aHJlYWRJZD3shLjshZggdXVpZCwgZXBvY2g9MCDqs6DsoJUod29ya2VyIHJlc3RhcnQg6rCc64WQIOyXhuydjCksIHdvcmtlcklkPXRva2VuIOq4sOuwmFxuICogICAg7JWI7KCVIO2VqeyEsSwgc3lzdGVtSGFzaD3smpTssq0gc3lzdGVtIO2VtOyLnC4gaXNzdWVDb252Q29udGV4dC9kZWNpZGVDb252Um91dGluZyDqs7wgcm91bmQtdHJpcC5cbiAqICAtIHdpdGhTZXNzaW9uTG9jayDsnYAgZXhwb3J0ZWQgcHJpbWl0aXZlIOuhnCDsnKDsp4DtlZzri6QuIOq4sOuzuCDqsr3roZzsl5DshJzripQg66ekIO2YuOy2nCDsg4ggc2Vzc2lvbi1pZCDrnbxcbiAqICAgIOyCrOyLpOyDgSBuby1jb250ZW50aW9uIOydtOyngOunjCwg7KeB7KCRIO2YuOy2nOyekC/thYzsiqTtirjsnZgg7KeB66Cs7ZmUIOuztOyepeydgCDrs7TsobTtlZzri6QuXG4gKiAgLSBzdHJlYW0tanNvbiDsp4HroKztmZQg7IucIFNESyBlbnZlbG9wZSh1dWlkL3Nlc3Npb25faWQvcGFyZW50X3Rvb2xfdXNlX2lkKSBkZWNvcmF0ZS5cbiAqICAtIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwg7Lac66ClIO2MjOyEnOyXkCB7IHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSDsoITri6wo7JeG7Jy866m0IHN0cmVhbU9iamVjdCDquajsp5ApLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIEFSR1ZfU0FGRV9NQVhfVVRGOF9CWVRFUyxcbiAgYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUsXG59IGZyb20gXCIuLi9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQge1xuICBBTlRIUk9QSUNfQ0xBVURFX0NXRCxcbiAgYW50aHJvcGljQ29uZmlnRGlyLFxuICBBTlRIUk9QSUNfREVGQVVMVF9FRkZPUlQsXG4gIEFOVEhST1BJQ19ESVNBTExPV0VEX1RPT0xTLFxuICBhc3NlcnRTdXBwb3J0ZWRPbmVNaWxsaW9uU3VmZml4LFxuICBjYW5vbmljYWxBbnRocm9waWNNb2RlbCxcbiAgbmVlZHNDbGkxbVN1ZmZpeCxcbiAgc3VwcG9ydHMxTUNvbnRleHQsXG4gIHVzZXNBZGFwdGl2ZVRoaW5raW5nLFxufSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBidWlsZFN0cmVhbUpzb25JbnB1dCxcbiAgdHlwZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvbkxpbmUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtUmVzdWx0LFxuICBoYW5kbGVTdHJlYW1Kc29uTGluZSxcbn0gZnJvbSBcIi4vc3RyZWFtLWpzb24tYWRhcHRlclwiO1xuXG4vLyDilIDilIAgcGVyLXNlc3Npb24g6529IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzZXNzaW9uLWlkIOuLqOychCDsp4HroKztmZQgcHJpbWl0aXZlLiDquLDrs7gg6rK966Gc7JeQ7ISc64qUIOunpCDtmLjstpwg7IOIIHV1aWQg6528IOyCrOyLpOyDgSBuby1vcCDsnbTsp4Drp4wsXG4vLyDqsJnsnYAgc2Vzc2lvbi1pZCDrpbwg7KeB7KCRIOyTsOuKlCDtmLjstpzsnpDripQg7Jes7KCE7Z6IIOyngeugrO2ZlCDrs7TsnqXsnYQg67Cb64qU64ukLlxuY29uc3Qgc2Vzc2lvbkNoYWlucyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFNlc3Npb25Mb2NrPFQ+KHNlc3Npb25JZDogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gc2Vzc2lvbkNoYWlucy5nZXQoc2Vzc2lvbklkKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgLy8g7J207KCEIHR1cm4g7J2YIOyEse2MqOyZgCDrrLTqtIDtlZjqsowg7KeB66CsIOyytOyduOydhCDsnofripTri6QuXG4gIGNvbnN0IG5leHQgPSBwcmV2LnRoZW4oZm4sIGZuKTtcbiAgLy8gdGFpbDog7ISx7YyoIOustOq0gCBzZXR0bGUg65CY64qUIO2VuOuTpC4g7J206rG4IOunteyXkCDrkZDqs6AsIGZpbmFsbHkg7JeQ7IScIFwi7Jes7KCE7Z6IIOuCtOqwgCDrgZ1cIuydvCDrlYzrp4wg7IKt7KCcLlxuICAvLyAoc2V0IOynge2bhCB1bmRlZmluZWQg6rKA7IKs66GcIO2VmOuptCDsoIjrjIAg7IKt7KCcIOyViCDrj7wg7IS47IWYIGlkIOqwgCDriITsiJjrkKgg4oCUIHRhaWwg7J287LmYIOqygOyCrOuhnCDtmoztlLwuKVxuICBjb25zdCB0YWlsID0gbmV4dC50aGVuKFxuICAgICgpID0+IHt9LFxuICAgICgpID0+IHt9LFxuICApO1xuICBzZXNzaW9uQ2hhaW5zLnNldChzZXNzaW9uSWQsIHRhaWwpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuZXh0O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIOq3uCDsgqzsnbQg64uk66W4IHR1cm4g7J20IOyytOyduOydhCDsnbTslrTrsJvslZjsnLzrqbQgdGFpbCDsnbQg6rWQ7LK064+8IOyeiOuLpCDigJQg6re465WM64qUIOyCreygnO2VmOyngCDslYrripTri6QuXG4gICAgaWYgKHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPT09IHRhaWwpIHNlc3Npb25DaGFpbnMuZGVsZXRlKHNlc3Npb25JZCk7XG4gIH1cbn1cblxuLy8g4pSA4pSAIGNvb3JkIOunpO2VkSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gdG9rZW4g6riw67CYIOyViOyglSB3b3JrZXJJZCDtlanshLEuIEFudGhyb3BpYyDsnYAgd29ya2VyIHBvb2wg7J20IOyXhuycvOuvgOuhnCB0b2tlbklkIOulvCDqt7jrjIDroZwg7JO064ukLlxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZDtcbn1cblxuLy8g4pSA4pSAIGVudmVsb3BlIGRlY29yYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBzdHJlYW0tanNvbiDsnoXroKUg65287J247JeQIFNESyBlbnZlbG9wZSDrtoDssKkg7ZuEIOyngeugrO2ZlC4gc2Vzc2lvbiDshozsnKDsnpDsnbgg7Jes6riw7IScIO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZUFuZFNlcmlhbGl6ZShcbiAgbGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPixcbiAgc2Vzc2lvbklkOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgdXVpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgIHBhcmVudF90b29sX3VzZV9pZDogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKSArIFwiXFxuXCJcbiAgKTtcbn1cblxuLy8g4pSA4pSAIHNwYXduICsgY29uc3VtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVxdWVzdCB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW46IHN0cmluZzsgLy8gT0F1dGggYWNjZXNzIHRva2VuXG4gIG1vZGVsOiBzdHJpbmc7XG4gIHN5c3RlbT86IHN0cmluZztcbiAganNvblNjaGVtYT86IHN0cmluZzsgLy8g7J6I7Jy866m0IHN0cnVjdHVyZWQgb3V0cHV0XG4gIGVmZm9ydD86IHN0cmluZztcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIGNvbGRIaXN0b3J5PzogQXJyYXk8SnNvblZhbHVlPjtcbiAgaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD47XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVNlc3Npb25SZXN1bHQgZXh0ZW5kcyBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgd29ya2VySWQ6IG51bWJlcjtcbiAgdHRmdE1zOiBudW1iZXIgfCBudWxsO1xufVxuXG4vLyBwZXItdG9rZW4gQ0xBVURFX0NPTkZJR19ESVIg67O07J6lKOqyqeumrCkuIOqyveuhnCDqt5zsuZnsnYAgYW50aHJvcGljQ29uZmlnRGlyKOyInOyImCDtlajsiJgp7J20IOyGjOycoCDigJRcbi8vIOyXrOq4sOyEoCDqt7gg6rK966Gc7JeQIOu5iCBzZXR0aW5ncyDrpbwg6rmU7JWEIGNsYXVkZS1tZW0gaG9vayDrk7HsnYQg7LCo64uo7ZWc64ukLiAoUjEwIOqyqeumrClcbi8vIOydtCBzZWVkIO2MjOydvOydgCBjbGF1ZGUtbWVtIGhvb2sgLyDsgqzsmqnsnpAg7ISk7KCVIOyYpOyXvCDssKjri6jsnYQg7JyE7ZWcIOqyqeumrCDqsr3qs4Tri6QuIOunpCDtmLjstpzrp4jri6Qg64uk7IucIOyNqOyEnFxuLy8g7Jm467aAIOuzgOyhsMK37IKt7KCcIO2bhOyXkOuPhCDri6TsnYwg7Iuk7ZaJ7JeQ7IScIHNlbGYtaGVhbGluZyDrkJjrj4TroZ0g6riw7KG0IHNlbWFudGljcyDrpbwg7Jyg7KeA7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0Rpcih0b2tlbklkOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBkaXIgPSBhbnRocm9waWNDb25maWdEaXIodG9rZW5JZCk7XG4gIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGAke2Rpcn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgd3JpdGVGaWxlU3luYyhgJHtkaXJ9L3NldHRpbmdzLmpzb25gLCBcInt9XCIpO1xuICByZXR1cm4gZGlyO1xufVxuXG5sZXQgY3dkRW5zdXJlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW5zdXJlQ3dkKCk6IHZvaWQge1xuICBpZiAoY3dkRW5zdXJlZCkgcmV0dXJuO1xuICBta2RpclN5bmMoYCR7QU5USFJPUElDX0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhgJHtBTlRIUk9QSUNfQ0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgXCJ7fVwiKTtcbiAgY3dkRW5zdXJlZCA9IHRydWU7XG59XG5cbi8vIHNwYXduIGFyZ3Mg6rWs7ISxLiDrqYDti7DthLQv6rKp66asL3N0cnVjdHVyZWQg66qo65OcIOuwmOyYgS5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9uZU1pbGxpb25TdWZmaXgobW9kZWw6IHN0cmluZywgbmVlZHNTdWZmaXg6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwobW9kZWwpO1xuICByZXR1cm4gbmVlZHNTdWZmaXggPyBgJHtiYXNlfVsxbV1gIDogYmFzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uZU1pbGxpb25FbnYoc3VwcG9ydGVkOiBib29sZWFuKTogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ/OiBcIjFcIiB9IHtcbiAgcmV0dXJuIHN1cHBvcnRlZCA/IHt9IDogeyBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ6IFwiMVwiIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aGlua2luZ0Vudihtb2RlbDogc3RyaW5nKToge1xuICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HPzogXCIxXCI7XG4gIE1BWF9USElOS0lOR19UT0tFTlM/OiBcIjBcIjtcbn0ge1xuICByZXR1cm4gdXNlc0FkYXB0aXZlVGhpbmtpbmcobW9kZWwpXG4gICAgPyB7fVxuICAgIDoge1xuICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HOiBcIjFcIixcbiAgICAgICAgTUFYX1RISU5LSU5HX1RPS0VOUzogXCIwXCIsXG4gICAgICB9O1xufVxuXG4vLyBTT04tNDk1OiBzdHJ1Y3R1cmVkIG91dHB1dCByZXRyeSDrpbwgMSDroZwg6rOg7KCV7ZWc64ukLiBDQyDqsIAgYXR0ZW1wdCDrpbwgcmVqZWN0IO2VmOqzoCByZXRyeSDtlZjrqbRcbi8vIGB7cmVqZWN0ZWR9e2FjY2VwdGVkfWAg64iE7KCB7J20IEFJLVNESyDsnZggSlNPTi5wYXJzZSDrpbwg6rmo65yo66as66+A66GcLCByZXRyeSDsnpDssrTrpbwg66eJ7JWEIOq3uCDqsr3roZzrpbxcbi8vIOybkOyynCDssKjri6jtlZzri6QuIGAwYCDsnYAgQ0MgcXVlcnkgbG9vcChgY2FsbHNUaGlzUXVlcnkgPj0gbWF4UmV0cmllc2Ap6rCAIOyyqyBhdHRlbXB0IGVtaXQg7KCE7JeQXG4vLyDsi6TtjKjsi5ztgqTrr4DroZwoYGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzYCkg7Jm467aAIOqwkuydtCAxIOuvuOunjOydtOyWtOuPhCAxIOuhnCDtgbTrnqjtlITtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gc3RydWN0dXJlZE91dHB1dFJldHJpZXNFbnYocmF3ID0gcHJvY2Vzcy5lbnYuTUFYX1NUUlVDVFVSRURfT1VUUFVUX1JFVFJJRVMpOiB7XG4gIE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFyYXcpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQocmF3LCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiB7IE1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTOiBcIjFcIiB9O1xuICByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogU3RyaW5nKE1hdGgubWF4KHBhcnNlZCwgMSkpIH07XG59XG5cbi8vIFNPTi00OTUg7J2YIHJldHJ5IOqzoOygleydgCBcIuyKpO2KuOumrOuwjSArIHN0cnVjdHVyZWRcIiDsobDtlakg7ZWc7KCVIOygleyxheydtOuLpC4g7Iqk7Yq466a87JeQ7IScIHJldHJ5IOqwgCDrj4zrqbRcbi8vIHdhbGwtY2xvY2sg7J20IDLrsLDqsIAg65CY7Ja0IOyLpOyaqeyEseydtCDsl4bquLAg65WM66y47J2064ukKOybkCDqsrDsoJUg7IKs7JygKS4g64W87Iqk7Yq466a8IGdlbmVyYXRlIOuKlCDslaDstIjsl5Ag7JmE66OM66W8XG4vLyDquLDri6Trpqzrr4DroZwg6re4IOyCrOycoOqwgCDshLHrpr3tlZjsp4Ag7JWK64qU64ukLiDrsJjrqbQgQ2xhdWRlIOqzhOyXtOydgCBPcGVuQUkg64yA67mEIHN0cnVjdHVyZWQgb3V0cHV0IOykgOyImOycqOydtFxuLy8g64Ku7JWELCDrhbzsiqTtirjrprzquYzsp4AgcmV0cnk9MSDroZwg66y27Jy866m0IDHtmowgcmVqZWN0IOqwgCDqs6frsJTroZxcbi8vIGBlcnJvcl9tYXhfc3RydWN0dXJlZF9vdXRwdXRfcmV0cmllc2Ag66GcIOyngeqysOuQnOuLpCjsi6TsuKE6IGRldGlfcHJvZHVjdGlvbiBvcHVzLTQtOCDsi6TtjKjsnKggMzkuNiUpLlxuLy8g7Iqk7Yq466as67CNIOyXrOu2gOuKlCBgLS1pbmNsdWRlLXBhcnRpYWwtbWVzc2FnZXNgIOulvCDrtpnsnbTripQgZ2VuZXJhdGVTdHJlYW0g6rK966Gc7JeQ7ISc66eMIHRydWUg6rCAIOuQmOuvgOuhnFxuLy8gKGFudGhyb3BpYy1kaXNwYXRjaGVyIOydmCBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDrtoTquLApIOydtOulvCDsi6Tsp4gg6rWs67aE7J6Q66GcIOyTtOuLpC5cbi8vIOu5hOyEseqztSBzdWJ0eXBlIOydhCDtla3sg4EgaXNFcnJvciDroZwg7Jis66as64qUIFNPTi00OTUg7J2YIOuCmOuouOyngCDsoIjrsJjsnYAg6re464yA66GcIOycoOyngOuQnOuLpCDigJQgcmV0cnkg7ZuE7JeQ64+EXG4vLyBkZWdlbmVyYXRlIOy2nOugpeydtOuptCDsobDsmqntnogg7Ya16rO87Iuc7YKk7KeAIOyViuqzoCDsoJXsp4HtlZjqsowg7Iuk7Yyo7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFBpblN0cnVjdHVyZWRSZXRyaWVzKG9wdHM6IHtcbiAgdXNlU3RydWN0dXJlZDogYm9vbGVhbjtcbiAgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW47XG59KTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRzLnVzZVN0cnVjdHVyZWQgJiYgb3B0cy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzID09PSB0cnVlO1xufVxuXG4vLyBMaW51eCDri6jsnbwgYXJndiDsnbjsnpAg7ZWc6rOEKE1BWF9BUkdfU1RSTEVOID0gUEFHRV9TSVpFw5czMiA9IDEyOEtCLCDsu6TrhJAg7ZWY65Oc7L2U65SpIOyDgeyImClcbi8vIOyLnOyKpO2FnCDtlITroaztlITtirjqsIAg7J2066W8IOuEmOycvOuptCBleGVjdmUg6rCAIEUyQklHIOuhnCDqsbDrtoDrkJzri6QuIGRldGkg65OxIOuMgO2YlSDtlITroaztlITtirjripQg7Iuk7LihXG4vLyDtj4nqt6AgMzQzS0LCt+y1nOuMgCA0ODVLQihvcHVzLTQtOCnrnbwg7J287IOB7KCB7Jy866GcIOy0iOqzvO2VnOuLpC4g7ZWc6rOE7J2YIOygiOuwmCg2NEtCKeydhCDsnoTqs4TqsJLsnLzroZwg7J6h7JWEXG4vLyBVVEYtOCDrqYDti7DrsJTsnbTtirjCt+yYiOy4oSDrqrsg7ZWcIOyXrOycoOu2hOq5jOyngCDslYjsoIQg66eI7KeE7J2EIOuRlOuLpC5cbmV4cG9ydCBjb25zdCBTWVNURU1fUFJPTVBUX0FSR1ZfTUFYX0JZVEVTID0gQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDbGF1ZGVBcmdzKG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuCDsoITri6zsnYAg7YGs6riw66GcIOu2hOq4sO2VnOuLpCjtmLjstpzrtoDqsIAg6rKw7KCVKTpcbiAgLy8gIC0g7J6R7Jy866m0IHN5c3RlbShpbmxpbmUpIOKGkiAtLXN5c3RlbS1wcm9tcHQgPHRleHQ+ICjtjIzsnbwgSS9PIOyXhuydjCwg6riw7KG0IOqyveuhnClcbiAgLy8gIC0g7YGs66m0IHN5c3RlbVByb21wdEZpbGUo6rK966GcKSDihpIgLS1zeXN0ZW0tcHJvbXB0LWZpbGUgPHBhdGg+IChhcmd2IO2VnOqzhCDtmoztlLwpXG4gIC8vIC0tc3lzdGVtLXByb21wdC1maWxlIOydgCAtLXN5c3RlbS1wcm9tcHQg7JmAIOuPmeydvO2VmOqyjCBkZWZhdWx0IOulvCByZXBsYWNlIO2VnOuLpChhcHBlbmQg7JWE64uYIOKAlFxuICAvLyBSNyDqsqnrpqwg67O07KG0LCDsi6TsuKEg7ZmV7J24KS4g65GYIOuLpCDsl4bsnLzrqbQg67mIIC0tc3lzdGVtLXByb21wdChkZWZhdWx0IDIzayDso7zsnoUg67Cp7KeAKS5cbiAgc3lzdGVtPzogc3RyaW5nO1xuICBzeXN0ZW1Qcm9tcHRGaWxlPzogc3RyaW5nO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuZWVkc09uZU1pbGxpb25TdWZmaXg/OiBib29sZWFuO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn0pOiBBcnJheTxzdHJpbmc+IHtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ob3B0cy5qc29uU2NoZW1hICYmIG9wdHMuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgaWYgKHVzZVN0cnVjdHVyZWQpIGFzc2VydEFudGhyb3BpY1NjaGVtYUFyZ3ZTaXplKG9wdHMuanNvblNjaGVtYSEpO1xuICAvLyAtLXRvb2xzIFwiXCIg66GcIOyghOyytCDssKjri6gsIHN0cnVjdHVyZWQoanNvblNjaGVtYSDsnojsnYwpIOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtl4jsmqkuXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgLy8g7Iuc7Iqk7YWcIO2UhOuhrO2UhO2KuDog7YyM7J28IOqyveuhnOqwgCDsmKTrqbQgLS1zeXN0ZW0tcHJvbXB0LWZpbGUsIOyVhOuLiOuptCBpbmxpbmUgLS1zeXN0ZW0tcHJvbXB0LlxuICAvLyAo7Zi47Lac67aA6rCAIO2BrOq4sOuhnCDrtoTquLDtlbQg65GYIOykkSDtlZjrgpjrp4wg7LGE7Jq064ukLiDrkZgg64ukIOyXhuycvOuptCDruYggLS1zeXN0ZW0tcHJvbXB0LilcbiAgY29uc3Qgc3lzdGVtQXJncyA9IG9wdHMuc3lzdGVtUHJvbXB0RmlsZVxuICAgID8gW1wiLS1zeXN0ZW0tcHJvbXB0LWZpbGVcIiwgb3B0cy5zeXN0ZW1Qcm9tcHRGaWxlXVxuICAgIDogW1wiLS1zeXN0ZW0tcHJvbXB0XCIsIG9wdHMuc3lzdGVtID8/IFwiXCJdO1xuXG4gIGNvbnN0IGFyZ3M6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAuLi5BTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyxcbiAgICBcIi0taW5wdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgLi4uKG9wdHMuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyA/IFtcIi0taW5jbHVkZS1wYXJ0aWFsLW1lc3NhZ2VzXCJdIDogW10pLFxuICAgIFwiLS1wZXJtaXNzaW9uLW1vZGVcIixcbiAgICBcImJ5cGFzc1Blcm1pc3Npb25zXCIsXG4gICAgXCItLXNldHRpbmctc291cmNlc1wiLFxuICAgIFwicHJvamVjdFwiLFxuICAgIFwiLS1tb2RlbFwiLFxuICAgIGFwcGx5T25lTWlsbGlvblN1ZmZpeChvcHRzLm1vZGVsLCBvcHRzLm5lZWRzT25lTWlsbGlvblN1ZmZpeCA/PyBmYWxzZSksXG4gICAgLy8gaW5saW5lIFtTeXN0ZW1dIOq4iOyngCDigJQg7KCV7IudIOyxhOuEkOunjChSNykuIOyDneuetSDsi5wgQ0MgZGVmYXVsdCgyM2spIOyjvOyeheuQmOuvgOuhnCDrsJjrk5zsi5wg66qF7IucLlxuICAgIC8vIO2BrOq4sOyXkCDrlLDrnbwgLS1zeXN0ZW0tcHJvbXB0KOyekeydjCkgLyAtLXN5c3RlbS1wcm9tcHQtZmlsZSjtgbwp66GcIOu2hOq4sChzeXN0ZW1BcmdzKS5cbiAgICAuLi5zeXN0ZW1BcmdzLFxuICAgIC8vIEZhYmxlIDUg64qUIGFkYXB0aXZlIHRoaW5raW5nIOydtCDtlYTsiJjsnbTqs6AsIE9wdXMgNSDripQg6rO17IudIOq4sOuzuCBhZGFwdGl2ZSDrj5nsnpHsnYQg67O07KG07ZWc64ukLlxuICAgIC4uLih1c2VzQWRhcHRpdmVUaGlua2luZyhvcHRzLm1vZGVsKSA/IFtdIDogW1wiLS10aGlua2luZ1wiLCBcImRpc2FibGVkXCJdKSxcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgb3B0cy5lZmZvcnQgPz8gQU5USFJPUElDX0RFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1kaXNhYmxlLXNsYXNoLWNvbW1hbmRzXCIsXG4gICAgXCItLXNlc3Npb24taWRcIixcbiAgICBvcHRzLnNlc3Npb25JZCxcbiAgXTtcbiAgaWYgKHVzZVN0cnVjdHVyZWQpIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgb3B0cy5qc29uU2NoZW1hISk7XG4gIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENsYXVkZSDshLjshZjsnYQgc3Bhd24g7ZW0IO2VnCB0dXJuIOydhCDsi6TtlontlZzri6QuIHBlci1zZXNzaW9uIOudveycvOuhnCDsp4HroKztmZTrkJzri6QuXG4gKiBAcGFyYW0gb25EZWx0YSDsoJDsp4Qg7YWN7Iqk7Yq4IGRlbHRhKHN0cmVhbVRleHQpIOuYkOuKlCBzdHJ1Y3R1cmVkIOu2gOu2hCBKU09OKHN0cmVhbU9iamVjdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5DbGF1ZGVTZXNzaW9uKFxuICByZXE6IENsYXVkZVNlc3Npb25SZXF1ZXN0LFxuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuKTogUHJvbWlzZTxDbGF1ZGVTZXNzaW9uUmVzdWx0PiB7XG4gIC8vIOygleq3nO2ZlCDqt5zsuZnsnYAgY2Fub25pY2FsQW50aHJvcGljTW9kZWwg7J20IOuLqOuPhSDshozsnKAg4oCUIGRpc3BhdGNoZXIg6rCAIOydtOuvuCBjYW5vbmljYWwg7J2EIOuEmOq4sOyngOunjCxcbiAgLy8g7KeB7KCRIO2YuOy2nCjthYzsiqTtirgv66+4656YIGNhbGxlcikg64yA67mEIOuwqeyWtOyggeycvOuhnCDtlZwg67KIIOuNlCDthrXqs7zsi5ztgqjri6Qo7J2066+4IGNhbm9uaWNhbCDsnbTrqbQgbm8tb3ApLlxuICBhc3NlcnRTdXBwb3J0ZWRPbmVNaWxsaW9uU3VmZml4KHJlcS5tb2RlbCk7XG4gIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgY29uc3Qgc3VwcG9ydHNPbmVNaWxsaW9uID0gc3VwcG9ydHMxTUNvbnRleHQobW9kZWwpO1xuICBjb25zdCBuZWVkc09uZU1pbGxpb25TdWZmaXggPSBuZWVkc0NsaTFtU3VmZml4KG1vZGVsKTtcbiAgY29uc3Qgc2Vzc2lvbklkID0gcmFuZG9tVVVJRCgpO1xuICBjb25zdCB1c2VTdHJ1Y3R1cmVkID0gQm9vbGVhbihyZXEuanNvblNjaGVtYSAmJiByZXEuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgY29uc3Qgd29ya2VySWQgPSBtYWtlQW50aHJvcGljV29ya2VySWQocmVxLnRva2VuSWQpO1xuXG4gIHJldHVybiB3aXRoU2Vzc2lvbkxvY2soc2Vzc2lvbklkLCAoKSA9PiB7XG4gICAgZW5zdXJlQ3dkKCk7XG4gICAgY29uc3QgY29uZmlnRGlyID0gZW5zdXJlQ29uZmlnRGlyKHJlcS50b2tlbklkKTtcblxuICAgIC8vIOyLnOyKpO2FnCDtlITroaztlITtirjrpbwg7YGs6riw66GcIOu2hOq4sDogMTI4S0IoYXJndiDtlZzqs4Qp7J2YIOygiOuwmOydhCDrhJjsnLzrqbQg7YyM7J2866GcIOuEmOqyqCBFMkJJRyDtmoztlLwuXG4gICAgLy8g7J6R7J2AIO2UhOuhrO2UhO2KuOuKlCDtjIzsnbwgSS9PIOyXhuydtCDquLDsobQgaW5saW5lIOqyveuhnOulvCDqt7jrjIDroZwg7JO064ukKOuMgOu2gOu2hOydmCDtmLjstpwpLlxuICAgIC8vIOyLpOygnCDtjIzsnbwg7JOw6riw64qUIGFib3J0IOyytO2BrCDsnbTtm4QoUHJvbWlzZSDslYgp66GcIOuvuOukhCwg7J2066+4IOy3qOyGjOuQnCDsmpTssq3sl5Qg7JOw7KeAIOyViuuKlOuLpC5cbiAgICBjb25zdCBzeXN0ZW0gPSByZXEuc3lzdGVtID8/IFwiXCI7XG4gICAgY29uc3QgdXNlU3lzdGVtUHJvbXB0RmlsZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHN5c3RlbSwgXCJ1dGY4XCIpID4gU1lTVEVNX1BST01QVF9BUkdWX01BWF9CWVRFUztcbiAgICBjb25zdCBzeXN0ZW1Qcm9tcHRGaWxlID0gdXNlU3lzdGVtUHJvbXB0RmlsZVxuICAgICAgPyBgJHtjb25maWdEaXJ9L3N5c3RlbS1wcm9tcHQtJHtzZXNzaW9uSWR9LnR4dGBcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYXJncyA9IGJ1aWxkQ2xhdWRlQXJncyh7XG4gICAgICBtb2RlbCxcbiAgICAgIHN5c3RlbTogdXNlU3lzdGVtUHJvbXB0RmlsZSA/IHVuZGVmaW5lZCA6IHJlcS5zeXN0ZW0sXG4gICAgICBzeXN0ZW1Qcm9tcHRGaWxlLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0LFxuICAgICAganNvblNjaGVtYTogcmVxLmpzb25TY2hlbWEsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBuZWVkc09uZU1pbGxpb25TdWZmaXgsXG4gICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiByZXEuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0TGluZXMgPSBidWlsZFN0cmVhbUpzb25JbnB1dCh7XG4gICAgICBjb2xkSGlzdG9yeTogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICB9KTtcbiAgICBjb25zdCBzdGRpblBheWxvYWQgPSBkZWNvcmF0ZUFuZFNlcmlhbGl6ZShpbnB1dExpbmVzLCBzZXNzaW9uSWQpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPENsYXVkZVNlc3Npb25SZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChyZXEuYWJvcnRTaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcImFib3J0ZWRcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIOuMgO2YlSDsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq464qUIHNwYXduIOyngeyghOyXkCDtjIzsnbzroZwg6riw66GdKGFyZ3YgRTJCSUcg7ZqM7ZS8KS4g7KKF66OMIOyLnCDsoJXrpqztlZzri6QuXG4gICAgICBpZiAoc3lzdGVtUHJvbXB0RmlsZSkgd3JpdGVGaWxlU3luYyhzeXN0ZW1Qcm9tcHRGaWxlLCBzeXN0ZW0pO1xuXG4gICAgICBjb25zdCBjaGlsZCA9IHNwYXduKFwiY2xhdWRlXCIsIGFyZ3MsIHtcbiAgICAgICAgLy8gc3RkZXJyIOuPhCDsuqHsspg6IGludmFsaWQgT0F1dGggLyDsnpjrqrvrkJwg7ZSM656Y6re4IC8gQ0xJIOqygOymnSDsi6TtjKjqsIBcbiAgICAgICAgLy8gXCJjbG9zZWQgd2l0aG91dCByZXN1bHRcIiDroZwg662J6rCc7KeA7KeAIOyViuqyjCBjbG9zZS9lcnJvciDsl5Agc3RkZXJyIOulvCDsi6TslrQg67O064K464ukLlxuICAgICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgICBjd2Q6IEFOVEhST1BJQ19DTEFVREVfQ1dELFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiByZXEudG9rZW4sXG4gICAgICAgICAgQ0xBVURFX0NPTkZJR19ESVI6IGNvbmZpZ0RpcixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FVVE9fTUVNT1JZOiBcIjFcIixcbiAgICAgICAgICAuLi50aGlua2luZ0Vudihtb2RlbCksXG4gICAgICAgICAgLi4ub25lTWlsbGlvbkVudihzdXBwb3J0c09uZU1pbGxpb24pLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQ0xBVURFX01EUzogXCIxXCIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9URVJNSU5BTF9USVRMRTogXCIxXCIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9CVU5ETEVEX1NLSUxMUzogXCIxXCIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfRElTQUJMRV9XT1JLRkxPV1M6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUjogXCIwXCIsXG4gICAgICAgICAgLy8gc3RydWN0dXJlZCArIOyKpO2KuOumrOuwjeydvCDrlYzrp4wgcmV0cnkg66W8IOqzoOygle2VnOuLpChTT04tNDk1KS4gdGV4dCDrqqjrk5zsmYAg64W87Iqk7Yq466a8XG4gICAgICAgICAgLy8gZ2VuZXJhdGUg64qUIENDIOq4sOuzuCByZXRyeSDrpbwg6re464yA66GcIOyTtOuLpC5cbiAgICAgICAgICAuLi4oc2hvdWxkUGluU3RydWN0dXJlZFJldHJpZXMoe1xuICAgICAgICAgICAgdXNlU3RydWN0dXJlZCxcbiAgICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHJlcS5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgICA/IHN0cnVjdHVyZWRPdXRwdXRSZXRyaWVzRW52KClcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICAgIGNvbnN0IHN0cmVhbVN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgPSB7fTtcbiAgICAgIGNvbnN0IHR0ZnRUcmFja2VyID0gY3JlYXRlVHRmdFRyYWNrZXIoKTtcbiAgICAgIGNvbnN0IG9uVHJhY2tlZERlbHRhID0gdHRmdFRyYWNrZXIud3JhcERlbHRhKG9uRGVsdGEpO1xuICAgICAgLy8gYm91bmRlZCBzdGRlcnIg67KE7Y28KOy1nOq3vCB+NEtC66eMIOycoOyngCDigJQg66y07ZWcIOuIhOyggSDrsKnsp4ApLlxuICAgICAgbGV0IHN0ZGVyckJ1ZiA9IFwiXCI7XG4gICAgICBjb25zdCBTVERFUlJfQ0FQID0gNDA5NjtcbiAgICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgICAgc3RkZXJyQnVmID0gKHN0ZGVyckJ1ZiArIGQudG9TdHJpbmcoKSkuc2xpY2UoLVNUREVSUl9DQVApO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGRlcnJTdWZmaXggPSAoKSA9PiAoc3RkZXJyQnVmLnRyaW0oKSA/IGAg4oCUIHN0ZGVycjogJHtzdGRlcnJCdWYudHJpbSgpfWAgOiBcIlwiKTtcbiAgICAgIC8vIHNwYXduIOyLnCDsk7Qg7J6E7IucIOyLnOyKpO2FnCDtlITroaztlITtirgg7YyM7J28IOygleumrCjtlZwg67KI66eMKS4g66qo65OgIOyiheujjCDqsr3roZzsl5DshJwg7Zi47Lac7ZWc64ukLlxuICAgICAgLy8g64iE652964+864+EIOuLpOydjCBlbnN1cmVDb25maWdEaXIg6rCAIOuUlOugie2GoOumrOulvCDsnqzsgqzsmqntlaAg67+Q7J207KeA66eMLCBzZXNzaW9uSWQg67OEIO2MjOydvOydtOudvFxuICAgICAgLy8g7IyT7J2066m0IOuUlOyKpO2BrOqwgCDssKjrr4DroZwgc2V0dGxlIOyLnCDsponsi5wg7KeA7Jq064ukLlxuICAgICAgY29uc3QgY2xlYW51cFNwYXduRmlsZXMgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3lzdGVtUHJvbXB0RmlsZSkgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHVubGlua1N5bmMoc3lzdGVtUHJvbXB0RmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIOydtOuvuCDsl4bqsbDrgpgg6raM7ZWcIOusuOygnOuptCDrrLTsi5wg4oCUIOygleumrOuKlCBiZXN0LWVmZm9ydC5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxldCBjbGVhbnVwQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjbGVhbnVwU3Bhd25GaWxlcygpO1xuICAgICAgICBjaGlsZC5raWxsKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIHRpbWVvdXQgYWZ0ZXIgJHtyZXEudGltZW91dE1zIC8gMTAwMH1zYCkpO1xuICAgICAgfSwgcmVxLnRpbWVvdXRNcyk7XG5cbiAgICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQ6IENsYXVkZVN0cmVhbVJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgY2xlYW51cFNwYXduRmlsZXMoKTtcbiAgICAgICAgcmVzb2x2ZSh7IC4uLnJlc3VsdCwgc2Vzc2lvbklkLCB3b3JrZXJJZCwgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIGNoaWxkLmtpbGwoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcImFib3J0ZWRcIikpO1xuICAgICAgfTtcbiAgICAgIGNsZWFudXBBYm9ydCA9ICgpID0+IHJlcS5hYm9ydFNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgcmVxLmFib3J0U2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgICBjaGlsZC5zdGRvdXQ/Lm9uKFwiZGF0YVwiLCAoZDogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGJ1ZmZlciArPSBkLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVTdHJlYW1Kc29uTGluZShsaW5lLCBvblRyYWNrZWREZWx0YSwge1xuICAgICAgICAgICAgc3RydWN0dXJlZE91dHB1dDogdXNlU3RydWN0dXJlZCxcbiAgICAgICAgICAgIHN0YXRlOiBzdHJlYW1TdGF0ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBmaW5pc2gocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIGNsb3NlZCB3aXRob3V0IHJlc3VsdCR7c3RkZXJyU3VmZml4KCl9YCkpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIGNsZWFudXBTcGF3bkZpbGVzKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIHNwYXduIGVycm9yOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzdGRpbiDsnLzroZwg7J6F66ClIEpTT05MIO2dmOumrOqzoCDri6vripTri6QuXG4gICAgICB0dGZ0VHJhY2tlci5tYXJrU3RhcnQoKTtcbiAgICAgIGNoaWxkLnN0ZGluPy53cml0ZShzdGRpblBheWxvYWQpO1xuICAgICAgY2hpbGQuc3RkaW4/LmVuZCgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gdXNhZ2Ug7J6s64W47LacKO2FjOyKpO2KuCDtjrjsnZgpLlxuZXhwb3J0IHR5cGUgeyBUb2tlblVzYWdlQnJlYWtkb3duIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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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=
|