@cartanova/qgrid-cli 2.6.6 → 2.6.8

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 (87) hide show
  1. package/bundle/dist/application/monit/monit.frame.js +2 -2
  2. package/bundle/dist/application/qgrid/expired-token-reminder.js +37 -16
  3. package/bundle/dist/application/qgrid/oauth.js +1 -1
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -3
  5. package/bundle/dist/application/qgrid/slack-user-map.js +5 -14
  6. package/bundle/dist/application/qgrid/token-death.js +3 -2
  7. package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
  8. package/bundle/dist/application/queries.generated.js +8 -2
  9. package/bundle/dist/application/request-log/request-log.model.js +2 -2
  10. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  11. package/bundle/dist/application/setting/setting.model.js +236 -0
  12. package/bundle/dist/application/setting/setting.schema.js +157 -0
  13. package/bundle/dist/application/setting/setting.store.js +66 -0
  14. package/bundle/dist/application/setting/setting.types.js +48 -0
  15. package/bundle/dist/application/sonamu.generated.js +32 -2
  16. package/bundle/dist/application/sonamu.generated.sso.js +12 -2
  17. package/bundle/dist/application/token/token.model.js +1 -1
  18. package/bundle/dist/i18n/en.js +3 -1
  19. package/bundle/dist/i18n/ko.js +3 -1
  20. package/bundle/dist/i18n/sd.generated.js +9 -1
  21. package/bundle/dist/migrations/20260808194708_create__settings.js +24 -0
  22. package/bundle/dist/sonamu.config.js +8 -2
  23. package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +21 -6
  24. package/bundle/dist/utils/quiet-hours.js +43 -0
  25. package/bundle/dist/utils/slack-notify.js +12 -5
  26. package/bundle/src/application/qgrid/expired-token-reminder.test.ts +135 -13
  27. package/bundle/src/application/qgrid/expired-token-reminder.ts +60 -21
  28. package/bundle/src/application/qgrid/slack-user-map.test.ts +23 -0
  29. package/bundle/src/application/qgrid/slack-user-map.ts +4 -14
  30. package/bundle/src/application/qgrid/token-death.ts +2 -0
  31. package/bundle/src/application/queries.generated.ts +21 -1
  32. package/bundle/src/application/setting/setting.entity.json +59 -0
  33. package/bundle/src/application/setting/setting.model.ts +263 -0
  34. package/bundle/src/application/setting/setting.schema.test.ts +80 -0
  35. package/bundle/src/application/setting/setting.schema.ts +174 -0
  36. package/bundle/src/application/setting/setting.store.test.ts +87 -0
  37. package/bundle/src/application/setting/setting.store.ts +85 -0
  38. package/bundle/src/application/setting/setting.types.ts +51 -0
  39. package/bundle/src/application/sonamu.generated.http +47 -0
  40. package/bundle/src/application/sonamu.generated.sso.ts +21 -0
  41. package/bundle/src/application/sonamu.generated.ts +51 -0
  42. package/bundle/src/i18n/en.ts +2 -0
  43. package/bundle/src/i18n/ko.ts +2 -0
  44. package/bundle/src/i18n/sd.generated.ts +8 -0
  45. package/bundle/src/migrations/20260808194708_create__settings.ts +19 -0
  46. package/bundle/src/sonamu.config.ts +10 -0
  47. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +12 -0
  48. package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +43 -5
  49. package/bundle/src/utils/quiet-hours.ts +40 -0
  50. package/bundle/src/utils/slack-notify.test.ts +88 -20
  51. package/bundle/src/utils/slack-notify.ts +24 -4
  52. package/bundle/web-dist/client/assets/index-7SZyiqAx.css +1 -0
  53. package/bundle/web-dist/client/assets/index-DrsXE13r.js +78 -0
  54. package/bundle/web-dist/client/assets/{logs-CvmI4KuC.js → logs-e4-6aYnO.js} +1 -1
  55. package/bundle/web-dist/client/assets/{monit-CUueNzoL.js → monit-eOAlYTK9.js} +1 -1
  56. package/bundle/web-dist/client/assets/plus-p4vtg6LN.js +1 -0
  57. package/bundle/web-dist/client/assets/{routes-CAfjRsMY.js → routes-Qie4ogtJ.js} +2 -2
  58. package/bundle/web-dist/client/assets/{sd.generated-DYdwSB2I.js → sd.generated-Bwa7rses.js} +1 -1
  59. package/bundle/web-dist/client/assets/services.generated-T4ctVcia.js +1 -0
  60. package/bundle/web-dist/client/assets/settings-CTVZpAAg.js +1 -0
  61. package/bundle/web-dist/client/assets/{show-C5vKpp5z.js → show-60iOOM-e.js} +1 -1
  62. package/bundle/web-dist/client/assets/tokens-DdDccGlX.js +1 -0
  63. package/bundle/web-dist/client/assets/{use-oauth-login-flow-B3o4CXDW.js → use-oauth-login-flow-0ZGq74bZ.js} +1 -1
  64. package/bundle/web-dist/client/index.html +3 -3
  65. package/bundle/web-dist/server/assets/{lazyRouteComponent-BaZaveNc.js → lazyRouteComponent-Ws7I6fL-.js} +2 -1
  66. package/bundle/web-dist/server/assets/{logs-DMOw3SjD.js → logs-DmkzGxGU.js} +4 -4
  67. package/bundle/web-dist/server/assets/{monit-UmcqHroX.js → monit-DyKLJX4s.js} +3 -2
  68. package/bundle/web-dist/server/assets/plus-BISXNqRU.js +19 -0
  69. package/bundle/web-dist/server/assets/react-dom-D7duWOwf.js +462 -0
  70. package/bundle/web-dist/server/assets/{routes-BfoQmYud.js → routes-g62E9xmC.js} +5 -4
  71. package/bundle/web-dist/server/assets/{sd.generated-B0xqnHEo.js → sd.generated-LO-h1_16.js} +13 -461
  72. package/bundle/web-dist/server/assets/{services.generated-DqAKskAS.js → services.generated-DADr9OGH.js} +111 -2
  73. package/bundle/web-dist/server/assets/settings-CMJKayff.js +332 -0
  74. package/bundle/web-dist/server/assets/{show-C-oSdzHX.js → show-BGAiCPGq.js} +4 -4
  75. package/bundle/web-dist/server/assets/{tokens-Dkd_uXEk.js → tokens-DmhIfVct.js} +6 -21
  76. package/bundle/web-dist/server/assets/{use-oauth-login-flow-YM1nsd-H.js → use-oauth-login-flow-B6MY65IN.js} +2 -2
  77. package/bundle/web-dist/server/entry-server.generated.js +54 -18
  78. package/package.json +1 -1
  79. package/skills/qgrid/references/cli-env-and-server-boot.md +14 -2
  80. package/skills/qgrid/references/openai-codex-runtime.md +1 -1
  81. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -0
  82. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -1
  83. package/bundle/web-dist/client/assets/index-B4GlN1IX.css +0 -1
  84. package/bundle/web-dist/client/assets/index-qs8K8bOv.js +0 -78
  85. package/bundle/web-dist/client/assets/services.generated-BsAvotjG.js +0 -1
  86. package/bundle/web-dist/client/assets/tokens-C9KKP2Yq.js +0 -1
  87. /package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-DzjfVtUr.js} +0 -0
