sonamu 0.11.16 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +30 -24
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.d.ts +1 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +42 -6
  126. package/dist/logger/category.js +2 -3
  127. package/dist/logger/configure.js +5 -5
  128. package/dist/migration/code-generation.js +23 -16
  129. package/dist/migration/index-where-predicate.js +2 -3
  130. package/dist/migration/migration-set.js +2 -3
  131. package/dist/migration/migrator.js +2 -3
  132. package/dist/migration/postgresql-schema-reader.js +6 -9
  133. package/dist/migration/slack-confirm.js +2 -3
  134. package/dist/naite/naite-reporter.js +2 -3
  135. package/dist/naite/naite.js +10 -8
  136. package/dist/runtime-type.js +2 -3
  137. package/dist/ssr/hmr-opt-out.js +1 -2
  138. package/dist/ssr/index.js +7 -4
  139. package/dist/ssr/registry.js +1 -2
  140. package/dist/ssr/renderer.js +2 -3
  141. package/dist/storage/base-file.js +1 -2
  142. package/dist/storage/buffered-file.js +2 -3
  143. package/dist/storage/drivers.js +1 -2
  144. package/dist/storage/index.js +2 -3
  145. package/dist/storage/s3-driver.js +1 -2
  146. package/dist/storage/storage-manager.js +2 -3
  147. package/dist/storage/uploaded-file.js +2 -3
  148. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  149. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  150. package/dist/stream/__tests__/ws-test-helpers.js +259 -0
  151. package/dist/stream/index.d.ts +1 -0
  152. package/dist/stream/index.d.ts.map +1 -1
  153. package/dist/stream/index.js +15 -4
  154. package/dist/stream/sse.js +1 -2
  155. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  156. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  157. package/dist/stream/ws-audience-resolver.js +17 -15
  158. package/dist/stream/ws-audience.js +1 -2
  159. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  160. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  161. package/dist/stream/ws-cluster-bus.js +2 -3
  162. package/dist/stream/ws-core.d.ts +10 -0
  163. package/dist/stream/ws-core.d.ts.map +1 -1
  164. package/dist/stream/ws-delivery.d.ts +30 -4
  165. package/dist/stream/ws-delivery.d.ts.map +1 -1
  166. package/dist/stream/ws-delivery.js +200 -54
  167. package/dist/stream/ws-frame.d.ts +15 -0
  168. package/dist/stream/ws-frame.d.ts.map +1 -0
  169. package/dist/stream/ws-frame.js +28 -0
  170. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  171. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  172. package/dist/stream/ws-local-connection-store.js +3 -4
  173. package/dist/stream/ws-presence-index.d.ts +36 -0
  174. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  175. package/dist/stream/ws-presence-index.js +176 -0
  176. package/dist/stream/ws-presence-store.d.ts +39 -39
  177. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  178. package/dist/stream/ws-presence-store.js +23 -154
  179. package/dist/stream/ws-registry.d.ts +45 -17
  180. package/dist/stream/ws-registry.d.ts.map +1 -1
  181. package/dist/stream/ws-registry.js +170 -62
  182. package/dist/stream/ws-session-id.d.ts +14 -0
  183. package/dist/stream/ws-session-id.d.ts.map +1 -0
  184. package/dist/stream/ws-session-id.js +36 -0
  185. package/dist/stream/ws-telemetry-memory.js +3 -4
  186. package/dist/stream/ws-telemetry-trace.js +1 -2
  187. package/dist/stream/ws-telemetry.js +2 -3
  188. package/dist/stream/ws.d.ts +20 -10
  189. package/dist/stream/ws.d.ts.map +1 -1
  190. package/dist/stream/ws.js +60 -38
  191. package/dist/syncer/api-parser.js +2 -3
  192. package/dist/syncer/checksum.js +4 -4
  193. package/dist/syncer/code-generator.js +4 -4
  194. package/dist/syncer/entity-operations.js +2 -3
  195. package/dist/syncer/event-batcher.js +1 -2
  196. package/dist/syncer/file-copy.js +2 -3
  197. package/dist/syncer/file-patterns.js +2 -3
  198. package/dist/syncer/file-tracking.js +2 -3
  199. package/dist/syncer/filesystem-dependencies.js +1 -2
  200. package/dist/syncer/index.js +8 -2
  201. package/dist/syncer/module-loader.js +8 -6
  202. package/dist/syncer/syncer-actions.js +8 -7
  203. package/dist/syncer/syncer.js +13 -8
  204. package/dist/syncer/watcher.js +2 -3
  205. package/dist/tasks/decorator.js +1 -2
  206. package/dist/tasks/step-wrapper.js +2 -3
  207. package/dist/tasks/workflow-manager.js +2 -3
  208. package/dist/template/entity-converter.js +17 -16
  209. package/dist/template/helpers.js +2 -3
  210. package/dist/template/implementations/entity.template.js +2 -3
  211. package/dist/template/implementations/entry-server.template.js +2 -3
  212. package/dist/template/implementations/generated.template.js +2 -3
  213. package/dist/template/implementations/generated_http.template.js +6 -6
  214. package/dist/template/implementations/generated_sso.template.js +2 -3
  215. package/dist/template/implementations/http_validators.template.js +2 -3
  216. package/dist/template/implementations/init_types.template.js +2 -3
  217. package/dist/template/implementations/model.template.js +4 -4
  218. package/dist/template/implementations/model_test.template.js +2 -3
  219. package/dist/template/implementations/queries.template.js +2 -3
  220. package/dist/template/implementations/sd.template.js +2 -3
  221. package/dist/template/implementations/services.template.js +2 -3
  222. package/dist/template/implementations/view_form.template.js +12 -9
  223. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  224. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  225. package/dist/template/implementations/view_list.template.js +19 -17
  226. package/dist/template/implementations/view_search_input.template.js +2 -3
  227. package/dist/template/index.js +9 -3
  228. package/dist/template/template-manager.js +2 -3
  229. package/dist/template/template-types.js +1 -2
  230. package/dist/template/template.js +2 -3
  231. package/dist/template/zod-converter.js +54 -47
  232. package/dist/testing/_relation-graph.js +2 -3
  233. package/dist/testing/bootstrap.js +2 -3
  234. package/dist/testing/data-explorer.js +2 -3
  235. package/dist/testing/dev-test-routes.js +2 -3
  236. package/dist/testing/dev-vitest-manager.js +15 -12
  237. package/dist/testing/faker-mappings.js +1 -2
  238. package/dist/testing/filesystem.js +2 -3
  239. package/dist/testing/fixture-generator.js +2 -3
  240. package/dist/testing/fixture-loader.js +1 -2
  241. package/dist/testing/fixture-manager.js +12 -9
  242. package/dist/testing/global-setup.js +5 -5
  243. package/dist/testing/index.js +6 -3
  244. package/dist/testing/naite-vitest-reporter.js +1 -2
  245. package/dist/testing/parallel-db-manager.js +2 -3
  246. package/dist/testing/vitest-helpers.js +2 -3
  247. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  248. package/dist/tooling/cdd-service.js +1 -2
  249. package/dist/tooling/cli-tooling.js +1 -2
  250. package/dist/tooling/fixture-service.js +1 -2
  251. package/dist/tooling/index.js +1 -2
  252. package/dist/tooling/test-run-client.js +2 -3
  253. package/dist/tsdown.api.config.js +1 -2
  254. package/dist/types/types.js +2 -3
  255. package/dist/ui/ai-api.d.ts.map +1 -1
  256. package/dist/ui/ai-api.js +4 -5
  257. package/dist/ui/ai-client.d.ts +2 -2
  258. package/dist/ui/ai-client.d.ts.map +1 -1
  259. package/dist/ui/ai-client.js +9 -8
  260. package/dist/ui/api.d.ts.map +1 -1
  261. package/dist/ui/api.js +11 -8
  262. package/dist/ui/async-route.js +1 -2
  263. package/dist/ui/cdd-service.js +22 -21
  264. package/dist/ui/migrations-api.js +6 -5
  265. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  266. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  267. package/dist/ui-web/index.html +2 -2
  268. package/dist/utils/async-utils.js +1 -2
  269. package/dist/utils/class-name.js +1 -2
  270. package/dist/utils/console-util.js +1 -2
  271. package/dist/utils/controller.js +2 -3
  272. package/dist/utils/esm-utils.js +1 -2
  273. package/dist/utils/fs-utils.js +2 -3
  274. package/dist/utils/lodash-able.js +1 -2
  275. package/dist/utils/model.js +1 -2
  276. package/dist/utils/object-utils.js +2 -3
  277. package/dist/utils/path-utils.js +2 -3
  278. package/dist/utils/process-utils.js +2 -3
  279. package/dist/utils/runtime-value.js +1 -2
  280. package/dist/utils/sql-parser.js +2 -3
  281. package/dist/utils/type-utils.js +8 -8
  282. package/dist/utils/utils.js +2 -3
  283. package/dist/utils/zod-error.js +2 -3
  284. package/dist/vector/chunking.js +1 -2
  285. package/dist/vector/config.js +1 -2
  286. package/dist/vector/embedding.js +4 -4
  287. package/package.json +63 -63
  288. package/src/ai/agents/agent.ts +1 -1
  289. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  290. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  291. package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
  292. package/src/api/config.ts +1 -1
  293. package/src/api/context.ts +2 -8
  294. package/src/api/sonamu.ts +46 -28
  295. package/src/auth/audit-log/plugin.ts +2 -0
  296. package/src/compress/types.ts +1 -1
  297. package/src/exceptions/error-handler.ts +3 -2
  298. package/src/index.ts +1 -0
  299. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  300. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  301. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  302. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  303. package/src/stream/__tests__/ws.test.ts +342 -145
  304. package/src/stream/index.ts +1 -0
  305. package/src/stream/ws-audience-resolver.ts +21 -19
  306. package/src/stream/ws-cluster-bus.ts +12 -4
  307. package/src/stream/ws-core.ts +14 -0
  308. package/src/stream/ws-delivery.ts +321 -97
  309. package/src/stream/ws-frame.ts +39 -0
  310. package/src/stream/ws-local-connection-store.ts +10 -9
  311. package/src/stream/ws-presence-index.ts +273 -0
  312. package/src/stream/ws-presence-store.ts +64 -284
  313. package/src/stream/ws-registry.ts +272 -85
  314. package/src/stream/ws-session-id.ts +39 -0
  315. package/src/stream/ws.ts +91 -50
  316. package/src/template/implementations/model.template.ts +3 -3
  317. package/src/template/implementations/view_list.template.ts +12 -13
  318. package/src/ui/ai-api.ts +4 -2
  319. package/src/ui/ai-client.ts +2 -2
  320. package/src/ui/api.ts +58 -62
  321. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  322. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -2,7 +2,7 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_runtime_value, isFunctionValue } from "../utils/runtime-value.js";
3
3
  import { init_types, isBelongsToOneRelationProp, isOneToOneRelationProp, isRelationProp } from "../types/types.js";
4
4
  import { z } from "zod";
5
- //#region src/testing/data-explorer.ts
5
+ // src/testing/data-explorer.ts
6
6
  var dataExplorerValueSchema, dataExplorerRecordSchema, dataExplorerRecordsSchema, dataExplorerDirectionSchema, dataSourceConfigSchema, DataExplorer;
