sonamu 0.10.11 → 0.10.13

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 (519) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +133 -29
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +13 -7
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +61 -36
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +276 -167
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/migration/types.d.ts +54 -0
  149. package/dist/migration/types.d.ts.map +1 -1
  150. package/dist/naite/naite-reporter.js +2 -2
  151. package/dist/naite/naite.d.ts +74 -15
  152. package/dist/naite/naite.d.ts.map +1 -1
  153. package/dist/naite/naite.js +5 -19
  154. package/dist/runtime-type.d.ts +6 -0
  155. package/dist/runtime-type.d.ts.map +1 -0
  156. package/dist/runtime-type.js +26 -0
  157. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  158. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  159. package/dist/ssr/hmr-opt-out.js +59 -0
  160. package/dist/ssr/renderer.d.ts.map +1 -1
  161. package/dist/ssr/renderer.js +4 -1
  162. package/dist/storage/base-file.js +14 -14
  163. package/dist/storage/buffered-file.d.ts +2 -2
  164. package/dist/storage/buffered-file.d.ts.map +1 -1
  165. package/dist/storage/buffered-file.js +12 -12
  166. package/dist/storage/s3-driver.d.ts.map +1 -1
  167. package/dist/storage/s3-driver.js +1 -1
  168. package/dist/storage/uploaded-file.d.ts +2 -2
  169. package/dist/storage/uploaded-file.d.ts.map +1 -1
  170. package/dist/storage/uploaded-file.js +8 -8
  171. package/dist/stream/sse.js +11 -11
  172. package/dist/stream/ws-core.d.ts +1 -1
  173. package/dist/stream/ws-core.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.d.ts +1 -1
  175. package/dist/stream/ws-delivery.d.ts.map +1 -1
  176. package/dist/stream/ws-delivery.js +6 -4
  177. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  178. package/dist/stream/ws-local-connection-store.js +4 -2
  179. package/dist/stream/ws-presence-store.js +1 -1
  180. package/dist/stream/ws-registry.d.ts +4 -4
  181. package/dist/stream/ws-registry.d.ts.map +1 -1
  182. package/dist/stream/ws-registry.js +4 -2
  183. package/dist/stream/ws-telemetry.d.ts +16 -12
  184. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  185. package/dist/stream/ws-telemetry.js +22 -18
  186. package/dist/stream/ws.d.ts +18 -12
  187. package/dist/stream/ws.d.ts.map +1 -1
  188. package/dist/stream/ws.js +26 -22
  189. package/dist/syncer/api-parser.js +1 -1
  190. package/dist/syncer/checksum.d.ts.map +1 -1
  191. package/dist/syncer/checksum.js +7 -8
  192. package/dist/syncer/code-generator.d.ts.map +1 -1
  193. package/dist/syncer/code-generator.js +13 -14
  194. package/dist/syncer/entity-operations.d.ts.map +1 -1
  195. package/dist/syncer/entity-operations.js +5 -6
  196. package/dist/syncer/file-copy.d.ts +5 -0
  197. package/dist/syncer/file-copy.d.ts.map +1 -0
  198. package/dist/syncer/file-copy.js +36 -0
  199. package/dist/syncer/file-patterns.d.ts +1 -0
  200. package/dist/syncer/file-patterns.d.ts.map +1 -1
  201. package/dist/syncer/file-patterns.js +5 -2
  202. package/dist/syncer/file-tracking.d.ts.map +1 -1
  203. package/dist/syncer/file-tracking.js +5 -4
  204. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  205. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  206. package/dist/syncer/filesystem-dependencies.js +53 -0
  207. package/dist/syncer/module-loader.d.ts +1 -1
  208. package/dist/syncer/module-loader.d.ts.map +1 -1
  209. package/dist/syncer/module-loader.js +6 -4
  210. package/dist/syncer/syncer-actions.d.ts +4 -0
  211. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  212. package/dist/syncer/syncer-actions.js +34 -17
  213. package/dist/syncer/syncer.d.ts +17 -6
  214. package/dist/syncer/syncer.d.ts.map +1 -1
  215. package/dist/syncer/syncer.js +71 -29
  216. package/dist/syncer/watcher.d.ts.map +1 -1
  217. package/dist/syncer/watcher.js +3 -3
  218. package/dist/tasks/decorator.d.ts +6 -6
  219. package/dist/tasks/decorator.d.ts.map +1 -1
  220. package/dist/tasks/decorator.js +4 -4
  221. package/dist/tasks/step-wrapper.d.ts +6 -4
  222. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  223. package/dist/tasks/step-wrapper.js +5 -5
  224. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  225. package/dist/tasks/workflow-manager.js +13 -7
  226. package/dist/template/entity-converter.d.ts +1 -1
  227. package/dist/template/entity-converter.d.ts.map +1 -1
  228. package/dist/template/entity-converter.js +2 -2
  229. package/dist/template/helpers.d.ts +8 -6
  230. package/dist/template/helpers.d.ts.map +1 -1
  231. package/dist/template/helpers.js +1 -1
  232. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  233. package/dist/template/implementations/generated.template.js +4 -4
  234. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  235. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_http.template.js +21 -21
  237. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  238. package/dist/template/implementations/generated_sso.template.js +6 -3
  239. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  240. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  241. package/dist/template/implementations/http_validators.template.js +127 -0
  242. package/dist/template/implementations/model.template.d.ts.map +1 -1
  243. package/dist/template/implementations/model.template.js +1 -1
  244. package/dist/template/implementations/queries.template.js +1 -1
  245. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  246. package/dist/template/implementations/sd.template.js +79 -39
  247. package/dist/template/implementations/services.template.d.ts.map +1 -1
  248. package/dist/template/implementations/services.template.js +6 -4
  249. package/dist/template/implementations/view_form.template.d.ts +6 -1
  250. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_form.template.js +23 -15
  252. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  253. package/dist/template/implementations/view_list.template.js +11 -6
  254. package/dist/template/template-manager.d.ts.map +1 -1
  255. package/dist/template/template-manager.js +9 -7
  256. package/dist/template/template-types.d.ts +12 -5
  257. package/dist/template/template-types.d.ts.map +1 -1
  258. package/dist/template/template-types.js +1 -1
  259. package/dist/template/template.d.ts +2 -2
  260. package/dist/template/template.d.ts.map +1 -1
  261. package/dist/template/template.js +6 -4
  262. package/dist/template/zod-converter.d.ts +0 -19
  263. package/dist/template/zod-converter.d.ts.map +1 -1
  264. package/dist/template/zod-converter.js +100 -84
  265. package/dist/testing/_relation-graph.d.ts.map +1 -1
  266. package/dist/testing/_relation-graph.js +2 -1
  267. package/dist/testing/bootstrap.d.ts.map +1 -1
  268. package/dist/testing/bootstrap.js +9 -6
  269. package/dist/testing/data-explorer.d.ts +32 -7
  270. package/dist/testing/data-explorer.d.ts.map +1 -1
  271. package/dist/testing/data-explorer.js +77 -31
  272. package/dist/testing/dev-test-routes.d.ts +8 -1
  273. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  274. package/dist/testing/dev-test-routes.js +125 -108
  275. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  276. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  277. package/dist/testing/dev-vitest-manager.js +24 -9
  278. package/dist/testing/faker-mappings.d.ts +412 -1
  279. package/dist/testing/faker-mappings.d.ts.map +1 -1
  280. package/dist/testing/faker-mappings.js +1 -1
  281. package/dist/testing/filesystem.d.ts +2 -0
  282. package/dist/testing/filesystem.d.ts.map +1 -0
  283. package/dist/testing/filesystem.js +7 -0
  284. package/dist/testing/fixture-generator.d.ts +25 -8
  285. package/dist/testing/fixture-generator.d.ts.map +1 -1
  286. package/dist/testing/fixture-generator.js +132 -73
  287. package/dist/testing/fixture-loader.d.ts +3 -1
  288. package/dist/testing/fixture-loader.d.ts.map +1 -1
  289. package/dist/testing/fixture-loader.js +1 -20
  290. package/dist/testing/fixture-manager.d.ts +8 -7
  291. package/dist/testing/fixture-manager.d.ts.map +1 -1
  292. package/dist/testing/fixture-manager.js +91 -59
  293. package/dist/testing/global-setup.d.ts.map +1 -1
  294. package/dist/testing/global-setup.js +5 -2
  295. package/dist/testing/index.d.ts +2 -0
  296. package/dist/testing/index.d.ts.map +1 -1
  297. package/dist/testing/index.js +6 -3
  298. package/dist/types/types.d.ts +101 -99
  299. package/dist/types/types.d.ts.map +1 -1
  300. package/dist/types/types.js +234 -225
  301. package/dist/ui/ai-api.d.ts.map +1 -1
  302. package/dist/ui/ai-api.js +1 -1
  303. package/dist/ui/ai-client.d.ts.map +1 -1
  304. package/dist/ui/ai-client.js +28 -18
  305. package/dist/ui/api.d.ts.map +1 -1
  306. package/dist/ui/api.js +146 -210
  307. package/dist/ui/async-route.d.ts +3 -0
  308. package/dist/ui/async-route.d.ts.map +1 -0
  309. package/dist/ui/async-route.js +12 -0
  310. package/dist/ui/cdd-service.d.ts +9 -7
  311. package/dist/ui/cdd-service.d.ts.map +1 -1
  312. package/dist/ui/cdd-service.js +7 -5
  313. package/dist/ui/migrations-api.d.ts +3 -0
  314. package/dist/ui/migrations-api.d.ts.map +1 -0
  315. package/dist/ui/migrations-api.js +215 -0
  316. package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
  317. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  318. package/dist/ui-web/index.html +2 -2
  319. package/dist/utils/formatter.d.ts.map +1 -1
  320. package/dist/utils/formatter.js +7 -5
  321. package/dist/utils/fs-utils.d.ts +3 -3
  322. package/dist/utils/fs-utils.d.ts.map +1 -1
  323. package/dist/utils/fs-utils.js +6 -6
  324. package/dist/utils/model.d.ts +3 -5
  325. package/dist/utils/model.d.ts.map +1 -1
  326. package/dist/utils/model.js +1 -1
  327. package/dist/utils/object-utils.d.ts +1 -1
  328. package/dist/utils/object-utils.d.ts.map +1 -1
  329. package/dist/utils/object-utils.js +17 -16
  330. package/dist/utils/process-utils.d.ts.map +1 -1
  331. package/dist/utils/process-utils.js +4 -2
  332. package/dist/utils/runtime-value.d.ts +13 -0
  333. package/dist/utils/runtime-value.d.ts.map +1 -0
  334. package/dist/utils/runtime-value.js +40 -0
  335. package/dist/utils/sql-parser.d.ts +8 -1
  336. package/dist/utils/sql-parser.d.ts.map +1 -1
  337. package/dist/utils/sql-parser.js +6 -3
  338. package/dist/utils/type-utils.d.ts.map +1 -1
  339. package/dist/utils/type-utils.js +10 -8
  340. package/dist/utils/utils.d.ts +2 -2
  341. package/dist/utils/utils.d.ts.map +1 -1
  342. package/dist/utils/utils.js +11 -8
  343. package/dist/utils/zod-error.d.ts.map +1 -1
  344. package/dist/utils/zod-error.js +7 -4
  345. package/dist/vector/chunking.d.ts.map +1 -1
  346. package/dist/vector/chunking.js +1 -1
  347. package/dist/vector/embedding.d.ts.map +1 -1
  348. package/dist/vector/embedding.js +1 -1
  349. package/dist/vector/types.d.ts +3 -2
  350. package/dist/vector/types.d.ts.map +1 -1
  351. package/package.json +11 -7
  352. package/src/ai/agents/agent.ts +5 -5
  353. package/src/ai/agents/types.ts +1 -1
  354. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  355. package/src/ai/providers/rtzr/error.ts +5 -3
  356. package/src/ai/providers/rtzr/model.ts +3 -2
  357. package/src/ai/providers/rtzr/options.ts +10 -5
  358. package/src/ai/providers/rtzr/provider.ts +10 -10
  359. package/src/ai/providers/rtzr/utils.ts +3 -1
  360. package/src/api/__tests__/config.test.ts +11 -21
  361. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  362. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  363. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  364. package/src/api/caster.ts +6 -8
  365. package/src/api/code-converters.ts +136 -36
  366. package/src/api/config.ts +62 -4
  367. package/src/api/context.ts +3 -3
  368. package/src/api/decorators.ts +28 -17
  369. package/src/api/http-validator.ts +149 -0
  370. package/src/api/sonamu.ts +459 -152
  371. package/src/api/websocket-helpers.ts +24 -17
  372. package/src/auth/audit-log/builders.ts +3 -2
  373. package/src/auth/audit-log/client-ip.ts +4 -2
  374. package/src/auth/audit-log/events.ts +15 -1
  375. package/src/auth/audit-log/plugin.ts +129 -200
  376. package/src/auth/audit-log-ingestor.ts +19 -15
  377. package/src/auth/auth-generator.ts +10 -5
  378. package/src/auth/better-auth-request.ts +4 -3
  379. package/src/auth/knex-adapter.ts +8 -2
  380. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  381. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  382. package/src/bin/__tests__/test-command.test.ts +9 -15
  383. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  384. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  385. package/src/bin/build-config.ts +167 -0
  386. package/src/bin/cli.ts +155 -38
  387. package/src/bin/compiler-policy.ts +35 -0
  388. package/src/bin/fixture.ts +14 -3
  389. package/src/bin/test-command.ts +74 -29
  390. package/src/bin/ts-loader-registration.ts +22 -4
  391. package/src/cache/decorator.ts +10 -3
  392. package/src/compress/compress.ts +17 -4
  393. package/src/cone/cone-generator.ts +34 -6
  394. package/src/database/__tests__/db.test.ts +1 -0
  395. package/src/database/__tests__/puri.test.ts +16 -15
  396. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  397. package/src/database/_batch_update.ts +1 -0
  398. package/src/database/base-model.ts +81 -50
  399. package/src/database/base-model.types.ts +6 -6
  400. package/src/database/db.ts +29 -19
  401. package/src/database/knex.ts +30 -17
  402. package/src/database/puri-subset.test-d.ts +17 -0
  403. package/src/database/puri.ts +181 -143
  404. package/src/database/puri.types.test-d.ts +31 -1
  405. package/src/database/puri.types.ts +23 -21
  406. package/src/database/upsert-builder.ts +75 -53
  407. package/src/dict/sd.ts +15 -5
  408. package/src/dict/sonamu-dictionary.ts +6 -6
  409. package/src/dict/utils.ts +9 -1
  410. package/src/entity/entity-manager.ts +26 -9
  411. package/src/entity/entity-template-cone.ts +5 -10
  412. package/src/entity/entity.ts +50 -34
  413. package/src/env.ts +7 -3
  414. package/src/exceptions/error-handler.ts +17 -2
  415. package/src/exceptions/so-exceptions.ts +26 -20
  416. package/src/filter/utils.ts +21 -11
  417. package/src/index.ts +3 -0
  418. package/src/logger/configure.ts +26 -18
  419. package/src/migration/__tests__/migrator.test.ts +50 -57
  420. package/src/migration/code-generation.ts +132 -104
  421. package/src/migration/index-where-predicate.ts +51 -24
  422. package/src/migration/migration-set.ts +11 -5
  423. package/src/migration/migrator.ts +392 -244
  424. package/src/migration/postgresql-schema-reader.ts +52 -47
  425. package/src/migration/slack-confirm.ts +17 -15
  426. package/src/migration/types.ts +57 -0
  427. package/src/naite/naite-reporter.ts +1 -1
  428. package/src/naite/naite.ts +97 -24
  429. package/src/runtime-type.ts +34 -0
  430. package/src/ssr/hmr-opt-out.ts +78 -0
  431. package/src/ssr/renderer.ts +6 -0
  432. package/src/storage/base-file.ts +13 -13
  433. package/src/storage/buffered-file.ts +11 -11
  434. package/src/storage/s3-driver.ts +4 -1
  435. package/src/storage/uploaded-file.ts +8 -8
  436. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  437. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  438. package/src/stream/__tests__/ws.test.ts +30 -6
  439. package/src/stream/sse.ts +12 -11
  440. package/src/stream/ws-core.ts +1 -1
  441. package/src/stream/ws-delivery.ts +16 -7
  442. package/src/stream/ws-local-connection-store.ts +2 -3
  443. package/src/stream/ws-presence-store.ts +6 -1
  444. package/src/stream/ws-registry.ts +16 -7
  445. package/src/stream/ws-telemetry.ts +66 -43
  446. package/src/stream/ws.ts +73 -39
  447. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  448. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  449. package/src/syncer/api-parser.ts +67 -27
  450. package/src/syncer/checksum.ts +17 -11
  451. package/src/syncer/code-generator.ts +25 -17
  452. package/src/syncer/entity-operations.ts +3 -5
  453. package/src/syncer/file-copy.ts +46 -0
  454. package/src/syncer/file-patterns.ts +11 -8
  455. package/src/syncer/file-tracking.ts +3 -4
  456. package/src/syncer/filesystem-dependencies.ts +73 -0
  457. package/src/syncer/module-loader.ts +8 -4
  458. package/src/syncer/syncer-actions.ts +56 -18
  459. package/src/syncer/syncer.ts +116 -43
  460. package/src/syncer/watcher.ts +8 -4
  461. package/src/tasks/decorator.ts +20 -12
  462. package/src/tasks/step-wrapper.ts +19 -9
  463. package/src/tasks/workflow-manager.ts +15 -9
  464. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  465. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  466. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  467. package/src/template/entity-converter.ts +5 -2
  468. package/src/template/helpers.ts +8 -9
  469. package/src/template/implementations/generated.template.ts +5 -4
  470. package/src/template/implementations/generated_http.template.ts +61 -15
  471. package/src/template/implementations/generated_sso.template.ts +15 -4
  472. package/src/template/implementations/http_validators.template.ts +175 -0
  473. package/src/template/implementations/model.template.ts +3 -1
  474. package/src/template/implementations/sd.template.ts +81 -41
  475. package/src/template/implementations/services.template.ts +2 -2
  476. package/src/template/implementations/view_form.template.ts +56 -39
  477. package/src/template/implementations/view_list.template.ts +31 -23
  478. package/src/template/template-manager.ts +15 -13
  479. package/src/template/template-types.ts +13 -5
  480. package/src/template/template.ts +4 -3
  481. package/src/template/zod-converter.ts +206 -91
  482. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  483. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  484. package/src/testing/_relation-graph.ts +4 -1
  485. package/src/testing/bootstrap.ts +12 -5
  486. package/src/testing/data-explorer.ts +102 -53
  487. package/src/testing/dev-test-routes.ts +87 -50
  488. package/src/testing/dev-vitest-manager.ts +88 -32
  489. package/src/testing/faker-mappings.ts +2 -2
  490. package/src/testing/filesystem.ts +1 -0
  491. package/src/testing/fixture-generator.ts +191 -131
  492. package/src/testing/fixture-loader.ts +5 -1
  493. package/src/testing/fixture-manager.ts +129 -90
  494. package/src/testing/global-setup.ts +7 -3
  495. package/src/testing/index.ts +5 -0
  496. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  497. package/src/types/types.ts +184 -158
  498. package/src/ui/ai-api.ts +9 -7
  499. package/src/ui/ai-client.ts +61 -56
  500. package/src/ui/api.ts +726 -770
  501. package/src/ui/async-route.ts +4 -0
  502. package/src/ui/cdd-service.ts +35 -12
  503. package/src/ui/migrations-api.ts +381 -0
  504. package/src/utils/formatter.ts +7 -3
  505. package/src/utils/fs-utils.ts +5 -5
  506. package/src/utils/model.ts +4 -5
  507. package/src/utils/object-utils.ts +32 -22
  508. package/src/utils/process-utils.ts +4 -1
  509. package/src/utils/runtime-value.ts +43 -0
  510. package/src/utils/sql-parser.ts +13 -6
  511. package/src/utils/type-utils.ts +9 -7
  512. package/src/utils/utils.ts +19 -21
  513. package/src/utils/zod-error.ts +4 -2
  514. package/src/vector/chunking.ts +6 -1
  515. package/src/vector/embedding.ts +2 -1
  516. package/src/vector/types.ts +4 -2
  517. package/tsdown.api.config.ts +5 -2
  518. package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
  519. package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
