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,7 +1,7 @@
1
1
  import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
2
2
  import { Template, init_template } from "../template.js";
3
3
  import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName, init_helpers } from "../helpers.js";
4
- import { z as z$1 } from "zod";
4
+ import { z } from "zod";
5
5
  import { unique } from "radashi";
6
6
  //#region src/template/implementations/view_form.template.ts
7
7
  init_entity_manager();
@@ -65,7 +65,7 @@ var Template__view_form = class extends Template {
65
65
  const regExpr = `{...register("${col.name}")}`;
66
66
  const placeholder = `{SD("entity.${entityId}.${getRelationNameFromColumnName(entityId, col.name)}")}`;
67
67
  switch (col.renderType) {
68
- case "string-plain": if (col.zodType instanceof z$1.ZodString && (col.zodType.maxLength ?? 0) <= 256) return `<Input className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
68
+ case "string-plain": if (col.zodType instanceof z.ZodString && (col.zodType.maxLength ?? 0) <= 256) return `<Input className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
69
69
  else return `<Textarea className="text-xs bg-white" rows={4} placeholder=${placeholder} ${regExpr} />`;
70
70
  case "datetime": return `<DateInput
71
71
  className="h-8 text-xs bg-white"
@@ -130,13 +130,13 @@ var Template__view_form = class extends Template {
130
130
  if (col.optional) return result;
131
131
  let value;
132
132
  if (col.nullable === true) value = null;
133
- else if (col.zodType instanceof z$1.ZodNumber) value = 0;
134
- else if (col.zodType instanceof z$1.ZodEnum) value = Object.keys(col.zodType.enum)[0];
135
- else if (col.zodType instanceof z$1.ZodBoolean) value = false;
136
- else if (col.zodType instanceof z$1.core.$ZodString) if (col.renderType === "string-datetime") value = "now()";
133
+ else if (col.zodType instanceof z.ZodNumber) value = 0;
134
+ else if (col.zodType instanceof z.ZodEnum) value = Object.keys(col.zodType.enum)[0];
135
+ else if (col.zodType instanceof z.ZodBoolean) value = false;
136
+ else if (col.zodType instanceof z.core.$ZodString) if (col.renderType === "string-datetime") value = "now()";
137
137
  else value = "";
138
- else if (col.zodType instanceof z$1.ZodArray) value = [];
139
- else if (col.zodType instanceof z$1.ZodObject) value = {};
138
+ else if (col.zodType instanceof z.ZodArray) value = [];
139
+ else if (col.zodType instanceof z.ZodObject) value = {};
140
140
  result[col.name] = value;
141
141
  return result;
142
142
  }, {});
@@ -162,19 +162,27 @@ var Template__view_form = class extends Template {
162
162
  if (col.renderType === "enums") try {
163
163
  const { id } = getEnumInfoFromColName(entityId, col.name);
164
164
  enumImports.add(id);
165
- } catch {}
165
+ } catch {
166
+ return;
167
+ }
166
168
  else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") try {
167
169
  const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
168
170
  fkConfigImports.add(relProp.with);
169
- } catch {}
171
+ } catch {
172
+ return;
173
+ }
170
174
  else if (col.renderType === "string-plain" && col.name.endsWith("_id") && col.name !== "id") try {
171
175
  const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
172
176
  fkConfigImports.add(relProp.with);
173
- } catch {}
177
+ } catch {
178
+ return;
179
+ }
174
180
  else if (col.renderType === "array" && col.name.endsWith("_ids")) try {
175
181
  const relProp = getRelationPropFromColName(entityId, col.name.replace(/_ids$/, ""));
176
182
  fkConfigImports.add(relProp.with);
177
- } catch {}
183
+ } catch {
184
+ return;
185
+ }
178
186
  });
179
187
  return {
180
188
  ...this.getTargetAndPath(names),
@@ -185,7 +193,7 @@ import {
185
193
  CardContent,
186
194
  CardHeader,
187
195
  CardTitle,
188
- Input,${columns.some((col) => col.renderType === "string-plain" && col.zodType instanceof z$1.ZodString && (col.zodType.maxLength ?? 0) > 256) ? "\n Textarea," : ""}${columns.some((col) => col.renderType === "enums") ? "\n EnumSelect," : ""}${columns.some((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")) ? "\n IdAsyncSelect," : ""}${columns.some((col) => col.renderType === "boolean") ? "\n Switch," : ""}${columns.some((col) => ["json-sonamufile", "json-sonamufile-array"].includes(col.renderType)) ? "\n FileInput," : ""}${columns.some((col) => [
196
+ Input,${columns.some((col) => col.renderType === "string-plain" && col.zodType instanceof z.ZodString && (col.zodType.maxLength ?? 0) > 256) ? "\n Textarea," : ""}${columns.some((col) => col.renderType === "enums") ? "\n EnumSelect," : ""}${columns.some((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")) ? "\n IdAsyncSelect," : ""}${columns.some((col) => col.renderType === "boolean") ? "\n Switch," : ""}${columns.some((col) => ["json-sonamufile", "json-sonamufile-array"].includes(col.renderType)) ? "\n FileInput," : ""}${columns.some((col) => [
189
197
  "string-datetime",
190
198
  "string-date",
191
199
  "datetime"
@@ -206,7 +214,7 @@ import type { ${names.capital}SubsetA } from "@/services/sonamu.generated";${col
206
214
  }
207
215
  })).filter(Boolean).join(", ") + " } from \"@/services/sonamu.generated\";" : ""}
208
216
  import { defaultCatch } from "@/services/sonamu.shared";
209
- import { ${names.capital}SaveParams } from "@/services/${names.fs}/${names.fs}.types";${fkConfigImports.size > 0 ? `\nimport { ${Array.from(fkConfigImports).map((entity) => `${entity}AsyncIdConfig`).join(", ")} } from "@/services/services.generated";` : ""}
217
+ import { ${names.capital}SaveParams } from "@/services/${names.fs}/${names.fs}.types";${fkConfigImports.size > 0 ? `\nimport { ${Array.from(fkConfigImports).map((relatedEntityId) => `${relatedEntityId}AsyncIdConfig`).join(", ")} } from "@/services/services.generated";` : ""}
210
218
  import { SD } from "@/i18n/sd.generated";
211
219
 
212
220
  import ArrowLeftIcon from "~icons/lucide/arrow-left";
@@ -412,4 +420,4 @@ ${columns.filter((col) => col.name !== "created_at").map((col) => {
412
420
  //#endregion
413
421
  export { Template__view_form };
414
422
 
415
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19mb3JtLnRlbXBsYXRlLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19mb3JtLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgUmVuZGVyaW5nTm9kZSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVudW1JbmZvRnJvbUNvbE5hbWUsXG4gIGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lLFxuICBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSxcbn0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fdmlld19mb3JtIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcInZpZXdfZm9ybVwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgobmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCJ3ZWIvc3JjL3JvdXRlcy9hZG1pblwiLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnNQbHVyYWx9L2Zvcm0udHN4YCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVxdWlyZWREaWN0S2V5cygpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiBbXCJlbnRpdHkuY3JlYXRlXCIsIFwiZW50aXR5LmVkaXRcIiwgXCJjb21tb24uYmFja1RvTGlzdFwiLCBcImZvcm0uY3JlYXRlZEF0XCIsIFwiY29tbW9uLnNhdmVcIl07XG4gIH1cblxuICB3cmFwRkMoYm9keTogc3RyaW5nLCBsYWJlbD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPiR7bGFiZWwgPyBgXFxuICA8TGFiZWw+JHtsYWJlbH08L0xhYmVsPmAgOiBcIlwifWAsXG4gICAgICBgICAke2JvZHl9YCxcbiAgICAgIGA8L2Rpdj5gLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfVxuICB3cmFwRkcoYm9keTogc3RyaW5nLCBsYWJlbD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud3JhcEZDKGJvZHksIGxhYmVsKTtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUpIHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtXCIgYXMgY29uc3QsIGVudW1JZDogaWQgfTtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1ma19pZFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImZrXCIgYXMgY29uc3QsIGVudGl0eUlkOiByZWxQcm9wLndpdGggfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSB7XG4gICAgICAvLyBNYW55VG9NYW55IHJlbGF0aW9u7J2YIEZLIOuwsOyXtFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5yZXBsYWNlKC9faWRzJC8sIFwiXCIpO1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJma1wiIGFzIGNvbnN0LCBlbnRpdHlJZDogcmVsUHJvcC53aXRoIH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVuZGVyQ29sdW1uKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnRXhwciA9IGB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1gO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyTmFtZSA9IGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBge1NEKFwiZW50aXR5LiR7ZW50aXR5SWR9LiR7cGxhY2Vob2xkZXJOYW1lfVwiKX1gO1xuXG4gICAgc3dpdGNoIChjb2wucmVuZGVyVHlwZSkge1xuICAgICAgY2FzZSBcInN0cmluZy1wbGFpblwiOlxuICAgICAgICBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiAoY29sLnpvZFR5cGUubWF4TGVuZ3RoID8/IDApIDw9IDI1Nikge1xuICAgICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn0gJHtyZWdFeHByfSAvPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8VGV4dGFyZWEgY2xhc3NOYW1lPVwidGV4dC14cyBiZy13aGl0ZVwiIHJvd3M9ezR9IHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9ICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgcmV0dXJuIGA8RGF0ZUlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1pZFwiOlxuICAgICAgY2FzZSBcInN0cmluZy1pZFwiOlxuICAgICAgICByZXR1cm4gYDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPElucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9ICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGA8U3dpdGNoICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcImpzb24tc29uYW11ZmlsZVwiOlxuICAgICAgICByZXR1cm4gYDxGaWxlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkTW9kZT1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZT1cImltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld1NpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8RmlsZUlucHV0XG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRNb2RlPVwibGF6eVwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlPVwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZXM9ezEwfVxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICBjYXNlIFwiZW51bXNcIjpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGA8RW51bVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2lkfX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske2lkfUxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJudW1iZXItZmtfaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctZmtfaWRcIjpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICAgIHJldHVybiBgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gYDxJbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgIC8vIE1hbnlUb01hbnkgcmVsYXRpb27snZggRksg67Cw7Je07J247KeAIO2ZleyduFxuICAgICAgICBpZiAoY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvX2lkcyQvLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgYmFzZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIGA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPVwiJHtjb2wubmFtZX1cIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj1cIiR7Y29sLm5hbWV9XCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9XCIke2NvbC5uYW1lfVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlRGVmYXVsdFZhbHVlKGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IG9iamVjdCB7XG4gICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgY29sKSA9PiB7XG4gICAgICAgIGlmIChjb2wub3B0aW9uYWwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgICAgICBpZiAoY29sLm51bGxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICAgICAgICB2YWx1ZSA9IE9iamVjdC5rZXlzKGNvbC56b2RUeXBlLmVudW0pWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgICAgICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgICAgICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgICAgICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwibm93KClcIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0W2NvbC5uYW1lXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyByZW5kZXIoeyBlbnRpdHlJZCB9OiBUZW1wbGF0ZU9wdGlvbnNbXCJ2aWV3X2Zvcm1cIl0pIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIC8vIFBLIO2DgOyehSDqsJDsp4BcbiAgICBjb25zdCBwa1R5cGUgPSBlbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgY29uc3QgaWRUc1R5cGUgPSBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIiA/IFwic3RyaW5nXCIgOiBcIm51bWJlclwiO1xuICAgIGNvbnN0IGlkWm9kVHlwZSA9XG4gICAgICBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIiA/IFwiei5zdHJpbmcoKS5vcHRpb25hbCgpXCIgOiBcInoubnVtYmVyKCkub3B0aW9uYWwoKVwiO1xuXG4gICAgLy8gU2F2ZVBhcmFtcyDtg4DsnoXsnYQg66Gc65Oc7ZWY7JesIHNhdmVQYXJhbXNOb2RlIOyDneyEsVxuICAgIGNvbnN0IHsgbG9hZFR5cGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9zeW5jZXIvbW9kdWxlLWxvYWRlclwiKTtcbiAgICBjb25zdCBsb2FkZWRUeXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICAgIGNvbnN0IFNhdmVQYXJhbXNab2RUeXBlID0gbG9hZGVkVHlwZXNbYCR7ZW50aXR5SWR9U2F2ZVBhcmFtc2BdO1xuXG4gICAgaWYgKCFTYXZlUGFyYW1zWm9kVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYXZlUGFyYW1zIGZvciAke2VudGl0eUlkfSBub3QgZm91bmQuIERpZCB5b3UgcnVuICdzb25hbXUgc3luYyc/YCk7XG4gICAgfVxuXG4gICAgLy8gWm9kIO2DgOyeheydhCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmFxuICAgIGNvbnN0IHsgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcbiAgICBjb25zdCBzYXZlUGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoU2F2ZVBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IChzYXZlUGFyYW1zTm9kZT8uY2hpbGRyZW4gPz8gW10pXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBcImlkXCIpXG4gICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcENhbmRpZGF0ZSA9IGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgY29sLmxhYmVsID0gcHJvcENhbmRpZGF0ZT8uZGVzYyA/PyBjb2wubGFiZWw7XG4gICAgICAgIHJldHVybiBjb2w7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucmVzb2x2ZURlZmF1bHRWYWx1ZShjb2x1bW5zKTtcblxuICAgIC8vIGVudW3qs7wgRkvsl5Ag64yA7ZWcIGltcG9ydCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgZW51bUltcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBma0NvbmZpZ0ltcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBlbnVtSW1wb3J0cy5hZGQoaWQpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1ma19pZFwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgICBma0NvbmZpZ0ltcG9ydHMuYWRkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1wbGFpblwiICYmXG4gICAgICAgIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkXCIpICYmXG4gICAgICAgIGNvbC5uYW1lICE9PSBcImlkXCJcbiAgICAgICkge1xuICAgICAgICAvLyBzdHJpbmcgRksg7LKY66asICjsnpDsi6DsnZggUEvsnbggaWTripQg7KCc7Jm4KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgICAgZmtDb25maWdJbXBvcnRzLmFkZChyZWxQcm9wLndpdGgpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSB7XG4gICAgICAgIC8vIE1hbnlUb01hbnkgcmVsYXRpb27snZggRksg67Cw7Je0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5yZXBsYWNlKC9faWRzJC8sIFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgYmFzZU5hbWUpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQge1xuICBCdXR0b24sXG4gIENhcmQsXG4gIENhcmRDb250ZW50LFxuICBDYXJkSGVhZGVyLFxuICBDYXJkVGl0bGUsXG4gIElucHV0LCR7Y29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1wbGFpblwiICYmIGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcgJiYgKGNvbC56b2RUeXBlLm1heExlbmd0aCA/PyAwKSA+IDI1NikgPyBcIlxcbiAgVGV4dGFyZWEsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpID8gXCJcXG4gIEVudW1TZWxlY3QsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1ma19pZFwiIHx8IChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkpID8gXCJcXG4gIElkQXN5bmNTZWxlY3QsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImJvb2xlYW5cIikgPyBcIlxcbiAgU3dpdGNoLFwiIDogXCJcIn0ke2NvbHVtbnMuc29tZSgoY29sKSA9PiBbXCJqc29uLXNvbmFtdWZpbGVcIiwgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIl0uaW5jbHVkZXMoY29sLnJlbmRlclR5cGUpKSA/IFwiXFxuICBGaWxlSW5wdXQsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IFtcInN0cmluZy1kYXRldGltZVwiLCBcInN0cmluZy1kYXRlXCIsIFwiZGF0ZXRpbWVcIl0uaW5jbHVkZXMoY29sLnJlbmRlclR5cGUpKSA/IFwiXFxuICBEYXRlSW5wdXQsXCIgOiBcIlwifVxufSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyB1c2VUeXBlRm9ybSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2xpYlwiO1xuaW1wb3J0IHsgdXNlUXVlcnlDbGllbnQgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZVJvdXRlciB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHR5cGUgeyAke25hbWVzLmNhcGl0YWx9U3Vic2V0QSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjske1xuICAgICAgICBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBcIlxcbmltcG9ydCB7IFwiICtcbiAgICAgICAgICAgIHVuaXF1ZShcbiAgICAgICAgICAgICAgY29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIilcbiAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2lkfSwgJHtpZH1MYWJlbGA7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAnIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiOydcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbmltcG9ydCB7IGRlZmF1bHRDYXRjaCB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TYXZlUGFyYW1zIH0gZnJvbSBcIkAvc2VydmljZXMvJHtuYW1lcy5mc30vJHtuYW1lcy5mc30udHlwZXNcIjske1xuICAgICAgICBma0NvbmZpZ0ltcG9ydHMuc2l6ZSA+IDBcbiAgICAgICAgICA/IGBcXG5pbXBvcnQgeyAke0FycmF5LmZyb20oZmtDb25maWdJbXBvcnRzKVxuICAgICAgICAgICAgICAubWFwKChlbnRpdHkpID0+IGAke2VudGl0eX1Bc3luY0lkQ29uZmlnYClcbiAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG5pbXBvcnQgeyBTRCB9IGZyb20gXCJAL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5cbmltcG9ydCBBcnJvd0xlZnRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL2Fycm93LWxlZnRcIjtcbmltcG9ydCBTYXZlSWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS9zYXZlXCI7XG5pbXBvcnQgRm9ybUljb24gZnJvbSBcIn5pY29ucy9tZGkvZm9ybS1zZWxlY3RcIjtcblxuY29uc3QgZm9ybVNlYXJjaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6ICR7aWRab2RUeXBlfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vZm9ybVwiKSh7XG4gIHZhbGlkYXRlU2VhcmNoOiBmb3JtU2VhcmNoU2NoZW1hLFxuICBjb21wb25lbnQ6ICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtUGFnZSxcbn0pO1xuXG5mdW5jdGlvbiAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVBhZ2UoKSB7XG4gIGNvbnN0IHsgaWQgfSA9IFJvdXRlLnVzZVNlYXJjaCgpO1xuICByZXR1cm4gPCR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtIGlkPXtpZH0gLz47XG59XG5cbnR5cGUgJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm1Qcm9wcyA9IHtcbiAgaWQ/OiAke2lkVHNUeXBlfTtcbiAgbW9kZT86IFwicGFnZVwiIHwgXCJtb2RhbFwiO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtKHsgaWQsIG1vZGUgfTogJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm1Qcm9wcykge1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIGNvbnN0IHsgZm9ybSwgc2V0Rm9ybSwgcmVnaXN0ZXIke2NvbHVtbnMuc29tZSgoY29sKSA9PiBbXCJqc29uLXNvbmFtdWZpbGVcIiwgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIl0uaW5jbHVkZXMoY29sLnJlbmRlclR5cGUpKSA/IFwiLCBzdWJtaXRcIiA6IFwiXCJ9IH0gPSB1c2VUeXBlRm9ybSgke25hbWVzLmNhcGl0YWx9U2F2ZVBhcmFtcywgJHtKU09OLnN0cmluZ2lmeShkZWZhdWx0VmFsdWUpLnJlcGxhY2UoL1wibm93XFwoXFwpXCIvZywgJ1wiXCInKX0pO1xuJHsoKCkgPT4ge1xuICBjb25zdCBoYXNEYXRldGltZSA9IGNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZXRpbWVcIik7XG4gIGNvbnN0IGhhc0RhdGUgPSBjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWRhdGVcIik7XG4gIGlmICghaGFzRGF0ZXRpbWUgJiYgIWhhc0RhdGUpIHJldHVybiBcIlwiO1xuXG4gIGxldCBoZWxwZXJzID0gXCJcXG5cIjtcbiAgaWYgKGhhc0RhdGV0aW1lKSB7XG4gICAgaGVscGVycyArPSBgICAvLyBkYXRldGltZS1sb2NhbCDtmJXsi53snLzroZwg67OA7ZmYIChZWVlZLU1NLUREVEhIOk1NKVxuICBjb25zdCB0b0RhdGV0aW1lTG9jYWxTdHJpbmcgPSAoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZCA9IHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiID8gbmV3IERhdGUoZGF0ZSkgOiBkYXRlO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTYpO1xuICB9O1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIOusuOyekOyXtOydhCBEYXRl66GcIOuzgO2ZmFxuICBjb25zdCBmcm9tRGF0ZXRpbWVMb2NhbFN0cmluZyA9ICh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwgPT4ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH07XG5gO1xuICB9XG4gIGlmIChoYXNEYXRlKSB7XG4gICAgaGVscGVycyArPSBgICAvLyBkYXRlIO2YleyLneycvOuhnCDrs4DtmZggKFlZWVktTU0tREQpXG4gIGNvbnN0IHRvRGF0ZVN0cmluZyA9IChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkID0gdHlwZW9mIGRhdGUgPT09IFwic3RyaW5nXCIgPyBuZXcgRGF0ZShkYXRlKSA6IGRhdGU7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF07XG4gIH07XG5cbiAgLy8gZGF0ZSDrrLjsnpDsl7TsnYQgRGF0ZeuhnCDrs4DtmZhcbiAgY29uc3QgZnJvbURhdGVTdHJpbmcgPSAodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9O1xuYDtcbiAgfVxuICByZXR1cm4gaGVscGVycztcbn0pKCl9XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlkKSB7XG4gICAgICAke25hbWVzLmNhcGl0YWx9U2VydmljZS5nZXQke25hbWVzLmNhcGl0YWx9KFwiQVwiLCBpZCkudGhlbigocm93KSA9PiB7XG4gICAgICAgIHNldEZvcm0oKHByZXZGb3JtKSA9PiAoe1xuICAgICAgICAgIC4uLnByZXZGb3JtLFxuICAgICAgICAgIC4uLnJvdywkeygoKSA9PiB7XG4gICAgICAgICAgICAvLyByZWxhdGlvbiDtlYTrk5zrk6TsnYQg7LC+7JWE7IScIOuzgO2ZmCDsvZTrk5wg7IOd7ISxXG4gICAgICAgICAgICAvLyBudW1iZXIgRkssIHN0cmluZyBGSyAo7J6Q7Iug7J2YIFBLIOygnOyZuCksIE1hbnlUb01hbnkgRksg67Cw7Je066eMIO2VhO2EsOungVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpb25GaWVsZHMgPSBjb2x1bW5zXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1ma19pZFwiIHx8XG4gICAgICAgICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIiB8fFxuICAgICAgICAgICAgICAgICAgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNYW55VG9NYW55KGFycmF5KSDsspjrpqxcbiAgICAgICAgICAgICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uTmFtZSA9IGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYFxcbiAgICAgICAgICAke2NvbC5uYW1lfTogcm93LiR7cmVsYXRpb25OYW1lfT8ubWFwKChyKSA9PiByLmlkKSA/PyBbXSxgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBGSyhudW1iZXIsIHN0cmluZykg7LKY66asXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25OYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sLm51bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYFxcbiAgICAgICAgICAke2NvbC5uYW1lfTogcm93LiR7cmVsYXRpb25OYW1lfT8uaWQgPz8gbnVsbCxgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYFxcbiAgICAgICAgICAke2NvbC5uYW1lfTogcm93LiR7cmVsYXRpb25OYW1lfT8uaWQsYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uRmllbGRzO1xuICAgICAgICAgIH0pKCl9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2lkLCBzZXRGb3JtXSk7XG5cbiAgY29uc3Qgc2F2ZU11dGF0aW9uID0gJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UudXNlU2F2ZU11dGF0aW9uKCk7XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICR7XG4gICAgY29sdW1ucy5zb21lKChjb2wpID0+IFtcImpzb24tc29uYW11ZmlsZVwiLCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpXG4gICAgICA/IGBzdWJtaXQoYXN5bmMgKGZvcm0pID0+IHtcbiAgICBzYXZlTXV0YXRpb24ubXV0YXRlKFxuICAgICAgeyBzcGE6IFtmb3JtXSB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgICAgICBxdWVyeUtleTogW1wiJHtuYW1lcy5jYXBpdGFsfVwiXSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChtb2RlID09PSBcIm1vZGFsXCIpIHtcbiAgICAgICAgICAgIC8vIG1vZGFsIG1vZGVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlKHsgdG86IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBkZWZhdWx0Q2F0Y2gsXG4gICAgICB9LFxuICAgICk7XG4gIH0pYFxuICAgICAgOiBgKCkgPT4ge1xuICAgIHNhdmVNdXRhdGlvbi5tdXRhdGUoXG4gICAgICB7IHNwYTogW2Zvcm1dIH0sXG4gICAgICB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgICAgIHF1ZXJ5S2V5OiBbXCIke25hbWVzLmNhcGl0YWx9XCJdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IFwibW9kYWxcIikge1xuICAgICAgICAgICAgLy8gbW9kYWwgbW9kZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoeyB0bzogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGRlZmF1bHRDYXRjaCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfWBcbiAgfTtcblxuICBjb25zdCBQQUdFID0ge1xuICAgIHRpdGxlOiBpZCA/IFNEKFwiZW50aXR5LmVkaXRcIikoU0QoXCJlbnRpdHkuJHtlbnRpdHlJZH1cIiksIGlkKSA6IFNEKFwiZW50aXR5LmNyZWF0ZVwiKShTRChcImVudGl0eS4ke2VudGl0eUlkfVwiKSksXG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxGb3JtSWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkIGgtNVwiPntQQUdFLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge21vZGUgIT09IFwibW9kYWxcIiAmJiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcm91dGVyLm5hdmlnYXRlKHsgdG86IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIgfSl9XG4gICAgICAgICAgICAgICAgaWNvbj17PEFycm93TGVmdEljb24gLz59XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7U0QoXCJjb21tb24uYmFja1RvTGlzdFwiKX1cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIEZvcm0gQ2FyZCAqL31cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJib3JkZXItYm9yZGVyLzQwIGJnLWdyYXktNTAgc2hhZG93LXNtXCI+XG4gICAgICAgICAgICA8Q2FyZEhlYWRlciBjbGFzc05hbWU9XCJweC00IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8Q2FyZFRpdGxlIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIG0tMFwiPlxuICAgICAgICAgICAgICAgIHtQQUdFLnRpdGxlfVxuICAgICAgICAgICAgICA8L0NhcmRUaXRsZT5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJwLTZcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiR7Y29sdW1uc1xuICAuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBcImNyZWF0ZWRfYXRcIilcbiAgLm1hcCgoY29sKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPSAoKCkgPT4ge1xuICAgICAgaWYgKGNvbC5sYWJlbC5lbmRzV2l0aChcIklkXCIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoY29sLmxhYmVsLnJlcGxhY2UoXCJJZFwiLCBcIlwiKSk7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS50aXRsZSA/PyBjb2wubGFiZWw7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBjb2wubGFiZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2wubGFiZWw7XG4gICAgfSkoKTtcbiAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgIHJldHVybiBgICAgICAgICAgICAgICAgIHsvKiAke2xhYmVsfSAqL31cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJsb2NrIHRleHQteHMgbWItMSB0ZXh0LWdyYXktNjAwXCI+e1NEKFwiZW50aXR5LiR7ZW50aXR5SWR9LiR7bGFiZWxOYW1lfVwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgJHt0aGlzLnJlbmRlckNvbHVtbihlbnRpdHlJZCwgY29sKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICB9KVxuICAuam9pbihcIlxcblxcblwiKX1cblxuICAgICAgICAgICAgICAgIHsvKiBTYXZlIEJ1dHRvbiAqL31cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwdC00XCI+XG4gICAgICAgICAgICAgICAgICB7Zm9ybS5pZCAmJiBmb3JtLmNyZWF0ZWRfYXQgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm1yLTIgdGV4dC14cyB0ZXh0LWdyYXktNjAwXCI+e1NEKFwiZm9ybS5jcmVhdGVkQXRcIil9OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7U3RyaW5nKGZvcm0uY3JlYXRlZF9hdCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNhdmVJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7U0QoXCJjb21tb24uc2F2ZVwiKX1cbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztvQkFHMkQ7YUFPeEM7Y0FDbUI7QUFFdEMsSUFBYSxzQkFBYixjQUF5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
423
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19mb3JtLnRlbXBsYXRlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19mb3JtLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgUmVuZGVyaW5nTm9kZSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEVudW1JbmZvRnJvbUNvbE5hbWUsXG4gIGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lLFxuICBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZSxcbn0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5cbnR5cGUgRm9ybURlZmF1bHRWYWx1ZSA9XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBuZXZlcltdXG4gIHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuaW50ZXJmYWNlIEZvcm1EZWZhdWx0cyB7XG4gIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBGb3JtRGVmYXVsdFZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfZm9ybSBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2Zvcm1cIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9mb3JtLnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlcXVpcmVkRGljdEtleXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gW1wiZW50aXR5LmNyZWF0ZVwiLCBcImVudGl0eS5lZGl0XCIsIFwiY29tbW9uLmJhY2tUb0xpc3RcIiwgXCJmb3JtLmNyZWF0ZWRBdFwiLCBcImNvbW1vbi5zYXZlXCJdO1xuICB9XG5cbiAgd3JhcEZDKGJvZHk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICBgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj4ke2xhYmVsID8gYFxcbiAgPExhYmVsPiR7bGFiZWx9PC9MYWJlbD5gIDogXCJcIn1gLFxuICAgICAgYCAgJHtib2R5fWAsXG4gICAgICBgPC9kaXY+YCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgd3JhcEZHKGJvZHk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndyYXBGQyhib2R5LCBsYWJlbCk7XG4gIH1cblxuICByZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgY29sOiBSZW5kZXJpbmdOb2RlKSB7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwiZW51bVwiIGFzIGNvbnN0LCBlbnVtSWQ6IGlkIH07XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJma1wiIGFzIGNvbnN0LCBlbnRpdHlJZDogcmVsUHJvcC53aXRoIH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgLy8gTWFueVRvTWFueSByZWxhdGlvbuydmCBGSyDrsLDsl7RcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvX2lkcyQvLCBcIlwiKTtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiZmtcIiBhcyBjb25zdCwgZW50aXR5SWQ6IHJlbFByb3Aud2l0aCB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ0V4cHIgPSBgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9YDtcbiAgICBjb25zdCBwbGFjZWhvbGRlck5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gYHtTRChcImVudGl0eS4ke2VudGl0eUlkfS4ke3BsYWNlaG9sZGVyTmFtZX1cIil9YDtcblxuICAgIHN3aXRjaCAoY29sLnJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmctcGxhaW5cIjpcbiAgICAgICAgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcgJiYgKGNvbC56b2RUeXBlLm1heExlbmd0aCA/PyAwKSA8PSAyNTYpIHtcbiAgICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9ICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPFRleHRhcmVhIGNsYXNzTmFtZT1cInRleHQteHMgYmctd2hpdGVcIiByb3dzPXs0fSBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIHJldHVybiBgPERhdGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8aW5wdXQgdHlwZT1cImhpZGRlblwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1wbGFpblwiOlxuICAgICAgICByZXR1cm4gYDxJbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBgPFN3aXRjaCAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8RmlsZUlucHV0XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZE1vZGU9XCJsYXp5XCJcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGU9XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPEZpbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZT17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkTW9kZT1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZT1cImltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld1NpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgIG1heEZpbGVzPXsxMH1cbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtpZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtpZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gYDxJZEFzeW5jU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17JHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ31cbiAgICAgICAgICAgICAgICAgICAgc3Vic2V0PVwiQVwiXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8SW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn0gJHtyZWdFeHByfSAvPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAvLyBNYW55VG9NYW55IHJlbGF0aW9u7J2YIEZLIOuwsOyXtOyduOyngCDtmZXsnbhcbiAgICAgICAgaWYgKGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLnJlcGxhY2UoL19pZHMkLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj1cIiR7Y29sLm5hbWV9XCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9XCIke2NvbC5uYW1lfVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPVwiJHtjb2wubmFtZX1cIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgJHtyZWdFeHByfSAvPmA7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZURlZmF1bHRWYWx1ZShjb2x1bW5zOiBSZW5kZXJpbmdOb2RlW10pOiBGb3JtRGVmYXVsdHMge1xuICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZTxGb3JtRGVmYXVsdHM+KChyZXN1bHQsIGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5vcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBsZXQgdmFsdWU6IEZvcm1EZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoY29sLm51bGxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICAgIHZhbHVlID0gT2JqZWN0LmtleXMoY29sLnpvZFR5cGUuZW51bSlbMF07XG4gICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAgICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWRhdGV0aW1lXCIpIHtcbiAgICAgICAgICB2YWx1ZSA9IFwibm93KClcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgICAgIHZhbHVlID0gW107XG4gICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICAgICAgdmFsdWUgPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2NvbC5uYW1lXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBhc3luYyByZW5kZXIoeyBlbnRpdHlJZCB9OiBUZW1wbGF0ZU9wdGlvbnNbXCJ2aWV3X2Zvcm1cIl0pIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIC8vIFBLIO2DgOyehSDqsJDsp4BcbiAgICBjb25zdCBwa1R5cGUgPSBlbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgY29uc3QgaWRUc1R5cGUgPSBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIiA/IFwic3RyaW5nXCIgOiBcIm51bWJlclwiO1xuICAgIGNvbnN0IGlkWm9kVHlwZSA9XG4gICAgICBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIiA/IFwiei5zdHJpbmcoKS5vcHRpb25hbCgpXCIgOiBcInoubnVtYmVyKCkub3B0aW9uYWwoKVwiO1xuXG4gICAgLy8gU2F2ZVBhcmFtcyDtg4DsnoXsnYQg66Gc65Oc7ZWY7JesIHNhdmVQYXJhbXNOb2RlIOyDneyEsVxuICAgIGNvbnN0IHsgbG9hZFR5cGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9zeW5jZXIvbW9kdWxlLWxvYWRlclwiKTtcbiAgICBjb25zdCBsb2FkZWRUeXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICAgIGNvbnN0IFNhdmVQYXJhbXNab2RUeXBlID0gbG9hZGVkVHlwZXNbYCR7ZW50aXR5SWR9U2F2ZVBhcmFtc2BdO1xuXG4gICAgaWYgKCFTYXZlUGFyYW1zWm9kVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYXZlUGFyYW1zIGZvciAke2VudGl0eUlkfSBub3QgZm91bmQuIERpZCB5b3UgcnVuICdzb25hbXUgc3luYyc/YCk7XG4gICAgfVxuXG4gICAgLy8gWm9kIO2DgOyeheydhCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmFxuICAgIGNvbnN0IHsgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcbiAgICBjb25zdCBzYXZlUGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoU2F2ZVBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IChzYXZlUGFyYW1zTm9kZT8uY2hpbGRyZW4gPz8gW10pXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBcImlkXCIpXG4gICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcENhbmRpZGF0ZSA9IGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgY29sLmxhYmVsID0gcHJvcENhbmRpZGF0ZT8uZGVzYyA/PyBjb2wubGFiZWw7XG4gICAgICAgIHJldHVybiBjb2w7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucmVzb2x2ZURlZmF1bHRWYWx1ZShjb2x1bW5zKTtcblxuICAgIC8vIGVudW3qs7wgRkvsl5Ag64yA7ZWcIGltcG9ydCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgZW51bUltcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBma0NvbmZpZ0ltcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBlbnVtSW1wb3J0cy5hZGQoaWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctcGxhaW5cIiAmJlxuICAgICAgICBjb2wubmFtZS5lbmRzV2l0aChcIl9pZFwiKSAmJlxuICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiXG4gICAgICApIHtcbiAgICAgICAgLy8gc3RyaW5nIEZLIOyymOumrCAo7J6Q7Iug7J2YIFBL7J24IGlk64qUIOygnOyZuClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSB7XG4gICAgICAgIC8vIE1hbnlUb01hbnkgcmVsYXRpb27snZggRksg67Cw7Je0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5yZXBsYWNlKC9faWRzJC8sIFwiXCIpO1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgYmFzZU5hbWUpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKSxcbiAgICAgIGJvZHk6IGBcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIENhcmRUaXRsZSxcbiAgSW5wdXQsJHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLXBsYWluXCIgJiYgY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiAoY29sLnpvZFR5cGUubWF4TGVuZ3RoID8/IDApID4gMjU2KSA/IFwiXFxuICBUZXh0YXJlYSxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikgPyBcIlxcbiAgRW51bVNlbGVjdCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIgfHwgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSkgPyBcIlxcbiAgSWRBc3luY1NlbGVjdCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiYm9vbGVhblwiKSA/IFwiXFxuICBTd2l0Y2gsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IFtcImpzb24tc29uYW11ZmlsZVwiLCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCJcXG4gIEZpbGVJbnB1dCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wic3RyaW5nLWRhdGV0aW1lXCIsIFwic3RyaW5nLWRhdGVcIiwgXCJkYXRldGltZVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCJcXG4gIERhdGVJbnB1dCxcIiA6IFwiXCJ9XG59IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IHVzZVR5cGVGb3JtIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvbGliXCI7XG5pbXBvcnQgeyB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlUm91dGVyIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiOyR7XG4gICAgICAgIGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFwiXFxuaW1wb3J0IHsgXCIgK1xuICAgICAgICAgICAgdW5pcXVlKFxuICAgICAgICAgICAgICBjb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aWR9LCAke2lkfUxhYmVsYDtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgICcgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7J1xuICAgICAgICAgIDogXCJcIlxuICAgICAgfVxuaW1wb3J0IHsgZGVmYXVsdENhdGNoIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LnNoYXJlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNhdmVQYXJhbXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy8ke25hbWVzLmZzfS8ke25hbWVzLmZzfS50eXBlc1wiOyR7XG4gICAgICAgIGZrQ29uZmlnSW1wb3J0cy5zaXplID4gMFxuICAgICAgICAgID8gYFxcbmltcG9ydCB7ICR7QXJyYXkuZnJvbShma0NvbmZpZ0ltcG9ydHMpXG4gICAgICAgICAgICAgIC5tYXAoKHJlbGF0ZWRFbnRpdHlJZCkgPT4gYCR7cmVsYXRlZEVudGl0eUlkfUFzeW5jSWRDb25maWdgKVxuICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO2BcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbmltcG9ydCB7IFNEIH0gZnJvbSBcIkAvaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuaW1wb3J0IEFycm93TGVmdEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvYXJyb3ctbGVmdFwiO1xuaW1wb3J0IFNhdmVJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NhdmVcIjtcbmltcG9ydCBGb3JtSWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtLXNlbGVjdFwiO1xuXG5jb25zdCBmb3JtU2VhcmNoU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogJHtpZFpvZFR5cGV9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9mb3JtXCIpKHtcbiAgdmFsaWRhdGVTZWFyY2g6IGZvcm1TZWFyY2hTY2hlbWEsXG4gIGNvbXBvbmVudDogJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm1QYWdlLFxufSk7XG5cbmZ1bmN0aW9uICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtUGFnZSgpIHtcbiAgY29uc3QgeyBpZCB9ID0gUm91dGUudXNlU2VhcmNoKCk7XG4gIHJldHVybiA8JHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm0gaWQ9e2lkfSAvPjtcbn1cblxudHlwZSAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVByb3BzID0ge1xuICBpZD86ICR7aWRUc1R5cGV9O1xuICBtb2RlPzogXCJwYWdlXCIgfCBcIm1vZGFsXCI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm0oeyBpZCwgbW9kZSB9OiAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVByb3BzKSB7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgY29uc3QgeyBmb3JtLCBzZXRGb3JtLCByZWdpc3RlciR7Y29sdW1ucy5zb21lKChjb2wpID0+IFtcImpzb24tc29uYW11ZmlsZVwiLCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCIsIHN1Ym1pdFwiIDogXCJcIn0gfSA9IHVzZVR5cGVGb3JtKCR7bmFtZXMuY2FwaXRhbH1TYXZlUGFyYW1zLCAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRWYWx1ZSkucmVwbGFjZSgvXCJub3dcXChcXClcIi9nLCAnXCJcIicpfSk7XG4keygoKSA9PiB7XG4gIGNvbnN0IGhhc0RhdGV0aW1lID0gY29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiKTtcbiAgY29uc3QgaGFzRGF0ZSA9IGNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZVwiKTtcbiAgaWYgKCFoYXNEYXRldGltZSAmJiAhaGFzRGF0ZSkgcmV0dXJuIFwiXCI7XG5cbiAgbGV0IGhlbHBlcnMgPSBcIlxcblwiO1xuICBpZiAoaGFzRGF0ZXRpbWUpIHtcbiAgICBoZWxwZXJzICs9IGAgIC8vIGRhdGV0aW1lLWxvY2FsIO2YleyLneycvOuhnCDrs4DtmZggKFlZWVktTU0tRERUSEg6TU0pXG4gIGNvbnN0IHRvRGF0ZXRpbWVMb2NhbFN0cmluZyA9IChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkID0gdHlwZW9mIGRhdGUgPT09IFwic3RyaW5nXCIgPyBuZXcgRGF0ZShkYXRlKSA6IGRhdGU7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxNik7XG4gIH07XG5cbiAgLy8gZGF0ZXRpbWUtbG9jYWwg66y47J6Q7Je07J2EIERhdGXroZwg67OA7ZmYXG4gIGNvbnN0IGZyb21EYXRldGltZUxvY2FsU3RyaW5nID0gKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfTtcbmA7XG4gIH1cbiAgaWYgKGhhc0RhdGUpIHtcbiAgICBoZWxwZXJzICs9IGAgIC8vIGRhdGUg7ZiV7Iud7Jy866GcIOuzgO2ZmCAoWVlZWS1NTS1ERClcbiAgY29uc3QgdG9EYXRlU3RyaW5nID0gKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGQgPSB0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZTtcbiAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXTtcbiAgfTtcblxuICAvLyBkYXRlIOusuOyekOyXtOydhCBEYXRl66GcIOuzgO2ZmFxuICBjb25zdCBmcm9tRGF0ZVN0cmluZyA9ICh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwgPT4ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH07XG5gO1xuICB9XG4gIHJldHVybiBoZWxwZXJzO1xufSkoKX1cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaWQpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmdldCR7bmFtZXMuY2FwaXRhbH0oXCJBXCIsIGlkKS50aGVuKChyb3cpID0+IHtcbiAgICAgICAgc2V0Rm9ybSgocHJldkZvcm0pID0+ICh7XG4gICAgICAgICAgLi4ucHJldkZvcm0sXG4gICAgICAgICAgLi4ucm93LCR7KCgpID0+IHtcbiAgICAgICAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOuTpOydhCDssL7slYTshJwg67OA7ZmYIOy9lOuTnCDsg53shLFcbiAgICAgICAgICAgIC8vIG51bWJlciBGSywgc3RyaW5nIEZLICjsnpDsi6DsnZggUEsg7KCc7Jm4KSwgTWFueVRvTWFueSBGSyDrsLDsl7Trp4wg7ZWE7YSw66eBXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbkZpZWxkcyA9IGNvbHVtbnNcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoY29sKSA9PlxuICAgICAgICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHxcbiAgICAgICAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1ma19pZFwiIHx8XG4gICAgICAgICAgICAgICAgICAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hbnlUb01hbnkoYXJyYXkpIOyymOumrFxuICAgICAgICAgICAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25OYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5tYXAoKHIpID0+IHIuaWQpID8/IFtdLGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZLKG51bWJlciwgc3RyaW5nKSDsspjrpqxcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbk5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2wubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5pZCA/PyBudWxsLGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5pZCxgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb25GaWVsZHM7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbaWQsIHNldEZvcm1dKTtcblxuICBjb25zdCBzYXZlTXV0YXRpb24gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2VTYXZlTXV0YXRpb24oKTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gJHtcbiAgICBjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wianNvbi1zb25hbXVmaWxlXCIsIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCJdLmluY2x1ZGVzKGNvbC5yZW5kZXJUeXBlKSlcbiAgICAgID8gYHN1Ym1pdChhc3luYyAoZm9ybSkgPT4ge1xuICAgIHNhdmVNdXRhdGlvbi5tdXRhdGUoXG4gICAgICB7IHNwYTogW2Zvcm1dIH0sXG4gICAgICB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgICAgIHF1ZXJ5S2V5OiBbXCIke25hbWVzLmNhcGl0YWx9XCJdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IFwibW9kYWxcIikge1xuICAgICAgICAgICAgLy8gbW9kYWwgbW9kZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoeyB0bzogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGRlZmF1bHRDYXRjaCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSlgXG4gICAgICA6IGAoKSA9PiB7XG4gICAgc2F2ZU11dGF0aW9uLm11dGF0ZShcbiAgICAgIHsgc3BhOiBbZm9ybV0gfSxcbiAgICAgIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICAgICAgcXVlcnlLZXk6IFtcIiR7bmFtZXMuY2FwaXRhbH1cIl0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAobW9kZSA9PT0gXCJtb2RhbFwiKSB7XG4gICAgICAgICAgICAvLyBtb2RhbCBtb2RlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZSh7IHRvOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogZGVmYXVsdENhdGNoLFxuICAgICAgfSxcbiAgICApO1xuICB9YFxuICB9O1xuXG4gIGNvbnN0IFBBR0UgPSB7XG4gICAgdGl0bGU6IGlkID8gU0QoXCJlbnRpdHkuZWRpdFwiKShTRChcImVudGl0eS4ke2VudGl0eUlkfVwiKSwgaWQpIDogU0QoXCJlbnRpdHkuY3JlYXRlXCIpKFNEKFwiZW50aXR5LiR7ZW50aXR5SWR9XCIpKSxcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPEZvcm1JY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgaC01XCI+e1BBR0UudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7bW9kZSAhPT0gXCJtb2RhbFwiICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiByb3V0ZXIubmF2aWdhdGUoeyB0bzogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIiB9KX1cbiAgICAgICAgICAgICAgICBpY29uPXs8QXJyb3dMZWZ0SWNvbiAvPn1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtTRChcImNvbW1vbi5iYWNrVG9MaXN0XCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogRm9ybSBDYXJkICovfVxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cImJvcmRlci1ib3JkZXIvNDAgYmctZ3JheS01MCBzaGFkb3ctc21cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInB4LTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxDYXJkVGl0bGUgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmUgbS0wXCI+XG4gICAgICAgICAgICAgICAge1BBR0UudGl0bGV9XG4gICAgICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuJHtjb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwiY3JlYXRlZF9hdFwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9ICgoKSA9PiB7XG4gICAgICBpZiAoY29sLmxhYmVsLmVuZHNXaXRoKFwiSWRcIikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoY29sLmxhYmVsLnJlcGxhY2UoXCJJZFwiLCBcIlwiKSk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0ZWRFbnRpdHkudGl0bGUgPz8gY29sLmxhYmVsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY29sLmxhYmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sLmxhYmVsO1xuICAgIH0pKCk7XG4gICAgY29uc3QgbGFiZWxOYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICByZXR1cm4gYCAgICAgICAgICAgICAgICB7LyogJHtsYWJlbH0gKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIG1iLTEgdGV4dC1ncmF5LTYwMFwiPntTRChcImVudGl0eS4ke2VudGl0eUlkfS4ke2xhYmVsTmFtZX1cIil9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJDb2x1bW4oZW50aXR5SWQsIGNvbCl9XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgfSlcbiAgLmpvaW4oXCJcXG5cXG5cIil9XG5cbiAgICAgICAgICAgICAgICB7LyogU2F2ZSBCdXR0b24gKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtNFwiPlxuICAgICAgICAgICAgICAgICAge2Zvcm0uaWQgJiYgZm9ybS5jcmVhdGVkX2F0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJtci0yIHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPntTRChcImZvcm0uY3JlYXRlZEF0XCIpfTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge1N0cmluZyhmb3JtLmNyZWF0ZWRfYXQpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgICAgICAgICAgIGljb249ezxTYXZlSWNvbiAvPn1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge1NEKFwiY29tbW9uLnNhdmVcIil9XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7b0JBRzJEO2FBT3hDO2NBQ21CO0FBY3RDLElBQWEsc0JBQWIsY0FBeUMsU0FBUztDQUNoRCxjQUFjO0VBQ1osTUFBTSxXQUFXO0NBQ25CO0NBRUEsaUJBQWlCLE9BQTBCO0VBQ3pDLE9BQU87R0FDTCxRQUFRO0dBQ1IsTUFBTSxHQUFHLE1BQU0sU0FBUztFQUMxQjtDQUNGO0NBRUEsc0JBQWdEO0VBQzlDLE9BQU87R0FBQztHQUFpQjtHQUFlO0dBQXFCO0dBQWtCO0VBQWE7Q0FDOUY7Q0FFQSxPQUFPLE1BQWMsT0FBd0I7RUFDM0MsT0FBTztHQUNMLDhCQUE4QixRQUFRLGNBQWMsTUFBTSxZQUFZO0dBQ3RFLEtBQUs7R0FDTDtFQUNGLENBQUMsQ0FBQyxLQUFLLElBQUk7Q0FDYjtDQUNBLE9BQU8sTUFBYyxPQUF3QjtFQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLEtBQUs7Q0FDaEM7Q0FFQSxtQkFBbUIsVUFBa0IsS0FBb0I7RUFDdkQsSUFBSSxJQUFJLGVBQWUsU0FBUztHQUM5QixNQUFNLEVBQUUsT0FBTyx1QkFBdUIsVUFBVSxJQUFJLElBQUk7R0FDeEQsT0FBTztJQUFFLE1BQU07SUFBaUIsUUFBUTtHQUFHO0VBQzdDLE9BQU8sSUFBSSxJQUFJLGVBQWUsa0JBQWtCLElBQUksZUFBZSxnQkFDakUsSUFBSTtHQUVGLE9BQU87SUFBRSxNQUFNO0lBQWUsVUFEZCwyQkFBMkIsVUFBVSxJQUFJLEtBQUssUUFBUSxPQUFPLEVBQUUsQ0FDdkMsQ0FBQSxDQUFRO0dBQUs7RUFDdkQsUUFBUTtHQUNO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
@@ -1 +1 @@
1
- {"version":3,"file":"view_list.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_list.template.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAO7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,EAAE,SAAS,GAAE,MAAW;IAMpF,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,EACxB,SAAS,GAAE,MAAc,EACzB,WAAW,GAAE,OAAe,GAC3B,MAAM;IAyFT,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,GACvB,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE;IAwBpB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB;IAiCjF,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB;IAkC3E,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG;QACpC,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB;IAoBK,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;;;;;CAsfxD"}
1
+ {"version":3,"file":"view_list.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_list.template.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAO7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWvC,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,EAAE,SAAS,GAAE,MAAW;IAMpF,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,EACxB,SAAS,GAAE,MAAc,EACzB,WAAW,GAAE,OAAe,GAC3B,MAAM;IAyFT,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,GACvB,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE;IAwBpB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB;IAiCjF,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB;IAkC3E,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE;;;;;;IAoB7B,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;;;;;CA0fxD"}
@@ -2,12 +2,16 @@ import { EntityManager, init_entity_manager } from "../../entity/entity-manager.
2
2
  import { Template, init_template } from "../template.js";
3
3
  import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName, init_helpers } from "../helpers.js";
4
4
  import inflection from "inflection";
5
- import { z as z$1 } from "zod";
5
+ import { z } from "zod";
6
6
  import { flat } from "radashi";
7
7
  //#region src/template/implementations/view_list.template.ts
8
8
  init_entity_manager();
9
9
  init_helpers();
10
10
  init_template();
11
+ function getConfigEnumId(config) {
12
+ if (!config || !("enumId" in config)) return;
13
+ return Object.prototype.toString.call(config.enumId) === "[object String]" ? String(config.enumId) : void 0;
14
+ }
11
15
  var Template__view_list = class extends Template {
12
16
  constructor() {
13
17
  super("view_list");
@@ -137,12 +141,12 @@ var Template__view_list = class extends Template {
137
141
  hasOrderBy: false
138
142
  };
139
143
  const orderByZodType = columns.find((col) => col.name === "orderBy")?.zodType;
140
- if (orderByZodType && orderByZodType instanceof z$1.ZodEnum) {
144
+ if (orderByZodType && orderByZodType instanceof z.ZodEnum) {
141
145
  def.orderBy = Object.keys(orderByZodType.enum)[0];
142
146
  def.hasOrderBy = true;
143
147
  }
144
148
  const searchZodType = columns.find((col) => col.name === "search")?.zodType;
145
- if (searchZodType && searchZodType instanceof z$1.ZodEnum) {
149
+ if (searchZodType && searchZodType instanceof z.ZodEnum) {
146
150
  def.search = Object.keys(searchZodType.enum)[0];
147
151
  def.hasSearch = true;
148
152
  }
@@ -215,7 +219,8 @@ import { ${(() => {
215
219
  if (filterColumns.some((col) => col.name === "orderBy")) baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
216
220
  if (filterColumns.some((col) => col.name === "search")) baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
217
221
  const filterEnumIds = filterColumns.filter((col) => col.renderType === "enums" && col.name !== "search" && col.name !== "orderBy").map((col) => {
218
- if (col.config && "enumId" in col.config) return col.config.enumId;
222
+ const configEnumId = getConfigEnumId(col.config);
223
+ if (configEnumId) return configEnumId;
219
224
  try {
220
225
  const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
221
226
  return enumId;
@@ -420,7 +425,7 @@ ${filterColumns.some((col) => col.name === "search") ? ` <EnumS
420
425
  <div className="flex items-center gap-3 flex-wrap">
421
426
  ${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy").map((col) => {
422
427
  if (col.renderType === "enums") try {
423
- const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
428
+ const enumId = getConfigEnumId(col.config) ?? getEnumInfoFromColName(entityId, col.name).id;
424
429
  return ` <EnumSelect
425
430
  key={\`${col.name}-\${listParams.${col.name}}\`}
426
431
  enum={${enumId}}
@@ -550,4 +555,4 @@ ${filterColumns.some((col) => col.name === "orderBy") ? ` <Enum
550
555
  //#endregion
551
556
  export { Template__view_list };
552
557
 
553
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IHtcbiAgICBvcmRlckJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgaGFzU2VhcmNoOiBib29sZWFuO1xuICAgIGhhc09yZGVyQnk6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IChjb2x1bW5zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG5cbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuXG4gICAgLy8g7Lus65+87JeQ7IScIOyCrOyaqe2VmOuKlCBlbnVt65OkIOyImOynkVxuICAgIGNvbnN0IGNvbHVtbkVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIChjb2x1bW5zTm9kZS5jaGlsZHJlbiA/PyBbXSkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbHVtbkVudW1zLnB1c2goZW51bUlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g65SU7Y+07Yq4IO2MjOudvOuvuO2EsFxuICAgIC8vIGNvbnN0IGRlZiA9IHRoaXMuZ2V0RGVmYXVsdChmaWx0ZXJDb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZU5hdmlnYXRlIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcblxuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBhZ2luYXRpb24sIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgdHlwZSBUYWJsZUNvbCwgVGFibGVIZWFkLCBUYWJsZUhlYWRlciwgVGFibGVSb3cgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBFbnVtU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQWxlcnREaWFsb2csIEFsZXJ0RGlhbG9nQWN0aW9uLCBBbGVydERpYWxvZ0NhbmNlbCwgQWxlcnREaWFsb2dDb250ZW50LCBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uLCBBbGVydERpYWxvZ0Zvb3RlciwgQWxlcnREaWFsb2dIZWFkZXIsIEFsZXJ0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU29uYW11RmlsdGVyTW9kYWwsIFNvbmFtdUZpbHRlclBvcG92ZXIsIGV4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hLCB0eXBlIFJ1bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBLCAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7XG5pbXBvcnQgeyAkeygoKSA9PiB7XG4gICAgICAgIC8vIOq4sOuzuCBlbnVtIOyImOynkSAoZmlsdGVyQ29sdW1uc+yXkCDsnojripQg6rKD66eMKVxuICAgICAgICBjb25zdCBiYXNlRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeWAsIGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeUxhYmVsYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYCwgYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlYTthLAgZW51bSDsiJjsp5EgKGNvbmZpZy5lbnVtSWQg7Jqw7ISgLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSlcbiAgICAgICAgY29uc3QgZmlsdGVyRW51bUlkcyA9IGZpbHRlckNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIiAmJiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb25maWcgJiYgXCJlbnVtSWRcIiBpbiBjb2wuY29uZmlnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGtleT17XFxgJHtjb2wubmFtZX0tXFwke2xpc3RQYXJhbXMuJHtjb2wubmFtZX19XFxgfVxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2VudW1JZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtlbnVtSWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7Y29sLmxhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZLIO2VhOuTnCAoSWRBc3luY1NlbGVjdClcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWwgPz8gcmVsUHJvcC53aXRofVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0pXG4gIC5maWx0ZXIoQm9vbGVhbilcbiAgLmpvaW4oXCJcXG5cIil9XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIm9yZGVyQnlcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0UHJlZml4PXtcXGBcXCR7U0QoXCJjb21tb24uc29ydFwiKX06IFxcYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntTRChcImNvbW1vbi5yZXN1bHRzXCIpKHRvdGFsID8/IDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJweC02IHBiLTYgcHQtNiBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICB7LyogVGFibGUgKi99XG4gICAgICAgICAgICAgIDxUYWJsZT5cbiAgICAgICAgICAgICAgICA8VGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwiaG92ZXI6YmctdHJhbnNwYXJlbnQgYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBjbGFzc05hbWU9XCJoLTkgdGV4dC14cyB3LVs0MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNBbGxTZWxlY3RlZCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlU2VsZWN0QWxsfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkPlxuICAgICAgICAgICAgICAgICAgICB7Y29sdW1ucy5tYXAoKGNvbCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxUYWJsZUJvZHk+XG4gICAgICAgICAgICAgICAgICB7IWlzTG9hZGluZyAmJiByb3dzICYmIHJvd3MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoKSA9PiBoYW5kbGVUb2dnbGVJdGVtKHJvdy5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufSBjbGFzc05hbWU9XCJweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbC50Yyhyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgICAgICB7LyogUGFnaW5hdGlvbiAqL31cbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJwYWdlXCIpfVxuICAgICAgICAgICAgICAgIHRvdGFsPXt0b3RhbCA/PyAwfVxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZT17bGlzdFBhcmFtcy5udW0gPz8gMTB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERlbGV0ZSBEaWFsb2cgKi99XG4gICAgICA8QWxlcnREaWFsb2cgb3Blbj17ZGVsZXRlRGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREZWxldGVEaWFsb2dPcGVufT5cbiAgICAgICAgPEFsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgICAgICA8QWxlcnREaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dUaXRsZT57U0QoXCJkZWxldGUuY29uZmlybS50aXRsZVwiKX08L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj57U0QoXCJkZWxldGUuY29uZmlybS5kZXNjcmlwdGlvblwiKX08L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+e1NEKFwiY29tbW9uLmNhbmNlbFwiKX08L0FsZXJ0RGlhbG9nQ2FuY2VsPlxuICAgICAgICAgICAgPEFsZXJ0RGlhbG9nQWN0aW9uIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1EZWxldGV9PlxuICAgICAgICAgICAgICB7U0QoXCJjb21tb24uZGVsZXRlXCIpfVxuICAgICAgICAgICAgPC9BbGVydERpYWxvZ0FjdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nRm9vdGVyPlxuICAgICAgICA8L0FsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgIDwvQWxlcnREaWFsb2c+XG5cbiAgICAgIHsvKiBTb25hbXUgRmlsdGVyIE1vZGFsICovfVxuICAgICAgPFNvbmFtdUZpbHRlck1vZGFsXG4gICAgICAgIGJhc2VTY2hlbWE9eyR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hfVxuICAgICAgICBvcGVuPXtmaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0RmlsdGVyTW9kYWxPcGVufVxuICAgICAgICBpbml0aWFsUnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgb25BcHBseT17KGZpbHRlcnMsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgc2V0TGlzdFBhcmFtcyh7IC4uLmxpc3RQYXJhbXMsIHNvbmFtdUZpbHRlcjogZmlsdGVycywgcGFnZTogMSB9KTtcbiAgICAgICAgICBzZXRBcHBsaWVkUnVsZXMocnVsZXMpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBwcmVUZW1wbGF0ZXMsXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O29CQUkyRDthQU94QztjQUVtQjtBQUV0QyxJQUFhLHNCQUFiLGNBQXlDLFNBQVM7Q0FDaEQsY0FBYztFQUNaLE1BQU0sV0FBVztDQUNuQjtDQUVBLGlCQUFpQixPQUEwQjtFQUN6QyxPQUFPO0dBQ0wsUUFBUTtHQUNSLE1BQU0sR0FBRyxNQUFNLFNBQVM7RUFDMUI7Q0FDRjtDQUVBLHNCQUFnRDtFQUM5QyxPQUFPLENBQUMscUJBQXFCLFlBQVk7Q0FDM0M7Q0FFQSxPQUFPLE1BQWMsS0FBYSxhQUFzQixNQUFNLFlBQW9CLElBQUk7RUFDcEYsT0FBTyxvQkFBb0IsSUFBSSxHQUFHLGFBQWEsZ0JBQWdCLEtBQzdELFlBQVksaUJBQWlCLFVBQVUsT0FBTyxHQUMvQyxHQUFHLEtBQUs7Q0FDWDtDQUVBLGFBQ0UsVUFDQSxLQUNBLE9BQ0EsWUFBb0IsT0FDcEIsY0FBdUIsT0FDZjtFQUVSLElBQUk7RUFDSixJQUFJLGFBQ0YsVUFBVTtPQUNMLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxHQUc5QixVQUFVLEdBQUcsVUFBVSxHQURULElBQUksS0FBSyxNQUFNLEdBQ0gsQ0FBQSxDQUFNLEtBQUssSUFBSTtPQUV6QyxVQUFVLEdBQUcsVUFBVSxHQUFHLElBQUk7RUFHaEMsUUFBUSxJQUFJLFlBQVo7R0FDRSxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLLGFBQ0gsT0FBTyxNQUFNLFFBQVE7R0FDdkIsS0FBSztHQUNMLEtBQUssZ0JBQ0gsSUFBSTtJQUtGLE9BQU8sS0FEVywyQkFBMkIsVUFINUIsSUFBSSxLQUFLLFNBQVMsR0FBRyxLQUNqQyxJQUFJLEtBQUssTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFBLENBQU0sUUFBUSxPQUFPLEVBQUUsSUFDekQsSUFBSSxLQUFLLFFBQVEsT0FBTyxFQUFFLENBRWxCLENBQUEsQ0FBVSxLQUFLLElBQUksUUFBUTtHQUN6QyxRQUFRO0lBQ04sT0FBTyxNQUFNLFFBQVE7R0FDdkI7R0FFRixLQUFLLFlBQ0gsSUFBSSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsR0FBRyxHQUN2QyxPQUFPLFVBQVUsUUFBUSxlQUFlLFFBQVE7UUFFaEQsT0FBTyxvQkFBb0IsUUFBUTtHQUV2QyxLQUFLLG1CQUNILElBQUksSUFBSSxZQUFZLElBQUksS0FBSyxTQUFTLEdBQUcsR0FDdkMsT0FBTyxVQUFVLFFBQVEsV0FBVyxRQUFRO1FBRTVDLE9BQU8sZ0JBQWdCLFFBQVE7R0FFbkMsS0FBSyxXQUNILE9BQU8sTUFBTSxRQUFRO0dBQ3ZCLEtBQUssU0FDSCxJQUFJO0lBQ0YsTUFBTSxFQUFFLElBQUksV0FBVyx1QkFBdUIsVUFBVSxJQUFJLElBQUk7SUFDaEUsT0FBTyxNQUFNLElBQUksV0FBVyxHQUFHLFFBQVEsUUFBUSxLQUFLLE9BQU8sUUFBUSxRQUFRO0dBQzdFLFFBQVE7SUFDTixPQUFPLE1BQU0sUUFBUTtHQUN2QjtHQUVGLEtBQUssZ0JBQ0gsT0FBTyxpQ0FBaUMsUUFBUSxrQkFDOUMsSUFBSSxXQUFXLFVBQVUsR0FDMUIsOEJBQThCLElBQUksU0FBUyxJQUFJLEtBQUs7R0FDdkQsS0FBSyxtQkFDSCxPQUFPLDZDQUE2QyxRQUFRLGVBQWUsUUFBUSxhQUFhLFFBQVE7R0FDMUcsS0FBSyx5QkFDSCxPQUFPLGlDQUFpQyxRQUFRLGtCQUM5QyxJQUFJLFdBQVcsVUFBVSxHQUMxQixrQ0FBa0MsSUFBSSxTQUFTLElBQUksS0FBSztHQUMzRCxLQUFLLGdCQUNILE9BQU8sTUFBTSxJQUFJLFlBQVksSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsUUFBUSxRQUFRLEdBQUcsT0FBTyxRQUFRO0dBQzdGLEtBQUssVUFDSCxPQUFPLDhCQUE4QixJQUFJLFdBQVcsR0FBRyxRQUFRLE9BQU8sR0FBRyxpQkFBaUIsUUFBUSxHQUFHLElBQUksV0FBVyxXQUFXLEdBQUc7R0FDcEksS0FBSyxlQUFlO0lBQ2xCLE1BQU0sY0FBYyxJQUFJLFVBQVUsTUFBTSxVQUFVLE1BQU0sU0FBUyxJQUFJLFFBQVEsTUFBTTtJQUNuRixJQUFJLENBQUMsYUFDSCxNQUFNLElBQUksTUFBTSw0QkFBNEIsSUFBSSxLQUFLLEVBQUU7SUFFekQsT0FBTyxLQUFLLGFBQ1YsVUFDQSxhQUNBLE9BQ0EsR0FBRyxVQUFVLElBQUksV0FBVyxNQUFNLElBQ3BDO0dBQ0Y7R0FDQSxLQUFLLFNBQ0gsT0FBTyxnQkFBZ0IsUUFBUTtHQUNqQyxLQUFLLFVBRUgsT0FBTyxNQUFNLElBQUksV0FBVyxHQUFHLFFBQVEsT0FBTyxHQUFHLFlBQVksVUFBVSxJQUFJLFdBQVcsS0FBSyxTQUFTLFlBQVksSUFBSSxXQUFXLFdBQVcsR0FBRztHQUMvSSxTQUNFLE1BQU0sSUFBSSxNQUFNLFlBQVksSUFBSSxZQUFZO0VBQ2hEO0NBQ0Y7Q0FFQSxtQkFDRSxVQUNBLEtBQ0EsT0FDbUI7RUFDbkIsSUFBSSxJQUFJLGVBQWUsU0FBUztHQUM5QixNQUFNLEVBQUUsSUFBSSxXQUFXLHVCQUF1QixNQUFNLFNBQVMsSUFBSSxJQUFJO0dBQ3JFLE9BQU8sQ0FBQyxZQUFZLE9BQU8sNENBQTRDO0VBQ3pFLE9BQU8sSUFBSSxJQUFJLGVBQWUsVUFDNUIsSUFBSTtHQUNGLE1BQU0sVUFBVSwyQkFBMkIsVUFBVSxJQUFJLElBQUk7R0FNN0QsT0FBTyxNQUxTLElBQUksWUFBWSxDQUFDLEVBQUEsQ0FBRyxLQUFLLFVBQVU7SUFDakQsV0FBVyxRQUFRO0lBQ25CLFFBQVEsY0FBYyxlQUFlLFFBQVEsSUFBSTtJQUNqRCxPQUFPLEtBQUssbUJBQW1CLFVBQVUsT0FBTyxLQUFLO0dBQ3ZELENBQ1ksQ0FBTTtFQUNwQixRQUFRO0dBQ04sT0FBTyxDQUFDLElBQUk7RUFDZDtPQUNLLElBQUksSUFBSSxlQUFlLFNBQVM7R0FDckMsSUFBSSxDQUFDLElBQUksU0FBUyxPQUFPLENBQUMsSUFBSTtHQUM5QixPQUFPLEtBQUssbUJBQW1CLFVBQVUsSUFBSSxTQUFTLEtBQUs7RUFDN0Q7RUFFQSxPQUFPLENBQUMsSUFBSTtDQUNkO0NBRUEsbUJBQW1CLFVBQWtCLEtBQW9CLE9BQTBCO0VBQ2pGLElBQUksSUFBSSxTQUFTLFVBQ2YsT0FBTyxZQUFZLE1BQU0sUUFBUSxtQ0FBbUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRO09BQ3pGLElBQUksSUFBSSxlQUFlLFNBQzVCLElBQUksSUFBSSxTQUFTLFdBQVc7R0FDMUIsTUFBTSxjQUFjLEdBQUcsTUFBTSxVQUFVLFdBQVcsU0FBUyxJQUFJLElBQUksRUFBRTtHQUNyRSxPQUFPLFlBQVksWUFBWSx3QkFBd0IsTUFBTSxHQUFHLEdBQUcsWUFBWTtFQUNqRixPQUNFLElBQUk7R0FDRixNQUFNLEVBQUUsSUFBSSxtQkFBbUIsa0JBQWtCLHVCQUMvQyxVQUNBLElBQUksSUFDTjtHQUNBLE1BQU0sY0FBYyxHQUFHLEdBQUc7R0FDMUIsT0FBTyxZQUFZLFlBQVksd0JBQXdCLGNBQWMsR0FBRyxHQUFHLFlBQVk7RUFDekYsUUFBUTtHQUNOLE9BQU87RUFDVDtPQUVHLElBQUksSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZ0JBQ2pFLElBQUk7R0FDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLLFFBQVEsT0FBTyxFQUFFLENBQUM7R0FDaEYsTUFBTSxjQUFjLGNBQWMsZUFBZSxRQUFRLElBQUk7R0FDN0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxLQUFLO0dBQ3BDLE9BQU8sWUFBWSxZQUFZLHdCQUF3QixZQUFZLEdBQUcsR0FBRyxZQUFZO0VBQ3ZGLFFBQVE7R0FDTixPQUFPO0VBQ1Q7T0FFQSxNQUFNLElBQUksTUFBTSxrQkFBa0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxZQUFZO0NBRWxFO0NBRUEsYUFBYSxVQUFrQixLQUFvQixPQUEwQjtFQUMzRSxJQUFJLElBQUksU0FBUyxVQUNmLE9BQU87RUFHVCxNQUFNLGNBQWMsSUFBSSxhQUFhLFFBQVEsSUFBSSxTQUFTO0VBQzFELElBQUk7RUFDSixJQUFJLElBQUksZUFBZSxTQUFTO0dBQzlCLElBQUksSUFBSSxTQUFTLFdBQ2YsY0FBYyxHQUFHLE1BQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFFL0QsSUFBSTtJQUNGLE1BQU0sRUFBRSxPQUFPLHVCQUF1QixVQUFVLElBQUksSUFBSTtJQUN4RCxjQUFjLEdBQUcsR0FBRztHQUN0QixRQUFRO0lBQ04sT0FBTztHQUNUO0dBRUYsT0FBTyxJQUFJLFlBQVksaUJBQWlCLElBQUksS0FBSyxNQUFNLGNBQWMsY0FBYyxHQUFHO0VBQ3hGLE9BQU8sSUFBSSxJQUFJLGVBQWUsa0JBQWtCLElBQUksZUFBZSxnQkFDakUsSUFBSTtHQUVGLGNBQWMsR0FERSwyQkFBMkIsVUFBVSxJQUFJLEtBQUssUUFBUSxPQUFPLEVBQUUsQ0FDOUQsQ0FBQSxDQUFRLEtBQUs7R0FDOUIsT0FBTyxJQUFJLFlBQVksaUJBQWlCLElBQUksS0FBSyxNQUMvQyxjQUFjLGNBQWMsR0FDN0I7RUFDSCxRQUFRO0dBQ04sT0FBTztFQUNUO09BRUEsTUFBTSxJQUFJLE1BQU0sa0JBQWtCLElBQUksS0FBSyxHQUFHLElBQUksWUFBWTtDQUVsRTtDQUVBLFdBQVcsU0FLVDtFQUNBLE1BQU0sTUFBTTtHQUNWLFNBQVM7R0FDVCxRQUFRO0dBQ1IsV0FBVztHQUNYLFlBQVk7RUFDZDtFQUNBLE1BQU0saUJBQWlCLFFBQVEsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLENBQUMsRUFBRTtFQUN0RSxJQUFJLGtCQUFrQiwwQkFBMEJBLElBQUUsU0FBUztHQUN6RCxJQUFJLFVBQVUsT0FBTyxLQUFLLGVBQWUsSUFBSSxDQUFDLENBQUM7R0FDL0MsSUFBSSxhQUFhO0VBQ25CO0VBQ0EsTUFBTSxnQkFBZ0IsUUFBUSxNQUFNLFFBQVEsSUFBSSxTQUFTLFFBQVEsQ0FBQyxFQUFFO0VBQ3BFLElBQUksaUJBQWlCLHlCQUF5QkEsSUFBRSxTQUFTO0dBQ3ZELElBQUksU0FBUyxPQUFPLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQztHQUM3QyxJQUFJLFlBQVk7RUFDbEI7RUFDQSxPQUFPO0NBQ1Q7Q0FFQSxNQUFNLE9BQU8sRUFBRSxZQUEwQztFQUN2RCxNQUFNLEVBQUUsbUJBQW1CLE1BQU0sT0FBTztFQUN4QyxNQUFNLEVBQUUsZ0JBQWdCLDJCQUEyQixNQUFNLE9BQU87RUFFaEUsTUFBTSxjQUFjLE1BQU0sZUFBZSxVQUFVLEdBQUc7RUFFdEQsTUFBTSxpQkFBaUIsdUJBQXVCLE1BRGQsZUFBZSxHQUFHLFNBQVMsV0FBVyxDQUNQO0VBRS9ELE1BQU0sUUFBUSxjQUFjLGVBQWUsUUFBUTtFQUNuRCxNQUFNLFNBQVMsY0FBYyxJQUFJLFFBQVE7RUFHekMsTUFBTSxTQUFTLE9BQU8sVUFBVTtFQUNoQyxNQUFNLFdBQVcsV0FBVyxZQUFZLFdBQVcsU0FBUyxXQUFXO0VBR3ZFLE1BQU0sVUFBVyxZQUFZLFNBRTFCLFVBQVUsR0FBRyxNQUFPLEVBQUUsU0FBUyxPQUFPLEtBQUssRUFBRSxTQUFTLE9BQU8sSUFBSSxDQUFFLENBQUMsQ0FDcEUsS0FBSyxRQUFRO0dBQ1osTUFBTSxXQUFXLEtBQUssYUFBYSxVQUFVLEtBQUssS0FBSztHQUd2RCxJQUFJO0dBQ0osSUFBSSxJQUFJLFNBQVMsTUFDZixRQUFRO1FBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLEdBR3pDLFFBQVEsY0FEVSxJQUFJLEtBQUssUUFBUSxjQUFjLEdBQUcsU0FBUyxLQUFLLFlBQVksQ0FDeEQsRUFBVTtRQUMzQjtJQUNMLE1BQU0sWUFBWSw4QkFBOEIsVUFBVSxJQUFJLElBQUk7SUFDbEUsUUFBUSxjQUFjLE1BQU0sUUFBUSxHQUFHLFVBQVU7R0FDbkQ7R0FFQSxPQUFPO0lBQ0wsTUFBTSxJQUFJO0lBQ1Y7SUFDQSxJQUFJLFlBQVk7SUFDaEIsS0FDRSxJQUFJLFNBQVMsUUFDYixJQUFJLGVBQWUsZUFDbkIsSUFBSSxlQUFlLGNBQ25CLElBQUksZUFBZTtJQUNyQixPQUFPLElBQUksU0FBUyxRQUFRLElBQUksZUFBZSxjQUFjLFdBQVc7R0FDMUU7RUFDRixDQUFDO0VBR0gsTUFBTSxnQkFBaUIsZUFBZSxTQUNuQyxRQUNFLFFBQ0MsSUFBSSxTQUFTLFFBQ2IsSUFBSSxTQUFTLGVBQ2I7R0FBQztHQUFTO0dBQWE7R0FBZ0I7RUFBYyxDQUFDLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FDbEYsQ0FBQyxDQUVBLFVBQVUsTUFBTTtHQUNmLE9BQU8sRUFBRSxTQUFTLFlBQVksSUFBSTtFQUNwQyxDQUFDO0VBR0gsTUFBTSxlQUFpRCxDQUFDO0VBR3hELE1BQU0sY0FBd0IsQ0FBQztFQUMvQixDQUFDLFlBQVksWUFBWSxDQUFDLEVBQUEsQ0FBRyxTQUFTLFFBQVE7R0FDNUMsSUFBSSxJQUFJLGVBQWUsU0FDckIsSUFBSTtJQUNGLE1BQU0sRUFBRSxJQUFJLFdBQVcsdUJBQXVCLFVBQVUsSUFBSSxJQUFJO0lBQ2hFLFlBQVksS0FBSyxNQUFNO0dBQ3pCLFFBQVEsQ0FBQztFQUViLENBQUM7RUFLRCxPQUFPO0dBQ0wsR0FBRyxLQUFLLGlCQUFpQixLQUFLO0dBQzlCLE1BQU07Ozs7Ozs7Ozs7Ozs7OztXQWVELE1BQU0sUUFBUSxXQUFXLE1BQU0sUUFBUTtXQUN2QyxNQUFNLFFBQVE7V0FDZCxNQUFNLFFBQVEsZ0NBQWdDLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRztrQkFDNUQ7SUFFVixNQUFNLFlBQXNCLENBQUM7SUFDN0IsSUFBSSxjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsU0FBUyxHQUNwRCxVQUFVLEtBQUssR0FBRyxNQUFNLFFBQVEsVUFBVSxHQUFHLE1BQU0sUUFBUSxhQUFhO0lBRTFFLElBQUksY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFFBQVEsR0FDbkQsVUFBVSxLQUFLLEdBQUcsTUFBTSxRQUFRLGNBQWMsR0FBRyxNQUFNLFFBQVEsaUJBQWlCO0lBSWxGLE1BQU0sZ0JBQWdCLGNBQ25CLFFBQ0UsUUFBUSxJQUFJLGVBQWUsV0FBVyxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsU0FDL0UsQ0FBQyxDQUNBLEtBQUssUUFBUTtLQUNaLElBQUksSUFBSSxVQUFVLFlBQVksSUFBSSxRQUNoQyxPQUFRLElBQUksT0FBOEI7S0FFNUMsSUFBSTtNQUNGLE1BQU0sRUFBRSxJQUFJLFdBQVcsdUJBQXVCLFVBQVUsSUFBSSxJQUFJO01BQ2hFLE9BQU87S0FDVCxRQUFRO01BQ04sT0FBTztLQUNUO0lBQ0YsQ0FBQyxDQUFDLENBQ0QsT0FBTyxPQUFPO0lBSWpCLE1BQU0sY0FBYyxDQURGLG1CQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsZUFBZSxHQUFHLFdBQVcsQ0FBQyxDQUMzQyxDQUFBLENBQVMsU0FBUyxXQUFXLENBQUMsR0FBRyxVQUFVLEdBQUcsT0FBTyxNQUFNLENBQUM7SUFFaEYsT0FBTyxDQUFDLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSTtHQUNqRCxFQUFBLENBQUcsRUFBRTs7U0FFRjtJQUtQLE1BQU0sY0FIWSxjQUFjLFFBQzdCLFFBQVEsSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsY0FFL0MsQ0FBQSxDQUNqQixLQUFLLFFBQVE7S0FDWixJQUFJO01BRUYsT0FBTyxHQURTLDJCQUEyQixVQUFVLElBQUksS0FBSyxRQUFRLE9BQU8sRUFBRSxDQUNyRSxDQUFBLENBQVEsS0FBSztLQUN6QixRQUFRO01BQ04sT0FBTztLQUNUO0lBQ0YsQ0FBQyxDQUFDLENBQ0QsT0FBTyxPQUFPO0lBQ2pCLE9BQU8sWUFBWSxTQUFTLElBQ3hCLFlBQVksWUFBWSxLQUFLLElBQUksRUFBRSw0Q0FDbkM7R0FDTixFQUFBLENBQUcsRUFBRTs7Ozs7Ozs7OytDQVMwQyxNQUFNLFNBQVMsd0RBQXdELE9BQU8sU0FBUyxNQUFNLFFBQVEsNEVBQTRFLE9BQU8sU0FBUyxNQUFNLFFBQVEscUNBQXFDLE1BQU0sUUFBUSxxQkFBcUIsTUFBTSxRQUFROztXQUV6VSxNQUFNLFFBQVEsV0FBVyxNQUFNLFFBQVE7Ozs7MkRBSVMsU0FBUzs7MkRBRVQsU0FBUzs7Ozs7a0VBS0YsTUFBTSxRQUFROzs7a0JBSTFFLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxRQUFRLElBQzdDO2NBQ0ksTUFBTSxRQUFRLDJCQUNsQixLQUVKLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLElBQzlDO2VBQ0ssTUFBTSxRQUFRLHVCQUNuQixHQUNMOzs7Ozt5Q0FLb0MsTUFBTSxRQUFRLGFBQWEsTUFBTSxjQUFjOzs7OztxQkFLbkUsTUFBTSxTQUFTOzBDQUNNLE1BQU0sUUFBUTs7OztTQUkvQyxNQUFNLFFBQVE7NEJBQ0ssTUFBTSxRQUFRO0VBQ3hDLFFBQ0MsS0FDRSxRQUFRO2VBQ0UsSUFBSSxNQUFNO1lBQ2IsSUFBSSxHQUFHLEdBQ1gsSUFBSSxNQUNBO29CQUVBLEtBRUosSUFBSSxRQUNBO2dCQUNJLElBQUksTUFBTSxNQUNkLEdBQ0w7TUFFTCxDQUFDLENBQ0EsS0FBSyxLQUFLLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBeUJtQixTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQ0F1QlIsU0FBUzs7Ozs7OztRQU9wQyxNQUFNLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd0JwQixjQUFjLE1BQU0sUUFBUSxJQUFJLFNBQVMsUUFBUSxJQUM3Qzs0QkFDc0IsTUFBTSxRQUFROzhCQUNaLE1BQU0sUUFBUTs7Ozt3QkFLdEMsR0FDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBMEJ5QixNQUFNLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJ0QyxjQUNDLFFBQVEsUUFBUSxJQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsU0FBUyxDQUFDLENBQ2hFLEtBQUssUUFBUTtJQUNaLElBQUksSUFBSSxlQUFlLFNBQ3JCLElBQUk7S0FFRixNQUFNLFNBQ0osSUFBSSxVQUFVLFlBQVksSUFBSSxTQUN6QixJQUFJLE9BQThCLFNBQ25DLHVCQUF1QixVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7S0FDakQsT0FBTzs2QkFDYyxJQUFJLEtBQUssaUJBQWlCLElBQUksS0FBSzs0QkFDcEMsT0FBTzs4QkFDTCxPQUFPO29DQUNELElBQUksS0FBSzttQ0FDVixJQUFJLE1BQU07Ozs7SUFJdkMsUUFBUTtLQUNOLE9BQU87SUFDVDtJQUdGLElBQUksSUFBSSxlQUFlLGtCQUFrQixJQUFJLGVBQWUsZ0JBQzFELElBQUk7S0FDRixNQUFNLFVBQVUsMkJBQTJCLFVBQVUsSUFBSSxLQUFLLFFBQVEsT0FBTyxFQUFFLENBQUM7S0FDaEYsT0FBTzs4QkFDZSxRQUFRLEtBQUs7O29DQUVQLElBQUksS0FBSzttQ0FDVixJQUFJLFNBQVMsUUFBUSxLQUFLOzs7O0lBSXZELFFBQVE7S0FDTixPQUFPO0lBQ1Q7SUFFRixPQUFPO0dBQ1QsQ0FBQyxDQUFDLENBQ0QsT0FBTyxPQUFPLENBQUMsQ0FDZixLQUFLLElBQUksRUFBRTtFQUVaLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxTQUFTLElBQzlDOzRCQUNzQixNQUFNLFFBQVE7OEJBQ1osTUFBTSxRQUFROzs7Ozt3QkFNdEMsR0FDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBMEVxQixNQUFNLFFBQVE7Ozs7Ozs7Ozs7OztRQVk1QixLQUFLO0dBQ1AsWUFBWSxDQUFDO0dBQ2I7RUFDRjtDQUNGO0FBQ0YifQ==
558
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5mdW5jdGlvbiBnZXRDb25maWdFbnVtSWQoY29uZmlnOiBSZW5kZXJpbmdOb2RlW1wiY29uZmlnXCJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcgfHwgIShcImVudW1JZFwiIGluIGNvbmZpZykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY29uZmlnLmVudW1JZCkgPT09IFwiW29iamVjdCBTdHJpbmddXCJcbiAgICA/IFN0cmluZyhjb25maWcuZW51bUlkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSkge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IC8qIFNBRkVUWTogQ29sdW1ucyDroIzrjZTrp4Eg64W465Oc7J2YIOyekOyLneydgCDrqqjrkZAg7Lus65+8IOuFuOuTnOuLpC4gKi8gKFxuICAgICAgY29sdW1uc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdXG4gICAgKVxuXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IChhLm5hbWUgPT09IFwiaWRcIiA/IC0xIDogYi5uYW1lID09PSBcImlkXCIgPyAxIDogMCkpXG4gICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSB0aGlzLnJlbmRlckNvbHVtbihlbnRpdHlJZCwgY29sLCBuYW1lcyk7XG5cbiAgICAgICAgLy8g652867KoIOyDneyEsTogY29tbW9uIO2VhOuTnChjcmVhdGVkX2F0KeuKlCBTRChcImNvbW1vbi57ZmllbGR9XCIpLCBlbnRpdHkg7ZWE65Oc64qUIFNEKFwiZW50aXR5LntFbnRpdHl9LntmaWVsZH1cIilcbiAgICAgICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgbGFiZWwgPSAnXCJJRFwiJztcbiAgICAgICAgfSBlbHNlIGlmIChbXCJjcmVhdGVkX2F0XCJdLmluY2x1ZGVzKGNvbC5uYW1lKSkge1xuICAgICAgICAgIC8vIGNhbWVsQ2FzZeuhnCDrs4DtmZggKGNyZWF0ZWRfYXQgLT4gY3JlYXRlZEF0KVxuICAgICAgICAgIGNvbnN0IGNhbWVsTmFtZSA9IGNvbC5uYW1lLnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBjaGFyKSA9PiBjaGFyLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiY29tbW9uLiR7Y2FtZWxOYW1lfVwiKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbGFiZWxOYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBsYWJlbCA9IGBTRChcImVudGl0eS4ke25hbWVzLmNhcGl0YWx9LiR7bGFiZWxOYW1lfVwiKWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGNvbC5uYW1lLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIHRjOiBgKHJvdykgPT4gJHtyZW5kZXJlZH1gLFxuICAgICAgICAgIGZpdDpcbiAgICAgICAgICAgIGNvbC5uYW1lID09PSBcImlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiIHx8XG4gICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8XG4gICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZXRpbWVcIixcbiAgICAgICAgICBhbGlnbjogY29sLm5hbWUgPT09IFwiaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItaWRcIiA/IFwiY2VudGVyXCIgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIC8vIO2VhO2EsCDsu6zrn7xcbiAgICBjb25zdCBmaWx0ZXJDb2x1bW5zID1cbiAgICAgIC8qIFNBRkVUWTogTGlzdFBhcmFtcyDroIzrjZTrp4Eg64W465Oc7J2YIOyekOyLneydgCDrqqjrkZAg7ZWE7YSwIOy7rOufvCDrhbjrk5zri6QuICovIChcbiAgICAgICAgbGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdXG4gICAgICApXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICAgIGNvbC5uYW1lICE9PSBcImlkXCIgJiZcbiAgICAgICAgICAgIGNvbC5uYW1lICE9PSBcInF1ZXJ5TW9kZVwiICYmXG4gICAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICAgIClcbiAgICAgICAgLy8gb3JkZXJCeeqwgCDqsIDsnqUg65Kk66GcIOyYpOqyjCDsiJzshJwg7KGw7KCVXG4gICAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhLm5hbWUgPT09IFwib3JkZXJCeVwiID8gMSA6IC0xO1xuICAgICAgICB9KTtcblxuICAgIC8vIO2VhO2EsCDsu6zrn7zsnYQg7ZSE66asIO2FnO2UjOumv+ycvOuhnCDshKTsoJVcbiAgICBjb25zdCBwcmVUZW1wbGF0ZXM6IFJlbmRlcmVkVGVtcGxhdGVbXCJwcmVUZW1wbGF0ZXNcIl0gPSBbXTtcblxuICAgIC8vIOy7rOufvOyXkOyEnCDsgqzsmqntlZjripQgZW51beuTpCDsiJjsp5FcbiAgICBjb25zdCBjb2x1bW5FbnVtczogc3RyaW5nW10gPSBbXTtcbiAgICAoY29sdW1uc05vZGUuY2hpbGRyZW4gPz8gW10pLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICBjb2x1bW5FbnVtcy5wdXNoKGVudW1JZCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOuUlO2PtO2KuCDtjIzrnbzrr7jthLBcbiAgICAvLyBjb25zdCBkZWYgPSB0aGlzLmdldERlZmF1bHQoZmlsdGVyQ29sdW1ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKSxcbiAgICAgIGJvZHk6IGBcbmltcG9ydCB7IHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlRmlsZVJvdXRlLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCI7XG5cbmltcG9ydCB7IENhcmQsIENhcmRDb250ZW50LCBDYXJkSGVhZGVyIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQmFkZ2UgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBQYWdpbmF0aW9uLCBUYWJsZSwgVGFibGVCb2R5LCBUYWJsZUNlbGwsIHR5cGUgVGFibGVDb2wsIFRhYmxlSGVhZCwgVGFibGVIZWFkZXIsIFRhYmxlUm93IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgRW51bVNlbGVjdCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEFsZXJ0RGlhbG9nLCBBbGVydERpYWxvZ0FjdGlvbiwgQWxlcnREaWFsb2dDYW5jZWwsIEFsZXJ0RGlhbG9nQ29udGVudCwgQWxlcnREaWFsb2dEZXNjcmlwdGlvbiwgQWxlcnREaWFsb2dGb290ZXIsIEFsZXJ0RGlhbG9nSGVhZGVyLCBBbGVydERpYWxvZ1RpdGxlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBDaGVja2JveCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFNvbmFtdUZpbHRlck1vZGFsLCBTb25hbXVGaWx0ZXJQb3BvdmVyLCBleHRyYWN0RmllbGRNZXRhRnJvbVNjaGVtYSwgdHlwZSBSdWxlIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuXG5pbXBvcnQgeyB1c2VMaXN0UGFyYW1zLCBudW1GLCBkYXRlRiwgZGF0ZXRpbWVGIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvbGliXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U3Vic2V0QSwgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy8ke25hbWVzLmZzfS8ke25hbWVzLmZzfS50eXBlc1wiO1xuaW1wb3J0IHsgJHsoKCkgPT4ge1xuICAgICAgICAvLyDquLDrs7ggZW51bSDsiJjsp5EgKGZpbHRlckNvbHVtbnPsl5Ag7J6I64qUIOqyg+unjClcbiAgICAgICAgY29uc3QgYmFzZUVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlgLCBgJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlMYWJlbGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwic2VhcmNoXCIpKSB7XG4gICAgICAgICAgYmFzZUVudW1zLnB1c2goYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZGAsIGAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7ZWE7YSwIGVudW0g7IiY7KeRIChjb25maWcuZW51bUlkIOyasOyEoCwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUpXG4gICAgICAgIC8vIFNBRkVUWTog66eI7KeA66eJIEJvb2xlYW4g7ZWE7YSw6rCAIG51bGzsnYQg7KCc6rGw7ZW0IGVudW0g7Iud67OE7J6QIOusuOyekOyXtOunjCDrgqjquLTri6QuXG4gICAgICAgIGNvbnN0IGZpbHRlckVudW1JZHMgPSBmaWx0ZXJDb2x1bW5zXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIgJiYgY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChjb2wpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ0VudW1JZCA9IGdldENvbmZpZ0VudW1JZChjb2wuY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWdFbnVtSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0VudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9IGdldENvbmZpZ0VudW1JZChjb2wuY29uZmlnKSA/PyBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSkuaWQ7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAga2V5PXtcXGAke2NvbC5uYW1lfS1cXCR7bGlzdFBhcmFtcy4ke2NvbC5uYW1lfX1cXGB9XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7ZW51bUlkfX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske2VudW1JZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRksg7ZWE65OcIChJZEFzeW5jU2VsZWN0KVxuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIGAgICAgICAgICAgICAgICAgICA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCIke2NvbC5uYW1lfVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2NvbC5sYWJlbCA/PyByZWxQcm9wLndpdGh9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNTAgaC04IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSlcbiAgLmZpbHRlcihCb29sZWFuKVxuICAuam9pbihcIlxcblwiKX1cbiR7XG4gIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpXG4gICAgPyBgICAgICAgICAgICAgICAgICAgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtuYW1lcy5jYXBpdGFsfU9yZGVyQnlMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwib3JkZXJCeVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNvcnRcIil9XG4gICAgICAgICAgICAgICAgICAgIHRleHRQcmVmaXg9e1xcYFxcJHtTRChcImNvbW1vbi5zb3J0XCIpfTogXFxgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmBcbiAgICA6IFwiXCJcbn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e1NEKFwiY29tbW9uLnJlc3VsdHNcIikodG90YWwgPz8gMCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvQ2FyZEhlYWRlcj5cblxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInB4LTYgcGItNiBwdC02IGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgIHsvKiBUYWJsZSAqL31cbiAgICAgICAgICAgICAgPFRhYmxlPlxuICAgICAgICAgICAgICAgIDxUYWJsZUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdyBjbGFzc05hbWU9XCJob3ZlcjpiZy10cmFuc3BhcmVudCBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGNsYXNzTmFtZT1cImgtOSB0ZXh0LXhzIHctWzQwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbFNlbGVjdGVkKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGx9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVIZWFkIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgICAgICAgIHshaXNMb2FkaW5nICYmIHJvd3MgJiYgcm93cy5tYXAoKHJvdykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwgY2xhc3NOYW1lPVwicHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZEl0ZW1zLmhhcyhyb3cuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eygpID0+IGhhbmRsZVRvZ2dsZUl0ZW0ocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKChjb2wsIGlkeCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGtleT17aWR4fSBmaXQ9e2NvbC5maXR9IGFsaWduPXtjb2wuYWxpZ259IGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sLnRjKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgICAgIHsvKiBQYWdpbmF0aW9uICovfVxuICAgICAgICAgICAgICA8UGFnaW5hdGlvblxuICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcInBhZ2VcIil9XG4gICAgICAgICAgICAgICAgdG90YWw9e3RvdGFsID8/IDB9XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlPXtsaXN0UGFyYW1zLm51bSA/PyAxMH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgICAgICAgPC9DYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGVsZXRlIERpYWxvZyAqL31cbiAgICAgIDxBbGVydERpYWxvZyBvcGVuPXtkZWxldGVEaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERlbGV0ZURpYWxvZ09wZW59PlxuICAgICAgICA8QWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgICAgIDxBbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ1RpdGxlPntTRChcImRlbGV0ZS5jb25maXJtLnRpdGxlXCIpfTwvQWxlcnREaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0Rlc2NyaXB0aW9uPntTRChcImRlbGV0ZS5jb25maXJtLmRlc2NyaXB0aW9uXCIpfTwvQWxlcnREaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxBbGVydERpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgICAgIDxBbGVydERpYWxvZ0NhbmNlbD57U0QoXCJjb21tb24uY2FuY2VsXCIpfTwvQWxlcnREaWFsb2dDYW5jZWw+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dBY3Rpb24gb25DbGljaz17aGFuZGxlQ29uZmlybURlbGV0ZX0+XG4gICAgICAgICAgICAgIHtTRChcImNvbW1vbi5kZWxldGVcIil9XG4gICAgICAgICAgICA8L0FsZXJ0RGlhbG9nQWN0aW9uPlxuICAgICAgICAgIDwvQWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgIDwvQWxlcnREaWFsb2dDb250ZW50PlxuICAgICAgPC9BbGVydERpYWxvZz5cblxuICAgICAgey8qIFNvbmFtdSBGaWx0ZXIgTW9kYWwgKi99XG4gICAgICA8U29uYW11RmlsdGVyTW9kYWxcbiAgICAgICAgYmFzZVNjaGVtYT17JHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWF9XG4gICAgICAgIG9wZW49e2ZpbHRlck1vZGFsT3Blbn1cbiAgICAgICAgb25PcGVuQ2hhbmdlPXtzZXRGaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIGluaXRpYWxSdWxlcz17YXBwbGllZFJ1bGVzfVxuICAgICAgICBvbkFwcGx5PXsoZmlsdGVycywgcnVsZXMpID0+IHtcbiAgICAgICAgICBzZXRMaXN0UGFyYW1zKHsgLi4ubGlzdFBhcmFtcywgc29uYW11RmlsdGVyOiBmaWx0ZXJzLCBwYWdlOiAxIH0pO1xuICAgICAgICAgIHNldEFwcGxpZWRSdWxlcyhydWxlcyk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIHByZVRlbXBsYXRlcyxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7b0JBSTJEO2FBT3hDO2NBRW1CO0FBRXRDLFNBQVMsZ0JBQWdCLFFBQXFEO0NBQzVFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxTQUMzQjtDQUVGLE9BQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxPQUFPLE1BQU0sTUFBTSxvQkFDckQsT0FBTyxPQUFPLE1BQU0sSUFDcEI7QUFDTjtBQUVBLElBQWEsc0JBQWIsY0FBeUMsU0FBUztDQUNoRCxjQUFjO0VBQ1osTUFBTSxXQUFXO0NBQ25CO0NBRUEsaUJBQWlCLE9BQTBCO0VBQ3pDLE9BQU87R0FDTCxRQUFRO0dBQ1IsTUFBTSxHQUFHLE1BQU0sU0FBUztFQUMxQjtDQUNGO0NBRUEsc0JBQWdEO0VBQzlDLE9BQU8sQ0FBQyxxQkFBcUIsWUFBWTtDQUMzQztDQUVBLE9BQU8sTUFBYyxLQUFhLGFBQXNCLE1BQU0sWUFBb0IsSUFBSTtFQUNwRixPQUFPLG9CQUFvQixJQUFJLEdB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OztrQ0F5Qm1CLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21DQXVCUixTQUFTOzs7Ozs7O1FBT3BDLE1BQU0sUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF3QnBCLGNBQWMsTUFBTSxRQUFRLElBQUksU0FBUyxRQUFRLElBQzdDOzRCQUNzQixNQUFNLFFBQVE7OEJBQ1osTUFBTSxRQUFROzs7O3dCQUt0QyxHQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkEwQnlCLE1BQU0sUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QnRDLGNBQ0MsUUFBUSxRQUFRLElBQUksU0FBUyxZQUFZLElBQUksU0FBUyxTQUFTLENBQUMsQ0FDaEUsS0FBSyxRQUFRO0lBQ1osSUFBSSxJQUFJLGVBQWUsU0FDckIsSUFBSTtLQUVGLE1BQU0sU0FBUyxnQkFBZ0IsSUFBSSxNQUFNLEtBQUssdUJBQXVCLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztLQUN6RixPQUFPOzZCQUNjLElBQUksS0FBSyxpQkFBaUIsSUFBSSxLQUFLOzRCQUNwQyxPQUFPOzhCQUNMLE9BQU87b0NBQ0QsSUFBSSxLQUFLO21DQUNWLElBQUksTUFBTTs7OztJQUl2QyxRQUFRO0tBQ04sT0FBTztJQUNUO0lBR0YsSUFBSSxJQUFJLGVBQWUsa0JBQWtCLElBQUksZUFBZSxnQkFDMUQsSUFBSTtLQUNGLE1BQU0sVUFBVSwyQkFBMkIsVUFBVSxJQUFJLEtBQUssUUFBUSxPQUFPLEVBQUUsQ0FBQztLQUNoRixPQUFPOzhCQUNlLFFBQVEsS0FBSzs7b0NBRVAsSUFBSSxLQUFLO21DQUNWLElBQUksU0FBUyxRQUFRLEtBQUs7Ozs7SUFJdkQsUUFBUTtLQUNOLE9BQU87SUFDVDtJQUVGLE9BQU87R0FDVCxDQUFDLENBQUMsQ0FDRCxPQUFPLE9BQU8sQ0FBQyxDQUNmLEtBQUssSUFBSSxFQUFFO0VBRVosY0FBYyxNQUFNLFFBQVEsSUFBSSxTQUFTLFNBQVMsSUFDOUM7NEJBQ3NCLE1BQU0sUUFBUTs4QkFDWixNQUFNLFFBQVE7Ozs7O3dCQU10QyxHQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkEwRXFCLE1BQU0sUUFBUTs7Ozs7Ozs7Ozs7O1FBWTVCLEtBQUs7R0FDUCxZQUFZLENBQUM7R0FDYjtFQUNGO0NBQ0Y7QUFDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/template/template-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,cAAM,oBAAoB;IACxB,OAAO,CAAC,SAAS,CAAkD;IACnE,YAAY,EAAE,OAAO,CAAS;IAM9B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B/B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBrD,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMlC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAUxC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ;IAQ/C;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,oBAAoB;CAG9C;AAED,eAAO,MAAM,eAAe,sBAA6B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/template/template-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,cAAM,oBAAoB;IACxB,OAAO,CAAC,SAAS,CAAkD;IACnE,YAAY,EAAE,OAAO,CAAS;IAM9B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B/B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBrD,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMlC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAUxC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ;IAQ/C;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,oBAAoB;CAG9C;AAED,eAAO,MAAM,eAAe,sBAA6B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,CAAC"}