@@ -0,0 +1,157 @@
1
+ //#region src/application/setting/setting.schema.ts
2
+ /** 64 GiB 운영 호스트에서 세 자리 오입력을 막는 설정 상한. 안전을 보장하는 값은 아니다. */
3
+ const MAX_OPENAI_ESTIMATED_RSS_GIB = 32;
4
+ const MAX_OPENAI_MIN_HOST_AVAILABLE_GIB = 64;
5
+ const SETTING_DEFS = [
6
+ {
7
+ key: "openai.autoscale",
8
+ fallback: "true",
9
+ group: "openai",
10
+ envKey: "QGRID_OPENAI_AUTOSCALE",
11
+ label: "OpenAI 워커 오토스케일",
12
+ kind: "boolean",
13
+ applies: "restart",
14
+ help: "끄면 워커 수가 최소값으로 고정됩니다"
15
+ },
16
+ {
17
+ key: "openai.minWorkersPerToken",
18
+ fallback: "1",
19
+ group: "openai",
20
+ envKey: "QGRID_OPENAI_MIN_WORKERS_PER_TOKEN",
21
+ label: "토큰당 최소 워커",
22
+ kind: "integer",
23
+ applies: "restart",
24
+ min: 1,
25
+ max: 20
26
+ },
27
+ {
28
+ key: "openai.maxWorkersPerToken",
29
+ fallback: "3",
30
+ group: "openai",
31
+ envKey: "QGRID_OPENAI_MAX_WORKERS_PER_TOKEN",
32
+ label: "토큰당 최대 워커",
33
+ kind: "integer",
34
+ applies: "restart",
35
+ min: 1,
36
+ max: 20,
37
+ help: "오토스케일이 꺼져 있으면 무시됩니다"
38
+ },
39
+ {
40
+ key: "openai.maxEstimatedRssGiB",
41
+ fallback: "16",
42
+ group: "openai",
43
+ envKey: "QGRID_OPENAI_MAX_ESTIMATED_RSS_GIB",
44
+ label: "워커 메모리 상한 (GiB)",
45
+ kind: "number",
46
+ applies: "restart",
47
+ min: 1,
48
+ max: 32,
49
+ help: "이 추정치를 넘기면 워커를 더 늘리지 않습니다. 올릴수록 OOM 위험이 커지며 상한은 오입력 방지용입니다"
50
+ },
51
+ {
52
+ key: "openai.minHostAvailableGiB",
53
+ fallback: "20",
54
+ group: "openai",
55
+ envKey: "QGRID_OPENAI_MIN_HOST_AVAILABLE_GIB",
56
+ label: "호스트 여유 메모리 하한 (GiB)",
57
+ kind: "number",
58
+ applies: "restart",
59
+ min: 0,
60
+ max: 64,
61
+ help: "호스트 여유가 이 값 아래면 스케일업을 멈춥니다. 확장을 끄려면 오토스케일을 끄세요"
62
+ },
63
+ {
64
+ key: "slack.expiryReminderMinutes",
65
+ fallback: "0",
66
+ group: "slack",
67
+ envKey: "SLACK_EXPIRY_REMINDER_INTERVAL_MINUTES",
68
+ label: "만료 알림 반복 주기 (분)",
69
+ kind: "integer",
70
+ applies: "immediate",
71
+ min: 0,
72
+ max: 1440,
73
+ help: "0 이면 반복 알림을 끕니다"
74
+ },
75
+ {
76
+ key: "slack.channelId",
77
+ fallback: "",
78
+ group: "slack",
79
+ envKey: "SLACK_CHANNEL_ID",
80
+ label: "Slack 채널 ID",
81
+ kind: "string",
82
+ applies: "immediate",
83
+ help: "사용자 ID(U...)를 넣으면 그 사람 DM 으로 갑니다"
84
+ },
85
+ {
86
+ key: "slack.userMap",
87
+ fallback: "",
88
+ group: "slack",
89
+ envKey: "SLACK_USER_MAP",
90
+ label: "Slack 사용자 매핑",
91
+ kind: "string",
92
+ applies: "immediate",
93
+ help: "토큰명:SlackUserId 를 쉼표로. 공용 계정은 넣지 않습니다"
94
+ },
95
+ {
96
+ key: "slack.botToken",
97
+ fallback: "",
98
+ group: "slack",
99
+ envKey: "SLACK_BOT_TOKEN",
100
+ label: "Slack 봇 토큰",
101
+ kind: "secret",
102
+ applies: "immediate"
103
+ }
104
+ ];
105
+ function findSettingDef(key) {
106
+ return SETTING_DEFS.find((d) => d.key === key);
107
+ }
108
+ /** 저장 전 검증. 잘못된 값이 들어가면 런타임에서 조용히 기본값으로 떨어져 원인을 찾기 어렵다. */
109
+ function validateSettingValue(def, raw) {
110
+ const trimmed = raw.trim();
111
+ if (def.kind === "boolean") {
112
+ if (!["true", "false"].includes(trimmed)) return {
113
+ ok: false,
114
+ error: "true 또는 false"
115
+ };
116
+ return {
117
+ ok: true,
118
+ value: trimmed
119
+ };
120
+ }
121
+ if (def.kind === "integer" || def.kind === "number") {
122
+ const parsed = Number(trimmed);
123
+ if (!Number.isFinite(parsed)) return {
124
+ ok: false,
125
+ error: "숫자를 입력하세요"
126
+ };
127
+ if (def.kind === "integer" && !Number.isInteger(parsed)) return {
128
+ ok: false,
129
+ error: "정수를 입력하세요"
130
+ };
131
+ if (def.min !== void 0 && parsed < def.min) return {
132
+ ok: false,
133
+ error: `${def.min} 이상이어야 합니다`
134
+ };
135
+ if (def.max !== void 0 && parsed > def.max) return {
136
+ ok: false,
137
+ error: `${def.max} 이하여야 합니다`
138
+ };
139
+ return {
140
+ ok: true,
141
+ value: String(parsed)
142
+ };
143
+ }
144
+ return {
145
+ ok: true,
146
+ value: trimmed
147
+ };
148
+ }
149
+ /** 화면에 그대로 내려보내면 안 되는 값. 앞뒤만 남긴다. */
150
+ function maskSecret(value) {
151
+ if (value.length <= 12) return "***";
152
+ return `${value.slice(0, 8)}...${value.slice(-4)}`;
153
+ }
154
+ //#endregion
155
+ export { MAX_OPENAI_ESTIMATED_RSS_GIB, MAX_OPENAI_MIN_HOST_AVAILABLE_GIB, SETTING_DEFS, findSettingDef, maskSecret, validateSettingValue };
156
+
157
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5zY2hlbWEuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDqtIDrpqwg6rCA64ql7ZWcIOufsO2DgOyehCDshKTsoJUg66qp66GdLlxuICpcbiAqIO2CpMK3ZW52IOydtOumhMK37YOA7J6FwrfqsoDspp3snYQg7ZWcIOqzs+yXkCDrqqjslYQgQVBJIOyZgCBVSSDqsIAg6rCZ7J2AIOygleydmOulvCDrs7jri6QuIOyXrOq4sCDsl4bripQgZW52IOuKlFxuICog7ZmU66m07JeQ7IScIOuwlOq/gCDsiJgg7JeG64ukIOKAlCBEQiDsoJHsho0g7KCV67O064KYIO2PrO2KuOyymOufvCDshJzrsoTqsIAg65yo6riwIOyghOyXkCDtlYTsmpTtlZwg6rCS65Ok7J2064ukLlxuICovXG5cbmV4cG9ydCB0eXBlIFNldHRpbmdLaW5kID0gXCJib29sZWFuXCIgfCBcImludGVnZXJcIiB8IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJzZWNyZXRcIjtcblxuLyoqIO2ZlOuptOyXkOyEnCDrrLbslrQg67O07Jes7KSEIOuLqOychC4gOeqwnOulvCDtj4ntj4ntlZjqsowg64KY7Je07ZWY66m0IOyWtOuUlOulvCDrtJDslbwg7ZWg7KeAIOyVjCDsiJgg7JeG64ukLiAqL1xuZXhwb3J0IHR5cGUgU2V0dGluZ0dyb3VwID0gXCJvcGVuYWlcIiB8IFwic2xhY2tcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ0RlZiA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIGdyb3VwOiBTZXR0aW5nR3JvdXA7XG4gIGVudktleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBraW5kOiBTZXR0aW5nS2luZDtcbiAgLyoqIOyggeyaqSDsi5zsoJAuIOybjOy7pCDshKTsoJXsnYAgZGlzcGF0Y2hlciDsg53shLHsnpDsl5DshJwg7ZWcIOuyiOunjCDsnb3tmIAg7J6s7Iuc7J6R7J20IO2VhOyalO2VmOuLpC4gKi9cbiAgYXBwbGllczogXCJpbW1lZGlhdGVcIiB8IFwicmVzdGFydFwiO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgLyoqXG4gICAqIOyggOyepeqwkuuPhCBlbnYg64+EIOyXhuydhCDrlYwg7Iuk7KCc66GcIOyggeyaqeuQmOuKlCDqsJIuIO2ZlOuptOydhCDruYTsm4zrkZDrqbQgXCLshKTsoJUg7JWIIOuQqFwi7Jy866GcIOydve2eiOyngOunjFxuICAgKiDsi6TsoJzroZzripQg7J20IOqwkuydtCDrj4zqs6Ag7J6I64ukIOKAlCDshozruYTsspjsnZgg6riw67O46rCS6rO8IOuwmOuTnOyLnCDqsJnslYTslbwg7ZWc64ukLlxuICAgKi9cbiAgZmFsbGJhY2s6IHN0cmluZztcbiAgaGVscD86IHN0cmluZztcbn07XG5cbi8qKiA2NCBHaUIg7Jq07JiBIO2YuOyKpO2KuOyXkOyEnCDshLgg7J6Q66asIOyYpOyeheugpeydhCDrp4nripQg7ISk7KCVIOyDge2VnC4g7JWI7KCE7J2EIOuztOyepe2VmOuKlCDqsJLsnYAg7JWE64uI64ukLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9PUEVOQUlfRVNUSU1BVEVEX1JTU19HSUIgPSAzMjtcbmV4cG9ydCBjb25zdCBNQVhfT1BFTkFJX01JTl9IT1NUX0FWQUlMQUJMRV9HSUIgPSA2NDtcblxuZXhwb3J0IGNvbnN0IFNFVFRJTkdfREVGUzogU2V0dGluZ0RlZltdID0gW1xuICB7XG4gICAga2V5OiBcIm9wZW5haS5hdXRvc2NhbGVcIixcbiAgICBmYWxsYmFjazogXCJ0cnVlXCIsXG4gICAgZ3JvdXA6IFwib3BlbmFpXCIsXG4gICAgZW52S2V5OiBcIlFHUklEX09QRU5BSV9BVVRPU0NBTEVcIixcbiAgICBsYWJlbDogXCJPcGVuQUkg7JuM7LukIOyYpO2GoOyKpOy8gOydvFwiLFxuICAgIGtpbmQ6IFwiYm9vbGVhblwiLFxuICAgIGFwcGxpZXM6IFwicmVzdGFydFwiLFxuICAgIGhlbHA6IFwi64GE66m0IOybjOy7pCDsiJjqsIAg7LWc7IaM6rCS7Jy866GcIOqzoOygleuQqeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcIm9wZW5haS5taW5Xb3JrZXJzUGVyVG9rZW5cIixcbiAgICBmYWxsYmFjazogXCIxXCIsXG4gICAgZ3JvdXA6IFwib3BlbmFpXCIsXG4gICAgZW52S2V5OiBcIlFHUklEX09QRU5BSV9NSU5fV09SS0VSU19QRVJfVE9LRU5cIixcbiAgICBsYWJlbDogXCLthqDtgbDri7kg7LWc7IaMIOybjOy7pFwiLFxuICAgIGtpbmQ6IFwiaW50ZWdlclwiLFxuICAgIGFwcGxpZXM6IFwicmVzdGFydFwiLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDIwLFxuICB9LFxuICB7XG4gICAga2V5OiBcIm9wZW5haS5tYXhXb3JrZXJzUGVyVG9rZW5cIixcbiAgICBmYWxsYmFjazogXCIzXCIsXG4gICAgZ3JvdXA6IFwib3BlbmFpXCIsXG4gICAgZW52S2V5OiBcIlFHUklEX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU5cIixcbiAgICBsYWJlbDogXCLthqDtgbDri7kg7LWc64yAIOybjOy7pFwiLFxuICAgIGtpbmQ6IFwiaW50ZWdlclwiLFxuICAgIGFwcGxpZXM6IFwicmVzdGFydFwiLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDIwLFxuICAgIGhlbHA6IFwi7Jik7Yag7Iqk7LyA7J287J20IOq6vOyguCDsnojsnLzrqbQg66y07Iuc65Cp64uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwib3BlbmFpLm1heEVzdGltYXRlZFJzc0dpQlwiLFxuICAgIGZhbGxiYWNrOiBcIjE2XCIsXG4gICAgZ3JvdXA6IFwib3BlbmFpXCIsXG4gICAgZW52S2V5OiBcIlFHUklEX09QRU5BSV9NQVhfRVNUSU1BVEVEX1JTU19HSUJcIixcbiAgICBsYWJlbDogXCLsm4zsu6Qg66mU66qo66asIOyDge2VnCAoR2lCKVwiLFxuICAgIGtpbmQ6IFwibnVtYmVyXCIsXG4gICAgYXBwbGllczogXCJyZXN0YXJ0XCIsXG4gICAgbWluOiAxLFxuICAgIG1heDogTUFYX09QRU5BSV9FU1RJTUFURURfUlNTX0dJQixcbiAgICBoZWxwOiBcIuydtCDstpTsoJXsuZjrpbwg64SY6riw66m0IOybjOy7pOulvCDrjZQg64qY66as7KeAIOyViuyKteuLiOuLpC4g7Jis66a07IiY66GdIE9PTSDsnITtl5jsnbQg7Luk7KeA66mwIOyDge2VnOydgCDsmKTsnoXroKUg67Cp7KeA7Jqp7J6F64uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwib3BlbmFpLm1pbkhvc3RBdmFpbGFibGVHaUJcIixcbiAgICBmYWxsYmFjazogXCIyMFwiLFxuICAgIGdyb3VwOiBcIm9wZW5haVwiLFxuICAgIGVudktleTogXCJRR1JJRF9PUEVOQUlfTUlOX0hPU1RfQVZBSUxBQkxFX0dJQlwiLFxuICAgIGxhYmVsOiBcIu2YuOyKpO2KuCDsl6zsnKAg66mU66qo66asIO2VmO2VnCAoR2lCKVwiLFxuICAgIGtpbmQ6IFwibnVtYmVyXCIsXG4gICAgYXBwbGllczogXCJyZXN0YXJ0XCIsXG4gICAgbWluOiAwLFxuICAgIG1heDogTUFYX09QRU5BSV9NSU5fSE9TVF9BVkFJTEFCTEVfR0lCLFxuICAgIGhlbHA6IFwi7Zi47Iqk7Yq4IOyXrOycoOqwgCDsnbQg6rCSIOyVhOuemOuptCDsiqTsvIDsnbzsl4XsnYQg66mI7Lal64uI64ukLiDtmZXsnqXsnYQg64GE66Ck66m0IOyYpO2GoOyKpOy8gOydvOydhCDrgYTshLjsmpRcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIixcbiAgICBmYWxsYmFjazogXCIwXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tcIixcbiAgICBlbnZLZXk6IFwiU0xBQ0tfRVhQSVJZX1JFTUlOREVSX0lOVEVSVkFMX01JTlVURVNcIixcbiAgICBsYWJlbDogXCLrp4zro4wg7JWM66a8IOuwmOuztSDso7zquLAgKOu2hClcIixcbiAgICBraW5kOiBcImludGVnZXJcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIG1pbjogMCxcbiAgICBtYXg6IDE0NDAsXG4gICAgaGVscDogXCIwIOydtOuptCDrsJjrs7Ug7JWM66a87J2EIOuBleuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLmNoYW5uZWxJZFwiLFxuICAgIGZhbGxiYWNrOiBcIlwiLFxuICAgIGdyb3VwOiBcInNsYWNrXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX0NIQU5ORUxfSURcIixcbiAgICBsYWJlbDogXCJTbGFjayDssYTrhJAgSURcIixcbiAgICBraW5kOiBcInN0cmluZ1wiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gICAgaGVscDogXCLsgqzsmqnsnpAgSUQoVS4uLinrpbwg64Sj7Jy866m0IOq3uCDsgqzrnowgRE0g7Jy866GcIOqwkeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLnVzZXJNYXBcIixcbiAgICBmYWxsYmFjazogXCJcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19VU0VSX01BUFwiLFxuICAgIGxhYmVsOiBcIlNsYWNrIOyCrOyaqeyekCDrp6TtlZFcIixcbiAgICBraW5kOiBcInN0cmluZ1wiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gICAgaGVscDogXCLthqDtgbDrqoU6U2xhY2tVc2VySWQg66W8IOyJvO2RnOuhnC4g6rO17JqpIOqzhOygleydgCDrhKPsp4Ag7JWK7Iq164uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwic2xhY2suYm90VG9rZW5cIixcbiAgICBmYWxsYmFjazogXCJcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19CT1RfVE9LRU5cIixcbiAgICBsYWJlbDogXCJTbGFjayDrtIcg7Yag7YGwXCIsXG4gICAga2luZDogXCJzZWNyZXRcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZXR0aW5nRGVmKGtleTogc3RyaW5nKTogU2V0dGluZ0RlZiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBTRVRUSU5HX0RFRlMuZmluZCgoZCkgPT4gZC5rZXkgPT09IGtleSk7XG59XG5cbi8qKiDsoIDsnqUg7KCEIOqygOymnS4g7J6Y66q765CcIOqwkuydtCDrk6TslrTqsIDrqbQg65+w7YOA7J6E7JeQ7IScIOyhsOyaqe2eiCDquLDrs7jqsJLsnLzroZwg65ao7Ja07KC4IOybkOyduOydhCDssL7quLAg7Ja066C164ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2V0dGluZ1ZhbHVlKFxuICBkZWY6IFNldHRpbmdEZWYsXG4gIHJhdzogc3RyaW5nLFxuKTogeyBvazogdHJ1ZTsgdmFsdWU6IHN0cmluZyB9IHwgeyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuXG4gIGlmIChkZWYua2luZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICBpZiAoIVtcInRydWVcIiwgXCJmYWxzZVwiXS5pbmNsdWRlcyh0cmltbWVkKSkgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCJ0cnVlIOuYkOuKlCBmYWxzZVwiIH07XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiB0cmltbWVkIH07XG4gIH1cblxuICBpZiAoZGVmLmtpbmQgPT09IFwiaW50ZWdlclwiIHx8IGRlZi5raW5kID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHRyaW1tZWQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkpIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IFwi7Iir7J6Q66W8IOyeheugpe2VmOyEuOyalFwiIH07XG4gICAgaWYgKGRlZi5raW5kID09PSBcImludGVnZXJcIiAmJiAhTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBcIuygleyImOulvCDsnoXroKXtlZjshLjsmpRcIiB9O1xuICAgIH1cbiAgICBpZiAoZGVmLm1pbiAhPT0gdW5kZWZpbmVkICYmIHBhcnNlZCA8IGRlZi5taW4pIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IGAke2RlZi5taW59IOydtOyDgeydtOyWtOyVvCDtlanri4jri6RgIH07XG4gICAgfVxuICAgIGlmIChkZWYubWF4ICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkID4gZGVmLm1heCkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogYCR7ZGVmLm1heH0g7J207ZWY7Jes7JW8IO2VqeuLiOuLpGAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBTdHJpbmcocGFyc2VkKSB9O1xuICB9XG5cbiAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiB0cmltbWVkIH07XG59XG5cbi8qKiDtmZTrqbTsl5Ag6re464yA66GcIOuCtOugpOuztOuCtOuptCDslYgg65CY64qUIOqwki4g7JWe65Kk66eMIOuCqOq4tOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2VjcmV0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUubGVuZ3RoIDw9IDEyKSByZXR1cm4gXCIqKipcIjtcbiAgcmV0dXJuIGAke3ZhbHVlLnNsaWNlKDAsIDgpfS4uLiR7dmFsdWUuc2xpY2UoLTQpfWA7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBK0JBLE1BQWEsK0JBQStCO0FBQzVDLE1BQWEsb0NBQW9DO0FBRWpELE1BQWEsZUFBNkI7Q0FDeEM7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsS0FBSztFQUNMLEtBQUs7Q0FDUDtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULEtBQUs7RUFDTCxLQUFLO0VBQ0wsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsS0FBSztFQUNMLEtBQUE7RUFDQSxNQUFNO0NBQ1I7Q0FDQTtFQUNFLEtBQUs7RUFDTCxVQUFVO0VBQ1YsT0FBTztFQUNQLFFBQVE7RUFDUixPQUFPO0VBQ1AsTUFBTTtFQUNOLFNBQVM7RUFDVCxLQUFLO0VBQ0wsS0FBQTtFQUNBLE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULEtBQUs7RUFDTCxLQUFLO0VBQ0wsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0NBQ1g7QUFDRjtBQUVBLFNBQWdCLGVBQWUsS0FBcUM7Q0FDbEUsT0FBTyxhQUFhLE1BQU0sTUFBTSxFQUFFLFFBQVEsR0FBRztBQUMvQzs7QUFHQSxTQUFnQixxQkFDZCxLQUNBLEtBQzREO0NBQzVELE1BQU0sVUFBVSxJQUFJLEtBQUs7Q0FFekIsSUFBSSxJQUFJLFNBQVMsV0FBVztFQUMxQixJQUFJLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLFNBQVMsT0FBTyxHQUFHLE9BQU87R0FBRSxJQUFJO0dBQU8sT0FBTztFQUFnQjtFQUNyRixPQUFPO0dBQUUsSUFBSTtHQUFNLE9BQU87RUFBUTtDQUNwQztDQUVBLElBQUksSUFBSSxTQUFTLGFBQWEsSUFBSSxTQUFTLFVBQVU7RUFDbkQsTUFBTSxTQUFTLE9BQU8sT0FBTztFQUM3QixJQUFJLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRyxPQUFPO0dBQUUsSUFBSTtHQUFPLE9BQU87RUFBWTtFQUNyRSxJQUFJLElBQUksU0FBUyxhQUFhLENBQUMsT0FBTyxVQUFVLE1BQU0sR0FDcEQsT0FBTztHQUFFLElBQUk7R0FBTyxPQUFPO0VBQVk7RUFFekMsSUFBSSxJQUFJLFFBQVEsVUFBYSxTQUFTLElBQUksS0FDeEMsT0FBTztHQUFFLElBQUk7R0FBTyxPQUFPLEdBQUcsSUFBSSxJQUFJO0VBQVk7RUFFcEQsSUFBSSxJQUFJLFFBQVEsVUFBYSxTQUFTLElBQUksS0FDeEMsT0FBTztHQUFFLElBQUk7R0FBTyxPQUFPLEdBQUcsSUFBSSxJQUFJO0VBQVc7RUFFbkQsT0FBTztHQUFFLElBQUk7R0FBTSxPQUFPLE9BQU8sTUFBTTtFQUFFO0NBQzNDO0NBRUEsT0FBTztFQUFFLElBQUk7RUFBTSxPQUFPO0NBQVE7QUFDcEM7O0FBR0EsU0FBZ0IsV0FBVyxPQUF1QjtDQUNoRCxJQUFJLE1BQU0sVUFBVSxJQUFJLE9BQU87Q0FDL0IsT0FBTyxHQUFHLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLE1BQU0sTUFBTSxFQUFFO0FBQ2pEIn0=
@@ -0,0 +1,66 @@
1
+ import { SettingModel } from "./setting.model.js";
2
+ import { getLogger } from "@logtape/logtape";
3
+ //#region src/application/setting/setting.store.ts
4
+ /**
5
+ * 런타임 설정 조회 캐시.
6
+ *
7
+ * 값의 출처는 DB(`settings`) → env 순이다. env 를 남겨두는 이유는 전환 때문이다 — dev0 는
8
+ * `ecosystem.config.json` 으로 값을 주입하는데, DB 만 보게 만들면 배포 직후 설정이 전부
9
+ * 기본값으로 떨어진다.
10
+ *
11
+ * 설정은 요청 경로(워커 스케일링, 알림 전송)에서 읽히므로 매번 DB 를 때리지 않고 메모리에
12
+ * 둔다. `immediate` 변경도 현재 API 프로세스에만 즉시 반영된다. 인스턴스가 여러 개면 다른
13
+ * 인스턴스의 캐시는 갱신되지 않으며, 이 범위에서는 프로세스 간 전파를 두지 않는다.
14
+ */
15
+ const logger = getLogger(["qgrid", "setting"]);
16
+ /** 로드 전에는 null 이라 전부 env 로 떨어진다. */
17
+ let cache = null;
18
+ let settingChangeHandler = null;
19
+ /**
20
+ * 런타임 소비자는 상위 조립 계층에서 하나만 등록한다. handler 는 동기 작업만 해야 하며,
21
+ * 실패해도 이미 성공한 DB 저장을 실패로 바꾸지 않는다.
22
+ */
23
+ function setSettingChangeHandler(handler) {
24
+ settingChangeHandler = handler;
25
+ }
26
+ function notifySettingChanged(key) {
27
+ try {
28
+ settingChangeHandler?.(key);
29
+ } catch (e) {
30
+ const message = e instanceof Error ? e.message : String(e);
31
+ logger.warn(`setting change handler failed for ${key}: ${message}`);
32
+ }
33
+ }
34
+ async function loadSettings(persistence = SettingModel) {
35
+ try {
36
+ cache = await persistence.findAllAsMap();
37
+ logger.info(`settings loaded: ${cache.size} stored`);
38
+ } catch (e) {
39
+ cache = /* @__PURE__ */ new Map();
40
+ logger.warn(`settings load failed, using env only: ${e.message}`);
41
+ }
42
+ }
43
+ /** DB → env 순. 둘 다 없으면 undefined 라 호출부의 기본값으로 떨어진다. */
44
+ function getSetting(key, envKey) {
45
+ return cache?.get(key) ?? process.env[envKey];
46
+ }
47
+ /** 저장된 값인지 — 화면에서 출처를 구분해 보여준다. */
48
+ function isStored(key) {
49
+ return cache?.has(key) ?? false;
50
+ }
51
+ async function saveSetting(key, value, persistence = SettingModel) {
52
+ await persistence.setByKey(key, value);
53
+ cache ??= /* @__PURE__ */ new Map();
54
+ cache.set(key, value);
55
+ notifySettingChanged(key);
56
+ }
57
+ /** 저장값을 지워 env 기본값으로 되돌린다. */
58
+ async function resetSetting(key, persistence = SettingModel) {
59
+ await persistence.clearByKey(key);
60
+ cache?.delete(key);
61
+ notifySettingChanged(key);
62
+ }
63
+ //#endregion
64
+ export { getSetting, isStored, loadSettings, resetSetting, saveSetting, setSettingChangeHandler };
65
+
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5zdG9yZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog65+w7YOA7J6EIOyEpOyglSDsobDtmowg7LqQ7IucLlxuICpcbiAqIOqwkuydmCDstpzsspjripQgREIoYHNldHRpbmdzYCkg4oaSIGVudiDsiJzsnbTri6QuIGVudiDrpbwg64Ko6rKo65GQ64qUIOydtOycoOuKlCDsoITtmZgg65WM66y47J2064ukIOKAlCBkZXYwIOuKlFxuICogYGVjb3N5c3RlbS5jb25maWcuanNvbmAg7Jy866GcIOqwkuydhCDso7zsnoXtlZjripTrjbAsIERCIOunjCDrs7Tqsowg66eM65Ok66m0IOuwsO2PrCDsp4Htm4Qg7ISk7KCV7J20IOyghOu2gFxuICog6riw67O46rCS7Jy866GcIOuWqOyWtOynhOuLpC5cbiAqXG4gKiDshKTsoJXsnYAg7JqU7LKtIOqyveuhnCjsm4zsu6Qg7Iqk7LyA7J2866eBLCDslYzrprwg7KCE7IahKeyXkOyEnCDsnb3tnojrr4DroZwg66ek67KIIERCIOulvCDrlYzrpqzsp4Ag7JWK6rOgIOuplOuqqOumrOyXkFxuICog65GU64ukLiBgaW1tZWRpYXRlYCDrs4Dqsr3rj4Qg7ZiE7J6sIEFQSSDtlITroZzshLjsiqTsl5Drp4wg7KaJ7IucIOuwmOyYgeuQnOuLpC4g7J247Iqk7YS07Iqk6rCAIOyXrOufrCDqsJzrqbQg64uk66W4XG4gKiDsnbjsiqTthLTsiqTsnZgg7LqQ7Iuc64qUIOqwseyLoOuQmOyngCDslYrsnLzrqbAsIOydtCDrspTsnITsl5DshJzripQg7ZSE66Gc7IS47IqkIOqwhCDsoITtjIzrpbwg65GQ7KeAIOyViuuKlOuLpC5cbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgU2V0dGluZ01vZGVsIH0gZnJvbSBcIi4vc2V0dGluZy5tb2RlbFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuLyoqIOuhnOuTnCDsoITsl5DripQgbnVsbCDsnbTrnbwg7KCE67aAIGVudiDroZwg65ao7Ja07KeE64ukLiAqL1xubGV0IGNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGw7XG5cbnR5cGUgU2V0dGluZ0NoYW5nZUhhbmRsZXIgPSAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXR0aW5nUGVyc2lzdGVuY2UgPSBQaWNrPFxuICB0eXBlb2YgU2V0dGluZ01vZGVsLFxuICBcImNsZWFyQnlLZXlcIiB8IFwiZmluZEFsbEFzTWFwXCIgfCBcInNldEJ5S2V5XCJcbj47XG5sZXQgc2V0dGluZ0NoYW5nZUhhbmRsZXI6IFNldHRpbmdDaGFuZ2VIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICog65+w7YOA7J6EIOyGjOu5hOyekOuKlCDsg4HsnIQg7KGw66a9IOqzhOy4teyXkOyEnCDtlZjrgpjrp4wg65Ox66Gd7ZWc64ukLiBoYW5kbGVyIOuKlCDrj5nquLAg7J6R7JeF66eMIO2VtOyVvCDtlZjrqbAsXG4gKiDsi6TtjKjtlbTrj4Qg7J2066+4IOyEseqzte2VnCBEQiDsoIDsnqXsnYQg7Iuk7Yyo66GcIOuwlOq+uOyngCDslYrripTri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiBTZXR0aW5nQ2hhbmdlSGFuZGxlciB8IG51bGwpOiB2b2lkIHtcbiAgc2V0dGluZ0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIHNldHRpbmdDaGFuZ2VIYW5kbGVyPy4oa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmcgY2hhbmdlIGhhbmRsZXIgZmFpbGVkIGZvciAke2tleX06ICR7bWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNldHRpbmdzKHBlcnNpc3RlbmNlOiBTZXR0aW5nUGVyc2lzdGVuY2UgPSBTZXR0aW5nTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjYWNoZSA9IGF3YWl0IHBlcnNpc3RlbmNlLmZpbmRBbGxBc01hcCgpO1xuICAgIGxvZ2dlci5pbmZvKGBzZXR0aW5ncyBsb2FkZWQ6ICR7Y2FjaGUuc2l6ZX0gc3RvcmVkYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDthYzsnbTruJTsnbQg7JWE7KeBIOyXhuuKlCDrsLDtj6wo66eI7J206re466CI7J207IWYIOyghCnsl5DshJzrj4Qg7ISc67KE64qUIOuWoOyVvCDtlZzri6QuXG4gICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmdzIGxvYWQgZmFpbGVkLCB1c2luZyBlbnYgb25seTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKiogREIg4oaSIGVudiDsiJwuIOuRmCDri6Qg7JeG7Jy866m0IHVuZGVmaW5lZCDrnbwg7Zi47Lac67aA7J2YIOq4sOuzuOqwkuycvOuhnCDrlqjslrTsp4Tri6QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZyhrZXk6IHN0cmluZywgZW52S2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGU/LmdldChrZXkpID8/IHByb2Nlc3MuZW52W2VudktleV07XG59XG5cbi8qKiDsoIDsnqXrkJwg6rCS7J247KeAIOKAlCDtmZTrqbTsl5DshJwg7Lac7LKY66W8IOq1rOu2hO2VtCDrs7Tsl6zspIDri6QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNhY2hlPy5oYXMoa2V5KSA/PyBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcGVyc2lzdGVuY2U6IFNldHRpbmdQZXJzaXN0ZW5jZSA9IFNldHRpbmdNb2RlbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBwZXJzaXN0ZW5jZS5zZXRCeUtleShrZXksIHZhbHVlKTtcbiAgY2FjaGUgPz89IG5ldyBNYXAoKTtcbiAgY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuXG4vKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNldFNldHRpbmcoXG4gIGtleTogc3RyaW5nLFxuICBwZXJzaXN0ZW5jZTogU2V0dGluZ1BlcnNpc3RlbmNlID0gU2V0dGluZ01vZGVsLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBlcnNpc3RlbmNlLmNsZWFyQnlLZXkoa2V5KTtcbiAgY2FjaGU/LmRlbGV0ZShrZXkpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWVBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxTQUFTLENBQUM7O0FBRzdDLElBQUksUUFBb0M7QUFPeEMsSUFBSSx1QkFBb0Q7Ozs7O0FBTXhELFNBQWdCLHdCQUF3QixTQUE0QztDQUNsRix1QkFBdUI7QUFDekI7QUFFQSxTQUFTLHFCQUFxQixLQUFtQjtDQUMvQyxJQUFJO0VBQ0YsdUJBQXVCLEdBQUc7Q0FDNUIsU0FBUyxHQUFHO0VBQ1YsTUFBTSxVQUFVLGFBQWEsUUFBUSxFQUFFLFVBQVUsT0FBTyxDQUFDO0VBQ3pELE9BQU8sS0FBSyxxQ0FBcUMsSUFBSSxJQUFJLFNBQVM7Q0FDcEU7QUFDRjtBQUVBLGVBQXNCLGFBQWEsY0FBa0MsY0FBNkI7Q0FDaEcsSUFBSTtFQUNGLFFBQVEsTUFBTSxZQUFZLGFBQWE7RUFDdkMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLEtBQUssUUFBUTtDQUNyRCxTQUFTLEdBQUc7RUFFVix3QkFBUSxJQUFJLElBQUk7RUFDaEIsT0FBTyxLQUFLLHlDQUEwQyxFQUFZLFNBQVM7Q0FDN0U7QUFDRjs7QUFHQSxTQUFnQixXQUFXLEtBQWEsUUFBb0M7Q0FDMUUsT0FBTyxPQUFPLElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSTtBQUN4Qzs7QUFHQSxTQUFnQixTQUFTLEtBQXNCO0NBQzdDLE9BQU8sT0FBTyxJQUFJLEdBQUcsS0FBSztBQUM1QjtBQUVBLGVBQXNCLFlBQ3BCLEtBQ0EsT0FDQSxjQUFrQyxjQUNuQjtDQUNmLE1BQU0sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNyQywwQkFBVSxJQUFJLElBQUk7Q0FDbEIsTUFBTSxJQUFJLEtBQUssS0FBSztDQUNwQixxQkFBcUIsR0FBRztBQUMxQjs7QUFHQSxlQUFzQixhQUNwQixLQUNBLGNBQWtDLGNBQ25CO0NBQ2YsTUFBTSxZQUFZLFdBQVcsR0FBRztDQUNoQyxPQUFPLE9BQU8sR0FBRztDQUNqQixxQkFBcUIsR0FBRztBQUMxQiJ9
@@ -0,0 +1,48 @@
1
+ import { SettingBaseListParams, SettingBaseSchema } from "../sonamu.generated.js";
2
+ import { z } from "zod";
3
+ //#region src/application/setting/setting.types.ts
4
+ const SettingListParams = SettingBaseListParams;
5
+ const SettingSaveParams = SettingBaseSchema.partial({
6
+ id: true,
7
+ created_at: true
8
+ });
9
+ const SettingKind = z.enum([
10
+ "boolean",
11
+ "integer",
12
+ "number",
13
+ "string",
14
+ "secret"
15
+ ]);
16
+ const SettingApplies = z.enum(["immediate", "restart"]);
17
+ const SettingSource = z.enum([
18
+ "db",
19
+ "env",
20
+ "default"
21
+ ]);
22
+ const SettingItem = z.object({
23
+ key: z.string(),
24
+ group: z.string(),
25
+ label: z.string(),
26
+ kind: SettingKind,
27
+ applies: SettingApplies,
28
+ /** 현재 적용 중인 값. 눈 토글을 지원하기 위해 secret 도 원본으로 내려간다. */
29
+ value: z.string(),
30
+ /** 이 값이 어디서 왔는지. 화면에서 출처를 보여줘야 "왜 안 바뀌지"가 없다. */
31
+ source: SettingSource,
32
+ min: z.number().nullable(),
33
+ max: z.number().nullable(),
34
+ help: z.string().nullable()
35
+ });
36
+ /** 화면에서 바꿀 수 없는 기동 시점 값들 — 어떤 환경에 붙어 있는지 확인용. */
37
+ const RuntimeInfoItem = z.object({
38
+ label: z.string(),
39
+ value: z.string()
40
+ });
41
+ const SettingsResponse = z.object({
42
+ settings: SettingItem.array(),
43
+ runtime: RuntimeInfoItem.array()
44
+ });
45
+ //#endregion
46
+ export { RuntimeInfoItem, SettingApplies, SettingItem, SettingKind, SettingListParams, SettingSaveParams, SettingSource, SettingsResponse };
47
+
48
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy50eXBlcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNldHRpbmdCYXNlU2NoZW1hLCBTZXR0aW5nQmFzZUxpc3RQYXJhbXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuXG4vLyBTZXR0aW5nIC0gTGlzdFBhcmFtc1xuZXhwb3J0IGNvbnN0IFNldHRpbmdMaXN0UGFyYW1zID0gU2V0dGluZ0Jhc2VMaXN0UGFyYW1zO1xuZXhwb3J0IHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nTGlzdFBhcmFtcz47XG5cbi8vIFNldHRpbmcgLSBTYXZlUGFyYW1zXG5leHBvcnQgY29uc3QgU2V0dGluZ1NhdmVQYXJhbXMgPSBTZXR0aW5nQmFzZVNjaGVtYS5wYXJ0aWFsKHsgaWQ6IHRydWUsIGNyZWF0ZWRfYXQ6IHRydWUgfSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nU2F2ZVBhcmFtcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdTYXZlUGFyYW1zPjtcblxuLy8g4pSA4pSAIOyEpOyglSBBUEkg7J2R64u1IOyKpO2CpOuniCDilIDilIBcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdLaW5kID0gei5lbnVtKFtcImJvb2xlYW5cIiwgXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwic2VjcmV0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdLaW5kID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ0tpbmQ+O1xuXG5leHBvcnQgY29uc3QgU2V0dGluZ0FwcGxpZXMgPSB6LmVudW0oW1wiaW1tZWRpYXRlXCIsIFwicmVzdGFydFwiXSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nQXBwbGllcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdBcHBsaWVzPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdTb3VyY2UgPSB6LmVudW0oW1wiZGJcIiwgXCJlbnZcIiwgXCJkZWZhdWx0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdTb3VyY2UgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nU291cmNlPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdJdGVtID0gei5vYmplY3Qoe1xuICBrZXk6IHouc3RyaW5nKCksXG4gIGdyb3VwOiB6LnN0cmluZygpLFxuICBsYWJlbDogei5zdHJpbmcoKSxcbiAga2luZDogU2V0dGluZ0tpbmQsXG4gIGFwcGxpZXM6IFNldHRpbmdBcHBsaWVzLFxuICAvKiog7ZiE7J6sIOyggeyaqSDspJHsnbgg6rCSLiDriIgg7Yag6riA7J2EIOyngOybkO2VmOq4sCDsnITtlbQgc2VjcmV0IOuPhCDsm5Drs7jsnLzroZwg64K066Ck6rCE64ukLiAqL1xuICB2YWx1ZTogei5zdHJpbmcoKSxcbiAgLyoqIOydtCDqsJLsnbQg7Ja065SU7IScIOyZlOuKlOyngC4g7ZmU66m07JeQ7IScIOy2nOyymOulvCDrs7Tsl6zspJjslbwgXCLsmZwg7JWIIOuwlOuAjOyngFwi6rCAIOyXhuuLpC4gKi9cbiAgc291cmNlOiBTZXR0aW5nU291cmNlLFxuICBtaW46IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgbWF4OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGhlbHA6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgU2V0dGluZ0l0ZW0gPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nSXRlbT47XG5cbi8qKiDtmZTrqbTsl5DshJwg67CU6r+AIOyImCDsl4bripQg6riw64+ZIOyLnOygkCDqsJLrk6Qg4oCUIOyWtOuWpCDtmZjqsr3sl5Ag67aZ7Ja0IOyeiOuKlOyngCDtmZXsnbjsmqkuICovXG5leHBvcnQgY29uc3QgUnVudGltZUluZm9JdGVtID0gei5vYmplY3Qoe1xuICBsYWJlbDogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIFJ1bnRpbWVJbmZvSXRlbSA9IHouaW5mZXI8dHlwZW9mIFJ1bnRpbWVJbmZvSXRlbT47XG5cbmV4cG9ydCBjb25zdCBTZXR0aW5nc1Jlc3BvbnNlID0gei5vYmplY3Qoe1xuICBzZXR0aW5nczogU2V0dGluZ0l0ZW0uYXJyYXkoKSxcbiAgcnVudGltZTogUnVudGltZUluZm9JdGVtLmFycmF5KCksXG59KTtcbmV4cG9ydCB0eXBlIFNldHRpbmdzUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nc1Jlc3BvbnNlPjtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsTUFBYSxvQkFBb0I7QUFJakMsTUFBYSxvQkFBb0Isa0JBQWtCLFFBQVE7Q0FBRSxJQUFJO0NBQU0sWUFBWTtBQUFLLENBQUM7QUFLekYsTUFBYSxjQUFjLEVBQUUsS0FBSztDQUFDO0NBQVc7Q0FBVztDQUFVO0NBQVU7QUFBUSxDQUFDO0FBR3RGLE1BQWEsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGFBQWEsU0FBUyxDQUFDO0FBRzdELE1BQWEsZ0JBQWdCLEVBQUUsS0FBSztDQUFDO0NBQU07Q0FBTztBQUFTLENBQUM7QUFHNUQsTUFBYSxjQUFjLEVBQUUsT0FBTztDQUNsQyxLQUFLLEVBQUUsT0FBTztDQUNkLE9BQU8sRUFBRSxPQUFPO0NBQ2hCLE9BQU8sRUFBRSxPQUFPO0NBQ2hCLE1BQU07Q0FDTixTQUFTOztDQUVULE9BQU8sRUFBRSxPQUFPOztDQUVoQixRQUFRO0NBQ1IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDekIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7QUFDNUIsQ0FBQzs7QUFJRCxNQUFhLGtCQUFrQixFQUFFLE9BQU87Q0FDdEMsT0FBTyxFQUFFLE9BQU87Q0FDaEIsT0FBTyxFQUFFLE9BQU87QUFDbEIsQ0FBQztBQUdELE1BQWEsbUJBQW1CLEVBQUUsT0FBTztDQUN2QyxVQUFVLFlBQVksTUFBTTtDQUM1QixTQUFTLGdCQUFnQixNQUFNO0FBQ2pDLENBQUMifQ==
@@ -104,6 +104,10 @@ const RequestLogStepOrderBy = z.enum(["id-asc"]).describe("RequestLogStepOrderBy
104
104
  const RequestLogStepOrderByLabel = { "id-asc": "ID순" };
105
105
  const RequestLogStepSearchField = z.enum(["id"]).describe("RequestLogStepSearchField");
106
106
  const RequestLogStepSearchFieldLabel = { id: "ID" };
107
+ const SettingOrderBy = z.enum(["key-asc"]).describe("SettingOrderBy");
108
+ const SettingOrderByLabel = { "key-asc": "키순" };
109
+ const SettingSearchField = z.enum(["key"]).describe("SettingSearchField");
110
+ const SettingSearchFieldLabel = { key: "키" };
107
111
  const TokenOrderBy = z.enum(["id-desc", "ord-asc"]).describe("TokenOrderBy");
108
112
  const TokenOrderByLabel = {
109
113
  "id-desc": "ID최신순",
@@ -175,6 +179,13 @@ const RequestLogStepBaseSchema = z.object({
175
179
  tool_duration_ms: z.int().nullable(),
176
180
  error: z.string().nullable()
177
181
  });
182
+ const SettingBaseSchema = z.object({
183
+ id: z.int(),
184
+ created_at: z.date(),
185
+ key: z.string().max(100),
186
+ value: z.string(),
187
+ updated_at: z.date().nullable()
188
+ });
178
189
  const TokenBaseSchema = z.object({
179
190
  id: z.int(),
180
191
  created_at: z.date(),
@@ -210,6 +221,17 @@ const RequestLogStepBaseListParams = z.object({
210
221
  sonamuFilter: z.custom(),
211
222
  request_log_id: z.int()
212
223
  }).partial();
224
+ const SettingBaseListParams = z.object({
225
+ num: z.number().int().nonnegative(),
226
+ page: z.number().int().min(1),
227
+ search: SettingSearchField,
228
+ keyword: z.string(),
229
+ orderBy: SettingOrderBy,
230
+ queryMode: SonamuQueryMode,
231
+ id: zArrayable(z.number().int().positive()),
232
+ sonamuFilter: z.custom(),
233
+ key: z.string().max(100)
234
+ }).partial();
213
235
  const TokenBaseListParams = z.object({
214
236
  num: z.number().int().nonnegative(),
215
237
  page: z.number().int().min(1),
@@ -358,6 +380,14 @@ const RequestLogStepSubsetKey = z.enum([
358
380
  "T",
359
381
  "I"
360
382
  ]);
383
+ const SettingSubsetA = z.object({
384
+ id: z.int(),
385
+ created_at: z.date(),
386
+ key: z.string().max(100),
387
+ value: z.string(),
388
+ updated_at: z.date().nullable()
389
+ });
390
+ const SettingSubsetKey = z.enum(["A"]);
361
391
  const TokenSubsetA = z.object({
362
392
  id: z.int(),
363
393
  created_at: z.date(),
@@ -371,6 +401,6 @@ const TokenSubsetA = z.object({
371
401
  });
372
402
  const TokenSubsetKey = z.enum(["A"]);
373
403
  //#endregion
374
- export { RequestLogBaseListParams, RequestLogBaseSchema, RequestLogOrderBy, RequestLogOrderByLabel, RequestLogSearchField, RequestLogSearchFieldLabel, RequestLogStatus, RequestLogStatusLabel, RequestLogStepBaseListParams, RequestLogStepBaseSchema, RequestLogStepOrderBy, RequestLogStepOrderByLabel, RequestLogStepSearchField, RequestLogStepSearchFieldLabel, RequestLogStepSubsetA, RequestLogStepSubsetI, RequestLogStepSubsetKey, RequestLogStepSubsetT, RequestLogStepType, RequestLogStepTypeLabel, RequestLogSubsetA, RequestLogSubsetC, RequestLogSubsetKey, RequestLogSubsetP, TokenBaseListParams, TokenBaseSchema, TokenOrderBy, TokenOrderByLabel, TokenSearchField, TokenSearchFieldLabel, TokenSubsetA, TokenSubsetKey };
404
+ export { RequestLogBaseListParams, RequestLogBaseSchema, RequestLogOrderBy, RequestLogOrderByLabel, RequestLogSearchField, RequestLogSearchFieldLabel, RequestLogStatus, RequestLogStatusLabel, RequestLogStepBaseListParams, RequestLogStepBaseSchema, RequestLogStepOrderBy, RequestLogStepOrderByLabel, RequestLogStepSearchField, RequestLogStepSearchFieldLabel, RequestLogStepSubsetA, RequestLogStepSubsetI, RequestLogStepSubsetKey, RequestLogStepSubsetT, RequestLogStepType, RequestLogStepTypeLabel, RequestLogSubsetA, RequestLogSubsetC, RequestLogSubsetKey, RequestLogSubsetP, SettingBaseListParams, SettingBaseSchema, SettingOrderBy, SettingOrderByLabel, SettingSearchField, SettingSearchFieldLabel, SettingSubsetA, SettingSubsetKey, TokenBaseListParams, TokenBaseSchema, TokenOrderBy, TokenOrderByLabel, TokenSearchField, TokenSearchFieldLabel, TokenSubsetA, TokenSubsetKey };
375
405
 
376
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmdlbmVyYXRlZC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbi8qIG94bGludC1kaXNhYmxlICovXG5cbmltcG9ydCB7IHpBcnJheWFibGUsIFNvbmFtdVF1ZXJ5TW9kZSwgQXBwbHlTb25hbXVGaWx0ZXIgfSBmcm9tIFwic29uYW11XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG4vLyBDdXN0b21TY2FsYXI6IEhpc3RvcnlJdGVtc1xuY29uc3QgSGlzdG9yeUl0ZW1zID0gei5hcnJheShcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHouc3RyaW5nKCksXG4gICAgcm9sZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNvbnRlbnQ6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gICAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFyZ3VtZW50czogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNhbGxfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvdXRwdXQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSksXG4pO1xudHlwZSBIaXN0b3J5SXRlbXMgPSB6LmluZmVyPHR5cGVvZiBIaXN0b3J5SXRlbXM+O1xuXG4vLyBDdXN0b21TY2FsYXI6IFRva2VuQ3JlZGVudGlhbHNcbmNvbnN0IFRva2VuQ3JlZGVudGlhbHMgPSB6LnVuaW9uKFtcbiAgei5vYmplY3Qoe1xuICAgIGFjY2Vzc1Rva2VuOiB6LnN0cmluZygpLFxuICAgIHJlZnJlc2hUb2tlbjogei5zdHJpbmcoKSxcbiAgICBleHBpcmVzQXQ6IHoubnVtYmVyKCksXG4gICAgYWNjb3VudFV1aWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgYWNjZXNzVG9rZW46IHouc3RyaW5nKCksXG4gICAgcmVmcmVzaFRva2VuOiB6LnN0cmluZygpLFxuICAgIGlkVG9rZW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogei5udW1iZXIoKSxcbiAgICBpZFRva2VuRXhwaXJlc0F0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgYWNjb3VudElkOiB6LnN0cmluZygpLFxuICAgIHBsYW5UeXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG50eXBlIFRva2VuQ3JlZGVudGlhbHMgPSB6LmluZmVyPHR5cGVvZiBUb2tlbkNyZWRlbnRpYWxzPjtcblxuLy8gQ3VzdG9tU2NhbGFyOiBUb29sRGVmaW5pdGlvbnNcbmNvbnN0IFRvb2xEZWZpbml0aW9ucyA9IHouYXJyYXkoXG4gIHoub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5wdXRTY2hlbWE6IHoudW5rbm93bigpLFxuICB9KSxcbik7XG50eXBlIFRvb2xEZWZpbml0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFRvb2xEZWZpbml0aW9ucz47XG5cbi8vIEVudW1zOiBSZXF1ZXN0TG9nXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ09yZGVyQnkgPSB6XG4gIC5lbnVtKFtcbiAgICBcImlkLWRlc2NcIixcbiAgICBcImlkLWFzY1wiLFxuICAgIFwiY3JlYXRlZF9hdC1kZXNjXCIsXG4gICAgXCJjcmVhdGVkX2F0LWFzY1wiLFxuICAgIFwidHRmdF9tcy1kZXNjXCIsXG4gICAgXCJ0dGZ0X21zLWFzY1wiLFxuICAgIFwiZHVyYXRpb25fbXMtZGVzY1wiLFxuICAgIFwiZHVyYXRpb25fbXMtYXNjXCIsXG4gICAgXCJpbnB1dF90b2tlbnMtZGVzY1wiLFxuICAgIFwiaW5wdXRfdG9rZW5zLWFzY1wiLFxuICAgIFwib3V0cHV0X3Rva2Vucy1kZXNjXCIsXG4gICAgXCJvdXRwdXRfdG9rZW5zLWFzY1wiLFxuICAgIFwiY2FjaGVfcmVhZF90b2tlbnMtZGVzY1wiLFxuICAgIFwiY2FjaGVfcmVhZF90b2tlbnMtYXNjXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zLWFzY1wiLFxuICAgIFwiY29zdF91c2QtZGVzY1wiLFxuICAgIFwiY29zdF91c2QtYXNjXCIsXG4gIF0pXG4gIC5kZXNjcmliZShcIlJlcXVlc3RMb2dPcmRlckJ5XCIpO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ09yZGVyQnkgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nT3JkZXJCeT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ09yZGVyQnlMYWJlbCA9IHtcbiAgXCJpZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIixcbiAgXCJpZC1hc2NcIjogXCJJROyYpOuemOuQnOyInFwiLFxuICBcImNyZWF0ZWRfYXQtZGVzY1wiOiBcIuuTseuhneydvOyLnOy1nOyLoOyInFwiLFxuICBcImNyZWF0ZWRfYXQtYXNjXCI6IFwi65Ox66Gd7J287Iuc7Jik656Y65Cc7IicXCIsXG4gIFwidHRmdF9tcy1kZXNjXCI6IFwiVFRGVOq4tOyInFwiLFxuICBcInR0ZnRfbXMtYXNjXCI6IFwiVFRGVOynp+ydgOyInFwiLFxuICBcImR1cmF0aW9uX21zLWRlc2NcIjogXCLshozsmpTsi5zqsITquLTsiJxcIixcbiAgXCJkdXJhdGlvbl9tcy1hc2NcIjogXCLshozsmpTsi5zqsITsp6fsnYDsiJxcIixcbiAgXCJpbnB1dF90b2tlbnMtZGVzY1wiOiBcIuyeheugpe2GoO2BsOunjuydgOyInFwiLFxuICBcImlucHV0X3Rva2Vucy1hc2NcIjogXCLsnoXroKXthqDtgbDsoIHsnYDsiJxcIixcbiAgXCJvdXRwdXRfdG9rZW5zLWRlc2NcIjogXCLstpzroKXthqDtgbDrp47snYDsiJxcIixcbiAgXCJvdXRwdXRfdG9rZW5zLWFzY1wiOiBcIuy2nOugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImNhY2hlX3JlYWRfdG9rZW5zLWRlc2NcIjogXCLsupDsi5zsnb3quLDrp47snYDsiJxcIixcbiAgXCJjYWNoZV9yZWFkX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsnb3quLDsoIHsnYDsiJxcIixcbiAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOyDneyEseunjuydgOyInFwiLFxuICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsg53shLHsoIHsnYDsiJxcIixcbiAgXCJjb3N0X3VzZC1kZXNjXCI6IFwi67mE7Jqp64aS7J2A7IicXCIsXG4gIFwiY29zdF91c2QtYXNjXCI6IFwi67mE7Jqp64Ku7J2A7IicXCIsXG59O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTZWFyY2hGaWVsZCA9IHpcbiAgLmVudW0oW1wiaWRcIiwgXCJ0b2tlbl9uYW1lXCIsIFwidXNlcl9wcm9tcHRcIl0pXG4gIC5kZXNjcmliZShcIlJlcXVlc3RMb2dTZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTZWFyY2hGaWVsZCA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTZWFyY2hGaWVsZD47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1NlYXJjaEZpZWxkTGFiZWwgPSB7XG4gIGlkOiBcIklEXCIsXG4gIHRva2VuX25hbWU6IFwi7Yag7YGw7J2066aEXCIsXG4gIHVzZXJfcHJvbXB0OiBcIuyCrOyaqeyekCDtlITroaztlITtirhcIixcbn07XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0YXR1cyA9IHpcbiAgLmVudW0oW1wicnVubmluZ1wiLCBcInN1Y2NlZWRlZFwiLCBcImVycm9yXCIsIFwiYWJvcnRlZFwiXSlcbiAgLmRlc2NyaWJlKFwiUmVxdWVzdExvZ1N0YXR1c1wiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGF0dXMgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3RhdHVzPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RhdHVzTGFiZWwgPSB7XG4gIHJ1bm5pbmc6IFwi7Iuk7ZaJIOykkVwiLFxuICBzdWNjZWVkZWQ6IFwi7ISx6rO1XCIsXG4gIGVycm9yOiBcIuyXkOufrFwiLFxuICBhYm9ydGVkOiBcIuykkeuLqFwiLFxufTtcblxuLy8gRW51bXM6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBUeXBlID0gei5lbnVtKFtcImdlbmVyYXRlXCIsIFwidG9vbF9jYWxsXCJdKS5kZXNjcmliZShcIlJlcXVlc3RMb2dTdGVwVHlwZVwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwVHlwZSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwVHlwZT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBUeXBlTGFiZWwgPSB7IGdlbmVyYXRlOiBcIkxMTSDsg53shLFcIiwgdG9vbF9jYWxsOiBcIlRvb2wg7Zi47LacXCIgfTtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcE9yZGVyQnkgPSB6LmVudW0oW1wiaWQtYXNjXCJdKS5kZXNjcmliZShcIlJlcXVlc3RMb2dTdGVwT3JkZXJCeVwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwT3JkZXJCeSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwT3JkZXJCeT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBPcmRlckJ5TGFiZWwgPSB7IFwiaWQtYXNjXCI6IFwiSUTsiJxcIiB9O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdGVwU2VhcmNoRmllbGQgPSB6LmVudW0oW1wiaWRcIl0pLmRlc2NyaWJlKFwiUmVxdWVzdExvZ1N0ZXBTZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU2VhcmNoRmllbGQgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkTGFiZWwgPSB7IGlkOiBcIklEXCIgfTtcblxuLy8gRW51bXM6IFRva2VuXG5leHBvcnQgY29uc3QgVG9rZW5PcmRlckJ5ID0gei5lbnVtKFtcImlkLWRlc2NcIiwgXCJvcmQtYXNjXCJdKS5kZXNjcmliZShcIlRva2VuT3JkZXJCeVwiKTtcbmV4cG9ydCB0eXBlIFRva2VuT3JkZXJCeSA9IHouaW5mZXI8dHlwZW9mIFRva2VuT3JkZXJCeT47XG5leHBvcnQgY29uc3QgVG9rZW5PcmRlckJ5TGFiZWwgPSB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsIFwib3JkLWFzY1wiOiBcIuyInOyEnOyInFwiIH07XG5leHBvcnQgY29uc3QgVG9rZW5TZWFyY2hGaWVsZCA9IHouZW51bShbXCJpZFwiLCBcIm5hbWVcIl0pLmRlc2NyaWJlKFwiVG9rZW5TZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFRva2VuU2VhcmNoRmllbGQgPSB6LmluZmVyPHR5cGVvZiBUb2tlblNlYXJjaEZpZWxkPjtcbmV4cG9ydCBjb25zdCBUb2tlblNlYXJjaEZpZWxkTGFiZWwgPSB7IGlkOiBcIklEXCIsIG5hbWU6IFwi7J2066aEXCIgfTtcblxuLy8gQmFzZVNjaGVtYTogUmVxdWVzdExvZ1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHRva2VuX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgcHJvamVjdF9uYW1lOiB6LnN0cmluZygpLm1heCg1MCkubnVsbGFibGUoKSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBmYWxsYmFja19jb3VudDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB1c2VyX3Byb21wdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBzeXN0ZW1fcHJvbXB0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHJlc3BvbnNlOiB6LnN0cmluZygpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZHVyYXRpb25fbXM6IHouaW50KCksXG4gIHR0ZnRfbXM6IHouaW50KCksXG4gIGNvc3RfdXNkOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3Rfc291cmNlOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF9tZXRob2Q6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgZWZmb3J0OiB6LnN0cmluZygpLm1heCgxMCkubnVsbGFibGUoKSxcbiAgaGlzdG9yeTogSGlzdG9yeUl0ZW1zLm51bGxhYmxlKCksXG4gIHRvb2xzOiBUb29sRGVmaW5pdGlvbnMubnVsbGFibGUoKSxcbiAgc3RhdHVzOiBSZXF1ZXN0TG9nU3RhdHVzLFxuICBlcnJvcl9tZXNzYWdlOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9jb3VudDogei5pbnQoKSxcbiAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dCYXNlU2NoZW1hID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ0Jhc2VTY2hlbWE+ICYge1xuICByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgW1xuICAgIFwiY3JlYXRlZF9hdFwiLFxuICAgIFwidG9rZW5fbmFtZVwiLFxuICAgIFwicHJvamVjdF9uYW1lXCIsXG4gICAgXCJtb2RlbF9uYW1lXCIsXG4gICAgXCJyZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICBcInVzZXJfcHJvbXB0XCIsXG4gICAgXCJzeXN0ZW1fcHJvbXB0XCIsXG4gICAgXCJyZXNwb25zZVwiLFxuICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICBcImNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgIFwiZHVyYXRpb25fbXNcIixcbiAgICBcInR0ZnRfbXNcIixcbiAgICBcImNvc3RfdXNkXCIsXG4gICAgXCJjb3N0X3NvdXJjZVwiLFxuICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICBcImltYWdlX2Nvc3RfbWV0aG9kXCIsXG4gICAgXCJlZmZvcnRcIixcbiAgICBcImhpc3RvcnlcIixcbiAgICBcInRvb2xzXCIsXG4gICAgXCJzdGF0dXNcIixcbiAgICBcImVycm9yX21lc3NhZ2VcIixcbiAgICBcInRvb2xfY2FsbF9jb3VudFwiLFxuICAgIFwiaXNfaW1hZ2VfZ2VuZXJhdGlvblwiLFxuICAgIFwiaWRcIixcbiAgXTtcbn07XG5cbi8vIEJhc2VTY2hlbWE6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHJlcXVlc3RfbG9nX2lkOiB6LmludCgpLFxuICBzdGVwX2luZGV4OiB6LmludCgpLFxuICB0eXBlOiBSZXF1ZXN0TG9nU3RlcFR5cGUsXG4gIG1vZGVsX25hbWU6IHouc3RyaW5nKCkubWF4KDI1NSkubnVsbGFibGUoKSxcbiAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHouc3RyaW5nKCkubWF4KDI1NSkubnVsbGFibGUoKSxcbiAgZmFsbGJhY2tfY291bnQ6IHouaW50KCkubnVsbGFibGUoKSxcbiAgaW5wdXRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICBkdXJhdGlvbl9tczogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0dGZ0X21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGZpbmlzaF9yZWFzb246IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICByZWFzb25pbmdfdGV4dDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICByZWFzb25pbmdfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9pbmRleDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0b29sX2NhbGxfaWQ6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgdG9vbF9uYW1lOiB6LnN0cmluZygpLm1heCgxMDApLm51bGxhYmxlKCksXG4gIHRvb2xfYXJnczogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0b29sX3Jlc3VsdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB0b29sX2R1cmF0aW9uX21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGVycm9yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwQmFzZVNjaGVtYSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwQmFzZVNjaGVtYT4gJiB7XG4gIHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbXG4gICAgXCJjcmVhdGVkX2F0XCIsXG4gICAgXCJtb2RlbF9uYW1lXCIsXG4gICAgXCJyZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICBcImNvc3RfdXNkXCIsXG4gICAgXCJjb3N0X3NvdXJjZVwiLFxuICAgIFwiZHVyYXRpb25fbXNcIixcbiAgICBcInR0ZnRfbXNcIixcbiAgICBcImZpbmlzaF9yZWFzb25cIixcbiAgICBcInJlYXNvbmluZ190ZXh0XCIsXG4gICAgXCJyZWFzb25pbmdfdG9rZW5zXCIsXG4gICAgXCJ0b29sX2NhbGxfaW5kZXhcIixcbiAgICBcInRvb2xfY2FsbF9pZFwiLFxuICAgIFwidG9vbF9uYW1lXCIsXG4gICAgXCJ0b29sX2FyZ3NcIixcbiAgICBcInRvb2xfcmVzdWx0XCIsXG4gICAgXCJ0b29sX2R1cmF0aW9uX21zXCIsXG4gICAgXCJlcnJvclwiLFxuICAgIFwiaWRcIixcbiAgXTtcbn07XG5cbi8vIEJhc2VTY2hlbWE6IFRva2VuXG5leHBvcnQgY29uc3QgVG9rZW5CYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLm1heCgyMCksXG4gIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICBuYW1lOiB6LnN0cmluZygpLFxuICBhY3RpdmU6IHouYm9vbGVhbigpLFxuICBvcmQ6IHouaW50KCksXG4gIHF1b3RhX3RocmVzaG9sZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB3ZWlnaHQ6IHouaW50KCksXG59KTtcbmV4cG9ydCB0eXBlIFRva2VuQmFzZVNjaGVtYSA9IHouaW5mZXI8dHlwZW9mIFRva2VuQmFzZVNjaGVtYT4gJiB7XG4gIHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbXG4gICAgXCJjcmVhdGVkX2F0XCIsXG4gICAgXCJhY3RpdmVcIixcbiAgICBcIm9yZFwiLFxuICAgIFwicXVvdGFfdGhyZXNob2xkXCIsXG4gICAgXCJ3ZWlnaHRcIixcbiAgICBcImlkXCIsXG4gIF07XG59O1xuXG4vLyBCYXNlTGlzdFBhcmFtczogUmVxdWVzdExvZ1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dCYXNlTGlzdFBhcmFtcyA9IHpcbiAgLm9iamVjdCh7XG4gICAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgcGFnZTogei5udW1iZXIoKS5pbnQoKS5taW4oMSksXG4gICAgc2VhcmNoOiBSZXF1ZXN0TG9nU2VhcmNoRmllbGQsXG4gICAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgICBvcmRlckJ5OiBSZXF1ZXN0TG9nT3JkZXJCeSxcbiAgICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgICBpZDogekFycmF5YWJsZSh6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCkpLFxuICAgIHNvbmFtdUZpbHRlcjogei5jdXN0b208QXBwbHlTb25hbXVGaWx0ZXI8UmVxdWVzdExvZ0Jhc2VTY2hlbWEsIG5ldmVyLCBuZXZlcj4+KCksXG4gICAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICAgIHByb2plY3RfbmFtZTogei5zdHJpbmcoKS5tYXgoNTApLm51bGxhYmxlKCksXG4gICAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICB9KVxuICAucGFydGlhbCgpO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zPjtcblxuLy8gQmFzZUxpc3RQYXJhbXM6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBCYXNlTGlzdFBhcmFtcyA9IHpcbiAgLm9iamVjdCh7XG4gICAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgcGFnZTogei5udW1iZXIoKS5pbnQoKS5taW4oMSksXG4gICAgc2VhcmNoOiBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkLFxuICAgIGtleXdvcmQ6IHouc3RyaW5nKCksXG4gICAgb3JkZXJCeTogUmVxdWVzdExvZ1N0ZXBPcmRlckJ5LFxuICAgIHF1ZXJ5TW9kZTogU29uYW11UXVlcnlNb2RlLFxuICAgIGlkOiB6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSksXG4gICAgc29uYW11RmlsdGVyOiB6LmN1c3RvbTxBcHBseVNvbmFtdUZpbHRlcjxSZXF1ZXN0TG9nU3RlcEJhc2VTY2hlbWEsIG5ldmVyLCBuZXZlcj4+KCksXG4gICAgcmVxdWVzdF9sb2dfaWQ6IHouaW50KCksXG4gIH0pXG4gIC5wYXJ0aWFsKCk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3RlcEJhc2VMaXN0UGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBCYXNlTGlzdFBhcmFtcz47XG5cbi8vIEJhc2VMaXN0UGFyYW1zOiBUb2tlblxuZXhwb3J0IGNvbnN0IFRva2VuQmFzZUxpc3RQYXJhbXMgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG51bTogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICAgIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICAgIHNlYXJjaDogVG9rZW5TZWFyY2hGaWVsZCxcbiAgICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICAgIG9yZGVyQnk6IFRva2VuT3JkZXJCeSxcbiAgICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgICBpZDogekFycmF5YWJsZSh6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCkpLFxuICAgIHNvbmFtdUZpbHRlcjogei5jdXN0b208QXBwbHlTb25hbXVGaWx0ZXI8VG9rZW5CYXNlU2NoZW1hLCBuZXZlciwgbmV2ZXI+PigpLFxuICB9KVxuICAucGFydGlhbCgpO1xuZXhwb3J0IHR5cGUgVG9rZW5CYXNlTGlzdFBhcmFtcyA9IHouaW5mZXI8dHlwZW9mIFRva2VuQmFzZUxpc3RQYXJhbXM+O1xuXG4vLyBTdWJzZXRzOiBSZXF1ZXN0TG9nXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N1YnNldEEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBwcm9qZWN0X25hbWU6IHouc3RyaW5nKCkubWF4KDUwKS5udWxsYWJsZSgpLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGZhbGxiYWNrX2NvdW50OiB6LmludCgpLm51bGxhYmxlKCksXG4gIHVzZXJfcHJvbXB0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHN5c3RlbV9wcm9tcHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgcmVzcG9uc2U6IHouc3RyaW5nKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBkdXJhdGlvbl9tczogei5pbnQoKSxcbiAgdHRmdF9tczogei5pbnQoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X21ldGhvZDogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBlZmZvcnQ6IHouc3RyaW5nKCkubWF4KDEwKS5udWxsYWJsZSgpLFxuICBoaXN0b3J5OiBIaXN0b3J5SXRlbXMubnVsbGFibGUoKSxcbiAgdG9vbHM6IFRvb2xEZWZpbml0aW9ucy5udWxsYWJsZSgpLFxuICBzdGF0dXM6IFJlcXVlc3RMb2dTdGF0dXMsXG4gIGVycm9yX21lc3NhZ2U6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2NvdW50OiB6LmludCgpLFxuICBpc19pbWFnZV9nZW5lcmF0aW9uOiB6LmJvb2xlYW4oKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N1YnNldEEgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3Vic2V0QT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N1YnNldFAgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBwcm9qZWN0X25hbWU6IHouc3RyaW5nKCkubWF4KDUwKS5udWxsYWJsZSgpLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGZhbGxiYWNrX2NvdW50OiB6LmludCgpLm51bGxhYmxlKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBkdXJhdGlvbl9tczogei5pbnQoKSxcbiAgdHRmdF9tczogei5pbnQoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X21ldGhvZDogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBlZmZvcnQ6IHouc3RyaW5nKCkubWF4KDEwKS5udWxsYWJsZSgpLFxuICBzdGF0dXM6IFJlcXVlc3RMb2dTdGF0dXMsXG4gIHRvb2xfY2FsbF9jb3VudDogei5pbnQoKSxcbiAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRQID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N1YnNldFA+O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdWJzZXRDID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3NvdXJjZTogei5zdHJpbmcoKS5tYXgoMjApLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRDID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N1YnNldEM+O1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgPSB7XG4gIEE6IFJlcXVlc3RMb2dTdWJzZXRBO1xuICBQOiBSZXF1ZXN0TG9nU3Vic2V0UDtcbiAgQzogUmVxdWVzdExvZ1N1YnNldEM7XG59O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdWJzZXRLZXkgPSB6LmVudW0oW1wiQVwiLCBcIlBcIiwgXCJDXCJdKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXkgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3Vic2V0S2V5PjtcblxuLy8gU3Vic2V0czogUmVxdWVzdExvZ1N0ZXBcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcFN1YnNldEEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgc3RlcF9pbmRleDogei5pbnQoKSxcbiAgdHlwZTogUmVxdWVzdExvZ1N0ZXBUeXBlLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGZhbGxiYWNrX2NvdW50OiB6LmludCgpLm51bGxhYmxlKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBvdXRwdXRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3RfdXNkOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3Rfc291cmNlOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgZHVyYXRpb25fbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdHRmdF9tczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBmaW5pc2hfcmVhc29uOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgcmVhc29uaW5nX3RleHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgcmVhc29uaW5nX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0b29sX2NhbGxfaW5kZXg6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2lkOiB6LnN0cmluZygpLm1heCgxMDApLm51bGxhYmxlKCksXG4gIHRvb2xfbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICB0b29sX2FyZ3M6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdG9vbF9yZXN1bHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdG9vbF9kdXJhdGlvbl9tczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBlcnJvcjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxufSk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3RlcFN1YnNldEEgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3RlcFN1YnNldEE+O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdGVwU3Vic2V0VCA9IHoub2JqZWN0KHtcbiAgaWQ6IHouaW50KCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLFxuICBzdGVwX2luZGV4OiB6LmludCgpLFxuICB0eXBlOiBSZXF1ZXN0TG9nU3RlcFR5cGUsXG4gIG1vZGVsX25hbWU6IHouc3RyaW5nKCkubWF4KDI1NSkubnVsbGFibGUoKSxcbiAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHouc3RyaW5nKCkubWF4KDI1NSkubnVsbGFibGUoKSxcbiAgZmFsbGJhY2tfY291bnQ6IHouaW50KCkubnVsbGFibGUoKSxcbiAgaW5wdXRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICBkdXJhdGlvbl9tczogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0dGZ0X21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGZpbmlzaF9yZWFzb246IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICByZWFzb25pbmdfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9pbmRleDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0b29sX2NhbGxfaWQ6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgdG9vbF9uYW1lOiB6LnN0cmluZygpLm1heCgxMDApLm51bGxhYmxlKCksXG4gIHRvb2xfZHVyYXRpb25fbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZXJyb3I6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N0ZXBTdWJzZXRUID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBTdWJzZXRUPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcFN1YnNldEkgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICB0b29sX2FyZ3M6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N0ZXBTdWJzZXRJID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBTdWJzZXRJPjtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0TWFwcGluZyA9IHtcbiAgQTogUmVxdWVzdExvZ1N0ZXBTdWJzZXRBO1xuICBUOiBSZXF1ZXN0TG9nU3RlcFN1YnNldFQ7XG4gIEk6IFJlcXVlc3RMb2dTdGVwU3Vic2V0STtcbn07XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXkgPSB6LmVudW0oW1wiQVwiLCBcIlRcIiwgXCJJXCJdKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXk+O1xuXG4vLyBTdWJzZXRzOiBUb2tlblxuZXhwb3J0IGNvbnN0IFRva2VuU3Vic2V0QSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouaW50KCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLFxuICBwcm92aWRlcjogei5zdHJpbmcoKS5tYXgoMjApLFxuICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgYWN0aXZlOiB6LmJvb2xlYW4oKSxcbiAgb3JkOiB6LmludCgpLFxuICBxdW90YV90aHJlc2hvbGQ6IHouaW50KCkubnVsbGFibGUoKSxcbiAgd2VpZ2h0OiB6LmludCgpLFxufSk7XG5leHBvcnQgdHlwZSBUb2tlblN1YnNldEEgPSB6LmluZmVyPHR5cGVvZiBUb2tlblN1YnNldEE+O1xuZXhwb3J0IHR5cGUgVG9rZW5TdWJzZXRNYXBwaW5nID0ge1xuICBBOiBUb2tlblN1YnNldEE7XG59O1xuZXhwb3J0IGNvbnN0IFRva2VuU3Vic2V0S2V5ID0gei5lbnVtKFtcIkFcIl0pO1xuZXhwb3J0IHR5cGUgVG9rZW5TdWJzZXRLZXkgPSB6LmluZmVyPHR5cGVvZiBUb2tlblN1YnNldEtleT47XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFXQSxNQUFNLGVBQWUsRUFBRSxNQUNyQixFQUFFLE9BQU87Q0FDUCxNQUFNLEVBQUUsT0FBTztDQUNmLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQy9CLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQzlCLENBQUMsQ0FDSDtBQUlBLE1BQU0sbUJBQW1CLEVBQUUsTUFBTSxDQUMvQixFQUFFLE9BQU87Q0FDUCxhQUFhLEVBQUUsT0FBTztDQUN0QixjQUFjLEVBQUUsT0FBTztDQUN2QixXQUFXLEVBQUUsT0FBTztDQUNwQixhQUFhLEVBQUUsT0FBTztBQUN4QixDQUFDLEdBQ0QsRUFBRSxPQUFPO0NBQ1AsYUFBYSxFQUFFLE9BQU87Q0FDdEIsY0FBYyxFQUFFLE9B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
406
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmdlbmVyYXRlZC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbi8qIG94bGludC1kaXNhYmxlICovXG5cbmltcG9ydCB7IHpBcnJheWFibGUsIFNvbmFtdVF1ZXJ5TW9kZSwgQXBwbHlTb25hbXVGaWx0ZXIgfSBmcm9tIFwic29uYW11XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG4vLyBDdXN0b21TY2FsYXI6IEhpc3RvcnlJdGVtc1xuY29uc3QgSGlzdG9yeUl0ZW1zID0gei5hcnJheShcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHouc3RyaW5nKCksXG4gICAgcm9sZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNvbnRlbnQ6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG4gICAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFyZ3VtZW50czogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNhbGxfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvdXRwdXQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgfSksXG4pO1xudHlwZSBIaXN0b3J5SXRlbXMgPSB6LmluZmVyPHR5cGVvZiBIaXN0b3J5SXRlbXM+O1xuXG4vLyBDdXN0b21TY2FsYXI6IFRva2VuQ3JlZGVudGlhbHNcbmNvbnN0IFRva2VuQ3JlZGVudGlhbHMgPSB6LnVuaW9uKFtcbiAgei5vYmplY3Qoe1xuICAgIGFjY2Vzc1Rva2VuOiB6LnN0cmluZygpLFxuICAgIHJlZnJlc2hUb2tlbjogei5zdHJpbmcoKSxcbiAgICBleHBpcmVzQXQ6IHoubnVtYmVyKCksXG4gICAgYWNjb3VudFV1aWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgYWNjZXNzVG9rZW46IHouc3RyaW5nKCksXG4gICAgcmVmcmVzaFRva2VuOiB6LnN0cmluZygpLFxuICAgIGlkVG9rZW46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogei5udW1iZXIoKSxcbiAgICBpZFRva2VuRXhwaXJlc0F0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgYWNjb3VudElkOiB6LnN0cmluZygpLFxuICAgIHBsYW5UeXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuXSk7XG50eXBlIFRva2VuQ3JlZGVudGlhbHMgPSB6LmluZmVyPHR5cGVvZiBUb2tlbkNyZWRlbnRpYWxzPjtcblxuLy8gQ3VzdG9tU2NhbGFyOiBUb29sRGVmaW5pdGlvbnNcbmNvbnN0IFRvb2xEZWZpbml0aW9ucyA9IHouYXJyYXkoXG4gIHoub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5wdXRTY2hlbWE6IHoudW5rbm93bigpLFxuICB9KSxcbik7XG50eXBlIFRvb2xEZWZpbml0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFRvb2xEZWZpbml0aW9ucz47XG5cbi8vIEVudW1zOiBSZXF1ZXN0TG9nXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ09yZGVyQnkgPSB6XG4gIC5lbnVtKFtcbiAgICBcImlkLWRlc2NcIixcbiAgICBcImlkLWFzY1wiLFxuICAgIFwiY3JlYXRlZF9hdC1kZXNjXCIsXG4gICAgXCJjcmVhdGVkX2F0LWFzY1wiLFxuICAgIFwidHRmdF9tcy1kZXNjXCIsXG4gICAgXCJ0dGZ0X21zLWFzY1wiLFxuICAgIFwiZHVyYXRpb25fbXMtZGVzY1wiLFxuICAgIFwiZHVyYXRpb25fbXMtYXNjXCIsXG4gICAgXCJpbnB1dF90b2tlbnMtZGVzY1wiLFxuICAgIFwiaW5wdXRfdG9rZW5zLWFzY1wiLFxuICAgIFwib3V0cHV0X3Rva2Vucy1kZXNjXCIsXG4gICAgXCJvdXRwdXRfdG9rZW5zLWFzY1wiLFxuICAgIFwiY2FjaGVfcmVhZF90b2tlbnMtZGVzY1wiLFxuICAgIFwiY2FjaGVfcmVhZF90b2tlbnMtYXNjXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zLWFzY1wiLFxuICAgIFwiY29zdF91c2QtZGVzY1wiLFxuICAgIFwiY29zdF91c2QtYXNjXCIsXG4gIF0pXG4gIC5kZXNjcmliZShcIlJlcXVlc3RMb2dPcmRlckJ5XCIpO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ09yZGVyQnkgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nT3JkZXJCeT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ09yZGVyQnlMYWJlbCA9IHtcbiAgXCJpZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIixcbiAgXCJpZC1hc2NcIjogXCJJROyYpOuemOuQnOyInFwiLFxuICBcImNyZWF0ZWRfYXQtZGVzY1wiOiBcIuuTseuhneydvOyLnOy1nOyLoOyInFwiLFxuICBcImNyZWF0ZWRfYXQtYXNjXCI6IFwi65Ox66Gd7J287Iuc7Jik656Y65Cc7IicXCIsXG4gIFwidHRmdF9tcy1kZXNjXCI6IFwiVFRGVOq4tOyInFwiLFxuICBcInR0ZnRfbXMtYXNjXCI6IFwiVFRGVOynp+ydgOyInFwiLFxuICBcImR1cmF0aW9uX21zLWRlc2NcIjogXCLshozsmpTsi5zqsITquLTsiJxcIixcbiAgXCJkdXJhdGlvbl9tcy1hc2NcIjogXCLshozsmpTsi5zqsITsp6fsnYDsiJxcIixcbiAgXCJpbnB1dF90b2tlbnMtZGVzY1wiOiBcIuyeheugpe2GoO2BsOunjuydgOyInFwiLFxuICBcImlucHV0X3Rva2Vucy1hc2NcIjogXCLsnoXroKXthqDtgbDsoIHsnYDsiJxcIixcbiAgXCJvdXRwdXRfdG9rZW5zLWRlc2NcIjogXCLstpzroKXthqDtgbDrp47snYDsiJxcIixcbiAgXCJvdXRwdXRfdG9rZW5zLWFzY1wiOiBcIuy2nOugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImNhY2hlX3JlYWRfdG9rZW5zLWRlc2NcIjogXCLsupDsi5zsnb3quLDrp47snYDsiJxcIixcbiAgXCJjYWNoZV9yZWFkX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsnb3quLDsoIHsnYDsiJxcIixcbiAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOyDneyEseunjuydgOyInFwiLFxuICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsg53shLHsoIHsnYDsiJxcIixcbiAgXCJjb3N0X3VzZC1kZXNjXCI6IFwi67mE7Jqp64aS7J2A7IicXCIsXG4gIFwiY29zdF91c2QtYXNjXCI6IFwi67mE7Jqp64Ku7J2A7IicXCIsXG59O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTZWFyY2hGaWVsZCA9IHpcbiAgLmVudW0oW1wiaWRcIiwgXCJ0b2tlbl9uYW1lXCIsIFwidXNlcl9wcm9tcHRcIl0pXG4gIC5kZXNjcmliZShcIlJlcXVlc3RMb2dTZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTZWFyY2hGaWVsZCA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTZWFyY2hGaWVsZD47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1NlYXJjaEZpZWxkTGFiZWwgPSB7XG4gIGlkOiBcIklEXCIsXG4gIHRva2VuX25hbWU6IFwi7Yag7YGw7J2066aEXCIsXG4gIHVzZXJfcHJvbXB0OiBcIuyCrOyaqeyekCDtlITroaztlITtirhcIixcbn07XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0YXR1cyA9IHpcbiAgLmVudW0oW1wicnVubmluZ1wiLCBcInN1Y2NlZWRlZFwiLCBcImVycm9yXCIsIFwiYWJvcnRlZFwiXSlcbiAgLmRlc2NyaWJlKFwiUmVxdWVzdExvZ1N0YXR1c1wiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGF0dXMgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3RhdHVzPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RhdHVzTGFiZWwgPSB7XG4gIHJ1bm5pbmc6IFwi7Iuk7ZaJIOykkVwiLFxuICBzdWNjZWVkZWQ6IFwi7ISx6rO1XCIsXG4gIGVycm9yOiBcIuyXkOufrFwiLFxuICBhYm9ydGVkOiBcIuykkeuLqFwiLFxufTtcblxuLy8gRW51bXM6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBUeXBlID0gei5lbnVtKFtcImdlbmVyYXRlXCIsIFwidG9vbF9jYWxsXCJdKS5kZXNjcmliZShcIlJlcXVlc3RMb2dTdGVwVHlwZVwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwVHlwZSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwVHlwZT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBUeXBlTGFiZWwgPSB7IGdlbmVyYXRlOiBcIkxMTSDsg53shLFcIiwgdG9vbF9jYWxsOiBcIlRvb2wg7Zi47LacXCIgfTtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcE9yZGVyQnkgPSB6LmVudW0oW1wiaWQtYXNjXCJdKS5kZXNjcmliZShcIlJlcXVlc3RMb2dTdGVwT3JkZXJCeVwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwT3JkZXJCeSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwT3JkZXJCeT47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBPcmRlckJ5TGFiZWwgPSB7IFwiaWQtYXNjXCI6IFwiSUTsiJxcIiB9O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdGVwU2VhcmNoRmllbGQgPSB6LmVudW0oW1wiaWRcIl0pLmRlc2NyaWJlKFwiUmVxdWVzdExvZ1N0ZXBTZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU2VhcmNoRmllbGQgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkTGFiZWwgPSB7IGlkOiBcIklEXCIgfTtcblxuLy8gRW51bXM6IFNldHRpbmdcbmV4cG9ydCBjb25zdCBTZXR0aW5nT3JkZXJCeSA9IHouZW51bShbXCJrZXktYXNjXCJdKS5kZXNjcmliZShcIlNldHRpbmdPcmRlckJ5XCIpO1xuZXhwb3J0IHR5cGUgU2V0dGluZ09yZGVyQnkgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nT3JkZXJCeT47XG5leHBvcnQgY29uc3QgU2V0dGluZ09yZGVyQnlMYWJlbCA9IHsgXCJrZXktYXNjXCI6IFwi7YKk7IicXCIgfTtcbmV4cG9ydCBjb25zdCBTZXR0aW5nU2VhcmNoRmllbGQgPSB6LmVudW0oW1wia2V5XCJdKS5kZXNjcmliZShcIlNldHRpbmdTZWFyY2hGaWVsZFwiKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdTZWFyY2hGaWVsZCA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdTZWFyY2hGaWVsZD47XG5leHBvcnQgY29uc3QgU2V0dGluZ1NlYXJjaEZpZWxkTGFiZWwgPSB7IGtleTogXCLtgqRcIiB9O1xuXG4vLyBFbnVtczogVG9rZW5cbmV4cG9ydCBjb25zdCBUb2tlbk9yZGVyQnkgPSB6LmVudW0oW1wiaWQtZGVzY1wiLCBcIm9yZC1hc2NcIl0pLmRlc2NyaWJlKFwiVG9rZW5PcmRlckJ5XCIpO1xuZXhwb3J0IHR5cGUgVG9rZW5PcmRlckJ5ID0gei5pbmZlcjx0eXBlb2YgVG9rZW5PcmRlckJ5PjtcbmV4cG9ydCBjb25zdCBUb2tlbk9yZGVyQnlMYWJlbCA9IHsgXCJpZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIiwgXCJvcmQtYXNjXCI6IFwi7Iic7ISc7IicXCIgfTtcbmV4cG9ydCBjb25zdCBUb2tlblNlYXJjaEZpZWxkID0gei5lbnVtKFtcImlkXCIsIFwibmFtZVwiXSkuZGVzY3JpYmUoXCJUb2tlblNlYXJjaEZpZWxkXCIpO1xuZXhwb3J0IHR5cGUgVG9rZW5TZWFyY2hGaWVsZCA9IHouaW5mZXI8dHlwZW9mIFRva2VuU2VhcmNoRmllbGQ+O1xuZXhwb3J0IGNvbnN0IFRva2VuU2VhcmNoRmllbGRMYWJlbCA9IHsgaWQ6IFwiSURcIiwgbmFtZTogXCLsnbTrpoRcIiB9O1xuXG4vLyBCYXNlU2NoZW1hOiBSZXF1ZXN0TG9nXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ0Jhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBwcm9qZWN0X25hbWU6IHouc3RyaW5nKCkubWF4KDUwKS5udWxsYWJsZSgpLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGZhbGxiYWNrX2NvdW50OiB6LmludCgpLm51bGxhYmxlKCksXG4gIHVzZXJfcHJvbXB0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHN5c3RlbV9wcm9tcHQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgcmVzcG9uc2U6IHouc3RyaW5nKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfcmVhZF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBkdXJhdGlvbl9tczogei5pbnQoKSxcbiAgdHRmdF9tczogei5pbnQoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbWFnZV9jb3N0X21ldGhvZDogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICBlZmZvcnQ6IHouc3RyaW5nKCkubWF4KDEwKS5udWxsYWJsZSgpLFxuICBoaXN0b3J5OiBIaXN0b3J5SXRlbXMubnVsbGFibGUoKSxcbiAgdG9vbHM6IFRvb2xEZWZpbml0aW9ucy5udWxsYWJsZSgpLFxuICBzdGF0dXM6IFJlcXVlc3RMb2dTdGF0dXMsXG4gIGVycm9yX21lc3NhZ2U6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2NvdW50OiB6LmludCgpLFxuICBpc19pbWFnZV9nZW5lcmF0aW9uOiB6LmJvb2xlYW4oKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ0Jhc2VTY2hlbWEgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nQmFzZVNjaGVtYT4gJiB7XG4gIHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbXG4gICAgXCJjcmVhdGVkX2F0XCIsXG4gICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgXCJwcm9qZWN0X25hbWVcIixcbiAgICBcIm1vZGVsX25hbWVcIixcbiAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgXCJmYWxsYmFja19jb3VudFwiLFxuICAgIFwidXNlcl9wcm9tcHRcIixcbiAgICBcInN5c3RlbV9wcm9tcHRcIixcbiAgICBcInJlc3BvbnNlXCIsXG4gICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgXCJkdXJhdGlvbl9tc1wiLFxuICAgIFwidHRmdF9tc1wiLFxuICAgIFwiY29zdF91c2RcIixcbiAgICBcImNvc3Rfc291cmNlXCIsXG4gICAgXCJpbWFnZV9jb3N0X3VzZFwiLFxuICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICBcImVmZm9ydFwiLFxuICAgIFwiaGlzdG9yeVwiLFxuICAgIFwidG9vbHNcIixcbiAgICBcInN0YXR1c1wiLFxuICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgIFwidG9vbF9jYWxsX2NvdW50XCIsXG4gICAgXCJpc19pbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgXCJpZFwiLFxuICBdO1xufTtcblxuLy8gQmFzZVNjaGVtYTogUmVxdWVzdExvZ1N0ZXBcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcEJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgcmVxdWVzdF9sb2dfaWQ6IHouaW50KCksXG4gIHN0ZXBfaW5kZXg6IHouaW50KCksXG4gIHR5cGU6IFJlcXVlc3RMb2dTdGVwVHlwZSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBmYWxsYmFja19jb3VudDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9yZWFkX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3NvdXJjZTogei5zdHJpbmcoKS5tYXgoMjApLm51bGxhYmxlKCksXG4gIGR1cmF0aW9uX21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIHR0ZnRfbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZmluaXNoX3JlYXNvbjogei5zdHJpbmcoKS5tYXgoMjApLm51bGxhYmxlKCksXG4gIHJlYXNvbmluZ190ZXh0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHJlYXNvbmluZ190b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2luZGV4OiB6LmludCgpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9pZDogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICB0b29sX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgdG9vbF9hcmdzOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfcmVzdWx0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfZHVyYXRpb25fbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZXJyb3I6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N0ZXBCYXNlU2NoZW1hID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBCYXNlU2NoZW1hPiAmIHtcbiAgcmVhZG9ubHkgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IFtcbiAgICBcImNyZWF0ZWRfYXRcIixcbiAgICBcIm1vZGVsX25hbWVcIixcbiAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgXCJmYWxsYmFja19jb3VudFwiLFxuICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICBcImNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgIFwiY29zdF91c2RcIixcbiAgICBcImNvc3Rfc291cmNlXCIsXG4gICAgXCJkdXJhdGlvbl9tc1wiLFxuICAgIFwidHRmdF9tc1wiLFxuICAgIFwiZmluaXNoX3JlYXNvblwiLFxuICAgIFwicmVhc29uaW5nX3RleHRcIixcbiAgICBcInJlYXNvbmluZ190b2tlbnNcIixcbiAgICBcInRvb2xfY2FsbF9pbmRleFwiLFxuICAgIFwidG9vbF9jYWxsX2lkXCIsXG4gICAgXCJ0b29sX25hbWVcIixcbiAgICBcInRvb2xfYXJnc1wiLFxuICAgIFwidG9vbF9yZXN1bHRcIixcbiAgICBcInRvb2xfZHVyYXRpb25fbXNcIixcbiAgICBcImVycm9yXCIsXG4gICAgXCJpZFwiLFxuICBdO1xufTtcblxuLy8gQmFzZVNjaGVtYTogU2V0dGluZ1xuZXhwb3J0IGNvbnN0IFNldHRpbmdCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIGtleTogei5zdHJpbmcoKS5tYXgoMTAwKSxcbiAgdmFsdWU6IHouc3RyaW5nKCksXG4gIHVwZGF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFNldHRpbmdCYXNlU2NoZW1hID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ0Jhc2VTY2hlbWE+ICYge1xuICByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgW1wiY3JlYXRlZF9hdFwiLCBcInVwZGF0ZWRfYXRcIiwgXCJpZFwiXTtcbn07XG5cbi8vIEJhc2VTY2hlbWE6IFRva2VuXG5leHBvcnQgY29uc3QgVG9rZW5CYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLm1heCgyMCksXG4gIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICBuYW1lOiB6LnN0cmluZygpLFxuICBhY3RpdmU6IHouYm9vbGVhbigpLFxuICBvcmQ6IHouaW50KCksXG4gIHF1b3RhX3RocmVzaG9sZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB3ZWlnaHQ6IHouaW50KCksXG59KTtcbmV4cG9ydCB0eXBlIFRva2VuQmFzZVNjaGVtYSA9IHouaW5mZXI8dHlwZW9mIFRva2VuQmFzZVNjaGVtYT4gJiB7XG4gIHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbXG4gICAgXCJjcmVhdGVkX2F0XCIsXG4gICAgXCJhY3RpdmVcIixcbiAgICBcIm9yZFwiLFxuICAgIFwicXVvdGFfdGhyZXNob2xkXCIsXG4gICAgXCJ3ZWlnaHRcIixcbiAgICBcImlkXCIsXG4gIF07XG59O1xuXG4vLyBCYXNlTGlzdFBhcmFtczogUmVxdWVzdExvZ1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dCYXNlTGlzdFBhcmFtcyA9IHpcbiAgLm9iamVjdCh7XG4gICAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgcGFnZTogei5udW1iZXIoKS5pbnQoKS5taW4oMSksXG4gICAgc2VhcmNoOiBSZXF1ZXN0TG9nU2VhcmNoRmllbGQsXG4gICAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgICBvcmRlckJ5OiBSZXF1ZXN0TG9nT3JkZXJCeSxcbiAgICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgICBpZDogekFycmF5YWJsZSh6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCkpLFxuICAgIHNvbmFtdUZpbHRlcjogei5jdXN0b208QXBwbHlTb25hbXVGaWx0ZXI8UmVxdWVzdExvZ0Jhc2VTY2hlbWEsIG5ldmVyLCBuZXZlcj4+KCksXG4gICAgdG9rZW5fbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICAgIHByb2plY3RfbmFtZTogei5zdHJpbmcoKS5tYXgoNTApLm51bGxhYmxlKCksXG4gICAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICB9KVxuICAucGFydGlhbCgpO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zPjtcblxuLy8gQmFzZUxpc3RQYXJhbXM6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBCYXNlTGlzdFBhcmFtcyA9IHpcbiAgLm9iamVjdCh7XG4gICAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgcGFnZTogei5udW1iZXIoKS5pbnQoKS5taW4oMSksXG4gICAgc2VhcmNoOiBSZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkLFxuICAgIGtleXdvcmQ6IHouc3RyaW5nKCksXG4gICAgb3JkZXJCeTogUmVxdWVzdExvZ1N0ZXBPcmRlckJ5LFxuICAgIHF1ZXJ5TW9kZTogU29uYW11UXVlcnlNb2RlLFxuICAgIGlkOiB6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSksXG4gICAgc29uYW11RmlsdGVyOiB6LmN1c3RvbTxBcHBseVNvbmFtdUZpbHRlcjxSZXF1ZXN0TG9nU3RlcEJhc2VTY2hlbWEsIG5ldmVyLCBuZXZlcj4+KCksXG4gICAgcmVxdWVzdF9sb2dfaWQ6IHouaW50KCksXG4gIH0pXG4gIC5wYXJ0aWFsKCk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3RlcEJhc2VMaXN0UGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBCYXNlTGlzdFBhcmFtcz47XG5cbi8vIEJhc2VMaXN0UGFyYW1zOiBTZXR0aW5nXG5leHBvcnQgY29uc3QgU2V0dGluZ0Jhc2VMaXN0UGFyYW1zID0gelxuICAub2JqZWN0KHtcbiAgICBudW06IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKSxcbiAgICBwYWdlOiB6Lm51bWJlcigpLmludCgpLm1pbigxKSxcbiAgICBzZWFyY2g6IFNldHRpbmdTZWFyY2hGaWVsZCxcbiAgICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICAgIG9yZGVyQnk6IFNldHRpbmdPcmRlckJ5LFxuICAgIHF1ZXJ5TW9kZTogU29uYW11UXVlcnlNb2RlLFxuICAgIGlkOiB6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSksXG4gICAgc29uYW11RmlsdGVyOiB6LmN1c3RvbTxBcHBseVNvbmFtdUZpbHRlcjxTZXR0aW5nQmFzZVNjaGVtYSwgbmV2ZXIsIG5ldmVyPj4oKSxcbiAgICBrZXk6IHouc3RyaW5nKCkubWF4KDEwMCksXG4gIH0pXG4gIC5wYXJ0aWFsKCk7XG5leHBvcnQgdHlwZSBTZXR0aW5nQmFzZUxpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nQmFzZUxpc3RQYXJhbXM+O1xuXG4vLyBCYXNlTGlzdFBhcmFtczogVG9rZW5cbmV4cG9ydCBjb25zdCBUb2tlbkJhc2VMaXN0UGFyYW1zID0gelxuICAub2JqZWN0KHtcbiAgICBudW06IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKSxcbiAgICBwYWdlOiB6Lm51bWJlcigpLmludCgpLm1pbigxKSxcbiAgICBzZWFyY2g6IFRva2VuU2VhcmNoRmllbGQsXG4gICAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgICBvcmRlckJ5OiBUb2tlbk9yZGVyQnksXG4gICAgcXVlcnlNb2RlOiBTb25hbXVRdWVyeU1vZGUsXG4gICAgaWQ6IHpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKSxcbiAgICBzb25hbXVGaWx0ZXI6IHouY3VzdG9tPEFwcGx5U29uYW11RmlsdGVyPFRva2VuQmFzZVNjaGVtYSwgbmV2ZXIsIG5ldmVyPj4oKSxcbiAgfSlcbiAgLnBhcnRpYWwoKTtcbmV4cG9ydCB0eXBlIFRva2VuQmFzZUxpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBUb2tlbkJhc2VMaXN0UGFyYW1zPjtcblxuLy8gU3Vic2V0czogUmVxdWVzdExvZ1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdWJzZXRBID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHRva2VuX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgcHJvamVjdF9uYW1lOiB6LnN0cmluZygpLm1heCg1MCkubnVsbGFibGUoKSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBmYWxsYmFja19jb3VudDogei5pbnQoKS5udWxsYWJsZSgpLFxuICB1c2VyX3Byb21wdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBzeXN0ZW1fcHJvbXB0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHJlc3BvbnNlOiB6LnN0cmluZygpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZHVyYXRpb25fbXM6IHouaW50KCksXG4gIHR0ZnRfbXM6IHouaW50KCksXG4gIGNvc3RfdXNkOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3Rfc291cmNlOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF9tZXRob2Q6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgZWZmb3J0OiB6LnN0cmluZygpLm1heCgxMCkubnVsbGFibGUoKSxcbiAgaGlzdG9yeTogSGlzdG9yeUl0ZW1zLm51bGxhYmxlKCksXG4gIHRvb2xzOiBUb29sRGVmaW5pdGlvbnMubnVsbGFibGUoKSxcbiAgc3RhdHVzOiBSZXF1ZXN0TG9nU3RhdHVzLFxuICBlcnJvcl9tZXNzYWdlOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9jb3VudDogei5pbnQoKSxcbiAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRBID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N1YnNldEE+O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdWJzZXRQID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHRva2VuX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgcHJvamVjdF9uYW1lOiB6LnN0cmluZygpLm1heCg1MCkubnVsbGFibGUoKSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBmYWxsYmFja19jb3VudDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZHVyYXRpb25fbXM6IHouaW50KCksXG4gIHR0ZnRfbXM6IHouaW50KCksXG4gIGNvc3RfdXNkOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3Rfc291cmNlOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgaW1hZ2VfY29zdF9tZXRob2Q6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgZWZmb3J0OiB6LnN0cmluZygpLm1heCgxMCkubnVsbGFibGUoKSxcbiAgc3RhdHVzOiBSZXF1ZXN0TG9nU3RhdHVzLFxuICB0b29sX2NhbGxfY291bnQ6IHouaW50KCksXG4gIGlzX2ltYWdlX2dlbmVyYXRpb246IHouYm9vbGVhbigpLFxufSk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0UCA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdWJzZXRQPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3Vic2V0QyA9IHoub2JqZWN0KHtcbiAgaWQ6IHouaW50KCksXG4gIHRva2VuX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCksXG4gIG91dHB1dF90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCksXG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF91c2Q6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY29zdF9zb3VyY2U6IHouc3RyaW5nKCkubWF4KDIwKS5udWxsYWJsZSgpLFxufSk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0QyA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdWJzZXRDPjtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nID0ge1xuICBBOiBSZXF1ZXN0TG9nU3Vic2V0QTtcbiAgUDogUmVxdWVzdExvZ1N1YnNldFA7XG4gIEM6IFJlcXVlc3RMb2dTdWJzZXRDO1xufTtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3Vic2V0S2V5ID0gei5lbnVtKFtcIkFcIiwgXCJQXCIsIFwiQ1wiXSk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N1YnNldEtleT47XG5cbi8vIFN1YnNldHM6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBTdWJzZXRBID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIHN0ZXBfaW5kZXg6IHouaW50KCksXG4gIHR5cGU6IFJlcXVlc3RMb2dTdGVwVHlwZSxcbiAgbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogei5zdHJpbmcoKS5tYXgoMjU1KS5udWxsYWJsZSgpLFxuICBmYWxsYmFja19jb3VudDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBpbnB1dF90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgb3V0cHV0X3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9yZWFkX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3VzZDogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjb3N0X3NvdXJjZTogei5zdHJpbmcoKS5tYXgoMjApLm51bGxhYmxlKCksXG4gIGR1cmF0aW9uX21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIHR0ZnRfbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZmluaXNoX3JlYXNvbjogei5zdHJpbmcoKS5tYXgoMjApLm51bGxhYmxlKCksXG4gIHJlYXNvbmluZ190ZXh0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHJlYXNvbmluZ190b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2luZGV4OiB6LmludCgpLm51bGxhYmxlKCksXG4gIHRvb2xfY2FsbF9pZDogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICB0b29sX25hbWU6IHouc3RyaW5nKCkubWF4KDEwMCkubnVsbGFibGUoKSxcbiAgdG9vbF9hcmdzOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfcmVzdWx0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRvb2xfZHVyYXRpb25fbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgZXJyb3I6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N0ZXBTdWJzZXRBID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1N0ZXBTdWJzZXRBPjtcbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nU3RlcFN1YnNldFQgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LmludCgpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKSxcbiAgc3RlcF9pbmRleDogei5pbnQoKSxcbiAgdHlwZTogUmVxdWVzdExvZ1N0ZXBUeXBlLFxuICBtb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB6LnN0cmluZygpLm1heCgyNTUpLm51bGxhYmxlKCksXG4gIGZhbGxiYWNrX2NvdW50OiB6LmludCgpLm51bGxhYmxlKCksXG4gIGlucHV0X3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBvdXRwdXRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3RfdXNkOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGNvc3Rfc291cmNlOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgZHVyYXRpb25fbXM6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdHRmdF9tczogei5pbnQoKS5udWxsYWJsZSgpLFxuICBmaW5pc2hfcmVhc29uOiB6LnN0cmluZygpLm1heCgyMCkubnVsbGFibGUoKSxcbiAgcmVhc29uaW5nX3Rva2Vuczogei5pbnQoKS5udWxsYWJsZSgpLFxuICB0b29sX2NhbGxfaW5kZXg6IHouaW50KCkubnVsbGFibGUoKSxcbiAgdG9vbF9jYWxsX2lkOiB6LnN0cmluZygpLm1heCgxMDApLm51bGxhYmxlKCksXG4gIHRvb2xfbmFtZTogei5zdHJpbmcoKS5tYXgoMTAwKS5udWxsYWJsZSgpLFxuICB0b29sX2R1cmF0aW9uX21zOiB6LmludCgpLm51bGxhYmxlKCksXG4gIGVycm9yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0VCA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwU3Vic2V0VD47XG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1N0ZXBTdWJzZXRJID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgdG9vbF9hcmdzOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0SSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwU3Vic2V0ST47XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3RlcFN1YnNldE1hcHBpbmcgPSB7XG4gIEE6IFJlcXVlc3RMb2dTdGVwU3Vic2V0QTtcbiAgVDogUmVxdWVzdExvZ1N0ZXBTdWJzZXRUO1xuICBJOiBSZXF1ZXN0TG9nU3RlcFN1YnNldEk7XG59O1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5ID0gei5lbnVtKFtcIkFcIiwgXCJUXCIsIFwiSVwiXSk7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleSA9IHouaW5mZXI8dHlwZW9mIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5PjtcblxuLy8gU3Vic2V0czogU2V0dGluZ1xuZXhwb3J0IGNvbnN0IFNldHRpbmdTdWJzZXRBID0gei5vYmplY3Qoe1xuICBpZDogei5pbnQoKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCksXG4gIGtleTogei5zdHJpbmcoKS5tYXgoMTAwKSxcbiAgdmFsdWU6IHouc3RyaW5nKCksXG4gIHVwZGF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFNldHRpbmdTdWJzZXRBID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ1N1YnNldEE+O1xuZXhwb3J0IHR5cGUgU2V0dGluZ1N1YnNldE1hcHBpbmcgPSB7XG4gIEE6IFNldHRpbmdTdWJzZXRBO1xufTtcbmV4cG9ydCBjb25zdCBTZXR0aW5nU3Vic2V0S2V5ID0gei5lbnVtKFtcIkFcIl0pO1xuZXhwb3J0IHR5cGUgU2V0dGluZ1N1YnNldEtleSA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdTdWJzZXRLZXk+O1xuXG4vLyBTdWJzZXRzOiBUb2tlblxuZXhwb3J0IGNvbnN0IFRva2VuU3Vic2V0QSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouaW50KCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLFxuICBwcm92aWRlcjogei5zdHJpbmcoKS5tYXgoMjApLFxuICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgYWN0aXZlOiB6LmJvb2xlYW4oKSxcbiAgb3JkOiB6LmludCgpLFxuICBxdW90YV90aHJlc2hvbGQ6IHouaW50KCkubnVsbGFibGUoKSxcbiAgd2VpZ2h0OiB6LmludCgpLFxufSk7XG5leHBvcnQgdHlwZSBUb2tlblN1YnNldEEgPSB6LmluZmVyPHR5cGVvZiBUb2tlblN1YnNldEE+O1xuZXhwb3J0IHR5cGUgVG9rZW5TdWJzZXRNYXBwaW5nID0ge1xuICBBOiBUb2tlblN1YnNldEE7XG59O1xuZXhwb3J0IGNvbnN0IFRva2VuU3Vic2V0S2V5ID0gei5lbnVtKFtcIkFcIl0pO1xuZXhwb3J0IHR5cGUgVG9rZW5TdWJzZXRLZXkgPSB6LmluZmVyPHR5cGVvZiBUb2tlblN1YnNldEtleT47XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFXQSxNQUFNLGVBQWUsRUFBRSxNQUNyQixFQUFFLE9BQU87Q0FDUCxNQUFNLEVBQUUsT0FBTztDQUNmLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQy9CLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQzlCLENBQUMsQ0FDSDtBQUlBLE1BQU0sbUJBQW1CLEVBQUUsTUFBTSxDQUMvQixFQUFFLE9BQU87Q0FDUCxhQUFhLEVBQUUsT0FBTztDQUN0QixjQUFjLEVBQUUsT0FBTztDQUN2QixXQUFXLEVBQUUsT0FBTztDQUNwQixhQUFhLEVBQUUsT0FBTztBQUN4QixDQUFDLEdBQ0QsRUFBRSxPQUFPO0NBQ1AsYUFBYSxFQUFFLE9BQU87Q0FDdEIsY0FBYyxFQUFFLE9BQU87Q0FDdkIsU0FB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