7
7
  var init_data_explorer = __esmMin((() => {
8
8
  init_types();
@@ -243,8 +243,7 @@ var init_data_explorer = __esmMin((() => {
243
243
  }
244
244
  };
245
245
  }));
246
- //#endregion
247
246
  init_data_explorer();
248
247
  export { DataExplorer, dataExplorerRecordSchema, dataExplorerRecordsSchema, dataExplorerValueSchema, dataSourceConfigSchema, init_data_explorer };
249
248
 
250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kYXRhLWV4cGxvcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IFwic2FtcGxlXCIgfCBcImlkc1wiIHwgXCJxdWVyeVwiIHwgXCJmaWxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIjtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBEYXRlXG4gIHwgVWludDhBcnJheVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBEYXRhRXhwbG9yZXJWYWx1ZVtdXG4gIHwgRGF0YUV4cGxvcmVyUmVjb3JkO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJSZWNvcmQgPSB7XG4gIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBEYXRhRXhwbG9yZXJWYWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYTogei5ab2RUeXBlPERhdGFFeHBsb3JlclZhbHVlPiA9IHoubGF6eSgoKSA9PlxuICB6LnVuaW9uKFtcbiAgICB6LnN0cmluZygpLFxuICAgIHoubnVtYmVyKCksXG4gICAgei5ib29sZWFuKCksXG4gICAgei5iaWdpbnQoKSxcbiAgICB6LmRhdGUoKSxcbiAgICB6Lmluc3RhbmNlb2YoVWludDhBcnJheSksXG4gICAgei5udWxsKCksXG4gICAgei51bmRlZmluZWQoKSxcbiAgICB6LmFycmF5KGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKSxcbiAgICB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSksXG4gIF0pLFxuKTtcbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSk7XG5leHBvcnQgY29uc3QgZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYSA9IHouYXJyYXkoZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hKTtcbmNvbnN0IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYSA9IHouZW51bShbXCJhc2NcIiwgXCJkZXNjXCJdKTtcbmV4cG9ydCBjb25zdCBkYXRhU291cmNlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJhdGVneTogei5lbnVtKFtcInNhbXBsZVwiLCBcImlkc1wiLCBcInF1ZXJ5XCIsIFwiZmlsZVwiLCBcInJlY2VudFwiLCBcInJhbmRvbVwiXSkub3B0aW9uYWwoKSxcbiAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgd2hlcmU6IHoucmVjb3JkKHouc3RyaW5nKCksIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKS5vcHRpb25hbCgpLFxuICBvcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGlkczogei5hcnJheSh6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkpLm9wdGlvbmFsKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZUNhY2hlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBjYWNoZVR0bDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBXSEVSRSDsobDqsbQg7YOA7J6FICjqsJ3ssrQg65iQ64qUIEtuZXggUXVlcnlCdWlsZGVyIO2VqOyImCkgKi9cbmV4cG9ydCB0eXBlIFdoZXJlQ29uZGl0aW9uID0gb2JqZWN0IHwgKChxdWVyeUJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSA9PiB2b2lkKTtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyT3B0aW9ucyA9IHtcbiAgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IG51bWJlcjtcbiAgd2hlcmU/OiBXaGVyZUNvbmRpdGlvbjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgaWRzPzogKG51bWJlciB8IHN0cmluZylbXTtcbiAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiDsupDsi7Eg7IKs7JqpIOyXrOu2gCAo6riw67O46rCSOiBmYWxzZSkgKi9cbiAgdXNlQ2FjaGU/OiBib29sZWFuO1xuICAvKiog7LqQ7IucIFRUTCAo7LSIIOuLqOychCwg6riw67O46rCSOiAzMDApICovXG4gIGNhY2hlVHRsPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zID0gRGF0YUV4cGxvcmVyT3B0aW9ucyAmIHtcbiAgLyoqIOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoIOyXrOu2gCAo6riw67O46rCSOiB0cnVlKSAqL1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgLyoqIOyerOq3gCDtg5Dsg4kg7LWc64yAIOq5iuydtCAo6riw67O46rCSOiAyKSAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0ID0ge1xuICAvKiog66mU7J24IGVudGl0eSDrjbDsnbTthLAgKi9cbiAgbWFpbjoge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcmVjb3JkczogRGF0YUV4cGxvcmVyUmVjb3JkW107XG4gIH07XG4gIC8qKiDqtIDroKggZW50aXR5IOuNsOydtO2EsCAoZW50aXR5SWQgLT4gcmVjb3JkcykgKi9cbiAgcmVsYXRlZDogTWFwPHN0cmluZywgRGF0YUV4cGxvcmVyUmVjb3JkW10+O1xufTtcblxuLy8g6riw7KG0IERCIOuNsOydtO2EsOulvCDtg5Dsg4ntlZjsl6wgZml4dHVyZSDsg53shLEg7IucIOywuOyhsO2VoCDsiJgg7J6I64qUIOyLnOyKpO2FnFxuZXhwb3J0IGNsYXNzIERhdGFFeHBsb3JlciB7XG4gIHByaXZhdGUgY2FjaGU/OiBDYWNoZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYjogS25leCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIGNhY2hlTWFuYWdlcj86IENhY2hlTWFuYWdlcixcbiAgKSB7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmUoZW50aXR5TmFtZTogc3RyaW5nLCBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIOy6kOyLsSDsp4Dsm5BcbiAgICBpZiAob3B0aW9ucy51c2VDYWNoZSAmJiB0aGlzLmNhY2hlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldE9yU2V0KHtcbiAgICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgICAgdHRsOiBvcHRpb25zLmNhY2hlVHRsIHx8IDMwMCxcbiAgICAgICAgZmFjdG9yeTogKCkgPT4gdGhpcy5leHBsb3JlSW50ZXJuYWwoZW50aXR5LCBvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHBsb3JlSW50ZXJuYWwoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kYihlbnRpdHkudGFibGUpO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLnN0cmF0ZWd5KSB7XG4gICAgICBjYXNlIFwic2FtcGxlXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNhbXBsZURhdGEocXVlcnksIG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwicmVjZW50XCI6IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEF0Q29sID0gdGhpcy5maW5kVGltZXN0YW1wQ29sdW1uKGVudGl0eSwgXCJjcmVhdGVkX2F0XCIpO1xuICAgICAgICBpZiAoY3JlYXRlZEF0Q29sKSB7XG4gICAgICAgICAgcXVlcnkub3JkZXJCeShjcmVhdGVkQXRDb2wsIFwiZGVzY1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0IHx8IDEwKSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyYW5kb21cIjpcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmFuZG9tU2FtcGxlKHF1ZXJ5LCBvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcImlkc1wiOlxuICAgICAgICBpZiAob3B0aW9ucy5pZHMgJiYgb3B0aW9ucy5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlSW4oXCJpZFwiLCBvcHRpb25zLmlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UoYXdhaXQgcXVlcnkpO1xuXG4gICAgICBjYXNlIFwicXVlcnlcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgICAgICBjb25zdCB3aGVyZUNhbGxiYWNrID0gelxuICAgICAgICAgICAgLmN1c3RvbTwocXVlcnlCdWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikgPT4gdm9pZD4oaXNGdW5jdGlvblZhbHVlKVxuICAgICAgICAgICAgLnNhZmVQYXJzZShvcHRpb25zLndoZXJlKTtcbiAgICAgICAgICBpZiAod2hlcmVDYWxsYmFjay5zdWNjZXNzKSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZSh3aGVyZUNhbGxiYWNrLmRhdGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZShkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEucGFyc2Uob3B0aW9ucy53aGVyZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICAgICAgY29uc3QgW2NvbCwgZGlyID0gXCJhc2NcIl0gPSBvcHRpb25zLm9yZGVyQnkuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYS5wYXJzZShkaXIpO1xuICAgICAgICAgIC8vIGlkIOy7rOufvOydgCDsiKvsnpDroZwg7LqQ7Iqk7YyF7ZWY7JesIOygleugrO2VqeuLiOuLpCAo66y47J6Q7Je0IOygleugrCDrsKnsp4ApXG4gICAgICAgICAgaWYgKGNvbCA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBxdWVyeS5vcmRlckJ5UmF3KGBDQVNUKD8/IEFTIElOVEVHRVIpICR7ZGlyZWN0aW9ufWAsIFtjb2xdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkub3JkZXJCeShjb2wsIGRpcmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJSZWNvcmRzU2NoZW1hLnBhcnNlKGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApKTtcblxuICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbGVQYXRoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmlsZVBhdGggaXMgcmVxdWlyZWQgZm9yIGZpbGUgc3RyYXRlZ3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21GaWxlKG9wdGlvbnMuZmlsZVBhdGgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RyYXRlZ3k6ICR7b3B0aW9ucy5zdHJhdGVneX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDqt6Drk7Eg7IOY7ZSM66eBIChQb3N0Z3JlU1FMIFJPV19OVU1CRVIg7IKs7JqpKVxuICBwcml2YXRlIGFzeW5jIHNhbXBsZURhdGEocXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IFt7IGNvdW50IH1dID0gYXdhaXQgcXVlcnkuY2xvbmUoKS5jb3VudChcIiogYXMgY291bnRcIik7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoY291bnQpO1xuXG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChsaW1pdCkpO1xuICAgIH1cblxuICAgIC8vIOq3oOuTsSDqsITqsqkg6rOE7IKwXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBNYXRoLmZsb29yKHRvdGFsIC8gbGltaXQpO1xuXG4gICAgLy8g7YWM7J2067iU66qFIOy2lOy2nFxuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHF1ZXJ5LnRvU3RyaW5nKCkubWF0Y2goL2Zyb21cXHMrXCI/KFxcdyspXCI/L2kpPy5bMV07XG4gICAgaWYgKCF0YWJsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBleHRyYWN0IHRhYmxlIG5hbWUgZnJvbSBxdWVyeVwiKTtcbiAgICB9XG5cbiAgICAvLyBST1dfTlVNQkVSKCnroZwg7ZWcIOuyiOyXkCDqt6Drk7Eg7IOY7ZSM66eBICjri6jsnbwg7L+866asKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGIucmF3KFxuICAgICAgYFxuICAgICAgV0lUSCBudW1iZXJlZF9yb3dzIEFTIChcbiAgICAgICAgU0VMRUNUICosIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSBpZCkgYXMgcm5cbiAgICAgICAgRlJPTSA/P1xuICAgICAgKVxuICAgICAgU0VMRUNUICogRlJPTSBudW1iZXJlZF9yb3dzXG4gICAgICBXSEVSRSBNT0Qocm4gLSAxLCA/KSA9IDBcbiAgICAgIExJTUlUID9cbiAgICBgLFxuICAgICAgW3RhYmxlTmFtZSwgaW50ZXJ2YWwsIGxpbWl0XSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UocmVzdWx0LnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYW5kb21TYW1wbGUoXG4gICAgcXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5vcmRlckJ5UmF3KFwiUkFORE9NKClcIikubGltaXQobGltaXQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFRpbWVzdGFtcENvbHVtbihlbnRpdHk6IEVudGl0eSwgY29sdW1uTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBwcm9wPy5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UoY29udGVudCkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSlNPTiBmaWxlIG11c3QgY29udGFpbiBhbiBhcnJheSBvZiByZWNvcmRzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpTT04gZmlsZSBtdXN0IGNvbnRhaW4gYSB2YWxpZCBhcnJheSBvZiByZWNvcmRzXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoKSA9PiBoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gbGluZXMuc2xpY2UoMSkubWFwKChsaW5lKTogRGF0YUV4cGxvcmVyUmVjb3JkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdChcIixcIik7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgaGVhZGVycy5tYXAoKGhlYWRlciwgaW5kZXgpID0+IFtoZWFkZXIsIHZhbHVlc1tpbmRleF0/LnRyaW0oKV0gYXMgY29uc3QpLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmaWxlIGZvcm1hdDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcmVsYXRpb25Qcm9wOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGF0YUV4cGxvcmVyT3B0aW9ucz4sXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSByZWxhdGlvblByb3ApO1xuXG4gICAgaWYgKCFwcm9wIHx8ICFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiBwcm9wZXJ0eSBub3QgZm91bmQ6ICR7ZW50aXR5TmFtZX0uJHtyZWxhdGlvblByb3B9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IHByb3AuY29uZT8uZGF0YVNvdXJjZTtcbiAgICBjb25zdCBzdHJhdGVneSA9IGRhdGFTb3VyY2U/LnN0cmF0ZWd5IHx8IG9wdGlvbnM/LnN0cmF0ZWd5IHx8IFwic2FtcGxlXCI7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YVNvdXJjZUNvbmZpZ1NjaGVtYS5wYXJzZShkYXRhU291cmNlPy5jb25maWcgPz8ge30pO1xuICAgIGNvbnN0IGV4cGxvcmVPcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zID0ge1xuICAgICAgc3RyYXRlZ3ksXG4gICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gY29uZmlnLmxpbWl0ID8/IDEwLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZShwcm9wLndpdGgsIGV4cGxvcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl6zrn6wgcmVsYXRpb27snYQg67OR66Cs66GcIOyhsO2ajO2VqeuLiOuLpCAoTisxIOusuOygnCDtlbTqsrApXG4gICAqL1xuICBhc3luYyBleHBsb3JlUmVsYXRpb25zKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3BzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBEYXRhRXhwbG9yZXJSZWNvcmRbXT4+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByZWxhdGlvblByb3BzLm1hcChhc3luYyAocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5leHBsb3JlUmVsYXRpb24oZW50aXR5TmFtZSwgcHJvcCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbcHJvcCwgZGF0YV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IERhdGFFeHBsb3Jlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYERhdGFFeHBsb3Jlcjoke2VudGl0eU5hbWV9YCxcbiAgICAgIG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBvcHRpb25zLmxpbWl0Py50b1N0cmluZygpIHx8IFwiZGVmYXVsdFwiLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy53aGVyZSkge1xuICAgICAgcGFydHMucHVzaChKU09OLnN0cmluZ2lmeShvcHRpb25zLndoZXJlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHBhcnRzLnB1c2gob3B0aW9ucy5vcmRlckJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMuaWRzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIjpcIik7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JmAIOq0gOugqOuQnCDrjbDsnbTthLDrpbwg7J6s6reA7KCB7Jy866GcIO2DkOyDie2VqeuLiOuLpC5cbiAgICogQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKSByZWxhdGlvbuydhCDrlLDrnbzqsIDrqbAg7LC47KGwIOuNsOydtO2EsOulvCDsiJjsp5Htlanri4jri6QuXG4gICAqL1xuICBhc3luYyBleHBsb3JlV2l0aFJlbGF0aW9ucyhcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0PiB7XG4gICAgY29uc3QgaW5jbHVkZVJlbGF0aW9ucyA9IG9wdGlvbnMuaW5jbHVkZVJlbGF0aW9ucyA/PyB0cnVlO1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucy5tYXhEZXB0aCA/PyAyO1xuXG4gICAgLy8g66mU7J24IGVudGl0eSDsobDtmoxcbiAgICBjb25zdCBtYWluUmVjb3JkcyA9IGF3YWl0IHRoaXMuZXhwbG9yZShlbnRpdHlOYW1lLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQgPSB7XG4gICAgICBtYWluOiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHlOYW1lLFxuICAgICAgICByZWNvcmRzOiBtYWluUmVjb3JkcyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkOiBuZXcgTWFwKCksXG4gICAgfTtcblxuICAgIC8vIOq0gOugqCDrjbDsnbTthLAg7IiY7KeR7ZWY7KeAIOyViuycvOuptCDrsJTroZwg66as7YS0XG4gICAgaWYgKCFpbmNsdWRlUmVsYXRpb25zIHx8IG1heERlcHRoIDw9IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g7J2066+4IOyhsO2ajO2VnCBlbnRpdHkg7LaU7KCBICjspJHrs7Ug67Cp7KeAKVxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oW2VudGl0eU5hbWVdKTtcblxuICAgIC8vIOyerOq3gOyggeycvOuhnCDqtIDroKgg642w7J207YSwIOyImOynkVxuICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKGVudGl0eU5hbWUsIG1haW5SZWNvcmRzLCByZXN1bHQucmVsYXRlZCwgdmlzaXRlZCwgbWF4RGVwdGgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDqtIDroKgg642w7J207YSw66W8IOyerOq3gOyggeycvOuhnCDsiJjsp5Htlanri4jri6QgKHByaXZhdGUgaGVscGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IERhdGFFeHBsb3JlclJlY29yZFtdLFxuICAgIHJlbGF0ZWRNYXA6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclJlY29yZFtdPixcbiAgICB2aXNpdGVkOiBTZXQ8c3RyaW5nPixcbiAgICByZW1haW5pbmdEZXB0aDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZElkID0gei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pLnNhZmVQYXJzZShyZWNvcmQuaWQpO1xuICAgICAgcmV0dXJuIHBhcnNlZElkLnN1Y2Nlc3MgPyBbcGFyc2VkSWQuZGF0YV0gOiBbXTtcbiAgICB9KTtcblxuICAgIC8vIDEuIEZvcndhcmQgcmVmZXJlbmNlczog7J20IGVudGl0eeqwgCDssLjsobDtlZjripQg64uk66W4IGVudGl0eVxuICAgIGNvbnN0IGZvcndhcmRSZWxhdGlvblByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBmb3J3YXJkUmVsYXRpb25Qcm9wcykge1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVudGl0eU5hbWUgPSBwcm9wLndpdGg7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR564qUIOyKpO2CtSAo7Iic7ZmYIOywuOyhsCDrsKnsp4ApXG4gICAgICBpZiAodmlzaXRlZC5oYXModGFyZ2V0RW50aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOywuOyhsO2VmOuKlCBJROuTpCDsiJjsp5FcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICBjb25zdCByZWZlcmVuY2VkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkuc2FmZVBhcnNlKHJlY29yZFtmb3JlaWduS2V5TmFtZV0pO1xuICAgICAgICByZXR1cm4gcGFyc2VkSWQuc3VjY2VzcyA/IFtwYXJzZWRJZC5kYXRhXSA6IFtdO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7KSR67O1IOygnOqxsFxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQocmVmZXJlbmNlZElkcyldO1xuXG4gICAgICAvLyDssLjsobAg642w7J207YSwIOyhsO2ajFxuICAgICAgY29uc3QgcmVmZXJlbmNlZFJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUodGFyZ2V0RW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneTogXCJpZHNcIixcbiAgICAgICAgaWRzOiB1bmlxdWVJZHMsXG4gICAgICB9KTtcblxuICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgcmVsYXRlZE1hcC5zZXQodGFyZ2V0RW50aXR5TmFtZSwgcmVmZXJlbmNlZFJlY29yZHMpO1xuICAgICAgdmlzaXRlZC5hZGQodGFyZ2V0RW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIOyerOq3gDog7LC47KGw65CcIOuNsOydtO2EsOydmCDqtIDroKgg642w7J207YSw64+EIOyImOynkVxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRSZWNvcmRzLFxuICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICByZW1haW5pbmdEZXB0aCAtIDEsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIEJhY2t3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICAvLyDrqqjrk6AgZW50aXR566W8IOyInO2ajO2VmOupsCDtmITsnqwgZW50aXR566W8IOywuOyhsO2VmOuKlCByZWxhdGlvbiDssL7quLBcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgZm9yIChjb25zdCBvdGhlckVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgY29uc3Qgb3RoZXJFbnRpdHlOYW1lID0gb3RoZXJFbnRpdHkuaWQ7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlojqsbDrgpgg7J6Q6riwIOyekOyLoOydtOuptCDsiqTtgrVcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhvdGhlckVudGl0eU5hbWUpIHx8IG90aGVyRW50aXR5TmFtZSA9PT0gZW50aXR5TmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24gcHJvcCDssL7quLBcbiAgICAgIGNvbnN0IGJhY2t3YXJkUmVsYXRpb25zID0gb3RoZXJFbnRpdHkucHJvcHMuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgIHByb3Aud2l0aCA9PT0gZW50aXR5TmFtZSAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmFja3dhcmRSZWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gb3RoZXJFbnRpdHnqsIAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgRksg7Lus65+8XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8g7ZiE7J6sIOugiOy9lOuTnOuTpOydhCDssLjsobDtlZjripQgb3RoZXJFbnRpdHkg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIob3RoZXJFbnRpdHkudGFibGUpLndoZXJlSW4oZm9yZWlnbktleU5hbWUsIHJlY29yZElkcyk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkUmVjb3JkcyA9IGF3YWl0IHF1ZXJ5O1xuXG4gICAgICAgIGlmIChiYWNrd2FyZFJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsrDqs7zsl5Ag7LaU6rCAXG4gICAgICAgIHJlbGF0ZWRNYXAuc2V0KG90aGVyRW50aXR5TmFtZSwgYmFja3dhcmRSZWNvcmRzKTtcbiAgICAgICAgdmlzaXRlZC5hZGQob3RoZXJFbnRpdHlOYW1lKTtcblxuICAgICAgICAvLyDsnqzqt4A6IOyXreywuOyhsCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgICAgb3RoZXJFbnRpdHlOYW1lLFxuICAgICAgICAgIGJhY2t3YXJkUmVjb3JkcyxcbiAgICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O1lBTW1HO29CQUMzQztDQW9CM0MsMEJBQXdELEVBQUUsV0FDckUsRUFBRSxNQUFNO0VBQ04sRUFBRSxPQUFPO0VBQ1QsRUFBRSxPQUFPO0VBQ1QsRUFBRSxRQUFRO0VBQ1YsRUFBRSxPQUFPO0VBQ1QsRUFBRSxLQUFLO0VBQ1AsRUFBRSxXQUFXLFVBQVU7RUFDdkIsRUFBRSxLQUFLO0VBQ1AsRUFBRSxVQUFVO0VBQ1osRUFBRSxNQUFNLHVCQUF1QjtFQUMvQixFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsdUJBQXVCO0NBQzlDLENBQUMsQ0FDSDtDQUNhLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsdUJBQXVCO0NBQ3ZFLDRCQUE0QixFQUFFLE1BQU0sd0JBQXdCO0NBQ25FLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPLE1BQU0sQ0FBQztDQUM3Qyx5QkFBeUIsRUFBRSxPQUFPO0VBQzdDLFVBQVUsRUFBRSxLQUFLO0dBQUM7R0FBVTtHQUFPO0dBQVM7R0FBUTtHQUFVO0VBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztFQUNsRixPQUFPLEVBQUUsT0FBTyxDQUFDLENB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
249
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kYXRhLWV4cGxvcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IFwic2FtcGxlXCIgfCBcImlkc1wiIHwgXCJxdWVyeVwiIHwgXCJmaWxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIjtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBEYXRlXG4gIHwgVWludDhBcnJheVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBEYXRhRXhwbG9yZXJWYWx1ZVtdXG4gIHwgRGF0YUV4cGxvcmVyUmVjb3JkO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJSZWNvcmQgPSB7XG4gIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBEYXRhRXhwbG9yZXJWYWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYTogei5ab2RUeXBlPERhdGFFeHBsb3JlclZhbHVlPiA9IHoubGF6eSgoKSA9PlxuICB6LnVuaW9uKFtcbiAgICB6LnN0cmluZygpLFxuICAgIHoubnVtYmVyKCksXG4gICAgei5ib29sZWFuKCksXG4gICAgei5iaWdpbnQoKSxcbiAgICB6LmRhdGUoKSxcbiAgICB6Lmluc3RhbmNlb2YoVWludDhBcnJheSksXG4gICAgei5udWxsKCksXG4gICAgei51bmRlZmluZWQoKSxcbiAgICB6LmFycmF5KGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKSxcbiAgICB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSksXG4gIF0pLFxuKTtcbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSk7XG5leHBvcnQgY29uc3QgZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYSA9IHouYXJyYXkoZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hKTtcbmNvbnN0IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYSA9IHouZW51bShbXCJhc2NcIiwgXCJkZXNjXCJdKTtcbmV4cG9ydCBjb25zdCBkYXRhU291cmNlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJhdGVneTogei5lbnVtKFtcInNhbXBsZVwiLCBcImlkc1wiLCBcInF1ZXJ5XCIsIFwiZmlsZVwiLCBcInJlY2VudFwiLCBcInJhbmRvbVwiXSkub3B0aW9uYWwoKSxcbiAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgd2hlcmU6IHoucmVjb3JkKHouc3RyaW5nKCksIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKS5vcHRpb25hbCgpLFxuICBvcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGlkczogei5hcnJheSh6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkpLm9wdGlvbmFsKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZUNhY2hlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBjYWNoZVR0bDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBXSEVSRSDsobDqsbQg7YOA7J6FICjqsJ3ssrQg65iQ64qUIEtuZXggUXVlcnlCdWlsZGVyIO2VqOyImCkgKi9cbmV4cG9ydCB0eXBlIFdoZXJlQ29uZGl0aW9uID0gb2JqZWN0IHwgKChxdWVyeUJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSA9PiB2b2lkKTtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyT3B0aW9ucyA9IHtcbiAgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IG51bWJlcjtcbiAgd2hlcmU/OiBXaGVyZUNvbmRpdGlvbjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgaWRzPzogKG51bWJlciB8IHN0cmluZylbXTtcbiAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiDsupDsi7Eg7IKs7JqpIOyXrOu2gCAo6riw67O46rCSOiBmYWxzZSkgKi9cbiAgdXNlQ2FjaGU/OiBib29sZWFuO1xuICAvKiog7LqQ7IucIFRUTCAo7LSIIOuLqOychCwg6riw67O46rCSOiAzMDApICovXG4gIGNhY2hlVHRsPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zID0gRGF0YUV4cGxvcmVyT3B0aW9ucyAmIHtcbiAgLyoqIOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoIOyXrOu2gCAo6riw67O46rCSOiB0cnVlKSAqL1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgLyoqIOyerOq3gCDtg5Dsg4kg7LWc64yAIOq5iuydtCAo6riw67O46rCSOiAyKSAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0ID0ge1xuICAvKiog66mU7J24IGVudGl0eSDrjbDsnbTthLAgKi9cbiAgbWFpbjoge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcmVjb3JkczogRGF0YUV4cGxvcmVyUmVjb3JkW107XG4gIH07XG4gIC8qKiDqtIDroKggZW50aXR5IOuNsOydtO2EsCAoZW50aXR5SWQgLT4gcmVjb3JkcykgKi9cbiAgcmVsYXRlZDogTWFwPHN0cmluZywgRGF0YUV4cGxvcmVyUmVjb3JkW10+O1xufTtcblxuLy8g6riw7KG0IERCIOuNsOydtO2EsOulvCDtg5Dsg4ntlZjsl6wgZml4dHVyZSDsg53shLEg7IucIOywuOyhsO2VoCDsiJgg7J6I64qUIOyLnOyKpO2FnFxuZXhwb3J0IGNsYXNzIERhdGFFeHBsb3JlciB7XG4gIHByaXZhdGUgY2FjaGU/OiBDYWNoZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYjogS25leCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIGNhY2hlTWFuYWdlcj86IENhY2hlTWFuYWdlcixcbiAgKSB7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmUoZW50aXR5TmFtZTogc3RyaW5nLCBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIOy6kOyLsSDsp4Dsm5BcbiAgICBpZiAob3B0aW9ucy51c2VDYWNoZSAmJiB0aGlzLmNhY2hlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldE9yU2V0KHtcbiAgICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgICAgdHRsOiBvcHRpb25zLmNhY2hlVHRsIHx8IDMwMCxcbiAgICAgICAgZmFjdG9yeTogKCkgPT4gdGhpcy5leHBsb3JlSW50ZXJuYWwoZW50aXR5LCBvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHBsb3JlSW50ZXJuYWwoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kYihlbnRpdHkudGFibGUpO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLnN0cmF0ZWd5KSB7XG4gICAgICBjYXNlIFwic2FtcGxlXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNhbXBsZURhdGEocXVlcnksIG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwicmVjZW50XCI6IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEF0Q29sID0gdGhpcy5maW5kVGltZXN0YW1wQ29sdW1uKGVudGl0eSwgXCJjcmVhdGVkX2F0XCIpO1xuICAgICAgICBpZiAoY3JlYXRlZEF0Q29sKSB7XG4gICAgICAgICAgcXVlcnkub3JkZXJCeShjcmVhdGVkQXRDb2wsIFwiZGVzY1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0IHx8IDEwKSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyYW5kb21cIjpcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmFuZG9tU2FtcGxlKHF1ZXJ5LCBvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcImlkc1wiOlxuICAgICAgICBpZiAob3B0aW9ucy5pZHMgJiYgb3B0aW9ucy5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlSW4oXCJpZFwiLCBvcHRpb25zLmlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UoYXdhaXQgcXVlcnkpO1xuXG4gICAgICBjYXNlIFwicXVlcnlcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgICAgICBjb25zdCB3aGVyZUNhbGxiYWNrID0gelxuICAgICAgICAgICAgLmN1c3RvbTwocXVlcnlCdWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikgPT4gdm9pZD4oaXNGdW5jdGlvblZhbHVlKVxuICAgICAgICAgICAgLnNhZmVQYXJzZShvcHRpb25zLndoZXJlKTtcbiAgICAgICAgICBpZiAod2hlcmVDYWxsYmFjay5zdWNjZXNzKSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZSh3aGVyZUNhbGxiYWNrLmRhdGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZShkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEucGFyc2Uob3B0aW9ucy53aGVyZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICAgICAgY29uc3QgW2NvbCwgZGlyID0gXCJhc2NcIl0gPSBvcHRpb25zLm9yZGVyQnkuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYS5wYXJzZShkaXIpO1xuICAgICAgICAgIC8vIGlkIOy7rOufvOydgCDsiKvsnpDroZwg7LqQ7Iqk7YyF7ZWY7JesIOygleugrO2VqeuLiOuLpCAo66y47J6Q7Je0IOygleugrCDrsKnsp4ApXG4gICAgICAgICAgaWYgKGNvbCA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBxdWVyeS5vcmRlckJ5UmF3KGBDQVNUKD8/IEFTIElOVEVHRVIpICR7ZGlyZWN0aW9ufWAsIFtjb2xdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkub3JkZXJCeShjb2wsIGRpcmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJSZWNvcmRzU2NoZW1hLnBhcnNlKGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApKTtcblxuICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbGVQYXRoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmlsZVBhdGggaXMgcmVxdWlyZWQgZm9yIGZpbGUgc3RyYXRlZ3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21GaWxlKG9wdGlvbnMuZmlsZVBhdGgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RyYXRlZ3k6ICR7b3B0aW9ucy5zdHJhdGVneX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDqt6Drk7Eg7IOY7ZSM66eBIChQb3N0Z3JlU1FMIFJPV19OVU1CRVIg7IKs7JqpKVxuICBwcml2YXRlIGFzeW5jIHNhbXBsZURhdGEocXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IFt7IGNvdW50IH1dID0gYXdhaXQgcXVlcnkuY2xvbmUoKS5jb3VudChcIiogYXMgY291bnRcIik7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoY291bnQpO1xuXG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChsaW1pdCkpO1xuICAgIH1cblxuICAgIC8vIOq3oOuTsSDqsITqsqkg6rOE7IKwXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBNYXRoLmZsb29yKHRvdGFsIC8gbGltaXQpO1xuXG4gICAgLy8g7YWM7J2067iU66qFIOy2lOy2nFxuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHF1ZXJ5LnRvU3RyaW5nKCkubWF0Y2goL2Zyb21cXHMrXCI/KFxcdyspXCI/L2kpPy5bMV07XG4gICAgaWYgKCF0YWJsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBleHRyYWN0IHRhYmxlIG5hbWUgZnJvbSBxdWVyeVwiKTtcbiAgICB9XG5cbiAgICAvLyBST1dfTlVNQkVSKCnroZwg7ZWcIOuyiOyXkCDqt6Drk7Eg7IOY7ZSM66eBICjri6jsnbwg7L+866asKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGIucmF3KFxuICAgICAgYFxuICAgICAgV0lUSCBudW1iZXJlZF9yb3dzIEFTIChcbiAgICAgICAgU0VMRUNUICosIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSBpZCkgYXMgcm5cbiAgICAgICAgRlJPTSA/P1xuICAgICAgKVxuICAgICAgU0VMRUNUICogRlJPTSBudW1iZXJlZF9yb3dzXG4gICAgICBXSEVSRSBNT0Qocm4gLSAxLCA/KSA9IDBcbiAgICAgIExJTUlUID9cbiAgICBgLFxuICAgICAgW3RhYmxlTmFtZSwgaW50ZXJ2YWwsIGxpbWl0XSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UocmVzdWx0LnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYW5kb21TYW1wbGUoXG4gICAgcXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5vcmRlckJ5UmF3KFwiUkFORE9NKClcIikubGltaXQobGltaXQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFRpbWVzdGFtcENvbHVtbihlbnRpdHk6IEVudGl0eSwgY29sdW1uTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBwcm9wPy5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UoY29udGVudCkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSlNPTiBmaWxlIG11c3QgY29udGFpbiBhbiBhcnJheSBvZiByZWNvcmRzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpTT04gZmlsZSBtdXN0IGNvbnRhaW4gYSB2YWxpZCBhcnJheSBvZiByZWNvcmRzXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoKSA9PiBoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gbGluZXMuc2xpY2UoMSkubWFwKChsaW5lKTogRGF0YUV4cGxvcmVyUmVjb3JkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdChcIixcIik7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgaGVhZGVycy5tYXAoKGhlYWRlciwgaW5kZXgpID0+IFtoZWFkZXIsIHZhbHVlc1tpbmRleF0/LnRyaW0oKV0gYXMgY29uc3QpLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmaWxlIGZvcm1hdDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcmVsYXRpb25Qcm9wOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGF0YUV4cGxvcmVyT3B0aW9ucz4sXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSByZWxhdGlvblByb3ApO1xuXG4gICAgaWYgKCFwcm9wIHx8ICFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiBwcm9wZXJ0eSBub3QgZm91bmQ6ICR7ZW50aXR5TmFtZX0uJHtyZWxhdGlvblByb3B9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IHByb3AuY29uZT8uZGF0YVNvdXJjZTtcbiAgICBjb25zdCBzdHJhdGVneSA9IGRhdGFTb3VyY2U/LnN0cmF0ZWd5IHx8IG9wdGlvbnM/LnN0cmF0ZWd5IHx8IFwic2FtcGxlXCI7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YVNvdXJjZUNvbmZpZ1NjaGVtYS5wYXJzZShkYXRhU291cmNlPy5jb25maWcgPz8ge30pO1xuICAgIGNvbnN0IGV4cGxvcmVPcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zID0ge1xuICAgICAgc3RyYXRlZ3ksXG4gICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gY29uZmlnLmxpbWl0ID8/IDEwLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZShwcm9wLndpdGgsIGV4cGxvcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl6zrn6wgcmVsYXRpb27snYQg67OR66Cs66GcIOyhsO2ajO2VqeuLiOuLpCAoTisxIOusuOygnCDtlbTqsrApXG4gICAqL1xuICBhc3luYyBleHBsb3JlUmVsYXRpb25zKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3BzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBEYXRhRXhwbG9yZXJSZWNvcmRbXT4+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByZWxhdGlvblByb3BzLm1hcChhc3luYyAocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5leHBsb3JlUmVsYXRpb24oZW50aXR5TmFtZSwgcHJvcCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbcHJvcCwgZGF0YV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IERhdGFFeHBsb3Jlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYERhdGFFeHBsb3Jlcjoke2VudGl0eU5hbWV9YCxcbiAgICAgIG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBvcHRpb25zLmxpbWl0Py50b1N0cmluZygpIHx8IFwiZGVmYXVsdFwiLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy53aGVyZSkge1xuICAgICAgcGFydHMucHVzaChKU09OLnN0cmluZ2lmeShvcHRpb25zLndoZXJlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHBhcnRzLnB1c2gob3B0aW9ucy5vcmRlckJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMuaWRzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIjpcIik7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JmAIOq0gOugqOuQnCDrjbDsnbTthLDrpbwg7J6s6reA7KCB7Jy866GcIO2DkOyDie2VqeuLiOuLpC5cbiAgICogQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKSByZWxhdGlvbuydhCDrlLDrnbzqsIDrqbAg7LC47KGwIOuNsOydtO2EsOulvCDsiJjsp5Htlanri4jri6QuXG4gICAqL1xuICBhc3luYyBleHBsb3JlV2l0aFJlbGF0aW9ucyhcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0PiB7XG4gICAgY29uc3QgaW5jbHVkZVJlbGF0aW9ucyA9IG9wdGlvbnMuaW5jbHVkZVJlbGF0aW9ucyA/PyB0cnVlO1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucy5tYXhEZXB0aCA/PyAyO1xuXG4gICAgLy8g66mU7J24IGVudGl0eSDsobDtmoxcbiAgICBjb25zdCBtYWluUmVjb3JkcyA9IGF3YWl0IHRoaXMuZXhwbG9yZShlbnRpdHlOYW1lLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQgPSB7XG4gICAgICBtYWluOiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHlOYW1lLFxuICAgICAgICByZWNvcmRzOiBtYWluUmVjb3JkcyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkOiBuZXcgTWFwKCksXG4gICAgfTtcblxuICAgIC8vIOq0gOugqCDrjbDsnbTthLAg7IiY7KeR7ZWY7KeAIOyViuycvOuptCDrsJTroZwg66as7YS0XG4gICAgaWYgKCFpbmNsdWRlUmVsYXRpb25zIHx8IG1heERlcHRoIDw9IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g7J2066+4IOyhsO2ajO2VnCBlbnRpdHkg7LaU7KCBICjspJHrs7Ug67Cp7KeAKVxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oW2VudGl0eU5hbWVdKTtcblxuICAgIC8vIOyerOq3gOyggeycvOuhnCDqtIDroKgg642w7J207YSwIOyImOynkVxuICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKGVudGl0eU5hbWUsIG1haW5SZWNvcmRzLCByZXN1bHQucmVsYXRlZCwgdmlzaXRlZCwgbWF4RGVwdGgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDqtIDroKgg642w7J207YSw66W8IOyerOq3gOyggeycvOuhnCDsiJjsp5Htlanri4jri6QgKHByaXZhdGUgaGVscGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IERhdGFFeHBsb3JlclJlY29yZFtdLFxuICAgIHJlbGF0ZWRNYXA6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclJlY29yZFtdPixcbiAgICB2aXNpdGVkOiBTZXQ8c3RyaW5nPixcbiAgICByZW1haW5pbmdEZXB0aDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZElkID0gei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pLnNhZmVQYXJzZShyZWNvcmQuaWQpO1xuICAgICAgcmV0dXJuIHBhcnNlZElkLnN1Y2Nlc3MgPyBbcGFyc2VkSWQuZGF0YV0gOiBbXTtcbiAgICB9KTtcblxuICAgIC8vIDEuIEZvcndhcmQgcmVmZXJlbmNlczog7J20IGVudGl0eeqwgCDssLjsobDtlZjripQg64uk66W4IGVudGl0eVxuICAgIGNvbnN0IGZvcndhcmRSZWxhdGlvblByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBmb3J3YXJkUmVsYXRpb25Qcm9wcykge1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVudGl0eU5hbWUgPSBwcm9wLndpdGg7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR564qUIOyKpO2CtSAo7Iic7ZmYIOywuOyhsCDrsKnsp4ApXG4gICAgICBpZiAodmlzaXRlZC5oYXModGFyZ2V0RW50aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOywuOyhsO2VmOuKlCBJROuTpCDsiJjsp5FcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICBjb25zdCByZWZlcmVuY2VkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkuc2FmZVBhcnNlKHJlY29yZFtmb3JlaWduS2V5TmFtZV0pO1xuICAgICAgICByZXR1cm4gcGFyc2VkSWQuc3VjY2VzcyA/IFtwYXJzZWRJZC5kYXRhXSA6IFtdO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7KSR67O1IOygnOqxsFxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQocmVmZXJlbmNlZElkcyldO1xuXG4gICAgICAvLyDssLjsobAg642w7J207YSwIOyhsO2ajFxuICAgICAgY29uc3QgcmVmZXJlbmNlZFJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUodGFyZ2V0RW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneTogXCJpZHNcIixcbiAgICAgICAgaWRzOiB1bmlxdWVJZHMsXG4gICAgICB9KTtcblxuICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgcmVsYXRlZE1hcC5zZXQodGFyZ2V0RW50aXR5TmFtZSwgcmVmZXJlbmNlZFJlY29yZHMpO1xuICAgICAgdmlzaXRlZC5hZGQodGFyZ2V0RW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIOyerOq3gDog7LC47KGw65CcIOuNsOydtO2EsOydmCDqtIDroKgg642w7J207YSw64+EIOyImOynkVxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRSZWNvcmRzLFxuICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICByZW1haW5pbmdEZXB0aCAtIDEsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIEJhY2t3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICAvLyDrqqjrk6AgZW50aXR566W8IOyInO2ajO2VmOupsCDtmITsnqwgZW50aXR566W8IOywuOyhsO2VmOuKlCByZWxhdGlvbiDssL7quLBcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgZm9yIChjb25zdCBvdGhlckVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgY29uc3Qgb3RoZXJFbnRpdHlOYW1lID0gb3RoZXJFbnRpdHkuaWQ7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlojqsbDrgpgg7J6Q6riwIOyekOyLoOydtOuptCDsiqTtgrVcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhvdGhlckVudGl0eU5hbWUpIHx8IG90aGVyRW50aXR5TmFtZSA9PT0gZW50aXR5TmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24gcHJvcCDssL7quLBcbiAgICAgIGNvbnN0IGJhY2t3YXJkUmVsYXRpb25zID0gb3RoZXJFbnRpdHkucHJvcHMuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgIHByb3Aud2l0aCA9PT0gZW50aXR5TmFtZSAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmFja3dhcmRSZWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gb3RoZXJFbnRpdHnqsIAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgRksg7Lus65+8XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8g7ZiE7J6sIOugiOy9lOuTnOuTpOydhCDssLjsobDtlZjripQgb3RoZXJFbnRpdHkg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIob3RoZXJFbnRpdHkudGFibGUpLndoZXJlSW4oZm9yZWlnbktleU5hbWUsIHJlY29yZElkcyk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkUmVjb3JkcyA9IGF3YWl0IHF1ZXJ5O1xuXG4gICAgICAgIGlmIChiYWNrd2FyZFJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsrDqs7zsl5Ag7LaU6rCAXG4gICAgICAgIHJlbGF0ZWRNYXAuc2V0KG90aGVyRW50aXR5TmFtZSwgYmFja3dhcmRSZWNvcmRzKTtcbiAgICAgICAgdmlzaXRlZC5hZGQob3RoZXJFbnRpdHlOYW1lKTtcblxuICAgICAgICAvLyDsnqzqt4A6IOyXreywuOyhsCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgICAgb3RoZXJFbnRpdHlOYW1lLFxuICAgICAgICAgIGJhY2t3YXJkUmVjb3JkcyxcbiAgICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0NBTW1HLFdBQUE7Q0FDM0MsbUJBQUE7Q0FvQjNDLDBCQUF3RCxFQUFFLFdBQ3JFLEVBQUUsTUFBTTtFQUNOLEVBQUUsT0FBTztFQUNULEVBQUUsT0FBTztFQUNULEVBQUUsUUFBUTtFQUNWLEVBQUUsT0FBTztFQUNULEVBQUUsS0FBSztFQUNQLEVBQUUsV0FBVyxVQUFVO0VBQ3ZCLEVBQUUsS0FBSztFQUNQLEVBQUUsVUFBVTtFQUNaLEVBQUUsTUFBTSx1QkFBdUI7RUFDL0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLHVCQUF1QjtDQUM5QyxDQUFDLENBQ0g7Q0FDYSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLHVCQUF1QjtDQUN2RSw0QkFBNEIsRUFBRSxNQUFNLHdCQUF3QjtDQUNuRSw4QkFBOEIsRUFBRSxLQUFLLENBQUMsT0FBTyxNQUFNLENBQUM7Q0FDN0MseUJBQXlCLEVBQUUsT0FBTztFQUM3QyxVQUFVLEVBQUUsS0FBSztHQUFDO0dBQVU7R0FBTztHQUFTO0dBQVE7R0FBVTtFQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7RUFDbEYsT0FBTyxFQUFFLE9B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
@@ -4,7 +4,7 @@ import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
4
  import { DevVitestManager, init_dev_vitest_manager } from "./dev-vitest-manager.js";
5
5
  import { z } from "zod";
6
6
  import { randomUUID } from "crypto";
7
- //#region src/testing/dev-test-routes.ts
7
+ // src/testing/dev-test-routes.ts
8
8
  function toPathPrefix(basePath) {
9
9
  return basePath.endsWith("/") ? basePath : `${basePath}/`;
10
10
  }
@@ -144,7 +144,6 @@ async function registerDevTestRoutes(server, config, dependencies) {
144
144
  });