@@ -746,4 +746,4 @@ var init_sonamu_dictionary = __esmMin((() => {
746
746
  init_sonamu_dictionary();
747
747
  export { SonamuDictionary, init_sonamu_dictionary, sonamuDictionary };
748
748
 
749
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBmb3JtYXRDb2RlIH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdHRlclwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi9zZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaWN0RW50cnksXG4gIHR5cGUgRGljdGlvbmFyeVJlc3VsdCxcbiAgdHlwZSBEaWN0aW9uYXJ5Um93LFxuICB0eXBlIEVudGl0eUtleUluZm8sXG4gIHR5cGUgSTE4bkNvbmZpZyxcbiAgdHlwZSBJbXBvcnRSZXN1bHQsXG4gIHR5cGUgVXNhZ2VSZXN1bHQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogMC1iYXNlZCDsu6zrn7wg7J24642x7Iqk66W8IOyXkeyFgCDsu6zrn7wg66y47J6Q66GcIOuzgO2ZmCAoMCAtPiBcIkFcIiwgMjUgLT4gXCJaXCIsIDI2IC0+IFwiQUFcIilcbiAqL1xuZnVuY3Rpb24gY29sTGV0dGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IG4gPSBpbmRleDtcbiAgd2hpbGUgKG4gPj0gMCkge1xuICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyAobiAlIDI2KSkgKyByZXN1bHQ7XG4gICAgbiA9IE1hdGguZmxvb3IobiAvIDI2KSAtIDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDqtIDrpqwg7YG0656Y7IqkXG4gKiBpMThuIOuUleyFlOuEiOumrOydmCBDUlVEIOuwjyBFeGNlbCBpbXBvcnQvZXhwb3J066W8IOuLtOuLue2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvbmFtdURpY3Rpb25hcnkge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBDb21waWxlciBBUEnrpbwg7IKs7Jqp7ZWY7JesIGRpY3Qg7YyM7J28IO2MjOyLsVxuICAgKlxuICAgKiDsp4Dsm5Ag7Yyo7YS0OlxuICAgKiAtIGV4cG9ydCBkZWZhdWx0IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqIC0gZXhwb3J0IGRlZmF1bHQgZGVmaW5lTG9jYWxlKHsgLi4uIH0pO1xuICAgKiAtIOusuOyekOyXtCDqsJI6IFwia2V5XCI6IFwidmFsdWVcIiDrmJDripQga2V5OiBgdmFsdWVgXG4gICAqIC0g7ZWo7IiYIOqwkjogXCJrZXlcIjogKHBhcmFtOiBUeXBlKSA9PiBgdGVtcGxhdGVgXG4gICAqL1xuICBwYXJzZURpY3RGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtjIzsnbzsl5DshJwg7Yq57KCVIOydtOumhOydmCBjb25zdCDshKDslrjsnYQg7LC+7JWEIE9iamVjdExpdGVyYWwg7YyM7IuxXG4gICAqIOyYiDogY29uc3QgZW50aXR5TGFiZWxzID0geyAuLi4gfSBhcyBjb25zdDtcbiAgICovXG4gIHBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihmaWxlUGF0aDogc3RyaW5nLCB2YXJOYW1lOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2wgb2Ygbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihkZWNsLm5hbWUpICYmIGRlY2wubmFtZS50ZXh0ID09PSB2YXJOYW1lICYmIGRlY2wuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChkZWNsLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog66y47J6Q7Je07J20IO2ZlOyCtO2RnCDtlajsiJgg65iQ64qUIO2VqOyImCDtkZztmITsi53snbjsp4Ag7YyQ67OEXG4gICAqL1xuICBpc0V4cHJlc3Npb25GdW5jdGlvbihjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyDruYgg66y47J6Q7Je07J2064KYIOqzteuwseunjCDsnojripQg6rK97JqwXG4gICAgaWYgKCFjb2RlLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4gPSAvXlxccypcXChbXildKlxcKVxccyo9Pi87XG5cbiAgICByZXR1cm4gQVJST1dfRlVOQ1RJT05fUEFUVEVSTi50ZXN0KGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4cG9ydCBkZWZhdWx0IO2RnO2YhOyLneyXkOyEnCBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiDstpTstpxcbiAgICogLSBhcyBjb25zdCDsspjrpqxcbiAgICogLSBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSB1bndyYXBUb09iamVjdExpdGVyYWwoZXhwcjogdHMuRXhwcmVzc2lvbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgbnVsbCB7XG4gICAgLy8gYXMgY29uc3Qg7LKY66asXG4gICAgaWYgKHRzLmlzQXNFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZXhwci5leHByZXNzaW9uKTtcbiAgICB9XG4gICAgLy8g7KeB7KCRIOqwneyytCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIC8vIGRlZmluZUxvY2FsZSh7IC4uLiB9KSDtmLjstpxcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgY29uc3QgZmlyc3RBcmcgPSBleHByLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgICByZXR1cm4gZmlyc3RBcmc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9iamVjdExpdGVyYWxFeHByZXNzaW9u7JeQ7IScIERpY3RFbnRyeSDstpTstpxcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KFxuICAgIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgZW50cmllczogRGljdEVudHJ5W10sXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leHRyYWN0RGljdEVudHJ5KHByb3AsIHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5TmFtZeyXkOyEnCDtgqQg66y47J6Q7Je0IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtCDrpqzthLDrn7Q6IFwia2V5XCJcbiAgICogLSDsi53rs4TsnpA6IGtleSAodW5xdW90ZWQpXG4gICAqL1xuICBwcml2YXRlIGdldFByb3BlcnR5S2V5KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnO2NvO2LsOyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqIC0g66y47J6Q7Je0OiDsi6TsoJwg66y47J6Q7Je0IOqwklxuICAgKiAtIO2VqOyImDog7JuQ67O4IOyGjOyKpCAo7Jes65+sIOykhOydgCDtlZwg7KSE66GcIOygleq3nO2ZlClcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdERpY3RFbnRyeShcbiAgICBwcm9wOiB0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2UsXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgKTogRGljdEVudHJ5IHwgbnVsbCB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcm9wZXJ0eUtleShwcm9wLm5hbWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGluaXQgPSBwcm9wLmluaXRpYWxpemVyO1xuXG4gICAgLy8g7ZmU7IK07ZGcIO2VqOyImFxuICAgIGlmICh0cy5pc0Fycm93RnVuY3Rpb24oaW5pdCkpIHtcbiAgICAgIGNvbnN0IGZ1bmNUZXh0ID0gaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZ1bmNUZXh0LnJlcGxhY2UoL1xccypcXG5cXHMqL2csIFwiIFwiKS50cmltKCk7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBub3JtYWxpemVkLCBpc0Z1bmN0aW9uOiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwoaW5pdCkpIHtcbiAgICAgIHJldHVybiB7IGtleSwgdmFsdWU6IGluaXQudGV4dCwgaXNGdW5jdGlvbjogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyDthZztlIzrpr8g66as7YSw65+0ICjrs4DsiJgg7JeG7J2MKVxuICAgIGlmICh0cy5pc05vU3Vic3RpdHV0aW9uVGVtcGxhdGVMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g6riw7YOAICjsmIg6IO2VqOyImCDtkZztmITsi50pXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlOiBpbml0LmdldFRleHQoc291cmNlRmlsZSksXG4gICAgICBpc0Z1bmN0aW9uOiB0cy5pc0Z1bmN0aW9uRXhwcmVzc2lvbihpbml0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnOygne2KuOydmCBpMThuIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDroZzsvIDsnbwgKGtvLCBlbiDrk7EpXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKi9cbiAgZ2V0UHJvamVjdERpY3RQYXRoKGxvY2FsZTogc3RyaW5nLCB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpciA9IHRhcmdldCA9PT0gXCJhcGlcIiA/IFNvbmFtdS5jb25maWcuYXBpLmRpciA6IHRhcmdldDtcbiAgICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZGlyLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdSDrgrTsnqUgZGljdCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U29uYW11RGljdFBhdGgobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VSb290LCBcInNyY1wiLCBcImRpY3RcIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOyalO2VnCBkaWN0IO2CpOqwgCDtlITroZzsoJ3tirjsl5Ag7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VmOqzoCwg7JeG7Jy866m0IOy2lOqwgO2VqeuLiOuLpC5cbiAgICogZGVmYXVsdExvY2FsZeyXkOunjCDstpTqsIDtlZjrqbAsIOuLpOuluCBsb2NhbGXsnYAg7IKs7Jqp7J6Q6rCAIOyngeygkSDrsojsl63tlbTslbwg7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWlyZWRLZXlzIC0g7ZWE7JqU7ZWcIO2CpCDrqqnroZ1cbiAgICogQHBhcmFtIHRhcmdldCAtIO2DgOqynyDrlJTroInthqDrpqwgKGFwaSwgd2ViLCBhcHApXG4gICAqIEByZXR1cm5zIOy2lOqwgOuQnCDtgqQg66qp66GdXG4gICAqL1xuICBhc3luYyBlbnN1cmVEaWN0S2V5cyhcbiAgICByZXF1aXJlZEtleXM6IHN0cmluZ1tdLFxuICAgIHRhcmdldDogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiID0gXCJhcGlcIixcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSB9ID0gU29uYW11LmNvbmZpZy5pMThuO1xuICAgIGNvbnN0IHByb2plY3REaWN0UGF0aCA9IHRoaXMuZ2V0UHJvamVjdERpY3RQYXRoKGRlZmF1bHRMb2NhbGUsIHRhcmdldCk7XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsnbQg7JeG7Jy866m0IOyVhOustOqyg+uPhCDtlZjsp4Ag7JWK7J2MXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHByb2plY3REaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdOyXkOyEnCDquLDsobQg7YKkIO2MjOyLsVxuICAgIGNvbnN0IHByb2plY3RFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHByb2plY3REaWN0UGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChwcm9qZWN0RW50cmllcy5tYXAoKGUpID0+IGUua2V5KSk7XG5cbiAgICAvLyDriITrnb3rkJwg7YKkIOywvuq4sFxuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhZXhpc3RpbmdLZXlzLmhhcyhrZXkpKTtcblxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBzb25hbXUgZGljdOyXkOyEnCDquLDrs7jqsJIg6rCA7KC47Jik6riwXG4gICAgY29uc3Qgc29uYW11RGljdFBhdGggPSB0aGlzLmdldFNvbmFtdURpY3RQYXRoKGRlZmF1bHRMb2NhbGUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzb25hbXVEaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzb25hbXVFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHNvbmFtdURpY3RQYXRoKTtcbiAgICBjb25zdCBzb25hbXVEaWN0ID0gbmV3IE1hcChzb25hbXVFbnRyaWVzLm1hcCgoZSkgPT4gW2Uua2V5LCBlXSkpO1xuXG4gICAgLy8g7LaU6rCA7ZWgIOyXlO2KuOumrCDsg53shLFcbiAgICBjb25zdCBlbnRyaWVzVG9BZGQgPSBtaXNzaW5nS2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiBzb25hbXVEaWN0LmdldChrZXkpKVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBOb25OdWxsYWJsZTx0eXBlb2YgZW50cnk+ID0+IGVudHJ5ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVudHJpZXNUb0FkZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsl5Ag7LaU6rCAXG4gICAgYXdhaXQgdGhpcy5hcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShwcm9qZWN0RGljdFBhdGgsIGVudHJpZXNUb0FkZCwgZGVmYXVsdExvY2FsZSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gZW50cmllc1RvQWRkLm1hcCgoZSkgPT4gZS5rZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287JeQIOyXlO2KuOumrOulvCDstpTqsIDtlanri4jri6QuXG4gICAqIOq4sOyhtCDtjIzsnbzsnYQg7YyM7Iux7ZWY6rOgLCDsg4gg7JeU7Yq466as66W8IOy2lOqwgO2VnCDrkqQsIOyghOyytCDtjIzsnbzsnYQg7J6s7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6riw7KG0IGVudHJpZXMg7YyM7IuxXG4gICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKGZpbGVQYXRoKTtcblxuICAgIC8vIOyDiCBlbnRyaWVzIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIC8vIO2MjOydvCDsnqzsg53shLFcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZXhpc3RpbmdFbnRyaWVzLCBpc0RlZmF1bHRMb2NhbGUpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUoY29udGVudCwgZmlsZVBhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZvcm1hdHRlZCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJgg6rCS65Ok7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiY66W8IOqwkOyngO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VXNlZEhlbHBlcnMoZW50cmllczogRGljdEVudHJ5W10pOiB7XG4gICAgaGVscGVyczogc3RyaW5nW107XG4gICAgdXNlc0Zvcm1hdDogYm9vbGVhbjtcbiAgfSB7XG4gICAgY29uc3QgZnVuY3Rpb25FbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaXNGdW5jdGlvbik7XG4gICAgY29uc3QgaGVscGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaGVscGVyIG9mIFtcInBsdXJhbFwiLCBcImpvc2FcIl0pIHtcbiAgICAgIC8vIO2VqOyImOuqheydtCDri6jslrQg6rK96rOE66GcIOyCrOyaqeuQmOuKlOyngCDtmZXsnbggKOyYiDogcGx1cmFsKCDrmJDripQgcGx1cmFsLClcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7aGVscGVyfVxcXFxzKlxcXFwoYCk7XG4gICAgICBpZiAoZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IHBhdHRlcm4udGVzdChlLnZhbHVlKSkpIHtcbiAgICAgICAgaGVscGVycy5wdXNoKGhlbHBlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsl6zrtoAg67OE64+EIOqwkOyngCAoZm9ybWF0Lm51bWJlciguLi4pLCBmb3JtYXQuZGF0ZSguLi4pIOuTsSlcbiAgICBjb25zdCBmb3JtYXRQYXR0ZXJuID0gL1xcYmZvcm1hdFxcLlxcdytcXHMqXFwoLztcbiAgICBjb25zdCB1c2VzRm9ybWF0ID0gZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IGZvcm1hdFBhdHRlcm4udGVzdChlLnZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBoZWxwZXJzLCB1c2VzRm9ybWF0IH07XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICovXG4gIGdlbmVyYXRlUHJvamVjdERpY3QobG9jYWxlOiBzdHJpbmcsIGVudHJpZXM6IERpY3RFbnRyeVtdLCBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIGtleSDslYztjIzrsrMg7IicIOygleugrFxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyDtlajsiJgg6rCS7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiYIOqwkOyngFxuICAgIGNvbnN0IHsgaGVscGVycywgdXNlc0Zvcm1hdCB9ID0gdGhpcy5kZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzKTtcblxuICAgIC8vIO2XrO2NvCDtlajsiJggaW1wb3J0IOy2lOqwgFxuICAgIGNvbnN0IGltcG9ydHMgPSBbLi4uaGVscGVyc107XG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGltcG9ydHMucHVzaChcImNyZWF0ZUZvcm1hdFwiKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgaW1wb3J0IHsgJHtpbXBvcnRzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwic29uYW11L2RpY3RcIjtgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaCgnaW1wb3J0IHsgZGVmaW5lTG9jYWxlIH0gZnJvbSBcIi4vc2QuZ2VuZXJhdGVkXCI7Jyk7XG4gICAgfVxuXG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCB8fCAhaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCDsgqzsmqkg7IucIGNyZWF0ZUZvcm1hdCDtmLjstpwg7LaU6rCAXG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGxpbmVzLnB1c2goYGNvbnN0IGZvcm1hdCA9IGNyZWF0ZUZvcm1hdChcIiR7bG9jYWxlfVwiKTtgKTtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICBsaW5lcy5wdXNoKGAgKiBQcm9qZWN0ICR7bG9jYWxlLnRvVXBwZXJDYXNlKCl9IERpY3Rpb25hcnlgKTtcbiAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IHtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goXCJleHBvcnQgZGVmYXVsdCBkZWZpbmVMb2NhbGUoe1wiKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgLy8g7ZWo7IiY7J24IOqyveyasDog7JuQ7ZiVIOq3uOuMgOuhnCDstpzroKVcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke2VudHJ5LnZhbHVlfSxgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgXCIke2VudHJ5LmtleX1cIjogJHtKU09OLnN0cmluZ2lmeShlbnRyeS52YWx1ZSl9LGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJ9IGFzIGNvbnN0O1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcIn0pO1wiKTtcbiAgICB9XG4gICAgbGluZXMucHVzaChcIlwiKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g7ISk7KCV7J2EIOqwgOyguOyYteuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0STE4bkNvbmZpZygpOiBJMThuQ29uZmlnIHtcbiAgICByZXR1cm4gU29uYW11LmNvbmZpZy5pMThuO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g65SU66CJ7Yag66asIOqyveuhnOulvCDrsJjtmZjtlZjqs6AsIOyXhuycvOuptCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUkxOG5EaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpMThuRGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKGkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bkRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVEaWN0RmlsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGkxOG5EaXIgPSB0aGlzLmVuc3VyZUkxOG5EaXIoKTtcbiAgICBjb25zdCBkaWN0UGF0aCA9IHBhdGguam9pbihpMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGVudHJpZXMsIGlzRGVmYXVsdExvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShjb250ZW50LCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZyk6IHsgZW50cmllczogRGljdEVudHJ5W10gfSB7XG4gICAgY29uc3QgZGljdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXM6IHRoaXMucGFyc2VEaWN0RmlsZShkaWN0UGF0aCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg642w7J207YSwIOyImOynkSAoc29uYW11ICsgZW50aXR5ICsgcHJvamVjdClcbiAgICovXG4gIGFzeW5jIGNvbGxlY3REaWN0aW9uYXJ5KCk6IFByb21pc2U8RGljdGlvbmFyeVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICBjb25zdCByb3dzOiBEaWN0aW9uYXJ5Um93W10gPSBbXTtcbiAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPHN0cmluZywgRGljdGlvbmFyeVJvdz4oKTtcblxuICAgIC8vIDEuIFJDIEtleXMgKHNvbmFtdSBzb3VyY2UsIOqwgSBsb2NhbGXrs4QpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgcmNLZXlzID0gdGhpcy5leHRyYWN0UkNLZXlzKGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IHJjS2V5IG9mIHJjS2V5cykge1xuICAgICAgICBsZXQgcm93ID0gcm93TWFwLmdldChyY0tleS5rZXkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIGtleTogcmNLZXkua2V5LFxuICAgICAgICAgICAgc291cmNlOiBcInNvbmFtdVwiLFxuICAgICAgICAgICAgaXNGdW5jdGlvbjogcmNLZXkuaXNGdW5jdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJvd01hcC5zZXQocmNLZXkua2V5LCByb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd1tsb2NhbGVdID0gcmNLZXkudmFsdWU7XG4gICAgICAgIGlmIChyY0tleS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgcm93LmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRW50aXR5IGxhYmVscyAoZGVmYXVsdCBsb2NhbGUg6riw7KSAKVxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgZW50aXR5TGFiZWxzKSB7XG4gICAgICBjb25zdCByb3c6IERpY3Rpb25hcnlSb3cgPSB7XG4gICAgICAgIGtleTogbGFiZWwua2V5LFxuICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIsXG4gICAgICAgIGlzRnVuY3Rpb246IGxhYmVsLmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIFtkZWZhdWx0TG9jYWxlXTogbGFiZWwudmFsdWUsXG4gICAgICB9O1xuICAgICAgcm93TWFwLnNldChsYWJlbC5rZXksIHJvdyk7XG4gICAgfVxuXG4gICAgLy8gMy4gUHJvamVjdCBkaWN0ICjqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gc29uYW11LCBlbnRpdHkgc291cmNl6rCAIOyeiOycvOuptCDtlbTri7kgbG9jYWxlIOqwkuunjCDstpTqsIBcbiAgICAgICAgICBleGlzdGluZ1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcm9qZWN0IHNvdXJjZeuhnCDsg4jroZwg7LaU6rCAXG4gICAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZW50cnkuaXNGdW5jdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByb3dNYXAuc2V0KGVudHJ5LmtleSwgcm93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93W2xvY2FsZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MucHVzaCguLi5yb3dNYXAudmFsdWVzKCkpO1xuICAgIHJvd3Muc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgLy8g7Ya16rOEIOqzhOyCsDogbG9jYWxl67OEICjssYTsm4zsp4Qg6rCSIC8g7KCE7LK0IO2CpCDsiJgpXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiA9IHt9O1xuICAgIGNvbnN0IHRvdGFsID0gcm93cy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgZmlsbGVkID0gcm93cy5maWx0ZXIoKHJvdykgPT4gISFyb3dbbG9jYWxlXSkubGVuZ3RoO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGZpbGxlZCAvIHRvdGFsKSAqIDEwMCkgOiAwO1xuICAgICAgc3RhdHNbbG9jYWxlXSA9IHsgdG90YWwsIGZpbGxlZCwgcGVyY2VudCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvd3MsIGxvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHN0YXRzIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2Vs66GcIOuCtOuztOuCtOq4sFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCgpOiBQcm9taXNlPHsgZmlsZW5hbWU6IHN0cmluZzsgYnVmZmVyOiBCdWZmZXIgfT4ge1xuICAgIGNvbnN0IHsgcm93cywgbG9jYWxlcyB9ID0gYXdhaXQgdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuXG4gICAgY29uc3Qgd2IgPSBuZXcgV29ya2Jvb2soKTtcbiAgICBjb25zdCBzaGVldCA9IFwiaTE4blwiO1xuICAgIHdiLnNldFNoZWV0TmFtZShcIlNoZWV0MVwiLCBzaGVldCk7XG5cbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGAke1NvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJTb25hbXVcIn0gRGljdGlvbmFyeWA7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcImtleVwiLCBcInNvdXJjZVwiLCAuLi5sb2NhbGVzXTtcblxuICAgIC8vIOyKpO2DgOydvCDsoJXsnZhcbiAgICBjb25zdCB0aXRsZVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDIzIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaGVhZGVyU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyBob3Jpem9udGFsOiBcImNlbnRlclwiLCB2ZXJ0aWNhbDogXCJjZW50ZXJcIiB9LFxuICAgICAgZmlsbDogeyBwYXR0ZXJuOiBcInNvbGlkXCIsIGZnQ29sb3I6IFwiRjFGMUYxXCIgfSxcbiAgICAgIGJvcmRlcjoge1xuICAgICAgICB0b3A6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyB2ZXJ0aWNhbDogXCJjZW50ZXJcIiwgaG9yaXpvbnRhbDogXCJsZWZ0XCIgfSxcbiAgICB9KTtcblxuICAgIC8vIO2WiSAxOiDtlITroZzsoJ3tirjrqoVcbiAgICB3Yi5zZXRDZWxsVmFsdWUoc2hlZXQsIFwiQTFcIiwgcHJvamVjdE5hbWUpO1xuICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgXCJBMVwiLCB0aXRsZVN0eWxlSWQpO1xuICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgMSwgMjgpO1xuXG4gICAgLy8g7ZaJIDI6IOu5iCDtlokgKOq4sOuzuOqwkilcblxuICAgIC8vIO2WiSAzOiDtl6TrjZRcbiAgICB3Yi5zZXRSb3dWYWx1ZXMoc2hlZXQsIDMsIFwiQVwiLCBoZWFkZXJzKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDMsIDI2KTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBoZWFkZXJzLmxlbmd0aDsgY29sKyspIHtcbiAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9M2AsIGhlYWRlclN0eWxlSWQpO1xuICAgIH1cblxuICAgIC8vIO2WiSA0IOydtO2bhDog642w7J207YSwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIGNvbnN0IHJvd051bSA9IGkgKyA0O1xuICAgICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCByb3dOdW0sIFwiQVwiLCB2YWx1ZXMpO1xuICAgICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCByb3dOdW0sIDI0KTtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHZhbHVlcy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9JHtyb3dOdW19YCwgZGF0YVN0eWxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy7rOufvCDrhIjruYQg6rOE7IKwXG4gICAgY29uc3QgTUFYX1dJRFRIID0gNTA7XG4gICAgY29uc3QgTUlOX1dJRFRIID0gMTA7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBudW1iZXJbXSA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIE1JTl9XSURUSCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbiAgICAgICAgY29sdW1uV2lkdGhzW2lkeF0gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW5XaWR0aHNbaWR4XSwgdGV4dExlbmd0aCksIE1BWF9XSURUSCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOyggeyaqVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHVtbldpZHRocy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDb2xXaWR0aChzaGVldCwgY29sTGV0dGVyKGNvbCksIGNvbHVtbldpZHRoc1tjb2xdICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfS54bHN4YCxcbiAgICAgIGJ1ZmZlcjogd2Iud3JpdGVCdWZmZXJTeW5jKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOyXkOyEnCDqsIDsoLjsmKTquLBcbiAgICpcbiAgICog7ZiV7IudOlxuICAgKiAtIDHtlok6IO2UhOuhnOygne2KuOuqhVxuICAgKiAtIDLtlok6IOu5iCDtlolcbiAgICogLSAz7ZaJOiDtl6TrjZQgKGtleSwgc291cmNlLCBsb2NhbGVzLi4uKVxuICAgKiAtIDTtlokg7J207ZuEOiDrjbDsnbTthLBcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21FeGNlbChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SW1wb3J0UmVzdWx0PiB7XG4gICAgY29uc3Qgd2IgPSBXb3JrYm9vay5vcGVuQnVmZmVyU3luYyhidWZmZXIpO1xuICAgIGNvbnN0IHNoZWV0ID0gd2Iuc2hlZXROYW1lc1swXTtcbiAgICBjb25zdCBhbGxSb3dzID0gd2IuZ2V0Um93cyhzaGVldCk7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IHVwZGF0ZWRFbnRpdGllcyA9IDA7XG4gICAgbGV0IHVwZGF0ZWRMb2NhbGVzID0gMDtcblxuICAgIC8vIGxvY2FsZeuzhCBwcm9qZWN0IGRpY3QgZW50cmllc1xuICAgIGNvbnN0IHByb2plY3REaWN0RW50cmllczogUmVjb3JkPHN0cmluZywgRGljdEVudHJ5W10+ID0ge307XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyDtl6TrjZQg7ZaJIOywvuq4sDog7LKrIOuyiOynuCDsu6zrn7woQSnsnbQgXCJrZXlcIuyduCDtlolcbiAgICBsZXQgaGVhZGVyUm93TnVtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2YgYWxsUm93cykge1xuICAgICAgY29uc3QgZmlyc3RDZWxsID0gcm93RGF0YS5jZWxscy5maW5kKChjKSA9PiBjLmNvbHVtbiA9PT0gXCJBXCIpO1xuICAgICAgY29uc3QgZmlyc3RDZWxsVmFsdWUgPSBTdHJpbmcoZmlyc3RDZWxsPy52YWx1ZSA/PyBcIlwiKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZpcnN0Q2VsbFZhbHVlID09PSBcImtleVwiKSB7XG4gICAgICAgIGhlYWRlclJvd051bSA9IHJvd0RhdGEucm93O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyUm93TnVtID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5oZWFkZXJSb3dOb3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WieyXkOyEnCDsu6zrn7wg66ek7ZWRIOq1rOyEsVxuICAgIGNvbnN0IGhlYWRlclJvd0RhdGEgPSBhbGxSb3dzLmZpbmQoKHIpID0+IHIucm93ID09PSBoZWFkZXJSb3dOdW0pO1xuICAgIGNvbnN0IGNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIGlmIChoZWFkZXJSb3dEYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgaGVhZGVyUm93RGF0YS5jZWxscykge1xuICAgICAgICBjb2xUb0hlYWRlci5zZXQoY2VsbC5jb2x1bW4sIFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDrjbDsnbTthLAg7ZaJIOydveq4sCAo7Zek642UIOuLpOydjCDtlonrtoDthLApXG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmIChyb3dEYXRhLnJvdyA8PSBoZWFkZXJSb3dOdW0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByb3dWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3dEYXRhLmNlbGxzKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2xUb0hlYWRlci5nZXQoY2VsbC5jb2x1bW4pO1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJvd1ZhbHVlc1toZWFkZXJOYW1lXSA9IFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHJvd1ZhbHVlcy5rZXk7XG4gICAgICBjb25zdCBzb3VyY2UgPSByb3dWYWx1ZXMuc291cmNlIGFzIFwiZW50aXR5XCIgfCBcInByb2plY3RcIjtcblxuICAgICAgaWYgKCFrZXkgfHwgIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgLy8gZW50aXR5IHNvdXJjZTogZGVmYXVsdCBsb2NhbGXrp4wgZW50aXR5Lmpzb27sl5Ag7KCA7J6lXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJvd1ZhbHVlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZUVudGl0eUJ5S2V5KGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdXBkYXRlZEVudGl0aWVzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9uLWRlZmF1bHQgbG9jYWxl7J2AIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGlmIChsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gXCJwcm9qZWN0XCIpIHtcbiAgICAgICAgLy8gcHJvamVjdCBzb3VyY2U6IOuqqOuToCBsb2NhbGXsnYQgcHJvamVjdCBkaWN07JeQIOyggOyepVxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gcm93VmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgICB1cGRhdGVkTG9jYWxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXBkYXRlZEVudGl0aWVzLFxuICAgICAgdXBkYXRlZExvY2FsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOyImOyglVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50cnkocGFyYW1zOiB7XG4gICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgb2xkS2V5LCBuZXdLZXksIHNvdXJjZSwgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZSDsspjrpqxcbiAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShuZXdLZXksIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSk7XG4gICAgfVxuXG4gICAgLy8gcHJvamVjdCBkaWN0IOyXheuNsOydtO2KuFxuICAgIC8vIC0gZW50aXR57J2YIG5vbi1kZWZhdWx0IGxvY2FsZVxuICAgIC8vIC0gcHJvamVjdCBzb3VyY2XsnZgg66qo65OgIGxvY2FsZVxuICAgIC8vIC0gc29uYW11IHNvdXJjZeydmCDrqqjrk6AgbG9jYWxlIChvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAvLyBlbnRpdHkgc291cmNl7J2YIGRlZmF1bHQgbG9jYWxl7J2AIGVudGl0eS5qc29u7JeQ7IScIOyymOumrO2WiOycvOuvgOuhnCDsiqTtgrVcbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIgJiYgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlID0gdmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgIGlmICghY2VsbFZhbHVlKSBjb250aW51ZTtcblxuICAgICAgLy8g6riw7KG0IGRpY3Qg66Gc65OcXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG5cbiAgICAgIC8vIGtleSDrs4Dqsr0g7IucIOq4sOyhtCBrZXkg7KCc6rGwXG4gICAgICBpZiAob2xkS2V5ICE9PSBuZXdLZXkpIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG9sZEtleSk7XG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7IOIIOqwkiDsl4XrjbDsnbTtirgg65iQ64qUIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0gbmV3S2V5KTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5OiBEaWN0RW50cnkgPSB7XG4gICAgICAgIGtleTogbmV3S2V5LFxuICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllc1tleGlzdGluZ0luZGV4XSA9IG5ld0VudHJ5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cblxuICAgICAgLy8gZGljdCDtjIzsnbwg7KCA7J6lXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7LaU6rCAXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRyeShwYXJhbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFrZXk/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5UmVxdWlyZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICAvLyDspJHrs7Ug7YKkIOyytO2BrFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleUFscmVhZHlFeGlzdHNcIikoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6rCBIGxvY2FsZeyXkCDsg4gg7YKkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsgq3soJxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlOb3RGb3VuZFwiKShrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66+47IKs7JqpIO2CpCDqsoDsgqwgKGFzdC1ncmVwIOyCrOyaqSlcbiAgICovXG4gIGFzeW5jIGNoZWNrVXNhZ2Uoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFVzYWdlUmVzdWx0PiB7XG4gICAgLy8gYXN0LWdyZXAg7ISk7LmYIO2ZleyduFxuICAgIGxldCBzZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIHNnXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIGFzdC1ncmVwXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYXN0LWdyZXAgbm90IGluc3RhbGxlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2dQYXRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjpcbiAgICAgICAgICBcImFzdC1ncmVw7J20IOyEpOy5mOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLiBicmV3IGluc3RhbGwgYXN0LWdyZXAg65iQ64qUIG5wbSBpbnN0YWxsIC1nIEBhc3QtZ3JlcC9jbGnroZwg7ISk7LmY7ZW07KO87IS47JqULlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBlbnRyeSwgXCJzcmNcIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhzcmNQYXRoKSkge1xuICAgICAgICBzZWFyY2hQYXRocy5wdXNoKHNyY1BhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2hQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBcIuqygOyDie2VoCBzcmMg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhc3QtZ3JlcOycvOuhnCBTRChcIi4uLlwiKSDtjKjthLQg6rKA7IOJXG4gICAgICAvLyDtjKjthLQ6IFNEKFwiS0VZXCIpIOuYkOuKlCBTRCgnS0VZJykg7ZiV7YOcXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IFsnU0QoXCIkS0VZXCIpJywgXCJTRCgnJEtFWScpXCJdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGAke3NnUGF0aH0gLS1wYXR0ZXJuICcke3BhdHRlcm59JyAtLWpzb24gJHtzZWFyY2hQYXRofWAsIHtcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LCAvLyA1ME1CXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbWV0YVZhcmlhYmxlcy5zaW5nbGUuS0VZLnRleHTsl5DshJwg7YKkIOy2lOy2nFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVRleHQgPSBtYXRjaC5tZXRhVmFyaWFibGVzPy5zaW5nbGU/LktFWT8udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCkge1xuICAgICAgICAgICAgICAgICAgLy8g65Sw7Ji07ZGcIOygnOqxsFxuICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXlUZXh0LnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICB1c2VkS2V5cy5hZGQoY2xlYW5LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Yyo7YS0IOunpOy5mCDsl4bsnLzrqbQg7JeQ65+sICjrrLTsi5wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleXMg7KSR7JeQ7IScIHVzZWRLZXlz7JeQIOyXhuuKlCDqsoPrk6TsnbQg66+47IKs7JqpIO2CpFxuICAgICAgY29uc3QgdW51c2VkS2V5cyA9IGtleXMuZmlsdGVyKChrKSA9PiAhdXNlZEtleXMuaGFzKGspKTtcblxuICAgICAgcmV0dXJuIHsgdW51c2VkS2V5cywgdXNlZEtleXNDb3VudDogdXNlZEtleXMuc2l6ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBg6rKA7IOJIOykkSDsmKTrpZgg67Cc7IOdOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzb25hbXVEaWN0aW9uYXJ5ID0gbmV3IFNvbmFtdURpY3Rpb25hcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVMsVUFBVSxPQUF1QjtDQUN4QyxJQUFJLFNBQVM7Q0FDYixJQUFJLElBQUk7Q0FDUixPQUFPLEtBQUssR0FBRztFQUNiLFNBQVMsT0FBTyxhQUFhLEtBQU0sSUFBSSxFQUFHLElBQUk7RUFDOUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUk7Q0FDM0I7Q0FDQSxPQUFPO0FBQ1Q7OzthQTFCc0M7cUJBQ2tCO29CQUNTO2dCQUNsQjtTQUN0QjtDQTRCWixtQkFBYixNQUE4Qjs7Ozs7Ozs7OztFQVU1QixjQUFjLFVBQStCO0dBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsVUFBVSxPQUFPO0dBQ2pELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixVQUFVLFNBQVMsR0FBRyxhQUFhLFFBQVEsSUFBSTtHQUV0RixNQUFNLFVBQXVCLENBQUM7R0FFOUIsR0FBRyxhQUFhLGFBQWEsU0FBUztJQUNwQyxJQUFJLEdBQUcsbUJBQW1CLElBQUksR0FBRztLQUMvQixNQUFNLGdCQUFnQixLQUFLLHNCQUFzQixLQUFLLFVBQVU7S0FDaEUsSUFBSSxlQUNGLEtBQUsseUJBQXlCLGVBQWUsWUFBWSxPQUFPO0lBRXBFO0dBQ0YsQ0FBQztHQUVELE9BQU87RUFDVDs7Ozs7RUFNQSw0QkFBNEIsVUFBa0IsU0FBOEI7R0FDMUUsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLE9BQU87R0FDakQsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLFVBQVUsU0FBUyxHQUFHLGFBQWEsUUFBUSxJQUFJO0dBRXRGLE1BQU0sVUFBdUIsQ0FBQztHQUU5QixHQUFHLGFBQWEsYUFBYSxTQUFTO0lB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
749
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBmb3JtYXRDb2RlIH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdHRlclwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi9zZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaWN0RW50cnksXG4gIHR5cGUgRGljdGlvbmFyeVJlc3VsdCxcbiAgdHlwZSBEaWN0aW9uYXJ5Um93LFxuICB0eXBlIEVudGl0eUtleUluZm8sXG4gIHR5cGUgSTE4bkNvbmZpZyxcbiAgdHlwZSBJbXBvcnRSZXN1bHQsXG4gIHR5cGUgVXNhZ2VSZXN1bHQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogMC1iYXNlZCDsu6zrn7wg7J24642x7Iqk66W8IOyXkeyFgCDsu6zrn7wg66y47J6Q66GcIOuzgO2ZmCAoMCAtPiBcIkFcIiwgMjUgLT4gXCJaXCIsIDI2IC0+IFwiQUFcIilcbiAqL1xuZnVuY3Rpb24gY29sTGV0dGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IG4gPSBpbmRleDtcbiAgd2hpbGUgKG4gPj0gMCkge1xuICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyAobiAlIDI2KSkgKyByZXN1bHQ7XG4gICAgbiA9IE1hdGguZmxvb3IobiAvIDI2KSAtIDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDqtIDrpqwg7YG0656Y7IqkXG4gKiBpMThuIOuUleyFlOuEiOumrOydmCBDUlVEIOuwjyBFeGNlbCBpbXBvcnQvZXhwb3J066W8IOuLtOuLue2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvbmFtdURpY3Rpb25hcnkge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBDb21waWxlciBBUEnrpbwg7IKs7Jqp7ZWY7JesIGRpY3Qg7YyM7J28IO2MjOyLsVxuICAgKlxuICAgKiDsp4Dsm5Ag7Yyo7YS0OlxuICAgKiAtIGV4cG9ydCBkZWZhdWx0IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqIC0gZXhwb3J0IGRlZmF1bHQgZGVmaW5lTG9jYWxlKHsgLi4uIH0pO1xuICAgKiAtIOusuOyekOyXtCDqsJI6IFwia2V5XCI6IFwidmFsdWVcIiDrmJDripQga2V5OiBgdmFsdWVgXG4gICAqIC0g7ZWo7IiYIOqwkjogXCJrZXlcIjogKHBhcmFtOiBUeXBlKSA9PiBgdGVtcGxhdGVgXG4gICAqL1xuICBwYXJzZURpY3RGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtjIzsnbzsl5DshJwg7Yq57KCVIOydtOumhOydmCBjb25zdCDshKDslrjsnYQg7LC+7JWEIE9iamVjdExpdGVyYWwg7YyM7IuxXG4gICAqIOyYiDogY29uc3QgZW50aXR5TGFiZWxzID0geyAuLi4gfSBhcyBjb25zdDtcbiAgICovXG4gIHBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihmaWxlUGF0aDogc3RyaW5nLCB2YXJOYW1lOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBlbnRyaWVzOiBEaWN0RW50cnlbXSA9IFtdO1xuXG4gICAgdHMuZm9yRWFjaENoaWxkKHNvdXJjZUZpbGUsIChub2RlKSA9PiB7XG4gICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2wgb2Ygbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihkZWNsLm5hbWUpICYmIGRlY2wubmFtZS50ZXh0ID09PSB2YXJOYW1lICYmIGRlY2wuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB0aGlzLnVud3JhcFRvT2JqZWN0TGl0ZXJhbChkZWNsLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KG9iamVjdExpdGVyYWwsIHNvdXJjZUZpbGUsIGVudHJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog66y47J6Q7Je07J20IO2ZlOyCtO2RnCDtlajsiJgg65iQ64qUIO2VqOyImCDtkZztmITsi53snbjsp4Ag7YyQ67OEXG4gICAqL1xuICBpc0V4cHJlc3Npb25GdW5jdGlvbihjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyDruYgg66y47J6Q7Je07J2064KYIOqzteuwseunjCDsnojripQg6rK97JqwXG4gICAgaWYgKCFjb2RlLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4gPSAvXlxccypcXChbXildKlxcKVxccyo9Pi87XG5cbiAgICByZXR1cm4gQVJST1dfRlVOQ1RJT05fUEFUVEVSTi50ZXN0KGNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4cG9ydCBkZWZhdWx0IO2RnO2YhOyLneyXkOyEnCBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiDstpTstpxcbiAgICogLSBhcyBjb25zdCDsspjrpqxcbiAgICogLSBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacIOyymOumrFxuICAgKi9cbiAgcHJpdmF0ZSB1bndyYXBUb09iamVjdExpdGVyYWwoZXhwcjogdHMuRXhwcmVzc2lvbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgbnVsbCB7XG4gICAgLy8gYXMgY29uc3Qg7LKY66asXG4gICAgaWYgKHRzLmlzQXNFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZXhwci5leHByZXNzaW9uKTtcbiAgICB9XG4gICAgLy8g7KeB7KCRIOqwneyytCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIC8vIGRlZmluZUxvY2FsZSh7IC4uLiB9KSDtmLjstpxcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgY29uc3QgZmlyc3RBcmcgPSBleHByLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgICByZXR1cm4gZmlyc3RBcmc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9iamVjdExpdGVyYWxFeHByZXNzaW9u7JeQ7IScIERpY3RFbnRyeSDstpTstpxcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEVudHJpZXNGcm9tT2JqZWN0KFxuICAgIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgZW50cmllczogRGljdEVudHJ5W10sXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5leHRyYWN0RGljdEVudHJ5KHByb3AsIHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5TmFtZeyXkOyEnCDtgqQg66y47J6Q7Je0IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtCDrpqzthLDrn7Q6IFwia2V5XCJcbiAgICogLSDsi53rs4TsnpA6IGtleSAodW5xdW90ZWQpXG4gICAqL1xuICBwcml2YXRlIGdldFByb3BlcnR5S2V5KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnO2NvO2LsOyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqIC0g66y47J6Q7Je0OiDsi6TsoJwg66y47J6Q7Je0IOqwklxuICAgKiAtIO2VqOyImDog7JuQ67O4IOyGjOyKpCAo7Jes65+sIOykhOydgCDtlZwg7KSE66GcIOygleq3nO2ZlClcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdERpY3RFbnRyeShcbiAgICBwcm9wOiB0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2UsXG4gICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgKTogRGljdEVudHJ5IHwgbnVsbCB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcm9wZXJ0eUtleShwcm9wLm5hbWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGluaXQgPSBwcm9wLmluaXRpYWxpemVyO1xuXG4gICAgLy8g7ZmU7IK07ZGcIO2VqOyImFxuICAgIGlmICh0cy5pc0Fycm93RnVuY3Rpb24oaW5pdCkpIHtcbiAgICAgIGNvbnN0IGZ1bmNUZXh0ID0gaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZ1bmNUZXh0LnJlcGxhY2UoL1xccypcXG5cXHMqL2csIFwiIFwiKS50cmltKCk7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBub3JtYWxpemVkLCBpc0Z1bmN0aW9uOiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwoaW5pdCkpIHtcbiAgICAgIHJldHVybiB7IGtleSwgdmFsdWU6IGluaXQudGV4dCwgaXNGdW5jdGlvbjogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyDthZztlIzrpr8g66as7YSw65+0ICjrs4DsiJgg7JeG7J2MKVxuICAgIGlmICh0cy5pc05vU3Vic3RpdHV0aW9uVGVtcGxhdGVMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g6riw7YOAICjsmIg6IO2VqOyImCDtkZztmITsi50pXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlOiBpbml0LmdldFRleHQoc291cmNlRmlsZSksXG4gICAgICBpc0Z1bmN0aW9uOiB0cy5pc0Z1bmN0aW9uRXhwcmVzc2lvbihpbml0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2UhOuhnOygne2KuOydmCBpMThuIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDroZzsvIDsnbwgKGtvLCBlbiDrk7EpXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKi9cbiAgZ2V0UHJvamVjdERpY3RQYXRoKGxvY2FsZTogc3RyaW5nLCB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpciA9IHRhcmdldCA9PT0gXCJhcGlcIiA/IFNvbmFtdS5jb25maWcuYXBpLmRpciA6IHRhcmdldDtcbiAgICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZGlyLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdSDrgrTsnqUgZGljdCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U29uYW11RGljdFBhdGgobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VSb290LCBcInNyY1wiLCBcImRpY3RcIiwgYCR7bG9jYWxlfS50c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOyalO2VnCBkaWN0IO2CpOqwgCDtlITroZzsoJ3tirjsl5Ag7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VmOqzoCwg7JeG7Jy866m0IOy2lOqwgO2VqeuLiOuLpC5cbiAgICogZGVmYXVsdExvY2FsZeyXkOunjCDstpTqsIDtlZjrqbAsIOuLpOuluCBsb2NhbGXsnYAg7IKs7Jqp7J6Q6rCAIOyngeygkSDrsojsl63tlbTslbwg7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWlyZWRLZXlzIC0g7ZWE7JqU7ZWcIO2CpCDrqqnroZ1cbiAgICogQHBhcmFtIHRhcmdldCAtIO2DgOqynyDrlJTroInthqDrpqwgKGFwaSwgd2ViLCBhcHApXG4gICAqIEByZXR1cm5zIOy2lOqwgOuQnCDtgqQg66qp66GdXG4gICAqL1xuICBhc3luYyBlbnN1cmVEaWN0S2V5cyhcbiAgICByZXF1aXJlZEtleXM6IHN0cmluZ1tdLFxuICAgIHRhcmdldDogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiID0gXCJhcGlcIixcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSB9ID0gU29uYW11LmNvbmZpZy5pMThuO1xuICAgIGNvbnN0IHByb2plY3REaWN0UGF0aCA9IHRoaXMuZ2V0UHJvamVjdERpY3RQYXRoKGRlZmF1bHRMb2NhbGUsIHRhcmdldCk7XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsnbQg7JeG7Jy866m0IOyVhOustOqyg+uPhCDtlZjsp4Ag7JWK7J2MXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHByb2plY3REaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdOyXkOyEnCDquLDsobQg7YKkIO2MjOyLsVxuICAgIGNvbnN0IHByb2plY3RFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHByb2plY3REaWN0UGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChwcm9qZWN0RW50cmllcy5tYXAoKGUpID0+IGUua2V5KSk7XG5cbiAgICAvLyDriITrnb3rkJwg7YKkIOywvuq4sFxuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhZXhpc3RpbmdLZXlzLmhhcyhrZXkpKTtcblxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBzb25hbXUgZGljdOyXkOyEnCDquLDrs7jqsJIg6rCA7KC47Jik6riwXG4gICAgY29uc3Qgc29uYW11RGljdFBhdGggPSB0aGlzLmdldFNvbmFtdURpY3RQYXRoKGRlZmF1bHRMb2NhbGUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzb25hbXVEaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzb25hbXVFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKHNvbmFtdURpY3RQYXRoKTtcbiAgICBjb25zdCBzb25hbXVEaWN0ID0gbmV3IE1hcChzb25hbXVFbnRyaWVzLm1hcCgoZSkgPT4gW2Uua2V5LCBlXSkpO1xuXG4gICAgLy8g7LaU6rCA7ZWgIOyXlO2KuOumrCDsg53shLFcbiAgICBjb25zdCBlbnRyaWVzVG9BZGQgPSBtaXNzaW5nS2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiBzb25hbXVEaWN0LmdldChrZXkpKVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBOb25OdWxsYWJsZTx0eXBlb2YgZW50cnk+ID0+IGVudHJ5ICE9PSB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVudHJpZXNUb0FkZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyDtlITroZzsoJ3tirggZGljdCDtjIzsnbzsl5Ag7LaU6rCAXG4gICAgYXdhaXQgdGhpcy5hcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShwcm9qZWN0RGljdFBhdGgsIGVudHJpZXNUb0FkZCwgZGVmYXVsdExvY2FsZSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gZW50cmllc1RvQWRkLm1hcCgoZSkgPT4gZS5rZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287JeQIOyXlO2KuOumrOulvCDstpTqsIDtlanri4jri6QuXG4gICAqIOq4sOyhtCDtjIzsnbzsnYQg7YyM7Iux7ZWY6rOgLCDsg4gg7JeU7Yq466as66W8IOy2lOqwgO2VnCDrkqQsIOyghOyytCDtjIzsnbzsnYQg7J6s7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcHBlbmRFbnRyaWVzVG9EaWN0RmlsZShcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6riw7KG0IGVudHJpZXMg7YyM7IuxXG4gICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gdGhpcy5wYXJzZURpY3RGaWxlKGZpbGVQYXRoKTtcblxuICAgIC8vIOyDiCBlbnRyaWVzIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIC8vIO2MjOydvCDsnqzsg53shLFcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZXhpc3RpbmdFbnRyaWVzLCBpc0RlZmF1bHRMb2NhbGUpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUoY29udGVudCwgZmlsZVBhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZvcm1hdHRlZCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJgg6rCS65Ok7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiY66W8IOqwkOyngO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VXNlZEhlbHBlcnMoZW50cmllczogRGljdEVudHJ5W10pIHtcbiAgICBjb25zdCBmdW5jdGlvbkVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5pc0Z1bmN0aW9uKTtcbiAgICBjb25zdCBoZWxwZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBoZWxwZXIgb2YgW1wicGx1cmFsXCIsIFwiam9zYVwiXSkge1xuICAgICAgLy8g7ZWo7IiY66qF7J20IOuLqOyWtCDqsr3qs4TroZwg7IKs7Jqp65CY64qU7KeAIO2ZleyduCAo7JiIOiBwbHVyYWwoIOuYkOuKlCBwbHVyYWwsKVxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFxiJHtoZWxwZXJ9XFxcXHMqXFxcXChgKTtcbiAgICAgIGlmIChmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gcGF0dGVybi50ZXN0KGUudmFsdWUpKSkge1xuICAgICAgICBoZWxwZXJzLnB1c2goaGVscGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3JtYXQg7IKs7JqpIOyXrOu2gCDrs4Trj4Qg6rCQ7KeAIChmb3JtYXQubnVtYmVyKC4uLiksIGZvcm1hdC5kYXRlKC4uLikg65OxKVxuICAgIGNvbnN0IGZvcm1hdFBhdHRlcm4gPSAvXFxiZm9ybWF0XFwuXFx3K1xccypcXCgvO1xuICAgIGNvbnN0IHVzZXNGb3JtYXQgPSBmdW5jdGlvbkVudHJpZXMuc29tZSgoZSkgPT4gZm9ybWF0UGF0dGVybi50ZXN0KGUudmFsdWUpKTtcblxuICAgIHJldHVybiB7IGhlbHBlcnMsIHVzZXNGb3JtYXQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgKi9cbiAgZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZywgZW50cmllczogRGljdEVudHJ5W10sIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8ga2V5IOyVjO2MjOuysyDsiJwg7KCV66CsXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnRvU29ydGVkKChhLCBiKSA9PiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIO2VqOyImCDqsJLsl5DshJwg7IKs7Jqp65CY64qUIO2XrO2NvCDtlajsiJgg6rCQ7KeAXG4gICAgY29uc3QgeyBoZWxwZXJzLCB1c2VzRm9ybWF0IH0gPSB0aGlzLmRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXMpO1xuXG4gICAgLy8g7Zes7Y28IO2VqOyImCBpbXBvcnQg7LaU6rCAXG4gICAgY29uc3QgaW1wb3J0cyA9IFsuLi5oZWxwZXJzXTtcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgaW1wb3J0cy5wdXNoKFwiY3JlYXRlRm9ybWF0XCIpO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGBpbXBvcnQgeyAke2ltcG9ydHMuam9pbihcIiwgXCIpfSB9IGZyb20gXCJzb25hbXUvZGljdFwiO2ApO1xuICAgIH1cblxuICAgIGlmICghaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKCdpbXBvcnQgeyBkZWZpbmVMb2NhbGUgfSBmcm9tIFwiLi9zZC5nZW5lcmF0ZWRcIjsnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1wb3J0cy5sZW5ndGggPiAwIHx8ICFpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsi5wgY3JlYXRlRm9ybWF0IO2YuOy2nCDstpTqsIBcbiAgICBpZiAodXNlc0Zvcm1hdCkge1xuICAgICAgbGluZXMucHVzaChgY29uc3QgZm9ybWF0ID0gY3JlYXRlRm9ybWF0KFwiJHtsb2NhbGV9XCIpO2ApO1xuICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgIGxpbmVzLnB1c2goYCAqIFByb2plY3QgJHtsb2NhbGUudG9VcHBlckNhc2UoKX0gRGljdGlvbmFyeWApO1xuICAgIGxpbmVzLnB1c2goXCIgKi9cIik7XG5cbiAgICBpZiAoaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGRlZmF1bHQge1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7XCIpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgICBpZiAoZW50cnkuaXNGdW5jdGlvbikge1xuICAgICAgICAvLyDtlajsiJjsnbgg6rK97JqwOiDsm5DtmJUg6re464yA66GcIOy2nOugpVxuICAgICAgICBsaW5lcy5wdXNoKGAgIFwiJHtlbnRyeS5rZXl9XCI6ICR7ZW50cnkudmFsdWV9LGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke0pTT04uc3RyaW5naWZ5KGVudHJ5LnZhbHVlKX0sYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcIn0gYXMgY29uc3Q7XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKFwifSk7XCIpO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFwiXCIpO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biDshKTsoJXsnYQg6rCA7KC47Ji164uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJMThuQ29uZmlnKCk6IEkxOG5Db25maWcge1xuICAgIHJldHVybiBTb25hbXUuY29uZmlnLmkxOG47XG4gIH1cblxuICAvKipcbiAgICogaTE4biDrlJTroInthqDrpqwg6rK966Gc66W8IOuwmO2ZmO2VmOqzoCwg7JeG7Jy866m0IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlSTE4bkRpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGkxOG5EaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoaTE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBpMThuRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIGRpY3Qg7YyM7J287J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZURpY3RGaWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICAgIGlzRGVmYXVsdExvY2FsZTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaTE4bkRpciA9IHRoaXMuZW5zdXJlSTE4bkRpcigpO1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKGkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVByb2plY3REaWN0KGxvY2FsZSwgZW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIGRpY3RQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGRpY3RQYXRoLCBmb3JtYXR0ZWQsIFwidXRmLThcIik7XG4gIH1cblxuICAvKipcbiAgICogaTE4biBrZXnrpbwg7YyM7Iux7ZWY7JesIGVudGl0eSDqtIDroKgg7KCV67O0IOy2lOy2nFxuICAgKi9cbiAgcGFyc2VFbnRpdHlLZXkoa2V5OiBzdHJpbmcpOiBFbnRpdHlLZXlJbmZvIHtcbiAgICAvLyBlbnRpdHkue0VudGl0eUlkfSAobGlzdCwgY3JlYXRlLCBlZGl0IOygnOyZuClcbiAgICBjb25zdCBlbnRpdHlUaXRsZU1hdGNoID0ga2V5Lm1hdGNoKC9eZW50aXR5XFwuKFtBLVpdW2EtekEtWjAtOV0qKSQvKTtcbiAgICBpZiAoXG4gICAgICBlbnRpdHlUaXRsZU1hdGNoICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmxpc3RcIikgJiZcbiAgICAgICFrZXkuaW5jbHVkZXMoXCIuY3JlYXRlXCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmVkaXRcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwiZW50aXR5VGl0bGVcIiwgZW50aXR5SWQ6IGVudGl0eVRpdGxlTWF0Y2hbMV0gfTtcbiAgICB9XG5cbiAgICAvLyBlbnRpdHkue0VudGl0eUlkfS57cHJvcE5hbWV9XG4gICAgY29uc3QgcHJvcERlc2NNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oW2Etel9dW2EtejAtOV9dKikkLyk7XG4gICAgaWYgKHByb3BEZXNjTWF0Y2gpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwicHJvcERlc2NcIiwgZW50aXR5SWQ6IHByb3BEZXNjTWF0Y2hbMV0sIHByb3BOYW1lOiBwcm9wRGVzY01hdGNoWzJdIH07XG4gICAgfVxuXG4gICAgLy8gZW51bS57RW51bUlkfS57dmFsdWV9XG4gICAgY29uc3QgZW51bUxhYmVsTWF0Y2ggPSBrZXkubWF0Y2goL15lbnVtXFwuKFtBLVpdW2EtekEtWjAtOV0qKVxcLiguKykkLyk7XG4gICAgaWYgKGVudW1MYWJlbE1hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudW1MYWJlbFwiLCBlbnVtSWQ6IGVudW1MYWJlbE1hdGNoWzFdLCBlbnVtVmFsdWU6IGVudW1MYWJlbE1hdGNoWzJdIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHlwZTogXCJvdGhlclwiIH07XG4gIH1cblxuICAvKipcbiAgICogZW50aXR5IGtleeyXkCDrjIDtlbQgZW50aXR5Lmpzb24g7JeF642w7J207Yq4IOyImO2WiVxuICAgKiBAcmV0dXJucyDsl4XrjbDsnbTtirgg7Jes67aAXG4gICAqL1xuICBhc3luYyB1cGRhdGVFbnRpdHlCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleUluZm8gPSB0aGlzLnBhcnNlRW50aXR5S2V5KGtleSk7XG5cbiAgICBzd2l0Y2ggKGtleUluZm8udHlwZSkge1xuICAgICAgY2FzZSBcImVudGl0eVRpdGxlXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBpZiAoZW50aXR5LnRpdGxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgZW50aXR5LnRpdGxlID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicHJvcERlc2NcIjoge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGtleUluZm8uZW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IHByb3BJbmRleCA9IGVudGl0eS5wcm9wcy5maW5kSW5kZXgoKHApID0+IHAubmFtZSA9PT0ga2V5SW5mby5wcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3BJbmRleCAhPT0gLTEgJiYgZW50aXR5LnByb3BzW3Byb3BJbmRleF0uZGVzYyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgPSB2YWx1ZTtcbiAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGVudGl0eSBub3QgZm91bmRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJlbnVtTGFiZWxcIjoge1xuICAgICAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXSkge1xuICAgICAgICAgICAgaWYgKGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXVtrZXlJbmZvLmVudW1WYWx1ZV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzW2tleUluZm8uZW51bUlkXVtrZXlJbmZvLmVudW1WYWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNkLmdlbmVyYXRlZC50c+yXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDqtIDrpqzrkJjripQg6rCS66eMIO2PrO2VqCAoLmxpc3QsIC5jcmVhdGUsIC5lZGl0IOygnOyZuClcbiAgICovXG4gIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IHNkUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwiaTE4blwiLCBcInNkLmdlbmVyYXRlZC50c1wiKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2RQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIFwiZW50aXR5TGFiZWxzXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNkLmdlbmVyYXRlZC50c+yXkOyEnCByYy1rZXlzIOy2lOy2nFxuICAgKiByZWFjdC1jb21wb25lbnRz7JeQ7IScIOq0gOumrOuQmOuKlCBpMThuIO2CpOuTpFxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKi9cbiAgZXh0cmFjdFJDS2V5cyhsb2NhbGU6IHN0cmluZyk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBsb2NhbGXrs4Qg67OA7IiY66qFIOunpO2VkSAoc2QudGVtcGxhdGUudHPsnZggZ2V0UkNLZXlzVmFyTmFtZeqzvCDrj5nsnbwpXG4gICAgY29uc3QgdmFyTmFtZSA9ICgoKSA9PiB7XG4gICAgICBpZiAobG9jYWxlID09PSBcImtvXCIpIHJldHVybiBcInJjS2V5c0tvXCI7XG4gICAgICBpZiAobG9jYWxlID09PSBcImVuXCIpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyDri6TrpbggbG9jYWxl7J2AIGVu7J2EIGZhbGxiYWNr7Jy866GcIOyCrOyaqVxuICAgICAgcmV0dXJuIFwicmNLZXlzRW5cIjtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VDb25zdE9iamVjdERlY2xhcmF0aW9uKHNkUGF0aCwgdmFyTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvChbbG9jYWxlXS50cynsl5DshJwg65SV7IWU64SI66asIOuhnOuTnFxuICAgKi9cbiAgbG9hZFByb2plY3REaWN0KGxvY2FsZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGljdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaWN0UGF0aCkpIHtcbiAgICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXM6IHRoaXMucGFyc2VEaWN0RmlsZShkaWN0UGF0aCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg642w7J207YSwIOyImOynkSAoc29uYW11ICsgZW50aXR5ICsgcHJvamVjdClcbiAgICovXG4gIGFzeW5jIGNvbGxlY3REaWN0aW9uYXJ5KCk6IFByb21pc2U8RGljdGlvbmFyeVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICBjb25zdCByb3dzOiBEaWN0aW9uYXJ5Um93W10gPSBbXTtcbiAgICBjb25zdCByb3dNYXAgPSBuZXcgTWFwPHN0cmluZywgRGljdGlvbmFyeVJvdz4oKTtcblxuICAgIC8vIDEuIFJDIEtleXMgKHNvbmFtdSBzb3VyY2UsIOqwgSBsb2NhbGXrs4QpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgcmNLZXlzID0gdGhpcy5leHRyYWN0UkNLZXlzKGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IHJjS2V5IG9mIHJjS2V5cykge1xuICAgICAgICBsZXQgcm93ID0gcm93TWFwLmdldChyY0tleS5rZXkpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIGtleTogcmNLZXkua2V5LFxuICAgICAgICAgICAgc291cmNlOiBcInNvbmFtdVwiLFxuICAgICAgICAgICAgaXNGdW5jdGlvbjogcmNLZXkuaXNGdW5jdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJvd01hcC5zZXQocmNLZXkua2V5LCByb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd1tsb2NhbGVdID0gcmNLZXkudmFsdWU7XG4gICAgICAgIGlmIChyY0tleS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgcm93LmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRW50aXR5IGxhYmVscyAoZGVmYXVsdCBsb2NhbGUg6riw7KSAKVxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgZW50aXR5TGFiZWxzKSB7XG4gICAgICBjb25zdCByb3c6IERpY3Rpb25hcnlSb3cgPSB7XG4gICAgICAgIGtleTogbGFiZWwua2V5LFxuICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIsXG4gICAgICAgIGlzRnVuY3Rpb246IGxhYmVsLmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgIFtkZWZhdWx0TG9jYWxlXTogbGFiZWwudmFsdWUsXG4gICAgICB9O1xuICAgICAgcm93TWFwLnNldChsYWJlbC5rZXksIHJvdyk7XG4gICAgfVxuXG4gICAgLy8gMy4gUHJvamVjdCBkaWN0ICjqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgLy8gc29uYW11LCBlbnRpdHkgc291cmNl6rCAIOyeiOycvOuptCDtlbTri7kgbG9jYWxlIOqwkuunjCDstpTqsIBcbiAgICAgICAgICBleGlzdGluZ1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLmlzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcm9qZWN0IHNvdXJjZeuhnCDsg4jroZwg7LaU6rCAXG4gICAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcm93ID0ge1xuICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZW50cnkuaXNGdW5jdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByb3dNYXAuc2V0KGVudHJ5LmtleSwgcm93KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93W2xvY2FsZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MucHVzaCguLi5yb3dNYXAudmFsdWVzKCkpO1xuICAgIHJvd3Muc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgLy8g7Ya16rOEIOqzhOyCsDogbG9jYWxl67OEICjssYTsm4zsp4Qg6rCSIC8g7KCE7LK0IO2CpCDsiJgpXG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIHsgdG90YWw6IG51bWJlcjsgZmlsbGVkOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB9PiA9IHt9O1xuICAgIGNvbnN0IHRvdGFsID0gcm93cy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgZmlsbGVkID0gcm93cy5maWx0ZXIoKHJvdykgPT4gISFyb3dbbG9jYWxlXSkubGVuZ3RoO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGZpbGxlZCAvIHRvdGFsKSAqIDEwMCkgOiAwO1xuICAgICAgc3RhdHNbbG9jYWxlXSA9IHsgdG90YWwsIGZpbGxlZCwgcGVyY2VudCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvd3MsIGxvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHN0YXRzIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOyhsO2ajFxuICAgKi9cbiAgYXN5bmMgZ2V0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2Vs66GcIOuCtOuztOuCtOq4sFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCgpOiBQcm9taXNlPHsgZmlsZW5hbWU6IHN0cmluZzsgYnVmZmVyOiBCdWZmZXIgfT4ge1xuICAgIGNvbnN0IHsgcm93cywgbG9jYWxlcyB9ID0gYXdhaXQgdGhpcy5jb2xsZWN0RGljdGlvbmFyeSgpO1xuXG4gICAgY29uc3Qgd2IgPSBuZXcgV29ya2Jvb2soKTtcbiAgICBjb25zdCBzaGVldCA9IFwiaTE4blwiO1xuICAgIHdiLnNldFNoZWV0TmFtZShcIlNoZWV0MVwiLCBzaGVldCk7XG5cbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGAke1NvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJTb25hbXVcIn0gRGljdGlvbmFyeWA7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcImtleVwiLCBcInNvdXJjZVwiLCAuLi5sb2NhbGVzXTtcblxuICAgIC8vIOyKpO2DgOydvCDsoJXsnZhcbiAgICBjb25zdCB0aXRsZVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDIzIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG4gICAgY29uc3QgaGVhZGVyU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyBob3Jpem9udGFsOiBcImNlbnRlclwiLCB2ZXJ0aWNhbDogXCJjZW50ZXJcIiB9LFxuICAgICAgZmlsbDogeyBwYXR0ZXJuOiBcInNvbGlkXCIsIGZnQ29sb3I6IFwiRjFGMUYxXCIgfSxcbiAgICAgIGJvcmRlcjoge1xuICAgICAgICB0b3A6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgcmlnaHQ6IHsgc3R5bGU6IFwidGhpblwiLCBjb2xvcjogXCJEMEQwRDBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhU3R5bGVJZCA9IHdiLmFkZFN0eWxlKHtcbiAgICAgIGZvbnQ6IHsgc2l6ZTogMTEgfSxcbiAgICAgIGFsaWdubWVudDogeyB2ZXJ0aWNhbDogXCJjZW50ZXJcIiwgaG9yaXpvbnRhbDogXCJsZWZ0XCIgfSxcbiAgICB9KTtcblxuICAgIC8vIO2WiSAxOiDtlITroZzsoJ3tirjrqoVcbiAgICB3Yi5zZXRDZWxsVmFsdWUoc2hlZXQsIFwiQTFcIiwgcHJvamVjdE5hbWUpO1xuICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgXCJBMVwiLCB0aXRsZVN0eWxlSWQpO1xuICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgMSwgMjgpO1xuXG4gICAgLy8g7ZaJIDI6IOu5iCDtlokgKOq4sOuzuOqwkilcblxuICAgIC8vIO2WiSAzOiDtl6TrjZRcbiAgICB3Yi5zZXRSb3dWYWx1ZXMoc2hlZXQsIDMsIFwiQVwiLCBoZWFkZXJzKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDMsIDI2KTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBoZWFkZXJzLmxlbmd0aDsgY29sKyspIHtcbiAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9M2AsIGhlYWRlclN0eWxlSWQpO1xuICAgIH1cblxuICAgIC8vIO2WiSA0IOydtO2bhDog642w7J207YSwXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIGNvbnN0IHJvd051bSA9IGkgKyA0O1xuICAgICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCByb3dOdW0sIFwiQVwiLCB2YWx1ZXMpO1xuICAgICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCByb3dOdW0sIDI0KTtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHZhbHVlcy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICAgIHdiLnNldENlbGxTdHlsZShzaGVldCwgYCR7Y29sTGV0dGVyKGNvbCl9JHtyb3dOdW19YCwgZGF0YVN0eWxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy7rOufvCDrhIjruYQg6rOE7IKwXG4gICAgY29uc3QgTUFYX1dJRFRIID0gNTA7XG4gICAgY29uc3QgTUlOX1dJRFRIID0gMTA7XG4gICAgY29uc3QgY29sdW1uV2lkdGhzOiBudW1iZXJbXSA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IE1hdGgubWF4KGhlYWRlci5sZW5ndGgsIE1JTl9XSURUSCkpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gW3Jvdy5rZXksIHJvdy5zb3VyY2UsIC4uLmxvY2FsZXMubWFwKChsb2NhbGUpID0+IHJvd1tsb2NhbGVdID8/IFwiXCIpXTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbiAgICAgICAgY29sdW1uV2lkdGhzW2lkeF0gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW5XaWR0aHNbaWR4XSwgdGV4dExlbmd0aCksIE1BWF9XSURUSCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOyggeyaqVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHVtbldpZHRocy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDb2xXaWR0aChzaGVldCwgY29sTGV0dGVyKGNvbCksIGNvbHVtbldpZHRoc1tjb2xdICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfS54bHN4YCxcbiAgICAgIGJ1ZmZlcjogd2Iud3JpdGVCdWZmZXJTeW5jKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOyXkOyEnCDqsIDsoLjsmKTquLBcbiAgICpcbiAgICog7ZiV7IudOlxuICAgKiAtIDHtlok6IO2UhOuhnOygne2KuOuqhVxuICAgKiAtIDLtlok6IOu5iCDtlolcbiAgICogLSAz7ZaJOiDtl6TrjZQgKGtleSwgc291cmNlLCBsb2NhbGVzLi4uKVxuICAgKiAtIDTtlokg7J207ZuEOiDrjbDsnbTthLBcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21FeGNlbChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8SW1wb3J0UmVzdWx0PiB7XG4gICAgY29uc3Qgd2IgPSBXb3JrYm9vay5vcGVuQnVmZmVyU3luYyhidWZmZXIpO1xuICAgIGNvbnN0IHNoZWV0ID0gd2Iuc2hlZXROYW1lc1swXTtcbiAgICBjb25zdCBhbGxSb3dzID0gd2IuZ2V0Um93cyhzaGVldCk7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IHVwZGF0ZWRFbnRpdGllcyA9IDA7XG4gICAgbGV0IHVwZGF0ZWRMb2NhbGVzID0gMDtcblxuICAgIC8vIGxvY2FsZeuzhCBwcm9qZWN0IGRpY3QgZW50cmllc1xuICAgIGNvbnN0IHByb2plY3REaWN0RW50cmllczogUmVjb3JkPHN0cmluZywgRGljdEVudHJ5W10+ID0ge307XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyDtl6TrjZQg7ZaJIOywvuq4sDog7LKrIOuyiOynuCDsu6zrn7woQSnsnbQgXCJrZXlcIuyduCDtlolcbiAgICBsZXQgaGVhZGVyUm93TnVtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2YgYWxsUm93cykge1xuICAgICAgY29uc3QgZmlyc3RDZWxsID0gcm93RGF0YS5jZWxscy5maW5kKChjKSA9PiBjLmNvbHVtbiA9PT0gXCJBXCIpO1xuICAgICAgY29uc3QgZmlyc3RDZWxsVmFsdWUgPSBTdHJpbmcoZmlyc3RDZWxsPy52YWx1ZSA/PyBcIlwiKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGZpcnN0Q2VsbFZhbHVlID09PSBcImtleVwiKSB7XG4gICAgICAgIGhlYWRlclJvd051bSA9IHJvd0RhdGEucm93O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyUm93TnVtID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5oZWFkZXJSb3dOb3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WieyXkOyEnCDsu6zrn7wg66ek7ZWRIOq1rOyEsVxuICAgIGNvbnN0IGhlYWRlclJvd0RhdGEgPSBhbGxSb3dzLmZpbmQoKHIpID0+IHIucm93ID09PSBoZWFkZXJSb3dOdW0pO1xuICAgIGNvbnN0IGNvbFRvSGVhZGVyOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICAgIGlmIChoZWFkZXJSb3dEYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgaGVhZGVyUm93RGF0YS5jZWxscykge1xuICAgICAgICBjb2xUb0hlYWRlci5zZXQoY2VsbC5jb2x1bW4sIFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDrjbDsnbTthLAg7ZaJIOydveq4sCAo7Zek642UIOuLpOydjCDtlonrtoDthLApXG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmIChyb3dEYXRhLnJvdyA8PSBoZWFkZXJSb3dOdW0pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByb3dWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3dEYXRhLmNlbGxzKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2xUb0hlYWRlci5nZXQoY2VsbC5jb2x1bW4pO1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJvd1ZhbHVlc1toZWFkZXJOYW1lXSA9IFN0cmluZyhjZWxsLnZhbHVlID8/IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHJvd1ZhbHVlcy5rZXk7XG4gICAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgICAvKiBTQUZFVFk6IOuPmeq4sO2ZlOuQnCDsgqzsoIQg7YKk7JmAIOqwkiDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyByb3dWYWx1ZXMuc291cmNlIGFzXG4gICAgICAgICAgfCBcImVudGl0eVwiXG4gICAgICAgICAgfCBcInByb2plY3RcIjtcblxuICAgICAgaWYgKCFrZXkgfHwgIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgLy8gZW50aXR5IHNvdXJjZTogZGVmYXVsdCBsb2NhbGXrp4wgZW50aXR5Lmpzb27sl5Ag7KCA7J6lXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHJvd1ZhbHVlc1tkZWZhdWx0TG9jYWxlXTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZUVudGl0eUJ5S2V5KGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdXBkYXRlZEVudGl0aWVzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9uLWRlZmF1bHQgbG9jYWxl7J2AIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGlmIChsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gXCJwcm9qZWN0XCIpIHtcbiAgICAgICAgLy8gcHJvamVjdCBzb3VyY2U6IOuqqOuToCBsb2NhbGXsnYQgcHJvamVjdCBkaWN07JeQIOyggOyepVxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gcm93VmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoY2VsbFZhbHVlKSB7XG4gICAgICAgICAgICBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9qZWN0IGRpY3Qg7YyM7J28IOyDneyEsVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBwcm9qZWN0RGljdEVudHJpZXNbbG9jYWxlXTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgICB1cGRhdGVkTG9jYWxlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXBkYXRlZEVudGl0aWVzLFxuICAgICAgdXBkYXRlZExvY2FsZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOyImOyglVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50cnkocGFyYW1zOiB7XG4gICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgb2xkS2V5LCBuZXdLZXksIHNvdXJjZSwgdmFsdWVzIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZSDsspjrpqxcbiAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShuZXdLZXksIHZhbHVlc1tkZWZhdWx0TG9jYWxlXSk7XG4gICAgfVxuXG4gICAgLy8gcHJvamVjdCBkaWN0IOyXheuNsOydtO2KuFxuICAgIC8vIC0gZW50aXR57J2YIG5vbi1kZWZhdWx0IGxvY2FsZVxuICAgIC8vIC0gcHJvamVjdCBzb3VyY2XsnZgg66qo65OgIGxvY2FsZVxuICAgIC8vIC0gc29uYW11IHNvdXJjZeydmCDrqqjrk6AgbG9jYWxlIChvdmVycmlkZSlcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICAvLyBlbnRpdHkgc291cmNl7J2YIGRlZmF1bHQgbG9jYWxl7J2AIGVudGl0eS5qc29u7JeQ7IScIOyymOumrO2WiOycvOuvgOuhnCDsiqTtgrVcbiAgICAgIGlmIChzb3VyY2UgPT09IFwiZW50aXR5XCIgJiYgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY2VsbFZhbHVlID0gdmFsdWVzW2xvY2FsZV0/LnRyaW0oKTtcbiAgICAgIGlmICghY2VsbFZhbHVlKSBjb250aW51ZTtcblxuICAgICAgLy8g6riw7KG0IGRpY3Qg66Gc65OcXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG5cbiAgICAgIC8vIGtleSDrs4Dqsr0g7IucIOq4sOyhtCBrZXkg7KCc6rGwXG4gICAgICBpZiAob2xkS2V5ICE9PSBuZXdLZXkpIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG9sZEtleSk7XG4gICAgICAgIGlmIChvbGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7IOIIOqwkiDsl4XrjbDsnbTtirgg65iQ64qUIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0gbmV3S2V5KTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5OiBEaWN0RW50cnkgPSB7XG4gICAgICAgIGtleTogbmV3S2V5LFxuICAgICAgICB2YWx1ZTogY2VsbFZhbHVlLFxuICAgICAgICBpc0Z1bmN0aW9uOiB0aGlzLmlzRXhwcmVzc2lvbkZ1bmN0aW9uKGNlbGxWYWx1ZSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllc1tleGlzdGluZ0luZGV4XSA9IG5ld0VudHJ5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cblxuICAgICAgLy8gZGljdCDtjIzsnbwg7KCA7J6lXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7LaU6rCAXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRyeShwYXJhbXM6IHsga2V5OiBzdHJpbmc7IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFrZXk/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5UmVxdWlyZWRcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcyB9ID0gdGhpcy5nZXRJMThuQ29uZmlnKCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IHN1cHBvcnRlZExvY2FsZXM7XG5cbiAgICAvLyDspJHrs7Ug7YKkIOyytO2BrFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUua2V5ID09PSBrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleUFscmVhZHlFeGlzdHNcIikoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6rCBIGxvY2FsZeyXkCDsg4gg7YKkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHsgZW50cmllcyB9ID0gdGhpcy5sb2FkUHJvamVjdERpY3QobG9jYWxlKTtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsgq3soJxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFkZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlOb3RGb3VuZFwiKShrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66+47IKs7JqpIO2CpCDqsoDsgqwgKGFzdC1ncmVwIOyCrOyaqSlcbiAgICovXG4gIGFzeW5jIGNoZWNrVXNhZ2Uoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFVzYWdlUmVzdWx0PiB7XG4gICAgLy8gYXN0LWdyZXAg7ISk7LmYIO2ZleyduFxuICAgIGxldCBzZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIHNnXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICBzZ1BhdGggPSBleGVjU3luYyhcIndoaWNoIGFzdC1ncmVwXCIsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KS50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gYXN0LWdyZXAgbm90IGluc3RhbGxlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghc2dQYXRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjpcbiAgICAgICAgICBcImFzdC1ncmVw7J20IOyEpOy5mOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLiBicmV3IGluc3RhbGwgYXN0LWdyZXAg65iQ64qUIG5wbSBpbnN0YWxsIC1nIEBhc3QtZ3JlcC9jbGnroZwg7ISk7LmY7ZW07KO87IS47JqULlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBbXCJhcGlcIiwgXCJ3ZWJcIiwgXCJhcHBcIl0pIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBlbnRyeSwgXCJzcmNcIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhzcmNQYXRoKSkge1xuICAgICAgICBzZWFyY2hQYXRocy5wdXNoKHNyY1BhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2hQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBcIuqygOyDie2VoCBzcmMg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBhc3QtZ3JlcOycvOuhnCBTRChcIi4uLlwiKSDtjKjthLQg6rKA7IOJXG4gICAgICAvLyDtjKjthLQ6IFNEKFwiS0VZXCIpIOuYkOuKlCBTRCgnS0VZJykg7ZiV7YOcXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IFsnU0QoXCIkS0VZXCIpJywgXCJTRCgnJEtFWScpXCJdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGAke3NnUGF0aH0gLS1wYXR0ZXJuICcke3BhdHRlcm59JyAtLWpzb24gJHtzZWFyY2hQYXRofWAsIHtcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAgICAgbWF4QnVmZmVyOiA1MCAqIDEwMjQgKiAxMDI0LCAvLyA1ME1CXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbWV0YVZhcmlhYmxlcy5zaW5nbGUuS0VZLnRleHTsl5DshJwg7YKkIOy2lOy2nFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVRleHQgPSBtYXRjaC5tZXRhVmFyaWFibGVzPy5zaW5nbGU/LktFWT8udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCkge1xuICAgICAgICAgICAgICAgICAgLy8g65Sw7Ji07ZGcIOygnOqxsFxuICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5LZXkgPSBrZXlUZXh0LnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICAgICAgICAgICAgICB1c2VkS2V5cy5hZGQoY2xlYW5LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Yyo7YS0IOunpOy5mCDsl4bsnLzrqbQg7JeQ65+sICjrrLTsi5wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleXMg7KSR7JeQ7IScIHVzZWRLZXlz7JeQIOyXhuuKlCDqsoPrk6TsnbQg66+47IKs7JqpIO2CpFxuICAgICAgY29uc3QgdW51c2VkS2V5cyA9IGtleXMuZmlsdGVyKChrKSA9PiAhdXNlZEtleXMuaGFzKGspKTtcblxuICAgICAgcmV0dXJuIHsgdW51c2VkS2V5cywgdXNlZEtleXNDb3VudDogdXNlZEtleXMuc2l6ZSB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiBg6rKA7IOJIOykkSDsmKTrpZgg67Cc7IOdOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICB1bnVzZWRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzb25hbXVEaWN0aW9uYXJ5ID0gbmV3IFNvbmFtdURpY3Rpb25hcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVMsVUFBVSxPQUF1QjtDQUN4QyxJQUFJLFNBQVM7Q0FDYixJQUFJLElBQUk7Q0FDUixPQUFPLEtBQUssR0FBRztFQUNiLFNBQVMsT0FBTyxhQUFhLEtBQU0sSUFBSSxFQUFHLElBQUk7RUFDOUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUk7Q0FDM0I7Q0FDQSxPQUFPO0FBQ1Q7OzthQTFCc0M7cUJBQ2tCO29CQUNTO2dCQUNsQjtTQUN0QjtDQTRCWixtQkFBYixNQUE4Qjs7Ozs7Ozs7OztFQVU1QixjQUFjLFVBQStCO0dBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsVUFBVSxPQUFPO0dBQ2pELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixVQUFVLFNBQVMsR0FBRyxhQUFhLFFBQVEsSUFBSTtHQUV0RixNQUFNLFVBQXVCLENBQUM7R0FFOUIsR0FBRyxhQUFhLGFBQWEsU0FBUztJQUNwQyxJQUFJLEdBQUcsbUJBQW1CLElBQUksR0FBRztLQUMvQixNQUFNLGdCQUFnQixLQUFLLHNCQUFzQixLQUFLLFVBQVU7S0FDaEUsSUFBSSxlQUNGLEtBQUsseUJBQXlCLGVBQWUsWUFBWSxPQUFPO0lBRXBFO0dBQ0YsQ0FBQztHQUVELE9BQU87RUFDVDs7Ozs7RUFNQSw0QkFBNEIsVUFBa0IsU0FBOEI7R0FDMUUsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLE9BQU87R0FDakQsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLFVBQVUsU0FBUyxHQUFHLGFBQWEsUUFBUSxJQUFJO0dBRXRGLE1BQU0s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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dict/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;gBAE3B,MAAM;cACR,IAAI;EAEjB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,UAkBxE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/dict/utils.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAC1C,CAAC;AAQF,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAG5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;gBAE3B,MAAM;cACR,IAAI;EAEjB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,UAkBxE"}
@@ -1,7 +1,12 @@
1
+ import { init_runtime_value, isFunctionValue } from "../utils/runtime-value.js";
1
2
  //#region src/dict/utils.ts
3
+ init_runtime_value();
4
+ function isPluralResolver(form) {
5
+ return isFunctionValue(form);
6
+ }
2
7
  function plural(n, forms) {
3
8
  const form = n === 0 && forms.zero || n === 1 && forms.one || forms.other;
4
- return typeof form === "function" ? form(n) : form ?? n.toString();
9
+ return isPluralResolver(form) ? form(n) : form ?? n.toString();
5
10
  }
6
11
  function createFormat(locale) {
7
12
  return {
@@ -26,4 +31,4 @@ function josa(word, type) {
26
31
  //#endregion
27
32
  export { createFormat, josa, plural };
28
33
 
29
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3QvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUGx1cmFsRm9ybXMgPSB7XG4gIHplcm8/OiBzdHJpbmcgfCAoKG46IG51bWJlcikgPT4gc3RyaW5nKTtcbiAgb25lPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG90aGVyPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlciwgZm9ybXM6IFBsdXJhbEZvcm1zKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybSA9IChuID09PSAwICYmIGZvcm1zLnplcm8pIHx8IChuID09PSAxICYmIGZvcm1zLm9uZSkgfHwgZm9ybXMub3RoZXI7XG4gIHJldHVybiB0eXBlb2YgZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gZm9ybShuKSA6IChmb3JtID8/IG4udG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXQobG9jYWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IChuOiBudW1iZXIpID0+IG4udG9Mb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICBkYXRlOiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvc2Eod29yZDogc3RyaW5nLCB0eXBlOiBcIuydgOuKlFwiIHwgXCLsnbTqsIBcIiB8IFwi7J2E66W8XCIgfCBcIuqzvOyZgFwiIHwgXCLsnLzroZxcIikge1xuICBjb25zdCBoYXPrsJvsuaggPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RDaGFyID0gd29yZC5jaGFyQ29kZUF0KHdvcmQubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGxhc3RDaGFyIDwgMHhhYzAwIHx8IGxhc3RDaGFyID4gMHhkN2EzKVxuICAgICAgLy8g7ZWc6riAIOycoOuLiOy9lOuTnCDrspTsnIQ6IDB4QUMwMCB+IDB4RDdBM1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAobGFzdENoYXIgLSAweGFjMDApICUgMjggIT09IDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgbWFwID0ge1xuICAgIOydgOuKlDogaGFz67Cb7LmoID8gXCLsnYBcIiA6IFwi64qUXCIsXG4gICAg7J206rCAOiBoYXPrsJvsuaggPyBcIuydtFwiIDogXCLqsIBcIixcbiAgICDsnYTrpbw6IGhhc+uwm+y5qCA/IFwi7J2EXCIgOiBcIuulvFwiLFxuICAgIOqzvOyZgDogaGFz67Cb7LmoID8gXCLqs7xcIiA6IFwi7JmAXCIsXG4gICAg7Jy866GcOiBoYXPrsJvsuaggPyBcIuycvOuhnFwiIDogXCLroZxcIixcbiAgfTtcblxuICByZXR1cm4gd29yZCArIG1hcFt0eXBlXTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQU1BLFNBQWdCLE9BQU8sR0FBVyxPQUE0QjtDQUM1RCxNQUFNLE9BQVEsTUFBTSxLQUFLLE1BQU0sUUFBVSxNQUFNLEtBQUssTUFBTSxPQUFRLE1BQU07Q0FDeEUsT0FBTyxPQUFPLFNBQVMsYUFBYSxLQUFLLENBQUMsSUFBSyxRQUFRLEVBQUUsU0FBUztBQUNwRTtBQUVBLFNBQWdCLGFBQWEsUUFBZ0I7Q0FDM0MsT0FBTztFQUNMLFNBQVMsTUFBYyxFQUFFLGVBQWUsTUFBTTtFQUM5QyxPQUFPLE1BQVksRUFBRSxtQkFBbUIsTUFBTTtDQUNoRDtBQUNGO0FBRUEsU0FBZ0IsS0FBSyxNQUFjLE1BQXdDO0NBQ3pFLE1BQU0sZUFBZTtFQUNuQixNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUssU0FBUyxDQUFDO0VBQ2hELElBQUksV0FBVyxTQUFVLFdBQVcsT0FFbEMsT0FBTztFQUNULFFBQVEsV0FBVyxTQUFVLE9BQU87Q0FDdEMsRUFBQSxDQUFHO0NBVUgsT0FBTyxPQUFPO0VBUFosSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE9BQU87Q0FHUCxFQUFJO0FBQ3BCIn0=
34
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3QvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcblxuZXhwb3J0IHR5cGUgUGx1cmFsRm9ybXMgPSB7XG4gIHplcm8/OiBzdHJpbmcgfCAoKG46IG51bWJlcikgPT4gc3RyaW5nKTtcbiAgb25lPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG90aGVyPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG59O1xuXG50eXBlIFBsdXJhbFJlc29sdmVyID0gKG46IG51bWJlcikgPT4gc3RyaW5nO1xuXG5mdW5jdGlvbiBpc1BsdXJhbFJlc29sdmVyKGZvcm06IFBsdXJhbEZvcm1zW2tleW9mIFBsdXJhbEZvcm1zXSk6IGZvcm0gaXMgUGx1cmFsUmVzb2x2ZXIge1xuICByZXR1cm4gaXNGdW5jdGlvblZhbHVlKGZvcm0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlciwgZm9ybXM6IFBsdXJhbEZvcm1zKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybSA9IChuID09PSAwICYmIGZvcm1zLnplcm8pIHx8IChuID09PSAxICYmIGZvcm1zLm9uZSkgfHwgZm9ybXMub3RoZXI7XG4gIHJldHVybiBpc1BsdXJhbFJlc29sdmVyKGZvcm0pID8gZm9ybShuKSA6IChmb3JtID8/IG4udG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXQobG9jYWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IChuOiBudW1iZXIpID0+IG4udG9Mb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICBkYXRlOiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvc2Eod29yZDogc3RyaW5nLCB0eXBlOiBcIuydgOuKlFwiIHwgXCLsnbTqsIBcIiB8IFwi7J2E66W8XCIgfCBcIuqzvOyZgFwiIHwgXCLsnLzroZxcIikge1xuICBjb25zdCBoYXPrsJvsuaggPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RDaGFyID0gd29yZC5jaGFyQ29kZUF0KHdvcmQubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGxhc3RDaGFyIDwgMHhhYzAwIHx8IGxhc3RDaGFyID4gMHhkN2EzKVxuICAgICAgLy8g7ZWc6riAIOycoOuLiOy9lOuTnCDrspTsnIQ6IDB4QUMwMCB+IDB4RDdBM1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAobGFzdENoYXIgLSAweGFjMDApICUgMjggIT09IDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgbWFwID0ge1xuICAgIOydgOuKlDogaGFz67Cb7LmoID8gXCLsnYBcIiA6IFwi64qUXCIsXG4gICAg7J206rCAOiBoYXPrsJvsuaggPyBcIuydtFwiIDogXCLqsIBcIixcbiAgICDsnYTrpbw6IGhhc+uwm+y5qCA/IFwi7J2EXCIgOiBcIuulvFwiLFxuICAgIOqzvOyZgDogaGFz67Cb7LmoID8gXCLqs7xcIiA6IFwi7JmAXCIsXG4gICAg7Jy866GcOiBoYXPrsJvsuaggPyBcIuycvOuhnFwiIDogXCLroZxcIixcbiAgfTtcblxuICByZXR1cm4gd29yZCArIG1hcFt0eXBlXTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7bUJBQXdEO0FBVXhELFNBQVMsaUJBQWlCLE1BQThEO0NBQ3RGLE9BQU8sZ0JBQWdCLElBQUk7QUFDN0I7QUFFQSxTQUFnQixPQUFPLEdBQVcsT0FBNEI7Q0FDNUQsTUFBTSxPQUFRLE1BQU0sS0FBSyxNQUFNLFFBQVUsTUFBTSxLQUFLLE1BQU0sT0FBUSxNQUFNO0NBQ3hFLE9BQU8saUJBQWlCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSyxRQUFRLEVBQUUsU0FBUztBQUNoRTtBQUVBLFNBQWdCLGFBQWEsUUFBZ0I7Q0FDM0MsT0FBTztFQUNMLFNBQVMsTUFBYyxFQUFFLGVBQWUsTUFBTTtFQUM5QyxPQUFPLE1BQVksRUFBRSxtQkFBbUIsTUFBTTtDQUNoRDtBQUNGO0FBRUEsU0FBZ0IsS0FBSyxNQUFjLE1BQXdDO0NBQ3pFLE1BQU0sZUFBZTtFQUNuQixNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUssU0FBUyxDQUFDO0VBQ2hELElBQUksV0FBVyxTQUFVLFdBQVcsT0FFbEMsT0FBTztFQUNULFFBQVEsV0FBVyxTQUFVLE9BQU87Q0FDdEMsRUFBQSxDQUFHO0NBVUgsT0FBTyxPQUFPO0VBUFosSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE1BQU07RUFDbEIsSUFBSSxRQUFRLE9BQU87Q0FHUCxFQUFJO0FBQ3BCIn0=
@@ -13,8 +13,8 @@ declare class EntityManagerClass {
13
13
  modulePaths: Map<string, string>;
14
14
  private tableSpecs;
15
15
  isAutoloaded: boolean;
16
- autoload(_?: boolean): Promise<void>;
17
- schemaValidate(json: unknown): z.ZodError<{
16
+ autoload(doSilent?: boolean): Promise<void>;
17
+ schemaValidate<Value>(json: Value): z.ZodError<{
18
18
  id: string;
19
19
  title: string;
20
20
  table: string;
@@ -423,7 +423,7 @@ declare class EntityManagerClass {
423
423
  type: "virtual";
424
424
  id: string;
425
425
  name: string;
426
- virtualType?: "code" | "query" | undefined;
426
+ virtualType?: "query" | "code" | undefined;
427
427
  desc?: string | undefined;
428
428
  nullable?: boolean | undefined;
429
429
  toFilter?: boolean | undefined;
@@ -752,7 +752,16 @@ declare class EntityManagerClass {
752
752
  getModulePath(key: string): string;
753
753
  setTableSpec(tableSpec: TableSpec): void;
754
754
  getTableSpec(key: string): TableSpec;
755
- getNamesFromId(entityId: string): EntityNamesRecord;
755
+ getNamesFromId(entityId: string): {
756
+ fs: string;
757
+ fsPlural: string;
758
+ camel: string;
759
+ camelPlural: string;
760
+ capital: string;
761
+ capitalPlural: string;
762
+ upper: string;
763
+ constant: string;
764
+ };
756
765
  /**
757
766
  * EntityId는 Model을 제외한 PascalCase 이름입니다. (ex. "User")
758
767
  * @param filePath
@@ -1 +1 @@
1
- {"version":3,"file":"entity-manager.d.ts","sourceRoot":"","sources":["../../src/entity/entity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,CAAC,EAAE,MAAM,KAAK,CAAC;AAUvC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG,MAAM,CACpC,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,GAAG,UAAU,EAChG,MAAM,CACP,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AACF,cAAM,kBAAkB;IACtB,OAAO,CAAC,QAAQ,CAAkC;IAC3C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACpD,OAAO,CAAC,UAAU,CAAqC;IAChD,YAAY,EAAE,OAAO,CAAS;IAG/B,QAAQ,CAAC,CAAC,GAAE,OAAe;IA4BjC,cAAc,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKtB,MAAM,CAAC,QAAQ,GAAE,OAAe;IAShC,QAAQ,CACZ,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE;QAAE,mCAAmC,CAAC,EAAE,OAAO,CAAA;KAAO,GAC9D,OAAO,CAAC,IAAI,CAAC;IAWV,0CAA0C,IAAI,OAAO,CAAC,IAAI,CAAC;YAMnD,6BAA6B;YA8B7B,+BAA+B;IAyC7C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAS7B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IASjC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKjC,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,IAAI,MAAM,EAAE;IAI1B,eAAe,IAAI,MAAM,EAAE;IAO3B,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAO1C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAKpD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASlC,YAAY,CAAC,SAAS,EAAE,SAAS;IAIjC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IASpC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB;IAmBnD;;;;OAIG;IACH,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;YAarC,gCAAgC;IAoB9C,OAAO,CAAC,6BAA6B;CAUtC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
1
+ {"version":3,"file":"entity-manager.d.ts","sourceRoot":"","sources":["../../src/entity/entity-manager.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,24 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { globAsync, init_async_utils } from "../utils/async-utils.js";
3
- import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
3
  import { EntityJsonSchema, SonamuFileArraySchema, SonamuFileSchema, init_types, isSearchTextJsonSourceZodType, isSearchTextProp } from "../types/types.js";
4
+ import { Sonamu, init_sonamu } from "../api/sonamu.js";
5
5
  import { importMembers, init_esm_utils } from "../utils/esm-utils.js";
6
6
  import { init_path_utils, runtimePath } from "../utils/path-utils.js";
7
7
  import inflection from "inflection";
8
- import { prettifyError, z as z$1 } from "zod";
8
+ import { prettifyError, z } from "zod";
9
9
  import assert from "assert";
10
10
  import path from "path";
11
11
  import chalk from "chalk";
12
12
  import { glob, readFile } from "fs/promises";
13
13
  //#region src/entity/entity-manager.ts
14
+ function parseEntityJson(source) {
15
+ try {
16
+ return JSON.parse(source);
17
+ } catch (cause) {
18
+ if (!(cause instanceof SyntaxError)) throw new SyntaxError("entity.json 파싱 중 예기치 않은 오류가 발생했습니다.", { cause });
19
+ throw cause;
20
+ }
21
+ }
14
22
  var EntityManagerClass, EntityManager;
15
23
  var init_entity_manager = __esmMin((() => {
16
24
  init_sonamu();
@@ -23,16 +31,16 @@ var init_entity_manager = __esmMin((() => {
23
31
  modulePaths = /* @__PURE__ */ new Map();
24
32
  tableSpecs = /* @__PURE__ */ new Map();
25
33
  isAutoloaded = false;
26
- async autoload(_ = false) {
34
+ async autoload(doSilent = false) {
27
35
  if (this.isAutoloaded) return;
28
36
  const pathPattern = path.join(Sonamu.apiRootPath, "/src/application/**/*.entity.json");
29
37
  for await (const file of glob(path.resolve(pathPattern))) {
30
- const json = JSON.parse((await readFile(file)).toString());
38
+ const json = parseEntityJson((await readFile(file)).toString());
31
39
  const error = this.schemaValidate(json);
32
40
  if (error) {
33
41
  const relativePath = path.relative(Sonamu.apiRootPath, file);
34
42
  const errorMessage = prettifyError(error);
35
- console.error(chalk.red(`Invalid entity.json schema: ${relativePath}\n${chalk.yellow(errorMessage)}`));
43
+ if (!doSilent) console.error(chalk.red(`Invalid entity.json schema: ${relativePath}\n${chalk.yellow(errorMessage)}`));
36
44
  }
37
45
  await this.register(json, { deferSearchTextJsonSourceValidation: true });
38
46
  }
@@ -77,17 +85,17 @@ var init_entity_manager = __esmMin((() => {
77
85
  }
78
86
  async resolveSearchTextJsonSourceType(entity, typeId) {
79
87
  const localType = entity.types[typeId];
80
- if (localType instanceof z$1.ZodType) return localType;
88
+ if (localType instanceof z.ZodType) return localType;
81
89
  for (const registeredEntity of this.entities.values()) {
82
90
  const registeredType = registeredEntity.types[typeId];
83
- if (registeredType instanceof z$1.ZodType) return registeredType;
91
+ if (registeredType instanceof z.ZodType) return registeredType;
84
92
  }
85
93
  if (typeId === "SonamuFile") return SonamuFileSchema;
86
94
  if (typeId === "SonamuFile[]") return SonamuFileArraySchema;
87
95
  const modulePath = this.modulePaths.get(typeId);
88
96
  if (!modulePath) return null;
89
97
  const matched = (await importMembers(path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${modulePath}.js`)))).find(({ name }) => name === typeId);
90
- if (!matched || !(matched.value instanceof z$1.ZodType)) return null;
98
+ if (!matched || !(matched.value instanceof z.ZodType)) return null;
91
99
  return matched.value;
92
100
  }
93
101
  get(entityId) {
@@ -96,7 +104,7 @@ var init_entity_manager = __esmMin((() => {
96
104
  return entity;
97
105
  }
98
106
  getByTable(table) {
99
- const entity = Array.from(this.entities.values()).find((entity) => entity.table === table);
107
+ const entity = Array.from(this.entities.values()).find((candidate) => candidate.table === table);
100
108
  if (entity === void 0) throw new Error(`존재하지 않는 Entity 요청 ${table}`);
101
109
  return entity;
102
110
  }
@@ -173,7 +181,7 @@ var init_entity_manager = __esmMin((() => {
173
181
  for (const filePath of typePaths) {
174
182
  const modulePath = this.getModulePathFromTypeFilePath(filePath);
175
183
  const importedMembers = await importMembers(filePath);
176
- for (const { name, value } of importedMembers) if (value instanceof z$1.ZodType) this.setModulePath(name, modulePath);
184
+ for (const { name, value } of importedMembers) if (value instanceof z.ZodType) this.setModulePath(name, modulePath);
177
185
  }
178
186
  }
179
187
  getModulePathFromTypeFilePath(filePath) {
@@ -188,4 +196,4 @@ var init_entity_manager = __esmMin((() => {
188
196
  init_entity_manager();
189
197
  export { EntityManager, init_entity_manager };
190
198
 
191
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5jbGFzcyBFbnRpdHlNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIGVudGl0aWVzOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgbW9kdWxlUGF0aHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGFibGVTcGVjczogTWFwPHN0cmluZywgVGFibGVTcGVjPiA9IG5ldyBNYXAoKTtcbiAgcHVibGljIGlzQXV0b2xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIOqyveuhnCDsoITri6zrsJvslYQg66qo65OgIGVudGl0eS5qc29uIO2MjOydvCDroZzrk5xcbiAgYXN5bmMgYXV0b2xvYWQoXzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIvc3JjL2FwcGxpY2F0aW9uLyoqLyouZW50aXR5Lmpzb25cIik7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpbGUgb2YgZ2xvYihwYXRoLnJlc29sdmUocGF0aFBhdHRlcm4pKSkge1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZygpKTtcblxuICAgICAgLy8gZW50aXR5Lmpzb24g7Iqk7YKk66eIIOqygOymnVxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnNjaGVtYVZhbGlkYXRlKGpzb24pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlKTtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcHJldHRpZnlFcnJvcihlcnJvcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKGBJbnZhbGlkIGVudGl0eS5qc29uIHNjaGVtYTogJHtyZWxhdGl2ZVBhdGh9XFxuJHtjaGFsay55ZWxsb3coZXJyb3JNZXNzYWdlKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5yZWdpc3Rlcihqc29uLCB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpO1xuXG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgc2NoZW1hVmFsaWRhdGUoanNvbjogdW5rbm93bikge1xuICAgIGNvbnN0IHJlc3VsdCA9IEVudGl0eUpzb25TY2hlbWEuc2FmZVBhcnNlKGpzb24pO1xuICAgIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IG51bGwgOiByZXN1bHQuZXJyb3I7XG4gIH1cblxuICBhc3luYyByZWxvYWQoZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZW50aXRpZXMuY2xlYXIoKTtcbiAgICB0aGlzLm1vZHVsZVBhdGhzLmNsZWFyKCk7XG4gICAgdGhpcy50YWJsZVNwZWNzLmNsZWFyKCk7XG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1dG9sb2FkKGRvU2lsZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIGpzb246IEVudGl0eUpzb24sXG4gICAgb3B0aW9uczogeyBkZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbj86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEVudGl0eSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHlcIik7XG4gICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShqc29uKTtcbiAgICBhd2FpdCBlbnRpdHkucmVnaXN0ZXJNb2R1bGVQYXRocygpO1xuICAgIGlmICghb3B0aW9ucy5kZWZlclNlYXJjaFRleHRKc29uU291cmNlVmFsaWRhdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHkpO1xuICAgIH1cbiAgICBlbnRpdHkucmVnaXN0ZXJUYWJsZVNwZWNzKCk7XG4gICAgdGhpcy5lbnRpdGllcy5zZXQoanNvbi5pZCwgZW50aXR5KTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVNlYXJjaFRleHRKc29uU291cmNlcyhlbnRpdHk6IEVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgaWYgKCFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm9wLnNvdXJjZUNvbHVtbnMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgICAgIGlmICghc291cmNlUHJvcCB8fCBzb3VyY2VQcm9wLnR5cGUgIT09IFwianNvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b2RUeXBlID0gYXdhaXQgdGhpcy5yZXNvbHZlU2VhcmNoVGV4dEpzb25Tb3VyY2VUeXBlKGVudGl0eSwgc291cmNlUHJvcC5pZCk7XG4gICAgICAgIGlmICghem9kVHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBcIiR7c291cmNlLm5hbWV9XCLsnZgganNvbiDtg4DsnoUgXCIke3NvdXJjZVByb3AuaWR9XCLsnYQo66W8KSDroZzrk5ztlaAg7IiYIOyXhuyKteuLiOuLpC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHpvZFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydgCjripQpIHVud3JhcCDtm4Qgei5hcnJheSh6LnN0cmluZygpKSDsnbTslrTslbwg7ZWp64uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVNlYXJjaFRleHRKc29uU291cmNlVHlwZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx6LlpvZFR5cGVBbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbG9jYWxUeXBlID0gZW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgaWYgKGxvY2FsVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgcmV0dXJuIGxvY2FsVHlwZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZ2lzdGVyZWRFbnRpdHkgb2YgdGhpcy5lbnRpdGllcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZFR5cGUgPSByZWdpc3RlcmVkRW50aXR5LnR5cGVzW3R5cGVJZF07XG4gICAgICBpZiAocmVnaXN0ZXJlZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRUeXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlSWQgPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZVNjaGVtYTtcbiAgICB9XG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgICAgcmV0dXJuIFNvbmFtdUZpbGVBcnJheVNjaGVtYTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQodHlwZUlkKTtcbiAgICBpZiAoIW1vZHVsZVBhdGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHttb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG4gICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx1bmtub3duPihtb2R1bGVGaWxlUGF0aCk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IGltcG9ydGVkTWVtYmVycy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gdHlwZUlkKTtcbiAgICBpZiAoIW1hdGNoZWQgfHwgIShtYXRjaGVkLnZhbHVlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQudmFsdWU7XG4gIH1cblxuICBnZXQoZW50aXR5SWQ6IHN0cmluZyk6IEVudGl0eSB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eSDsmpTssq0gJHtlbnRpdHlJZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgZ2V0QnlUYWJsZSh0YWJsZTogc3RyaW5nKTogRW50aXR5IHtcbiAgICBjb25zdCBlbnRpdHkgPSBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnRhYmxlID09PSB0YWJsZSk7XG4gICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgRW50aXR5IOyalOyyrSAke3RhYmxlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBleGlzdHMoZW50aXR5SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXMuZ2V0KGVudGl0eUlkKTtcbiAgICByZXR1cm4gZW50aXR5ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBbGxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKEVudGl0eU1hbmFnZXIuZW50aXRpZXMua2V5cygpKS50b1NvcnRlZCgpO1xuICB9XG5cbiAgZ2V0QWxsRW50aXRpZXMoKTogRW50aXR5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50aXRpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgZ2V0QWxsUGFyZW50SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxJZHMoKS5maWx0ZXIoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldChlbnRpdHlJZCk7XG4gICAgICByZXR1cm4gZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDaGlsZHJlbklkcyhwYXJlbnRJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbElkcygpLmZpbHRlcigoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0KGVudGl0eUlkKTtcbiAgICAgIHJldHVybiBlbnRpdHkucGFyZW50SWQgPT09IHBhcmVudElkO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kdWxlUGF0aChrZXk6IHN0cmluZywgbW9kdWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhjaGFsay5jeWFuKGBzZXRNb2R1bGVQYXRoIDo6ICR7a2V5fSA6OiAke21vZHVsZVBhdGh9YCkpO1xuICAgIHRoaXMubW9kdWxlUGF0aHMuc2V0KGtleSwgbW9kdWxlUGF0aCk7XG4gIH1cblxuICBnZXRNb2R1bGVQYXRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5tb2R1bGVQYXRocy5nZXQoa2V5KTtcbiAgICBpZiAobW9kdWxlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg66qo65OIIO2MqOyKpCDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVBhdGg7XG4gIH1cblxuICBzZXRUYWJsZVNwZWModGFibGVTcGVjOiBUYWJsZVNwZWMpIHtcbiAgICB0aGlzLnRhYmxlU3BlY3Muc2V0KHRhYmxlU3BlYy5uYW1lLCB0YWJsZVNwZWMpO1xuICB9XG5cbiAgZ2V0VGFibGVTcGVjKGtleTogc3RyaW5nKTogVGFibGVTcGVjIHtcbiAgICBjb25zdCB0YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlY3MuZ2V0KGtleSk7XG4gICAgaWYgKHRhYmxlU3BlYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUIOyKpO2OmSDsmpTssq0gJHtrZXl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlU3BlYztcbiAgfVxuXG4gIGdldE5hbWVzRnJvbUlkKGVudGl0eUlkOiBzdHJpbmcpOiBFbnRpdHlOYW1lc1JlY29yZCB7XG4gICAgLy8gZW50aXR5SWTqsIAg64uo67O17IiYIOuPme2YlSDri6jslrTsnbgg6rK97JqwIExpc3Qg67aZ7Jes7IScIOyDneyEsVxuICAgIGNvbnN0IHBsdXJhbGl6ZWQgPVxuICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpID09PSBlbnRpdHlJZFxuICAgICAgICA/IGAke2VudGl0eUlkfUxpc3RgXG4gICAgICAgIDogaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5SWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5SWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnNQbHVyYWw6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwbHVyYWxpemVkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGNhbWVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eUlkLCB0cnVlKSxcbiAgICAgIGNhbWVsUGx1cmFsOiBpbmZsZWN0aW9uLmNhbWVsaXplKHBsdXJhbGl6ZWQsIHRydWUpLFxuICAgICAgY2FwaXRhbDogZW50aXR5SWQsXG4gICAgICBjYXBpdGFsUGx1cmFsOiBwbHVyYWxpemVkLFxuICAgICAgdXBwZXI6IGVudGl0eUlkLnRvVXBwZXJDYXNlKCksXG4gICAgICBjb25zdGFudDogaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKS50b1VwcGVyQ2FzZSgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW50aXR5SWTripQgTW9kZWzsnYQg7KCc7Jm47ZWcIFBhc2NhbENhc2Ug7J2066aE7J6F64uI64ukLiAoZXguIFwiVXNlclwiKVxuICAgKiBAcGFyYW0gZmlsZVBhdGhcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEVudGl0eUlkRnJvbVBhdGgoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRTdWZmaXhlcyA9IFtcIi5tb2RlbC50c1wiLCBcIi5tb2RlbC5qc1wiLCBcIi5lbnRpdHkuanNvblwiLCBcIi5mcmFtZS50c1wiLCBcIi5mcmFtZS5qc1wiXTtcbiAgICBjb25zdCBtYXRjaGVkU3VmZml4ID0gc3VwcG9ydGVkU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBmaWxlTmFtZS5lbmRzV2l0aChzdWZmaXgpKTtcblxuICAgIGFzc2VydChtYXRjaGVkU3VmZml4LCBg7KeA7JuQ7ZWY7KeAIOyViuuKlCBlbnRpdHkg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgY29uc3QgZW50aXR5QmFzZU5hbWUgPSBmaWxlTmFtZS5zbGljZSgwLCAtbWF0Y2hlZFN1ZmZpeC5sZW5ndGgpO1xuICAgIGFzc2VydChlbnRpdHlCYXNlTmFtZS5sZW5ndGggPiAwLCBgRW50aXR5SWTrpbwg6rOE7IKw7ZWgIOyImCDsl4bripQg6rK966Gc7J6F64uI64ukOiAke2ZpbGVQYXRofWApO1xuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uY2FtZWxpemUoZW50aXR5QmFzZU5hbWUucmVwbGFjZSgvLS9nLCBcIl9cIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3Rlck5vbkVudGl0eVR5cGVNb2R1bGVQYXRocygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0eXBlUGF0aHNQYXR0ZXJucyA9IFtcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIHJ1bnRpbWVQYXRoKFwic3JjL2FwcGxpY2F0aW9uLyoqLyoudHlwZXMudHNcIikpLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIikpLFxuICAgIF07XG4gICAgY29uc3QgdHlwZVBhdGhzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBnbG9iQXN5bmMocGF0dGVybikpKVxuICAgICkuZmxhdCgpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiB0eXBlUGF0aHMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGhGcm9tVHlwZUZpbGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8dW5rbm93bj4oZmlsZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0TW9kdWxlUGF0aChuYW1lLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG5vcm1hbGl6ZWRQYXRoLm1hdGNoKC9cXC8oPzpzcmN8ZGlzdClcXC9hcHBsaWNhdGlvblxcLyguKylcXC4oPzp0c3xqcykkLyk7XG5cbiAgICBpZiAoIW1hdGNoZWQ/LlsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7J287J2YIOuqqOuTiCDqsr3roZzrpbwg6rOE7IKw7ZWgIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWRbMV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEVudGl0eU1hbmFnZXIgPSBuZXcgRW50aXR5TWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzthQVFzQztZQU9mO2tCQUV5QjtnQkFDRTtpQkFFRDtDQVkzQyxxQkFBTixNQUF5QjtFQUN2QiwyQkFBd0MsSUFBSSxJQUFJO0VBQ2hELDhCQUEwQyxJQUFJLElBQUk7RUFDbEQsNkJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUErQjtFQUcvQixNQUFNLFNBQVMsSUFBYSxPQUFPO0dBQ2pDLElBQUksS0FBSyxjQUNQO0dBRUYsTUFBTSxjQUFjLEtBQUssS0FBSyxPQUFPLGFBQWEsbUNBQW1DO0dBRXJGLFdBQVcsTUFBTSxRQUFRLEtBQUssS0FBSyxRQUFRLFdBQVcsQ0FBQyxHQUFHO0lBQ3hELE1BQU0sT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLElBQUksRUFBQSxDQUFHLFNBQVMsQ0FBQztJQUd6RCxNQUFNLFFBQVEsS0FBSyxlQUFlLElBQUk7SUFDdEMsSUFBSSxPQUFPO0tBQ1Qs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
199
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LW1hbmFnZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VudGl0eS9lbnRpdHktbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGdsb2IsIHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgcHJldHRpZnlFcnJvciwgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7XG4gIEVudGl0eUpzb25TY2hlbWEsXG4gIGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlKc29uIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnbG9iQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG5leHBvcnQgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCA9IFJlY29yZDxcbiAgXCJmc1wiIHwgXCJmc1BsdXJhbFwiIHwgXCJjYW1lbFwiIHwgXCJjYW1lbFBsdXJhbFwiIHwgXCJjYXBpdGFsXCIgfCBcImNhcGl0YWxQbHVyYWxcIiB8IFwidXBwZXJcIiB8IFwiY29uc3RhbnRcIixcbiAgc3RyaW5nXG4+O1xuZXhwb3J0IHR5cGUgVGFibGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuaXF1ZUluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIGpzb25Db2x1bW5zOiBzdHJpbmdbXTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRW50aXR5SnNvbihzb3VyY2U6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gSlNPTiDtjIzshJwg6rOE7JW9IOuwluydmCDsmKTrpZjripQg6rWs66y4IOyYpOulmOuhnCDsoJXqt5ztmZTtlZjqs6Ag7JuQ7J247J2EIOuztOyhtO2VqeuLiOuLpC5cbiAgICBpZiAoIShjYXVzZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZW50aXR5Lmpzb24g7YyM7IuxIOykkSDsmIjquLDsuZgg7JWK7J2AIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICAgIHRocm93IGNhdXNlO1xuICB9XG59XG5cbmNsYXNzIEVudGl0eU1hbmFnZXJDbGFzcyB7XG4gIHByaXZhdGUgZW50aXRpZXM6IE1hcDxzdHJpbmcsIEVudGl0eT4gPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBtb2R1bGVQYXRoczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSB0YWJsZVNwZWNzOiBNYXA8c3RyaW5nLCBUYWJsZVNwZWM+ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgaXNBdXRvbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8g6rK966GcIOyghOuLrOuwm+yVhCDrqqjrk6AgZW50aXR5Lmpzb24g7YyM7J28IOuhnOuTnFxuICBhc3luYyBhdXRvbG9hZChkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIvc3JjL2FwcGxpY2F0aW9uLyoqLyouZW50aXR5Lmpzb25cIik7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpbGUgb2YgZ2xvYihwYXRoLnJlc29sdmUocGF0aFBhdHRlcm4pKSkge1xuICAgICAgY29uc3QganNvbiA9IHBhcnNlRW50aXR5SnNvbigoYXdhaXQgcmVhZEZpbGUoZmlsZSkpLnRvU3RyaW5nKCkpO1xuXG4gICAgICAvLyBlbnRpdHkuanNvbiDsiqTtgqTrp4gg6rKA7KadXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuc2NoZW1hVmFsaWRhdGUoanNvbik7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGZpbGUpO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBwcmV0dGlmeUVycm9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoYEludmFsaWQgZW50aXR5Lmpzb24gc2NoZW1hOiAke3JlbGF0aXZlUGF0aH1cXG4ke2NoYWxrLnllbGxvdyhlcnJvck1lc3NhZ2UpfWApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5yZWdpc3Rlcihqc29uLCB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJOb25FbnRpdHlUeXBlTW9kdWxlUGF0aHMoKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQWxsUmVnaXN0ZXJlZFNlYXJjaFRleHRKc29uU291cmNlcygpO1xuXG4gICAgdGhpcy5pc0F1dG9sb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgc2NoZW1hVmFsaWRhdGU8VmFsdWU+KGpzb246IFZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UoanNvbik7XG4gICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzID8gbnVsbCA6IHJlc3VsdC5lcnJvcjtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZChkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5lbnRpdGllcy5jbGVhcigpO1xuICAgIHRoaXMubW9kdWxlUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLnRhYmxlU3BlY3MuY2xlYXIoKTtcbiAgICB0aGlzLmlzQXV0b2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0b2xvYWQoZG9TaWxlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoXG4gICAganNvbjogRW50aXR5SnNvbixcbiAgICBvcHRpb25zOiB7IGRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgRW50aXR5IH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eVwiKTtcbiAgICBjb25zdCBlbnRpdHkgPSBuZXcgRW50aXR5KGpzb24pO1xuICAgIGF3YWl0IGVudGl0eS5yZWdpc3Rlck1vZHVsZVBhdGhzKCk7XG4gICAgaWYgKCFvcHRpb25zLmRlZmVyU2VhcmNoVGV4dEpzb25Tb3VyY2VWYWxpZGF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eSk7XG4gICAgfVxuICAgIGVudGl0eS5yZWdpc3RlclRhYmxlU3BlY3MoKTtcbiAgICB0aGlzLmVudGl0aWVzLnNldChqc29uLmlkLCBlbnRpdHkpO1xuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVBbGxSZWdpc3RlcmVkU2VhcmNoVGV4dEpzb25Tb3VyY2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHRoaXMuZW50aXRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVTZWFyY2hUZXh0SnNvblNvdXJjZXMoZW50aXR5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU2VhcmNoVGV4dEpzb25Tb3VyY2VzKGVudGl0eTogRW50aXR5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcHNCeU5hbWUgPSBuZXcgTWFwKGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICBpZiAoIWlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3Auc291cmNlQ29sdW1ucykge1xuICAgICAgICBjb25zdCBzb3VyY2VQcm9wID0gcHJvcHNCeU5hbWUuZ2V0KHNvdXJjZS5uYW1lKTtcbiAgICAgICAgaWYgKCFzb3VyY2VQcm9wIHx8IHNvdXJjZVByb3AudHlwZSAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBhd2FpdCB0aGlzLnJlc29sdmVTZWFyY2hUZXh0SnNvblNvdXJjZVR5cGUoZW50aXR5LCBzb3VyY2VQcm9wLmlkKTtcbiAgICAgICAgaWYgKCF6b2RUeXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNlYXJjaFRleHQgc291cmNlIFwiJHtzb3VyY2UubmFtZX1cIuydmCBqc29uIO2DgOyehSBcIiR7c291cmNlUHJvcC5pZH1cIuydhCjrpbwpIOuhnOuTnO2VoCDsiJgg7JeG7Iq164uI64ukLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNTZWFyY2hUZXh0SnNvblNvdXJjZVpvZFR5cGUoem9kVHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc2VhcmNoVGV4dCBzb3VyY2UgXCIke3NvdXJjZS5uYW1lfVwi7J2YIGpzb24g7YOA7J6FIFwiJHtzb3VyY2VQcm9wLmlkfVwi7J2AKOuKlCkgdW53cmFwIO2bhCB6LmFycmF5KHouc3RyaW5nKCkpIOydtOyWtOyVvCDtlanri4jri6QuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlU2VhcmNoVGV4dEpzb25Tb3VyY2VUeXBlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHR5cGVJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPHouWm9kVHlwZUFueSB8IG51bGw+IHtcbiAgICBjb25zdCBsb2NhbFR5cGUgPSBlbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICBpZiAobG9jYWxUeXBlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICByZXR1cm4gbG9jYWxUeXBlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZEVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkVHlwZSA9IHJlZ2lzdGVyZWRFbnRpdHkudHlwZXNbdHlwZUlkXTtcbiAgICAgIGlmIChyZWdpc3RlcmVkVHlwZSBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVJZCA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICAgIHJldHVybiBTb25hbXVGaWxlU2NoZW1hO1xuICAgIH1cbiAgICBpZiAodHlwZUlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gU29uYW11RmlsZUFycmF5U2NoZW1hO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLm1vZHVsZVBhdGhzLmdldCh0eXBlSWQpO1xuICAgIGlmICghbW9kdWxlUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcbiAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHVua25vd24+KG1vZHVsZUZpbGVQYXRoKTtcbiAgICBjb25zdCBtYXRjaGVkID0gaW1wb3J0ZWRNZW1iZXJzLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSB0eXBlSWQpO1xuICAgIGlmICghbWF0Y2hlZCB8fCAhKG1hdGNoZWQudmFsdWUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZC52YWx1ZTtcbiAgfVxuXG4gIGdldChlbnRpdHlJZDogc3RyaW5nKTogRW50aXR5IHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0aWVzLmdldChlbnRpdHlJZCk7XG4gICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgRW50aXR5IOyalOyyrSAke2VudGl0eUlkfWApO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBnZXRCeVRhYmxlKHRhYmxlOiBzdHJpbmcpOiBFbnRpdHkge1xuICAgIGNvbnN0IGVudGl0eSA9IEFycmF5LmZyb20odGhpcy5lbnRpdGllcy52YWx1ZXMoKSkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50YWJsZSA9PT0gdGFibGUsXG4gICAgKTtcbiAgICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCBFbnRpdHkg7JqU7LKtICR7dGFibGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIGV4aXN0cyhlbnRpdHlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdGllcy5nZXQoZW50aXR5SWQpO1xuICAgIHJldHVybiBlbnRpdHkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldEFsbElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oRW50aXR5TWFuYWdlci5lbnRpdGllcy5rZXlzKCkpLnRvU29ydGVkKCk7XG4gIH1cblxuICBnZXRBbGxFbnRpdGllcygpOiBFbnRpdHlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRpdGllcy52YWx1ZXMoKSk7XG4gIH1cblxuICBnZXRBbGxQYXJlbnRJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbElkcygpLmZpbHRlcigoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0KGVudGl0eUlkKTtcbiAgICAgIHJldHVybiBlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENoaWxkcmVuSWRzKHBhcmVudElkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsSWRzKCkuZmlsdGVyKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIGVudGl0eS5wYXJlbnRJZCA9PT0gcGFyZW50SWQ7XG4gICAgfSk7XG4gIH1cblxuICBzZXRNb2R1bGVQYXRoKGtleTogc3RyaW5nLCBtb2R1bGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGNoYWxrLmN5YW4oYHNldE1vZHVsZVBhdGggOjogJHtrZXl9IDo6ICR7bW9kdWxlUGF0aH1gKSk7XG4gICAgdGhpcy5tb2R1bGVQYXRocy5zZXQoa2V5LCBtb2R1bGVQYXRoKTtcbiAgfVxuXG4gIGdldE1vZHVsZVBhdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLm1vZHVsZVBhdGhzLmdldChrZXkpO1xuICAgIGlmIChtb2R1bGVQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCDrqqjrk4gg7Yyo7IqkIOyalOyyrSAke2tleX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlUGF0aDtcbiAgfVxuXG4gIHNldFRhYmxlU3BlYyh0YWJsZVNwZWM6IFRhYmxlU3BlYykge1xuICAgIHRoaXMudGFibGVTcGVjcy5zZXQodGFibGVTcGVjLm5hbWUsIHRhYmxlU3BlYyk7XG4gIH1cblxuICBnZXRUYWJsZVNwZWMoa2V5OiBzdHJpbmcpOiBUYWJsZVNwZWMge1xuICAgIGNvbnN0IHRhYmxlU3BlYyA9IHRoaXMudGFibGVTcGVjcy5nZXQoa2V5KTtcbiAgICBpZiAodGFibGVTcGVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCDthYzsnbTruJQg7Iqk7Y6ZIOyalOyyrSAke2tleX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVTcGVjO1xuICB9XG5cbiAgZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQ6IHN0cmluZykge1xuICAgIC8vIGVudGl0eUlk6rCAIOuLqOuzteyImCDrj5ntmJUg64uo7Ja07J24IOqyveyasCBMaXN0IOu2meyXrOyEnCDsg53shLFcbiAgICBjb25zdCBwbHVyYWxpemVkID1cbiAgICAgIGluZmxlY3Rpb24ucGx1cmFsaXplKGVudGl0eUlkKSA9PT0gZW50aXR5SWRcbiAgICAgICAgPyBgJHtlbnRpdHlJZH1MaXN0YFxuICAgICAgICA6IGluZmxlY3Rpb24ucGx1cmFsaXplKGVudGl0eUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICBmczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzUGx1cmFsOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGx1cmFsaXplZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBjYW1lbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShlbnRpdHlJZCwgdHJ1ZSksXG4gICAgICBjYW1lbFBsdXJhbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShwbHVyYWxpemVkLCB0cnVlKSxcbiAgICAgIGNhcGl0YWw6IGVudGl0eUlkLFxuICAgICAgY2FwaXRhbFBsdXJhbDogcGx1cmFsaXplZCxcbiAgICAgIHVwcGVyOiBlbnRpdHlJZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgY29uc3RhbnQ6IGluZmxlY3Rpb24udW5kZXJzY29yZShlbnRpdHlJZCkudG9VcHBlckNhc2UoKSxcbiAgICB9IHNhdGlzZmllcyBFbnRpdHlOYW1lc1JlY29yZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHlJZOuKlCBNb2RlbOydhCDsoJzsmbjtlZwgUGFzY2FsQ2FzZSDsnbTrpoTsnoXri4jri6QuIChleC4gXCJVc2VyXCIpXG4gICAqIEBwYXJhbSBmaWxlUGF0aFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0RW50aXR5SWRGcm9tUGF0aChmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHN1cHBvcnRlZFN1ZmZpeGVzID0gW1wiLm1vZGVsLnRzXCIsIFwiLm1vZGVsLmpzXCIsIFwiLmVudGl0eS5qc29uXCIsIFwiLmZyYW1lLnRzXCIsIFwiLmZyYW1lLmpzXCJdO1xuICAgIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBzdXBwb3J0ZWRTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGZpbGVOYW1lLmVuZHNXaXRoKHN1ZmZpeCkpO1xuXG4gICAgYXNzZXJ0KG1hdGNoZWRTdWZmaXgsIGDsp4Dsm5DtlZjsp4Ag7JWK64qUIGVudGl0eSDqsr3roZzsnoXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG5cbiAgICBjb25zdCBlbnRpdHlCYXNlTmFtZSA9IGZpbGVOYW1lLnNsaWNlKDAsIC1tYXRjaGVkU3VmZml4Lmxlbmd0aCk7XG4gICAgYXNzZXJ0KGVudGl0eUJhc2VOYW1lLmxlbmd0aCA+IDAsIGBFbnRpdHlJZOulvCDqs4TsgrDtlaAg7IiYIOyXhuuKlCDqsr3roZzsnoXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG5cbiAgICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShlbnRpdHlCYXNlTmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyTm9uRW50aXR5VHlwZU1vZHVsZVBhdGhzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHR5cGVQYXRoc1BhdHRlcm5zID0gW1xuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi50eXBlcy50c1wiKSksXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLmdlbmVyYXRlZC50c1wiKSksXG4gICAgXTtcbiAgICBjb25zdCB0eXBlUGF0aHMgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0eXBlUGF0aHNQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IGdsb2JBc3luYyhwYXR0ZXJuKSkpXG4gICAgKS5mbGF0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHR5cGVQYXRocykge1xuICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IHRoaXMuZ2V0TW9kdWxlUGF0aEZyb21UeXBlRmlsZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx1bmtub3duPihmaWxlUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBpbXBvcnRlZE1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRNb2R1bGVQYXRoKG5hbWUsIG1vZHVsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNb2R1bGVQYXRoRnJvbVR5cGVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBjb25zdCBtYXRjaGVkID0gbm9ybWFsaXplZFBhdGgubWF0Y2goL1xcLyg/OnNyY3xkaXN0KVxcL2FwcGxpY2F0aW9uXFwvKC4rKVxcLig/OnRzfGpzKSQvKTtcblxuICAgIGlmICghbWF0Y2hlZD8uWzFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsnbzsnZgg66qo65OIIOqyveuhnOulvCDqs4TsgrDtlaAg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZFsxXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRW50aXR5TWFuYWdlciA9IG5ldyBFbnRpdHlNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlDQSxTQUFTLGdCQUFnQixRQUFnQjtDQUN2QyxJQUFJO0VBQ0YsT0FBTyxLQUFLLE1BQU0sTUFBTTtDQUMxQixTQUFTLE9BQU87RUFFZCxJQUFJLEVBQUUsaUJBQWlCLGNBQ3JCLE1BQU0sSUFBSSxZQUFZLHVDQUF1QyxFQUFFLE1BQU0sQ0FBQztFQUV4RSxNQUFNO0NBQ1I7QUFDRjs7O2FBbkNzQztZQU9mO2tCQUV5QjtnQkFDRTtpQkFFRDtDQXlCM0MscUJBQU4sTUFBeUI7RUFDdkIsMkJBQXdDLElBQUksSUFBSTtFQUNoRCw4QkFBMEMsSUFBSSxJQUFJO0VBQ2xELDZCQUE2QyxJQUFJLElBQUk7RUFDckQsZUFBK0I7RUFHL0IsTUFBTSxTQUFTLFdBQW9CLE9BQU87R0FDeEMsSUFBSSxLQUFLLGNBQ1A7R0FFRixNQUFNLGNBQWMsS0FBSyxLQUFLLE9BQU8sYUFBYSxtQ0FBbUM7R0FFckYsV0FBVyxNQUFNLFFBQVEsS0FBSyxLQUFLLFFBQVEsV0FBVyxDQUFDLEdBQUc7SUFDeEQsTUFBTSxPQUFPLGlCQUFpQixNQUFNLFNBQVMsSUFBSSxFQUFBLENBQUcsU0FBUyxDQUFDO0lBRzlELE1BQU0sUUFBUSxLQUFLLGVBQWUsSUFBSTtJQUN0QyxJQUFJLE9BQU87S0FDVCxNQUFNLGVBQWUsS0FBSyxTQUFTLE9BQU8sYUFBYSxJQUFJO0tBQzNELE1BQU0sZUFBZSxjQUFjLEtBQUs7S0FDeEMsSUFBSSxDQUFDLFVBQ0gsUUFBUSxNQUNOLE1BQU0sSUFBSSwrQkFBK0IsYUFBYSxJQUFJLE1BQU0sT0FBTyxZQUFZLEdBQUcsQ0FDeEY7SUFFSjtJQUVBLE1BQU0sS0FBSyxTQUFTLE1BQU0sRUFBRSxxQ0FBcUMsS0FBSyxDQUFDO0dBQ3pFO0dBRUEsTUFBTSxLQUFLLGlDQUFpQztHQUM1QyxNQUFNLEtBQUssMkNB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