@cartanova/qgrid-cli 2.10.0 → 2.10.2

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.
Files changed (77) hide show
  1. package/README.ko.md +1 -1
  2. package/README.md +1 -1
  3. package/bundle/dist/application/qgrid/conv-routing.js +4 -14
  4. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +10 -5
  5. package/bundle/dist/application/request-log/request-log.model.js +14 -12
  6. package/bundle/dist/application/request-log-step/request-log-step.model.js +7 -11
  7. package/bundle/dist/application/setting/setting.model.js +13 -27
  8. package/bundle/dist/application/token/token.model.js +52 -47
  9. package/bundle/dist/server-error-handler.js +1 -1
  10. package/bundle/dist/sonamu.config.js +3 -15
  11. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +4 -2
  12. package/bundle/dist/utils/providers/common/model-cost.js +10 -3
  13. package/bundle/src/application/qgrid/conv-routing.test.ts +0 -32
  14. package/bundle/src/application/qgrid/conv-routing.ts +7 -26
  15. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +65 -121
  16. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +12 -6
  17. package/bundle/src/application/qgrid/qgrid.frame.test.ts +10 -24
  18. package/bundle/src/application/request-log/request-log.model.test.ts +37 -2
  19. package/bundle/src/application/request-log/request-log.model.ts +14 -7
  20. package/bundle/src/application/request-log-step/request-log-step.model.ts +3 -15
  21. package/bundle/src/application/setting/setting.constant.test.ts +1 -13
  22. package/bundle/src/application/setting/setting.model.ts +10 -26
  23. package/bundle/src/application/setting/setting.persistence.test.ts +27 -0
  24. package/bundle/src/application/token/token.model.test.ts +86 -19
  25. package/bundle/src/application/token/token.model.ts +59 -44
  26. package/bundle/src/server-error-handler.ts +1 -2
  27. package/bundle/src/sonamu.config.ts +4 -31
  28. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +6 -1
  29. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +5 -2
  30. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +1 -26
  31. package/bundle/src/utils/providers/common/model-cost.test.ts +22 -1
  32. package/bundle/src/utils/providers/common/model-cost.ts +22 -5
  33. package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -11
  34. package/bundle/web-dist/client/assets/index-DtRTSTes.js +106 -0
  35. package/bundle/web-dist/client/assets/logs-BhVYDEzC.js +1 -0
  36. package/bundle/web-dist/client/assets/monit-BxN4JWqK.js +1 -0
  37. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +1 -0
  38. package/bundle/web-dist/client/assets/{routes-C8Y6olae.js → routes-CBCqRp2o.js} +1 -1
  39. package/bundle/web-dist/client/assets/services.generated-Cbvg2sGQ.js +51 -0
  40. package/bundle/web-dist/client/assets/{settings-CdVqtDQ5.js → settings-hBTEC7Ki.js} +1 -1
  41. package/bundle/web-dist/client/assets/show-BzYft5N4.js +2 -0
  42. package/bundle/web-dist/client/assets/{tokens-CxXtdk9o.js → tokens-PMybtI8X.js} +1 -1
  43. package/bundle/web-dist/client/assets/use-oauth-login-flow-C51_d6-6.js +1 -0
  44. package/bundle/web-dist/client/assets/{use-update-token-mutation-Dkv_HG-C.js → use-update-token-mutation-D-Y8OySK.js} +1 -1
  45. package/bundle/web-dist/client/index.html +2 -2
  46. package/bundle/web-dist/server/assets/{lazyRouteComponent-DyizoQKi.js → lazyRouteComponent-Bj1cPq6x.js} +2 -2
  47. package/bundle/web-dist/server/assets/{logs-DO8zBdBR.js → logs-BSk9lOHe.js} +31 -13
  48. package/bundle/web-dist/server/assets/{monit-COH4MckI.js → monit-D9W4ioUi.js} +5 -24
  49. package/bundle/web-dist/server/assets/{plus-C1D8z9o0.js → plus-CmvbWuDf.js} +1 -1
  50. package/bundle/web-dist/server/assets/{react-dom-PfWvArTX.js → react-dom-BjR1Iaz8.js} +1 -1
  51. package/bundle/web-dist/server/assets/refresh-cw-B8U9BL9-.js +23 -0
  52. package/bundle/web-dist/server/assets/{routes-Btja-741.js → routes-C7lB2Q85.js} +5 -5
  53. package/bundle/web-dist/server/assets/{services.generated-BsKOUSXl.js → services.generated-BM4X3Ecj.js} +102 -6
  54. package/bundle/web-dist/server/assets/{settings-DPcWGvy-.js → settings-BFVuldch.js} +4 -4
  55. package/bundle/web-dist/server/assets/{show-CMXbb3TJ.js → show-Cswh_tqs.js} +10 -9
  56. package/bundle/web-dist/server/assets/{tokens-DAUmTrgO.js → tokens-DiTUwUwr.js} +5 -5
  57. package/bundle/web-dist/server/assets/{use-oauth-login-flow-GsGwqefs.js → use-oauth-login-flow-DYKnG4A2.js} +32 -15
  58. package/bundle/web-dist/server/assets/{use-update-token-mutation-RujWERvj.js → use-update-token-mutation-DqGMopII.js} +1 -1
  59. package/bundle/web-dist/server/entry-server.generated.js +381 -22
  60. package/package.json +1 -1
  61. package/skills/qgrid/references/ai-sdk-provider-contract.md +4 -2
  62. package/skills/qgrid/references/anthropic-claude-code-runtime.md +3 -2
  63. package/skills/qgrid/references/request-log-run-lifecycle.md +2 -0
  64. package/skills/qgrid/references/sonamu-api-web-flow.md +3 -1
  65. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
  66. package/skills/qgrid/references/verification-and-debugging.md +24 -13
  67. package/bundle/dist/utils/providers/common/token-picker.js +0 -14
  68. package/bundle/src/utils/providers/common/token-picker.ts +0 -18
  69. package/bundle/web-dist/client/assets/index-BfwrIBHs.js +0 -106
  70. package/bundle/web-dist/client/assets/logs-Brit-LqB.js +0 -1
  71. package/bundle/web-dist/client/assets/monit-DrYZkisv.js +0 -1
  72. package/bundle/web-dist/client/assets/services.generated-Bg2XkD-D.js +0 -51
  73. package/bundle/web-dist/client/assets/show-2B2X9MkO.js +0 -2
  74. package/bundle/web-dist/client/assets/use-oauth-login-flow-B9EqnwY9.js +0 -1
  75. /package/bundle/web-dist/client/assets/{plus-CknMNCP5.js → plus-B62CuqT8.js} +0 -0
  76. /package/bundle/web-dist/client/assets/{request-model-eygfdRv7.js → request-model-D4CZPmnG.js} +0 -0
  77. /package/bundle/web-dist/server/assets/{request-model-DXclJfdP.js → request-model-CnCeaNLE.js} +0 -0
package/README.ko.md CHANGED
@@ -132,7 +132,7 @@ import { generateText } from "ai";
132
132
  import { qgrid } from "@cartanova/qgrid-ai-sdk";
133
133
 
134
134
  const { text } = await generateText({
135
- model: qgrid("openai/gpt-5.6-luna"),
135
+ model: qgrid("openai/gpt-6-luna"),
136
136
  prompt: "서울 날씨 알려줘",
137
137
  });
138
138
  ```
package/README.md CHANGED
@@ -133,7 +133,7 @@ import { generateText } from "ai";
133
133
  import { qgrid } from "@cartanova/qgrid-ai-sdk";
134
134
 
135
135
  const { text } = await generateText({
136
- model: qgrid("openai/gpt-5.6-luna"),
136
+ model: qgrid("openai/gpt-6-luna"),
137
137
  prompt: "What's the weather in Seoul?",
138
138
  });
139
139
  ```
@@ -3,12 +3,9 @@ import { createHash } from "node:crypto";
3
3
  /**
4
4
  * conv-routing — 대화 연속성(cache affinity) 좌표 검증/구성.
5
5
  *
6
- * 목표: thread(=conversation_id=prompt_cache_key)를 재사용해 OpenAI prompt caching 적중.
7
- * - 후속 turn: 기존 thread 에 delta(마지막 user / tool 결과)만 보냄 (history inject 없음).
8
- * - 첫 turn / 검증 실패: 새 thread + history inject (폴백, 정확성 보존).
9
- *
10
- * 식별: 서버 발급 불투명 thread 좌표(QgridThreadCoord)를 클라가 그대로 회송.
11
- * 검증: systemHash(다른 대화 오접속 차단) + (dispatcher의) epoch/worker 생존.
6
+ * 모든 turn은 현재 input과 전체 history를 전달한다.
7
+ * OpenAI의 epoch=-1 좌표는 system/model hash와 opaque affinity를 검증한 뒤
8
+ * token 선택과 prompt-cache 힌트로만 사용한다.
12
9
  */