145
145
  }
146
146
  var SCHEMA_VERSION, HEARTBEAT_INTERVAL_MS, SerializedTraceSchema, TestCaseResultSchema, RunResultSchema, RunRequestSchema, TestEventSchema, TestEventNameSchema;
147
- //#endregion
148
147
  __esmMin((() => {
149
148
  init_sonamu();
150
149
  init_sse();
@@ -279,4 +278,4 @@ __esmMin((() => {
279
278
  }))();
280
279
  export { registerDevTestRoutes };
281
280
 
282
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHsgdHlwZSBTU0VDb25uZWN0aW9uIH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlclN0YXR1cyxcbiAgdHlwZSBSdW5SZXN1bHQsXG4gIHR5cGUgVGVzdENhc2VSZXN1bHQsXG4gIHR5cGUgVGVzdEV2ZW50UGF5bG9hZCxcbn0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5cbmNvbnN0IFNDSEVNQV9WRVJTSU9OID0gMTtcbmNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDMwXzAwMDtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlTWFuYWdlciA9IFBpY2s8XG4gIERldlZpdGVzdE1hbmFnZXIsXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJydW5cIlxuICB8IFwiZ2V0U3RhdHVzXCJcbiAgfCBcImVtaXRFdmVudFwiXG4gIHwgXCJhZGRFdmVudExpc3RlbmVyXCJcbiAgfCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIlxuICB8IFwic2h1dGRvd25cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlRGVwZW5kZW5jaWVzID0ge1xuICBtYW5hZ2VyPzogRGV2VGVzdFJvdXRlTWFuYWdlcjtcbiAgYXBpUm9vdFBhdGg/OiBzdHJpbmc7XG4gIHNzZUF2YWlsYWJsZT86IGJvb2xlYW47XG59O1xuXG5jb25zdCBTZXJpYWxpemVkVHJhY2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHoudW5rbm93bigpLFxuICBmaWxlUGF0aDogei5zdHJpbmcoKSxcbiAgbGluZU51bWJlcjogei5udW1iZXIoKSxcbiAgYXQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4gPSB6LmxhenkoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGZpbGU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IHouZW51bShbXCJwYXNzZWRcIiwgXCJmYWlsZWRcIiwgXCJza2lwcGVkXCIsIFwidG9kb1wiLCBcInJ1bm5pbmdcIiwgXCJ1bmtub3duXCJdKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgY291bnRzOiB6Lm9iamVjdCh7XG4gICAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICAgIGZhaWxlZDogei5udW1iZXIoKSxcbiAgICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZXJyb3I6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpLFxuICAgIHRyYWNlczogei5hcnJheShTZXJpYWxpemVkVHJhY2VTY2hlbWEpLFxuICAgIGNoaWxkcmVuOiB6LmFycmF5KFRlc3RDYXNlUmVzdWx0U2NoZW1hKSxcbiAgfSksXG4pO1xuXG5jb25zdCBSdW5SZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxSdW5SZXN1bHQ+ID0gei5vYmplY3Qoe1xuICBvazogei5ib29sZWFuKCksXG4gIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICBwYXNzZWQ6IHoubnVtYmVyKCksXG4gICAgZmFpbGVkOiB6Lm51bWJlcigpLFxuICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgfSksXG4gIHJlc3VsdHM6IHouYXJyYXkoVGVzdENhc2VSZXN1bHRTY2hlbWEpLFxufSk7XG5jb25zdCBSdW5SZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBwYXR0ZXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgVGVzdEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBzbmFwc2hvdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgc2VydmVyVGltZTogei5zdHJpbmcoKSxcbiAgICBzdGF0dXM6IHoub2JqZWN0KHtcbiAgICAgIHJlYWR5OiB6LmJvb2xlYW4oKSxcbiAgICAgIHJ1bm5pbmc6IHouYm9vbGVhbigpLFxuICAgICAgbGFzdFJ1bkF0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICBzc2VBdmFpbGFibGU6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuUXVldWVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBxdWV1ZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXF1ZXN0OiB6Lm9iamVjdCh7XG4gICAgICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuU3RhcnRlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICB9KSxcbiAgcnVuQ29tcGxldGVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZmluaXNoZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXN1bHQ6IFJ1blJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIHJ1bkVycm9yZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIGZpbmlzaGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZXJyb3I6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuTm9kZVByb2dyZXNzOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5saXRlcmFsKDEpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgICBraW5kOiB6LmVudW0oW1wiZmlsZVwiLCBcInN1aXRlXCIsIFwidGVzdFwiXSksXG4gICAgcGhhc2U6IHouZW51bShbXCJyZWFkeVwiLCBcInJlc3VsdFwiXSksXG4gICAgZmlsZUlkOiB6LnN0cmluZygpLFxuICAgIG5vZGVJZDogei5zdHJpbmcoKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgIG5vZGU6IFRlc3RDYXNlUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgaGVhcnRiZWF0OiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgfSksXG59KTtcblxudHlwZSBUZXN0RXZlbnRzID0gei5pbmZlcjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPjtcbmNvbnN0IFRlc3RFdmVudE5hbWVTY2hlbWEgPSB6LmVudW0oW1xuICBcInNuYXBzaG90XCIsXG4gIFwicnVuUXVldWVkXCIsXG4gIFwicnVuU3RhcnRlZFwiLFxuICBcInJ1bkNvbXBsZXRlZFwiLFxuICBcInJ1bkVycm9yZWRcIixcbiAgXCJydW5Ob2RlUHJvZ3Jlc3NcIixcbiAgXCJoZWFydGJlYXRcIixcbl0pO1xuXG5mdW5jdGlvbiB0b1BhdGhQcmVmaXgoYmFzZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aCA6IGAke2Jhc2VQYXRofS9gO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplVHJhY2UodHJhY2U6IFNlcmlhbGl6ZWRUcmFjZSwgcHJlZml4OiBzdHJpbmcpOiBTZXJpYWxpemVkVHJhY2Uge1xuICByZXR1cm4geyAuLi50cmFjZSwgZmlsZVBhdGg6IHRyYWNlLmZpbGVQYXRoLnJlcGxhY2UocHJlZml4LCBcIlwiKSB9O1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplTm9kZShub2RlOiBUZXN0Q2FzZVJlc3VsdCwgYmFzZVBhdGg6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5ub2RlLFxuICAgIG5hbWU6IG5vZGUubmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIiksXG4gICAgZmlsZTogbm9kZS5maWxlLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICB0cmFjZXM6IG5vZGUudHJhY2VzLm1hcCgodCkgPT4gcmVsYXRpdml6ZVRyYWNlKHQsIHByZWZpeCkpLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gcmVsYXRpdml6ZU5vZGUoYywgcHJlZml4KSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVSZXN1bHQocmVzdWx0OiBSdW5SZXN1bHQsIGJhc2VQYXRoOiBzdHJpbmcpOiBSdW5SZXN1bHQge1xuICBjb25zdCBwcmVmaXggPSB0b1BhdGhQcmVmaXgoYmFzZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICByZXN1bHRzOiByZXN1bHQucmVzdWx0cy5tYXAoKG4pID0+IHJlbGF0aXZpemVOb2RlKG4sIHByZWZpeCkpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJEZXZUZXN0Um91dGVzKFxuICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgY29uZmlnOiBTb25hbXVEZXZSdW5uZXJDb25maWcsXG4gIGRlcGVuZGVuY2llcz86IERldlRlc3RSb3V0ZURlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVmaXggPSBjb25maWcucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcblxuICBjb25zdCBkZWZhdWx0TWFuYWdlciA9IGRlcGVuZGVuY2llcz8ubWFuYWdlciA9PT0gdW5kZWZpbmVkID8gbmV3IERldlZpdGVzdE1hbmFnZXIoKSA6IG51bGw7XG4gIGNvbnN0IG1hbmFnZXIgPSBkZXBlbmRlbmNpZXM/Lm1hbmFnZXIgPz8gZGVmYXVsdE1hbmFnZXI7XG4gIGlmIChtYW5hZ2VyID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBkZXBlbmRlbmN5IGlzIHVuYXZhaWxhYmxlXCIpO1xuICB9XG4gIGF3YWl0IG1hbmFnZXIuc3RhcnQoY29uZmlnLnZpdGVzdENvbmZpZ1BhdGgpO1xuICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlciA9IGRlZmF1bHRNYW5hZ2VyO1xuICB9XG5cbiAgY29uc3Qgc3NlQXZhaWxhYmxlID0gZGVwZW5kZW5jaWVzPy5zc2VBdmFpbGFibGUgPz8gISFTb25hbXUuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5zc2U7XG5cbiAgaWYgKHNzZUF2YWlsYWJsZSkge1xuICAgIHNlcnZlci5nZXQoYCR7cHJlZml4fS9ldmVudHNgLCAocmVxdWVzdCwgcmVwbHkpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNzZTogU1NFQ29ubmVjdGlvbjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPiA9IGNyZWF0ZVNTRUZhY3RvcnkoXG4gICAgICAgIHJlcXVlc3Quc29ja2V0LFxuICAgICAgICByZXBseSxcbiAgICAgICAgVGVzdEV2ZW50U2NoZW1hLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICAgIHNzZS5wdWJsaXNoKFwic25hcHNob3RcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgc2VydmVyVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAvLyBVSeuKlCBIVFRQIHN0YXR1c+yZgCDqsJnsnYAg7ZiV7YOc66W8IOq4sOuMgO2VmOuvgOuhnCBTU0Ug7Iqk64OF7IO37JeQ64+EIHNzZUF2YWlsYWJsZeydhCDtj6ztlajtlanri4jri6QuXG4gICAgICAgIHN0YXR1czogeyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzc2UucHVibGlzaChcImhlYXJ0YmVhdFwiLCB7XG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGRlcGVuZGVuY2llcz8uYXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoO1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSBUZXN0RXZlbnROYW1lU2NoZW1hLnNhZmVQYXJzZShldmVudCk7XG4gICAgICAgIGlmICghcGFyc2VkS2V5LnN1Y2Nlc3MpIHJldHVybjtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VkS2V5LmRhdGE7XG4gICAgICAgIGlmIChrZXkgPT09IFwicnVuTm9kZVByb2dyZXNzXCIpIHtcbiAgICAgICAgICBjb25zdCBwcm9ncmVzc0VudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBydW5Ob2RlUHJvZ3Jlc3M6IGRhdGEgfSk7XG4gICAgICAgICAgaWYgKCFwcm9ncmVzc0VudmVsb3BlLnN1Y2Nlc3MgfHwgcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcztcbiAgICAgICAgICBjb25zdCByZWxhdGl2aXplZCA9IHtcbiAgICAgICAgICAgIC4uLnByb2dyZXNzLFxuICAgICAgICAgICAgbm9kZTogcmVsYXRpdml6ZU5vZGUocHJvZ3Jlc3Mubm9kZSwgYmFzZVBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCByZWxhdGl2aXplZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEVudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBba2V5XTogZGF0YSB9KTtcbiAgICAgICAgaWYgKCFwYXJzZWRFbnZlbG9wZS5zdWNjZXNzIHx8IHBhcnNlZEVudmVsb3BlLmRhdGFba2V5XSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZWRFbnZlbG9wZS5kYXRhW2tleV07XG4gICAgICAgIC8vIFNBRkVUWToga2V57JmAIHBheWxvYWTripQg6rCZ7J2AIFRlc3RFdmVudFNjaGVtYSDtla3rqqnsnLzroZwg7ZWo6ruYIOqygOymneuQmOyXiOyKteuLiOuLpC5cbiAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCBwYXJzZWREYXRhIGFzIFRlc3RFdmVudHNbdHlwZW9mIGtleV0pO1xuICAgICAgfTtcbiAgICAgIG1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChoZWFydGJlYXRUaW1lcik7XG4gICAgICAgIG1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5zb2NrZXQub24oXCJjbG9zZVwiLCBjbGVhbnVwKTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXJ2ZXIucG9zdChgJHtwcmVmaXh9L3J1bmAsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgIGNvbnN0IHJ1bklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJ1blJlcXVlc3QgPSBSdW5SZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcXVlc3QuYm9keSA/PyB7fSk7XG5cbiAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blF1ZXVlZFwiLCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgIHJ1bklkLFxuICAgICAgcXVldWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlcXVlc3Q6IHJ1blJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5TdGFydGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3UmVzdWx0OiBSdW5SZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLnJ1bihydW5SZXF1ZXN0LCBydW5JZCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZWxhdGl2aXplUmVzdWx0KHJhd1Jlc3VsdCwgZGVwZW5kZW5jaWVzPy5hcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgpO1xuXG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5Db21wbGV0ZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5FcnJvcmVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHNlcnZlci5nZXQoYCR7cHJlZml4fS9zdGF0dXNgLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICByZXR1cm4geyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9O1xuICB9KTtcblxuICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyID0gbnVsbDtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBOEpBLFNBQVMsYUFBYSxVQUEwQjtDQUM5QyxPQUFPLFNBQVMsU0FBUyxHQUFHLElBQUksV0FBVyxHQUFHLFNBQVM7QUFDekQ7QUFFQSxTQUFTLGdCQUFnQixPQUF3QixRQUFpQztDQUNoRixPQUFPO0VBQUUsR0FBRztFQUFPLFVBQVUsTUFBTSxTQUFTLFFBQVEsUUFBUSxFQUFFO0NBQUU7QUFDbEU7QUFFQSxTQUFTLGVBQWUsTUFBc0IsVUFBa0M7Q0FDOUUsTUFBTSxTQUFTLGFBQWEsUUFBUTtDQUNwQyxPQUFPO0VBQ0wsR0FBRztFQUNILE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLFFBQVEsS0FBSyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7RUFDekQsVUFBVSxLQUFLLFNBQVMsS0FBSyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7Q0FDOUQ7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLFFBQW1CLFVBQTZCO0NBQ3hFLE1BQU0sU0FBUyxhQUFhLFFBQVE7Q0FDcEMsT0FBTztFQUNMLEdBQUc7RUFDSCxTQUFTLE9BQU8sUUFBUSxLQUFLLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztDQUM5RDtBQUNGO0FBRUEsZUFBc0Isc0JBQ3BCLFFBQ0EsUUFDQSxjQUNlO0NBQ2YsTUFBTSxTQUFTLE9BQU8sZUFBZTtDQUVyQyxNQUFNLGlCQUFpQixjQUFjLFlBQVksU0FBWSxJQUFJLGlCQUFpQixJQUFJO0NBQ3RGLE1BQU0sVUFBVSxjQUFjLFdBQVc7Q0FDekMsSUFBSSxZQUFZLE1BQ2QsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0NBRTlELE1BQU0sUUFBUSxNQUFNLE9BQU8sZ0JBQWdCO0NBQzNDLElBQUksbUJBQW1CLE1BQ3JCLE9BQU8sbUJBQW1CO0NB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
281
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHsgdHlwZSBTU0VDb25uZWN0aW9uIH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlclN0YXR1cyxcbiAgdHlwZSBSdW5SZXN1bHQsXG4gIHR5cGUgVGVzdENhc2VSZXN1bHQsXG4gIHR5cGUgVGVzdEV2ZW50UGF5bG9hZCxcbn0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5cbmNvbnN0IFNDSEVNQV9WRVJTSU9OID0gMTtcbmNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDMwXzAwMDtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlTWFuYWdlciA9IFBpY2s8XG4gIERldlZpdGVzdE1hbmFnZXIsXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJydW5cIlxuICB8IFwiZ2V0U3RhdHVzXCJcbiAgfCBcImVtaXRFdmVudFwiXG4gIHwgXCJhZGRFdmVudExpc3RlbmVyXCJcbiAgfCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIlxuICB8IFwic2h1dGRvd25cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlRGVwZW5kZW5jaWVzID0ge1xuICBtYW5hZ2VyPzogRGV2VGVzdFJvdXRlTWFuYWdlcjtcbiAgYXBpUm9vdFBhdGg/OiBzdHJpbmc7XG4gIHNzZUF2YWlsYWJsZT86IGJvb2xlYW47XG59O1xuXG5jb25zdCBTZXJpYWxpemVkVHJhY2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHoudW5rbm93bigpLFxuICBmaWxlUGF0aDogei5zdHJpbmcoKSxcbiAgbGluZU51bWJlcjogei5udW1iZXIoKSxcbiAgYXQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4gPSB6LmxhenkoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGZpbGU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IHouZW51bShbXCJwYXNzZWRcIiwgXCJmYWlsZWRcIiwgXCJza2lwcGVkXCIsIFwidG9kb1wiLCBcInJ1bm5pbmdcIiwgXCJ1bmtub3duXCJdKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgY291bnRzOiB6Lm9iamVjdCh7XG4gICAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICAgIGZhaWxlZDogei5udW1iZXIoKSxcbiAgICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZXJyb3I6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpLFxuICAgIHRyYWNlczogei5hcnJheShTZXJpYWxpemVkVHJhY2VTY2hlbWEpLFxuICAgIGNoaWxkcmVuOiB6LmFycmF5KFRlc3RDYXNlUmVzdWx0U2NoZW1hKSxcbiAgfSksXG4pO1xuXG5jb25zdCBSdW5SZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxSdW5SZXN1bHQ+ID0gei5vYmplY3Qoe1xuICBvazogei5ib29sZWFuKCksXG4gIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICBwYXNzZWQ6IHoubnVtYmVyKCksXG4gICAgZmFpbGVkOiB6Lm51bWJlcigpLFxuICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgfSksXG4gIHJlc3VsdHM6IHouYXJyYXkoVGVzdENhc2VSZXN1bHRTY2hlbWEpLFxufSk7XG5jb25zdCBSdW5SZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBwYXR0ZXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgVGVzdEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBzbmFwc2hvdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgc2VydmVyVGltZTogei5zdHJpbmcoKSxcbiAgICBzdGF0dXM6IHoub2JqZWN0KHtcbiAgICAgIHJlYWR5OiB6LmJvb2xlYW4oKSxcbiAgICAgIHJ1bm5pbmc6IHouYm9vbGVhbigpLFxuICAgICAgbGFzdFJ1bkF0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICBzc2VBdmFpbGFibGU6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuUXVldWVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBxdWV1ZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXF1ZXN0OiB6Lm9iamVjdCh7XG4gICAgICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuU3RhcnRlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICB9KSxcbiAgcnVuQ29tcGxldGVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZmluaXNoZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXN1bHQ6IFJ1blJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIHJ1bkVycm9yZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIGZpbmlzaGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZXJyb3I6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuTm9kZVByb2dyZXNzOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5saXRlcmFsKDEpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgICBraW5kOiB6LmVudW0oW1wiZmlsZVwiLCBcInN1aXRlXCIsIFwidGVzdFwiXSksXG4gICAgcGhhc2U6IHouZW51bShbXCJyZWFkeVwiLCBcInJlc3VsdFwiXSksXG4gICAgZmlsZUlkOiB6LnN0cmluZygpLFxuICAgIG5vZGVJZDogei5zdHJpbmcoKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgIG5vZGU6IFRlc3RDYXNlUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgaGVhcnRiZWF0OiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgfSksXG59KTtcblxudHlwZSBUZXN0RXZlbnRzID0gei5pbmZlcjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPjtcbmNvbnN0IFRlc3RFdmVudE5hbWVTY2hlbWEgPSB6LmVudW0oW1xuICBcInNuYXBzaG90XCIsXG4gIFwicnVuUXVldWVkXCIsXG4gIFwicnVuU3RhcnRlZFwiLFxuICBcInJ1bkNvbXBsZXRlZFwiLFxuICBcInJ1bkVycm9yZWRcIixcbiAgXCJydW5Ob2RlUHJvZ3Jlc3NcIixcbiAgXCJoZWFydGJlYXRcIixcbl0pO1xuXG5mdW5jdGlvbiB0b1BhdGhQcmVmaXgoYmFzZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aCA6IGAke2Jhc2VQYXRofS9gO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplVHJhY2UodHJhY2U6IFNlcmlhbGl6ZWRUcmFjZSwgcHJlZml4OiBzdHJpbmcpOiBTZXJpYWxpemVkVHJhY2Uge1xuICByZXR1cm4geyAuLi50cmFjZSwgZmlsZVBhdGg6IHRyYWNlLmZpbGVQYXRoLnJlcGxhY2UocHJlZml4LCBcIlwiKSB9O1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplTm9kZShub2RlOiBUZXN0Q2FzZVJlc3VsdCwgYmFzZVBhdGg6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5ub2RlLFxuICAgIG5hbWU6IG5vZGUubmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIiksXG4gICAgZmlsZTogbm9kZS5maWxlLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICB0cmFjZXM6IG5vZGUudHJhY2VzLm1hcCgodCkgPT4gcmVsYXRpdml6ZVRyYWNlKHQsIHByZWZpeCkpLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gcmVsYXRpdml6ZU5vZGUoYywgcHJlZml4KSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVSZXN1bHQocmVzdWx0OiBSdW5SZXN1bHQsIGJhc2VQYXRoOiBzdHJpbmcpOiBSdW5SZXN1bHQge1xuICBjb25zdCBwcmVmaXggPSB0b1BhdGhQcmVmaXgoYmFzZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICByZXN1bHRzOiByZXN1bHQucmVzdWx0cy5tYXAoKG4pID0+IHJlbGF0aXZpemVOb2RlKG4sIHByZWZpeCkpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJEZXZUZXN0Um91dGVzKFxuICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgY29uZmlnOiBTb25hbXVEZXZSdW5uZXJDb25maWcsXG4gIGRlcGVuZGVuY2llcz86IERldlRlc3RSb3V0ZURlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVmaXggPSBjb25maWcucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcblxuICBjb25zdCBkZWZhdWx0TWFuYWdlciA9IGRlcGVuZGVuY2llcz8ubWFuYWdlciA9PT0gdW5kZWZpbmVkID8gbmV3IERldlZpdGVzdE1hbmFnZXIoKSA6IG51bGw7XG4gIGNvbnN0IG1hbmFnZXIgPSBkZXBlbmRlbmNpZXM/Lm1hbmFnZXIgPz8gZGVmYXVsdE1hbmFnZXI7XG4gIGlmIChtYW5hZ2VyID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBkZXBlbmRlbmN5IGlzIHVuYXZhaWxhYmxlXCIpO1xuICB9XG4gIGF3YWl0IG1hbmFnZXIuc3RhcnQoY29uZmlnLnZpdGVzdENvbmZpZ1BhdGgpO1xuICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlciA9IGRlZmF1bHRNYW5hZ2VyO1xuICB9XG5cbiAgY29uc3Qgc3NlQXZhaWxhYmxlID0gZGVwZW5kZW5jaWVzPy5zc2VBdmFpbGFibGUgPz8gISFTb25hbXUuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5zc2U7XG5cbiAgaWYgKHNzZUF2YWlsYWJsZSkge1xuICAgIHNlcnZlci5nZXQoYCR7cHJlZml4fS9ldmVudHNgLCAocmVxdWVzdCwgcmVwbHkpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNzZTogU1NFQ29ubmVjdGlvbjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPiA9IGNyZWF0ZVNTRUZhY3RvcnkoXG4gICAgICAgIHJlcXVlc3Quc29ja2V0LFxuICAgICAgICByZXBseSxcbiAgICAgICAgVGVzdEV2ZW50U2NoZW1hLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICAgIHNzZS5wdWJsaXNoKFwic25hcHNob3RcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgc2VydmVyVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAvLyBVSeuKlCBIVFRQIHN0YXR1c+yZgCDqsJnsnYAg7ZiV7YOc66W8IOq4sOuMgO2VmOuvgOuhnCBTU0Ug7Iqk64OF7IO37JeQ64+EIHNzZUF2YWlsYWJsZeydhCDtj6ztlajtlanri4jri6QuXG4gICAgICAgIHN0YXR1czogeyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzc2UucHVibGlzaChcImhlYXJ0YmVhdFwiLCB7XG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGRlcGVuZGVuY2llcz8uYXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoO1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSBUZXN0RXZlbnROYW1lU2NoZW1hLnNhZmVQYXJzZShldmVudCk7XG4gICAgICAgIGlmICghcGFyc2VkS2V5LnN1Y2Nlc3MpIHJldHVybjtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VkS2V5LmRhdGE7XG4gICAgICAgIGlmIChrZXkgPT09IFwicnVuTm9kZVByb2dyZXNzXCIpIHtcbiAgICAgICAgICBjb25zdCBwcm9ncmVzc0VudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBydW5Ob2RlUHJvZ3Jlc3M6IGRhdGEgfSk7XG4gICAgICAgICAgaWYgKCFwcm9ncmVzc0VudmVsb3BlLnN1Y2Nlc3MgfHwgcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcztcbiAgICAgICAgICBjb25zdCByZWxhdGl2aXplZCA9IHtcbiAgICAgICAgICAgIC4uLnByb2dyZXNzLFxuICAgICAgICAgICAgbm9kZTogcmVsYXRpdml6ZU5vZGUocHJvZ3Jlc3Mubm9kZSwgYmFzZVBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCByZWxhdGl2aXplZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEVudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBba2V5XTogZGF0YSB9KTtcbiAgICAgICAgaWYgKCFwYXJzZWRFbnZlbG9wZS5zdWNjZXNzIHx8IHBhcnNlZEVudmVsb3BlLmRhdGFba2V5XSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZWRFbnZlbG9wZS5kYXRhW2tleV07XG4gICAgICAgIC8vIFNBRkVUWToga2V57JmAIHBheWxvYWTripQg6rCZ7J2AIFRlc3RFdmVudFNjaGVtYSDtla3rqqnsnLzroZwg7ZWo6ruYIOqygOymneuQmOyXiOyKteuLiOuLpC5cbiAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCBwYXJzZWREYXRhIGFzIFRlc3RFdmVudHNbdHlwZW9mIGtleV0pO1xuICAgICAgfTtcbiAgICAgIG1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChoZWFydGJlYXRUaW1lcik7XG4gICAgICAgIG1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5zb2NrZXQub24oXCJjbG9zZVwiLCBjbGVhbnVwKTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXJ2ZXIucG9zdChgJHtwcmVmaXh9L3J1bmAsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgIGNvbnN0IHJ1bklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJ1blJlcXVlc3QgPSBSdW5SZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcXVlc3QuYm9keSA/PyB7fSk7XG5cbiAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blF1ZXVlZFwiLCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgIHJ1bklkLFxuICAgICAgcXVldWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlcXVlc3Q6IHJ1blJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5TdGFydGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3UmVzdWx0OiBSdW5SZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLnJ1bihydW5SZXF1ZXN0LCBydW5JZCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZWxhdGl2aXplUmVzdWx0KHJhd1Jlc3VsdCwgZGVwZW5kZW5jaWVzPy5hcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgpO1xuXG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5Db21wbGV0ZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5FcnJvcmVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHNlcnZlci5nZXQoYCR7cHJlZml4fS9zdGF0dXNgLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICByZXR1cm4geyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9O1xuICB9KTtcblxuICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyID0gbnVsbDtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBOEpBLFNBQVMsYUFBYSxVQUEwQjtDQUM5QyxPQUFPLFNBQVMsU0FBUyxHQUFHLElBQUksV0FBVyxHQUFHLFNBQVM7QUFDekQ7QUFFQSxTQUFTLGdCQUFnQixPQUF3QixRQUFpQztDQUNoRixPQUFPO0VBQUUsR0FBRztFQUFPLFVBQVUsTUFBTSxTQUFTLFFBQVEsUUFBUSxFQUFFO0NBQUU7QUFDbEU7QUFFQSxTQUFTLGVBQWUsTUFBc0IsVUFBa0M7Q0FDOUUsTUFBTSxTQUFTLGFBQWEsUUFBUTtDQUNwQyxPQUFPO0VBQ0wsR0FBRztFQUNILE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLFFBQVEsS0FBSyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7RUFDekQsVUFBVSxLQUFLLFNBQVMsS0FBSyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7Q0FDOUQ7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLFFBQW1CLFVBQTZCO0NBQ3hFLE1BQU0sU0FBUyxhQUFhLFFBQVE7Q0FDcEMsT0FBTztFQUNMLEdBQUc7RUFDSCxTQUFTLE9BQU8sUUFBUSxLQUFLLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztDQUM5RDtBQUNGO0FBRUEsZUFBc0Isc0JBQ3BCLFFBQ0EsUUFDQSxjQUNlO0NBQ2YsTUFBTSxTQUFTLE9BQU8sZUFBZTtDQUVyQyxNQUFNLGlCQUFpQixjQUFjLFlBQVksU0FBWSxJQUFJLGlCQUFpQixJQUFJO0NBQ3RGLE1BQU0sVUFBVSxjQUFjLFdBQVc7Q0FDekMsSUFBSSxZQUFZLE1BQ2QsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0NBRTlELE1BQU0sUUFBUSxNQUFNLE9BQU8sZ0JBQWdCO0NBQzNDLElBQUksbUJBQW1CLE1BQ3JCLE9BQU8sbUJBQW1CO0NBRzVCLE1BQU0sZUFBZSxjQUFjLGdCQUFnQixDQUFDLENBQUMsT0FBTyxPQUFPLE9BQU8sU0FBUztDQUVuRixJQUFJLGNBQ0YsT0FBTyxJQUFJLEdBQUcsT0FBTyxXQUFXLFNBQVMsVUFBZ0I7RUFDdkQsTUFBTSxNQUE2QyxpQkFDakQsUUFBUSxRQUNSLE9BQ0EsZUFDRjtFQUVBLE1BQU0sU0FBd0IsUUFBUSxVQUFVO0VBQ2hELElBQUksUUFBUSxZQUFZO0dBQ3RCLGVBQWU7R0FDZiw2QkFBWSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FFbkMsUUFBUTtJQUFFLEdBQUc7SUFBUTtHQUFhO0VBQ3BDLENBQUM7RUFFRCxNQUFNLGlCQUFpQixrQkFBa0I7R0FDdkMsSUFBSSxRQUFRLGFBQWE7SUFDdkIsZUFBZTtJQUNmLHFCQUFJLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUM3QixDQUFDO0VBQ0gsR0FBRyxxQkFBcUI7RUFFeEIsTUFBTSxXQUFXLGNBQWMsZUFBZSxPQUFPO0VBQ3JELE1BQU0sWUFBWSxPQUFlLFNBQTJCO0dBQzFELE1BQU0sWUFBWSxvQkFBb0IsVUFBVSxLQUFLO0dBQ3JELElBQUksQ0FBQyxVQUFVLFNBQVM7R0FDeEIsTUFBTSxNQUFNLFVBQVU7R0FDdEIsSUFBSSxRQUFRLG1CQUFtQjtJQUM3QixNQUFNLG1CQUFtQixnQkFBZ0IsUUFBUSxDQUFDLENBQUMsVUFBVSxFQUFFLGlCQUFpQixLQUFLLENBQUM7SUFDdEYsSUFBSSxDQUFDLGlCQUFpQixXQUFXLGlCQUFpQixLQUFLLG9CQUFvQixRQUN6RTtJQUVGLE1BQU0sV0FBVyxpQkFBaUIsS0FBSztJQUN2QyxNQUFNLGNBQWM7S0FDbEIsR0FBRztLQUNILE1BQU0sZUFBZSxTQUFTLE1BQU0sUUFBUTtJQUM5QztJQUNBLElBQUksUUFBUSxLQUFLLFdBQVc7SUFDNUI7R0FDRjtHQUNBLE1BQU0saUJBQWlCLGdCQUFnQixRQUFRLENBQUMsQ0FBQyxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQUM7R0FDMUUsSUFBSSxDQUFDLGVBQWUsV0FBVyxlQUFlLEtBQUssU0FBUyxRQUFXO0dBQ3ZFLE1BQU0sYUFBYSxlQUFlLEtBQUs7R0FFdkMsSUFBSSxRQUFRLEtBQUssVUFBb0M7RUFDdkQ7RUFDQSxRQUFRLGlCQUFpQixRQUFRO0VBRWpDLElBQUksVUFBVTtFQUNkLE1BQU0sZ0JBQWdCO0dBQ3BCLElBQUksU0FBUztHQUNiLFVBQVU7R0FDVixjQUFjLGNBQWM7R0FDNUIsUUFBUSxvQkFBb0IsUUFBUTtFQUN0QztFQUNBLFFBQVEsT0FBTyxHQUFHLFNBQVMsT0FBTztFQUNsQyxRQUFRLE9BQU8sR0FBRyxTQUFTLE9BQU87Q0FDcEMsQ0FBQztDQUdILE9BQU8sS0FBSyxHQUFHLE9BQU8sT0FBTyxPQUFPLFNBQVMsVUFBVTtFQUNyRCxNQUFNLFFBQVEsV0FBVztFQUN6QixNQUFNLGFBQWEsaUJBQWlCLE1BQU0sUUFBUSxRQUFRLENBQUMsQ0FBQztFQUU1RCxRQUFRLFVBQVUsYUFBYTtHQUM3QixlQUFlO0dBQ2Y7R0FDQSwyQkFBVSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDakMsU0FBUztFQUNYLENBQUM7RUFFRCxJQUFJO0dBQ0YsTUFBTSw2QkFBWSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDekMsUUFBUSxVQUFVLGNBQWM7SUFDOUIsZUFBZTtJQUNmO0lBQ0E7R0FDRixDQUFDO0dBR0QsTUFBTSxTQUFTLGlCQUFpQixNQURHLFFBQVEsSUFBSSxZQUFZLEtBQUssR0FDckIsY0FBYyxlQUFlLE9BQU8sV0FBVztHQUUxRixNQUFNLDhCQUFhLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUMxQyxRQUFRLFVBQVUsZ0JBQWdCO0lBQ2hDLGVBQWU7SUFDZjtJQUNBO0lBQ0E7SUFDQTtHQUNGLENBQUM7R0FFRCxPQUFPO0VBQ1QsU0FBUyxLQUFLO0dBQ1osTUFBTSw4QkFBYSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDMUMsUUFBUSxVQUFVLGNBQWM7SUFDOUIsZUFBZTtJQUNmO0lBQ0E7SUFDQSxPQUFPO0tBQ0wsU0FBUyxlQUFlLFFBQVEsSUFBSSxVQUFVLE9BQU8sR0FBRztLQUN4RCxPQUFPLGVBQWUsUUFBUSxJQUFJLFFBQVE7SUFDNUM7R0FDRixDQUFDO0dBRUQsTUFBTSxPQUFPLEdBQUc7R0FDaEIsT0FBTztJQUFFLElBQUk7SUFBTyxPQUFPLGVBQWUsUUFBUSxJQUFJLFVBQVUsT0FBTyxHQUFHO0dBQUU7RUFDOUU7Q0FDRixDQUFDO0NBRUQsT0FBTyxJQUFJLEdBQUcsT0FBTyxVQUFVLFlBQVk7RUFFekMsT0FBTztHQUFFLEdBRHFCLFFBQVEsVUFDMUI7R0FBUTtFQUFhO0NBQ25DLENBQUM7Q0FFRCxPQUFPLFFBQVEsV0FBVyxZQUFZO0VBQ3BDLE1BQU0sUUFBUSxTQUFTO0VBQ3ZCLElBQUksbUJBQW1CLE1BQ3JCLE9BQU8sbUJBQW1CO0NBRTlCLENBQUM7QUFDSDs7O0NBL1RzQyxZQUFBO0NBRVUsU0FBQTtDQVFPLHdCQUFBO0NBRWpELGlCQUFpQjtDQUNqQix3QkFBd0I7Q0FtQnhCLHdCQUF3QixFQUFFLE9BQU87RUFDckMsS0FBSyxFQUFFLE9BQU87RUFDZCxPQUFPLEVBQUUsUUFBUTtFQUNqQixVQUFVLEVBQUUsT0FBTztFQUNuQixZQUFZLEVBQUUsT0FBTztFQUNyQixJQUFJLEVBQUUsT0FBTztDQUNmLENBQUM7Q0FFSyx1QkFBa0QsRUFBRSxXQUN4RCxFQUFFLE9BQU87RUFDUCxJQUFJLEVBQUUsT0FBTztFQUNiLE1BQU0sRUFBRSxLQUFLO0dBQUM7R0FBUTtHQUFTO0VBQU0sQ0FBQztFQUN0QyxNQUFNLEVBQUUsT0FBTztFQUNmLFVBQVUsRUFBRSxPQUFPO0VBQ25CLE1BQU0sRUFBRSxPQUFPO0VBQ2YsT0FBTyxFQUFFLEtBQUs7R0FBQztHQUFVO0dBQVU7R0FBVztHQUFRO0dBQVc7RUFBUyxDQUFDO0VBQzNFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0VBQ2hDLFFBQVEsRUFBRSxPQUFPO0dBQ2YsT0FBTyxFQUFFLE9BQU87R0FDaEIsUUFBUSxFQUFFLE9BQU87R0FDakIsUUFBUSxFQUFFLE9BQU87R0FDakIsU0FBUyxFQUFFLE9BQU87RUFDcEIsQ0FBQztFQUNELE9BQU8sRUFDSixPQUFPO0dBQ04sU0FBUyxFQUFFLE9BQU87R0FDbEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7RUFDN0IsQ0FBQyxDQUFDLENBQ0QsU0FBUztFQUNaLFFBQVEsRUFBRSxNQUFNLHFCQUFxQjtFQUNyQyxVQUFVLEVBQUUsTUFBTSxvQkFBb0I7Q0FDeEMsQ0FBQyxDQUNIO0NBRU0sa0JBQXdDLEVBQUUsT0FBTztFQUNyRCxJQUFJLEVBQUUsUUFBUTtFQUNkLFNBQVMsRUFBRSxPQUFPO0dBQ2hCLE9BQU8sRUFBRSxPQUFPO0dBQ2hCLFFBQVEsRUFBRSxPQUFPO0dBQ2pCLFFBQVEsRUFBRSxPQUFPO0dBQ2pCLFNBQVMsRUFBRSxPQUFPO0dBQ2xCLFlBQVksRUFBRSxPQUFPO0VBQ3ZCLENBQUM7RUFDRCxTQUFTLEVBQUUsTUFBTSxvQkFBb0I7Q0FDdkMsQ0FBQztDQUNLLG1CQUFtQixFQUFFLE9BQU87RUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7RUFDcEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDL0IsQ0FBQztDQUVLLGtCQUFrQixFQUFFLE9BQU87RUFDL0IsVUFBVSxFQUFFLE9BQU87R0FDakIsZUFBZSxFQUFFLE9BQU87R0FDeEIsWUFBWSxFQUFFLE9BQU87R0FDckIsUUFBUSxFQUFFLE9BQU87SUFDZixPQUFPLEVBQUUsUUFBUTtJQUNqQixTQUFTLEVBQUUsUUFBUTtJQUNuQixXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztJQUMvQixjQUFjLEVBQUUsUUFBUTtHQUMxQixDQUFDO0VBQ0gsQ0FBQztFQUNELFdBQVcsRUFBRSxPQUFPO0dBQ2xCLGVBQWUsRUFBRSxPQUFPO0dBQ3hCLE9BQU8sRUFBRSxPQUFPO0dBQ2hCLFVBQVUsRUFBRSxPQUFPO0dBQ25CLFNBQVMsRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO0lBQ3BDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0dBQy9CLENBQUM7RUFDSCxDQUFDO0VBQ0QsWUFBWSxFQUFFLE9BQU87R0FDbkIsZUFBZSxFQUFFLE9BQU87R0FDeEIsT0FBTyxFQUFFLE9BQU87R0FDaEIsV0FBVyxFQUFFLE9BQU87RUFDdEIsQ0FBQztFQUNELGNBQWMsRUFBRSxPQUFPO0dBQ3JCLGVBQWUsRUFBRSxPQUFPO0dBQ3hCLE9BQU8sRUFBRSxPQUFPO0dBQ2hCLFdBQVcsRUFBRSxPQUFPO0dBQ3BCLFlBQVksRUFBRSxPQUFPO0dBQ3JCLFFBQVE7RUFDVixDQUFDO0VBQ0QsWUFBWSxFQUFFLE9BQU87R0FDbkIsZUFBZSxFQUFFLE9BQU87R0FDeEIsT0FBTyxFQUFFLE9BQU87R0FDaEIsWUFBWSxFQUFFLE9BQU87R0FDckIsT0FBTyxFQUFFLE9BQU87SUFDZCxTQUFTLEVBQUUsT0FBTztJQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztHQUM3QixDQUFDO0VBQ0gsQ0FBQztFQUNELGlCQUFpQixFQUFFLE9BQU87R0FDeEIsZUFBZSxFQUFFLFFBQVEsQ0FBQztHQUMxQixPQUFPLEVBQUUsT0FBTztHQUNoQixXQUFXLEVBQUUsT0FBTztHQUNwQixJQUFJLEVBQUUsT0FBTztHQUNiLE1BQU0sRUFBRSxLQUFLO0lBQUM7SUFBUTtJQUFTO0dBQU0sQ0FBQztHQUN0QyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsUUFBUSxDQUFDO0dBQ2pDLFFBQVEsRUFBRSxPQUFPO0dBQ2pCLFFBQVEsRUFBRSxPQUFPO0dBQ2pCLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0dBQzlCLE1BQU07RUFDUixDQUFDO0VBQ0QsV0FBVyxFQUFFLE9BQU87R0FDbEIsZUFBZSxFQUFFLE9BQU87R0FDeEIsSUFBSSxFQUFFLE9BQU87RUFDZixDQUFDO0NBQ0gsQ0FBQztDQUdLLHNCQUFzQixFQUFFLEtBQUs7RUFDakM7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Q0FDRixDQUFDIn0=
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { z } from "zod";
3
- //#region src/testing/dev-vitest-manager.ts
3
+ // src/testing/dev-vitest-manager.ts
4
4
  function mapModuleState(state) {
5
5
  switch (state) {
6
6
  case "passed": return "passed";
@@ -94,11 +94,7 @@ function getResultCompletenessScore(node) {
94
94
  case "todo":
95
95
  score += 2;
96
96
  break;
97
- case "running":
98
- score += 1;
99
- break;
100
- case "unknown": break;
101
- default: break;
97
+ case "running": score += 1;
102
98
  }
103
99
  return score;
104
100
  }
@@ -287,25 +283,33 @@ var init_dev_vitest_manager = __esmMin((() => {
287
283
  const ctx = this.currentRunContext;
288
284
  if (!ctx || !ctx.specModuleIds.has(testSuite.module.moduleId)) return;
289
285
  const fileId = testSuite.module.moduleId;
290
- emitProgress("suite", "ready", fileId, `${fileId}::${testSuite.fullName}`, this.resolveSuiteParentId(testSuite), this.buildSuiteProgressNode(testSuite, "ready"));
286
+ const nodeId = `${fileId}::${testSuite.fullName}`;
287
+ const parentId = this.resolveSuiteParentId(testSuite);
288
+ emitProgress("suite", "ready", fileId, nodeId, parentId, this.buildSuiteProgressNode(testSuite, "ready"));
291
289
  },
292
290
  onTestSuiteResult: (testSuite) => {
293
291
  const ctx = this.currentRunContext;
294
292
  if (!ctx || !ctx.specModuleIds.has(testSuite.module.moduleId)) return;
295
293
  const fileId = testSuite.module.moduleId;
296
- emitProgress("suite", "result", fileId, `${fileId}::${testSuite.fullName}`, this.resolveSuiteParentId(testSuite), this.buildSuiteNode(testSuite, fileId));
294
+ const nodeId = `${fileId}::${testSuite.fullName}`;
295
+ const parentId = this.resolveSuiteParentId(testSuite);
296
+ emitProgress("suite", "result", fileId, nodeId, parentId, this.buildSuiteNode(testSuite, fileId));
297
297
  },
298
298
  onTestCaseReady: (testCase) => {
299
299
  const ctx = this.currentRunContext;
300
300
  if (!ctx || !ctx.specModuleIds.has(testCase.module.moduleId)) return;
301
301
  const fileId = testCase.module.moduleId;
302
- emitProgress("test", "ready", fileId, `${fileId}::${testCase.fullName}`, this.resolveTestParentId(testCase), this.buildTestProgressNode(testCase, "ready"));
302
+ const nodeId = `${fileId}::${testCase.fullName}`;
303
+ const parentId = this.resolveTestParentId(testCase);
304
+ emitProgress("test", "ready", fileId, nodeId, parentId, this.buildTestProgressNode(testCase, "ready"));
303
305
  },
304
306
  onTestCaseResult: (testCase) => {
305
307
  const ctx = this.currentRunContext;
306
308
  if (!ctx || !ctx.specModuleIds.has(testCase.module.moduleId)) return;
307
309
  const fileId = testCase.module.moduleId;
308
- emitProgress("test", "result", fileId, `${fileId}::${testCase.fullName}`, this.resolveTestParentId(testCase), this.buildTestNode(testCase, fileId));
310
+ const nodeId = `${fileId}::${testCase.fullName}`;
311
+ const parentId = this.resolveTestParentId(testCase);
312
+ emitProgress("test", "result", fileId, nodeId, parentId, this.buildTestNode(testCase, fileId));
309
313
  }
310
314
  };
311
315
  }
@@ -487,8 +491,7 @@ var init_dev_vitest_manager = __esmMin((() => {
487
491
  at: z.string()
488
492
  });
489
493
  }));
490
- //#endregion
491
494
  init_dev_vitest_manager();
492
495
  export { DevVitestManager, init_dev_vitest_manager };
493
496
 
494
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXZpdGVzdC1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlPcHRpb25zLFxuICB0eXBlIFJlcG9ydGVyLFxuICB0eXBlIFRlc3RDYXNlLFxuICB0eXBlIFRlc3RNb2R1bGUsXG4gIHR5cGUgVGVzdFJ1blJlc3VsdCxcbiAgdHlwZSBUZXN0U3BlY2lmaWNhdGlvbixcbiAgdHlwZSBUZXN0U3VpdGUsXG4gIHR5cGUgVml0ZXN0LFxufSBmcm9tIFwidml0ZXN0L25vZGVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5cbi8vIO2FjOyKpO2KuCDtlZwg6rG07J2YIHRyYWNlIOuqqOydjFxuZXhwb3J0IHR5cGUgVGVzdE5vZGVLaW5kID0gXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIjtcbmV4cG9ydCB0eXBlIFRlc3RTdGF0ZSA9IFwicGFzc2VkXCIgfCBcImZhaWxlZFwiIHwgXCJza2lwcGVkXCIgfCBcInRvZG9cIiB8IFwicnVubmluZ1wiIHwgXCJ1bmtub3duXCI7XG5cbmV4cG9ydCB0eXBlIFRlc3RDYXNlUmVzdWx0ID0ge1xuICBpZDogc3RyaW5nO1xuICBraW5kOiBUZXN0Tm9kZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgZnVsbE5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzdGF0ZTogVGVzdFN0YXRlO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICBjb3VudHM6IFRlc3RDb3VudHM7XG4gIGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmcgfSB8IG51bGw7XG4gIHRyYWNlczogU2VyaWFsaXplZFRyYWNlW107XG4gIGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgVGVzdENvdW50cyA9IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5SZXN1bHQgPSB7XG4gIG9rOiBib29sZWFuO1xuICBzdW1tYXJ5OiB7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwYXNzZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBza2lwcGVkOiBudW1iZXI7XG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xuICB9O1xuICByZXN1bHRzOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlclN0YXR1cyA9IHtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJ1bm5pbmc6IGJvb2xlYW47XG4gIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRlc3RFdmVudFBheWxvYWQgPVxuICB8IHsgc2NoZW1hVmVyc2lvbjogbnVtYmVyOyBydW5JZDogc3RyaW5nOyBxdWV1ZWRBdDogc3RyaW5nOyByZXF1ZXN0OiBSdW5SZXF1ZXN0IH1cbiAgfCB7IHNjaGVtYVZlcnNpb246IG51bWJlcjsgcnVuSWQ6IHN0cmluZzsgc3RhcnRlZEF0OiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIHNjaGVtYVZlcnNpb246IG51bWJlcjtcbiAgICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgICBzdGFydGVkQXQ6IHN0cmluZztcbiAgICAgIGZpbmlzaGVkQXQ6IHN0cmluZztcbiAgICAgIHJlc3VsdDogUnVuUmVzdWx0O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gICAgICBydW5JZDogc3RyaW5nO1xuICAgICAgZmluaXNoZWRBdDogc3RyaW5nO1xuICAgICAgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiAxO1xuICAgICAgcnVuSWQ6IHN0cmluZztcbiAgICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgICAgYXQ6IHN0cmluZztcbiAgICAgIGtpbmQ6IFRlc3ROb2RlS2luZDtcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiO1xuICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQ7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUnVuUmVxdWVzdCA9IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVGVzdEV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4gdm9pZDtcblxudHlwZSBRdWV1ZUVudHJ5ID0ge1xuICBydW5JZDogc3RyaW5nO1xuICB0YXNrOiAoKSA9PiBQcm9taXNlPFJ1blJlc3VsdD47XG4gIHJlc29sdmU6IChyZXN1bHQ6IFJ1blJlc3VsdCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlZFZpdGVzdCA9IFBpY2s8XG4gIFZpdGVzdCxcbiAgfCBcInN0YW5kYWxvbmVcIlxuICB8IFwiY2xvc2VcIlxuICB8IFwib25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvblwiXG4gIHwgXCJpbnZhbGlkYXRlRmlsZVwiXG4gIHwgXCJnbG9iVGVzdFNwZWNpZmljYXRpb25zXCJcbiAgfCBcInJ1blRlc3RTcGVjaWZpY2F0aW9uc1wiXG4gIHwgXCJzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuICB8IFwicmVzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2Vml0ZXN0RmFjdG9yeSA9IChcbiAgbW9kZTogXCJ0ZXN0XCIsXG4gIG9wdGlvbnM6IENsaU9wdGlvbnMsXG4gIHZpdGVPdmVycmlkZXM6IFZpdGVVc2VyQ29uZmlnLFxuKSA9PiBQcm9taXNlPE1hbmFnZWRWaXRlc3Q+O1xuXG5leHBvcnQgY2xhc3MgRGV2Vml0ZXN0TWFuYWdlciB7XG4gIHByaXZhdGUgdml0ZXN0OiBNYW5hZ2VkVml0ZXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIHByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVycyA9IG5ldyBTZXQ8VGVzdEV2ZW50TGlzdGVuZXI+KCk7XG4gIHByaXZhdGUgY3VycmVudFJ1bkNvbnRleHQ6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgIHNwZWNNb2R1bGVJZHM6IFNldDxzdHJpbmc+O1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aXRlc3RGYWN0b3J5PzogRGV2Vml0ZXN0RmFjdG9yeSkge31cblxuICBhZGRFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBUZXN0RXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IFRlc3RFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBzdHJpbmcsIGRhdGE6IFRlc3RFdmVudFBheWxvYWQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGV2ZW50LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCh2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J2066+4IOyLnOyekeuQnCDqsr3smrAg7KSR67O1IOy0iOq4sO2ZlOulvCDrsKnsp4BcbiAgICBpZiAodGhpcy52aXRlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVWaXRlc3QgPVxuICAgICAgdGhpcy52aXRlc3RGYWN0b3J5ID8/XG4gICAgICAoYXN5bmMgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RGV2Vml0ZXN0RmFjdG9yeT4pID0+IHtcbiAgICAgICAgY29uc3Qgdml0ZXN0TW9kdWxlID0gYXdhaXQgaW1wb3J0KFwidml0ZXN0L25vZGVcIik7XG4gICAgICAgIHJldHVybiB2aXRlc3RNb2R1bGUuY3JlYXRlVml0ZXN0KC4uLmFyZ3MpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCB2aXRlT3ZlcnJpZGVzOiBWaXRlVXNlckNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogeyB3YXRjaDogbnVsbCB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjbGlPcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgICAgZm9yY2VSZXJ1blRyaWdnZXJzOiBbXSxcbiAgICAgIGNvbmZpZzogdml0ZXN0Q29uZmlnUGF0aCxcbiAgICAgIGVudjoge1xuICAgICAgICBOT0RFX0VOVjogXCJ0ZXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZWFsdGltZVJlcG9ydGVyID0gdGhpcy5jcmVhdGVSZWFsdGltZVByb2dyZXNzUmVwb3J0ZXIoKTtcbiAgICB2aXRlT3ZlcnJpZGVzLnBsdWdpbnMgPSBbXG4gICAgICAuLi4odml0ZU92ZXJyaWRlcy5wbHVnaW5zID8/IFtdKSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUtcmVhbHRpbWUtcmVwb3J0ZXJcIixcbiAgICAgICAgY29uZmlndXJlVml0ZXN0KHsgdml0ZXN0OiB2aXRlc3RJbnN0YW5jZSB9OiB7IHZpdGVzdDogVml0ZXN0IH0pIHtcbiAgICAgICAgICBjb25zdCByZXBvcnRlcnMgPSB2aXRlc3RJbnN0YW5jZS5jb25maWcucmVwb3J0ZXJzO1xuICAgICAgICAgIGlmICghcmVwb3J0ZXJzLmluY2x1ZGVzKHJlYWx0aW1lUmVwb3J0ZXIpKSB7XG4gICAgICAgICAgICByZXBvcnRlcnMucHVzaChyZWFsdGltZVJlcG9ydGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB2aXRlc3QgPSBhd2FpdCBjcmVhdGVWaXRlc3QoXCJ0ZXN0XCIsIGNsaU9wdGlvbnMsIHZpdGVPdmVycmlkZXMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB2aXRlc3Quc3RhbmRhbG9uZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdml0ZXN0LmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy52aXRlc3QgPSB2aXRlc3Q7XG4gICAgdGhpcy52aXRlc3Qub25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbigoX3NwZWMpID0+IGZhbHNlKTtcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdHM6IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9LCBydW5JZDogc3RyaW5nKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXRlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgbm90IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJ1blJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHRoaXMuZXhlY3V0ZVJ1bihvcHRzLCBydW5JZCk7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goeyBydW5JZCwgdGFzaywgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXR1cygpOiBNYW5hZ2VyU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHRoaXMudml0ZXN0ICE9PSBudWxsICYmICF0aGlzLmNsb3NlZCxcbiAgICAgIHJ1bm5pbmc6IHRoaXMucnVubmluZyxcbiAgICAgIGxhc3RSdW5BdDogdGhpcy5sYXN0UnVuQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrs4Dqsr3rkJwg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7IScIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICogaG1yQW5kU3luY+yXkOyEnCDtmLjstpzrkJjslrQg64uk7J2MIO2FjOyKpO2KuCDsi6Ttlokg7IucIOy1nOyLoCDsvZTrk5zrpbwg7IKs7Jqp7ZWY64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGludmFsaWRhdGVGaWxlcyhmaWxlUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpdGVzdCB8fCB0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgdGhpcy52aXRlc3QuaW52YWxpZGF0ZUZpbGUoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAvLyDtgZDsl5Ag64Ko7J2AIOyekeyXheuTpOydhCByZWplY3TtlZjsl6wg7Zi47Lac7J6Q6rCAIOyYgeq1rCDrjIDquLDtlZjsp4Ag7JWK64+E66GdIOygleumrFxuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnJlamVjdChuZXcgRXJyb3IoXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIGJlaW5nIHNodXQgZG93blwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5jbGVhcigpO1xuXG4gICAgaWYgKHRoaXMudml0ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVzdC5jbG9zZSgpO1xuICAgICAgdGhpcy52aXRlc3QgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoIWVudHJ5KSBicmVhaztcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgZW50cnkucmVqZWN0KG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIikpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeS50YXNrKCk7XG4gICAgICAgICAgZW50cnkucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlbnRyeS5yZWplY3QoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSdW4oXG4gICAgb3B0czogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0sXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBjb25zdCB2aXRlc3QgPSB0aGlzLnZpdGVzdDtcbiAgICBpZiAoIXZpdGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBpcyBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAob3B0cy5wYXR0ZXJuKSB7XG4gICAgICB2aXRlc3Quc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKG9wdHMucGF0dGVybik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNzOiBUZXN0U3BlY2lmaWNhdGlvbltdID0gb3B0cy5maWxlc1xuICAgICAgICA/IGF3YWl0IHZpdGVzdC5nbG9iVGVzdFNwZWNpZmljYXRpb25zKG9wdHMuZmlsZXMpXG4gICAgICAgIDogYXdhaXQgdml0ZXN0Lmdsb2JUZXN0U3BlY2lmaWNhdGlvbnMoKTtcblxuICAgICAgY29uc3Qgc3BlY01vZHVsZUlkcyA9IG5ldyBTZXQoc3BlY3MubWFwKChzKSA9PiBzLm1vZHVsZUlkKSk7XG4gICAgICAvLyByb3V0ZXPsl5DshJwg7IOd7ISx7ZWcIHJ1bklk66W8IOq3uOuMgOuhnCDsgqzsmqntlZjsl6wgcnVuU3RhcnRlZC9ydW5Ob2RlUHJvZ3Jlc3MvcnVuQ29tcGxldGVkIOqwhCDsnbzqtIDshLEg67O07J6lXG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0ge1xuICAgICAgICBydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNwZWNNb2R1bGVJZHMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhbGxUZXN0c1J1biA9ICFvcHRzLmZpbGVzIHx8IG9wdHMuZmlsZXMubGVuZ3RoID09PSAwO1xuICAgICAgY29uc3QgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0ID0gYXdhaXQgdml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9ucyhzcGVjcywgYWxsVGVzdHNSdW4pO1xuXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMubGFzdFJ1bkF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyhydW5SZXN1bHQsIGR1cmF0aW9uTXMsIHNwZWNNb2R1bGVJZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnBhdHRlcm4pIHtcbiAgICAgICAgdml0ZXN0LnJlc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlYWx0aW1lUHJvZ3Jlc3NSZXBvcnRlcigpOiBSZXBvcnRlciB7XG4gICAgY29uc3QgZW1pdFByb2dyZXNzID0gKFxuICAgICAga2luZDogXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIixcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiLFxuICAgICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgICBub2RlSWQ6IHN0cmluZyxcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KFwicnVuTm9kZVByb2dyZXNzXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBjdHguc3RhcnRlZEF0LFxuICAgICAgICBhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBraW5kLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgZmlsZUlkLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIHBhcmVudElkLFxuICAgICAgICBub2RlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBvblRlc3RNb2R1bGVRdWV1ZWQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwiZmlsZVwiLFxuICAgICAgICAgIFwicmVhZHlcIixcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdGhpcy5idWlsZEZpbGVQcm9ncmVzc05vZGUodGVzdE1vZHVsZSwgXCJyZWFkeVwiKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RNb2R1bGVFbmQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFwiZmlsZVwiLCBcInJlc3VsdFwiLCBmaWxlSWQsIGZpbGVJZCwgbnVsbCwgdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RTdWl0ZVJlYWR5OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlYWR5XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlLCBcInJlYWR5XCIpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uVGVzdFN1aXRlUmVzdWx0OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlc3VsdFwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFN1aXRlTm9kZSh0ZXN0U3VpdGUsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlYWR5OiAodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdENhc2UubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgICAgIGNvbnN0IG5vZGVJZCA9IGAke2ZpbGVJZH06OiR7dGVzdENhc2UuZnVsbE5hbWV9YDtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVUZXN0UGFyZW50SWQodGVzdENhc2UpO1xuICAgICAgICBlbWl0UHJvZ3Jlc3MoXG4gICAgICAgICAgXCJ0ZXN0XCIsXG4gICAgICAgICAgXCJyZWFkeVwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2UsIFwicmVhZHlcIiksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlc3VsdDogKHRlc3RDYXNlOiBUZXN0Q2FzZSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgICBpZiAoIWN0eCB8fCAhY3R4LnNwZWNNb2R1bGVJZHMuaGFzKHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdENhc2UubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWA7XG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5yZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwidGVzdFwiLFxuICAgICAgICAgIFwicmVzdWx0XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVzdE5vZGUodGVzdENhc2UsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmlsZVByb2dyZXNzTm9kZSh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBraW5kOiBcImZpbGVcIixcbiAgICAgIG5hbWU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBmdWxsTmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZpbGU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAwLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlOiBUZXN0U3VpdGUsIF9waGFzZTogXCJyZWFkeVwiKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IGZpbGVJZCA9IHRlc3RTdWl0ZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogdGVzdFN1aXRlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdFN1aXRlLmZ1bGxOYW1lLFxuICAgICAgZmlsZTogZmlsZUlkLFxuICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgZHVyYXRpb25NczogbnVsbCxcbiAgICAgIGNvdW50czogeyB0b3RhbDogMCwgcGFzc2VkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDAgfSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdHJhY2VzOiBbXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2U6IFRlc3RDYXNlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlOiBmaWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdWl0ZVBhcmVudElkKHRlc3RTdWl0ZTogVGVzdFN1aXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0ZXN0U3VpdGUucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdFN1aXRlLm1vZHVsZS5tb2R1bGVJZH06OiR7cGFyZW50LmZ1bGxOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlOiBUZXN0Q2FzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW50ID0gdGVzdENhc2UucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdENhc2UubW9kdWxlLm1vZHVsZUlkfTo6JHtwYXJlbnQuZnVsbE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdFJlc3VsdHMoXG4gICAgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0LFxuICAgIGR1cmF0aW9uTXM6IG51bWJlcixcbiAgICBzcGVjTW9kdWxlSWRzOiBTZXQ8c3RyaW5nPixcbiAgKTogUnVuUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFRlc3RDYXNlUmVzdWx0PigpO1xuXG4gICAgZm9yIChjb25zdCB0ZXN0TW9kdWxlIG9mIHJ1blJlc3VsdC50ZXN0TW9kdWxlcykge1xuICAgICAgaWYgKCFzcGVjTW9kdWxlSWRzLmhhcyh0ZXN0TW9kdWxlLm1vZHVsZUlkKSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpO1xuICAgICAgY29uc3QgZXhpc3RpbmdSZXN1bHQgPSByZXN1bHRzQnlGaWxlLmdldChuZXh0UmVzdWx0LmlkKTtcblxuICAgICAgaWYgKCFleGlzdGluZ1Jlc3VsdCkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShleGlzdGluZ1Jlc3VsdCk7XG4gICAgICBjb25zdCBuZXh0U2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShuZXh0UmVzdWx0KTtcbiAgICAgIGlmIChuZXh0U2NvcmUgPj0gZXhpc3RpbmdTY29yZSkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbShyZXN1bHRzQnlGaWxlLnZhbHVlcygpKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYWdncmVnYXRlQ291bnRzKHJlc3VsdHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBzdW1tYXJ5LmZhaWxlZCA9PT0gMCxcbiAgICAgIHN1bW1hcnk6IHsgLi4uc3VtbWFyeSwgZHVyYXRpb25NcyB9LFxuICAgICAgcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZpbGVOb2RlKHRlc3RNb2R1bGU6IFRlc3RNb2R1bGUpOiBUZXN0Q2FzZVJlc3VsdCB7XG4gICAgY29uc3QgZmlsZSA9IHRlc3RNb2R1bGUubW9kdWxlSWQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmJ1aWxkQ2hpbGROb2Rlcyh0ZXN0TW9kdWxlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IG1vZHVsZVN0YXRlID0gdGVzdE1vZHVsZS5zdGF0ZSgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0TW9kdWxlLmRpYWdub3N0aWMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGtpbmQ6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZ1bGxOYW1lOiB0ZXN0TW9kdWxlLm1vZHVsZUlkLFxuICAgICAgZmlsZSxcbiAgICAgIHN0YXRlOiBtYXBNb2R1bGVTdGF0ZShtb2R1bGVTdGF0ZSksXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljLmR1cmF0aW9uID4gMCA/IGRpYWdub3N0aWMuZHVyYXRpb24gOiBudWxsLFxuICAgICAgY291bnRzLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGlsZE5vZGVzKHBhcmVudDogVGVzdE1vZHVsZSB8IFRlc3RTdWl0ZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSBcInN1aXRlXCIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFN1aXRlTm9kZShjaGlsZCwgZmlsZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFRlc3ROb2RlKGNoaWxkLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVOb2RlKHN1aXRlOiBUZXN0U3VpdGUsIGZpbGU6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuYnVpbGRDaGlsZE5vZGVzKHN1aXRlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IHN1aXRlU3RhdGUgPSBzdWl0ZS5zdGF0ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlfTo6JHtzdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogc3VpdGUubmFtZSxcbiAgICAgIGZ1bGxOYW1lOiBzdWl0ZS5mdWxsTmFtZSxcbiAgICAgIGZpbGUsXG4gICAgICBzdGF0ZTogbWFwU3VpdGVTdGF0ZShzdWl0ZVN0YXRlKSxcbiAgICAgIGR1cmF0aW9uTXM6IG51bGwsXG4gICAgICBjb3VudHMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRyYWNlczogW10sXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3ROb2RlKHRlc3RDYXNlOiBUZXN0Q2FzZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RDYXNlLnJlc3VsdCgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0Q2FzZS5kaWFnbm9zdGljKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBtYXBUZXN0UmVzdWx0KHJlc3VsdCwgdGVzdENhc2Uub3B0aW9ucy5tb2RlKTtcblxuICAgIGxldCBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAocmVzdWx0LnN0YXRlID09PSBcImZhaWxlZFwiICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdC5lcnJvcnNbMF07XG4gICAgICBlcnJvciA9IHtcbiAgICAgICAgbWVzc2FnZTogZmlyc3RFcnJvci5tZXNzYWdlID8/IFN0cmluZyhmaXJzdEVycm9yKSxcbiAgICAgICAgc3RhY2s6IGZpcnN0RXJyb3Iuc3RhY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHRlc3RDYXNlLm1ldGEoKS50cmFjZXM7XG4gICAgbGV0IHRyYWNlczogU2VyaWFsaXplZFRyYWNlW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFjZXMgPSBwYXJzZVNlcmlhbGl6ZWRUcmFjZXMocmF3KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke2ZpbGV9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlLFxuICAgICAgc3RhdGUsXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljID8gZGlhZ25vc3RpYy5kdXJhdGlvbiA6IG51bGwsXG4gICAgICBjb3VudHM6IGNvdW50RnJvbVN0YXRlKHN0YXRlKSxcbiAgICAgIGVycm9yLFxuICAgICAgdHJhY2VzLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9kdWxlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIiB8IFwicXVldWVkXCIpOiBUZXN0U3RhdGUge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIFwicGFzc2VkXCI7XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICAgIHJldHVybiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgIGNhc2UgXCJxdWV1ZWRcIjpcbiAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcFN1aXRlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIik6IFRlc3RTdGF0ZSB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIFwic2tpcHBlZFwiO1xuICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICByZXR1cm4gXCJydW5uaW5nXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUZXN0UmVzdWx0KFxuICByZXN1bHQ6IFJldHVyblR5cGU8VGVzdENhc2VbXCJyZXN1bHRcIl0+LFxuICBtb2RlOiBcInJ1blwiIHwgXCJvbmx5XCIgfCBcInNraXBcIiB8IFwidG9kb1wiLFxuKTogVGVzdFN0YXRlIHtcbiAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIG1vZGUgPT09IFwidG9kb1wiID8gXCJ0b2RvXCIgOiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRGcm9tU3RhdGUoc3RhdGU6IFRlc3RTdGF0ZSk6IFRlc3RDb3VudHMge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMSwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAxLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICBjYXNlIFwidG9kb1wiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAxIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJ1bm5pbmcvdW5rbm93biDsg4Htg5zrj4QgdG90YWzsl5Ag7Y+s7ZWo7ZWY7JesIO2MjOydvCDrhbjrk5wgY291bnRzLnRvdGFs7J20IO2VmOychCDtlanqs4TsmYAg7J287LmY7ZWY64+E66GdIO2VqFxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQ291bnRzKGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdKTogVGVzdENvdW50cyB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGxldCBwYXNzZWQgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcbiAgbGV0IHNraXBwZWQgPSAwO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgdG90YWwgKz0gY2hpbGQuY291bnRzLnRvdGFsO1xuICAgIHBhc3NlZCArPSBjaGlsZC5jb3VudHMucGFzc2VkO1xuICAgIGZhaWxlZCArPSBjaGlsZC5jb3VudHMuZmFpbGVkO1xuICAgIHNraXBwZWQgKz0gY2hpbGQuY291bnRzLnNraXBwZWQ7XG4gIH1cbiAgcmV0dXJuIHsgdG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdENvbXBsZXRlbmVzc1Njb3JlKG5vZGU6IFRlc3RDYXNlUmVzdWx0KTogbnVtYmVyIHtcbiAgbGV0IHNjb3JlID0gMDtcbiAgLy8g7YWM7Iqk7Yq4IOyImOqwgCDrjZQg66eO7J2AIOqysOqzvOulvCDsmrDshKDtlZjsl6wg7KSR67O1IO2MjOydvCDrs5Htlakg7IucIOygleuztCDshpDsi6TsnYQg7KSE7J6F64uI64ukLlxuICBzY29yZSArPSBub2RlLmNvdW50cy50b3RhbCAqIDEwMDA7XG4gIHNjb3JlICs9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICogMTAwO1xuICBpZiAobm9kZS5kdXJhdGlvbk1zICE9PSBudWxsKSBzY29yZSArPSAxMDtcblxuICBzd2l0Y2ggKG5vZGUuc3RhdGUpIHtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICBzY29yZSArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgc2NvcmUgKz0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJza2lwcGVkXCI6XG4gICAgICBzY29yZSArPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRvZG9cIjpcbiAgICAgIHNjb3JlICs9IDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgc2NvcmUgKz0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gc2NvcmU7XG59XG5cbmNvbnN0IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICB2YWx1ZTogei51bmtub3duKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLFxuICBsaW5lTnVtYmVyOiB6Lm51bWJlcigpLFxuICBhdDogei5zdHJpbmcoKSxcbn0pO1xuXG50eXBlIFNlcmlhbGl6ZWRUcmFjZUNhbmRpZGF0ZSA9IG9iamVjdCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsO1xuXG5mdW5jdGlvbiBwYXJzZVNlcmlhbGl6ZWRUcmFjZXModmFsdWVzOiByZWFkb25seSBTZXJpYWxpemVkVHJhY2VDYW5kaWRhdGVbXSk6IFNlcmlhbGl6ZWRUcmFjZVtdIHtcbiAgcmV0dXJuIHZhbHVlcy5mbGF0TWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICAgIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IFtwYXJzZWQuZGF0YV0gOiBbXTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQW1uQkEsU0FBUyxlQUFlLE9BQTBFO0NBQ2hHLFFBQVEsT0FBUjtFQUNFLEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUs7RUFDTCxLQUFLLFVBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTztDQUNYO0FBQ0Y7QUFFQSxTQUFTLGNBQWMsT0FBK0Q7Q0FDcEYsUUFBUSxPQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxTQUNFLE9BQU87Q0FDWDtBQUNGO0FBRUEsU0FBUyxjQUNQLFFBQ0EsTUFDVztDQUNYLFFBQVEsT0FBTyxPQUFmO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPLFNBQVMsU0FBUyxTQUFTO0VBQ3BDLEtBQUssV0FDSCxPQUFPO0VBQ1QsU0FDRSxPQUFPO0NBQ1g7QUFDRjtBQUVBLFNBQVMsZUFBZSxPQUE4QjtDQUNwRCxRQUFRLE9BQVI7RUFDRSxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLO0VBQ0wsS0FBSyxRQUNILE9BQU87R0FBRSxPQUFPO0dBQUcsUUFBUTtHQUFHLFFBQVE7R0FBRyxTQUFTO0VBQUU7RUFDdEQsU0FFRSxPQUFPO0dBQUUsT0FBTztHQUFHLFFBQVE7R0FBRyxRQUFRO0dBQUcsU0FBUztFQUFFO0NBQ3hEO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixVQUF3QztDQUMvRCxJQUFJ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
497
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXZpdGVzdC1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlPcHRpb25zLFxuICB0eXBlIFJlcG9ydGVyLFxuICB0eXBlIFRlc3RDYXNlLFxuICB0eXBlIFRlc3RNb2R1bGUsXG4gIHR5cGUgVGVzdFJ1blJlc3VsdCxcbiAgdHlwZSBUZXN0U3BlY2lmaWNhdGlvbixcbiAgdHlwZSBUZXN0U3VpdGUsXG4gIHR5cGUgVml0ZXN0LFxufSBmcm9tIFwidml0ZXN0L25vZGVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5cbi8vIO2FjOyKpO2KuCDtlZwg6rG07J2YIHRyYWNlIOuqqOydjFxuZXhwb3J0IHR5cGUgVGVzdE5vZGVLaW5kID0gXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIjtcbmV4cG9ydCB0eXBlIFRlc3RTdGF0ZSA9IFwicGFzc2VkXCIgfCBcImZhaWxlZFwiIHwgXCJza2lwcGVkXCIgfCBcInRvZG9cIiB8IFwicnVubmluZ1wiIHwgXCJ1bmtub3duXCI7XG5cbmV4cG9ydCB0eXBlIFRlc3RDYXNlUmVzdWx0ID0ge1xuICBpZDogc3RyaW5nO1xuICBraW5kOiBUZXN0Tm9kZUtpbmQ7XG4gIG5hbWU6IHN0cmluZztcbiAgZnVsbE5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzdGF0ZTogVGVzdFN0YXRlO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICBjb3VudHM6IFRlc3RDb3VudHM7XG4gIGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmcgfSB8IG51bGw7XG4gIHRyYWNlczogU2VyaWFsaXplZFRyYWNlW107XG4gIGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgVGVzdENvdW50cyA9IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFzc2VkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5SZXN1bHQgPSB7XG4gIG9rOiBib29sZWFuO1xuICBzdW1tYXJ5OiB7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwYXNzZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBza2lwcGVkOiBudW1iZXI7XG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xuICB9O1xuICByZXN1bHRzOiBUZXN0Q2FzZVJlc3VsdFtdO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlclN0YXR1cyA9IHtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJ1bm5pbmc6IGJvb2xlYW47XG4gIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRlc3RFdmVudFBheWxvYWQgPVxuICB8IHsgc2NoZW1hVmVyc2lvbjogbnVtYmVyOyBydW5JZDogc3RyaW5nOyBxdWV1ZWRBdDogc3RyaW5nOyByZXF1ZXN0OiBSdW5SZXF1ZXN0IH1cbiAgfCB7IHNjaGVtYVZlcnNpb246IG51bWJlcjsgcnVuSWQ6IHN0cmluZzsgc3RhcnRlZEF0OiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIHNjaGVtYVZlcnNpb246IG51bWJlcjtcbiAgICAgIHJ1bklkOiBzdHJpbmc7XG4gICAgICBzdGFydGVkQXQ6IHN0cmluZztcbiAgICAgIGZpbmlzaGVkQXQ6IHN0cmluZztcbiAgICAgIHJlc3VsdDogUnVuUmVzdWx0O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gICAgICBydW5JZDogc3RyaW5nO1xuICAgICAgZmluaXNoZWRBdDogc3RyaW5nO1xuICAgICAgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9O1xuICAgIH1cbiAgfCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiAxO1xuICAgICAgcnVuSWQ6IHN0cmluZztcbiAgICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgICAgYXQ6IHN0cmluZztcbiAgICAgIGtpbmQ6IFRlc3ROb2RlS2luZDtcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiO1xuICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQ7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUnVuUmVxdWVzdCA9IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgVGVzdEV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4gdm9pZDtcblxudHlwZSBRdWV1ZUVudHJ5ID0ge1xuICBydW5JZDogc3RyaW5nO1xuICB0YXNrOiAoKSA9PiBQcm9taXNlPFJ1blJlc3VsdD47XG4gIHJlc29sdmU6IChyZXN1bHQ6IFJ1blJlc3VsdCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTWFuYWdlZFZpdGVzdCA9IFBpY2s8XG4gIFZpdGVzdCxcbiAgfCBcInN0YW5kYWxvbmVcIlxuICB8IFwiY2xvc2VcIlxuICB8IFwib25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvblwiXG4gIHwgXCJpbnZhbGlkYXRlRmlsZVwiXG4gIHwgXCJnbG9iVGVzdFNwZWNpZmljYXRpb25zXCJcbiAgfCBcInJ1blRlc3RTcGVjaWZpY2F0aW9uc1wiXG4gIHwgXCJzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuICB8IFwicmVzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm5cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2Vml0ZXN0RmFjdG9yeSA9IChcbiAgbW9kZTogXCJ0ZXN0XCIsXG4gIG9wdGlvbnM6IENsaU9wdGlvbnMsXG4gIHZpdGVPdmVycmlkZXM6IFZpdGVVc2VyQ29uZmlnLFxuKSA9PiBQcm9taXNlPE1hbmFnZWRWaXRlc3Q+O1xuXG5leHBvcnQgY2xhc3MgRGV2Vml0ZXN0TWFuYWdlciB7XG4gIHByaXZhdGUgdml0ZXN0OiBNYW5hZ2VkVml0ZXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnVubmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIHByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVycyA9IG5ldyBTZXQ8VGVzdEV2ZW50TGlzdGVuZXI+KCk7XG4gIHByaXZhdGUgY3VycmVudFJ1bkNvbnRleHQ6IHtcbiAgICBydW5JZDogc3RyaW5nO1xuICAgIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAgIHNwZWNNb2R1bGVJZHM6IFNldDxzdHJpbmc+O1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aXRlc3RGYWN0b3J5PzogRGV2Vml0ZXN0RmFjdG9yeSkge31cblxuICBhZGRFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBUZXN0RXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IFRlc3RFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBzdHJpbmcsIGRhdGE6IFRlc3RFdmVudFBheWxvYWQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGV2ZW50LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCh2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J2066+4IOyLnOyekeuQnCDqsr3smrAg7KSR67O1IOy0iOq4sO2ZlOulvCDrsKnsp4BcbiAgICBpZiAodGhpcy52aXRlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVWaXRlc3QgPVxuICAgICAgdGhpcy52aXRlc3RGYWN0b3J5ID8/XG4gICAgICAoYXN5bmMgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RGV2Vml0ZXN0RmFjdG9yeT4pID0+IHtcbiAgICAgICAgY29uc3Qgdml0ZXN0TW9kdWxlID0gYXdhaXQgaW1wb3J0KFwidml0ZXN0L25vZGVcIik7XG4gICAgICAgIHJldHVybiB2aXRlc3RNb2R1bGUuY3JlYXRlVml0ZXN0KC4uLmFyZ3MpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCB2aXRlT3ZlcnJpZGVzOiBWaXRlVXNlckNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogeyB3YXRjaDogbnVsbCB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjbGlPcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgICAgZm9yY2VSZXJ1blRyaWdnZXJzOiBbXSxcbiAgICAgIGNvbmZpZzogdml0ZXN0Q29uZmlnUGF0aCxcbiAgICAgIGVudjoge1xuICAgICAgICBOT0RFX0VOVjogXCJ0ZXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZWFsdGltZVJlcG9ydGVyID0gdGhpcy5jcmVhdGVSZWFsdGltZVByb2dyZXNzUmVwb3J0ZXIoKTtcbiAgICB2aXRlT3ZlcnJpZGVzLnBsdWdpbnMgPSBbXG4gICAgICAuLi4odml0ZU92ZXJyaWRlcy5wbHVnaW5zID8/IFtdKSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUtcmVhbHRpbWUtcmVwb3J0ZXJcIixcbiAgICAgICAgY29uZmlndXJlVml0ZXN0KHsgdml0ZXN0OiB2aXRlc3RJbnN0YW5jZSB9OiB7IHZpdGVzdDogVml0ZXN0IH0pIHtcbiAgICAgICAgICBjb25zdCByZXBvcnRlcnMgPSB2aXRlc3RJbnN0YW5jZS5jb25maWcucmVwb3J0ZXJzO1xuICAgICAgICAgIGlmICghcmVwb3J0ZXJzLmluY2x1ZGVzKHJlYWx0aW1lUmVwb3J0ZXIpKSB7XG4gICAgICAgICAgICByZXBvcnRlcnMucHVzaChyZWFsdGltZVJlcG9ydGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB2aXRlc3QgPSBhd2FpdCBjcmVhdGVWaXRlc3QoXCJ0ZXN0XCIsIGNsaU9wdGlvbnMsIHZpdGVPdmVycmlkZXMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB2aXRlc3Quc3RhbmRhbG9uZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdml0ZXN0LmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy52aXRlc3QgPSB2aXRlc3Q7XG4gICAgdGhpcy52aXRlc3Qub25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbigoX3NwZWMpID0+IGZhbHNlKTtcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdHM6IHsgZmlsZXM/OiBzdHJpbmdbXTsgcGF0dGVybj86IHN0cmluZyB9LCBydW5JZDogc3RyaW5nKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIik7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXRlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgbm90IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJ1blJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHRoaXMuZXhlY3V0ZVJ1bihvcHRzLCBydW5JZCk7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goeyBydW5JZCwgdGFzaywgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFN0YXR1cygpOiBNYW5hZ2VyU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHRoaXMudml0ZXN0ICE9PSBudWxsICYmICF0aGlzLmNsb3NlZCxcbiAgICAgIHJ1bm5pbmc6IHRoaXMucnVubmluZyxcbiAgICAgIGxhc3RSdW5BdDogdGhpcy5sYXN0UnVuQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrs4Dqsr3rkJwg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7IScIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICogaG1yQW5kU3luY+yXkOyEnCDtmLjstpzrkJjslrQg64uk7J2MIO2FjOyKpO2KuCDsi6Ttlokg7IucIOy1nOyLoCDsvZTrk5zrpbwg7IKs7Jqp7ZWY64+E66GdIO2VqeuLiOuLpC5cbiAgICovXG4gIGludmFsaWRhdGVGaWxlcyhmaWxlUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpdGVzdCB8fCB0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgdGhpcy52aXRlc3QuaW52YWxpZGF0ZUZpbGUoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAvLyDtgZDsl5Ag64Ko7J2AIOyekeyXheuTpOydhCByZWplY3TtlZjsl6wg7Zi47Lac7J6Q6rCAIOyYgeq1rCDrjIDquLDtlZjsp4Ag7JWK64+E66GdIOygleumrFxuICAgIHdoaWxlICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnJlamVjdChuZXcgRXJyb3IoXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIGJlaW5nIHNodXQgZG93blwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5jbGVhcigpO1xuXG4gICAgaWYgKHRoaXMudml0ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVzdC5jbG9zZSgpO1xuICAgICAgdGhpcy52aXRlc3QgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnByb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoIWVudHJ5KSBicmVhaztcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgZW50cnkucmVqZWN0KG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgYWxyZWFkeSBzaHV0IGRvd25cIikpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeS50YXNrKCk7XG4gICAgICAgICAgZW50cnkucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlbnRyeS5yZWplY3QoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSdW4oXG4gICAgb3B0czogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0sXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSdW5SZXN1bHQ+IHtcbiAgICBjb25zdCB2aXRlc3QgPSB0aGlzLnZpdGVzdDtcbiAgICBpZiAoIXZpdGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBpcyBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAob3B0cy5wYXR0ZXJuKSB7XG4gICAgICB2aXRlc3Quc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKG9wdHMucGF0dGVybik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNwZWNzOiBUZXN0U3BlY2lmaWNhdGlvbltdID0gb3B0cy5maWxlc1xuICAgICAgICA/IGF3YWl0IHZpdGVzdC5nbG9iVGVzdFNwZWNpZmljYXRpb25zKG9wdHMuZmlsZXMpXG4gICAgICAgIDogYXdhaXQgdml0ZXN0Lmdsb2JUZXN0U3BlY2lmaWNhdGlvbnMoKTtcblxuICAgICAgY29uc3Qgc3BlY01vZHVsZUlkcyA9IG5ldyBTZXQoc3BlY3MubWFwKChzKSA9PiBzLm1vZHVsZUlkKSk7XG4gICAgICAvLyByb3V0ZXPsl5DshJwg7IOd7ISx7ZWcIHJ1bklk66W8IOq3uOuMgOuhnCDsgqzsmqntlZjsl6wgcnVuU3RhcnRlZC9ydW5Ob2RlUHJvZ3Jlc3MvcnVuQ29tcGxldGVkIOqwhCDsnbzqtIDshLEg67O07J6lXG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0ge1xuICAgICAgICBydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNwZWNNb2R1bGVJZHMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhbGxUZXN0c1J1biA9ICFvcHRzLmZpbGVzIHx8IG9wdHMuZmlsZXMubGVuZ3RoID09PSAwO1xuICAgICAgY29uc3QgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0ID0gYXdhaXQgdml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9ucyhzcGVjcywgYWxsVGVzdHNSdW4pO1xuXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMubGFzdFJ1bkF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzdWx0cyhydW5SZXN1bHQsIGR1cmF0aW9uTXMsIHNwZWNNb2R1bGVJZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmN1cnJlbnRSdW5Db250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnBhdHRlcm4pIHtcbiAgICAgICAgdml0ZXN0LnJlc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlYWx0aW1lUHJvZ3Jlc3NSZXBvcnRlcigpOiBSZXBvcnRlciB7XG4gICAgY29uc3QgZW1pdFByb2dyZXNzID0gKFxuICAgICAga2luZDogXCJmaWxlXCIgfCBcInN1aXRlXCIgfCBcInRlc3RcIixcbiAgICAgIHBoYXNlOiBcInJlYWR5XCIgfCBcInJlc3VsdFwiLFxuICAgICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgICBub2RlSWQ6IHN0cmluZyxcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbm9kZTogVGVzdENhc2VSZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KFwicnVuTm9kZVByb2dyZXNzXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBjdHguc3RhcnRlZEF0LFxuICAgICAgICBhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBraW5kLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgZmlsZUlkLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIHBhcmVudElkLFxuICAgICAgICBub2RlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBvblRlc3RNb2R1bGVRdWV1ZWQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwiZmlsZVwiLFxuICAgICAgICAgIFwicmVhZHlcIixcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdGhpcy5idWlsZEZpbGVQcm9ncmVzc05vZGUodGVzdE1vZHVsZSwgXCJyZWFkeVwiKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RNb2R1bGVFbmQ6ICh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdE1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdE1vZHVsZS5tb2R1bGVJZDtcbiAgICAgICAgZW1pdFByb2dyZXNzKFwiZmlsZVwiLCBcInJlc3VsdFwiLCBmaWxlSWQsIGZpbGVJZCwgbnVsbCwgdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpKTtcbiAgICAgIH0sXG4gICAgICBvblRlc3RTdWl0ZVJlYWR5OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlYWR5XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlLCBcInJlYWR5XCIpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uVGVzdFN1aXRlUmVzdWx0OiAodGVzdFN1aXRlOiBUZXN0U3VpdGUpID0+IHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdXJyZW50UnVuQ29udGV4dDtcbiAgICAgICAgaWYgKCFjdHggfHwgIWN0eC5zcGVjTW9kdWxlSWRzLmhhcyh0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gO1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucmVzb2x2ZVN1aXRlUGFyZW50SWQodGVzdFN1aXRlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwic3VpdGVcIixcbiAgICAgICAgICBcInJlc3VsdFwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFN1aXRlTm9kZSh0ZXN0U3VpdGUsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlYWR5OiAodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3VycmVudFJ1bkNvbnRleHQ7XG4gICAgICAgIGlmICghY3R4IHx8ICFjdHguc3BlY01vZHVsZUlkcy5oYXModGVzdENhc2UubW9kdWxlLm1vZHVsZUlkKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgICAgIGNvbnN0IG5vZGVJZCA9IGAke2ZpbGVJZH06OiR7dGVzdENhc2UuZnVsbE5hbWV9YDtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVUZXN0UGFyZW50SWQodGVzdENhc2UpO1xuICAgICAgICBlbWl0UHJvZ3Jlc3MoXG4gICAgICAgICAgXCJ0ZXN0XCIsXG4gICAgICAgICAgXCJyZWFkeVwiLFxuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgdGhpcy5idWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2UsIFwicmVhZHlcIiksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25UZXN0Q2FzZVJlc3VsdDogKHRlc3RDYXNlOiBUZXN0Q2FzZSkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN1cnJlbnRSdW5Db250ZXh0O1xuICAgICAgICBpZiAoIWN0eCB8fCAhY3R4LnNwZWNNb2R1bGVJZHMuaGFzKHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZmlsZUlkID0gdGVzdENhc2UubW9kdWxlLm1vZHVsZUlkO1xuICAgICAgICBjb25zdCBub2RlSWQgPSBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWA7XG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5yZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKFxuICAgICAgICAgIFwidGVzdFwiLFxuICAgICAgICAgIFwicmVzdWx0XCIsXG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICB0aGlzLmJ1aWxkVGVzdE5vZGUodGVzdENhc2UsIGZpbGVJZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRmlsZVByb2dyZXNzTm9kZSh0ZXN0TW9kdWxlOiBUZXN0TW9kdWxlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBraW5kOiBcImZpbGVcIixcbiAgICAgIG5hbWU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBmdWxsTmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZpbGU6IHRlc3RNb2R1bGUubW9kdWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAwLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVQcm9ncmVzc05vZGUodGVzdFN1aXRlOiBUZXN0U3VpdGUsIF9waGFzZTogXCJyZWFkeVwiKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IGZpbGVJZCA9IHRlc3RTdWl0ZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RTdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogdGVzdFN1aXRlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdFN1aXRlLmZ1bGxOYW1lLFxuICAgICAgZmlsZTogZmlsZUlkLFxuICAgICAgc3RhdGU6IFwicnVubmluZ1wiLFxuICAgICAgZHVyYXRpb25NczogbnVsbCxcbiAgICAgIGNvdW50czogeyB0b3RhbDogMCwgcGFzc2VkOiAwLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDAgfSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdHJhY2VzOiBbXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3RQcm9ncmVzc05vZGUodGVzdENhc2U6IFRlc3RDYXNlLCBfcGhhc2U6IFwicmVhZHlcIik6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBmaWxlSWQgPSB0ZXN0Q2FzZS5tb2R1bGUubW9kdWxlSWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlSWR9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlOiBmaWxlSWQsXG4gICAgICBzdGF0ZTogXCJydW5uaW5nXCIsXG4gICAgICBkdXJhdGlvbk1zOiBudWxsLFxuICAgICAgY291bnRzOiB7IHRvdGFsOiAxLCBwYXNzZWQ6IDAsIGZhaWxlZDogMCwgc2tpcHBlZDogMCB9LFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTdWl0ZVBhcmVudElkKHRlc3RTdWl0ZTogVGVzdFN1aXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0ZXN0U3VpdGUucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdFN1aXRlLm1vZHVsZS5tb2R1bGVJZH06OiR7cGFyZW50LmZ1bGxOYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiB0ZXN0U3VpdGUubW9kdWxlLm1vZHVsZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVGVzdFBhcmVudElkKHRlc3RDYXNlOiBUZXN0Q2FzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW50ID0gdGVzdENhc2UucGFyZW50O1xuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJzdWl0ZVwiKSB7XG4gICAgICByZXR1cm4gYCR7dGVzdENhc2UubW9kdWxlLm1vZHVsZUlkfTo6JHtwYXJlbnQuZnVsbE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRlc3RDYXNlLm1vZHVsZS5tb2R1bGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdFJlc3VsdHMoXG4gICAgcnVuUmVzdWx0OiBUZXN0UnVuUmVzdWx0LFxuICAgIGR1cmF0aW9uTXM6IG51bWJlcixcbiAgICBzcGVjTW9kdWxlSWRzOiBTZXQ8c3RyaW5nPixcbiAgKTogUnVuUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFRlc3RDYXNlUmVzdWx0PigpO1xuXG4gICAgZm9yIChjb25zdCB0ZXN0TW9kdWxlIG9mIHJ1blJlc3VsdC50ZXN0TW9kdWxlcykge1xuICAgICAgaWYgKCFzcGVjTW9kdWxlSWRzLmhhcyh0ZXN0TW9kdWxlLm1vZHVsZUlkKSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5idWlsZEZpbGVOb2RlKHRlc3RNb2R1bGUpO1xuICAgICAgY29uc3QgZXhpc3RpbmdSZXN1bHQgPSByZXN1bHRzQnlGaWxlLmdldChuZXh0UmVzdWx0LmlkKTtcblxuICAgICAgaWYgKCFleGlzdGluZ1Jlc3VsdCkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShleGlzdGluZ1Jlc3VsdCk7XG4gICAgICBjb25zdCBuZXh0U2NvcmUgPSBnZXRSZXN1bHRDb21wbGV0ZW5lc3NTY29yZShuZXh0UmVzdWx0KTtcbiAgICAgIGlmIChuZXh0U2NvcmUgPj0gZXhpc3RpbmdTY29yZSkge1xuICAgICAgICByZXN1bHRzQnlGaWxlLnNldChuZXh0UmVzdWx0LmlkLCBuZXh0UmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbShyZXN1bHRzQnlGaWxlLnZhbHVlcygpKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYWdncmVnYXRlQ291bnRzKHJlc3VsdHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBzdW1tYXJ5LmZhaWxlZCA9PT0gMCxcbiAgICAgIHN1bW1hcnk6IHsgLi4uc3VtbWFyeSwgZHVyYXRpb25NcyB9LFxuICAgICAgcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZpbGVOb2RlKHRlc3RNb2R1bGU6IFRlc3RNb2R1bGUpOiBUZXN0Q2FzZVJlc3VsdCB7XG4gICAgY29uc3QgZmlsZSA9IHRlc3RNb2R1bGUubW9kdWxlSWQ7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmJ1aWxkQ2hpbGROb2Rlcyh0ZXN0TW9kdWxlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IG1vZHVsZVN0YXRlID0gdGVzdE1vZHVsZS5zdGF0ZSgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0TW9kdWxlLmRpYWdub3N0aWMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGtpbmQ6IFwiZmlsZVwiLFxuICAgICAgbmFtZTogdGVzdE1vZHVsZS5tb2R1bGVJZCxcbiAgICAgIGZ1bGxOYW1lOiB0ZXN0TW9kdWxlLm1vZHVsZUlkLFxuICAgICAgZmlsZSxcbiAgICAgIHN0YXRlOiBtYXBNb2R1bGVTdGF0ZShtb2R1bGVTdGF0ZSksXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljLmR1cmF0aW9uID4gMCA/IGRpYWdub3N0aWMuZHVyYXRpb24gOiBudWxsLFxuICAgICAgY291bnRzLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0cmFjZXM6IFtdLFxuICAgICAgY2hpbGRyZW4sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGlsZE5vZGVzKHBhcmVudDogVGVzdE1vZHVsZSB8IFRlc3RTdWl0ZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBUZXN0Q2FzZVJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSBcInN1aXRlXCIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFN1aXRlTm9kZShjaGlsZCwgZmlsZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5idWlsZFRlc3ROb2RlKGNoaWxkLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3VpdGVOb2RlKHN1aXRlOiBUZXN0U3VpdGUsIGZpbGU6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuYnVpbGRDaGlsZE5vZGVzKHN1aXRlLCBmaWxlKTtcbiAgICBjb25zdCBjb3VudHMgPSBhZ2dyZWdhdGVDb3VudHMoY2hpbGRyZW4pO1xuICAgIGNvbnN0IHN1aXRlU3RhdGUgPSBzdWl0ZS5zdGF0ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHtmaWxlfTo6JHtzdWl0ZS5mdWxsTmFtZX1gLFxuICAgICAga2luZDogXCJzdWl0ZVwiLFxuICAgICAgbmFtZTogc3VpdGUubmFtZSxcbiAgICAgIGZ1bGxOYW1lOiBzdWl0ZS5mdWxsTmFtZSxcbiAgICAgIGZpbGUsXG4gICAgICBzdGF0ZTogbWFwU3VpdGVTdGF0ZShzdWl0ZVN0YXRlKSxcbiAgICAgIGR1cmF0aW9uTXM6IG51bGwsXG4gICAgICBjb3VudHMsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRyYWNlczogW10sXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRlc3ROb2RlKHRlc3RDYXNlOiBUZXN0Q2FzZSwgZmlsZTogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RDYXNlLnJlc3VsdCgpO1xuICAgIGNvbnN0IGRpYWdub3N0aWMgPSB0ZXN0Q2FzZS5kaWFnbm9zdGljKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBtYXBUZXN0UmVzdWx0KHJlc3VsdCwgdGVzdENhc2Uub3B0aW9ucy5tb2RlKTtcblxuICAgIGxldCBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAocmVzdWx0LnN0YXRlID09PSBcImZhaWxlZFwiICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdC5lcnJvcnNbMF07XG4gICAgICBlcnJvciA9IHtcbiAgICAgICAgbWVzc2FnZTogZmlyc3RFcnJvci5tZXNzYWdlID8/IFN0cmluZyhmaXJzdEVycm9yKSxcbiAgICAgICAgc3RhY2s6IGZpcnN0RXJyb3Iuc3RhY2ssXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IHRlc3RDYXNlLm1ldGEoKS50cmFjZXM7XG4gICAgbGV0IHRyYWNlczogU2VyaWFsaXplZFRyYWNlW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpICYmIHJhdy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFjZXMgPSBwYXJzZVNlcmlhbGl6ZWRUcmFjZXMocmF3KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGAke2ZpbGV9Ojoke3Rlc3RDYXNlLmZ1bGxOYW1lfWAsXG4gICAgICBraW5kOiBcInRlc3RcIixcbiAgICAgIG5hbWU6IHRlc3RDYXNlLm5hbWUsXG4gICAgICBmdWxsTmFtZTogdGVzdENhc2UuZnVsbE5hbWUsXG4gICAgICBmaWxlLFxuICAgICAgc3RhdGUsXG4gICAgICBkdXJhdGlvbk1zOiBkaWFnbm9zdGljID8gZGlhZ25vc3RpYy5kdXJhdGlvbiA6IG51bGwsXG4gICAgICBjb3VudHM6IGNvdW50RnJvbVN0YXRlKHN0YXRlKSxcbiAgICAgIGVycm9yLFxuICAgICAgdHJhY2VzLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9kdWxlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIiB8IFwicXVldWVkXCIpOiBUZXN0U3RhdGUge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIFwicGFzc2VkXCI7XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICAgIHJldHVybiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgIGNhc2UgXCJxdWV1ZWRcIjpcbiAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcFN1aXRlU3RhdGUoc3RhdGU6IFwic2tpcHBlZFwiIHwgXCJwZW5kaW5nXCIgfCBcImZhaWxlZFwiIHwgXCJwYXNzZWRcIik6IFRlc3RTdGF0ZSB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIFwic2tpcHBlZFwiO1xuICAgIGNhc2UgXCJwZW5kaW5nXCI6XG4gICAgICByZXR1cm4gXCJydW5uaW5nXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUZXN0UmVzdWx0KFxuICByZXN1bHQ6IFJldHVyblR5cGU8VGVzdENhc2VbXCJyZXN1bHRcIl0+LFxuICBtb2RlOiBcInJ1blwiIHwgXCJvbmx5XCIgfCBcInNraXBcIiB8IFwidG9kb1wiLFxuKTogVGVzdFN0YXRlIHtcbiAgc3dpdGNoIChyZXN1bHQuc3RhdGUpIHtcbiAgICBjYXNlIFwicGFzc2VkXCI6XG4gICAgICByZXR1cm4gXCJwYXNzZWRcIjtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICBjYXNlIFwic2tpcHBlZFwiOlxuICAgICAgcmV0dXJuIG1vZGUgPT09IFwidG9kb1wiID8gXCJ0b2RvXCIgOiBcInNraXBwZWRcIjtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRGcm9tU3RhdGUoc3RhdGU6IFRlc3RTdGF0ZSk6IFRlc3RDb3VudHMge1xuICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMSwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAxLCBza2lwcGVkOiAwIH07XG4gICAgY2FzZSBcInNraXBwZWRcIjpcbiAgICBjYXNlIFwidG9kb1wiOlxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAxIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIHJ1bm5pbmcvdW5rbm93biDsg4Htg5zrj4QgdG90YWzsl5Ag7Y+s7ZWo7ZWY7JesIO2MjOydvCDrhbjrk5wgY291bnRzLnRvdGFs7J20IO2VmOychCDtlanqs4TsmYAg7J287LmY7ZWY64+E66GdIO2VqFxuICAgICAgcmV0dXJuIHsgdG90YWw6IDEsIHBhc3NlZDogMCwgZmFpbGVkOiAwLCBza2lwcGVkOiAwIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQ291bnRzKGNoaWxkcmVuOiBUZXN0Q2FzZVJlc3VsdFtdKTogVGVzdENvdW50cyB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGxldCBwYXNzZWQgPSAwO1xuICBsZXQgZmFpbGVkID0gMDtcbiAgbGV0IHNraXBwZWQgPSAwO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgdG90YWwgKz0gY2hpbGQuY291bnRzLnRvdGFsO1xuICAgIHBhc3NlZCArPSBjaGlsZC5jb3VudHMucGFzc2VkO1xuICAgIGZhaWxlZCArPSBjaGlsZC5jb3VudHMuZmFpbGVkO1xuICAgIHNraXBwZWQgKz0gY2hpbGQuY291bnRzLnNraXBwZWQ7XG4gIH1cbiAgcmV0dXJuIHsgdG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdENvbXBsZXRlbmVzc1Njb3JlKG5vZGU6IFRlc3RDYXNlUmVzdWx0KTogbnVtYmVyIHtcbiAgbGV0IHNjb3JlID0gMDtcbiAgLy8g7YWM7Iqk7Yq4IOyImOqwgCDrjZQg66eO7J2AIOqysOqzvOulvCDsmrDshKDtlZjsl6wg7KSR67O1IO2MjOydvCDrs5Htlakg7IucIOygleuztCDshpDsi6TsnYQg7KSE7J6F64uI64ukLlxuICBzY29yZSArPSBub2RlLmNvdW50cy50b3RhbCAqIDEwMDA7XG4gIHNjb3JlICs9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICogMTAwO1xuICBpZiAobm9kZS5kdXJhdGlvbk1zICE9PSBudWxsKSBzY29yZSArPSAxMDtcblxuICBzd2l0Y2ggKG5vZGUuc3RhdGUpIHtcbiAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICBzY29yZSArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInBhc3NlZFwiOlxuICAgICAgc2NvcmUgKz0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJza2lwcGVkXCI6XG4gICAgICBzY29yZSArPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRvZG9cIjpcbiAgICAgIHNjb3JlICs9IDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgc2NvcmUgKz0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gc2NvcmU7XG59XG5cbmNvbnN0IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICB2YWx1ZTogei51bmtub3duKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLFxuICBsaW5lTnVtYmVyOiB6Lm51bWJlcigpLFxuICBhdDogei5zdHJpbmcoKSxcbn0pO1xuXG50eXBlIFNlcmlhbGl6ZWRUcmFjZUNhbmRpZGF0ZSA9IG9iamVjdCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsO1xuXG5mdW5jdGlvbiBwYXJzZVNlcmlhbGl6ZWRUcmFjZXModmFsdWVzOiByZWFkb25seSBTZXJpYWxpemVkVHJhY2VDYW5kaWRhdGVbXSk6IFNlcmlhbGl6ZWRUcmFjZVtdIHtcbiAgcmV0dXJuIHZhbHVlcy5mbGF0TWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHNlcmlhbGl6ZWRUcmFjZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICAgIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IFtwYXJzZWQuZGF0YV0gOiBbXTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQW1uQkEsU0FBUyxlQUFlLE9BQTBFO0NBQ2hHLFFBQVEsT0FBUjtFQUNFLEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUs7RUFDTCxLQUFLLFVBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTztDQUNYO0FBQ0Y7QUFFQSxTQUFTLGNBQWMsT0FBK0Q7Q0FDcEYsUUFBUSxPQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxTQUNFLE9BQU87Q0FDWDtBQUNGO0FBRUEsU0FBUyxjQUNQLFFBQ0EsTUFDVztDQUNYLFFBQVEsT0FBTyxPQUFmO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPLFNBQVMsU0FBUyxTQUFTO0VBQ3BDLEtBQUssV0FDSCxPQUFPO0VBQ1QsU0FDRSxPQUFPO0NBQ1g7QUFDRjtBQUVBLFNBQVMsZUFBZSxPQUE4QjtDQUNwRCxRQUFRLE9BQVI7RUFDRSxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLLFVBQ0gsT0FBTztHQUFFLE9BQU87R0FBRyxRQUFRO0dBQUcsUUFBUTtHQUFHLFNBQVM7RUFBRTtFQUN0RCxLQUFLO0VBQ0wsS0FBSyxRQUNILE9BQU87R0FBRSxPQUFPO0dBQUcsUUFBUTtHQUFHLFFBQVE7R0FBRyxTQUFTO0VBQUU7RUFDdEQsU0FFRSxPQUFPO0dBQUUsT0FBTztHQUFHLFFBQVE7R0FBRyxRQUFRO0dBQUcsU0FBUztFQUFFO0NBQ3hEO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixVQUF3QztDQUMvRCxJQUFJ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
@@ -1,5 +1,5 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
- //#region src/testing/faker-mappings.ts
2
+ // src/testing/faker-mappings.ts
3
3
  var fakerMappings;
4
4
  var init_faker_mappings = __esmMin((() => {
5
5
  fakerMappings = {
@@ -415,7 +415,6 @@ var init_faker_mappings = __esmMin((() => {
415
415
  }
416
416
  };
417
417
  }));
418
- //#endregion
419
418
  init_faker_mappings();
420
419
  export { fakerMappings, init_faker_mappings };
421
420
 
@@ -1,7 +1,6 @@
1
1
  import { init_filesystem_dependencies, syncerFileExists } from "../syncer/filesystem-dependencies.js";
2
- //#region src/testing/filesystem.ts
2
+ // src/testing/filesystem.ts
3
3
  init_filesystem_dependencies();
4
- //#endregion
5
4
  export { syncerFileExists as exists };
6
5
 
7
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9maWxlc3lzdGVtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHN5bmNlckZpbGVFeGlzdHMgYXMgZXhpc3RzIH0gZnJvbSBcIi4uL3N5bmNlci9maWxlc3lzdGVtLWRlcGVuZGVuY2llc1wiO1xuIl0sIm1hcHBpbmdzIjoiOzs2QkFBOEUifQ==
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9maWxlc3lzdGVtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHN5bmNlckZpbGVFeGlzdHMgYXMgZXhpc3RzIH0gZnJvbSBcIi4uL3N5bmNlci9maWxlc3lzdGVtLWRlcGVuZGVuY2llc1wiO1xuIl0sIm1hcHBpbmdzIjoiOztBQUE4RSw2QkFBQSJ9