sonamu 0.7.53 → 0.8.0

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 (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
@@ -1 +1 @@
1
- {"version":3,"file":"view_search_input.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_search_input.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAIzC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAkEhE"}
1
+ {"version":3,"file":"view_search_input.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_search_input.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,2BAA4B,SAAQ,QAAQ;;IAKvD,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAIzC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC;;;;;;CAsEhE"}
@@ -20,37 +20,32 @@ export class Template__view_search_input extends Template {
20
20
  return {
21
21
  ...this.getTargetAndPath(names),
22
22
  body: `
23
- import { Button, Input } from "@sonamu-kit/react-components/components";
23
+ import { Button, EnumSelect, Input } from "@sonamu-kit/react-components/components";
24
+ import { useSonamuBaseContext } from "@sonamu-kit/react-components/contexts";
24
25
  import type React from "react";
25
26
  import { useState } from "react";
26
- import { ${names.capital}SearchFieldSelect } from "@/components/${names.fs}/${names.capital}SearchFieldSelect";
27
+ import { ${names.capital}SearchField, ${names.capital}SearchFieldLabel } from "@/services/sonamu.generated";
27
28
  import SearchIcon from "~icons/lucide/search";
28
29
  import { SD } from "@/i18n/sd.generated";
29
30
  export type ${names.capital}SearchInputProps = {
30
31
  input: {
31
32
  value?: string;
32
- onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
33
+ onValueChange?: (value: string | null | undefined) => void;
33
34
  };
34
35
  dropdown: {
35
36
  value?: string;
36
- onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;
37
+ onValueChange?: (value: string | null | undefined) => void;
37
38
  };
38
39
  };
39
40
 
40
41
  export function ${names.capital}SearchInput({
41
- input: { value: inputValue, onChange: inputOnChange },
42
+ input: { value: inputValue, onValueChange: inputOnValueChange },
42
43
  dropdown: dropdownProps,
43
44
  }: ${names.capital}SearchInputProps) {
44
45
  const [keyword, setKeyword] = useState<string>(inputValue ?? "");
45
46
 
46
47
  const handleSearch = () => {
47
- if (inputOnChange) {
48
- const syntheticEvent = {
49
- target: { value: keyword },
50
- currentTarget: { value: keyword },
51
- } as React.ChangeEvent<HTMLInputElement>;
52
- inputOnChange(syntheticEvent);
53
- }
48
+ inputOnValueChange?.(keyword || undefined);
54
49
  };
55
50
 
56
51
  const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
@@ -61,7 +56,16 @@ export function ${names.capital}SearchInput({
61
56
 
62
57
  return (
63
58
  <div className="flex items-center gap-1">
64
- <${names.capital}SearchFieldSelect {...dropdownProps} />
59
+ <EnumSelect
60
+ enum={${names.capital}SearchField}
61
+ labels={${names.capital}SearchFieldLabel}
62
+ value={dropdownProps.value}
63
+ onValueChange={(value) => {
64
+ dropdownProps.onValueChange?.(value as string | null | undefined);
65
+ }}
66
+ placeholder={SD("common.search")}
67
+ className="w-[150px] h-8"
68
+ />
65
69
  <div className="relative flex items-center">
66
70
  <Input
67
71
  type="text"
@@ -82,4 +86,4 @@ export function ${names.capital}SearchInput({
82
86
  }
83
87
  }
84
88
 
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19zZWFyY2hfaW5wdXQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfc2VhcmNoX2lucHV0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvY29tcG9uZW50c1wiLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnN9LyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImNvbW1vbi5zZWFyY2hQbGFjZWhvbGRlclwiXTtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfc2VhcmNoX2lucHV0XCJdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgQnV0dG9uLCBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZFNlbGVjdCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkU2VsZWN0XCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS9zZWFyY2hcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIkAvaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmV4cG9ydCB0eXBlICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dFByb3BzID0ge1xuICBpbnB1dDoge1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIG9uQ2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkO1xuICB9O1xuICBkcm9wZG93bjoge1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIG9uQ2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxTZWxlY3RFbGVtZW50PikgPT4gdm9pZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXQoe1xuICBpbnB1dDogeyB2YWx1ZTogaW5wdXRWYWx1ZSwgb25DaGFuZ2U6IGlucHV0T25DaGFuZ2UgfSxcbiAgZHJvcGRvd246IGRyb3Bkb3duUHJvcHMsXG59OiAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXRQcm9wcykge1xuICBjb25zdCBba2V5d29yZCwgc2V0S2V5d29yZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGlucHV0VmFsdWUgPz8gXCJcIik7XG5cbiAgY29uc3QgaGFuZGxlU2VhcmNoID0gKCkgPT4ge1xuICAgIGlmIChpbnB1dE9uQ2hhbmdlKSB7XG4gICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IHtcbiAgICAgICAgdGFyZ2V0OiB7IHZhbHVlOiBrZXl3b3JkIH0sXG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IHsgdmFsdWU6IGtleXdvcmQgfSxcbiAgICAgIH0gYXMgUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD47XG4gICAgICBpbnB1dE9uQ2hhbmdlKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgIGhhbmRsZVNlYXJjaCgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgIDwke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRTZWxlY3Qgey4uLmRyb3Bkb3duUHJvcHN9IC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIil9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHctWzIwMHB4XSBwci04XCJcbiAgICAgICAgICB2YWx1ZT17a2V5d29yZH1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEtleXdvcmQoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgLz5cbiAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImdob3N0XCIgb25DbGljaz17aGFuZGxlU2VhcmNofSBpY29uPXs8U2VhcmNoSWNvbiAvPn0gLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzIiwiY2FwaXRhbCIsImdldFJlcXVpcmVkRGljdEtleXMiLCJyZW5kZXIiLCJlbnRpdHlJZCIsImdldE5hbWVzRnJvbUlkIiwiYm9keSIsInRyaW0iLCJpbXBvcnRLZXlzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLFFBQWdDLGlDQUE4QjtBQUVwRixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFFdkMsT0FBTyxNQUFNQyxvQ0FBb0NEO0lBQy9DLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRSxpQkFBaUJDLEtBQXdCLEVBQUU7UUFDekMsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sR0FBR0YsTUFBTUcsRUFBRSxDQUFDLENBQUMsRUFBRUgsTUFBTUksT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUNyRDtJQUNGO0lBRVNDLHNCQUF1QztRQUM5QyxPQUFPO1lBQUM7U0FBMkI7SUFDckM7SUFFQSxNQUFNQyxPQUFPLEVBQUVDLFFBQVEsRUFBd0MsRUFBRTtRQUMvRCxNQUFNUCxRQUFRSixjQUFjWSxjQUFjLENBQUNEO1FBRTNDLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQ1IsZ0JBQWdCLENBQUNDLE1BQU07WUFDL0JTLE1BQU0sQ0FBQzs7OztTQUlKLEVBQUVULE1BQU1JLE9BQU8sQ0FBQyx1Q0FBdUMsRUFBRUosTUFBTUcsRUFBRSxDQUFDLENBQUMsRUFBRUgsTUFBTUksT0FBTyxDQUFDOzs7WUFHaEYsRUFBRUosTUFBTUksT0FBTyxDQUFDOzs7Ozs7Ozs7OztnQkFXWixFQUFFSixNQUFNSSxPQUFPLENBQUM7OztHQUc3QixFQUFFSixNQUFNSSxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXFCWixFQUFFSixNQUFNSSxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7OztNQWVqQixDQUFDLENBQUNNLElBQUk7WUFDTkMsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7QUFDRiJ9
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19zZWFyY2hfaW5wdXQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfc2VhcmNoX2lucHV0XCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvY29tcG9uZW50c1wiLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnN9LyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImNvbW1vbi5zZWFyY2hQbGFjZWhvbGRlclwiXTtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfc2VhcmNoX2lucHV0XCJdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgQnV0dG9uLCBFbnVtU2VsZWN0LCBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IHVzZVNvbmFtdUJhc2VDb250ZXh0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29udGV4dHNcIjtcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZCwgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkTGFiZWwgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS9zZWFyY2hcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIkAvaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmV4cG9ydCB0eXBlICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dFByb3BzID0ge1xuICBpbnB1dDoge1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIG9uVmFsdWVDaGFuZ2U/OiAodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIH07XG4gIGRyb3Bkb3duOiB7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgb25WYWx1ZUNoYW5nZT86ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiAke25hbWVzLmNhcGl0YWx9U2VhcmNoSW5wdXQoe1xuICBpbnB1dDogeyB2YWx1ZTogaW5wdXRWYWx1ZSwgb25WYWx1ZUNoYW5nZTogaW5wdXRPblZhbHVlQ2hhbmdlIH0sXG4gIGRyb3Bkb3duOiBkcm9wZG93blByb3BzLFxufTogJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0UHJvcHMpIHtcbiAgY29uc3QgW2tleXdvcmQsIHNldEtleXdvcmRdID0gdXNlU3RhdGU8c3RyaW5nPihpbnB1dFZhbHVlID8/IFwiXCIpO1xuXG4gIGNvbnN0IGhhbmRsZVNlYXJjaCA9ICgpID0+IHtcbiAgICBpbnB1dE9uVmFsdWVDaGFuZ2U/LihrZXl3b3JkIHx8IHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgIGhhbmRsZVNlYXJjaCgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgdmFsdWU9e2Ryb3Bkb3duUHJvcHMudmFsdWV9XG4gICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGRyb3Bkb3duUHJvcHMub25WYWx1ZUNoYW5nZT8uKHZhbHVlIGFzIHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpO1xuICAgICAgICB9fVxuICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoXCIpfVxuICAgICAgICBjbGFzc05hbWU9XCJ3LVsxNTBweF0gaC04XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIil9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHctWzIwMHB4XSBwci04XCJcbiAgICAgICAgICB2YWx1ZT17a2V5d29yZH1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEtleXdvcmQoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgLz5cbiAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cImdob3N0XCIgb25DbGljaz17aGFuZGxlU2VhcmNofSBpY29uPXs8U2VhcmNoSWNvbiAvPn0gLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzIiwiY2FwaXRhbCIsImdldFJlcXVpcmVkRGljdEtleXMiLCJyZW5kZXIiLCJlbnRpdHlJZCIsImdldE5hbWVzRnJvbUlkIiwiYm9keSIsInRyaW0iLCJpbXBvcnRLZXlzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxhQUFhLFFBQWdDLGlDQUE4QjtBQUVwRixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFFdkMsT0FBTyxNQUFNQyxvQ0FBb0NEO0lBQy9DLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRSxpQkFBaUJDLEtBQXdCLEVBQUU7UUFDekMsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sR0FBR0YsTUFBTUcsRUFBRSxDQUFDLENBQUMsRUFBRUgsTUFBTUksT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUNyRDtJQUNGO0lBRVNDLHNCQUF1QztRQUM5QyxPQUFPO1lBQUM7U0FBMkI7SUFDckM7SUFFQSxNQUFNQyxPQUFPLEVBQUVDLFFBQVEsRUFBd0MsRUFBRTtRQUMvRCxNQUFNUCxRQUFRSixjQUFjWSxjQUFjLENBQUNEO1FBRTNDLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQ1IsZ0JBQWdCLENBQUNDLE1BQU07WUFDL0JTLE1BQU0sQ0FBQzs7Ozs7U0FLSixFQUFFVCxNQUFNSSxPQUFPLENBQUMsYUFBYSxFQUFFSixNQUFNSSxPQUFPLENBQUM7OztZQUcxQyxFQUFFSixNQUFNSSxPQUFPLENBQUM7Ozs7Ozs7Ozs7O2dCQVdaLEVBQUVKLE1BQU1JLE9BQU8sQ0FBQzs7O0dBRzdCLEVBQUVKLE1BQU1JLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztjQWdCTCxFQUFFSixNQUFNSSxPQUFPLENBQUM7Z0JBQ2QsRUFBRUosTUFBTUksT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bc0IxQixDQUFDLENBQUNNLElBQUk7WUFDTkMsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7QUFDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EA2BnB,KAAK,aAAa,EAGnB,MAAM,gBAAgB,CAAC;AAcxB;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;CAWjB,CAAC;AAEX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAuB7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA6E3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAkGrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+FxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+GtD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAmFf"}
1
+ {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EA2BnB,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAcxB;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;CAWjB,CAAC;AAoEX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAuB7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAyF3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CAgHrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+FxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CA+GtD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAmFf"}
@@ -38,6 +38,64 @@ import { runtimePath } from "../utils/path-utils.js";
38
38
  schemaName: "SonamuFileArraySchema"
39
39
  }
40
40
  };
41
+ /**
42
+ * zodFormat을 Zod 4 코드 문자열로 변환합니다.
43
+ * Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
44
+ */ function zodFormatToCode(format) {
45
+ // ISO 포맷은 z.iso.xxx() 형태
46
+ const isoFormats = {
47
+ isoDate: "z.iso.date()",
48
+ isoTime: "z.iso.time()",
49
+ isoDatetime: "z.iso.datetime()",
50
+ isoDuration: "z.iso.duration()"
51
+ };
52
+ // hash 포맷은 z.hash("algorithm") 형태
53
+ const hashFormats = {
54
+ hashMd5: 'z.hash("md5")',
55
+ hashSha1: 'z.hash("sha1")',
56
+ hashSha256: 'z.hash("sha256")',
57
+ hashSha384: 'z.hash("sha384")',
58
+ hashSha512: 'z.hash("sha512")'
59
+ };
60
+ if (format in isoFormats) {
61
+ return isoFormats[format];
62
+ }
63
+ if (format in hashFormats) {
64
+ return hashFormats[format];
65
+ }
66
+ // 기본 포맷은 z.xxx() 형태 (Zod 4)
67
+ return `z.${format}()`;
68
+ }
69
+ /**
70
+ * zodFormat을 Zod 4 타입으로 변환합니다.
71
+ * Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
72
+ */ function zodFormatToType(format) {
73
+ // ISO 포맷은 z.iso.xxx() 형태
74
+ switch(format){
75
+ case "isoDate":
76
+ return z.iso.date();
77
+ case "isoTime":
78
+ return z.iso.time();
79
+ case "isoDatetime":
80
+ return z.iso.datetime();
81
+ case "isoDuration":
82
+ return z.iso.duration();
83
+ // hash 포맷은 z.hash("algorithm") 형태
84
+ case "hashMd5":
85
+ return z.hash("md5");
86
+ case "hashSha1":
87
+ return z.hash("sha1");
88
+ case "hashSha256":
89
+ return z.hash("sha256");
90
+ case "hashSha384":
91
+ return z.hash("sha384");
92
+ case "hashSha512":
93
+ return z.hash("sha512");
94
+ // 기본 포맷은 z.xxx() 형태 (Zod 4)
95
+ default:
96
+ return z[format]();
97
+ }
98
+ }
41
99
  /**
42
100
  * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
43
101
  * 내장 타입(BUILT_IN_TYPE_IDS)은 바로 반환하고,
@@ -79,17 +137,29 @@ import { runtimePath } from "../utils/path-utils.js";
79
137
  } else if (isEnumArrayProp(prop)) {
80
138
  zodType = (await getZodTypeById(prop.id)).array();
81
139
  } else if (isStringSingleProp(prop)) {
82
- if (prop.length) {
140
+ if (prop.zodFormat) {
141
+ zodType = zodFormatToType(prop.zodFormat);
142
+ if (prop.length && "max" in zodType) {
143
+ zodType = zodType.max(prop.length);
144
+ }
145
+ } else if (prop.length) {
83
146
  zodType = z.string().max(prop.length);
84
147
  } else {
85
148
  zodType = z.string();
86
149
  }
87
150
  } else if (isStringArrayProp(prop)) {
88
- if (prop.length) {
89
- zodType = z.string().max(prop.length).array();
151
+ let elementType;
152
+ if (prop.zodFormat) {
153
+ elementType = zodFormatToType(prop.zodFormat);
154
+ if (prop.length && "max" in elementType) {
155
+ elementType = elementType.max(prop.length);
156
+ }
157
+ } else if (prop.length) {
158
+ elementType = z.string().max(prop.length);
90
159
  } else {
91
- zodType = z.string().array();
160
+ elementType = z.string();
92
161
  }
162
+ zodType = elementType.array();
93
163
  } else if (isNumberSingleProp(prop)) {
94
164
  zodType = z.number();
95
165
  } else if (isNumberArrayProp(prop)) {
@@ -159,13 +229,27 @@ import { runtimePath } from "../utils/path-utils.js";
159
229
  stmt = `${prop.name}: ${prop.id}.array()`;
160
230
  injectImportKeys.push(prop.id);
161
231
  } else if (isStringSingleProp(prop)) {
162
- if (prop.length) {
232
+ if (prop.zodFormat) {
233
+ const base = zodFormatToCode(prop.zodFormat);
234
+ if (prop.length) {
235
+ stmt = `${prop.name}: ${base}.max(${prop.length})`;
236
+ } else {
237
+ stmt = `${prop.name}: ${base}`;
238
+ }
239
+ } else if (prop.length) {
163
240
  stmt = `${prop.name}: z.string().max(${prop.length})`;
164
241
  } else {
165
242
  stmt = `${prop.name}: z.string()`;
166
243
  }
167
244
  } else if (isStringArrayProp(prop)) {
168
- if (prop.length) {
245
+ if (prop.zodFormat) {
246
+ const base = zodFormatToCode(prop.zodFormat);
247
+ if (prop.length) {
248
+ stmt = `${prop.name}: ${base}.max(${prop.length}).array()`;
249
+ } else {
250
+ stmt = `${prop.name}: ${base}.array()`;
251
+ }
252
+ } else if (prop.length) {
169
253
  stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
170
254
  } else {
171
255
  stmt = `${prop.name}: z.string().array()`;
@@ -552,6 +636,10 @@ export function zodTypeToTsTypeDef(zt) {
552
636
  return "string-datetime";
553
637
  } else if (key.endsWith("date")) {
554
638
  return "string-date";
639
+ } else if (key === "id") {
640
+ return "string-id";
641
+ } else if (key.endsWith("_id")) {
642
+ return "string-fk_id";
555
643
  } else {
556
644
  return "string-plain";
557
645
  }
@@ -584,4 +672,4 @@ export function zodTypeToTsTypeDef(zt) {
584
672
  }
585
673
  }
586
674
 
587
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0Jvb2xlYW5BcnJheVByb3AsXG4gIGlzQm9vbGVhblNpbmdsZVByb3AsXG4gIGlzRGF0ZUFycmF5UHJvcCxcbiAgaXNEYXRlU2luZ2xlUHJvcCxcbiAgaXNFbnVtQXJyYXlQcm9wLFxuICBpc0VudW1TaW5nbGVQcm9wLFxuICBpc0ludGVnZXJBcnJheVByb3AsXG4gIGlzSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzTnVtYmVyQXJyYXlQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY0FycmF5UHJvcCxcbiAgaXNOdW1lcmljU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU3RyaW5nQXJyYXlQcm9wLFxuICBpc1N0cmluZ1NpbmdsZVByb3AsXG4gIGlzVHNWZWN0b3JQcm9wLFxuICBpc1V1aWRBcnJheVByb3AsXG4gIGlzVXVpZFNpbmdsZVByb3AsXG4gIGlzVmVjdG9yQXJyYXlQcm9wLFxuICBpc1ZlY3RvclNpbmdsZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgUmVuZGVyaW5nTm9kZSxcbiAgU29uYW11RmlsZUFycmF5U2NoZW1hLFxuICBTb25hbXVGaWxlU2NoZW1hLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kUmVjb3JkID0gei5ab2RSZWNvcmQ8ei5ab2RTdHJpbmcgfCB6LlpvZE51bWJlciB8IHouWm9kU3ltYm9sLCB6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPYmplY3QgPSB6LlpvZE9iamVjdDwkWm9kTG9vc2VTaGFwZT47XG50eXBlIEFueVpvZE51bGxhYmxlID0gei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2REZWZhdWx0ID0gei5ab2REZWZhdWx0PHouWm9kVHlwZT47XG50eXBlIEFueVpvZFVuaW9uID0gei5ab2RVbmlvbjx6LlpvZFR5cGVbXT47XG50eXBlIEFueVpvZEFycmF5ID0gei5ab2RBcnJheTx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RPcHRpb25hbCA9IHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVGVtcGxhdGVMaXRlcmFsID0gei5ab2RUZW1wbGF0ZUxpdGVyYWw8c3RyaW5nPjtcblxuLyoqXG4gKiDrgrTsnqUg7YOA7J6FIOygleydmCAoWm9kIOyKpO2CpOuniCArIFVJIOugjOuNlOungSDtg4DsnoUpXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9UWVBFUyA9IHtcbiAgU29uYW11RmlsZToge1xuICAgIHNjaGVtYTogU29uYW11RmlsZVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZVNjaGVtYVwiLFxuICB9LFxuICBcIlNvbmFtdUZpbGVbXVwiOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiLFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh6b2RUeXBlSWQpKSB7XG4gICAgY29uc3QgYnVpbHRJblR5cGUgPSBCVUlMVF9JTl9UWVBFU1t6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXTtcbiAgICBpZiAoIWJ1aWx0SW5UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuCtOyepSDtg4DsnoUgJHt6b2RUeXBlSWR97J2YIOyKpO2CpOuniOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdEluVHlwZS5zY2hlbWEuZGVzY3JpYmUoem9kVHlwZUlkKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6FIOuPmeyggSDroZzrk5xcbiAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aCh6b2RUeXBlSWQpO1xuICBjb25zdCBtb2R1bGVBYnNQYXRoID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpLmFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgLy8g64K07J6lIO2DgOyeheyduCDqsr3smrAg7Iqk7YKk66eIIOydtOumhOycvOuhnCDrs4DtmZhcbiAgICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wLmlkKSkge1xuICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IHByb3AuaWQgPT09IFwiU29uYW11RmlsZVwiID8gXCJTb25hbXVGaWxlU2NoZW1hXCIgOiBcIlNvbmFtdUZpbGVBcnJheVNjaGVtYVwiO1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7c2NoZW1hTmFtZX1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHNjaGVtYU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHoubnVtYmVyKCkpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpYDtcbiAgfSBlbHNlIGlmIChpc1RzVmVjdG9yUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyBab2Qg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouc3RyaW5nKClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouaW50KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDqt7jsmbggcmVsYXRpb24g7LyA7J207IqkIOygnOyZuFxuICAgICAgcmV0dXJuIGAvLyAke3Byb3AubmFtZX06ICR7cHJvcC5yZWxhdGlvblR5cGV9ICR7cHJvcC53aXRofWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi8vIHVuYWJsZSB0byByZXNvbHZlXCI7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgIGNhc2UgXCJhbnlcIjpcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIHp0LmRlZi50eXBlO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfSB8IG51bGxgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPSB6dCBhcyBBbnlab2RSZWNvcmQ7XG4gICAgICByZXR1cm4gYHsgWyBrZXk6ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLmtleVR5cGUpfSBdOiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi52YWx1ZVR5cGUpfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChzaGFwZVtrZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0pfSxgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIFwifVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgJHtwYXJ0fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocGFydCBhcyB6LlpvZFR5cGUpO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9ICh6dCBhcyBBbnlab2RSZWNvcmQpLmRlZjtcbiAgICAgIHJldHVybiBgei5yZWNvcmQoJHt6b2RUeXBlVG9ab2RDb2RlKHpSZWNvcmREZWYua2V5VHlwZSl9LCAke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpSZWNvcmREZWYudmFsdWVUeXBlLFxuICAgICAgKX0pYDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjoge1xuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWw8c3RyaW5nIHwgbnVtYmVyPikudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBgei5saXRlcmFsKCR7aXRlbXNbMF19KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYHoubGl0ZXJhbChbJHtpdGVtcy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgei51bmlvbihbJHsoenQgYXMgQW55Wm9kVW5pb24pLmRlZi5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbjogei5ab2RUeXBlKSA9PiB6b2RUeXBlVG9ab2RDb2RlKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKCh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5kZWYuZWxlbWVudCl9KWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9ICh6dCBhcyBBbnlab2RPYmplY3QpLnNoYXBlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHNoYXBlKS5tYXAoKGtleSkgPT4gYCR7a2V5fTogJHt6b2RUeXBlVG9ab2RDb2RlKHNoYXBlW2tleV0pfSxgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHtwYXJ0fVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICByZXR1cm4gem9kVHlwZVRvWm9kQ29kZShwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgei50ZW1wbGF0ZUxpdGVyYWwoWyR7cGFydHMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5sZWZ0KX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0KX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPSAoem9kVHlwZSBhcyB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPikuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+XG4gICAgICB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSksXG4gICAgKTtcbiAgICAvLyBUT0RPOiBab2RVbmlvbuydtCDrk6TslrTsnojripQg6rK97JqwIO2VuOuTpOungVxuICAgIHJldHVybiBvcHRpb25Ob2Rlc1swXTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPcHRpb25hbCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVGVtcGxhdGVMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZS5kZWYudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiBcIm9iamVjdFwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YOA7J6FIO2MjOyLsSDrtojqsIAgJHtrZXl9ICR7em9kVHlwZS5kZWYudHlwZX1gKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJwYXRoIiwieiIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJCVUlMVF9JTl9UWVBFX0lEUyIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0RhdGVBcnJheVByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNFbnVtQXJyYXlQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJpc0pzb25Qcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1RzVmVjdG9yUHJvcCIsImlzVXVpZEFycmF5UHJvcCIsImlzVXVpZFNpbmdsZVByb3AiLCJpc1ZlY3RvckFycmF5UHJvcCIsImlzVmVjdG9yU2luZ2xlUHJvcCIsImlzVmlydHVhbFByb3AiLCJTb25hbXVGaWxlQXJyYXlTY2hlbWEiLCJTb25hbXVGaWxlU2NoZW1hIiwiY3JlYXRlSW1wb3J0VXJsIiwicnVudGltZVBhdGgiLCJCVUlMVF9JTl9UWVBFUyIsIlNvbmFtdUZpbGUiLCJzY2hlbWEiLCJyZW5kZXJUeXBlIiwic2NoZW1hTmFtZSIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwiaW5jbHVkZXMiLCJidWlsdEluVHlwZSIsIkVycm9yIiwiZGVzY3JpYmUiLCJtb2R1bGVQYXRoIiwiZ2V0TW9kdWxlUGF0aCIsIm1vZHVsZUFic1BhdGgiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJpbXBvcnRVcmwiLCJpbXBvcnRlZCIsInByb3BUb1pvZFR5cGUiLCJwcm9wIiwiem9kVHlwZSIsInVua25vd24iLCJudW1iZXIiLCJpbnQiLCJhcnJheSIsImJpZ2ludCIsImlkIiwibGVuZ3RoIiwic3RyaW5nIiwibWF4IiwiYm9vbGVhbiIsImRhdGUiLCJ1dWlkIiwiaGFzSm9pbkNvbHVtbiIsInJlbEVudGl0eSIsImdldCIsIndpdGgiLCJwa1R5cGUiLCJnZXRQa1R5cGUiLCJ1bnNpZ25lZCIsIm5vbm5lZ2F0aXZlIiwibnVsbGFibGUiLCJwcm9wVG9ab2RUeXBlRGVmIiwiaW5qZWN0SW1wb3J0S2V5cyIsInN0bXQiLCJuYW1lIiwicHVzaCIsInJlbGF0aW9uVHlwZSIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwibWFwIiwiY2hpbGRQcm9wTm9kZSIsInpvZFR5cGVUb1RzVHlwZURlZiIsInp0IiwiZGVmIiwidHlwZSIsImlubmVyVHlwZSIsInJlY29yZFR5cGUiLCJrZXlUeXBlIiwidmFsdWVUeXBlIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsIiwiZWxlbWVudCIsInNoYXBlIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsInBhcnRzIiwicGFydCIsIl96b2QiLCJ6b2RUeXBlVG9ab2RDb2RlIiwiekRlZmF1bHREZWYiLCJkZWZhdWx0VmFsdWUiLCJ6UmVjb3JkRGVmIiwiaXRlbXMiLCJlbnRyaWVzIiwiekludGVyc2VjdGlvbkRlZiIsImxlZnQiLCJyaWdodCIsInpvZFR5cGVUb1JlbmRlcmluZ05vZGUiLCJiYXNlS2V5IiwibGFiZWwiLCJjYW1lbGl6ZSIsImRlc2NyaXB0aW9uIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsIlpvZEFycmF5IiwiWm9kTnVtYmVyIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImNvcmUiLCIkWm9kU3RyaW5nIiwiZW5kc1dpdGgiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIiwiWm9kVGVtcGxhdGVMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUNFQyxpQkFBaUIsRUFHakJDLDBCQUEwQixFQUMxQkMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJDLGtCQUFrQixFQUNsQkMsbUJBQW1CLEVBQ25CQyxlQUFlLEVBQ2ZDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsbUJBQW1CLEVBQ25CQyxVQUFVLEVBQ1ZDLGlCQUFpQixFQUNqQkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGlCQUFpQixFQUNqQkMsa0JBQWtCLEVBQ2xCQyxjQUFjLEVBQ2RDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsYUFBYSxFQUViQyxxQkFBcUIsRUFDckJDLGdCQUFnQixRQUNYLG9CQUFpQjtBQUN4QixTQUFTQyxlQUFlLFFBQVEsd0JBQXFCO0FBQ3JELFNBQVNDLFdB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
675
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0Jvb2xlYW5BcnJheVByb3AsXG4gIGlzQm9vbGVhblNpbmdsZVByb3AsXG4gIGlzRGF0ZUFycmF5UHJvcCxcbiAgaXNEYXRlU2luZ2xlUHJvcCxcbiAgaXNFbnVtQXJyYXlQcm9wLFxuICBpc0VudW1TaW5nbGVQcm9wLFxuICBpc0ludGVnZXJBcnJheVByb3AsXG4gIGlzSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzTnVtYmVyQXJyYXlQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY0FycmF5UHJvcCxcbiAgaXNOdW1lcmljU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU3RyaW5nQXJyYXlQcm9wLFxuICBpc1N0cmluZ1NpbmdsZVByb3AsXG4gIGlzVHNWZWN0b3JQcm9wLFxuICBpc1V1aWRBcnJheVByb3AsXG4gIGlzVXVpZFNpbmdsZVByb3AsXG4gIGlzVmVjdG9yQXJyYXlQcm9wLFxuICBpc1ZlY3RvclNpbmdsZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgUmVuZGVyaW5nTm9kZSxcbiAgU29uYW11RmlsZUFycmF5U2NoZW1hLFxuICBTb25hbXVGaWxlU2NoZW1hLFxuICB0eXBlIFpvZFN0cmluZ0Zvcm1hdCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbXBvcnRVcmwgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZFJlY29yZCA9IHouWm9kUmVjb3JkPHouWm9kU3RyaW5nIHwgei5ab2ROdW1iZXIgfCB6LlpvZFN5bWJvbCwgei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsPHN0cmluZz47XG5cbi8qKlxuICog64K07J6lIO2DgOyehSDsoJXsnZggKFpvZCDsiqTtgqTrp4ggKyBVSSDroIzrjZTrp4Eg7YOA7J6FKVxuICovXG5leHBvcnQgY29uc3QgQlVJTFRfSU5fVFlQRVMgPSB7XG4gIFNvbmFtdUZpbGU6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVTY2hlbWEsXG4gICAgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIixcbiAgICBzY2hlbWFOYW1lOiBcIlNvbmFtdUZpbGVTY2hlbWFcIixcbiAgfSxcbiAgXCJTb25hbXVGaWxlW11cIjoge1xuICAgIHNjaGVtYTogU29uYW11RmlsZUFycmF5U2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlQXJyYXlTY2hlbWFcIixcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBjb25zdCBpc29Gb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlzb0RhdGU6IFwiei5pc28uZGF0ZSgpXCIsXG4gICAgaXNvVGltZTogXCJ6Lmlzby50aW1lKClcIixcbiAgICBpc29EYXRldGltZTogXCJ6Lmlzby5kYXRldGltZSgpXCIsXG4gICAgaXNvRHVyYXRpb246IFwiei5pc28uZHVyYXRpb24oKVwiLFxuICB9O1xuXG4gIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgY29uc3QgaGFzaEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaGFzaE1kNTogJ3ouaGFzaChcIm1kNVwiKScsXG4gICAgaGFzaFNoYTE6ICd6Lmhhc2goXCJzaGExXCIpJyxcbiAgICBoYXNoU2hhMjU2OiAnei5oYXNoKFwic2hhMjU2XCIpJyxcbiAgICBoYXNoU2hhMzg0OiAnei5oYXNoKFwic2hhMzg0XCIpJyxcbiAgICBoYXNoU2hhNTEyOiAnei5oYXNoKFwic2hhNTEyXCIpJyxcbiAgfTtcblxuICBpZiAoZm9ybWF0IGluIGlzb0Zvcm1hdHMpIHtcbiAgICByZXR1cm4gaXNvRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaWYgKGZvcm1hdCBpbiBoYXNoRm9ybWF0cykge1xuICAgIHJldHVybiBoYXNoRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvVHlwZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHouWm9kVHlwZSB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgICBjYXNlIFwiaGFzaE1kNVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcIm1kNVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGExXCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMjU2XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMjU2XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMzg0XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMzg0XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhNTEyXCIpO1xuICAgIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHogYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB6LlpvZFR5cGU+KVtmb3JtYXRdKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh6b2RUeXBlSWQpKSB7XG4gICAgY29uc3QgYnVpbHRJblR5cGUgPSBCVUlMVF9JTl9UWVBFU1t6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXTtcbiAgICBpZiAoIWJ1aWx0SW5UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuCtOyepSDtg4DsnoUgJHt6b2RUeXBlSWR97J2YIOyKpO2CpOuniOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdEluVHlwZS5zY2hlbWEuZGVzY3JpYmUoem9kVHlwZUlkKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6FIOuPmeyggSDroZzrk5xcbiAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aCh6b2RUeXBlSWQpO1xuICBjb25zdCBtb2R1bGVBYnNQYXRoID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgem9kVHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiB6b2RUeXBlKSB7XG4gICAgICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBsZXQgZWxlbWVudFR5cGU6IHouWm9kVHlwZTtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gKGVsZW1lbnRUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICAgIHpvZFR5cGUgPSBlbGVtZW50VHlwZS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKChCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcC5pZCkpIHtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVcIiA/IFwiU29uYW11RmlsZVNjaGVtYVwiIDogXCJTb25hbXVGaWxlQXJyYXlTY2hlbWFcIjtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3NjaGVtYU5hbWV9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChzY2hlbWFOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIC8vIG51bWVyaWMg7YOA7J6F7J2YIOqyveyasCBudWxsYWJsZSDsnbTtm4Tsl5AgbWV0YSDstpTqsIAgKOuplO2DgOuNsOydtO2EsOqwgCDstZzsg4HsnIQg66CI67Ko7JeQIOyeiOyWtOyVvCDtlagpXG4gIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgKz0gJy5tZXRhKHsgU29uYW11UHJvcFR5cGU6IFwibnVtZXJpY1wiIH0pJztcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0gfCBudWxsYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmLmlubmVyVHlwZSk7XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWwpLnZhbHVlcylcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiIHwgXCIpO1xuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyBBbnlab2RVbmlvbikub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb24pID0+IHpvZFR5cGVUb1RzVHlwZURlZihvcHRpb24pKVxuICAgICAgICAuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIHouWm9kRW51bSkub3B0aW9ucy5tYXAoKHZhbCkgPT4gYFwiJHt2YWx9XCJgKS5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFs7J2AIHN0cmluZ+ycvOuhnCDtj7TrsLFcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrpqzthLDrn7Qg6rCSIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUpfS5udWxsYWJsZSgpYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICBjb25zdCB6RGVmYXVsdERlZiA9ICh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWY7XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSh6RGVmYXVsdERlZi5pbm5lclR5cGUpfS5kZWZhdWx0KCR7ekRlZmF1bHREZWYuZGVmYXVsdFZhbHVlfSlgO1xuICAgIH1cbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHpSZWNvcmREZWYgPSAoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWY7XG4gICAgICByZXR1cm4gYHoucmVjb3JkKCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj4pLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24pKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJHtrZXl9OiBcIiR7dmFsfVwiYCA6IGAke2tleX06ICR7dmFsfWApKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShzaGFwZVtrZXldKX0sYCksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9ICh6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWwpLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWxcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiei50ZW1wbGF0ZUxpdGVyYWwoW10pXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUocGFydCBhcyB6LlpvZFR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9ICh6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYubGVmdCl9LCAke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5yaWdodCl9KWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsnqzqt4DsoIHsnLzroZwg7KSR7LKp65CcIO2DgOyeheuTpOydhCDsspjrpqztlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKFxuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnksXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiLFxuKTogUmVuZGVyaW5nTm9kZSB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICBuYW1lOiBiYXNlS2V5LFxuICAgIGxhYmVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGJhc2VLZXksIGZhbHNlKSxcbiAgICB6b2RUeXBlLFxuICB9O1xuXG4gIC8qKlxuICAgKiDsvIDsnbTsiqQg7LKY66asIOyInOyEnFxuICAgKlxuICAgKiAxLiDtirnsiJgg7LyA7J207IqkIChkZXNjcmlwdGlvbiDquLDrsJgpXG4gICAqICAgIC0gU29uYW11RmlsZS9Tb25hbXVGaWxlW10gOiB6Lm9iamVjdC96LmFycmF57J207KeA66eMIO2MjOydvCDsl4XroZzrk5zsmqkg64K07J6lIO2DgOyehVxuICAgKlxuICAgKiAyLiDsnbzrsJgg7LyA7J207IqkIChpbnN0YW5jZW9mIOq4sOuwmClcbiAgICogICAgLSB6LlpvZE9iamVjdCA6IOydvOuwmCDqsJ3ssrRcbiAgICogICAgLSB6LlpvZEFycmF5IDog7J2867CYIOuwsOyXtFxuICAgKiAgICAgIC0gdmVjdG9yIDogei5hcnJheSh6Lm51bWJlcinsnbTsp4Drp4wg64Sk7J2067CNIOq4sOuwmOycvOuhnCDrsqHthLAg7J6E67Kg65SpXG4gICAqICAgICAgLSDsnbzrsJgg67Cw7Je0IDog6re4IOyZuFxuICAgKiAgICAtIHouWm9kVW5pb24sIHouWm9kT3B0aW9uYWwsIHouWm9kTnVsbGFibGUgOiDsnKDti7jrpqzti7Ag7YOA7J6FXG4gICAqICAgIC0g6riw7YOAIDogcmVzb2x2ZVJlbmRlclR5cGUoKeycvOuhnCDsspjrpqxcbiAgICovXG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZVtdIO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIgfTtcbiAgfVxuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGUg64uo7J28IO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiIH07XG4gIH1cblxuICAvLyDsnbzrsJgg7LyA7J207IqkOiBab2RPYmplY3Qg7LK07YGsXG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID0gKHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT4pLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PlxuICAgICAgem9kVHlwZVRvUmVuZGVyaW5nTm9kZShvcHQsIGJhc2VLZXkpLFxuICAgICk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdWxsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0JpZ0ludGVnZXJBcnJheVByb3AiLCJpc0JpZ0ludGVnZXJTaW5nbGVQcm9wIiwiaXNCb29sZWFuQXJyYXlQcm9wIiwiaXNCb29sZWFuU2luZ2xlUHJvcCIsImlzRGF0ZUFycmF5UHJvcCIsImlzRGF0ZVNpbmdsZVByb3AiLCJpc0VudW1BcnJheVByb3AiLCJpc0VudW1TaW5nbGVQcm9wIiwiaXNJbnRlZ2VyQXJyYXlQcm9wIiwiaXNJbnRlZ2VyU2luZ2xlUHJvcCIsImlzSnNvblByb3AiLCJpc051bWJlckFycmF5UHJvcCIsImlzTnVtYmVyU2luZ2xlUHJvcCIsImlzTnVtZXJpY0FycmF5UHJvcCIsImlzTnVtZXJpY1NpbmdsZVByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1N0cmluZ0FycmF5UHJvcCIsImlzU3RyaW5nU2luZ2xlUHJvcCIsImlzVHNWZWN0b3JQcm9wIiwiaXNVdWlkQXJyYXlQcm9wIiwiaXNVdWlkU2luZ2xlUHJvcCIsImlzVmVjdG9yQXJyYXlQcm9wIiwiaXNWZWN0b3JTaW5nbGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsIlNvbmFtdUZpbGVBcnJheVNjaGVtYSIsIlNvbmFtdUZpbGVTY2hlbWEiLCJjcmVhdGVJbXBvcnRVcmwiLCJydW50aW1lUGF0aCIsIkJVSUxUX0lOX1RZUEVTIiwiU29uYW11RmlsZSIsInNjaGVtYSIsInJlbmRlclR5cGUiLCJzY2hlbWFOYW1lIiwiem9kRm9ybWF0VG9Db2RlIiwiZm9ybWF0IiwiaXNvRm9ybWF0cyIsImlzb0RhdGUiLCJpc29UaW1lIiwiaXNvRGF0ZXRpbWUiLCJpc29EdXJhdGlvbiIsImhhc2hGb3JtYXRzIiwiaGFzaE1kNSIsImhhc2hTaGExIiwiaGFzaFNoYTI1NiIsImhhc2hTaGEzODQiLCJoYXNoU2hhNTEyIiwiem9kRm9ybWF0VG9UeXBlIiwiaXNvIiwiZGF0ZSIsInRpbWUiLCJkYXRldGltZSIsImR1cmF0aW9uIiwiaGFzaCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwiaW5jbHVkZXMiLCJidWlsdEluVHlwZSIsIkVycm9yIiwiZGVzY3JpYmUiLCJtb2R1bGVQYXRoIiwiZ2V0TW9kdWxlUGF0aCIsIm1vZHVsZUFic1BhdGgiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJpbXBvcnRVcmwiLCJpbXBvcnRlZCIsInByb3BUb1pvZFR5cGUiLCJwcm9wIiwiem9kVHlwZSIsInVua25vd24iLCJudW1iZXIiLCJpbnQiLCJhcnJheSIsImJpZ2ludCIsImlkIiwiem9kRm9ybWF0IiwibGVuZ3RoIiwibWF4Iiwic3RyaW5nIiwiZWxlbWVudFR5cGUiLCJib29sZWFuIiwidXVpZCIsImhhc0pvaW5Db2x1bW4iLCJyZWxFbnRpdHkiLCJnZXQiLCJ3aXRoIiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwidW5zaWduZWQiLCJub25uZWdhdGl2ZSIsIm51bGxhYmxlIiwicHJvcFRvWm9kVHlwZURlZiIsImluamVjdEltcG9ydEtleXMiLCJzdG10IiwibmFtZSIsInB1c2giLCJiYXNlIiwicmVsYXRpb25UeXBlIiwicHJvcE5vZGVUb1pvZFR5cGVEZWYiLCJwcm9wTm9kZSIsIm5vZGVUeXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZFByb3BOb2RlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwienQiLCJkZWYiLCJ0eXBlIiwiaW5uZXJUeXBlIiwicmVjb3JkVHlwZSIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWwiLCJlbGVtZW50Iiwic2hhcGUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFydHMiLCJwYXJ0IiwiX3pvZCIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiZGVzY3JpcHRpb24iLCJab2RPYmplY3QiLCJjb2x1bW5LZXlzIiwiWm9kQXJyYXkiLCJab2ROdW1iZXIiLCJab2RVbmlvbiIsIm9wdGlvbk5vZGVzIiwib3B0IiwiWm9kT3B0aW9uYWwiLCJvcHRpb25hbCIsIlpvZE51bGxhYmxlIiwicmVzb2x2ZVJlbmRlclR5cGUiLCJab2REYXRlIiwiY29yZSIsIiRab2RTdHJpbmciLCJlbmRzV2l0aCIsIlpvZEJvb2xlYW4iLCJab2RFbnVtIiwiWm9kUmVjb3JkIiwiWm9kQW55IiwiWm9kVW5rbm93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
@@ -86,4 +86,4 @@ export class RelationGraph {
86
86
  }
87
87
  }
88
88
 
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlQcm9wLCBGaXh0dXJlUmVjb3JkLCBSZWxhdGlvbk5vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLy8g6rSA6rOEIOq3uOuemO2UhCDsspjrpqzrpbwg67OE64+EIO2BtOuemOyKpOuhnCDrtoTrpqxcbmV4cG9ydCBjbGFzcyBSZWxhdGlvbkdyYXBoIHtcbiAgcHJpdmF0ZSBncmFwaDogTWFwPHN0cmluZywgUmVsYXRpb25Ob2RlPiA9IG5ldyBNYXAoKTtcblxuICBidWlsZEdyYXBoKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiB2b2lkIHtcbiAgICB0aGlzLmdyYXBoLmNsZWFyKCk7XG5cbiAgICAvLyAxLiDrhbjrk5wg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICB0aGlzLmdyYXBoLnNldChmaXh0dXJlLmZpeHR1cmVJZCwge1xuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmUuZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgcmVsYXRlZDogbmV3IFNldCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMi4g7J2Y7KG07ISxIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2ZpeHR1cmUuZml4dHVyZUlkfWApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGguaGFzKHJlbGF0ZWRGaXh0dXJlSWQpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZWxhdGVkLmFkZChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyYXBoLmdldChyZWxhdGVkRml4dHVyZUlkKT8ucmVsYXRlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5zZXJ0aW9uT3JkZXIoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBvcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB0ZW1wVmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgdmlzaXQgPSAoZml4dHVyZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhmaXh0dXJlSWQpKSByZXR1cm47XG4gICAgICBpZiAodGVtcFZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGludm9sdmluZzogJHtmaXh0dXJlSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGVtcFZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlSWQpO1xuICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7Zml4dHVyZUlkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQobm9kZS5lbnRpdHlJZCk7XG5cbiAgICAgIGZvciAoY29uc3QgZGVwSWQgb2Ygbm9kZS5yZWxhdGVkKSB7XG4gICAgICAgIGNvbnN0IGRlcE5vZGUgPSB0aGlzLmdyYXBoLmdldChkZXBJZCk7XG4gICAgICAgIGlmIChkZXBOb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7ZGVwSWR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWxvbmdzVG9PbmUg6rSA6rOE7J2066m07IScIG51bGxhYmxl7J20IOyVhOuLjCDqsr3smrAg66i87KCAIOuwqeusuFxuICAgICAgICBjb25zdCByZWxhdGlvblByb3AgPSBlbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAgIGlzUmVsYXRpb25Qcm9wKHByb3ApICYmXG4gICAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgICAgIHByb3Aud2l0aCA9PT0gZGVwTm9kZS5lbnRpdHlJZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlbGF0aW9uUHJvcCAmJiAhcmVsYXRpb25Qcm9wLm51bGxhYmxlKSB7XG4gICAgICAgICAgdmlzaXQoZGVwSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRlbXBWaXNpdGVkLmRlbGV0ZShmaXh0dXJlSWQpO1xuICAgICAgdmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcbiAgICAgIG9yZGVyLnB1c2goZml4dHVyZUlkKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgdGhpcy5ncmFwaC5rZXlzKCkpIHtcbiAgICAgIHZpc2l0KGZpeHR1cmVJZCk7XG4gICAgfVxuXG4gICAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeeuhnCDsnbjtlbQg67Cp66y465CY7KeAIOyViuydgCBmaXh0dXJlSWQg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgdGhpcy5ncmFwaC5rZXlzKCkpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiUmVsYXRpb25HcmFwaCIsImdyYXBoIiwiTWFwIiwiYnVpbGRHcmFwaCIsImZpeHR1cmVzIiwiY2xlYXIiLCJmaXh0dXJlIiwic2V0IiwiZml4dHVyZUlkIiwiZW50aXR5SWQiLCJyZWxhdGVkIiwiU2V0Iiwibm9kZSIsImdldCIsInVuZGVmaW5lZCIsIkVycm9yIiwiY29sdW1uIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJwcm9wIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRGaXh0dXJlSWQiLCJ3aXRoIiwidmFsdWUiLCJoYXMiLCJhZGQiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwiZ2V0SW5zZXJ0aW9uT3JkZXIiLCJ2aXNpdGVkIiwib3JkZXIiLCJ0ZW1wVmlzaXRlZCIsInZpc2l0IiwiY29uc29sZSIsIndhcm4iLCJlbnRpdHkiLCJkZXBJZCIsImRlcE5vZGUiLCJyZWxhdGlvblByb3AiLCJwcm9wcyIsImZpbmQiLCJudWxsYWJsZSIsImRlbGV0ZSIsInB1c2giLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxh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
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlQcm9wLCBGaXh0dXJlUmVjb3JkLCBSZWxhdGlvbk5vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLy8g6rSA6rOEIOq3uOuemO2UhCDsspjrpqzrpbwg67OE64+EIO2BtOuemOyKpOuhnCDrtoTrpqxcbmV4cG9ydCBjbGFzcyBSZWxhdGlvbkdyYXBoIHtcbiAgcHJpdmF0ZSBncmFwaDogTWFwPHN0cmluZywgUmVsYXRpb25Ob2RlPiA9IG5ldyBNYXAoKTtcblxuICBidWlsZEdyYXBoKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiB2b2lkIHtcbiAgICB0aGlzLmdyYXBoLmNsZWFyKCk7XG5cbiAgICAvLyAxLiDrhbjrk5wg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICB0aGlzLmdyYXBoLnNldChmaXh0dXJlLmZpeHR1cmVJZCwge1xuICAgICAgICBmaXh0dXJlSWQ6IGZpeHR1cmUuZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgcmVsYXRlZDogbmV3IFNldCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMi4g7J2Y7KG07ISxIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2ZpeHR1cmUuZml4dHVyZUlkfWApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgdW5rbm93biBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgICBpZiAodGhpcy5ncmFwaC5oYXMocmVsYXRlZEZpeHR1cmVJZCkpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGguZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCk7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtmaXh0dXJlSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChub2RlLmVudGl0eUlkKTtcblxuICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBub2RlLnJlbGF0ZWQpIHtcbiAgICAgICAgY29uc3QgZGVwTm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGRlcElkKTtcbiAgICAgICAgaWYgKGRlcE5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtkZXBJZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVsYXRpb25Qcm9wICYmICFyZWxhdGlvblByb3AubnVsbGFibGUpIHtcbiAgICAgICAgICB2aXNpdChkZXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGVtcFZpc2l0ZWQuZGVsZXRlKGZpeHR1cmVJZCk7XG4gICAgICB2aXNpdGVkLmFkZChmaXh0dXJlSWQpO1xuICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgdmlzaXQoZml4dHVyZUlkKTtcbiAgICB9XG5cbiAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN566GcIOyduO2VtCDrsKnrrLjrkJjsp4Ag7JWK7J2AIGZpeHR1cmVJZCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZml4dHVyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJSZWxhdGlvbkdyYXBoIiwiZ3JhcGgiLCJNYXAiLCJidWlsZEdyYXBoIiwiZml4dHVyZXMiLCJjbGVhciIsImZpeHR1cmUiLCJzZXQiLCJmaXh0dXJlSWQiLCJlbnRpdHlJZCIsInJlbGF0ZWQiLCJTZXQiLCJub2RlIiwiZ2V0IiwidW5kZWZpbmVkIiwiRXJyb3IiLCJjb2x1bW4iLCJPYmplY3QiLCJlbnRyaWVzIiwiY29sdW1ucyIsInByb3AiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEZpeHR1cmVJZCIsIndpdGgiLCJ2YWx1ZSIsImhhcyIsImFkZCIsInJlbGF0ZWRJZHMiLCJyZWxhdGVkSWQiLCJnZXRJbnNlcnRpb25PcmRlciIsInZpc2l0ZWQiLCJvcmRlciIsInRlbXBWaXNpdGVkIiwidmlzaXQiLCJjb25zb2xlIiwid2FybiIsImVudGl0eSIsImRlcElkIiwiZGVwTm9kZSIsInJlbGF0aW9uUHJvcCIsInByb3BzIiwiZmluZCIsIm51bGxhYmxlIiwiZGVsZXRlIiwicHVzaCIsImtleXMiXSwibWFwcGluZ3MiOiJB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
@@ -0,0 +1,61 @@
1
+ import type { Knex } from "knex";
2
+ import type { CacheManager } from "../cache/types";
3
+ import type { EntityManager } from "../entity/entity-manager";
4
+ export type DataExplorerStrategy = "sample" | "ids" | "query" | "file" | "recent" | "random";
5
+ /** WHERE 조건 타입 (객체 또는 Knex QueryBuilder 함수) */
6
+ export type WhereCondition = Record<string, unknown> | ((queryBuilder: Knex.QueryBuilder) => void);
7
+ export type DataExplorerOptions = {
8
+ strategy: DataExplorerStrategy;
9
+ limit?: number;
10
+ where?: WhereCondition;
11
+ orderBy?: string;
12
+ ids?: number[];
13
+ filePath?: string;
14
+ /** 캐싱 사용 여부 (기본값: false) */
15
+ useCache?: boolean;
16
+ /** 캐시 TTL (초 단위, 기본값: 300) */
17
+ cacheTtl?: number;
18
+ };
19
+ export type ExploreWithRelationsOptions = DataExplorerOptions & {
20
+ /** 관련 데이터 포함 여부 (기본값: true) */
21
+ includeRelations?: boolean;
22
+ /** 재귀 탐색 최대 깊이 (기본값: 2) */
23
+ maxDepth?: number;
24
+ };
25
+ export type ExploreWithRelationsResult = {
26
+ /** 메인 entity 데이터 */
27
+ main: {
28
+ entityId: string;
29
+ records: Record<string, unknown>[];
30
+ };
31
+ /** 관련 entity 데이터 (entityId -> records) */
32
+ related: Map<string, Record<string, unknown>[]>;
33
+ };
34
+ export declare class DataExplorer {
35
+ private db;
36
+ private entityManager;
37
+ private cache?;
38
+ constructor(db: Knex, entityManager: typeof EntityManager, cacheManager?: CacheManager);
39
+ explore(entityName: string, options: DataExplorerOptions): Promise<Record<string, unknown>[]>;
40
+ private exploreInternal;
41
+ private sampleData;
42
+ private randomSample;
43
+ private findTimestampColumn;
44
+ private loadFromFile;
45
+ exploreRelation(entityName: string, relationProp: string, options?: Partial<DataExplorerOptions>): Promise<Record<string, unknown>[]>;
46
+ /**
47
+ * 여러 relation을 병렬로 조회합니다 (N+1 문제 해결)
48
+ */
49
+ exploreRelations(entityName: string, relationProps: string[], options?: Partial<DataExplorerOptions>): Promise<Record<string, Record<string, unknown>[]>>;
50
+ private generateCacheKey;
51
+ /**
52
+ * Entity와 관련된 데이터를 재귀적으로 탐색합니다.
53
+ * BelongsToOne, OneToOne(hasJoinColumn) relation을 따라가며 참조 데이터를 수집합니다.
54
+ */
55
+ exploreWithRelations(entityName: string, options: ExploreWithRelationsOptions): Promise<ExploreWithRelationsResult>;
56
+ /**
57
+ * 관련 데이터를 재귀적으로 수집합니다 (private helper)
58
+ */
59
+ private collectRelatedData;
60
+ }
61
+ //# sourceMappingURL=data-explorer.d.ts.map