sonamu 0.10.12 → 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 (513) 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 +131 -27
  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 +12 -6
  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 +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  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/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
@@ -1,14 +1,15 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
2
3
  import { assertDefined, init_utils, nonNullable } from "../utils/utils.js";
3
4
  import { formatCode, init_formatter } from "../utils/formatter.js";
4
5
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
5
- import { Sonamu, init_sonamu } from "../api/sonamu.js";
6
6
  import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
7
+ import { Sonamu, init_sonamu } from "../api/sonamu.js";
7
8
  import { importMembers, init_esm_utils } from "../utils/esm-utils.js";
8
9
  import { init_path_utils, runtimePath } from "../utils/path-utils.js";
9
10
  import { EntityManager, init_entity_manager } from "./entity-manager.js";
10
11
  import inflection from "inflection";
11
- import { z as z$1 } from "zod";
12
+ import { z } from "zod";
12
13
  import { group, unique } from "radashi";
13
14
  import assert from "assert";
14
15
  import path from "path";
@@ -22,6 +23,7 @@ var init_entity = __esmMin((() => {
22
23
  init_formatter();
23
24
  init_fs_utils();
24
25
  init_path_utils();
26
+ init_runtime_value();
25
27
  init_utils();
26
28
  init_entity_manager();
27
29
  Entity = class {
@@ -78,7 +80,7 @@ var init_entity = __esmMin((() => {
78
80
  return [key, getEnumDefValues(enumDef)];
79
81
  }));
80
82
  this.enums = Object.fromEntries(Object.entries(this.enumLabels).map(([key, enumLabel]) => {
81
- return [key, z$1.enum(Object.keys(enumLabel))];
83
+ return [key, z.enum(Object.keys(enumLabel))];
82
84
  }));
83
85
  this.names = {
84
86
  parentFs: inflection.dasherize(inflection.underscore(parentId ?? id)).toLowerCase(),
@@ -137,7 +139,7 @@ var init_entity = __esmMin((() => {
137
139
  for (let i = 0; i < parts.length - 1; i++) {
138
140
  const part = parts[i];
139
141
  if (part in current) {
140
- if (typeof current[part] === "string") throw new Error(`Conflict detected in select items: parent path "${parts.slice(0, i + 1).join("__")}" is already set as a field, cannot nest "${alias}" under it.`);
142
+ if (isStringValue(current[part])) throw new Error(`Conflict detected in select items: parent path "${parts.slice(0, i + 1).join("__")}" is already set as a field, cannot nest "${alias}" under it.`);
141
143
  } else current[part] = {};
142
144
  current = current[part];
143
145
  }
@@ -145,7 +147,7 @@ var init_entity = __esmMin((() => {
145
147
  current[lastPart] = columnValue;
146
148
  }
147
149
  }
148
- return result;
150
+ return Object.fromEntries(Object.entries(result));
149
151
  }
150
152
  /**
151
153
  * JSON.stringify와 유사한 일을 합니다.
@@ -171,7 +173,7 @@ var init_entity = __esmMin((() => {
171
173
  const entries = Object.entries(obj);
172
174
  if (entries.length === 0) return withBraces ? "{}" : "";
173
175
  const lines = entries.map(([key, value]) => {
174
- if (typeof value === "string") return `${innerSpaces}${key}: ${value},`;
176
+ if (isStringValue(value)) return `${innerSpaces}${key}: ${value},`;
175
177
  else return `${innerSpaces}${key}: ${this.stringifyNestedSelectObject(value, indent + 1, true)},`;
176
178
  });
177
179
  if (withBraces) return `{\n${lines.join("\n")}\n${spaces}}`;
@@ -181,9 +183,9 @@ var init_entity = __esmMin((() => {
181
183
  const subset = this.getSubsetFieldsForQuery(subsetKey);
182
184
  const { loaders } = this.resolveSubsetQuery("", subset);
183
185
  const lines = [`[`];
184
- const generateLoaderCode = (loaders) => {
186
+ const generateLoaderCode = (nestedLoaders) => {
185
187
  const loaderLines = [];
186
- for (const loader of loaders) {
188
+ for (const loader of nestedLoaders) {
187
189
  const { toTable, toCol, through, fromTable } = loader.manyJoin;
188
190
  const fromIdsType = EntityManager.getByTable(fromTable).getPkArrayType();
189
191
  loaderLines.push("{", `as: "${loader.as}",`, `refId: "${loader.manyJoin.idField}",`, `qb: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[] | string[]) => {`);
@@ -231,11 +233,11 @@ var init_entity = __esmMin((() => {
231
233
  } else return "";
232
234
  });
233
235
  return Object.keys(subsetGroup).reduce((r, groupKey) => {
234
- const fields = subsetGroup[groupKey];
235
- assert(fields !== void 0, "fields is undefined");
236
+ const groupedFields = subsetGroup[groupKey];
237
+ assert(groupedFields !== void 0, "fields is undefined");
236
238
  if (groupKey === "") {
237
- const realFields = fields.filter((field) => !isVirtualProp(this.propsDict[field]));
238
- const virtualCodeFields = fields.filter((field) => isVirtualCodeProp(this.propsDict[field]));
239
+ const realFields = groupedFields.filter((field) => !isVirtualProp(this.propsDict[field]));
240
+ const virtualCodeFields = groupedFields.filter((field) => isVirtualCodeProp(this.propsDict[field]));
239
241
  if (prefix === "") {
240
242
  r.select = r.select.concat(realFields.map((field) => this.getFullFieldName(field)));
241
243
  r.virtual = r.virtual.concat(virtualCodeFields);
@@ -246,7 +248,7 @@ var init_entity = __esmMin((() => {
246
248
  if (relation === void 0) throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);
247
249
  const relEntity = EntityManager.get(relation.with);
248
250
  if (isOneToOneRelationProp(relation) || isBelongsToOneRelationProp(relation)) {
249
- const relFields = fields.map((field) => field.split(".").slice(1).join("."));
251
+ const relFields = groupedFields.map((field) => field.split(".").slice(1).join("."));
250
252
  if (relFields.length === 1 && relFields[0] === "id") {
251
253
  if (prefix === "") r.select = r.select.concat(`${this.table}.${groupKey}_id`);
252
254
  else r.select = r.select.concat(`${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`);
@@ -305,7 +307,7 @@ var init_entity = __esmMin((() => {
305
307
  }
306
308
  r.joins = r.joins.concat(relSubsetQuery.joins);
307
309
  } else if (isHasManyRelationProp(relation) || isManyToManyRelationProp(relation)) {
308
- const relFields = fields.map((field) => field.split(".").slice(1).join("."));
310
+ const relFields = groupedFields.map((field) => field.split(".").slice(1).join("."));
309
311
  const relSubsetQuery = relEntity.resolveSubsetQuery("", relFields);
310
312
  let manyJoin;
311
313
  if (isHasManyRelationProp(relation)) {
@@ -361,8 +363,8 @@ var init_entity = __esmMin((() => {
361
363
  return result;
362
364
  }, {});
363
365
  return Object.keys(groups).flatMap((key) => {
364
- const group = groups[key];
365
- if (key === "") return group.map((propName) => {
366
+ const groupedFieldExprs = groups[key];
367
+ if (key === "") return groupedFieldExprs.map((propName) => {
366
368
  const prop = entity.props.find((p) => p.name === propName);
367
369
  if (prop === void 0) throw new Error(`${entity.id} -- 잘못된 FieldExpr '${propName}' (사용 가능한 props: ${entity.props.map((p) => p.name).join(", ")})`);
368
370
  return {
@@ -371,10 +373,10 @@ var init_entity = __esmMin((() => {
371
373
  };
372
374
  });
373
375
  const prop = entity.propsDict[key];
374
- if (!isRelationProp(prop)) throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);
376
+ if (!isRelationProp(prop)) throw new Error(`잘못된 FieldExpr ${key}.${groupedFieldExprs[0]}`);
375
377
  const relEntity = EntityManager.get(prop.with);
376
378
  if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {
377
- if (group.length === 1 && (group[0] === "id" || group[0] === "id?")) return {
379
+ if (groupedFieldExprs.length === 1 && (groupedFieldExprs[0] === "id" || groupedFieldExprs[0] === "id?")) return {
378
380
  nodeType: "plain",
379
381
  prop: {
380
382
  ...relEntity.propsDict.id,
@@ -383,7 +385,7 @@ var init_entity = __esmMin((() => {
383
385
  }
384
386
  };
385
387
  }
386
- const children = this.fieldExprsToPropNodes(group, relEntity);
388
+ const children = this.fieldExprsToPropNodes(groupedFieldExprs, relEntity);
387
389
  return {
388
390
  nodeType: isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) ? "object" : "array",
389
391
  prop,
@@ -574,9 +576,9 @@ var init_entity = __esmMin((() => {
574
576
  locale: options?.locale || "ko",
575
577
  existingCones: options?.preserveExisting !== false ? this.collectExistingCones() : void 0,
576
578
  onlyEmpty: options?.onlyEmpty ?? false
577
- });
579
+ }, { generateText: options?.generateText });
578
580
  this.applyCones(result);
579
- await this.save();
581
+ if (options?.persist !== false) await this.save();
580
582
  return result;
581
583
  }
582
584
  /**
@@ -585,12 +587,12 @@ var init_entity = __esmMin((() => {
585
587
  * @returns 키가 "entity:id", "prop:name", "enum:enumId", "subset:key" 형식인 cone 맵
586
588
  */
587
589
  collectExistingCones() {
588
- const cones = {};
589
- if (this.cone) cones[`entity:${this.id}`] = this.cone;
590
- for (const prop of this.props) if (prop.cone) cones[`prop:${prop.name}`] = prop.cone;
591
- for (const [enumId, cone] of Object.entries(this.enumCones)) cones[`enum:${enumId}`] = cone;
592
- for (const [subsetKey, cone] of Object.entries(this.subsetCones)) cones[`subset:${subsetKey}`] = cone;
593
- return cones;
590
+ const coneEntries = [];
591
+ if (this.cone) coneEntries.push([`entity:${this.id}`, this.cone]);
592
+ for (const prop of this.props) if (prop.cone) coneEntries.push([`prop:${prop.name}`, prop.cone]);
593
+ for (const [enumId, cone] of Object.entries(this.enumCones)) coneEntries.push([`enum:${enumId}`, cone]);
594
+ for (const [subsetKey, cone] of Object.entries(this.subsetCones)) coneEntries.push([`subset:${subsetKey}`, cone]);
595
+ return Object.fromEntries(coneEntries);
594
596
  }
595
597
  /**
596
598
  * 생성된 cone들을 Entity에 적용합니다.
@@ -798,4 +800,4 @@ var init_entity = __esmMin((() => {
798
800
  init_entity();
799
801
  export { Entity, init_entity };
800
802
 
801
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vZW50aXR5LW1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7IGlkLCBwYXJlbnRJZCwgdGFibGUsIHRpdGxlLCBjb25lLCBwcm9wcywgaW5kZXhlcywgc3Vic2V0cywgZW51bXMgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkgYXMgdW5rbm93biBhcyByZWFkb25seSBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgc2VsZWN0SXRlbXM6IHN0cmluZ1tdLFxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOuwmO2ZmCDsmKTruIzsoJ3tirjsnZgg6rCS7J2AIHN0cmluZ+ydvCDsiJjrj4Qg7J6I6rOgIOuYkOuLpOuluCDsmKTruIzsoJ3tirjsnbwg7IiY64+EIOyeiOuKlOuNsCwg7J2066W8IOyerOq3gCDtg4DsnoXsnLzroZwg64KY7YOA64K8IOyImCDsl4bslrQgYW5566GcIOyymOumrO2VqeuLiOuLpC5cbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbcGFydF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDspJHssqkg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKGxvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHN1YnNldEdyb3VwW2dyb3VwS2V5XTtcbiAgICAgICAgYXNzZXJ0KGZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZmllbGRzLmZpbHRlcigoZmllbGQpID0+XG4gICAgICAgICAgICBpc1ZpcnR1YWxDb2RlUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiB0aGlzLmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXAubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtlbnRpdHkuaWR9IC0tIOyemOuqu+uQnCBGaWVsZEV4cHIgJyR7cHJvcE5hbWV9JyAo7IKs7JqpIOqwgOuKpe2VnCBwcm9wczogJHtlbnRpdHkucHJvcHMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cFswXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxICYmIChncm91cFswXSA9PT0gXCJpZFwiIHx8IGdyb3VwWzBdID09PSBcImlkP1wiKSkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXAsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24gcHJvcOydtCDtmITsnqwg7YWM7J2067iU7JeQIEZLIOy7rOufvOydhCDsg53shLHtlZjripTsp4Ag7ZmV7J24XG4gICAqKEJlbG9uZ3NUb09uZSDrmJDripQgT25lVG9PbmUoaGFzSm9pbkNvbHVtbj10cnVlKeyduCDqsr3smrAgRksg7IOd7ISxKVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNGb3JlaWduS2V5KHByb3A6IFJlbGF0aW9uUHJvcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGAke3Byb3AubmFtZX1faWRgLCB0eXBlOiBcImludF91bnNpZ25lZFwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9wLm5hbWUsIHR5cGU6IHByb3AudHlwZSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyXkCDsoJXsnZjrkJwg66qo65OgIHZlY3RvciDtg4DsnoUg7Lus65+8IOuwmO2ZmFxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1ucygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUgdmVjdG9yIOy7rOufvCDrsJjtmZhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSDsu6zrn7zrqoUgKOyDneuetSDsi5wg7LKrIOuyiOynuCB2ZWN0b3Ig7Lus65+8KVxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1uKGNvbHVtbk5hbWU/OiBzdHJpbmcpOiBFbnRpdHlQcm9wIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZWN0b3JQcm9wcyA9IHRoaXMuZ2V0VmVjdG9yQ29sdW1ucygpO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gdmVjdG9yUHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3RvclByb3BzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhO2EsOungSDqsIDriqXtlZwgcHJvcHMg67CY7ZmYXG4gICAqXG4gICAqIC0g7J2867CYIHByb3BcbiAgICogLSBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb24gKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKVxuICAgKiAgIOKGkiB7bmFtZX1faWQg7ZiV7YOc7J2YIOqwgOyDgSBpbnRlZ2VyIHByb3DsnLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGaWx0ZXJhYmxlUHJvcHMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5mbGF0TWFwKChwcm9wKTogRW50aXR5UHJvcCB8IEVudGl0eVByb3BbXSA9PiB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3Ag7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9u66eMIO2PrO2VqFxuICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGAke3Byb3AubmFtZX1faWRgLFxuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICB9IGFzIEVudGl0eVByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocygpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAke3RoaXMubmFtZXMucGFyZW50RnN9YDtcblxuICAgIC8vIGJhc2Utc2NoZW1lXG4gICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9QmFzZVNjaGVtYWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG5cbiAgICAvLyBzdWJzZXRcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRLZXlgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0TWFwcGluZ2AsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChcbiAgICAgICAgICBgJHt0aGlzLmlkfVN1YnNldCR7c3Vic2V0S2V5LnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICBgc29uYW11LmdlbmVyYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXNcbiAgICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoZW51bUlkLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIHR5cGVzXG4gICAgY29uc3QgdHlwZXNNb2R1bGVQYXRoID0gYCR7YmFzZVBhdGh9LyR7dGhpcy5uYW1lcy5wYXJlbnRGc30udHlwZXNgO1xuICAgIGNvbnN0IHR5cGVzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogTExN7J2EIOyCrOyaqe2VmOyXrCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnByZXNlcnZlRXhpc3RpbmcgLSDquLDsobQgY29uZSDrs7TsobQg7Jes67aAICjquLDrs7jqsJI6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRpb25zLm9ubHlFbXB0eSAtIGZpeHR1cmVIaW506rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAo6riw67O46rCSOiBmYWxzZSlcbiAgICogQHBhcmFtIG9wdGlvbnMubG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQ29uZXMob3B0aW9ucz86IHtcbiAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKTtcbiAgICBjb25zdCBjb250ZXh0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50b0pzb24oKSxcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIGV4aXN0aW5nQ29uZXM6IG9wdGlvbnM/LnByZXNlcnZlRXhpc3RpbmcgIT09IGZhbHNlID8gdGhpcy5jb2xsZWN0RXhpc3RpbmdDb25lcygpIDogdW5kZWZpbmVkLFxuICAgICAgb25seUVtcHR5OiBvcHRpb25zPy5vbmx5RW1wdHkgPz8gZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlQ29uZXMoY29udGV4dCk7XG4gICAgdGhpcy5hcHBseUNvbmVzKHJlc3VsdCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQgY29uZeuTpOydhCDsiJjsp5Htlanri4jri6QgKGVudGl0eSwgcHJvcHMsIGVudW1zLCBzdWJzZXRzKS5cbiAgICpcbiAgICogQHJldHVybnMg7YKk6rCAIFwiZW50aXR5OmlkXCIsIFwicHJvcDpuYW1lXCIsIFwiZW51bTplbnVtSWRcIiwgXCJzdWJzZXQ6a2V5XCIg7ZiV7Iud7J24IGNvbmUg66e1XG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3RFeGlzdGluZ0NvbmVzKCk6IFJlY29yZDxzdHJpbmcsIENvbmU+IHtcbiAgICBjb25zdCBjb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcblxuICAgIGlmICh0aGlzLmNvbmUpIHtcbiAgICAgIGNvbmVzW2BlbnRpdHk6JHt0aGlzLmlkfWBdID0gdGhpcy5jb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLnByb3BzKSB7XG4gICAgICBpZiAocHJvcC5jb25lKSB7XG4gICAgICAgIGNvbmVzW2Bwcm9wOiR7cHJvcC5uYW1lfWBdID0gcHJvcC5jb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2VudW1JZCwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtQ29uZXMpKSB7XG4gICAgICBjb25lc1tgZW51bToke2VudW1JZH1gXSA9IGNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3Vic2V0S2V5LCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldENvbmVzKSkge1xuICAgICAgY29uZXNbYHN1YnNldDoke3N1YnNldEtleX1gXSA9IGNvbmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBwcml2YXRlIGFwcGx5Q29uZXMocmVzdWx0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcbiAgfVxuXG4gIGdldFN1YnNldFJvd3MoXG4gICAgX3N1YnNldHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgX3N1YnNldHNJbnRlcm5hbD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBwcmVmaXhlczogc3RyaW5nW10gPSBbXSxcbiAgKTogRW50aXR5U3Vic2V0Um93W10ge1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldHMgPSBfc3Vic2V0cyA/PyB0aGlzLnN1YnNldHM7XG4gICAgY29uc3Qgc3Vic2V0c0ludGVybmFsID0gX3N1YnNldHNJbnRlcm5hbCA/PyB0aGlzLnN1YnNldHNJbnRlcm5hbDtcbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoc3Vic2V0cyk7XG4gICAgY29uc3QgYWxsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzW2tleV0pKTtcbiAgICAvLyBpbnRlcm5hbCDtlYTrk5zrj4QgYWxsRmllbGRz7JeQIO2PrO2VqCAocmVsYXRpb24g7YOQ7IOJ7JqpKVxuICAgIGNvbnN0IGFsbEludGVybmFsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkpO1xuICAgIGNvbnN0IGNvbWJpbmVkRmllbGRzID0gdW5pcXVlKFsuLi5hbGxGaWVsZHMsIC4uLmFsbEludGVybmFsRmllbGRzXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgY29tYmluZWRGaWVsZHMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKGAke1suLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKX0uYCkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZWxFbnRpdHkuZ2V0U3Vic2V0Um93cyhzdWJzZXRzLCBzdWJzZXRzSW50ZXJuYWwsIFtcbiAgICAgICAgICAuLi5wcmVmaXhlcyxcbiAgICAgICAgICBgJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLndpdGgsXG4gICAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgICAgaXNPcGVuOiBjaGlsZHJlbi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5oYXNbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmlzSW50ZXJuYWxbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmllbGQgPSBbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IHByb3Aud2l0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNldEZpZWxkcyA9IHN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGhhcyA9IHN1YnNldEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaGFzXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsRmllbGRzID0gc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0ludGVybmFsID0gaW50ZXJuYWxGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGlzSW50ZXJuYWxdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhcbiAgICBzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSxcbiAgICBzdWJzZXRLZXk6IHN0cmluZyxcbiAgICBpbnRlcm5hbDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaGFzS2V5ID0gaW50ZXJuYWwgPyBcImlzSW50ZXJuYWxcIiA6IFwiaGFzXCI7XG4gICAgcmV0dXJuIHN1YnNldFJvd3NcbiAgICAgIC5tYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICBpZiAoc3Vic2V0Um93LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93LmNoaWxkcmVuLCBzdWJzZXRLZXksIGludGVybmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzZXRSb3dbaGFzS2V5XVtzdWJzZXRLZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvdy5wcmVmaXhlcy5jb25jYXQoc3Vic2V0Um93LmZpZWxkKS5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvcChwcm9wOiBFbnRpdHlQcm9wLCBhdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghYXQpIHtcbiAgICAgIHRoaXMucHJvcHMucHVzaChwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDAsIHByb3ApO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIGFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKToge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcHJvcE5hbWU6IHN0cmluZztcbiAgfVtdIHtcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIik7XG5cbiAgICBsZXQgZW50aXR5SWQgPSB0aGlzLmlkO1xuICAgIGNvbnN0IHJlc3VsdDoge1xuICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gICAgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3BOYW1lID0gYXJyW2ldO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR97J2YIOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBlbnRpdHlJZCA9IHByb3Aud2l0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG1vZGlmeVByb3AobmV3UHJvcDogRW50aXR5UHJvcCwgYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOydtOumhOydtCDrsJTrgJAg6rK97JqwXG4gICAgaWYgKG9sZE5hbWUgIT09IG5ld1Byb3AubmFtZSkge1xuICAgICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IiY7KCV65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOyImOyglVxuICAgICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOyImOyglSDsspjrpqxcbiAgICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBhbmFseXplZC5tYXAoKGEpID0+XG4gICAgICAgICAgICAgIGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogbmV3UHJvcC5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogYSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyDrtoTshJ3tlZwg7ZWE65Oc66W8IOuLpOyLnCDshJzruIzshYsg7ZWE65Oc66GcIOuzteq1rFxuICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkLm1hcCgoYSkgPT4gYS5wcm9wTmFtZSkuam9pbihcIi5cIik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsiJjsoJVcbiAgICB0aGlzLnByb3BzW2F0XSA9IG5ld1Byb3A7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVsUHJvcChhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IKt7KCc65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOygnOyZuFxuICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7J207ZuE7J2YIO2VhOuTnOulvCDsoJzsmbhcbiAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXRcbiAgICAgICAgICAubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGlmIChhbmFseXplZC5maW5kKChhKSA9PiBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN1YnNldEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZiE7J6sIOyXlO2LsO2LsOydmCDsnbjrjbHsiqTsl5DshJwg7KCc7Jm4XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLmlkKS5pbmRleGVzKSB7XG4gICAgICBpbmRleC5jb2x1bW5zID0gaW5kZXguY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IG9sZE5hbWUpO1xuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsgq3soJxcbiAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgZ2V0RW50aXR5SWRGcm9tU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdWJzZXRGaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zsnZgg66eI7KeA66eJ7J2AIO2UhOuhreydtOuvgOuhnCDsoJzsmbhcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpO1xuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDrgrTroKTqsIDrqbTshJwg66eI7KeA66eJ7Jy866GcIHJlbGF0aW9u65CcIOyXlO2LsO2LsOulvCDssL7snYxcbiAgICBjb25zdCBsYXN0RW50aXR5SWQgPSBhcnIucmVkdWNlKChlbnRpdHlJZCwgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlbFByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBmaWVsZCk7XG4gICAgICBpZiAoIXJlbFByb3AgfHwgcmVsUHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGFyciwgdGhpc0lkOiB0aGlzLmlkLCBlbnRpdHlJZCwgZmllbGQgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbFByb3Aud2l0aDtcbiAgICB9LCB0aGlzLmlkKTtcbiAgICByZXR1cm4gbGFzdEVudGl0eUlkO1xuICB9XG5cbiAgYXN5bmMgbW92ZVByb3AoYXQ6IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzW2F0XTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IFsuLi50aGlzLnByb3BzXTtcbiAgICBuZXdQcm9wcy5zcGxpY2UodG8sIDAsIHByb3ApO1xuICAgIG5ld1Byb3BzLnNwbGljZShhdCA8IHRvID8gYXQgOiBhdCArIDEsIDEpO1xuICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOuqheydhCBcIu2FjOydtOu4lOuqhS7tlYTrk5zrqoVcIiDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGdWxsRmllbGROYW1lKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFibGV9LiR7ZmllbGR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDquLDspIDsnLzroZwgXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCLrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtUeXBlKCk6IFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwiIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIGlmIChpZFByb3AudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBpZFByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiBpZFByb3AudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyBwcm9w7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogbGVuZ3RoIOuTsSDshLjrtoAg7KCV67O07JeQIOygkeq3vO2VoCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtQcm9wKCk6IEVudGl0eVByb3Age1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkUHJvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg67Cw7Je0IO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIExvYWRlclF1ZXJ57J2YIGZyb21JZHMg7YOA7J6F7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGdldFBrQXJyYXlUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGtUeXBlID0gdGhpcy5nZXRQa1R5cGUoKTtcbiAgICByZXR1cm4gcGtUeXBlID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyW11cIiA6IFwic3RyaW5nW11cIjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFRc0M7WUFjZjtnQkFZMkI7Z0JBQ0g7ZUFDTDtpQkFDTztZQUNVO3FCQUNYO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUdBO0VBR0E7RUFDQTtFQUdB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
803
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICAgIGpzb25Db2x1bW5zOiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcImpzb25cIikubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IEVudGl0eUpzb24ge1xuICAgIC8vIHN1YnNldHPsmYAgc3Vic2V0c0ludGVybmFs7J2EIFN1YnNldERlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLlN1YnNldERlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gdGhpcy5zdWJzZXRzW2tleV07XG4gICAgICBjb25zdCBpbnRlcm5hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9ICh0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKS5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBmaWVsZHMgPSBbLi4ubm9ybWFsRmllbGRzLCAuLi5pbnRlcm5hbEZpZWxkc107XG5cbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQg67Cw7Je0IO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuc3Vic2V0Q29uZXNba2V5XSkge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSB7XG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuc3Vic2V0Q29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc+ulvCBFbnVtRGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IGVudW1zOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLkVudW1EZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IFJlY29yZCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLmVudW1Db25lc1trZXldKSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuZW51bUNvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtc1trZXldID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGNvbmU6IHRoaXMuY29uZSxcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzLFxuICAgICAgc3Vic2V0cyxcbiAgICAgIGVudW1zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHNvcnQ6IHN1YnNldHNcbiAgICBjb25zdCBzdWJzZXRSb3dzID0gdGhpcy5nZXRTdWJzZXRSb3dzKCk7XG4gICAgdGhpcy5zdWJzZXRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIGZhbHNlKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzSW50ZXJuYWwpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgdHJ1ZSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIHNhdmVcbiAgICBjb25zdCBqc29uUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIGBzcmMvYXBwbGljYXRpb24vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS8ke3RoaXMubmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICApO1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqc29uUGF0aCwgYXdhaXQgZm9ybWF0Q29kZShKU09OLnN0cmluZ2lmeShqc29uKSwganNvblBhdGgpKTtcblxuICAgIC8vIHJlbG9hZFxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVnaXN0ZXIoanNvbik7XG4gIH1cblxuICAvKipcbiAgICog7YWc7ZSM66a/IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogTExN7J2EIOyCrOyaqe2VmOyngCDslYrqs6AgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUg65iQ64qUIFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGVDb25lcyhsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGVtcGxhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHktdGVtcGxhdGUtY29uZVwiKTtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgIGxvY2FsZSB8fFxuICAgICAgKGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgIDogXCJrb1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVRlbXBsYXRlQ29uZXModGhpcy50b0pzb24oKSwgZWZmZWN0aXZlTG9jYWxlKTtcblxuICAgIC8vIOqysOqzvOulvCBFbnRpdHnsl5Ag7KCB7JqpIChhcHBseUNvbmVz7JmAIOuPmeydvO2VnCDrsKnsi50pXG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7JesIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucHJlc2VydmVFeGlzdGluZyAtIOq4sOyhtCBjb25lIOuztOyhtCDsl6zrtoAgKOq4sOuzuOqwkjogdHJ1ZSlcbiAgICogQHBhcmFtIG9wdGlvbnMub25seUVtcHR5IC0gZml4dHVyZUhpbnTqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISxICjquLDrs7jqsJI6IGZhbHNlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5sb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVDb25lcyhvcHRpb25zPzoge1xuICAgIHByZXNlcnZlRXhpc3Rpbmc/OiBib29sZWFuO1xuICAgIG9ubHlFbXB0eT86IGJvb2xlYW47XG4gICAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICAgIC8qKiDthYzsiqTtirjrgpgg64yA7LK0IExMTSDqs7XquInsnpDrpbwg7JyE7ZWcIO2FjeyKpO2KuCDsg53shLEg6rWs7ZiEICovXG4gICAgZ2VuZXJhdGVUZXh0PzogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lVGV4dEdlbmVyYXRvcjtcbiAgICAvKiogZmFsc2XsnbTrqbQg7IOd7ISxIOqysOqzvOulvCDrqZTrqqjrpqzsl5Drp4wg7KCB7Jqp7ZWY6rOgIGVudGl0eSDtjIzsnbzsnYAg7KCA7J6l7ZWY7KeAIOyViuyKteuLiOuLpC4gKi9cbiAgICBwZXJzaXN0PzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKTtcbiAgICBjb25zdCBjb250ZXh0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50b0pzb24oKSxcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIGV4aXN0aW5nQ29uZXM6IG9wdGlvbnM/LnByZXNlcnZlRXhpc3RpbmcgIT09IGZhbHNlID8gdGhpcy5jb2xsZWN0RXhpc3RpbmdDb25lcygpIDogdW5kZWZpbmVkLFxuICAgICAgb25seUVtcHR5OiBvcHRpb25zPy5vbmx5RW1wdHkgPz8gZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlQ29uZXMoY29udGV4dCwgeyBnZW5lcmF0ZVRleHQ6IG9wdGlvbnM/LmdlbmVyYXRlVGV4dCB9KTtcbiAgICB0aGlzLmFwcGx5Q29uZXMocmVzdWx0KTtcbiAgICBpZiAob3B0aW9ucz8ucGVyc2lzdCAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCBjb25l65Ok7J2EIOyImOynke2VqeuLiOuLpCAoZW50aXR5LCBwcm9wcywgZW51bXMsIHN1YnNldHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyDtgqTqsIAgXCJlbnRpdHk6aWRcIiwgXCJwcm9wOm5hbWVcIiwgXCJlbnVtOmVudW1JZFwiLCBcInN1YnNldDprZXlcIiDtmJXsi53snbggY29uZSDrp7VcbiAgICovXG4gIGNvbGxlY3RFeGlzdGluZ0NvbmVzKCk6IFJlY29yZDxzdHJpbmcsIENvbmU+IHtcbiAgICBjb25zdCBjb25lRW50cmllczogW3N0cmluZywgQ29uZV1bXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuY29uZSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudGl0eToke3RoaXMuaWR9YCwgdGhpcy5jb25lXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMucHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLmNvbmUpIHtcbiAgICAgICAgY29uZUVudHJpZXMucHVzaChbYHByb3A6JHtwcm9wLm5hbWV9YCwgcHJvcC5jb25lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZW51bUlkLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1Db25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BlbnVtOiR7ZW51bUlkfWAsIGNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJzZXRLZXksIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0Q29uZXMpKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgc3Vic2V0OiR7c3Vic2V0S2V5fWAsIGNvbmVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGNvbmVFbnRyaWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsg53shLHrkJwgY29uZeuTpOydhCBFbnRpdHnsl5Ag7KCB7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gTExN7Jy866GcIOyDneyEseuQnCBjb25lIOqysOqzvFxuICAgKi9cbiAgYXBwbHlDb25lcyhyZXN1bHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcbiAgfVxuXG4gIGdldFN1YnNldFJvd3MoXG4gICAgX3N1YnNldHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgX3N1YnNldHNJbnRlcm5hbD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBwcmVmaXhlczogc3RyaW5nW10gPSBbXSxcbiAgKTogRW50aXR5U3Vic2V0Um93W10ge1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldHMgPSBfc3Vic2V0cyA/PyB0aGlzLnN1YnNldHM7XG4gICAgY29uc3Qgc3Vic2V0c0ludGVybmFsID0gX3N1YnNldHNJbnRlcm5hbCA/PyB0aGlzLnN1YnNldHNJbnRlcm5hbDtcbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoc3Vic2V0cyk7XG4gICAgY29uc3QgYWxsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzW2tleV0pKTtcbiAgICAvLyBpbnRlcm5hbCDtlYTrk5zrj4QgYWxsRmllbGRz7JeQIO2PrO2VqCAocmVsYXRpb24g7YOQ7IOJ7JqpKVxuICAgIGNvbnN0IGFsbEludGVybmFsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkpO1xuICAgIGNvbnN0IGNvbWJpbmVkRmllbGRzID0gdW5pcXVlKFsuLi5hbGxGaWVsZHMsIC4uLmFsbEludGVybmFsRmllbGRzXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgY29tYmluZWRGaWVsZHMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKGAke1suLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKX0uYCkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZWxFbnRpdHkuZ2V0U3Vic2V0Um93cyhzdWJzZXRzLCBzdWJzZXRzSW50ZXJuYWwsIFtcbiAgICAgICAgICAuLi5wcmVmaXhlcyxcbiAgICAgICAgICBgJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLndpdGgsXG4gICAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgICAgaXNPcGVuOiBjaGlsZHJlbi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5oYXNbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmlzSW50ZXJuYWxbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmllbGQgPSBbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IHByb3Aud2l0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNldEZpZWxkcyA9IHN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGhhcyA9IHN1YnNldEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaGFzXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsRmllbGRzID0gc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0ludGVybmFsID0gaW50ZXJuYWxGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGlzSW50ZXJuYWxdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhcbiAgICBzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSxcbiAgICBzdWJzZXRLZXk6IHN0cmluZyxcbiAgICBpbnRlcm5hbDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaGFzS2V5ID0gaW50ZXJuYWwgPyBcImlzSW50ZXJuYWxcIiA6IFwiaGFzXCI7XG4gICAgcmV0dXJuIHN1YnNldFJvd3NcbiAgICAgIC5tYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICBpZiAoc3Vic2V0Um93LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93LmNoaWxkcmVuLCBzdWJzZXRLZXksIGludGVybmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzZXRSb3dbaGFzS2V5XVtzdWJzZXRLZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvdy5wcmVmaXhlcy5jb25jYXQoc3Vic2V0Um93LmZpZWxkKS5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvcChwcm9wOiBFbnRpdHlQcm9wLCBhdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghYXQpIHtcbiAgICAgIHRoaXMucHJvcHMucHVzaChwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDAsIHByb3ApO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIGFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKToge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcHJvcE5hbWU6IHN0cmluZztcbiAgfVtdIHtcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIik7XG5cbiAgICBsZXQgZW50aXR5SWQgPSB0aGlzLmlkO1xuICAgIGNvbnN0IHJlc3VsdDoge1xuICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gICAgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3BOYW1lID0gYXJyW2ldO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR97J2YIOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBlbnRpdHlJZCA9IHByb3Aud2l0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG1vZGlmeVByb3AobmV3UHJvcDogRW50aXR5UHJvcCwgYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOydtOumhOydtCDrsJTrgJAg6rK97JqwXG4gICAgaWYgKG9sZE5hbWUgIT09IG5ld1Byb3AubmFtZSkge1xuICAgICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IiY7KCV65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOyImOyglVxuICAgICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOyImOyglSDsspjrpqxcbiAgICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBhbmFseXplZC5tYXAoKGEpID0+XG4gICAgICAgICAgICAgIGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogbmV3UHJvcC5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogYSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyDrtoTshJ3tlZwg7ZWE65Oc66W8IOuLpOyLnCDshJzruIzshYsg7ZWE65Oc66GcIOuzteq1rFxuICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkLm1hcCgoYSkgPT4gYS5wcm9wTmFtZSkuam9pbihcIi5cIik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsiJjsoJVcbiAgICB0aGlzLnByb3BzW2F0XSA9IG5ld1Byb3A7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVsUHJvcChhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IKt7KCc65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOygnOyZuFxuICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7J207ZuE7J2YIO2VhOuTnOulvCDsoJzsmbhcbiAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXRcbiAgICAgICAgICAubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGlmIChhbmFseXplZC5maW5kKChhKSA9PiBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN1YnNldEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZiE7J6sIOyXlO2LsO2LsOydmCDsnbjrjbHsiqTsl5DshJwg7KCc7Jm4XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLmlkKS5pbmRleGVzKSB7XG4gICAgICBpbmRleC5jb2x1bW5zID0gaW5kZXguY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IG9sZE5hbWUpO1xuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsgq3soJxcbiAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgZ2V0RW50aXR5SWRGcm9tU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdWJzZXRGaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zsnZgg66eI7KeA66eJ7J2AIO2UhOuhreydtOuvgOuhnCDsoJzsmbhcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpO1xuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDrgrTroKTqsIDrqbTshJwg66eI7KeA66eJ7Jy866GcIHJlbGF0aW9u65CcIOyXlO2LsO2LsOulvCDssL7snYxcbiAgICBjb25zdCBsYXN0RW50aXR5SWQgPSBhcnIucmVkdWNlKChlbnRpdHlJZCwgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlbFByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBmaWVsZCk7XG4gICAgICBpZiAoIXJlbFByb3AgfHwgcmVsUHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGFyciwgdGhpc0lkOiB0aGlzLmlkLCBlbnRpdHlJZCwgZmllbGQgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbFByb3Aud2l0aDtcbiAgICB9LCB0aGlzLmlkKTtcbiAgICByZXR1cm4gbGFzdEVudGl0eUlkO1xuICB9XG5cbiAgYXN5bmMgbW92ZVByb3AoYXQ6IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzW2F0XTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IFsuLi50aGlzLnByb3BzXTtcbiAgICBuZXdQcm9wcy5zcGxpY2UodG8sIDAsIHByb3ApO1xuICAgIG5ld1Byb3BzLnNwbGljZShhdCA8IHRvID8gYXQgOiBhdCArIDEsIDEpO1xuICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOuqheydhCBcIu2FjOydtOu4lOuqhS7tlYTrk5zrqoVcIiDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGdWxsRmllbGROYW1lKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFibGV9LiR7ZmllbGR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDquLDspIDsnLzroZwgXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCLrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtUeXBlKCk6IFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwiIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIGlmIChpZFByb3AudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBpZFByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiBpZFByb3AudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyBwcm9w7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogbGVuZ3RoIOuTsSDshLjrtoAg7KCV67O07JeQIOygkeq3vO2VoCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtQcm9wKCk6IEVudGl0eVByb3Age1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkUHJvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg67Cw7Je0IO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIExvYWRlclF1ZXJ57J2YIGZyb21JZHMg7YOA7J6F7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGdldFBrQXJyYXlUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGtUeXBlID0gdGhpcy5nZXRQa1R5cGUoKTtcbiAgICByZXR1cm4gcGtUeXBlID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyW11cIiA6IFwic3RyaW5nW11cIjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBUXNDO1lBY2Y7Z0JBWTJCO2dCQUNIO2VBQ0w7aUJBQ087b0JBQ0s7WUFDSztxQkFHWDtDQUVuQyxTQUFiLE1BQW9CO0VBQ2xCO0VBQ0E7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
package/dist/env.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export declare const SONAMU_ENVIRONMENTS: readonly ["test", "development", "staging", "production"];
2
2
  export type SonamuEnvironment = (typeof SONAMU_ENVIRONMENTS)[number];
3
- export type EnvironmentSnapshot = Record<string, string>;
3
+ export interface EnvironmentSnapshot {
4
+ [key: string]: string;
5
+ }
4
6
  export type EnvironmentSnapshots = Record<SonamuEnvironment, EnvironmentSnapshot>;
5
7
  export declare function isSonamuEnvironment(value: string | undefined): value is SonamuEnvironment;
6
8
  export declare function getSonamuEnvironment(env?: NodeJS.ProcessEnv): SonamuEnvironment;
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,2DAA4D,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAElF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,iBAAiB,CAEzF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAc5F;AAqCD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,mBAAmB,CAarB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,UAAe,GAC9B,oBAAoB,CAOtB;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAStF;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,2DAA4D,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AACD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAElF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,iBAAiB,CAIzF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAc5F;AAqCD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,mBAAmB,CAarB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,UAAe,GAC9B,oBAAoB,CAOtB;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAStF;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}