13
10
  function systemHash(system, modelNamespace) {
14
11
  return createHash("sha256").update(modelNamespace === void 0 ? system ?? "" : `${modelNamespace}\0${system ?? ""}`).digest("hex").slice(0, 16);
@@ -25,15 +22,8 @@ function decideConvRouting(input, options = {}) {
25
22
  const history = input.history ? JSON.parse(input.history) : void 0;
26
23
  const coord = input.runContext?.threadCoord;
27
24
  const directCoordEligible = options.directOpenAI === true && coord?.epoch === -1 && coord.systemHash === sysHash && input.cacheAffinityKey !== void 0 && coord.threadId === input.cacheAffinityKey;
28
- const legacyReuseEligible = options.directOpenAI !== true && coord !== void 0 && coord.systemHash === sysHash;
29
25
  const cacheKey = options.directOpenAI ? input.cacheAffinityKey : void 0;
30
26
  return {
31
- reuse: legacyReuseEligible && coord ? {
32
- workerId: coord.workerId,
33
- threadId: coord.threadId,
34
- epoch: coord.epoch
35
- } : void 0,
36
- reuseInput: legacyReuseEligible ? buildDeltaInput(input) : void 0,
37
27
  coldInput: buildDeltaInput(input),
38
28
  coldHistory: history,
39
29
  systemHash: sysHash,
@@ -90,4 +80,4 @@ function issueConvContext(threadCoord, decision, preferredTokenId = threadCoord.
90
80
  //#endregion
91
81
  export { decideConvRouting, issueConvContext, systemHash };
92
82
 
93
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIOuMgO2ZlCDsl7Dsho3shLEoY2FjaGUgYWZmaW5pdHkpIOyijO2RnCDqsoDspp0v6rWs7ISxLlxuICpcbiAqIOuqqe2RnDogdGhyZWFkKD1jb252ZXJzYXRpb25faWQ9cHJvbXB0X2NhY2hlX2tleSnrpbwg7J6s7IKs7Jqp7ZW0IE9wZW5BSSBwcm9tcHQgY2FjaGluZyDsoIHspJEuXG4gKiAtIO2bhOyGjSB0dXJuOiDquLDsobQgdGhyZWFkIOyXkCBkZWx0YSjrp4jsp4Drp4kgdXNlciAvIHRvb2wg6rKw6rO8KeunjCDrs7Trg4QgKGhpc3RvcnkgaW5qZWN0IOyXhuydjCkuXG4gKiAtIOyyqyB0dXJuIC8g6rKA7KadIOyLpO2MqDog7IOIIHRocmVhZCArIGhpc3RvcnkgaW5qZWN0ICjtj7TrsLEsIOygle2ZleyEsSDrs7TsobQpLlxuICpcbiAqIOyLneuzhDog7ISc67KEIOuwnOq4iSDrtojtiKzrqoUgdGhyZWFkIOyijO2RnChRZ3JpZFRocmVhZENvb3JkKeulvCDtgbTrnbzqsIAg6re464yA66GcIO2ajOyGoS5cbiAqIOqygOymnTogc3lzdGVtSGFzaCjri6Trpbgg64yA7ZmUIOyYpOygkeyGjSDssKjri6gpICsgKGRpc3BhdGNoZXLsnZgpIGVwb2NoL3dvcmtlciDsg53sobQuXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgdHlwZSBSZXVzZVRocmVhZENvb3JkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUsIHR5cGUgVXNlcklucHV0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nLCBtb2RlbE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShtb2RlbE5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkID8gKHN5c3RlbSA/PyBcIlwiKSA6IGAke21vZGVsTmFtZXNwYWNlfVxcMCR7c3lzdGVtID8/IFwiXCJ9YClcbiAgICAuZGlnZXN0KFwiaGV4XCIpXG4gICAgLnNsaWNlKDAsIDE2KTtcbn1cblxuLy8gdG9vbCDqsrDqs7zrpbwg64uk7J2MIHR1cm4g7J2YIGlucHV0IHRleHQg66GcIOuzgO2ZmCAocHJvdmlkZXIg7J6F66Cl7J2AIFVzZXJJbnB1dCDrp4wg67Cb7J2MKS5cbmZ1bmN0aW9uIHRvb2xSZXN1bHRzVG9UZXh0KHRvb2xSZXN1bHRzOiBRZ3JpZFRvb2xSZXN1bHRJbnB1dFtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSB0b29sUmVzdWx0cy5tYXAoKHRyKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHRyLnRvb2xOYW1lID8gYCAoJHt0ci50b29sTmFtZX0pYCA6IFwiXCI7XG4gICAgY29uc3QgZXJyTWFyayA9IHRyLmlzRXJyb3IgPyBcIiBbZXJyb3JdXCIgOiBcIlwiO1xuICAgIHJldHVybiBgVG9vbCByZXN1bHQgZm9yIGNhbGwgJHt0ci50b29sQ2FsbElkfSR7bmFtZX0ke2Vyck1hcmt9OiAke3RyLm91dHB1dH1gO1xuICB9KTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuXFxuTm93IGNvbnRpbnVlIGFuc3dlcmluZyB0aGUgdXNlcidzIHJlcXVlc3QgdXNpbmcgdGhlc2UgcmVzdWx0cy5gO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZEZWNpc2lvbiB7XG4gIC8vIGRpc3BhdGNoZXIg66GcIOuEmOq4uCByZXVzZSDsooztkZwgKOqygOymnSDthrXqs7wg7Iuc7JeQ66eMKS4gZGlzcGF0Y2hlciDqsIAgZXBvY2gvd29ya2VyIOyDneyhtCDsnqzqsoDspp0g7ZuEIO2PtOuwsSDqsIDriqUuXG4gIHJldXNlPzogUmV1c2VUaHJlYWRDb29yZDtcbiAgLy8g7J6s7IKs7JqpIOyEseqztSDsi5wgdHVybi9zdGFydCDsl5Ag67O064K8IGlucHV0IOKAlCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wuIHJldXNlIOqwgCDsnojsnYQg65WM66eMIOyEpOyglS5cbiAgcmV1c2VJbnB1dD86IEFycmF5PFVzZXJJbnB1dD47XG4gIC8vIOyyqyB0dXJuIC8g7J6s7IKs7JqpIO2PtOuwsSDsi5wg67O064K8IGlucHV0IOKAlCDsoITssrQgcHJvbXB0LiDtla3sg4Eg7ISk7KCVKO2PtOuwsSDslYjsoITrp50pLlxuICBjb2xkSW5wdXQ6IEFycmF5PFVzZXJJbnB1dD47XG4gIC8vIOyDiCB0aHJlYWQg7J28IOuVjCBpbmplY3Qg7ZWgIOyghOyytCBoaXN0b3J5LiDsnqzsgqzsmqkg7ISx6rO1IOyLnOyXlCBkaXNwYXRjaGVyIOqwgCDslYgg7JO064ukKHRocmVhZCDqsIAg7J2066+4IOuIhOyggSkuXG4gIGNvbGRIaXN0b3J5PzogQXJyYXk8SnNvblZhbHVlPjtcbiAgLy8g7J20IOyalOyyrSDsi5zsoJDsnZggc3lzdGVtIO2VtOyLnCAo7J2R64u17JeQ7IScIHRocmVhZCDsooztkZwg67Cc6riJIOyLnCDsgqzsmqkpLlxuICBzeXN0ZW1IYXNoOiBzdHJpbmc7XG4gIC8vIERpcmVjdC1wcm92aWRlciBjYWNoZSBhZmZpbml0eS4gUHJlc2VuY2UgbWFya3MgdGhlIGVwb2NoPS0xIGNvb3JkaW5hdGUgc2VtYW50aWNzLlxuICBwcm9tcHRDYWNoZUtleT86IHN0cmluZztcbiAgcHJlZmVycmVkVG9rZW5JZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252Um91dGluZ09wdGlvbnMge1xuICBkaXJlY3RPcGVuQUk/OiBib29sZWFuO1xuICBtb2RlbE5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuLy8gdGhyZWFkIOyijO2RnCArIOuTpOyWtOyYqCDsmpTssq3snLzroZwgXCLsnqzsgqzsmqkg6rCA64ql7ZWc6rCAXCLrpbwg7YyQ7KCV7ZWY6rOgLCByZXVzZS9jb2xkIOyWkeyqvSBwYXlsb2FkIOulvCDqtazshLHtlZzri6QuXG4vLyBkaXNwYXRjaGVyIOuLqOydmCBlcG9jaC93b3JrZXIg7IOd7KG0IOqygOymneydgCDsl6zquLDshJwg66q7IO2VmOuvgOuhnCjsg4Htg5wg7JeG7J2MKSByZXVzZSDsooztkZwgKyDrkZAgcGF5bG9hZCDrpbxcbi8vIOuqqOuRkCDrhJjquLDqs6AsIGRpc3BhdGNoZXIg7J2YIGFjcXVpcmVSZXVzZVdvcmtlciDqsrDqs7zsl5Ag65Sw6528IHJldXNlKGRlbHRhKSDrmJDripQgY29sZCjsoITssrQpIOulvCDqs6Drpbjri6QuXG4vLyDslpHsqr3snYQg64ukIOuTpOqzoCDqsIDslbwgcmV1c2Ug6rCAIOyLpO2MqOuhnCDtj7TrsLHrj7zrj4Qg7KCE7LK0IGhpc3Rvcnkg66GcIOusuOunpeydhCDrs7XqtaztlaAg7IiYIOyeiOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVDb252Um91dGluZyhcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIG9wdGlvbnM6IENvbnZSb3V0aW5nT3B0aW9ucyA9IHt9LFxuKTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goXG4gICAgaW5wdXQuc3lzdGVtLFxuICAgIG9wdGlvbnMuZGlyZWN0T3BlbkFJID8gKG9wdGlvbnMubW9kZWxOYW1lc3BhY2UgPz8gaW5wdXQubW9kZWwgPz8gXCJvcGVuYWlcIikgOiB1bmRlZmluZWQsXG4gICk7XG4gIGNvbnN0IGhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4gfCB1bmRlZmluZWQgPSBpbnB1dC5oaXN0b3J5XG4gICAgPyAoSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSBhcyBBcnJheTxKc29uVmFsdWU+KVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvb3JkID0gaW5wdXQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG5cbiAgLy8g7J6s7IKs7JqpIOyekOqyqTog7KKM7ZGcIOyhtOyerCArIHN5c3RlbSDrj5nsnbwuIHNlc3Npb25LZXkg6rKp66asICsgc3lzdGVtSGFzaCDroZwg64yA7ZmUIOuPmeydvOyEseydtFxuICAvLyDrs7TsnqXrkJjqs6AsIOqzte2GtSBwcmVmaXgg64qUIOuwseyXlOuTnOqwgCBwcm9tcHRfY2FjaGVfa2V5IOqzoOygleycvOuhnCDslYzslYTshJwg7LqQ7Iuc7ZWc64ukLlxuICBjb25zdCBkaXJlY3RDb29yZEVsaWdpYmxlID1cbiAgICBvcHRpb25zLmRpcmVjdE9wZW5BSSA9PT0gdHJ1ZSAmJlxuICAgIGNvb3JkPy5lcG9jaCA9PT0gLTEgJiZcbiAgICBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoICYmXG4gICAgaW5wdXQuY2FjaGVBZmZpbml0eUtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgY29vcmQudGhyZWFkSWQgPT09IGlucHV0LmNhY2hlQWZmaW5pdHlLZXk7XG4gIGNvbnN0IGxlZ2FjeVJldXNlRWxpZ2libGUgPVxuICAgIG9wdGlvbnMuZGlyZWN0T3BlbkFJICE9PSB0cnVlICYmIGNvb3JkICE9PSB1bmRlZmluZWQgJiYgY29vcmQuc3lzdGVtSGFzaCA9PT0gc3lzSGFzaDtcbiAgLy8gYWZmaW5pdHkg66W8IOyalOyyre2VmOyngCDslYrsnYAgb25lLXNob3Qg7JqU7LKt7JeQIOyehOydmCDtgqTrpbwg67aZ7J2066m0IHRyYW5zcG9ydCDqsIAg6re4IOyGjOy8k+ydhFxuICAvLyBhZmZpbml0eSDshozsvJPsnLzroZwg7Jik7J247ZW0IOyerOyCrOyaqeuQmOyngCDslYrsnYQg7Jew6rKw7J2EIOqzhOyGjSDrtpnrk6TslrQg65GU64ukIOKGkiDtgqTrpbwg67mE7JuMIOuRlOuLpC5cbiAgY29uc3QgY2FjaGVLZXkgPSBvcHRpb25zLmRpcmVjdE9wZW5BSSA/IGlucHV0LmNhY2hlQWZmaW5pdHlLZXkgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXVzZTpcbiAgICAgIGxlZ2FjeVJldXNlRWxpZ2libGUgJiYgY29vcmRcbiAgICAgICAgPyB7IHdvcmtlcklkOiBjb29yZC53b3JrZXJJZCwgdGhyZWFkSWQ6IGNvb3JkLnRocmVhZElkLCBlcG9jaDogY29vcmQuZXBvY2ggfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAvLyDsnqzsgqzsmqkgdHVybiDsnYAgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMIOKAlCB0aHJlYWQg6rCAIOydtOuvuCDsnbTsoIQgdHVybiDrk6TsnYQg64iE7KCBLlxuICAgIHJldXNlSW5wdXQ6IGxlZ2FjeVJldXNlRWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuIHRvb2wg6rKw6rO8IGZvbGxvdy11cCDsnbQgY29sZCDroZwg65ao7Ja07KC464+EXG4gICAgLy8g7Iuk7ZaJIHVzZXIg7KSE7JeQ64qUIFwi7J20IOqysOqzvOuhnCDqs4Tsho0g64u17ZWY6528XCLripQgY29udGludWF0aW9uIOydtCDrk6TslrTqsIDslbwg7ZWc64ukLlxuICAgIGNvbGRJbnB1dDogYnVpbGREZWx0YUlucHV0KGlucHV0KSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICAgIHByb21wdENhY2hlS2V5OiBjYWNoZUtleSxcbiAgICBwcmVmZXJyZWRUb2tlbklkOiBkaXJlY3RDb29yZEVsaWdpYmxlID8gY29vcmQud29ya2VySWQgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIO2bhOyGjSB0dXJuIOydmCBpbnB1dDogdG9vbCDqsrDqs7zqsIAg7J6I7Jy866m0IOq3uOqxuCB0ZXh0IOuhnCwg7JeG7Jy866m0IOuniOyngOuniSB1c2VyKHByb21wdCkuXG5mdW5jdGlvbiBidWlsZERlbHRhSW5wdXQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBBcnJheTxVc2VySW5wdXQ+IHtcbiAgaWYgKGlucHV0LnRvb2xSZXN1bHRzICYmIGlucHV0LnRvb2xSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRvb2xSZXN1bHRzVG9UZXh0KGlucHV0LnRvb2xSZXN1bHRzKSwgdGV4dF9lbGVtZW50czogW10gfV07XG4gIH1cbiAgaWYgKGlucHV0LmlucHV0ICYmIGlucHV0LmlucHV0Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBoYXNUZXh0ID0gaW5wdXQuaW5wdXQuc29tZSgocGFydCkgPT4gcGFydC50eXBlID09PSBcInRleHRcIik7XG4gICAgY29uc3QgcGFydHM6IEFycmF5PFVzZXJJbnB1dD4gPSBpbnB1dC5pbnB1dC5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBwYXJ0LnRleHQsIHRleHRfZWxlbWVudHM6IHBhcnQudGV4dF9lbGVtZW50cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbWFnZVwiLCB1cmw6IHBhcnQudXJsIH07XG4gICAgfSk7XG4gICAgaWYgKCFoYXNUZXh0ICYmIGlucHV0LnByb21wdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0LnByb21wdCwgdGV4dF9lbGVtZW50czogW10gfSwgLi4ucGFydHNdO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cbiAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dC5wcm9tcHQsIHRleHRfZWxlbWVudHM6IFtdIH1dO1xufVxuXG4vLyDsnZHri7UgdGhyZWFkQ29vcmQgKyDsmpTssq0g7Iuc7KCQIOygleuztOuhnCDri6TsnYwgdGhyZWFkIOyijO2RnOulvCDrsJzquIntlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gaXNzdWVDb252Q29udGV4dChcbiAgdGhyZWFkQ29vcmQ6IFJldXNlVGhyZWFkQ29vcmQsXG4gIGRlY2lzaW9uOiBDb252RGVjaXNpb24sXG4gIHByZWZlcnJlZFRva2VuSWQgPSB0aHJlYWRDb29yZC53b3JrZXJJZCxcbik6IFFncmlkVGhyZWFkQ29vcmQge1xuICBpZiAoZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2VySWQ6IHByZWZlcnJlZFRva2VuSWQsXG4gICAgICB0aHJlYWRJZDogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICBlcG9jaDogLTEsXG4gICAgICBzeXN0ZW1IYXNoOiBkZWNpc2lvbi5zeXN0ZW1IYXNoLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3b3JrZXJJZDogdGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgdGhyZWFkSWQ6IHRocmVhZENvb3JkLnRocmVhZElkLFxuICAgIGVwb2NoOiB0aHJlYWRDb29yZC5lcG9jaCxcbiAgICBzeXN0ZW1IYXNoOiBkZWNpc2lvbi5zeXN0ZW1IYXNoLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFnQkEsU0FBZ0IsV0FBVyxRQUFpQixnQkFBaUM7Q0FDM0UsT0FBTyxXQUFXLFFBQVEsQ0FBQyxDQUN4QixPQUFPLG1CQUFtQixTQUFhLFVBQVUsS0FBTSxHQUFHLGVBQWUsSUFBSSxVQUFVLElBQUksQ0FBQyxDQUM1RixPQUFPLEtBQUssQ0FBQyxDQUNiLE1BQU0s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
83
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIOuMgO2ZlCDsl7Dsho3shLEoY2FjaGUgYWZmaW5pdHkpIOyijO2RnCDqsoDspp0v6rWs7ISxLlxuICpcbiAqIOuqqOuToCB0dXJu7J2AIO2YhOyerCBpbnB1dOqzvCDsoITssrQgaGlzdG9yeeulvCDsoITri6ztlZzri6QuXG4gKiBPcGVuQUnsnZggZXBvY2g9LTEg7KKM7ZGc64qUIHN5c3RlbS9tb2RlbCBoYXNo7JmAIG9wYXF1ZSBhZmZpbml0eeulvCDqsoDspp3tlZwg65KkXG4gKiB0b2tlbiDshKDtg53qs7wgcHJvbXB0LWNhY2hlIO2ejO2KuOuhnOunjCDsgqzsmqntlZzri6QuXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgdHlwZSBSZXVzZVRocmVhZENvb3JkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUsIHR5cGUgVXNlcklucHV0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nLCBtb2RlbE5hbWVzcGFjZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShtb2RlbE5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkID8gKHN5c3RlbSA/PyBcIlwiKSA6IGAke21vZGVsTmFtZXNwYWNlfVxcMCR7c3lzdGVtID8/IFwiXCJ9YClcbiAgICAuZGlnZXN0KFwiaGV4XCIpXG4gICAgLnNsaWNlKDAsIDE2KTtcbn1cblxuLy8gdG9vbCDqsrDqs7zrpbwg64uk7J2MIHR1cm4g7J2YIGlucHV0IHRleHQg66GcIOuzgO2ZmCAocHJvdmlkZXIg7J6F66Cl7J2AIFVzZXJJbnB1dCDrp4wg67Cb7J2MKS5cbmZ1bmN0aW9uIHRvb2xSZXN1bHRzVG9UZXh0KHRvb2xSZXN1bHRzOiBRZ3JpZFRvb2xSZXN1bHRJbnB1dFtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSB0b29sUmVzdWx0cy5tYXAoKHRyKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHRyLnRvb2xOYW1lID8gYCAoJHt0ci50b29sTmFtZX0pYCA6IFwiXCI7XG4gICAgY29uc3QgZXJyTWFyayA9IHRyLmlzRXJyb3IgPyBcIiBbZXJyb3JdXCIgOiBcIlwiO1xuICAgIHJldHVybiBgVG9vbCByZXN1bHQgZm9yIGNhbGwgJHt0ci50b29sQ2FsbElkfSR7bmFtZX0ke2Vyck1hcmt9OiAke3RyLm91dHB1dH1gO1xuICB9KTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuXFxuTm93IGNvbnRpbnVlIGFuc3dlcmluZyB0aGUgdXNlcidzIHJlcXVlc3QgdXNpbmcgdGhlc2UgcmVzdWx0cy5gO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZEZWNpc2lvbiB7XG4gIC8vIOunpCB0dXJu7J2YIO2YhOyerCB1c2VyL3Rvb2wgaW5wdXQuXG4gIGNvbGRJbnB1dDogQXJyYXk8VXNlcklucHV0PjtcbiAgLy8g66ekIHR1cm7sl5Ag64uk7IucIOyghOuLrO2VoCDsoITssrQgaGlzdG9yeS5cbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICAvLyDsnbQg7JqU7LKtIOyLnOygkOydmCBzeXN0ZW0g7ZW07IucICjsnZHri7Xsl5DshJwgdGhyZWFkIOyijO2RnCDrsJzquIkg7IucIOyCrOyaqSkuXG4gIHN5c3RlbUhhc2g6IHN0cmluZztcbiAgLy8gRGlyZWN0LXByb3ZpZGVyIGNhY2hlIGFmZmluaXR5LiBQcmVzZW5jZSBtYXJrcyB0aGUgZXBvY2g9LTEgY29vcmRpbmF0ZSBzZW1hbnRpY3MuXG4gIHByb21wdENhY2hlS2V5Pzogc3RyaW5nO1xuICBwcmVmZXJyZWRUb2tlbklkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZSb3V0aW5nT3B0aW9ucyB7XG4gIGRpcmVjdE9wZW5BST86IGJvb2xlYW47XG4gIG1vZGVsTmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG4vLyDsnoXroKXqs7wg7KCE7LK0IGhpc3Rvcnnrpbwg6rWs7ISx7ZWY6rOgLCDqsoDspp3rkJwgT3BlbkFJIGNhY2hlIGFmZmluaXR566eMIOu2gOqwgO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVDb252Um91dGluZyhcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIG9wdGlvbnM6IENvbnZSb3V0aW5nT3B0aW9ucyA9IHt9LFxuKTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goXG4gICAgaW5wdXQuc3lzdGVtLFxuICAgIG9wdGlvbnMuZGlyZWN0T3BlbkFJID8gKG9wdGlvbnMubW9kZWxOYW1lc3BhY2UgPz8gaW5wdXQubW9kZWwgPz8gXCJvcGVuYWlcIikgOiB1bmRlZmluZWQsXG4gICk7XG4gIGNvbnN0IGhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4gfCB1bmRlZmluZWQgPSBpbnB1dC5oaXN0b3J5XG4gICAgPyAoSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSBhcyBBcnJheTxKc29uVmFsdWU+KVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvb3JkID0gaW5wdXQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG5cbiAgLy8g7J6s7IKs7JqpIOyekOqyqTog7KKM7ZGcIOyhtOyerCArIHN5c3RlbSDrj5nsnbwuIHNlc3Npb25LZXkg6rKp66asICsgc3lzdGVtSGFzaCDroZwg64yA7ZmUIOuPmeydvOyEseydtFxuICAvLyDrs7TsnqXrkJjqs6AsIOqzte2GtSBwcmVmaXgg64qUIOuwseyXlOuTnOqwgCBwcm9tcHRfY2FjaGVfa2V5IOqzoOygleycvOuhnCDslYzslYTshJwg7LqQ7Iuc7ZWc64ukLlxuICBjb25zdCBkaXJlY3RDb29yZEVsaWdpYmxlID1cbiAgICBvcHRpb25zLmRpcmVjdE9wZW5BSSA9PT0gdHJ1ZSAmJlxuICAgIGNvb3JkPy5lcG9jaCA9PT0gLTEgJiZcbiAgICBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoICYmXG4gICAgaW5wdXQuY2FjaGVBZmZpbml0eUtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgY29vcmQudGhyZWFkSWQgPT09IGlucHV0LmNhY2hlQWZmaW5pdHlLZXk7XG4gIC8vIGFmZmluaXR5IOulvCDsmpTssq3tlZjsp4Ag7JWK7J2AIG9uZS1zaG90IOyalOyyreyXkCDsnoTsnZgg7YKk66W8IOu2meydtOuptCB0cmFuc3BvcnQg6rCAIOq3uCDshozsvJPsnYRcbiAgLy8gYWZmaW5pdHkg7IaM7LyT7Jy866GcIOyYpOyduO2VtCDsnqzsgqzsmqnrkJjsp4Ag7JWK7J2EIOyXsOqysOydhCDqs4Tsho0g67aZ65Ok7Ja0IOuRlOuLpCDihpIg7YKk66W8IOu5hOybjCDrkZTri6QuXG4gIGNvbnN0IGNhY2hlS2V5ID0gb3B0aW9ucy5kaXJlY3RPcGVuQUkgPyBpbnB1dC5jYWNoZUFmZmluaXR5S2V5IDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLy8gdG9vbCBmb2xsb3ctdXDrj4Qg7Iuk7ZaJIHVzZXIg7KSE7JeQIOqysOqzvOulvCDsgqzsmqntlbQg6rOE7IaNIOuLte2VmOudvOuKlCDslYjrgrTrpbwg64u064qU64ukLlxuICAgIGNvbGRJbnB1dDogYnVpbGREZWx0YUlucHV0KGlucHV0KSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICAgIHByb21wdENhY2hlS2V5OiBjYWNoZUtleSxcbiAgICBwcmVmZXJyZWRUb2tlbklkOiBkaXJlY3RDb29yZEVsaWdpYmxlID8gY29vcmQud29ya2VySWQgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIO2bhOyGjSB0dXJuIOydmCBpbnB1dDogdG9vbCDqsrDqs7zqsIAg7J6I7Jy866m0IOq3uOqxuCB0ZXh0IOuhnCwg7JeG7Jy866m0IOuniOyngOuniSB1c2VyKHByb21wdCkuXG5mdW5jdGlvbiBidWlsZERlbHRhSW5wdXQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBBcnJheTxVc2VySW5wdXQ+IHtcbiAgaWYgKGlucHV0LnRvb2xSZXN1bHRzICYmIGlucHV0LnRvb2xSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRvb2xSZXN1bHRzVG9UZXh0KGlucHV0LnRvb2xSZXN1bHRzKSwgdGV4dF9lbGVtZW50czogW10gfV07XG4gIH1cbiAgaWYgKGlucHV0LmlucHV0ICYmIGlucHV0LmlucHV0Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBoYXNUZXh0ID0gaW5wdXQuaW5wdXQuc29tZSgocGFydCkgPT4gcGFydC50eXBlID09PSBcInRleHRcIik7XG4gICAgY29uc3QgcGFydHM6IEFycmF5PFVzZXJJbnB1dD4gPSBpbnB1dC5pbnB1dC5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBwYXJ0LnRleHQsIHRleHRfZWxlbWVudHM6IHBhcnQudGV4dF9lbGVtZW50cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbWFnZVwiLCB1cmw6IHBhcnQudXJsIH07XG4gICAgfSk7XG4gICAgaWYgKCFoYXNUZXh0ICYmIGlucHV0LnByb21wdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0LnByb21wdCwgdGV4dF9lbGVtZW50czogW10gfSwgLi4ucGFydHNdO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cbiAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dC5wcm9tcHQsIHRleHRfZWxlbWVudHM6IFtdIH1dO1xufVxuXG4vLyDsnZHri7UgdGhyZWFkQ29vcmQgKyDsmpTssq0g7Iuc7KCQIOygleuztOuhnCDri6TsnYwgdGhyZWFkIOyijO2RnOulvCDrsJzquIntlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gaXNzdWVDb252Q29udGV4dChcbiAgdGhyZWFkQ29vcmQ6IFJldXNlVGhyZWFkQ29vcmQsXG4gIGRlY2lzaW9uOiBDb252RGVjaXNpb24sXG4gIHByZWZlcnJlZFRva2VuSWQgPSB0aHJlYWRDb29yZC53b3JrZXJJZCxcbik6IFFncmlkVGhyZWFkQ29vcmQge1xuICBpZiAoZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd29ya2VySWQ6IHByZWZlcnJlZFRva2VuSWQsXG4gICAgICB0aHJlYWRJZDogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICBlcG9jaDogLTEsXG4gICAgICBzeXN0ZW1IYXNoOiBkZWNpc2lvbi5zeXN0ZW1IYXNoLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3b3JrZXJJZDogdGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgdGhyZWFkSWQ6IHRocmVhZENvb3JkLnRocmVhZElkLFxuICAgIGVwb2NoOiB0aHJlYWRDb29yZC5lcG9jaCxcbiAgICBzeXN0ZW1IYXNoOiBkZWNpc2lvbi5zeXN0ZW1IYXNoLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFhQSxTQUFnQixXQUFXLFFBQWlCLGdCQUFpQztDQUMzRSxPQUFPLFdBQVcsUUFBUSxDQUFDLENBQ3hCLE9B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
@@ -30,7 +30,7 @@ var QgridDispatcherClass = class {
30
30
  * HTTP 리스닝은 dispatcher 준비보다 먼저 열리므로(sonamu.config onStart),
31
31
  * 그 사이 들어온 요청은 "잠시 후 되는" 상태와 "재시도해도 안 되는" 상태가 다르다.
32
32
  *
33
- * - `starting`: 워커 spawn 중. dev0 기준 25 워커 × 500ms 간격이라 1~2분 걸린다 → 재시도 가능
33
+ * - `starting`: provider 토큰·런타임 초기화 중 → 재시도 가능
34
34
  * - `ready`: 정상
35
35
  * - `failed`: start() 가 예외로 끝남 → 재시도해도 같은 결과
36
36
  */
@@ -49,8 +49,9 @@ var QgridDispatcherClass = class {
49
49
  const label = provider === "openai" ? "OpenAI" : "Anthropic";
50
50
  return this.startupState[provider] === "failed" ? new InternalServerErrorException(SD("qgrid.dispatcherFailed")(label)) : new ServiceUnavailableException(SD("qgrid.dispatcherStarting")(label));
51
51
  }
52
- countOf(name) {
53
- return this.requestCounts.get(name) ?? 0;
52
+ recordCompleted(provider, tokenName) {
53
+ const key = `${provider}\0${tokenName}`;
54
+ this.requestCounts.set(key, (this.requestCounts.get(key) ?? 0) + 1);
54
55
  }
55
56
  upsertCache(id, row) {
56
57
  this.tokens.set(id, row);
@@ -66,7 +67,7 @@ var QgridDispatcherClass = class {
66
67
  token: maskToken(getAccessToken(r.credentials)),
67
68
  name: r.name,
68
69
  provider: r.provider,
69
- requests: this.countOf(r.name)
70
+ requests: this.requestCounts.get(`${r.provider}\0${r.name}`) ?? 0
70
71
  }));
71
72
  }
72
73
  async query(input, abortSignal) {
@@ -97,6 +98,7 @@ var QgridDispatcherClass = class {
97
98
  imageGeneration: input.imageGeneration,
98
99
  imageGenerationOptions: input.imageGenerationOptions
99
100
  });
101
+ this.recordCompleted("openai", result.tokenName);
100
102
  const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision, result.threadCoord.workerId);
101
103
  return applyToolCallEmulation(toEmulationResult(result), input.tools, {
102
104
  threadCoord: coord,
@@ -118,6 +120,7 @@ var QgridDispatcherClass = class {
118
120
  imageGeneration: input.imageGeneration,
119
121
  imageGenerationOptions: input.imageGenerationOptions
120
122
  });
123
+ this.recordCompleted("anthropic", result.tokenName);
121
124
  return applyToolCallEmulation(toEmulationResult(result), input.tools, {
122
125
  threadCoord: issueConvContext(result.threadCoord, decision),
123
126
  answerKind
@@ -157,6 +160,7 @@ var QgridDispatcherClass = class {
157
160
  onThreadId: cb.onThreadId,
158
161
  onTurnId: cb.onTurnId,
159
162
  onComplete: (turnResult) => {
163
+ this.recordCompleted("openai", turnResult.tokenName);
160
164
  cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
161
165
  threadCoord: issueConvContext(turnResult.threadCoord, decision, turnResult.threadCoord.workerId),
162
166
  answerKind
@@ -188,6 +192,7 @@ var QgridDispatcherClass = class {
188
192
  onDelta: emitDelta,
189
193
  onThreadId: cb.onThreadId,
190
194
  onComplete: (turnResult) => {
195
+ this.recordCompleted("anthropic", turnResult.tokenName);
191
196
  const rest = fenceStrip?.flush();
192
197
  if (rest) cb.onDelta(rest);
193
198
  const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
@@ -266,4 +271,4 @@ const QgridDispatcher = new QgridDispatcherClass();
266
271
  //#endregion
267
272
  export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
268
273
 
269
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKiAtIGRpc3BhdGNoZXIg66+47KSA67mE64qUIOq4sOuPmSDspJEoNTAzKS/stIjquLDtmZQg7Iuk7YyoKDUwMCnroZwg6rWs67aE7ZW0IOuNmOynhOuLpFxuICovXG5cbmltcG9ydCB7IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvZmVuY2Utc3RyaXBcIjtcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIFN0cmVhbUNhbGxiYWNrcyxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMsXG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBzdHJpY3RpZnkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zdHJpY3RpZmllclwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGRlY2lkZUNvbnZSb3V0aW5nLCBpc3N1ZUNvbnZDb250ZXh0IH0gZnJvbSBcIi4vY29udi1yb3V0aW5nXCI7XG5pbXBvcnQge1xuICBtYXNrVG9rZW4sXG4gIFByb2Nlc3NFcnJvcixcbiAgdHlwZSBQcm92aWRlclN0YXJ0dXBTdGF0ZSxcbiAgdHlwZSBRdWVyeUlucHV0LFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxuICB0eXBlIFRva2VuU3RhdHMsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0IH0gZnJvbSBcIi4vc2NoZW1hLXByb21wdFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0ID0gUXVlcnlJbnB1dCAmIHtcbiAgcHJlZmVycmVkVG9rZW5JZD86IG51bWJlcjtcbiAgcmVxdWlyZVByZWZlcnJlZFRva2VuPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHByb3ZpZGVyIOuzhCDquLDrj5kg7IOB7YOcLiBkaXNwYXRjaGVyIOqwgCDsl4bripQg7J207Jyg66W8IOq1rOu2hO2VmOq4sCDsnITtlbQg7ZWE7JqU7ZWY64ukIOKAlFxuICAgKiBIVFRQIOumrOyKpOuLneydgCBkaXNwYXRjaGVyIOykgOu5hOuztOuLpCDrqLzsoIAg7Je066as66+A66GcKHNvbmFtdS5jb25maWcgb25TdGFydCksXG4gICAqIOq3uCDsgqzsnbQg65Ok7Ja07JioIOyalOyyreydgCBcIuyeoOyLnCDtm4Qg65CY64qUXCIg7IOB7YOc7JmAIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripRcIiDsg4Htg5zqsIAg64uk66W064ukLlxuICAgKlxuICAgKiAtIGBzdGFydGluZ2A6IOybjOy7pCBzcGF3biDspJEuIGRldjAg6riw7KSAIDI1IOybjOy7pCDDlyA1MDBtcyDqsITqsqnsnbTrnbwgMX4y67aEIOqxuOumsOuLpCDihpIg7J6s7Iuc64+EIOqwgOuKpVxuICAgKiAtIGByZWFkeWA6IOygleyDgVxuICAgKiAtIGBmYWlsZWRgOiBzdGFydCgpIOqwgCDsmIjsmbjroZwg64Gd64KoIOKGkiDsnqzsi5zrj4TtlbTrj4Qg6rCZ7J2AIOqysOqzvFxuICAgKi9cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiA9IHtcbiAgICBvcGVuYWk6IFwic3RhcnRpbmdcIixcbiAgICBhbnRocm9waWM6IFwic3RhcnRpbmdcIixcbiAgfTtcblxuICAvKipcbiAgICogZGlzcGF0Y2hlciDqsIAg7KSA67mE65CY7KeAIOyViuyVmOydhCDrlYwg642Y7KeIIOyYiOyZuOulvCDrp4zrk6Dri6QuXG4gICAqXG4gICAqIOq4sOuPmSDspJHsnbTrqbQgNTAzKCtSZXRyeS1BZnRlcikg7Jy866GcIOyerOyLnOuPhCDqsIDriqXtlajsnYQg7JWM66as6rOgLCDstIjquLDtmZTqsIAg7Iuk7Yyo66GcIOuBneuCrOycvOuptFxuICAgKiA1MDAg7Jy866GcIOyerOyLnOuPhOqwgCDrrLTsnZjrr7jtlajsnYQg7JWM66aw64ukLiDsnbTsoITsl5DripQg65GYIOuLpCBRdW90YUVycm9yIOyYgOuKlOuNsCwg7L+87YSwIOyGjOynhOydtFxuICAgKiDslYTri4wg7IOB7YOc66W8IOq3uOugh+qyjCDtkZztmITtlZjrqbQg7Zi47Lac7J6Q6rCAIO2GoO2BsCDrrLjsoJzroZwg7Jik7ZW07ZWY6rOgIOyerOyLnOuPhCDtjJDri6jrj4Qg66q7IO2VnOuLpC5cbiAgICovXG4gIHByaXZhdGUgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIGFuc3dlciDsnbjsvZTrlKkg7YyQ7KCVOiBqc29uU2NoZW1hIOyeiOycvOuptCDsgqzsmqnsnpAg7Iqk7YKk66eIIEpTT04sIOyXhuycvOuptCDtj4nrrLggc3RyaW5nLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17JygLlxuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCwge1xuICAgICAgICBkaXJlY3RPcGVuQUk6IHRydWUsXG4gICAgICAgIG1vZGVsTmFtZXNwYWNlOiBgb3BlbmFpLyR7cm91dGUubW9kZWx9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBwcm9tcHRDYWNoZUtleTogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uID8gdW5kZWZpbmVkIDogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICAgIHByZWZlcnJlZFRva2VuSWQ6XG4gICAgICAgICAgaW5wdXQucHJlZmVycmVkVG9rZW5JZCA/PyAoaW5wdXQuaW1hZ2VHZW5lcmF0aW9uID8gdW5kZWZpbmVkIDogZGVjaXNpb24ucHJlZmVycmVkVG9rZW5JZCksXG4gICAgICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogaW5wdXQucmVxdWlyZVByZWZlcnJlZFRva2VuLFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgLy8g7J2066+47KeAIOyalOyyreydgCBjb2xkLW9ubHkoUjgp6528IOyerOyCrOyaqSDsooztkZzrpbwg67Cc6riJ7ZWY7KeAIOyViuuKlOuLpC4g7KKM7ZGc66W8IOyLpOycvOuptFxuICAgICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgICBjb25zdCBjb29yZCA9IGlucHV0LmltYWdlR2VuZXJhdGlvblxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiwgcmVzdWx0LnRocmVhZENvb3JkLndvcmtlcklkKTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgdGhyZWFkQ29vcmQ6IGNvb3JkLFxuICAgICAgICBpbWFnZXM6IHJlc3VsdC5pbWFnZXMsXG4gICAgICAgIGFuc3dlcktpbmQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwiYW50aHJvcGljXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIC8vIEFudGhyb3BpY0Rpc3BhdGNoZXIg64K067aA7JeQ7IScIOyVjOyVhOyEnCBwcm92aWRlciBwcmVmaXgg66W8IGNhbm9uaWNhbCBtb2RlbCDroZwg7KCV6rec7ZmU7ZWoXG4gICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgLy8g7Iqk7YKk66eIL2VudmVsb3BlIOqzhOyVveydgCAtLWpzb24tc2NoZW1hIOuMgOyLoCBzeXN0ZW0g66eQ66+47J2YIO2FjeyKpO2KuOuhnCDslYjrgrTtlZzri6QoU09OLTUzMikuXG4gICAgICAgIC8vIG91dHB1dFNjaGVtYSDripQg7KCE64us7ZWY7KeAIOyViuuKlOuLpCDigJQgYW50aHJvcGljIOyXkOyEnCDtla3sg4EgdW5kZWZpbmVkKFUxKeydtOupsCxcbiAgICAgICAgLy8gQ0Mg66GcIOqwgOuKlCAtLWpzb24tc2NoZW1hIOyxhOuEkCDsnpDssrTqsIAg64ur7ZiAIOyeiOydjOydhCDsl6zquLDshJwg66qF7Iuc7ZWc64ukLlxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzPFF1ZXJ5T3V0cHV0PixcbiAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIGFuc3dlciDsnbjsvZTrlKkg7YyQ7KCVOiBqc29uU2NoZW1hIOyeiOycvOuptCDsgqzsmqnsnpAg7Iqk7YKk66eIIEpTT04sIOyXhuycvOuptCDtj4nrrLggc3RyaW5nLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17JygLlxuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgICAgZGlyZWN0T3BlbkFJOiB0cnVlLFxuICAgICAgICBtb2RlbE5hbWVzcGFjZTogYG9wZW5haS8ke3JvdXRlLm1vZGVsfWAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcm9tcHRDYWNoZUtleTogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCA/PyBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogaW5wdXQucmVxdWlyZVByZWZlcnJlZFRva2VuLFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsXG4gICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwiYW50aHJvcGljXCIpO1xuXG4gICAgICAvLyDqs4Tslb0o7Iqk7YKk66eIL2VudmVsb3BlKeydtCDso7zsnoXrkJwg7JqU7LKt7J2YIOuNuO2DgOyXkOyEnCDsvZTrk5ztjpzsiqTrpbwg67KX6ri064ukKFNPTi01MzIpLlxuICAgICAgLy8g67mE7Iqk7Yq466a8IOy1nOyihSDthY3siqTtirjripQgc3RyZWFtLWpzb24tYWRhcHRlciDsnZggc3RyaXBGZW5jZXMg6rCAIOqwmeydgCDsi5zrp6jti7HsnLzroZxcbiAgICAgIC8vIOyymOumrO2VmOuvgOuhnCDrjbjtg4Ag7Jew6rKw6rO8IGRvbmUudGV4dCDqsIAg7Ja06riL64KY7KeAIOyViuuKlOuLpC4g7J2867CYIO2FjeyKpO2KuCDsmpTssq3snYAg66y067OA6rK9LlxuICAgICAgY29uc3QgaGFzU2NoZW1hQ29udHJhY3QgPSBpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQgfHwgQm9vbGVhbihpbnB1dC50b29scz8ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGZlbmNlU3RyaXAgPSBoYXNTY2hlbWFDb250cmFjdCA/IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0oKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgaWYgKHNhZmUpIGNiLm9uRGVsdGEoc2FmZSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IGNiLm9uRGVsdGE7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIC8vIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAgLS1qc29uLXNjaGVtYSDrjIDsi6Agc3lzdGVtIOunkOuvuOydmCDthY3siqTtirjroZwg7JWI64K07ZWc64ukKFNPTi01MzIpXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KGlucHV0LnN5c3RlbSwgaW5wdXQpLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogZW1pdERlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIC8vIO2ZgOuTnOuwsSDsnpTsl6wo64ur64qUIO2OnOyKpOqwgCDslYTri4jsl4jrjZggdGFpbCnrpbwgZG9uZSDsoITsl5Ag66eI7KCAIOuwqey2nO2VnOuLpCDigJRcbiAgICAgICAgICAgIC8vIOuNuO2DgOulvCDsobDrpr3tlZjripQg7YG065287J207Ja47Yq4KEVudmVsb3BlU3RyZWFtUGFyc2VyIOuTsSnsnZgg66y07IaQ7IukIOuztOyepS5cbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBmZW5jZVN0cmlwPy5mbHVzaCgpO1xuICAgICAgICAgICAgaWYgKHJlc3QpIGNiLm9uRGVsdGEocmVzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBhbnRocm9waWMoU09OLTUzMik6IENDIOyXkCAtLWpzb24tc2NoZW1hIOulvCDsoITri6ztlZjsp4Ag7JWK64qU64ukIOKAlCDqsJXsoJwg7JeG64qUIOyCrO2bhCDssYTsoJDsnbRcbiAgLy8g7IaM67mE7J6QIOydmOuPhChudWxsaXNoIOyDneuetSDrk7Ep7JmAIOy2qeuPjO2VtCBDQyDrgrTrtoAg7J6s7Iuc64+EIOujqO2UhOulvCDrsJztmZTsi5zsvLDri6Qo7JmV67O1IDJ+NO2ajCxcbiAgLy8gNC43fjkuMeuwsCDstpzroKUg7LKt6rWsIOyLpOy4oSkuIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAg7ZSE66Gs7ZSE7Yq4IO2FjeyKpO2KuOuhnCDslYjrgrTtlZjqs6Ag7YyQ7KCV7J2AXG4gIC8vIOyGjOu5hOyekCh6b2QpL3BhcnNlRW52ZWxvcGUg6rCAIOunoeuKlOuLpC4g65Sw65287IScIHN0cmljdCDrs4DtmZjCt2FyZ3YgNjRLaUIg7KCc7ZWcIOyXhuydtCDsiJjsi6BcbiAgLy8g7JuQ7ZiV7J2YIOq1rOusuMK367O17J6h64+EKOyghOyXrSA1MTJLaUIg7ZWc64+EKeunjCDqsoDspp3tlbQgY2FsbGVyLWZhdWx0IOulvCDsobDquLDsl5Ag64+M66Ck7KSA64ukLlxuICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCBwcm92aWRlcik7XG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEob3V0cHV0U2NoZW1hLCBwcm92aWRlcik7XG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiByZXN1bHQudXNhZ2UucmVhc29uaW5nT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0NBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEOzs7Ozs7Ozs7O0NBV2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Ozs7Ozs7O0NBU0EsY0FBc0IsVUFBeUM7RUFDN0QsTUFBTSxRQUFRLGFBQWEsV0FBVyxXQUFXO0VBQ2pELE9BQU8sS0FBSyxhQUFhLGNBQWMsV0FDbkMsSUFBSSw2QkFBNkIsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUNwRSxJQUFJLDRCQUE0QixHQUFHLDBCQUEwQixDQUFDLENBQUMsS0FBSyxDQUFDO0NBQzNFO0NBRUEsUUFBUSxNQUFzQjtFQUM1QixPQUFPLEtBQUssY0FBYyxJQUFJLElBQUksS0FBSztDQUN6QztDQUdBLFlBQVksSUFBWSxLQUF5QjtFQUMvQyxLQUFLLE9BQU8sSUFBSSxJQUFJLEdBQUc7Q0FDekI7Q0FFQSxZQUFZLElBQWtCO0VBQzVCLEtBQUssT0FBTyxPQUFPLEVBQUU7Q0FDdkI7Q0FFQSxhQUFhLE1BQTRCO0VBQ3ZDLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDbEQ7Q0FFQSxXQUF5QjtFQUN2QixPQUFPLENBQUMsR0FBRyxLQUFLLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU87R0FDM0MsT0FBTyxVQUFVLGVBQWUsRUFBRSxXQUFXLENBQUM7R0FDOUMsTUFBTSxFQUFFO0dBQ1IsVUFBVSxFQUFFO0dBQ1osVUFBVSxLQUFLLFFBQVEsRUFBRSxJQUFJO0VBQy9CLEVB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
274
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKiAtIGRpc3BhdGNoZXIg66+47KSA67mE64qUIOq4sOuPmSDspJEoNTAzKS/stIjquLDtmZQg7Iuk7YyoKDUwMCnroZwg6rWs67aE7ZW0IOuNmOynhOuLpFxuICovXG5cbmltcG9ydCB7IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVGZW5jZVN0cmlwVHJhbnNmb3JtIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvZmVuY2Utc3RyaXBcIjtcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIFN0cmVhbUNhbGxiYWNrcyxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMsXG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBzdHJpY3RpZnkgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zdHJpY3RpZmllclwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGRlY2lkZUNvbnZSb3V0aW5nLCBpc3N1ZUNvbnZDb250ZXh0IH0gZnJvbSBcIi4vY29udi1yb3V0aW5nXCI7XG5pbXBvcnQge1xuICBtYXNrVG9rZW4sXG4gIFByb2Nlc3NFcnJvcixcbiAgdHlwZSBQcm92aWRlclN0YXJ0dXBTdGF0ZSxcbiAgdHlwZSBRdWVyeUlucHV0LFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxuICB0eXBlIFRva2VuU3RhdHMsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0IH0gZnJvbSBcIi4vc2NoZW1hLXByb21wdFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0ID0gUXVlcnlJbnB1dCAmIHtcbiAgcHJlZmVycmVkVG9rZW5JZD86IG51bWJlcjtcbiAgcmVxdWlyZVByZWZlcnJlZFRva2VuPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8g7ZSE66Gc7IS47IqkIOyLnOyekSDsnbTtm4Qg7JmE66OM65CcIHByb3ZpZGVyIGdlbmVyYXRpb24g7IiYLiDsi6TtjKgv7KSR6rCEIOyLnOuPhOuKlCDsoJzsmbjtlZjrqbAsXG4gIC8vIO2bhOyGjSB0b29sIHR1cm7rj4Qg7ZWcIGdlbmVyYXRpb27snLzroZwg7IS864ukLiDrj5nrqoUg7Yag7YGw7J2AIHByb3ZpZGVy67OE66GcIOu2hOumrO2VnOuLpC5cbiAgcHJpdmF0ZSByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAvLyBzb25hbXUuY29uZmlnIG9uU3RhcnQg7JeQ7IScIOyymOumrO2VmOuKlCDrs4DsiJhcbiAgc3Vic2NyaWJlcjogVG9rZW5TdWJzY3JpYmVyIHwgbnVsbCA9IG51bGw7XG4gIG9wZW5haURpc3BhdGNoZXI6IE9wZW5BSURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgYW50aHJvcGljRGlzcGF0Y2hlcjogQW50aHJvcGljRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBwcm92aWRlciDrs4Qg6riw64+ZIOyDge2DnC4gZGlzcGF0Y2hlciDqsIAg7JeG64qUIOydtOycoOulvCDqtazrtoTtlZjquLAg7JyE7ZW0IO2VhOyalO2VmOuLpCDigJRcbiAgICogSFRUUCDrpqzsiqTri53snYAgZGlzcGF0Y2hlciDspIDruYTrs7Tri6Qg66i87KCAIOyXtOumrOuvgOuhnChzb25hbXUuY29uZmlnIG9uU3RhcnQpLFxuICAgKiDqt7gg7IKs7J20IOuTpOyWtOyYqCDsmpTssq3snYAgXCLsnqDsi5wg7ZuEIOuQmOuKlFwiIOyDge2DnOyZgCBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qUXCIg7IOB7YOc6rCAIOuLpOultOuLpC5cbiAgICpcbiAgICogLSBgc3RhcnRpbmdgOiBwcm92aWRlciDthqDtgbDCt+ufsO2DgOyehCDstIjquLDtmZQg7KSRIOKGkiDsnqzsi5zrj4Qg6rCA64qlXG4gICAqIC0gYHJlYWR5YDog7KCV7IOBXG4gICAqIC0gYGZhaWxlZGA6IHN0YXJ0KCkg6rCAIOyYiOyZuOuhnCDrgZ3rgqgg4oaSIOyerOyLnOuPhO2VtOuPhCDqsJnsnYAg6rKw6rO8XG4gICAqL1xuICBzdGFydHVwU3RhdGU6IFJlY29yZDxcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIiwgUHJvdmlkZXJTdGFydHVwU3RhdGU+ID0ge1xuICAgIG9wZW5haTogXCJzdGFydGluZ1wiLFxuICAgIGFudGhyb3BpYzogXCJzdGFydGluZ1wiLFxuICB9O1xuXG4gIC8qKlxuICAgKiBkaXNwYXRjaGVyIOqwgCDspIDruYTrkJjsp4Ag7JWK7JWY7J2EIOuVjCDrjZjsp4gg7JiI7Jm466W8IOunjOuToOuLpC5cbiAgICpcbiAgICog6riw64+ZIOykkeydtOuptCA1MDMoK1JldHJ5LUFmdGVyKSDsnLzroZwg7J6s7Iuc64+EIOqwgOuKpe2VqOydhCDslYzrpqzqs6AsIOy0iOq4sO2ZlOqwgCDsi6TtjKjroZwg64Gd64Ks7Jy866m0XG4gICAqIDUwMCDsnLzroZwg7J6s7Iuc64+E6rCAIOustOydmOuvuO2VqOydhCDslYzrprDri6QuIOydtOyghOyXkOuKlCDrkZgg64ukIFF1b3RhRXJyb3Ig7JiA64qU642wLCDsv7zthLAg7IaM7KeE7J20XG4gICAqIOyVhOuLjCDsg4Htg5zrpbwg6re466CH6rKMIO2RnO2YhO2VmOuptCDtmLjstpzsnpDqsIAg7Yag7YGwIOusuOygnOuhnCDsmKTtlbTtlZjqs6Ag7J6s7Iuc64+EIO2MkOuLqOuPhCDrqrsg7ZWc64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RSZWFkeUVycm9yKHByb3ZpZGVyOiBcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIik6IEVycm9yIHtcbiAgICBjb25zdCBsYWJlbCA9IHByb3ZpZGVyID09PSBcIm9wZW5haVwiID8gXCJPcGVuQUlcIiA6IFwiQW50aHJvcGljXCI7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnR1cFN0YXRlW3Byb3ZpZGVyXSA9PT0gXCJmYWlsZWRcIlxuICAgICAgPyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJGYWlsZWRcIikobGFiZWwpKVxuICAgICAgOiBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwicWdyaWQuZGlzcGF0Y2hlclN0YXJ0aW5nXCIpKGxhYmVsKSk7XG4gIH1cblxuICBwcml2YXRlIHJlY29yZENvbXBsZXRlZChwcm92aWRlcjogc3RyaW5nLCB0b2tlbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGAke3Byb3ZpZGVyfVxcMCR7dG9rZW5OYW1lfWA7XG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChrZXksICh0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGtleSkgPz8gMCkgKyAxKTtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGAke3IucHJvdmlkZXJ9XFwwJHtyLm5hbWV9YCkgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogSW50ZXJuYWxRdWVyeUlucHV0LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgLy8gYW5zd2VyIOyduOy9lOuUqSDtjJDsoJU6IGpzb25TY2hlbWEg7J6I7Jy866m0IOyCrOyaqeyekCDsiqTtgqTrp4ggSlNPTiwg7JeG7Jy866m0IO2PieusuCBzdHJpbmcuIDTqsJwg67Cp7LacIOyngOygkOydtCDqs7XsnKAuXG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIC8vIHByb3ZpZGVyIHByZWZpeCByb3V0aW5nOiAnb3BlbmFpL2dwdC01LjQnIOKGkiBPcGVuQUlEaXNwYXRjaGVyXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwib3BlbmFpXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0LCB7XG4gICAgICAgIGRpcmVjdE9wZW5BSTogdHJ1ZSxcbiAgICAgICAgbW9kZWxOYW1lc3BhY2U6IGBvcGVuYWkvJHtyb3V0ZS5tb2RlbH1gLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDpcbiAgICAgICAgICBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IChpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkKSxcbiAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24sIHJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCk7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIC8vIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAgLS1qc29uLXNjaGVtYSDrjIDsi6Agc3lzdGVtIOunkOuvuOydmCDthY3siqTtirjroZwg7JWI64K07ZWc64ukKFNPTi01MzIpLlxuICAgICAgICAvLyBvdXRwdXRTY2hlbWEg64qUIOyghOuLrO2VmOyngCDslYrripTri6Qg4oCUIGFudGhyb3BpYyDsl5DshJwg7ZWt7IOBIHVuZGVmaW5lZChVMSnsnbTrqbAsXG4gICAgICAgIC8vIENDIOuhnCDqsIDripQgLS1qc29uLXNjaGVtYSDssYTrhJAg7J6Q7LK06rCAIOuLq+2YgCDsnojsnYzsnYQg7Jes6riw7IScIOuqheyLnO2VnOuLpC5cbiAgICAgICAgc3lzdGVtUHJvbXB0OiBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KGlucHV0LnN5c3RlbSwgaW5wdXQpLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHJlc3VsdC50b2tlbk5hbWUpO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzPFF1ZXJ5T3V0cHV0PixcbiAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIGFuc3dlciDsnbjsvZTrlKkg7YyQ7KCVOiBqc29uU2NoZW1hIOyeiOycvOuptCDsgqzsmqnsnpAg7Iqk7YKk66eIIEpTT04sIOyXhuycvOuptCDtj4nrrLggc3RyaW5nLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17JygLlxuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgICAgZGlyZWN0T3BlbkFJOiB0cnVlLFxuICAgICAgICBtb2RlbE5hbWVzcGFjZTogYG9wZW5haS8ke3JvdXRlLm1vZGVsfWAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcm9tcHRDYWNoZUtleTogZGVjaXNpb24ucHJvbXB0Q2FjaGVLZXksXG4gICAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCA/PyBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogaW5wdXQucmVxdWlyZVByZWZlcnJlZFRva2VuLFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsXG4gICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwiYW50aHJvcGljXCIpO1xuXG4gICAgICAvLyDqs4Tslb0o7Iqk7YKk66eIL2VudmVsb3BlKeydtCDso7zsnoXrkJwg7JqU7LKt7J2YIOuNuO2DgOyXkOyEnCDsvZTrk5ztjpzsiqTrpbwg67KX6ri064ukKFNPTi01MzIpLlxuICAgICAgLy8g67mE7Iqk7Yq466a8IOy1nOyihSDthY3siqTtirjripQgc3RyZWFtLWpzb24tYWRhcHRlciDsnZggc3RyaXBGZW5jZXMg6rCAIOqwmeydgCDsi5zrp6jti7HsnLzroZxcbiAgICAgIC8vIOyymOumrO2VmOuvgOuhnCDrjbjtg4Ag7Jew6rKw6rO8IGRvbmUudGV4dCDqsIAg7Ja06riL64KY7KeAIOyViuuKlOuLpC4g7J2867CYIO2FjeyKpO2KuCDsmpTssq3snYAg66y067OA6rK9LlxuICAgICAgY29uc3QgaGFzU2NoZW1hQ29udHJhY3QgPSBpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQgfHwgQm9vbGVhbihpbnB1dC50b29scz8ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGZlbmNlU3RyaXAgPSBoYXNTY2hlbWFDb250cmFjdCA/IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0oKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgaWYgKHNhZmUpIGNiLm9uRGVsdGEoc2FmZSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IGNiLm9uRGVsdGE7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIC8vIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAgLS1qc29uLXNjaGVtYSDrjIDsi6Agc3lzdGVtIOunkOuvuOydmCDthY3siqTtirjroZwg7JWI64K07ZWc64ukKFNPTi01MzIpXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KGlucHV0LnN5c3RlbSwgaW5wdXQpLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBwcmVmZXJyZWRUb2tlbklkOiBpbnB1dC5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogZW1pdERlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHR1cm5SZXN1bHQudG9rZW5OYW1lKTtcbiAgICAgICAgICAgIC8vIO2ZgOuTnOuwsSDsnpTsl6wo64ur64qUIO2OnOyKpOqwgCDslYTri4jsl4jrjZggdGFpbCnrpbwgZG9uZSDsoITsl5Ag66eI7KCAIOuwqey2nO2VnOuLpCDigJRcbiAgICAgICAgICAgIC8vIOuNuO2DgOulvCDsobDrpr3tlZjripQg7YG065287J207Ja47Yq4KEVudmVsb3BlU3RyZWFtUGFyc2VyIOuTsSnsnZgg66y07IaQ7IukIOuztOyepS5cbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBmZW5jZVN0cmlwPy5mbHVzaCgpO1xuICAgICAgICAgICAgaWYgKHJlc3QpIGNiLm9uRGVsdGEocmVzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBhbnRocm9waWMoU09OLTUzMik6IENDIOyXkCAtLWpzb24tc2NoZW1hIOulvCDsoITri6ztlZjsp4Ag7JWK64qU64ukIOKAlCDqsJXsoJwg7JeG64qUIOyCrO2bhCDssYTsoJDsnbRcbiAgLy8g7IaM67mE7J6QIOydmOuPhChudWxsaXNoIOyDneuetSDrk7Ep7JmAIOy2qeuPjO2VtCBDQyDrgrTrtoAg7J6s7Iuc64+EIOujqO2UhOulvCDrsJztmZTsi5zsvLDri6Qo7JmV67O1IDJ+NO2ajCxcbiAgLy8gNC43fjkuMeuwsCDstpzroKUg7LKt6rWsIOyLpOy4oSkuIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAg7ZSE66Gs7ZSE7Yq4IO2FjeyKpO2KuOuhnCDslYjrgrTtlZjqs6Ag7YyQ7KCV7J2AXG4gIC8vIOyGjOu5hOyekCh6b2QpL3BhcnNlRW52ZWxvcGUg6rCAIOunoeuKlOuLpC4g65Sw65287IScIHN0cmljdCDrs4DtmZjCt2FyZ3YgNjRLaUIg7KCc7ZWcIOyXhuydtCDsiJjsi6BcbiAgLy8g7JuQ7ZiV7J2YIOq1rOusuMK367O17J6h64+EKOyghOyXrSA1MTJLaUIg7ZWc64+EKeunjCDqsoDspp3tlbQgY2FsbGVyLWZhdWx0IOulvCDsobDquLDsl5Ag64+M66Ck7KSA64ukLlxuICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCBwcm92aWRlcik7XG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEob3V0cHV0U2NoZW1hLCBwcm92aWRlcik7XG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiByZXN1bHQudXNhZ2UucmVhc29uaW5nT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0NBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUl2QyxnQ0FBd0IsSUFBSSxJQUFvQjtDQUdoRCxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEOzs7Ozs7Ozs7O0NBV2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Ozs7Ozs7O0NBU0EsY0FBc0IsVUFBeUM7RUFDN0QsTUFBTSxRQUFRLGFBQWEsV0FBVyxXQUFXO0VBQ2pELE9BQU8sS0FBSyxhQUFhLGNBQWMsV0FDbkMsSUFBSSw2QkFBNkIsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUNwRSxJ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