sonamu 0.5.7 → 0.6.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 (358) hide show
  1. package/dist/api/base-frame.js +12 -2
  2. package/dist/api/caster.js +66 -2
  3. package/dist/api/code-converters.js +489 -2
  4. package/dist/api/config.d.ts +76 -0
  5. package/dist/api/config.d.ts.map +1 -0
  6. package/dist/api/config.js +32 -0
  7. package/dist/api/context.d.ts +1 -0
  8. package/dist/api/context.d.ts.map +1 -1
  9. package/dist/api/context.js +3 -2
  10. package/dist/api/decorators.d.ts.map +1 -1
  11. package/dist/api/decorators.js +142 -2
  12. package/dist/api/index.js +9 -2
  13. package/dist/api/sonamu.d.ts +8 -22
  14. package/dist/api/sonamu.d.ts.map +1 -1
  15. package/dist/api/sonamu.js +482 -2
  16. package/dist/bin/build-config.d.ts +2 -1
  17. package/dist/bin/build-config.d.ts.map +1 -1
  18. package/dist/bin/build-config.js +12 -2
  19. package/dist/bin/cli-wrapper.js +71 -2
  20. package/dist/bin/cli.js +418 -2
  21. package/dist/bin/hot-hook-register.d.ts +11 -0
  22. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  23. package/dist/bin/hot-hook-register.js +21 -0
  24. package/dist/database/_batch_update.js +78 -2
  25. package/dist/database/base-model.js +247 -2
  26. package/dist/database/code-generator.js +53 -2
  27. package/dist/database/db.d.ts +2 -16
  28. package/dist/database/db.d.ts.map +1 -1
  29. package/dist/database/db.js +132 -2
  30. package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
  31. package/dist/database/puri-wrapper.js +109 -2
  32. package/dist/database/puri.d.ts +23 -16
  33. package/dist/database/puri.d.ts.map +1 -1
  34. package/dist/database/puri.js +539 -2
  35. package/dist/database/puri.types.d.ts +8 -3
  36. package/dist/database/puri.types.d.ts.map +1 -1
  37. package/dist/database/puri.types.js +3 -2
  38. package/dist/database/transaction-context.js +14 -2
  39. package/dist/database/upsert-builder.js +215 -2
  40. package/dist/entity/entity-manager.d.ts +3 -1
  41. package/dist/entity/entity-manager.d.ts.map +1 -1
  42. package/dist/entity/entity-manager.js +114 -2
  43. package/dist/entity/entity-utils.js +210 -2
  44. package/dist/entity/entity.d.ts.map +1 -1
  45. package/dist/entity/entity.js +651 -2
  46. package/dist/exceptions/error-handler.js +29 -2
  47. package/dist/exceptions/so-exceptions.js +85 -2
  48. package/dist/file-storage/driver.js +79 -2
  49. package/dist/file-storage/file-storage.js +75 -2
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +28 -2
  53. package/dist/migration/code-generation.js +558 -2
  54. package/dist/migration/migration-set.js +364 -2
  55. package/dist/migration/migrator.d.ts +0 -9
  56. package/dist/migration/migrator.d.ts.map +1 -1
  57. package/dist/migration/migrator.js +510 -2
  58. package/dist/migration/types.js +3 -2
  59. package/dist/naite/naite.d.ts +12 -0
  60. package/dist/naite/naite.d.ts.map +1 -0
  61. package/dist/naite/naite.js +72 -0
  62. package/dist/stream/index.js +3 -2
  63. package/dist/stream/sse.js +38 -2
  64. package/dist/syncer/api-parser.d.ts +20 -0
  65. package/dist/syncer/api-parser.d.ts.map +1 -0
  66. package/dist/syncer/api-parser.js +229 -0
  67. package/dist/syncer/checksum.d.ts +21 -0
  68. package/dist/syncer/checksum.d.ts.map +1 -0
  69. package/dist/syncer/checksum.js +98 -0
  70. package/dist/syncer/code-generator.d.ts +20 -0
  71. package/dist/syncer/code-generator.d.ts.map +1 -0
  72. package/dist/syncer/code-generator.js +141 -0
  73. package/dist/syncer/entity-operations.d.ts +17 -0
  74. package/dist/syncer/entity-operations.d.ts.map +1 -0
  75. package/dist/syncer/entity-operations.js +58 -0
  76. package/dist/syncer/file-patterns.d.ts +29 -0
  77. package/dist/syncer/file-patterns.d.ts.map +1 -0
  78. package/dist/syncer/file-patterns.js +38 -0
  79. package/dist/syncer/index.d.ts +6 -0
  80. package/dist/syncer/index.d.ts.map +1 -1
  81. package/dist/syncer/index.js +9 -2
  82. package/dist/syncer/module-loader.d.ts +35 -0
  83. package/dist/syncer/module-loader.d.ts.map +1 -0
  84. package/dist/syncer/module-loader.js +82 -0
  85. package/dist/syncer/syncer.d.ts +93 -108
  86. package/dist/syncer/syncer.d.ts.map +1 -1
  87. package/dist/syncer/syncer.js +375 -2
  88. package/dist/template/entity-converter.d.ts +14 -0
  89. package/dist/template/entity-converter.d.ts.map +1 -0
  90. package/dist/template/entity-converter.js +101 -0
  91. package/dist/template/helpers.d.ts +23 -0
  92. package/dist/template/helpers.d.ts.map +1 -0
  93. package/dist/template/helpers.js +64 -0
  94. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  95. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  96. package/dist/template/implementations/entity.template.js +87 -0
  97. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
  98. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  99. package/dist/template/implementations/generated.template.js +232 -0
  100. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
  101. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  102. package/dist/template/implementations/generated_http.template.js +131 -0
  103. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
  104. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  105. package/dist/template/implementations/generated_sso.template.js +105 -0
  106. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  107. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  108. package/dist/template/implementations/init_types.template.js +38 -0
  109. package/dist/template/implementations/model.template.d.ts +17 -0
  110. package/dist/template/implementations/model.template.d.ts.map +1 -0
  111. package/dist/template/implementations/model.template.js +171 -0
  112. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  113. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  114. package/dist/template/implementations/model_test.template.js +35 -0
  115. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  116. package/dist/template/implementations/service.template.d.ts.map +1 -0
  117. package/dist/template/implementations/service.template.js +193 -0
  118. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  119. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  120. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  121. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  122. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  123. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  124. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  125. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  126. package/dist/template/implementations/view_enums_select.template.js +55 -0
  127. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  128. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  129. package/dist/template/implementations/view_form.template.js +337 -0
  130. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  131. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  132. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  133. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  134. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  135. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  136. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  137. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  138. package/dist/template/implementations/view_list.template.js +465 -0
  139. package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  141. package/dist/template/implementations/view_list_columns.template.js +49 -0
  142. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  144. package/dist/template/implementations/view_search_input.template.js +64 -0
  145. package/dist/template/index.d.ts +5 -0
  146. package/dist/template/index.d.ts.map +1 -0
  147. package/dist/template/index.js +6 -0
  148. package/dist/template/template.d.ts +39 -0
  149. package/dist/template/template.d.ts.map +1 -0
  150. package/dist/template/template.js +47 -0
  151. package/dist/template/zod-converter.d.ts +18 -0
  152. package/dist/template/zod-converter.d.ts.map +1 -0
  153. package/dist/template/zod-converter.js +166 -0
  154. package/dist/testing/_relation-graph.js +80 -2
  155. package/dist/testing/fixture-manager.d.ts.map +1 -1
  156. package/dist/testing/fixture-manager.js +521 -2
  157. package/dist/types/types.d.ts +39 -40
  158. package/dist/types/types.d.ts.map +1 -1
  159. package/dist/types/types.js +289 -2
  160. package/dist/typings/knex.d.js +3 -2
  161. package/dist/utils/async-utils.d.ts +7 -0
  162. package/dist/utils/async-utils.d.ts.map +1 -1
  163. package/dist/utils/async-utils.js +57 -2
  164. package/dist/utils/console-util.d.ts +2 -0
  165. package/dist/utils/console-util.d.ts.map +1 -0
  166. package/dist/utils/console-util.js +6 -0
  167. package/dist/utils/controller.js +26 -2
  168. package/dist/utils/esm-utils.d.ts +45 -0
  169. package/dist/utils/esm-utils.d.ts.map +1 -0
  170. package/dist/utils/esm-utils.js +56 -0
  171. package/dist/utils/fs-utils.js +17 -2
  172. package/dist/utils/lodash-able.js +6 -2
  173. package/dist/utils/model.js +22 -2
  174. package/dist/utils/path-utils.d.ts +89 -0
  175. package/dist/utils/path-utils.d.ts.map +1 -0
  176. package/dist/utils/path-utils.js +60 -0
  177. package/dist/utils/process-utils.d.ts +13 -0
  178. package/dist/utils/process-utils.d.ts.map +1 -0
  179. package/dist/utils/process-utils.js +36 -0
  180. package/dist/utils/sql-parser.js +35 -2
  181. package/dist/utils/utils.d.ts +4 -7
  182. package/dist/utils/utils.d.ts.map +1 -1
  183. package/dist/utils/utils.js +33 -2
  184. package/dist/utils/zod-error.d.ts.map +1 -1
  185. package/dist/utils/zod-error.js +19 -2
  186. package/package.json +21 -8
  187. package/src/api/code-converters.ts +2 -2
  188. package/src/api/config.ts +142 -0
  189. package/src/api/context.ts +1 -0
  190. package/src/api/decorators.ts +1 -0
  191. package/src/api/sonamu.ts +81 -67
  192. package/src/bin/build-config.ts +2 -1
  193. package/src/bin/cli-wrapper.ts +10 -3
  194. package/src/bin/cli.ts +108 -56
  195. package/src/bin/hot-hook-register.ts +22 -0
  196. package/src/database/base-model.ts +1 -1
  197. package/src/database/code-generator.ts +1 -1
  198. package/src/database/db.ts +10 -52
  199. package/src/database/puri.ts +78 -53
  200. package/src/database/puri.types.ts +18 -5
  201. package/src/database/upsert-builder.ts +1 -1
  202. package/src/entity/entity-manager.ts +19 -15
  203. package/src/entity/entity.ts +4 -3
  204. package/src/index.ts +2 -0
  205. package/src/migration/code-generation.ts +1 -1
  206. package/src/migration/migration-set.ts +1 -1
  207. package/src/migration/migrator.ts +23 -152
  208. package/src/naite/naite.ts +70 -0
  209. package/src/syncer/api-parser.ts +299 -0
  210. package/src/syncer/checksum.ts +152 -0
  211. package/src/syncer/code-generator.ts +202 -0
  212. package/src/syncer/entity-operations.ts +68 -0
  213. package/src/syncer/file-patterns.ts +56 -0
  214. package/src/syncer/index.ts +6 -0
  215. package/src/syncer/module-loader.ts +125 -0
  216. package/src/syncer/syncer.ts +363 -1420
  217. package/src/template/entity-converter.ts +123 -0
  218. package/src/template/helpers.ts +84 -0
  219. package/src/{templates → template/implementations}/entity.template.ts +4 -4
  220. package/src/{templates → template/implementations}/generated.template.ts +9 -9
  221. package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
  222. package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
  223. package/src/{templates → template/implementations}/init_types.template.ts +4 -4
  224. package/src/{templates → template/implementations}/model.template.ts +9 -9
  225. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  226. package/src/{templates → template/implementations}/service.template.ts +19 -11
  227. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  228. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
  229. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  230. package/src/{templates → template/implementations}/view_form.template.ts +11 -13
  231. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  232. package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
  233. package/src/{templates → template/implementations}/view_list.template.ts +13 -64
  234. package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
  235. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  236. package/src/template/index.ts +4 -0
  237. package/src/template/template.ts +86 -0
  238. package/src/template/zod-converter.ts +219 -0
  239. package/src/testing/fixture-manager.ts +8 -1
  240. package/src/types/types.ts +38 -61
  241. package/src/utils/async-utils.ts +17 -0
  242. package/src/utils/console-util.ts +4 -0
  243. package/src/utils/esm-utils.ts +69 -0
  244. package/src/utils/path-utils.ts +102 -0
  245. package/src/utils/process-utils.ts +46 -0
  246. package/src/utils/sql-parser.ts +1 -1
  247. package/src/utils/utils.ts +14 -40
  248. package/src/utils/zod-error.ts +0 -1
  249. package/dist/api/base-frame.js.map +0 -1
  250. package/dist/api/caster.js.map +0 -1
  251. package/dist/api/code-converters.js.map +0 -1
  252. package/dist/api/context.js.map +0 -1
  253. package/dist/api/decorators.js.map +0 -1
  254. package/dist/api/index.js.map +0 -1
  255. package/dist/api/sonamu.js.map +0 -1
  256. package/dist/bin/build-config.js.map +0 -1
  257. package/dist/bin/cli-wrapper.js.map +0 -1
  258. package/dist/bin/cli.js.map +0 -1
  259. package/dist/database/_batch_update.js.map +0 -1
  260. package/dist/database/base-model.js.map +0 -1
  261. package/dist/database/code-generator.js.map +0 -1
  262. package/dist/database/db.js.map +0 -1
  263. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  264. package/dist/database/puri-wrapper.js.map +0 -1
  265. package/dist/database/puri.js.map +0 -1
  266. package/dist/database/puri.types.js.map +0 -1
  267. package/dist/database/transaction-context.js.map +0 -1
  268. package/dist/database/upsert-builder.js.map +0 -1
  269. package/dist/entity/entity-manager.js.map +0 -1
  270. package/dist/entity/entity-utils.js.map +0 -1
  271. package/dist/entity/entity.js.map +0 -1
  272. package/dist/exceptions/error-handler.js.map +0 -1
  273. package/dist/exceptions/so-exceptions.js.map +0 -1
  274. package/dist/file-storage/driver.js.map +0 -1
  275. package/dist/file-storage/file-storage.js.map +0 -1
  276. package/dist/index.js.map +0 -1
  277. package/dist/migration/code-generation.js.map +0 -1
  278. package/dist/migration/migration-set.js.map +0 -1
  279. package/dist/migration/migrator.js.map +0 -1
  280. package/dist/migration/types.js.map +0 -1
  281. package/dist/stream/index.js.map +0 -1
  282. package/dist/stream/sse.js.map +0 -1
  283. package/dist/syncer/index.js.map +0 -1
  284. package/dist/syncer/syncer.js.map +0 -1
  285. package/dist/templates/base-template.d.ts +0 -13
  286. package/dist/templates/base-template.d.ts.map +0 -1
  287. package/dist/templates/base-template.js +0 -2
  288. package/dist/templates/base-template.js.map +0 -1
  289. package/dist/templates/entity.template.d.ts.map +0 -1
  290. package/dist/templates/entity.template.js +0 -2
  291. package/dist/templates/entity.template.js.map +0 -1
  292. package/dist/templates/generated.template.d.ts.map +0 -1
  293. package/dist/templates/generated.template.js +0 -2
  294. package/dist/templates/generated.template.js.map +0 -1
  295. package/dist/templates/generated_http.template.d.ts.map +0 -1
  296. package/dist/templates/generated_http.template.js +0 -2
  297. package/dist/templates/generated_http.template.js.map +0 -1
  298. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  299. package/dist/templates/generated_sso.template.js +0 -2
  300. package/dist/templates/generated_sso.template.js.map +0 -1
  301. package/dist/templates/index.d.ts +0 -2
  302. package/dist/templates/index.d.ts.map +0 -1
  303. package/dist/templates/index.js +0 -2
  304. package/dist/templates/index.js.map +0 -1
  305. package/dist/templates/init_types.template.d.ts.map +0 -1
  306. package/dist/templates/init_types.template.js +0 -2
  307. package/dist/templates/init_types.template.js.map +0 -1
  308. package/dist/templates/model.template.d.ts +0 -17
  309. package/dist/templates/model.template.d.ts.map +0 -1
  310. package/dist/templates/model.template.js +0 -2
  311. package/dist/templates/model.template.js.map +0 -1
  312. package/dist/templates/model_test.template.d.ts.map +0 -1
  313. package/dist/templates/model_test.template.js +0 -2
  314. package/dist/templates/model_test.template.js.map +0 -1
  315. package/dist/templates/service.template.d.ts.map +0 -1
  316. package/dist/templates/service.template.js +0 -2
  317. package/dist/templates/service.template.js.map +0 -1
  318. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  319. package/dist/templates/view_enums_buttonset.template.js +0 -2
  320. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  321. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  322. package/dist/templates/view_enums_dropdown.template.js +0 -2
  323. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  324. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  325. package/dist/templates/view_enums_select.template.js +0 -2
  326. package/dist/templates/view_enums_select.template.js.map +0 -1
  327. package/dist/templates/view_form.template.d.ts.map +0 -1
  328. package/dist/templates/view_form.template.js +0 -2
  329. package/dist/templates/view_form.template.js.map +0 -1
  330. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  331. package/dist/templates/view_id_all_select.template.js +0 -2
  332. package/dist/templates/view_id_all_select.template.js.map +0 -1
  333. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  334. package/dist/templates/view_id_async_select.template.js +0 -2
  335. package/dist/templates/view_id_async_select.template.js.map +0 -1
  336. package/dist/templates/view_list.template.d.ts.map +0 -1
  337. package/dist/templates/view_list.template.js +0 -2
  338. package/dist/templates/view_list.template.js.map +0 -1
  339. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  340. package/dist/templates/view_list_columns.template.js +0 -2
  341. package/dist/templates/view_list_columns.template.js.map +0 -1
  342. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  343. package/dist/templates/view_search_input.template.js +0 -2
  344. package/dist/templates/view_search_input.template.js.map +0 -1
  345. package/dist/testing/_relation-graph.js.map +0 -1
  346. package/dist/testing/fixture-manager.js.map +0 -1
  347. package/dist/types/types.js.map +0 -1
  348. package/dist/typings/knex.d.js.map +0 -1
  349. package/dist/utils/async-utils.js.map +0 -1
  350. package/dist/utils/controller.js.map +0 -1
  351. package/dist/utils/fs-utils.js.map +0 -1
  352. package/dist/utils/lodash-able.js.map +0 -1
  353. package/dist/utils/model.js.map +0 -1
  354. package/dist/utils/sql-parser.js.map +0 -1
  355. package/dist/utils/utils.js.map +0 -1
  356. package/dist/utils/zod-error.js.map +0 -1
  357. package/src/templates/base-template.ts +0 -19
  358. package/src/templates/index.ts +0 -1
@@ -1,2 +1,489 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get apiParamToTsCode(){return apiParamToTsCode},get apiParamToTsCodeAsObject(){return apiParamToTsCodeAsObject},get apiParamTypeToTsType(){return apiParamTypeToTsType},get getTextTypeLength(){return getTextTypeLength},get getZodObjectFromApi(){return getZodObjectFromApi},get getZodObjectFromApiParams(){return getZodObjectFromApiParams},get getZodTypeFromApiParamType(){return getZodTypeFromApiParamType},get propNodeToZodTypeDef(){return propNodeToZodTypeDef},get propToZodTypeDef(){return propToZodTypeDef},get serializeZodType(){return serializeZodType},get unwrapPromiseOnce(){return unwrapPromiseOnce},get zodTypeToTsTypeDef(){return zodTypeToTsTypeDef},get zodTypeToZodCode(){return zodTypeToZodCode}});var _zod=require("zod");var _types=require("../types/types");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function getZodObjectFromApi(api){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var _api_typeParameters;if(((_api_typeParameters=api.typeParameters)===null||_api_typeParameters===void 0?void 0:_api_typeParameters.length)>0){api.typeParameters.map(function(typeParam){if(typeParam.constraint){var zodType=getZodTypeFromApiParamType(typeParam.constraint,references);references[typeParam.id]=zodType}})}var ReqType=getZodObjectFromApiParams(api.parameters.filter(function(param){return!_types.ApiParamType.isContext(param.type)&&!_types.ApiParamType.isRefKnex(param.type)&&!(param.optional===true&&param.name.startsWith("_"))}),references);return ReqType}function getZodObjectFromApiParams(apiParams){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return _zod.z.object(apiParams.reduce(function(r,param){var zodType=getZodTypeFromApiParamType(param.type,references);if(param.optional){zodType=zodType.optional()}return _object_spread_props(_object_spread({},r),_define_property({},param.name,zodType))},{}))}function getZodTypeFromApiParamType(paramType,references){switch(paramType){case"string":return _zod.z.string();case"number":return _zod.z.number();case"boolean":return _zod.z.boolean();default:var advType=paramType;switch(advType.t){case"string-literal":case"numeric-literal":return _zod.z.literal(advType.value);case"object":var objType=paramType;return getZodObjectFromApiParams(objType.props);case"array":var arrType=paramType;return _zod.z.array(getZodTypeFromApiParamType(arrType.elementsType,references));case"ref":var refType=paramType;if(refType.id==="Date"){return _zod.z.date()}if(["Pick","Omit"].includes(refType.id)){var _refType_args;if(((_refType_args=refType.args)===null||_refType_args===void 0?void 0:_refType_args.length)!==2){throw new Error("잘못된 ".concat(refType.id))}var _refType_args_map=_sliced_to_array(refType.args.map(function(arg){return getZodTypeFromApiParamType(arg,references)}),2),obj=_refType_args_map[0],literalOrUnion=_refType_args_map[1];var keys=[];if(_instanceof(literalOrUnion,_zod.z.ZodUnion)){keys=literalOrUnion.def.options.map(function(option){return option.def.value})}else{keys=literalOrUnion.def.values}var keyRecord=keys.reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,true))},{});if(refType.id==="Pick"){if(obj.pick){return obj.pick(keyRecord)}}else{if(obj.omit){return obj.omit(keyRecord)}}}if(["Partial"].includes(refType.id)){var _refType_args1;if(((_refType_args1=refType.args)===null||_refType_args1===void 0?void 0:_refType_args1.length)!==1){throw new Error("잘못된 ".concat(refType.id))}var obj1=getZodTypeFromApiParamType(refType.args[0],references);return obj1.partial()}var reference=references[refType.id];if(reference===undefined){return _zod.z.string()}return reference;case"union":var unionType=paramType;if(unionType.types.length===2&&unionType.types.some(function(type){return type==="null"})){if(unionType.types[0]==="null"){return getZodTypeFromApiParamType(unionType.types[1],references).nullable()}else{return getZodTypeFromApiParamType(unionType.types[0],references).nullable()}}return _zod.z.union(unionType.types.map(function(type){return getZodTypeFromApiParamType(type,references)}));case"intersection":var intersectionType=paramType;return intersectionType.types.reduce(function(result,type,index){var resolvedType=getZodTypeFromApiParamType(type,references);if(index===0){return resolvedType}else{return _zod.z.intersection(result,resolvedType)}},_zod.z.unknown());case"tuple-type":var tupleType=paramType;return _zod.z.tuple(tupleType.elements.map(function(elem){return getZodTypeFromApiParamType(elem,references)}))}return _zod.z.unknown()}}function propNodeToZodTypeDef(propNode,injectImportKeys){if(propNode.nodeType==="plain"){return propToZodTypeDef(propNode.prop,injectImportKeys)}else if(propNode.nodeType==="array"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.array(z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})),"].join("\n")}else if(propNode.nodeType==="object"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})".concat(propNode.prop&&propNode.prop.nullable?".nullable()":"",",")].join("\n")}else{throw Error}}function getTextTypeLength(textType){switch(textType){case"text":return 1024*64-1;case"mediumtext":return 1024*1024*16-1;case"longtext":return 1024*1024*1024*4-1}}function propToZodTypeDef(prop,injectImportKeys){var stmt;if((0,_types.isIntegerProp)(prop)){stmt="".concat(prop.name,": z.int()")}else if((0,_types.isBigIntegerProp)(prop)){stmt="".concat(prop.name,": z.bigint()")}else if((0,_types.isTextProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(getTextTypeLength(prop.textType),")")}else if((0,_types.isEnumProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isStringProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(prop.length,")")}else if((0,_types.isDecimalProp)(prop)){stmt="".concat(prop.name,": z.string()")}else if((0,_types.isFloatProp)(prop)||(0,_types.isDoubleProp)(prop)){stmt="".concat(prop.name,": z.number()")}else if((0,_types.isBooleanProp)(prop)){stmt="".concat(prop.name,": z.boolean()")}else if((0,_types.isDateProp)(prop)){stmt="".concat(prop.name,": z.string().length(10)")}else if((0,_types.isTimeProp)(prop)){stmt="".concat(prop.name,": z.string().length(8)")}else if((0,_types.isDateTimeProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isTimestampProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isJsonProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isUuidProp)(prop)){stmt="".concat(prop.name,": z.uuid()")}else if((0,_types.isVirtualProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isRelationProp)(prop)){if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){stmt="".concat(prop.name,"_id: z.int()")}else{return"// ".concat(prop.name,": ").concat(prop.relationType," ").concat(prop.with)}}else{return"// unable to resolve"}if(prop.unsigned){stmt+=".nonnegative()"}if(prop.nullable){stmt+=".nullable()"}return stmt+","}function zodTypeToZodCode(zt){switch(zt.def.type){case"string":return"z.string()";case"number":return"z.number()";case"bigint":return"z.bigint()";case"boolean":return"z.boolean()";case"date":return"z.date()";case"null":return"z.null()";case"undefined":return"z.undefined()";case"any":return"z.any()";case"unknown":return"z.unknown()";case"never":return"z.never()";case"nullable":return zodTypeToZodCode(zt.def.innerType)+".nullable()";case"default":var zDefaultDef=zt.def;return zodTypeToZodCode(zDefaultDef.innerType)+".default(".concat(zDefaultDef.defaultValue,")");case"record":var zRecordDef=zt.def;return"z.record(".concat(zodTypeToZodCode(zRecordDef.keyType),", ").concat(zodTypeToZodCode(zRecordDef.valueType),")");case"literal":var items=Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)});if(items.length===1){return"z.literal(".concat(items[0],")")}return"z.literal([".concat(items.join(", "),"])");case"union":return"z.union([".concat(zt.def.options.map(function(option){return zodTypeToZodCode(option)}).join(","),"])");case"enum":return"z.enum({".concat(Object.entries(zt.def.entries).map(function(param){var _param=_sliced_to_array(param,2),key=_param[0],val=_param[1];return typeof val==="string"?"".concat(key,': "').concat(val,'"'):"".concat(key,": ").concat(val)}).join(", "),"})");case"array":return"z.array(".concat(zodTypeToZodCode(zt.def.element),")");case"object":var shape=zt.shape;return["z.object({"].concat(_to_consumable_array(Object.keys(shape).map(function(key){return"".concat(key,": ").concat(zodTypeToZodCode(shape[key]),",")})),["})"]).join("\n");case"optional":return zodTypeToZodCode(zt.def.innerType)+".optional()";case"file":return"z.file()";case"intersection":var zIntersectionDef=zt.def;return"z.intersection(".concat(zodTypeToZodCode(zIntersectionDef.left),", ").concat(zodTypeToZodCode(zIntersectionDef.right),")");case"file":return"z.file()";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}function apiParamToTsCode(params,injectImportKeys){return params.map(function(param){return"".concat(param.name).concat(param.optional&&!param.defaultDef?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")}function apiParamToTsCodeAsObject(params,injectImportKeys){return"{ ".concat(params.map(function(param){return"".concat(param.name).concat(param.optional?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")," }")}function apiParamTypeToTsType(paramType,injectImportKeys){if(["string","number","boolean","true","false","null","undefined","void","any","unknown"].includes(paramType)){return paramType}else if(_types.ApiParamType.isObject(paramType)){return"{ ".concat(apiParamToTsCode(paramType.props,injectImportKeys)," }")}else if(_types.ApiParamType.isStringLiteral(paramType)){return'"'.concat(paramType.value,'"')}else if(_types.ApiParamType.isNumericLiteral(paramType)){return String(paramType.value)}else if(_types.ApiParamType.isUnion(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" | ")}else if(_types.ApiParamType.isIntersection(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" & ")}else if(_types.ApiParamType.isArray(paramType)){return apiParamTypeToTsType(paramType.elementsType,injectImportKeys)+"[]"}else if(_types.ApiParamType.isRef(paramType)){if(["Pick","Omit","Promise","Partial","Date"].includes(paramType.id)===false){injectImportKeys.push(paramType.id)}if(paramType.args===undefined||paramType.args.length===0){return paramType.id}else{return"".concat(paramType.id,"<").concat(paramType.args.map(function(arg){return apiParamTypeToTsType(arg,injectImportKeys)}).join(","),">")}}else if(_types.ApiParamType.isIndexedAccess(paramType)){return"".concat(apiParamTypeToTsType(paramType.object,injectImportKeys),"[").concat(apiParamTypeToTsType(paramType.index,injectImportKeys),"]")}else if(_types.ApiParamType.isTupleType(paramType)){return"[ ".concat(paramType.elements.map(function(elem){return apiParamTypeToTsType(elem,injectImportKeys)})," ]")}else if(_types.ApiParamType.isTypeParam(paramType)){return"<".concat(paramType.id).concat(paramType.constraint?" extends ".concat(apiParamTypeToTsType(paramType.constraint,injectImportKeys)):"",">")}else{throw new Error("resolve 불가 ApiParamType ".concat(paramType))}}function unwrapPromiseOnce(paramType){if(_types.ApiParamType.isPromise(paramType)){return paramType.args[0]}else{return paramType}}function serializeZodType(zt){switch(zt.def.type){case"object":return{type:"object",shape:Object.keys(zt.shape).reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,serializeZodType(zt.shape[key])))},{})};case"array":return{type:"array",element:serializeZodType(zt.def.element)};case"enum":return{type:"enum",values:zt.def.entries};case"string":return{type:"string",checks:zt.def.checks};case"number":return{type:"number",checks:zt.def.checks};case"boolean":return{type:"boolean"};case"nullable":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{nullable:true});case"optional":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{optional:true});case"any":return{type:"any"};case"record":return{type:"record",keyType:serializeZodType(zt.def.keyType),valueType:serializeZodType(zt.def.valueType)};case"union":return{type:"union",options:zt.def.options.map(function(option){return serializeZodType(option)})};default:throw new Error("Serialize 로직이 정의되지 않은 ZodType: ".concat(zt.def.type))}}function zodTypeToTsTypeDef(zt){switch(zt.def.type){case"string":case"number":case"boolean":case"bigint":case"date":case"null":case"undefined":case"any":case"unknown":case"never":return zt.def.type;case"nullable":return zodTypeToTsTypeDef(zt.def.innerType)+" | null";case"default":return zodTypeToTsTypeDef(zt.def.innerType);case"record":var recordType=zt;return"{ [ key: ".concat(zodTypeToTsTypeDef(recordType.def.keyType)," ]: ").concat(zodTypeToTsTypeDef(recordType.def.valueType),"}");case"literal":return Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)}).join(" | ");case"union":return"".concat(zt.options.map(function(option){return zodTypeToTsTypeDef(option)}).join(" | "));case"enum":return"".concat(zt.options.map(function(val){return'"'.concat(val,'"')}).join(" | "));case"array":return"".concat(zodTypeToTsTypeDef(zt.element),"[]");case"object":var shape=zt.shape;return["{"].concat(_to_consumable_array(Object.keys(shape).map(function(key){if(shape[key].def.type==="optional"){return"".concat(key,"?: ").concat(zodTypeToTsTypeDef(shape[key].def.innerType),",")}else{return"".concat(key,": ").concat(zodTypeToTsTypeDef(shape[key]),",")}})),["}"]).join("\n");case"optional":return zodTypeToTsTypeDef(zt.def.innerType)+" | undefined";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}
2
- //# sourceMappingURL=code-converters.js.map
1
+ import { z } from "zod";
2
+ import { ApiParamType, isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
3
+ /*
4
+ ExtendedApi 에서 ZodObject 리턴
5
+ */ export function getZodObjectFromApi(api, references = {}) {
6
+ if (api.typeParameters?.length > 0) {
7
+ api.typeParameters.map((typeParam)=>{
8
+ if (typeParam.constraint) {
9
+ let zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
10
+ references[typeParam.id] = zodType;
11
+ }
12
+ });
13
+ }
14
+ const ReqType = getZodObjectFromApiParams(api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_") // _로 시작하는 파라미터는 제외
15
+ )), references);
16
+ return ReqType;
17
+ }
18
+ /*
19
+ ZodObject를 통해 ApiParam 리턴
20
+ */ export function getZodObjectFromApiParams(apiParams, references = {}) {
21
+ return z.object(apiParams.reduce((r, param)=>{
22
+ let zodType = getZodTypeFromApiParamType(param.type, references);
23
+ if (param.optional) {
24
+ zodType = zodType.optional();
25
+ }
26
+ return {
27
+ ...r,
28
+ [param.name]: zodType
29
+ };
30
+ }, {}));
31
+ }
32
+ /*
33
+ ApiParamType으로 ZodType 컨버팅
34
+ */ export function getZodTypeFromApiParamType(paramType, references) {
35
+ switch(paramType){
36
+ case "string":
37
+ return z.string();
38
+ case "number":
39
+ return z.number();
40
+ case "boolean":
41
+ return z.boolean();
42
+ default:
43
+ const advType = paramType;
44
+ switch(advType.t){
45
+ case "string-literal":
46
+ case "numeric-literal":
47
+ return z.literal(advType.value);
48
+ case "object":
49
+ const objType = paramType;
50
+ return getZodObjectFromApiParams(objType.props);
51
+ case "array":
52
+ const arrType = paramType;
53
+ return z.array(getZodTypeFromApiParamType(arrType.elementsType, references));
54
+ case "ref":
55
+ const refType = paramType;
56
+ // Date 타입 처리
57
+ if (refType.id === "Date") {
58
+ return z.date();
59
+ }
60
+ // 객체 키 관리 유틸리티
61
+ if ([
62
+ "Pick",
63
+ "Omit"
64
+ ].includes(refType.id)) {
65
+ if (refType.args?.length !== 2) {
66
+ throw new Error(`잘못된 ${refType.id}`);
67
+ }
68
+ const [obj, literalOrUnion] = refType.args.map((arg)=>getZodTypeFromApiParamType(arg, references));
69
+ let keys = [];
70
+ if (literalOrUnion instanceof z.ZodUnion) {
71
+ keys = literalOrUnion.def.options.map((option)=>option.def.value);
72
+ } else {
73
+ keys = literalOrUnion.def.values;
74
+ }
75
+ const keyRecord = keys.reduce((result, key)=>{
76
+ return {
77
+ ...result,
78
+ [key]: true
79
+ };
80
+ }, {});
81
+ if (refType.id === "Pick") {
82
+ if (obj.pick) {
83
+ return obj.pick(keyRecord);
84
+ }
85
+ } else {
86
+ if (obj.omit) {
87
+ return obj.omit(keyRecord);
88
+ }
89
+ }
90
+ }
91
+ if ([
92
+ "Partial"
93
+ ].includes(refType.id)) {
94
+ if (refType.args?.length !== 1) {
95
+ throw new Error(`잘못된 ${refType.id}`);
96
+ }
97
+ const obj = getZodTypeFromApiParamType(refType.args[0], references);
98
+ return obj.partial();
99
+ }
100
+ const reference = references[refType.id];
101
+ if (reference === undefined) {
102
+ return z.string();
103
+ // throw new Error(`ref 참조 불가 ${refType.id}`);
104
+ }
105
+ return reference;
106
+ case "union":
107
+ const unionType = paramType;
108
+ // nullable 유니온
109
+ if (unionType.types.length === 2 && unionType.types.some((type)=>type === "null")) {
110
+ if (unionType.types[0] === "null") {
111
+ return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
112
+ } else {
113
+ return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
114
+ }
115
+ }
116
+ // 일반 유니온
117
+ return z.union(unionType.types.map((type)=>getZodTypeFromApiParamType(type, references)));
118
+ case "intersection":
119
+ const intersectionType = paramType;
120
+ return intersectionType.types.reduce((result, type, index)=>{
121
+ const resolvedType = getZodTypeFromApiParamType(type, references);
122
+ if (index === 0) {
123
+ return resolvedType;
124
+ } else {
125
+ return z.intersection(result, resolvedType);
126
+ }
127
+ }, z.unknown());
128
+ case "tuple-type":
129
+ const tupleType = paramType;
130
+ return z.tuple(tupleType.elements.map((elem)=>getZodTypeFromApiParamType(elem, references)));
131
+ }
132
+ return z.unknown();
133
+ }
134
+ }
135
+ export function propNodeToZodTypeDef(propNode, injectImportKeys) {
136
+ if (propNode.nodeType === "plain") {
137
+ return propToZodTypeDef(propNode.prop, injectImportKeys);
138
+ } else if (propNode.nodeType === "array") {
139
+ return [
140
+ propNode.prop ? `${propNode.prop.name}: ` : "",
141
+ "z.array(z.object({",
142
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
143
+ "",
144
+ "})),"
145
+ ].join("\n");
146
+ } else if (propNode.nodeType === "object") {
147
+ return [
148
+ propNode.prop ? `${propNode.prop.name}: ` : "",
149
+ "z.object({",
150
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
151
+ "",
152
+ `})${propNode.prop && propNode.prop.nullable ? ".nullable()" : ""},`
153
+ ].join("\n");
154
+ } else {
155
+ throw Error;
156
+ }
157
+ }
158
+ export function getTextTypeLength(textType) {
159
+ switch(textType){
160
+ case "text":
161
+ return 1024 * 64 - 1;
162
+ case "mediumtext":
163
+ return 1024 * 1024 * 16 - 1;
164
+ case "longtext":
165
+ return 1024 * 1024 * 1024 * 4 - 1;
166
+ }
167
+ }
168
+ export function propToZodTypeDef(prop, injectImportKeys) {
169
+ let stmt;
170
+ if (isIntegerProp(prop)) {
171
+ stmt = `${prop.name}: z.int()`;
172
+ } else if (isBigIntegerProp(prop)) {
173
+ stmt = `${prop.name}: z.bigint()`;
174
+ } else if (isTextProp(prop)) {
175
+ stmt = `${prop.name}: z.string().max(${getTextTypeLength(prop.textType)})`;
176
+ } else if (isEnumProp(prop)) {
177
+ stmt = `${prop.name}: ${prop.id}`;
178
+ injectImportKeys.push(prop.id);
179
+ } else if (isStringProp(prop)) {
180
+ stmt = `${prop.name}: z.string().max(${prop.length})`;
181
+ } else if (isDecimalProp(prop)) {
182
+ stmt = `${prop.name}: z.string()`;
183
+ } else if (isFloatProp(prop) || isDoubleProp(prop)) {
184
+ stmt = `${prop.name}: z.number()`;
185
+ } else if (isBooleanProp(prop)) {
186
+ stmt = `${prop.name}: z.boolean()`;
187
+ } else if (isDateProp(prop)) {
188
+ stmt = `${prop.name}: z.string().length(10)`;
189
+ } else if (isTimeProp(prop)) {
190
+ stmt = `${prop.name}: z.string().length(8)`;
191
+ } else if (isDateTimeProp(prop)) {
192
+ stmt = `${prop.name}: z.date()`;
193
+ } else if (isTimestampProp(prop)) {
194
+ stmt = `${prop.name}: z.date()`;
195
+ } else if (isJsonProp(prop)) {
196
+ stmt = `${prop.name}: ${prop.id}`;
197
+ injectImportKeys.push(prop.id);
198
+ } else if (isUuidProp(prop)) {
199
+ stmt = `${prop.name}: z.uuid()`;
200
+ } else if (isVirtualProp(prop)) {
201
+ stmt = `${prop.name}: ${prop.id}`;
202
+ injectImportKeys.push(prop.id);
203
+ } else if (isRelationProp(prop)) {
204
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
205
+ stmt = `${prop.name}_id: z.int()`;
206
+ } else {
207
+ // 그외 relation 케이스 제외
208
+ return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
209
+ }
210
+ } else {
211
+ return "// unable to resolve";
212
+ }
213
+ if (prop.unsigned) {
214
+ stmt += ".nonnegative()";
215
+ }
216
+ if (prop.nullable) {
217
+ stmt += ".nullable()";
218
+ }
219
+ return stmt + ",";
220
+ }
221
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
222
+ export function zodTypeToZodCode(zt) {
223
+ switch(zt.def.type){
224
+ case "string":
225
+ return "z.string()";
226
+ case "number":
227
+ return "z.number()";
228
+ case "bigint":
229
+ return "z.bigint()";
230
+ case "boolean":
231
+ return "z.boolean()";
232
+ case "date":
233
+ return "z.date()";
234
+ case "null":
235
+ return "z.null()";
236
+ case "undefined":
237
+ return "z.undefined()";
238
+ case "any":
239
+ return "z.any()";
240
+ case "unknown":
241
+ return "z.unknown()";
242
+ case "never":
243
+ return "z.never()";
244
+ case "nullable":
245
+ return zodTypeToZodCode(zt.def.innerType) + ".nullable()";
246
+ case "default":
247
+ const zDefaultDef = zt.def;
248
+ return zodTypeToZodCode(zDefaultDef.innerType) + `.default(${zDefaultDef.defaultValue})`;
249
+ case "record":
250
+ const zRecordDef = zt.def;
251
+ return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
252
+ case "literal":
253
+ const items = Array.from(zt.values).map((value)=>{
254
+ if (typeof value === "string") {
255
+ return `"${value}"`;
256
+ }
257
+ if (value === null) {
258
+ return `null`;
259
+ }
260
+ if (value === undefined) {
261
+ return `undefined`;
262
+ }
263
+ return `${value}`;
264
+ });
265
+ if (items.length === 1) {
266
+ return `z.literal(${items[0]})`;
267
+ }
268
+ return `z.literal([${items.join(", ")}])`;
269
+ case "union":
270
+ return `z.union([${zt.def.options.map((option)=>zodTypeToZodCode(option)).join(",")}])`;
271
+ case "enum":
272
+ // NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
273
+ return `z.enum({${Object.entries(zt.def.entries).map(([key, val])=>typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
274
+ case "array":
275
+ return `z.array(${zodTypeToZodCode(zt.def.element)})`;
276
+ case "object":
277
+ const shape = zt.shape;
278
+ return [
279
+ "z.object({",
280
+ ...Object.keys(shape).map((key)=>`${key}: ${zodTypeToZodCode(shape[key])},`),
281
+ "})"
282
+ ].join("\n");
283
+ case "optional":
284
+ return zodTypeToZodCode(zt.def.innerType) + ".optional()";
285
+ case "file":
286
+ return `z.file()`;
287
+ case "intersection":
288
+ const zIntersectionDef = zt.def;
289
+ return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
290
+ case "file":
291
+ return `z.file()`;
292
+ default:
293
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
294
+ }
295
+ }
296
+ export function apiParamToTsCode(params, injectImportKeys) {
297
+ return params.map((param)=>{
298
+ return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
299
+ }).join(", ");
300
+ }
301
+ export function apiParamToTsCodeAsObject(params, injectImportKeys) {
302
+ return `{ ${params.map((param)=>`${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
303
+ }
304
+ export function apiParamTypeToTsType(paramType, injectImportKeys) {
305
+ if ([
306
+ "string",
307
+ "number",
308
+ "boolean",
309
+ "true",
310
+ "false",
311
+ "null",
312
+ "undefined",
313
+ "void",
314
+ "any",
315
+ "unknown"
316
+ ].includes(paramType)) {
317
+ return paramType;
318
+ } else if (ApiParamType.isObject(paramType)) {
319
+ return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
320
+ } else if (ApiParamType.isStringLiteral(paramType)) {
321
+ return `"${paramType.value}"`;
322
+ } else if (ApiParamType.isNumericLiteral(paramType)) {
323
+ return String(paramType.value);
324
+ } else if (ApiParamType.isUnion(paramType)) {
325
+ return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
326
+ } else if (ApiParamType.isIntersection(paramType)) {
327
+ return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
328
+ } else if (ApiParamType.isArray(paramType)) {
329
+ return apiParamTypeToTsType(paramType.elementsType, injectImportKeys) + "[]";
330
+ } else if (ApiParamType.isRef(paramType)) {
331
+ if ([
332
+ "Pick",
333
+ "Omit",
334
+ "Promise",
335
+ "Partial",
336
+ "Date"
337
+ ].includes(paramType.id) === false) {
338
+ // importKeys 인젝션
339
+ injectImportKeys.push(paramType.id);
340
+ }
341
+ if (paramType.args === undefined || paramType.args.length === 0) {
342
+ return paramType.id;
343
+ } else {
344
+ return `${paramType.id}<${paramType.args.map((arg)=>apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
345
+ }
346
+ } else if (ApiParamType.isIndexedAccess(paramType)) {
347
+ return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
348
+ } else if (ApiParamType.isTupleType(paramType)) {
349
+ return `[ ${paramType.elements.map((elem)=>apiParamTypeToTsType(elem, injectImportKeys))} ]`;
350
+ } else if (ApiParamType.isTypeParam(paramType)) {
351
+ return `<${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}>`;
352
+ } else {
353
+ throw new Error(`resolve 불가 ApiParamType ${paramType}`);
354
+ }
355
+ }
356
+ export function unwrapPromiseOnce(paramType) {
357
+ if (ApiParamType.isPromise(paramType)) {
358
+ return paramType.args[0];
359
+ } else {
360
+ return paramType;
361
+ }
362
+ }
363
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
364
+ export function serializeZodType(zt) {
365
+ switch(zt.def.type){
366
+ case "object":
367
+ return {
368
+ type: "object",
369
+ shape: Object.keys(zt.shape).reduce((result, key)=>{
370
+ return {
371
+ ...result,
372
+ [key]: serializeZodType(zt.shape[key])
373
+ };
374
+ }, {})
375
+ };
376
+ case "array":
377
+ return {
378
+ type: "array",
379
+ element: serializeZodType(zt.def.element)
380
+ };
381
+ case "enum":
382
+ return {
383
+ type: "enum",
384
+ values: zt.def.entries
385
+ };
386
+ case "string":
387
+ return {
388
+ type: "string",
389
+ checks: zt.def.checks
390
+ };
391
+ case "number":
392
+ return {
393
+ type: "number",
394
+ checks: zt.def.checks
395
+ };
396
+ case "boolean":
397
+ return {
398
+ type: "boolean"
399
+ };
400
+ case "nullable":
401
+ return {
402
+ ...serializeZodType(zt.def.innerType),
403
+ nullable: true
404
+ };
405
+ case "optional":
406
+ return {
407
+ ...serializeZodType(zt.def.innerType),
408
+ optional: true
409
+ };
410
+ case "any":
411
+ return {
412
+ type: "any"
413
+ };
414
+ case "record":
415
+ return {
416
+ type: "record",
417
+ keyType: serializeZodType(zt.def.keyType),
418
+ valueType: serializeZodType(zt.def.valueType)
419
+ };
420
+ case "union":
421
+ return {
422
+ type: "union",
423
+ options: zt.def.options.map((option)=>serializeZodType(option))
424
+ };
425
+ default:
426
+ throw new Error(`Serialize 로직이 정의되지 않은 ZodType: ${zt.def.type}`);
427
+ }
428
+ }
429
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
430
+ export function zodTypeToTsTypeDef(zt) {
431
+ switch(zt.def.type){
432
+ case "string":
433
+ case "number":
434
+ case "boolean":
435
+ case "bigint":
436
+ case "date":
437
+ case "null":
438
+ case "undefined":
439
+ case "any":
440
+ case "unknown":
441
+ case "never":
442
+ return zt.def.type;
443
+ case "nullable":
444
+ return zodTypeToTsTypeDef(zt.def.innerType) + " | null";
445
+ case "default":
446
+ return zodTypeToTsTypeDef(zt.def.innerType);
447
+ case "record":
448
+ const recordType = zt;
449
+ return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
450
+ case "literal":
451
+ return Array.from(zt.values).map((value)=>{
452
+ if (typeof value === "string") {
453
+ return `"${value}"`;
454
+ }
455
+ if (value === null) {
456
+ return `null`;
457
+ }
458
+ if (value === undefined) {
459
+ return `undefined`;
460
+ }
461
+ return `${value}`;
462
+ }).join(" | ");
463
+ case "union":
464
+ return `${zt.options.map((option)=>zodTypeToTsTypeDef(option)).join(" | ")}`;
465
+ case "enum":
466
+ return `${zt.options.map((val)=>`"${val}"`).join(" | ")}`;
467
+ case "array":
468
+ return `${zodTypeToTsTypeDef(zt.element)}[]`;
469
+ case "object":
470
+ const shape = zt.shape;
471
+ return [
472
+ "{",
473
+ ...Object.keys(shape).map((key)=>{
474
+ if (shape[key].def.type === "optional") {
475
+ return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
476
+ } else {
477
+ return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
478
+ }
479
+ }),
480
+ "}"
481
+ ].join("\n");
482
+ case "optional":
483
+ return zodTypeToTsTypeDef(zt.def.innerType) + " | undefined";
484
+ default:
485
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
486
+ }
487
+ }
488
+
489
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29kZS1jb252ZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7ICRab2RMb29zZVNoYXBlIH0gZnJvbSBcInpvZC92NC9jb3JlXCJcbmltcG9ydCB7XG4gIEFwaVBhcmFtLFxuICBBcGlQYXJhbVR5cGUsXG4gIEVudGl0eVByb3AsXG4gIEVudGl0eVByb3BOb2RlLFxuICBUZXh0UHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlclByb3AsXG4gIGlzQm9vbGVhblByb3AsXG4gIGlzRGF0ZVByb3AsXG4gIGlzRGF0ZVRpbWVQcm9wLFxuICBpc0RlY2ltYWxQcm9wLFxuICBpc0RvdWJsZVByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzRmxvYXRQcm9wLFxuICBpc0ludGVnZXJQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdQcm9wLFxuICBpc1RleHRQcm9wLFxuICBpc1RpbWVQcm9wLFxuICBpc1RpbWVzdGFtcFByb3AsXG4gIGlzVXVpZFByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IGNvcmUgfSBmcm9tIFwiem9kL3Y0XCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZFJlY29yZCA9IHouWm9kUmVjb3JkPHouWm9kU3RyaW5nIHwgei5ab2ROdW1iZXIgfCB6LlpvZFN5bWJvbCwgei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2REZWZhdWx0ID0gei5ab2REZWZhdWx0PHouWm9kVHlwZT47XG50eXBlIEFueVpvZExpdGVyYWwgPSB6LlpvZExpdGVyYWw8Y29yZS51dGlsLkxpdGVyYWw+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xuXG4vKlxuICBFeHRlbmRlZEFwaSDsl5DshJwgWm9kT2JqZWN0IOumrO2EtFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RPYmplY3RGcm9tQXBpKFxuICBhcGk6IEV4dGVuZGVkQXBpLFxuICByZWZlcmVuY2VzOiB7XG4gICAgW2lkOiBzdHJpbmddOiBBbnlab2RPYmplY3Q7XG4gIH0gPSB7fVxuKSB7XG4gIGlmIChhcGkudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICBhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0eXBlUGFyYW0pID0+IHtcbiAgICAgIGlmICh0eXBlUGFyYW0uY29uc3RyYWludCkge1xuICAgICAgICBsZXQgem9kVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICAgICAgICAgIHR5cGVQYXJhbS5jb25zdHJhaW50LFxuICAgICAgICAgIHJlZmVyZW5jZXNcbiAgICAgICAgKTtcbiAgICAgICAgKHJlZmVyZW5jZXNbdHlwZVBhcmFtLmlkXSBhcyBhbnkpID0gem9kVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKFxuICAgIGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIShwYXJhbS5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSAvLyBf66GcIOyLnOyeke2VmOuKlCDtjIzrnbzrr7jthLDripQg7KCc7Jm4XG4gICAgKSxcbiAgICByZWZlcmVuY2VzXG4gICk7XG4gIHJldHVybiBSZXFUeXBlO1xufVxuXG4vKlxuICBab2RPYmplY3Trpbwg7Ya17ZW0IEFwaVBhcmFtIOumrO2EtFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKFxuICBhcGlQYXJhbXM6IEFwaVBhcmFtW10sXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IEFueVpvZE9iamVjdDtcbiAgfSA9IHt9XG4pOiB6LlpvZE9iamVjdCB7XG4gIHJldHVybiB6Lm9iamVjdChcbiAgICBhcGlQYXJhbXMucmVkdWNlKChyLCBwYXJhbSkgPT4ge1xuICAgICAgbGV0IHpvZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShwYXJhbS50eXBlLCByZWZlcmVuY2VzKTtcbiAgICAgIGlmIChwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICB6b2RUeXBlID0gem9kVHlwZS5vcHRpb25hbCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucixcbiAgICAgICAgW3BhcmFtLm5hbWVdOiB6b2RUeXBlLFxuICAgICAgfTtcbiAgICB9LCB7fSlcbiAgKTtcbn1cblxuLypcbiAgQXBpUGFyYW1UeXBl7Jy866GcIFpvZFR5cGUg7Luo67KE7YyFXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICBwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogQW55Wm9kT2JqZWN0O1xuICB9XG4pOiB6LlpvZFR5cGU8dW5rbm93bj4ge1xuICBzd2l0Y2ggKHBhcmFtVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiB6LnN0cmluZygpO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB6Lm51bWJlcigpO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gei5ib29sZWFuKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnN0IGFkdlR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmcgfTtcbiAgICAgIHN3aXRjaCAoYWR2VHlwZS50KSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmctbGl0ZXJhbFwiOlxuICAgICAgICBjYXNlIFwibnVtZXJpYy1saXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIHoubGl0ZXJhbCgoYWR2VHlwZSBhcyBhbnkpLnZhbHVlKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGNvbnN0IG9ialR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHByb3BzOiBBcGlQYXJhbVtdIH07XG4gICAgICAgICAgcmV0dXJuIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMob2JqVHlwZS5wcm9wcyk7XG4gICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgIGNvbnN0IGFyclR5cGUgPSBwYXJhbVR5cGUgYXMge1xuICAgICAgICAgICAgdDogc3RyaW5nO1xuICAgICAgICAgICAgZWxlbWVudHNUeXBlOiBBcGlQYXJhbVR5cGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gei5hcnJheShcbiAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyclR5cGUuZWxlbWVudHNUeXBlLCByZWZlcmVuY2VzKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICBjb25zdCByZWZUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIERhdGUg7YOA7J6FIOyymOumrFxuICAgICAgICAgIGlmIChyZWZUeXBlLmlkID09PSBcIkRhdGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHouZGF0ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOqwneyytCDtgqQg6rSA66asIOycoO2LuOumrO2LsFxuICAgICAgICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFtvYmosIGxpdGVyYWxPclVuaW9uXSA9IHJlZlR5cGUuYXJncyEubWFwKChhcmcpID0+XG4gICAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyZywgcmVmZXJlbmNlcylcbiAgICAgICAgICAgICkgYXMgW0FueVpvZE9iamVjdCwgei5ab2RVbmlvbjxhbnk+IHwgQW55Wm9kTGl0ZXJhbF07XG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZTogc3RyaW5nIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAga2V5cyA9IChsaXRlcmFsT3JVbmlvbiBhcyB6LlpvZExpdGVyYWw8c3RyaW5nPikuZGVmLnZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleVJlY29yZCA9IGtleXMucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgICBba2V5XTogdHJ1ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIHt9IGFzIGFueSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmlkID09PSBcIlBpY2tcIikge1xuICAgICAgICAgICAgICBpZiAob2JqLnBpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnBpY2soa2V5UmVjb3JkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5vbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5vbWl0KGtleVJlY29yZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFtcIlBhcnRpYWxcIl0uaW5jbHVkZXMocmVmVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmFyZ3M/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvYmogPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShyZWZUeXBlLmFyZ3NbMF0sIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgcmV0dXJuIChvYmogYXMgYW55KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tyZWZUeXBlLmlkXTtcbiAgICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB6LnN0cmluZygpO1xuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGByZWYg7LC47KGwIOu2iOqwgCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWZlcmVuY2U7XG4gICAgICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoXG4gICAgICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzWzFdLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICAgICAgICAgICAgICAgIHVuaW9uVHlwZS50eXBlc1swXSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzXG4gICAgICAgICAgICAgICkubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDsnbzrsJgg7Jyg64uI7JioXG4gICAgICAgICAgcmV0dXJuIHoudW5pb24oXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMubWFwKCh0eXBlKSA9PlxuICAgICAgICAgICAgICBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlLCByZWZlcmVuY2VzKVxuICAgICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoKHJlc3VsdCwgdHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFR5cGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0IGFzIGFueSwgcmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB6LnVua25vd24oKSBhcyBhbnkpIGFzIGFueTtcbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjpcbiAgICAgICAgICBjb25zdCB0dXBsZVR5cGUgPSBwYXJhbVR5cGUgYXMgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZTtcbiAgICAgICAgICByZXR1cm4gei50dXBsZShcbiAgICAgICAgICAgIHR1cGxlVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+XG4gICAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGVsZW0sIHJlZmVyZW5jZXMpXG4gICAgICAgICAgICApIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gei51bmtub3duKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKFxuICBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+XG4gICAgICAgICAgcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cylcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PlxuICAgICAgICAgIHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wICYmIHByb3BOb2RlLnByb3AubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dFR5cGVMZW5ndGgodGV4dFR5cGU6IFRleHRQcm9wW1widGV4dFR5cGVcIl0pOiBudW1iZXIge1xuICBzd2l0Y2ggKHRleHRUeXBlKSB7XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIHJldHVybiAxMDI0ICogNjQgLSAxO1xuICAgIGNhc2UgXCJtZWRpdW10ZXh0XCI6XG4gICAgICByZXR1cm4gMTAyNCAqIDEwMjQgKiAxNiAtIDE7XG4gICAgY2FzZSBcImxvbmd0ZXh0XCI6XG4gICAgICByZXR1cm4gMTAyNCAqIDEwMjQgKiAxMDI0ICogNCAtIDE7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYoXG4gIHByb3A6IEVudGl0eVByb3AsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzVGV4dFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtnZXRUZXh0VHlwZUxlbmd0aChwcm9wLnRleHRUeXBlKX0pYDtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1Byb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgfSBlbHNlIGlmIChpc0RlY2ltYWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzRmxvYXRQcm9wKHByb3ApIHx8IGlzRG91YmxlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubGVuZ3RoKDEwKWA7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmxlbmd0aCg4KWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlVGltZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzVGltZXN0YW1wUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouaW50KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDqt7jsmbggcmVsYXRpb24g7LyA7J207IqkIOygnOyZuFxuICAgICAgcmV0dXJuIGAvLyAke3Byb3AubmFtZX06ICR7cHJvcC5yZWxhdGlvblR5cGV9ICR7cHJvcC53aXRofWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi8vIHVuYWJsZSB0byByZXNvbHZlXCI7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgcmV0dXJuIHN0bXQgKyBcIixcIjtcbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSkgKyBcIi5udWxsYWJsZSgpXCI7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHpvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKSArXG4gICAgICAgIGAuZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGVcbiAgICAgICl9KWA7XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPGFueT4pLnZhbHVlcykubWFwKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24pKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIGFueSkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGBcbiAgICAgICAgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSkgKyBcIi5vcHRpb25hbCgpXCI7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjpcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1Ub1RzQ29kZShcbiAgcGFyYW1zOiBBcGlQYXJhbVtdLFxuICBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtc1xuICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICByZXR1cm4gYCR7cGFyYW0ubmFtZX0ke1xuICAgICAgICBwYXJhbS5vcHRpb25hbCAmJiAhcGFyYW0uZGVmYXVsdERlZiA/IFwiP1wiIDogXCJcIlxuICAgICAgfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbS50eXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ke1xuICAgICAgICBwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwiXG4gICAgICB9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3QoXG4gIHBhcmFtczogQXBpUGFyYW1bXSxcbiAgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIHJldHVybiBgeyAke3BhcmFtc1xuICAgIC5tYXAoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgIGAke3BhcmFtLm5hbWV9JHtwYXJhbS5vcHRpb25hbCA/IFwiP1wiIDogXCJcIn06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICAgICAgcGFyYW0udHlwZSxcbiAgICAgICAgICBpbmplY3RJbXBvcnRLZXlzXG4gICAgICAgICl9JHtwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwifWBcbiAgICApXG4gICAgLmpvaW4oXCIsIFwiKX0gfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgcGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBpZiAoXG4gICAgW1xuICAgICAgXCJzdHJpbmdcIixcbiAgICAgIFwibnVtYmVyXCIsXG4gICAgICBcImJvb2xlYW5cIixcbiAgICAgIFwidHJ1ZVwiLFxuICAgICAgXCJmYWxzZVwiLFxuICAgICAgXCJudWxsXCIsXG4gICAgICBcInVuZGVmaW5lZFwiLFxuICAgICAgXCJ2b2lkXCIsXG4gICAgICBcImFueVwiLFxuICAgICAgXCJ1bmtub3duXCIsXG4gICAgXS5pbmNsdWRlcyhwYXJhbVR5cGUgYXMgc3RyaW5nKVxuICApIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlIGFzIHN0cmluZztcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNPYmplY3QocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgeyAke2FwaVBhcmFtVG9Uc0NvZGUocGFyYW1UeXBlLnByb3BzLCBpbmplY3RJbXBvcnRLZXlzKX0gfWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzU3RyaW5nTGl0ZXJhbChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGBcIiR7cGFyYW1UeXBlLnZhbHVlfVwiYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNOdW1lcmljTGl0ZXJhbChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIFN0cmluZyhwYXJhbVR5cGUudmFsdWUpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1VuaW9uKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLnR5cGVzXG4gICAgICAubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlc1xuICAgICAgLm1hcCgodHlwZSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAuam9pbihcIiAmIFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNBcnJheShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5lbGVtZW50c1R5cGUsIGluamVjdEltcG9ydEtleXMpICsgXCJbXVwiXG4gICAgKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNSZWYocGFyYW1UeXBlKSkge1xuICAgIGlmIChcbiAgICAgIFtcIlBpY2tcIiwgXCJPbWl0XCIsIFwiUHJvbWlzZVwiLCBcIlBhcnRpYWxcIiwgXCJEYXRlXCJdLmluY2x1ZGVzKHBhcmFtVHlwZS5pZCkgPT09XG4gICAgICBmYWxzZVxuICAgICkge1xuICAgICAgLy8gaW1wb3J0S2V5cyDsnbjsoJ3shZhcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwYXJhbVR5cGUuaWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1UeXBlLmFyZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVR5cGUuYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJhbVR5cGUuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtwYXJhbVR5cGUuaWR9PCR7cGFyYW1UeXBlLmFyZ3NcbiAgICAgICAgLm1hcCgoYXJnKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShhcmcsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9PmA7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0luZGV4ZWRBY2Nlc3MocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgIHBhcmFtVHlwZS5vYmplY3QsXG4gICAgICBpbmplY3RJbXBvcnRLZXlzXG4gICAgKX1bJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuaW5kZXgsIGluamVjdEltcG9ydEtleXMpfV1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1R1cGxlVHlwZShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGBbICR7cGFyYW1UeXBlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT5cbiAgICAgIGFwaVBhcmFtVHlwZVRvVHNUeXBlKGVsZW0sIGluamVjdEltcG9ydEtleXMpXG4gICAgKX0gXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHlwZVBhcmFtKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYDwke3BhcmFtVHlwZS5pZH0ke1xuICAgICAgcGFyYW1UeXBlLmNvbnN0cmFpbnRcbiAgICAgICAgPyBgIGV4dGVuZHMgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICAgIHBhcmFtVHlwZS5jb25zdHJhaW50LFxuICAgICAgICAgICAgaW5qZWN0SW1wb3J0S2V5c1xuICAgICAgICAgICl9YFxuICAgICAgICA6IFwiXCJcbiAgICB9PmA7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgCBBcGlQYXJhbVR5cGUgJHtwYXJhbVR5cGV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFByb21pc2VPbmNlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlKSB7XG4gIGlmIChBcGlQYXJhbVR5cGUuaXNQcm9taXNlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLmFyZ3MhWzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJhbVR5cGU7XG4gIH1cbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplWm9kVHlwZSh6dDogei5ab2RUeXBlKTogYW55IHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlOiBPYmplY3Qua2V5cygoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZSkucmVkdWNlKFxuICAgICAgICAgIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudDogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kQXJyYXkpLmRlZi5lbGVtZW50KSxcbiAgICAgIH07XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICB2YWx1ZXM6ICh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjaGVja3M6IHp0LmRlZi5jaGVja3MsXG4gICAgICB9O1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogenQuZGVmLmNoZWNrcyxcbiAgICAgIH07XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNlcmlhbGl6ZVpvZFR5cGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKSxcbiAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJhbnlcIixcbiAgICAgIH07XG4gICAgY2FzZSBcInJlY29yZFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWYua2V5VHlwZSksXG4gICAgICAgIHZhbHVlVHlwZTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWYudmFsdWVUeXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnM6ICh6dC5kZWYgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgICAgc2VyaWFsaXplWm9kVHlwZShvcHRpb24pXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTZXJpYWxpemUg66Gc7KeB7J20IOygleydmOuQmOyngCDslYrsnYAgWm9kVHlwZTogJHt6dC5kZWYudHlwZX1gXG4gICAgICApO1xuICB9XG59XG5cbi8vIFRPRE8oSGF6ZSwgMjUxMDMxKTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsIFwiZmlsZVwi7JeQIOuMgO2VnCDsp4Dsm5DsnbQg7ZWE7JqU7ZWoLlxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKSArIFwiIHwgbnVsbFwiO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKS5tYXAodmFsdWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KS5qb2luKFwiIHwgXCIpXG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKSArIFwiIHwgdW5kZWZpbmVkXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJ6IiwiQXBpUGFyYW1UeXBlIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0JpZ0ludGVnZXJQcm9wIiwiaXNCb29sZWFuUHJvcCIsImlzRGF0ZVByb3AiLCJpc0RhdGVUaW1lUHJvcCIsImlzRGVjaW1hbFByb3AiLCJpc0RvdWJsZVByb3AiLCJpc0VudW1Qcm9wIiwiaXNGbG9hdFByb3AiLCJpc0ludGVnZXJQcm9wIiwiaXNKc29uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzU3RyaW5nUHJvcCIsImlzVGV4dFByb3AiLCJpc1RpbWVQcm9wIiwiaXNUaW1lc3RhbXBQcm9wIiwiaXNVdWlkUHJvcCIsImlzVmlydHVhbFByb3AiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiYXBpIiwicmVmZXJlbmNlcyIsInR5cGVQYXJhbWV0ZXJzIiwibGVuZ3RoIiwibWFwIiwidHlwZVBhcmFtIiwiY29uc3RyYWludCIsInpvZFR5cGUiLCJnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSIsImlkIiwiUmVxVHlwZSIsImdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwicGFyYW0iLCJpc0NvbnRleHQiLCJ0eXBlIiwiaXNSZWZLbmV4Iiwib3B0aW9uYWwiLCJuYW1lIiwic3RhcnRzV2l0aCIsImFwaVBhcmFtcyIsIm9iamVjdCIsInJlZHVjZSIsInIiLCJwYXJhbVR5cGUiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwiYWR2VHlwZSIsInQiLCJsaXRlcmFsIiwidmFsdWUiLCJvYmpUeXBlIiwicHJvcHMiLCJhcnJUeXBlIiwiYXJyYXkiLCJlbGVtZW50c1R5cGUiLCJyZWZUeXBlIiwiZGF0ZSIsImluY2x1ZGVzIiwiYXJncyIsIkVycm9yIiwib2JqIiwibGl0ZXJhbE9yVW5pb24iLCJhcmciLCJrZXlzIiwiWm9kVW5pb24iLCJkZWYiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsdWVzIiwia2V5UmVjb3JkIiwicmVzdWx0Iiwia2V5IiwicGljayIsIm9taXQiLCJwYXJ0aWFsIiwicmVmZXJlbmNlIiwidW5kZWZpbmVkIiwidW5pb25UeXBlIiwidHlwZXMiLCJzb21lIiwibnVsbGFibGUiLCJ1bmlvbiIsImludGVyc2VjdGlvblR5cGUiLCJpbmRleCIsInJlc29sdmVkVHlwZSIsImludGVyc2VjdGlvbiIsInVua25vd24iLCJ0dXBsZVR5cGUiLCJ0dXBsZSIsImVsZW1lbnRzIiwiZWxlbSIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJpbmplY3RJbXBvcnRLZXlzIiwibm9kZVR5cGUiLCJwcm9wVG9ab2RUeXBlRGVmIiwicHJvcCIsImNoaWxkcmVuIiwiY2hpbGRQcm9wTm9kZSIsImpvaW4iLCJnZXRUZXh0VHlwZUxlbmd0aCIsInRleHRUeXBlIiwic3RtdCIsInB1c2giLCJoYXNKb2luQ29sdW1uIiwicmVsYXRpb25UeXBlIiwid2l0aCIsInVuc2lnbmVkIiwiem9kVHlwZVRvWm9kQ29kZSIsInp0IiwiaW5uZXJUeXBlIiwiekRlZmF1bHREZWYiLCJkZWZhdWx0VmFsdWUiLCJ6UmVjb3JkRGVmIiwia2V5VHlwZSIsInZhbHVlVHlwZSIsIml0ZW1zIiwiQXJyYXkiLCJmcm9tIiwiT2JqZWN0IiwiZW50cmllcyIsInZhbCIsImVsZW1lbnQiLCJzaGFwZSIsInpJbnRlcnNlY3Rpb25EZWYiLCJsZWZ0IiwicmlnaHQiLCJhcGlQYXJhbVRvVHNDb2RlIiwicGFyYW1zIiwiZGVmYXVsdERlZiIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwiYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiU3RyaW5nIiwiaXNVbmlvbiIsImlzSW50ZXJzZWN0aW9uIiwiaXNBcnJheSIsImlzUmVmIiwiaXNJbmRleGVkQWNjZXNzIiwiaXNUdXBsZVR5cGUiLCJpc1R5cGVQYXJhbSIsInVud3JhcFByb21pc2VPbmNlIiwiaXNQcm9taXNlIiwic2VyaWFsaXplWm9kVHlwZSIsImNoZWNrcyIsInpvZFR5cGVUb1RzVHlwZURlZiIsInJlY29yZFR5cGUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBRUVDLFlBQVksRUFJWkMsMEJBQTBCLEVBQzFCQyxn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